diff --git a/FABRIC-3.5.md b/FABRIC-3.5.md index 0ff51bac..1871f1dc 100644 --- a/FABRIC-3.5.md +++ b/FABRIC-3.5.md @@ -4665,3 +4665,58 @@ not edited from here. `.claude/CLAUDE.md` now carries the full 64×16 rule. `MANIFEST.md`'s ride the strip per §XXII.5. - ⬜ **Item 45, NEW** — carry §XLIV.1's 64-char line limit into the `experiments/bare_metal/README.md` capsule guidance if it repeats the byte framing. **Not checked; flagged.** + +--- + +## XLV. B1, B2, B4 SETTLED by Captain Bob (2026-09-21) — channels negotiate, the switch table is dynamic, payloads are one block + +Three of Phase 3's blockers (`FABRIC-3.6.md` B1/B2/B4) ruled in one session. **These are rulings, +recorded as given; the reasoning below is the design consequence, not new design.** + +### XLV.1 — B1 (item 27): negotiated channels, pub/sub, ACK/NACK + +> **Messaging is publish/subscribe. There is one common channel every VM listens to. A private +> channel is created by request → grant/deny over the common channel, and the granted channel +> is a new topic with its own membership. ACK/NACK negotiation runs throughout.** + +This **overrules §XXXIII.5's recommendation** (one flat broadcast membership) in favour of the +negotiation that `messaging.4th`'s CH-REQUEST/ACCEPT/CONFIRM/CLOSE already sketched. Consequences: + +- **`SkHermesMembership` (task 2.1) is per-channel.** The flat list is right *per topic*; there + is now one per channel, held in a **dynamic** table with no fixed channel maximum (same + reasoning as XLV.2). +- **The common channel is a permanent topic**; every VM is subscribed from birth. +- **A deny is a NACK.** ACK/NACK are ordinary message types on the existing heat-coupled + allocator (tasks 2.2–2.7), so they draw and decay heat like any message. +- **Advised, not ruled — open for Captain Bob:** ACK the private-channel open and delivery, not + every common-channel message, since ACK-everything roughly doubles message heat draw against + the consumption economy (§XL.4). +- **Advised, not ruled — open:** who may open a channel with whom is policy and belongs in + `ACL.4th` (CLAUDE.md: policy in FORTH, never gated on `zuse_session`); kernel-Hermes should + ask, not decide. Where that hook lives must be settled before the grant task is written. + +### XLV.2 — B2 (item 32): the switch table is dynamic, not a constant + +> **`SK_SWITCH_MAX_SLOTS` (16) is not to be fixed and static; it becomes a dynamic component.** + +Precedent already in the tree: Stadium sizes its VM quota table from RAM at boot +(`stadium_max_vm_count_val`, kmalloc'd, 2026-08-15). The switch table follows the same pattern. +**The concrete sizing rule is not yet specified** and is a task-writing prerequisite. + +### XLV.3 — B4 (item 44): payload bound is one block; larger payloads chunk + +> **Follow the block convention the `*.4th` files use.** + +Read as (confirmed by Captain Bob 2026-09-21): a message payload is bounded to **one block = +1024 bytes** (64×16, §XLIV.1), which matches §XLIII.6.1's `INPUT_BUFFER_SIZE − 1` drain limit; +anything larger is **chunked across messages**. Chunk framing (sequence/last-chunk marking) is +a Phase 3 task-writing prerequisite. Note the 64-char line rule (§XLIV.1) governs *capsule +source blocks*; whether it also constrains message payload content is **not** ruled here. + +### XLV.4 — Punch list + +- ✅ **Items 27, 32, 44 — SETTLED** (§XLV.1–.3). +- ⬜ **NEW** — ACK cadence (XLV.1); ACL hook for channel-open policy (XLV.1); dynamic switch-table + sizing rule (XLV.2); chunk framing (XLV.3). Each blocks its own Phase 3 task, not the phase. +- ⬜ **Phase 3 task breakdown** — no tasks are written yet; `FABRIC-3.6.md` still holds the + one-line shape from §XXXIV.3, which predates negotiation. diff --git a/FABRIC-3.6.md b/FABRIC-3.6.md index 93c03c40..79244e7d 100644 --- a/FABRIC-3.6.md +++ b/FABRIC-3.6.md @@ -732,21 +732,26 @@ Hestia; headless policy intact. **Phase 2 is complete (2.1–2.8).** Phase 3 remains blocked on B1, B2, B4. -## Phase 3 — Cutover — **BLOCKED** +## Phase 3 — Cutover — **UNBLOCKED, tasks not yet written** **Not buildable until all three clear.** Shape once unblocked (§XXXIV.3): cut over `BLK-ATTACH-EVENT` alone, then remaining types one at a time, under §XXXIV.2's partition rule — one message type owned by exactly one layer, no message shared. -- [ ] **B1** — **Item 27**: channels — negotiation, or one broadcast membership? (§XXXIII.5 - recommends the latter; unruled.) -- [ ] **B2** — **Item 32**: `SK_SWITCH_MAX_SLOTS` is 16 and §XXXII made the switcher the sole - mover of control. Constant bump or table redesign? +- [x] **B1** — **CLEARED 2026-09-21 by `FABRIC-3.5.md` §XLV.1**: negotiated pub/sub channels — + one common channel, private channels by request/grant/deny, ACK/NACK throughout. Overrules + §XXXIII.5. Open sub-items: ACK cadence, ACL hook for channel-open policy. +- [x] **B2** — **CLEARED 2026-09-21 by `FABRIC-3.5.md` §XLV.2**: dynamic, not a fixed constant + (Stadium-style RAM-derived sizing). Open sub-item: the concrete sizing rule. - [x] **B3** — **CLEARED 2026-09-19 by `FABRIC-3.5.md` §XLIII**: the target drains its own queue at its own outermost interpret checkpoint; kernel-Hermes publishes and never dispatches. Reuses `sk_vm_at_outermost_interpret()` and the Stage 3 checkpoint. -- [ ] **B4** — **Item 44**: payload bound or chunking against `INPUT_BUFFER_SIZE` 1025 - (§XLIII.6.1). Decide before Phase 3. +- [x] **B4** — **CLEARED 2026-09-21 by `FABRIC-3.5.md` §XLV.3**: one block (1024 bytes) per + message, larger payloads chunked. Open sub-item: chunk framing. + +**All four blockers are cleared, but Phase 3 has no task breakdown yet** — the shape below +predates §XLV's negotiation. Writing the task list (and settling the §XLV.4 sub-items it +depends on) is the next step, before any Phase 3 code. ## Phase 4 — Category B strip