FABRIC.md §25: fix GAP-C1 through C7 — punch item defects

One batch commit for the seven mechanical item fixes from §25.7.1, each tagged
in place:

C1  Item 0.1 no longer contradicts its own Refs line. Delete set is 2051-2056 +
    2058-2059; blocks 2057, 2049 and 2050 survive edited, with the per-block
    edits now spelled out. The old "remove 2050-2059" wording would have
    deleted the banner.
C2  Items 0.2 and 0.5 accept on no-regression. Both previously required having
    taken and returned an interrupt at a stage where no interrupt source
    exists; the real evidence lands with 0.3's and 0.7's tick-advance
    acceptance, and both items now forbid pulling later work forward to
    manufacture it.
C3  Item 0.3 carries sie.STIE and the every-tick re-arm -- the SBI timer is
    one-shot and a missed re-arm stops the heartbeat forever with no error.
C4  §23.4 #4 is now schedulable as item 1.12 (continuation-cell encoding);
    3.1's blocker line and the Phase 3 gate reference it.
C5  Item 1.11 is formally blocked on 4.3 instead of informally deferred.
C6  Item 0.10's "sane" sharpened to trust near Q48_ONE and variance small
    relative to the new expected_delta; the amd64-control framing is noted as
    valid again under the GAP-A1 ruling.
