diff --git a/FABRIC.md b/FABRIC.md index b24e74c..57675f8 100644 --- a/FABRIC.md +++ b/FABRIC.md @@ -3300,8 +3300,46 @@ document and committing that amendment as its own item.* > parity output — untouched, as designed. Stadium diagnostics also identical across all > three: `promotions=354 evictions=0`, `resident_sum=65536 reservoir=0 sum=65536 > (Q48_ONE=65536)` — the conservation invariant closes exactly. +- [ ] **4.1a — Quota granting: Hermes's birth grant.** New prerequisite item, inserted + 2026-08-05 while scoping 4.2 — found that no quota-granting mechanism exists at all. + `quota_slot_for_vm()` refuses every `vm_id != 0` today, permanently, by design (item 3.5's + note); `stadium_admit()`'s own doc and item 3.2's DONE note both defer per-VM free lists to + "when Hera assigns a VM its quota," which nothing builds. Item 1.3 (§25.2) resolved *when* + Hera arbitrates a capacity *transfer* between VMs that already hold quotas, but explicitly + left "how much capacity moves" unresolved and out of scope (§22.5 #2) — that is the + *recurring* mechanism, and stays open; this item is narrower: Hermes's one-time *initial* + grant at birth, the same shape as Hera's own whole-pool grant at `stadium_boot_init()`, not + an instance of the still-open recurring loop. *Refs:* §1.3, §22.3, §22.5 #2. + + > **Ruled, 2026-08-05:** + > 1. **Reservoir is not part of this.** `stadium.c`'s own comment states the conservation + > invariant per-VM — `Σ(resident heat) + reservoir == Q48_ONE` for *that VM's own + > quota* — not a shared pool split across VMs. Hermes gets her own fresh `Q48_ONE` + > reservoir at birth, the same pattern as Hera's boot grant, not a fraction of Hera's. + > Only cell count is actually open. + > 2. **Cell split: even.** At Hermes's birth, half of whatever cells are currently on + > Hera's free list move to a new quota slot for Hermes. Hera's residents — including + > pinned cell 0 — are never touched; only her free list is split. No tuned constant: an + > even split needs no threshold, consistent with §22's "no tuned threshold" elsewhere in + > this design. + > + > *Done when:* + > - A new `stadium_grant_quota(VMUuid vm_id)` (or equivalent, named at implementation + > time) exists in `stadium.c`, callable at a baby VM's birth (`capsule_birth.c`). + > - Splits Hera's free list evenly by cell count (±1 for odd counts), reassigns + > `stadium_owner[idx]` for every cell that moves, and grants the new VM a fresh + > `Q48_ONE` reservoir — verified by both VMs' independent conservation checks closing + > exactly immediately after the grant, with zero residents on either side yet. + > - Hera's own residents (including cell 0) are provably untouched — same cell count and + > identities before and after the grant. + > - Refuses (does not crash) if `vm_id` already holds a quota, or if the granting VM's + > free list is empty. + > - All three architectures boot to `ok>` with logs under `logs/`, `dict_hash` unchanged + > from item 4.1's baseline (`0x3d4e1daf289da94f`) since this item touches no dictionary + > word. - [ ] **4.2 — Hermes native on the Stadium.** The proving ground; produces the effort - number. *Refs:* §10. + number. *Refs:* §10. **Blocked on 4.1a** — Hermes cannot hold Stadium residents without a + quota, and nothing grants one yet. > **Two rulings taken before work starts, 2026-08-05:** > 1. **`stadium_owner[idx]` fix folded into this item's scope**, by explicit Captain Bob