Stage E: every born VM is a switch participant (FABRIC-3.8 §3.6, G4)

capsule_birth_baby() registers each VM at its LIVE completion point, beside
the common-channel subscription. register() is idempotent. The Artemis/
Hestia registrations in kernel_main.c and WIREBIND's own call are removed
(Hera, never born through capsule_birth_baby, stays with set_current).

Probe (restored away): Tripod registered once each (3 slots), a
WORKER-BIRTH VM becomes a participant with no hand registration (4) and
KILL frees it (3), WIREBIND registers exactly console+user, zero
duplicates, on amd64/aarch64/riscv64. Acceptance: dict_hash unchanged,
relay 3, idle growth 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-09-23 20:07:22 -04:00
co-authored by Claude Opus 5.5
parent 604ad7aadc
commit c7185facf0
19 changed files with 55115 additions and 22 deletions
+51
View File
@@ -1052,3 +1052,54 @@ explicit instruction.
- WIREBIND's detach path calls `capsule_vm_kill()` directly, without the `KILL` word's
`vm_physics_retire()`. I have not checked whether a detached identity's VM-physics heat
is retired elsewhere.
- [x] **Stage E — every born VM is a switch participant (§3.6, G4).** 2026-09-23. Captain Bob:
*"yes"* (go ahead with Stage E).
Changes:
- `capsule_birth.c`: `capsule_birth_baby()` registers the new VM right after its task 3.2
common-channel subscription, at its LIVE completion point. The capsule code has already
run to completion by then. A full table is logged and doesn't fail the birth.
- `capsule_vm_switch_signal.c/.h`: `sk_vm_switch_signal_register()` is now
**idempotent**. An already-registered VM gets its existing slot back, not a duplicate.
- `kernel_main.c`: the Artemis/Hestia registrations are removed. Hera is still registered
there (she's the one VM never born through `capsule_birth_baby()`), together with
`sk_vm_switch_set_current(mama)`. Nothing can switch before that: every switch point
requires a current VM.
- `capsule_wirebind.c`: the user VM's `sk_vm_switch_signal_register()` call becomes a
participation lookup. `switch_slot` was only ever used as a ≥ 0 flag and is now
documented as one, since slot indices shift when the table compacts.
- The WIREBIND console VM is now a participant too. That's harmless: it never has mail,
so it is never chosen. It is unregistered when it's killed at detach (Stage D).
- Registration order changes: Hestia, then Artemis at their births, then Hera. Decisions
don't depend on order (C-b's walk-order evidence), but the DoE's `switch_current_slot`
column now numbers them in that order.
- Boot order checked: `sk_vm_switch_signal_boot_init()` (`kernel_main.c:536`) runs before
the Tripod births (`:1124`/`:1142`).
**Evidence, as named in §4.** A temporary probe, restored away from a pre-probe snapshot
and verified free of probe code:
- `register()` prints every call, and flags any `DUPLICATE`;
- `kernel_main.c` checks Tripod participation, then `WORKER-BIRTH`s `eprobe` **without
registering it by hand**, checks it is a participant, and `KILL`s it.
Probe runs with the full relay: `logs/20260923-192830/amd64/`, `-193439/aarch64/`,
`-194103/riscv64/`. Identical on all three:
- `register` lines for Hestia (count 0 → 1), Artemis (1 → 2), Hera (2 → 3), eprobe
(3 → 4);
- `STAGE-E PROBE: tripod hera=1 artemis=1 hestia=1 slots=3; WORKER-BIRTH eprobe
participant=1 slots=4; after KILL slots=3`, **PASS**;
- at WIREBIND attach, exactly **two** registrations (the console VM and `rajames~user`);
- **zero `DUPLICATE`** lines anywhere;
- the relay still gives `3`.
**Formal acceptance with the probe gone:** `logs/20260923-194803/amd64/`,
`-195401/aarch64/`, `-200026/riscv64/`.
- All reach `[zuse@Hera] ok>` with zero `UNKNOWN WORD`, failures and faults.
- The `dict_hash` set is unchanged.
- The relay gives `3` through a real switch.
- Idle log growth: 0 bytes.
- Clean build on all three plus hosted, no new warnings.
**What this makes possible (not exercised yet):** every `WORKER-BIRTH`ed DoE worker is now
a participant. Mail sent to a worker is delivered by a switch onto its own stack, and it
competes by heat. Stage G's `SEND` word and interleave test are next.