C7  The commit template no longer hardcodes a model name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-08-03 11:33:04 -04:00
co-authored by Claude Fable 5
parent 8ac284f8c1
commit 9b61a3355e
+42 -17
View File
@@ -1966,7 +1966,7 @@ Commit message format:
Punch list §25 item <id> complete.
<one or two lines on what was actually verified, not what was intended>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: <the implementing model's attribution line, per its harness>
```
### Standing constraints from `.claude/CLAUDE.md`
@@ -1998,12 +1998,18 @@ wrong because it is written down, and do not silently implement something differ
on until there is a tick on all three architectures (§16.1, §16.5).*
- [ ] **0.1 — Prune `capsules/init.4th` to Hera alone.**
Remove the Artemis and Hermes births, the `common:msg.4th` and `process.4th` loads, and
blocks 20502059's fleet test scaffolding. Adjust `BOOT-BANNER`, `VM-TREE`, `VM-CHILDREN`.
Leave `capsules/hermes/` and `capsules/artemis/` untouched on disk.
**Delete** blocks 2051, 2052, 2053, 2054, 2055, 2056, 2058, 2059 — the readiness
handshake, broadcast test, TRIPOD-TEST, HERMES-E2E, and fleet-DoE scaffolding.
**Edit** the three surviving blocks: 2057 (`BOOT-BANNER` — drop the Tripod lines), 2049
(remove the Artemis and Hermes births with their `CD-INIT` calls and the `common:msg.4th`
/ `process.4th` loads; keep `lib.4th`; adjust `VM-TREE` / `VM-CHILDREN`), and 2050 (keep
the `BOOT-BANNER` call; remove the `READINESS-HANDSHAKE` and `BROADCAST-TEST` calls).
Leave `capsules/hermes/` and `capsules/artemis/` untouched on disk. An earlier draft of
this item said "remove blocks 20502059," which contradicted its own Refs line — 2050
survives, edited (C1).
*Done when:* all three architectures boot to the prompt with Hera alone, no Hermes or
Artemis in the banner, and the three logs exist under `logs/`.
*Refs:* the surviving blocks are 2057, 2049, 2050.
*Refs:* the surviving blocks are 2057, 2049, 2050. `mkcapsule --lint` before building.
- [ ] **0.2 — riscv64: real trap entry.**
Replace the one-way `riscv64_trap_entry` in `arch/riscv64/isr.S` with save / dispatch /
@@ -2015,17 +2021,22 @@ on until there is a tick on all three architectures (§16.1, §16.5).*
plus `fcsr` alongside the integer set; verify the exact register list against the RISC-V
psABI, not this document. Do not "fix" this by switching to soft-float — that breaks
existing code and is a build-system decision nobody has made.
*Done when:* riscv64 boots to the prompt unchanged, having taken and returned from at
least one trap. Exceptions still halt with the same diagnostic as before.
*Done when:* riscv64 boots to the prompt with no regression, and exceptions still halt
with the same diagnostic as before. **No trap source exists yet at this item** — the
timer arms in 0.3, whose tick-advance acceptance is what proves this entry path took and
returned an interrupt (C2). Do not arm the timer early to manufacture evidence here.
- [ ] **0.3 — riscv64: SBI timer and real time base.**
**First, the prerequisite this item silently assumed (B1 verified it absent):** the
kernel has no DTB access — `BootInfo` (`uefi.h:624-639`) carries no FDT pointer and no
FDT code exists in the tree. Capture the DTB pointer from the EFI configuration table
(DTB table GUID) into a new `BootInfo` field in the shared loader. This also serves 0.6.
Then: arm the timer via the SBI TIME extension. Switch the time base from `rdcycle` to
the `time` CSR and take its frequency from the device tree `timebase-frequency`, with a
named fallback constant — not a bare magic number (§16.2).
Then: arm the timer via the SBI TIME extension, **enable `sie.STIE`**, and **re-arm
inside the handler on every tick — the SBI timer is one-shot by nature, and a missed
re-arm stops the heartbeat forever with no error. That is the single most likely silent
failure of this item (C3).** Switch the time base from `rdcycle` to the `time` CSR and
take its frequency from the device tree `timebase-frequency`, with a named fallback
constant — not a bare magic number (§16.2).
*Done when:* `heartbeat_ticks()` advances on riscv64 and the tick interval matches the
configured rate within measurement noise. Verify the SBI extension is present before
relying on it; if it is absent, stop and report rather than falling back silently.
@@ -2052,7 +2063,10 @@ on until there is a tick on all three architectures (§16.1, §16.5).*
never consulted for exceptions taken at EL2. The EL detected in 0.4 must select the
vector base register (`VBAR_ELx`), the saved-state pair (`ELR_ELx`/`SPSR_ELx`), and the
`eret` target state, not just the timer registers.
*Done when:* aarch64 boots to the prompt having taken and returned from at least one IRQ.
*Done when:* aarch64 boots to the prompt with no regression. **No IRQ source exists yet
at this item** — the GIC lands in 0.6 and the timer arms in 0.7, whose tick-advance
acceptance is what proves this path took and returned an IRQ (C2). Do not pull 0.6/0.7
work forward to manufacture evidence here.
- [ ] **0.6 — aarch64: minimal GICv2.**
Enable the distributor and CPU interface, set the priority mask, enable the timer PPI,
@@ -2089,8 +2103,10 @@ on until there is a tick on all three architectures (§16.1, §16.5).*
- [ ] **0.10 — Phase 0 acceptance.**
Full three-architecture QEMU run. Confirm: boots to prompt on all three; tick count
non-zero on all three; TIME-TRUST and variance sane on riscv64 after 0.3; amd64 output
unchanged from its pre-branch behaviour.
non-zero on all three; on riscv64 after 0.3, trust near `Q48_ONE` and variance small
relative to the new `expected_delta` — not merely "sane", which is unfalsifiable (C6);
amd64 output unchanged from its pre-branch behaviour (a valid control under the GAP-A1
ruling, since 0.8 no longer touches engine plumbing).
**Then boot one architecture twice and confirm the parity dict hash is identical across
runs.** If it drifts, something is firing on wall time and Phase 0 is not complete.
*Done when:* all of the above observed, logs committed.
@@ -2151,8 +2167,17 @@ document and committing that amendment as its own item.*
- [ ] **1.10 — Identity elision.** Whether identity can be dropped for some kinds without a
per-kind branch. Optimisation; may be closed as "no". *Refs:* §23.4 #3.
- [ ] **1.11 — Dirty-event granularity.** Leaning region-based. **Deferred to console work**
— do not settle speculatively. *Refs:* §17.5, §23.2, §23.4 #1.
- [ ] **1.11 — Dirty-event granularity.** Leaning region-based. **Blocked on item 4.3**
it is settled as part of the console migration, not speculatively before it (C5).
*Refs:* §17.5, §23.2, §23.4 #1.
- [ ] **1.12 — The continuation-cell encoding.** Contiguous (continuation cells are pure
payload; allocation must find runs, reintroducing fragmentation) or linked (each
continuation cell carries a next-index, costing 4 bytes of payload and changing every
large patron's mass). §22.3's per-VM free list guarantees no adjacency, so linked is the
default unless allocation changes. This was §23.4 #4 — a stated blocker of item 3.1 that
was never a schedulable item until now (C4). Settling it completes §23.3's sizing table.
*Refs:* §23.4 #4, §23.3, §22.3. **Prerequisite of 3.1.**
---
@@ -2203,13 +2228,13 @@ document and committing that amendment as its own item.*
## 25.4 Phase 3 — Stadium core
*Blocked on Phase 0 complete, and on items 1.11.7.*
*Blocked on Phase 0 complete, and on items 1.11.7 and 1.12.*
- [ ] **3.1 — Cell and header.** Define the entry with all eight wires (§3) — **nine if
item 1.1 resolves to a holder index.** Define both members of §3's closed two-valued
union: patron header and continuation cell. Validate the 64-byte cell by counting real
bytes; adjust and record if it does not fit.
**Blocked on:** item 1.1 (may add a wire) and §23.4 #4 (the continuation-cell encoding —
**Blocked on:** item 1.1 (may add a wire) and item 1.12 (the continuation-cell encoding —
contiguous or linked — which sets the mass of every large patron and cannot be guessed).
*Refs:* §3, §23.3, §23.4 #4.
- [ ] **3.2 — Boot-time allocation.** One global cell array, sized from the memory budget,