From fa8d7ab7dd7bc3d29183f3ecd6d47fdc1985fbda Mon Sep 17 00:00:00 2001 From: Robert Allan James Date: Tue, 11 Aug 2026 23:29:35 -0400 Subject: [PATCH] FABRIC.md items 4.4u/4.4v: locked console layout design + M8 keyboard-bridge scope 4.4u records the full bottom-up console layout Captain Bob walked through tonight (REPL strip geometry, single-line horizontal-scroll input, drawn scroll box, TAB-toggle, colors), including a mockup review round that grew the REPL-strip gaps by 3px and added scroll-box content soft-wrap. Flags that it revises 4.4m/4.4n's REPL-strip sizing without editing those items in place. 4.4v scopes the keyboard-to-REPL bridge precisely: the i8042/virtio_input interrupt-driven keyboard layer is real and working, but nothing connects it to sk_readline() yet -- that gap is what's left, not a from-scratch keyboard subsystem. Neither item has code yet -- design/scope documentation only, per this document's own discipline of capturing design before implementation. Co-Authored-By: Claude Sonnet 5 --- FABRIC.md | 109 ++++++++++++++++++ .../console-layout-mockup-4.4u-amd64.png | Bin 0 -> 32613 bytes 2 files changed, 109 insertions(+) create mode 100644 evidence/mockups/console-layout-mockup-4.4u-amd64.png diff --git a/FABRIC.md b/FABRIC.md index 274285e..638e5b4 100644 --- a/FABRIC.md +++ b/FABRIC.md @@ -5789,6 +5789,115 @@ document and committing that amendment as its own item.* so the prompt's final shape isn't lost, not because it's ready to build. *Refs:* §27.8, CLAUDE.md ACL section (Phase 8). +- [ ] **4.4u — Locked bottom-up console layout design.** Captain Bob walked the full console + layout bottom-up in conversation on 2026-08-11 (evening session, after 4.4t landed); recorded + here verbatim as the reference spec before any of it is built, per this document's own + discipline of capturing design before implementation. **This revises 4.4m/4.4n's REPL-strip + sizing** — see the conflict note below; those items stay checked as a historical record of + what was decided at the time, not edited in place. + **The design, bottom-up, per architecture's own raster coordinates:** + 1. **Row 0** — the very last pixel row of the physical framebuffer (`fb_height()-1`), same + rule on every ISA regardless of resolution. A horizontal line runs the full screen width. + 2. A few pixels up from that line: the **REPL prompt baseline** — cursor and prompt + (`[Hera] ok>`) sit here, text flows left to right. + 3. An **equal number of pixels** further up from the baseline (mirroring the gap below it): + a second horizontal line, full width — the REPL strip's top border. The strip is + symmetric around the baseline by construction. + 4. **REPL input is single-line with horizontal scroll on overflow, not soft-wrap** — decided + explicitly in conversation after weighing both: soft-wrap would mean the strip grows + upward as a line wraps, pushing CANVAS's boundary and requiring CANVAS content to + reflow or get covered/uncovered live; horizontal scroll (classic readline-style, view + follows the cursor through a fixed single-line window into the full input buffer) needs + none of that and was chosen as "cleaner." **Input buffer width for this strip needs + resolving against `INPUT_BUFFER_SIZE`=1025 (CLAUDE.md) before this is buildable** — Bob's + verbal estimate was "like 255/256," well under the actual shared REPL/LOAD buffer size; + not reconciled yet, flagged here rather than guessed at. + 5. A small additional gap above the REPL strip's top border. + 6. A **literal drawn box** — an actual stroked rectangle outline, not just an implicit text + boundary — for the 640×480 scroll area (4.4o's geometry), centered horizontally (equal + left/right margins, already computed: amd64 x=[320,960], aarch64/riscv64 x=[80,720]). + All REPL output/scrollback history (4.4q) renders inside this box. **Not yet drawn** — + 4.4t confined content to this rect but never stroked a visible border on it. + 7. **Above the box: nothing, by default** — reserved blank space, no permanent content. + 8. **The toggle (4.4r) is bound to the TAB key.** Toggling hides the box's contents; at that + point the box's own footprint *and* the blank space above it become one unified, full + CANVAS free-play area for vector/graphics work. Toggling again restores the box and its + scrollback content undisturbed. **The REPL strip (steps 1-4) is never covered by this — + toggle state only ever affects the box and the space above it, never the bottom strip.** + **Colors, decided explicitly:** REPL strip characters — **bright white** (`0xFFFFFF`, + `FB_ANSI_PALETTE[15]`). The two horizontal lines bounding the REPL strip — **gray** (exact + shade not yet pinned to a specific palette index or RGB triple; use a mid-gray consistent + with `FB_ANSI_PALETTE`'s existing gray entries — index 7 `0xAAAAAA` or index 8 `0x555555` — + and confirm the choice with Bob before implementing, don't assume). Scroll-box content colors + are unchanged from what's already live (4.4h's orange `[VM]` prefix, cyan `ok>`). + **Conflict with 4.4m/4.4n, not silently resolved:** 4.4m decided a 96px/4-visible-line REPL + strip (one merged scroll+input box); this design has a single-line REPL strip (well under + 96px — closer to one `VT100_TTF_CELL_H_PX` row, ~24-40px depending on the two gap sizes, + neither pinned yet) with scrollback living entirely in the separate box from step 6. 4.4n's + CANVAS-height arithmetic (`screen height − strip height − gap`) will produce a taller CANVAS + once the real (smaller) strip height is pinned down — a strict improvement on the 4.4n + numbers, not a fit failure, but the exact numbers need redoing, not assumed to still hold. + *Done when:* the two open gaps above (input buffer width vs. `INPUT_BUFFER_SIZE`; exact gray + shade; exact pixel values for the two REPL-strip gaps) are resolved with Bob, then this + item's numbers feed a redo of 4.4n's CANVAS rectangle before any drawing code is written. + *Refs:* §27.8, 4.4m, 4.4n, 4.4o, 4.4q, 4.4r, 4.4t. + + > **Refined 2026-08-11, still open — mockup review round 1.** First rendered mockup + > (`evidence/mockups/console-layout-mockup-4.4u-amd64.png`, not live kernel code — a Python/ + > PIL drawing at amd64's 1280×800 to check the geometry reads right before building it) shown + > to Bob. Two changes came back: + > - **The two REPL-strip gaps (baseline-to-bottom-line, baseline-to-top-line) both grow by + > 3px** — Bob wanted more headroom above the prompt specifically. First pass used 12px/12px + > (a guess, not yet locked); now 15px/15px. Still not treated as final — just the current + > working number for the next mockup pass, not a pinned spec value the way 4.4o's centering + > math is. + > - **Scroll-box content needs its own soft-wrap** — separate from step 4's REPL-strip + > horizontal-scroll decision. Text inside the drawn box (step 6) that exceeds the box's + > inner width must wrap to additional lines within the box, not run past the box's right + > border as the first mockup pass showed. This is scrollback *content* wrapping, not the + > REPL input line — those are two different text flows with two different overflow + > behaviors, don't conflate them when implementing. + > Second mockup pass regenerated with both changes and re-reviewed — approved as "pretty + > close." Both numbers above still informal (mockup-only, not implemented, not verified + > against real `TTF-TEXT` rendering) — this document's own discipline (don't assume a mockup + > number survives contact with real glyph metrics) means these still need to be re-checked + > once actually built, not carried forward as gospel. + +- [ ] **4.4v — M8 scope, precisely bounded: keyboard-to-REPL bridge.** Surfaced while + discussing 4.4u's TAB-toggle binding — Captain Bob's recollection was that keyboard input + already works end-to-end; checked against the code rather than assumed either way. + **What's real and already done** (confirmed by reading the code, not from milestone + status): `i8042.c` (amd64) and `virtio_input.c` (aarch64/riscv64) are genuine + interrupt-driven keyboard drivers — IOAPIC/IRQ1 routing confirmed live in this session's own + boot logs (`"I/O APIC: keyboard IRQ1 unmasked"`), scancodes/decoded `EV_KEY` events land in + a ring buffer, and `KBD-SCAN`/`KBD-DEBUG`/`VKBD-EVENT` (`keyboard_words.c`) expose that + buffer to FORTH, including a standing diagnostic (`g_i8042_isr_count`) that already caught a + real bug (a genuine IRQ misreported as spurious, item 4.3.5). This is real, tested, + interrupt-path-proven-alive infrastructure — not a stub. + **What's missing, precisely:** nothing calls `KBD-SCAN`/`VKBD-EVENT` from `repl.c`. + `sk_readline()` is documented in its own comment as reading "from serial console" and does + exactly that — no scancode-to-ASCII translation table exists, and no code path connects the + keyboard ring buffer to the REPL's line-read loop. The hardware/interrupt layer is done; the + bridge from that layer into text the REPL can act on is not. This is the same conclusion + `docs/lithosananke/ROADMAP.md`'s M8 section and this document's own 4.3.5-series entries + already recorded ("no keyboard path into the VM on any architecture, confirmed by reading + the code") — restated here specifically so 4.4u's TAB-toggle has an accurate prerequisite, + not because the earlier conclusion was in doubt. + **Scope for the bridge itself:** a scancode-to-ASCII table (amd64 i8042 scancode set 1 or 2 — + confirm which `i8042.c` actually captures, don't assume — plus `virtio_input.c`'s `EV_KEY` + codes for aarch64/riscv64, both need a table); `sk_readline()` gains a second poll path + alongside its existing serial read, merging both sources into the same line buffer (matches + the "merged serial+keyboard source" language already on record from the 4.3.5 entries); TAB + specifically needs to be intercepted *before* it reaches the line buffer as a character, and + routed to whatever the 4.4r toggle word ends up being, not inserted as a literal tab + character. + *Done when:* typing at a real (or QEMU-emulated) keyboard produces the same REPL behavior as + serial injection does today, on all three architectures, verified by QEMU boot with a + keyboard event injected via QEMU's own input-send-event monitor command (not socat/serial), + screendump showing the typed text landed in the REPL strip; three-arch QEMU boot + logs per + CLAUDE.md. + *Refs:* §27.8, 4.3.5 series, 4.4r, 4.4u, `docs/lithosananke/ROADMAP.md` M8 section. + - [ ] **4.5 — URGENT, flagged by Captain Bob 2026-08-11: the kernel build has never used any compiler optimization.** **Blocking priority, set by Captain Bob 2026-08-11: no other punch-list item is worked until 4.5a–4.5f are done**, ahead of whatever would otherwise diff --git a/evidence/mockups/console-layout-mockup-4.4u-amd64.png b/evidence/mockups/console-layout-mockup-4.4u-amd64.png new file mode 100644 index 0000000000000000000000000000000000000000..04fbafa7a6e29b0b1918551a450b7fcb531307b9 GIT binary patch literal 32613 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 NsqCRBBjwY; literal 0 HcmV?d00001