diff --git a/FABRIC.md b/FABRIC.md index ceae69e..c1ea87a 100644 --- a/FABRIC.md +++ b/FABRIC.md @@ -4366,9 +4366,10 @@ document and committing that amendment as its own item.* > This closes the keyboard-input slice opened at 4.3.5. Next per the 2026-08-07 sequencing > note below: glyph rendering (stroke-based font capsules), not yet scoped. - > **Sequencing noted 2026-08-07, not yet scoped:** keyboard input (4.3.5–4.3.5f) → - > glyph rendering (stroke-based font capsules) → REPL — in that order, before the 4.5 - > Artemis boundary (renumbered from 4.4, 2026-08-11 — REPL now has its own 4.4 section). + > **Sequencing noted 2026-08-07, not yet scoped:** keyboard input (4.3.5-4.3.5f) → + > glyph rendering (stroke-based font capsules) → REPL — in that order, before the 4.6 + > Artemis boundary (renumbered from 4.4, then from 4.5, 2026-08-11 — REPL now has its own + > 4.4 section, and Artemis moved down to make room for item 4.5's -O0 finding). > Recorded so the order is not lost between sessions; neither glyph > rendering nor REPL has *Done when* criteria yet. Per §25.0 rule 2, each gets scoped in > detail at its own checkpoint, not now. @@ -4977,8 +4978,8 @@ document and committing that amendment as its own item.* ⋯ *(4.3.x is open-ended — more items get appended here as framebuffer/keyboard Console work* *is scoped item by item, developed on the fly per §25.0. 4.4 below is a new, independent* *section for the REPL itself — separate because the REPL is independent of the screen-output* - *and keyboard work above. 4.5 (renumbered from 4.4, 2026-08-11) is unaffected by anything* - *added above this marker.)* + *and keyboard work above. Artemis's item (renumbered from 4.4 to 4.5, then to 4.6,* + *2026-08-11) is unaffected by anything added above this marker.)* - [x] **4.4 — Design-only: lock the prompt format and color values.** No code. Write down the exact target string — `[VM name] ok>` for now, `(user)` added later per 4.4s — and the exact @@ -5330,10 +5331,7 @@ 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.5 — Artemis last.** It works today; it is the thing that cannot be broken. - *Refs:* §10. - -- [ ] **4.6 — URGENT, flagged by Captain Bob 2026-08-11: the kernel build has never used any +- [ ] **4.5 — URGENT, flagged by Captain Bob 2026-08-11: the kernel build has never used any compiler optimization.** Found while investigating why moving `console_fb_init()` earlier in boot (4.4g) stalled boot indefinitely (12,700+ lines logged, still running after 3 minutes vs. a normal few-second boot). Cross-cutting — affects the entire kernel, not just @@ -5388,12 +5386,12 @@ document and committing that amendment as its own item.* is shared. This is a real, specific, isolated bug (one field, not a sprawling unknown), not a hypothetical one — but it is unaudited, and enabling `-O2` before fixing it would ship a live regression. - **Not scheduled as one item — broken out below (4.6a–4.6f) per §25.0 rule 1, same treatment + **Not scheduled as one item — broken out below (4.5a–4.5f) per §25.0 rule 1, same treatment as 4.4's own design-only lock before 4.4a onward.** Nothing below is started; this is scoping only, per Captain Bob's explicit instruction 2026-08-11. *Refs:* discovered via 4.4g; independent of Console work. -- [ ] **4.6a — Full ISR/interrupt-context global-state audit, all three architectures.** +- [ ] **4.5a — Full ISR/interrupt-context global-state audit, all three architectures.** Investigation only, no code change. For each architecture, enumerate every vector actually wired to a handler (amd64: IDT/APIC vectors in `arch/amd64/interrupts.c`; aarch64: GIC vectors in `arch/aarch64/interrupts.c`; riscv64: PLIC/trap causes in @@ -5406,22 +5404,22 @@ document and committing that amendment as its own item.* *Done when:* a written inventory exists here (or in a linked scratch doc) covering every handler on all three architectures, with every non-`volatile` ISR-touched global listed by file:line, or an explicit "none found" recorded per architecture. - *Refs:* 4.6. + *Refs:* 4.5. -- [ ] **4.6b — Fix every hazard 4.6a found.** Depends on 4.6a. Code fix, no optimization +- [ ] **4.5b — Fix every hazard 4.5a found.** Depends on 4.5a. Code fix, no optimization flags touched yet. `TimeTrustState.ticks` is the one already-confirmed instance — mark it `volatile`, or fold it into the existing `g_pending_counter`/`g_pending_valid`-style ISR→mainline handoff pattern already used elsewhere in `heartbeat.c`, whichever fits the - finding better once 4.6a's full inventory is in hand. Any further hazards 4.6a surfaces get + finding better once 4.5a's full inventory is in hand. Any further hazards 4.5a surfaces get fixed here too, not deferred. - *Done when:* every hazard from 4.6a's inventory is fixed; three-arch boot still clean at + *Done when:* every hazard from 4.5a's inventory is fixed; three-arch boot still clean at the unchanged `-O0` (this item changes correctness under future optimization, not present behavior, so a clean boot here proves no regression was introduced, not that optimization is now safe). - *Refs:* 4.6, 4.6a. + *Refs:* 4.5, 4.5a. -- [ ] **4.6c — Decide and record the target optimization flags.** Design-only, no code. - Depends on 4.6b (deciding flags before the known hazard is fixed is premature). Candidates +- [ ] **4.5c — Decide and record the target optimization flags.** Design-only, no code. + Depends on 4.5b (deciding flags before the known hazard is fixed is premature). Candidates to weigh, not yet chosen: matching the hosted/StarForth ladder's `-O2 -flto=auto -fuse-linker-plugin -DNDEBUG` (this repo's own `Makefile`'s `TARGET_CFLAGS_standard`, and CLAUDE.md already documents that plain `-flto` without @@ -5432,38 +5430,41 @@ document and committing that amendment as its own item.* actually uses `assert()` anywhere before copying that flag by habit from the hosted ladder. *Done when:* an exact flag set is chosen and written down here with the reasoning, before any Makefile edit. - *Refs:* 4.6, CLAUDE.md "Important: Linker Configuration". + *Refs:* 4.5, CLAUDE.md "Important: Linker Configuration". -- [ ] **4.6d — Apply the chosen flags to `Makefile.starkernel`; build all three - architectures.** Depends on 4.6b (hazard fixed) and 4.6c (flags decided). Code change: +- [ ] **4.5d — Apply the chosen flags to `Makefile.starkernel`; build all three + architectures.** Depends on 4.5b (hazard fixed) and 4.5c (flags decided). Code change: add the flags to `COMMON_CFLAGS` (shared across all three `ARCH_CFLAGS` blocks, so this is one change, not three). Optimization can surface warnings `-O0` never triggers (e.g. `-Wmaybe-uninitialized`) under the existing `-Wall -Werror -Wextra` standard — budget time to fix those, not to weaken the warning set. *Done when:* all three architectures build with zero warnings under the existing `-Wall -Werror -Wextra` standard. - *Refs:* 4.6, 4.6c. + *Refs:* 4.5, 4.5c. -- [ ] **4.6e — Three-arch acceptance boot with optimization enabled.** Depends on 4.6d. This +- [ ] **4.5e — Three-arch acceptance boot with optimization enabled.** Depends on 4.5d. This is the actual gate, per CLAUDE.md's non-negotiable acceptance criteria — a kernel that has only ever been built and accepted at `-O0` has no track record at any other optimization level, so this is a full fresh verification, not a formality. *Done when:* all three architectures boot clean to `ok>`/`zuse)ok>`, POST's dictionary-hash parity check still passes, logs captured in `logs/` per CLAUDE.md. - *Refs:* 4.6, CLAUDE.md acceptance criteria. + *Refs:* 4.5, CLAUDE.md acceptance criteria. -- [ ] **4.6f — Retry the 4.4g `console_fb_init()` reorder now that optimization is live.** - Depends on 4.6e. This is the original motivating case: both attempts this session (bare, +- [ ] **4.5f — Retry the 4.4g `console_fb_init()` reorder now that optimization is live.** + Depends on 4.5e. This is the original motivating case: both attempts this session (bare, and with the `fb_scroll_rows()` volatile fix alone) stalled boot indefinitely at `-O0`. *Done when:* the reorder from 4.4g completes in a reasonable time (no multi-minute stall) on a three-arch boot, and an amd64 screendump shows the fuller boot transcript that was 4.4g's whole point. - *Refs:* 4.4g, 4.6. + *Refs:* 4.4g, 4.5. > **Aside, not a task:** the ACL-RWT DoE campaign's overhead numbers (CLAUDE.md, "measured > overhead +0.0054%–+0.0088%") were all measured at `-O0`. Nobody has asked whether those > numbers still hold, or even remain comparable, once the kernel is built at a different - > optimization level. Not scoped here — flagging so it isn't lost if 4.6 ever lands. + > optimization level. Not scoped here — flagging so it isn't lost if 4.5 ever lands. + +- [ ] **4.6 — Artemis last.** It works today; it is the thing that cannot be broken. + *Refs:* §10. --- @@ -5969,8 +5970,9 @@ of slot. ### 27.6 Glyph rendering, UTF-8 Latin, capsule-loaded (4.3.6–4.3.6g) Scoped 2026-08-09, next after the 4.3.5f checkpoint, per the 2026-08-07 sequencing note -(§25.5): keyboard input → glyph rendering → REPL, before the 4.5 Artemis boundary (renumbered -from 4.4, 2026-08-11 — REPL now has its own 4.4 section). +(§25.5): keyboard input → glyph rendering → REPL, before the 4.6 Artemis boundary (renumbered +from 4.4, then 4.5, 2026-08-11 — REPL now has its own 4.4 section, and Artemis moved down to +make room for item 4.5's -O0 finding). **Purpose and boundary.** Render text onto the CANVAS region of the Stadium UI (per the reviewed mockup: a fixed REPL strip at the bottom of the screen, a separate large CANVAS