FABRIC-3.10.8 §4.9: plan K-9 (physics node removal), K-10 (stale Hermes references), K-11 (lock rank check)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-09-26 09:26:38 -04:00
co-authored by Claude Opus 5.5
parent f29658a65d
commit 1a3e21b51e
+17
View File
@@ -704,3 +704,20 @@ riscv64's slowest completion halved (15.1 → 7.7 ms), consistent with requests
| riscv64 | `logs/20260926-091122` | same; 0 `timed out` lines |
**K-8 closes the unexplained part of K-1's heap criterion.**
### 4.9 Three more stages, from the rulings on K-8's report (plan, 2026-09-26)
**Rulings (Captain Bob, 2026-09-26):**
1. **A dead VM's `vm_physics` node is removed at KILL and reap.**
2. **The stale Hermes-VM references are removed.** The DoE CSV's `hermes_heat_q48` column becomes **Hestia's heat** (`hestia_heat_q48`): same position, same column count.
3. **The lock order gets a runtime rank check.**
**Found while planning K-9:** `vm_physics_retire()` (the dying VM's heat goes to Hera) is called only by the FORTH `KILL` word. `capsule_vm_kill()` called from WIREBIND/EJECT/UNCLEAN, and `capsule_vm_force_reap()`, never retire. A VM that dies those ways keeps a live physics node still holding heat. That heat still counts in the fleet sum, so K stays conserved, but a dead VM holds it. K-9 moves the retirement into the two kernel death paths, so every death retires and then removes.
| Stage | Change | Evidence (named in advance) |
|---|---|---|
| **K-9** | New `vm_physics_remove(vm_id)`: retire (heat to the root), unlink, free. Called from `capsule_vm_kill()` and `capsule_vm_force_reap()`, before the registry entry goes DEAD (the root walk reads the registry). The `KILL` word's own retire call goes; Hera is refused, as today. | Standard sequence unchanged; fleet conserved. K-8's heap probe: each worker cycle leaves **1 block, 168 bytes** (the registry node only). `VM-PHYSICS` lists only live VMs after a churn. |
| **K-10** | `CONNECT-HERMES` (births the removed `hermes:init.4th`, so it always fails) is removed with both registrations and its `docs/lithosananke/DICTIONARY.md` row. `ARTEMIS-ANNOUNCE-READY` (`capsules/artemis/init.4th` block 4129, no callers) is removed. `doe_log.c` column 17 reads Hestia's heat, named `hestia_heat_q48`, and the column comments are corrected. | Standard sequence passes. The M7.1a hash and word count, Hera's and Artemis's dict hashes change once and are recorded as the new baseline; Hestia's is unchanged. The CSV header reads `hestia_heat_q48`, and its rows carry nonzero Hestia heat. |
| **K-11** | Every lock gets a rank, in the header's order: hermes < switch < registry < VM `dict_lock` < VM `tuning_lock` < stadium < slot < doe < log < block < console < heap < vmm < pmm. Each core counts the locks it holds per rank. Taking a lock whose rank is not above every rank already held counts an **order violation**, recording both locks and the call site. A same-rank pair, such as two Stadium slots or two VMs' `dict_lock`s, is a violation too. It is logged by `sk_lock_report()` like the other lock failures. | A probe that takes heap and then registry logs exactly one `LOCK: order violation`, naming both. With the probe reverted, O-A, the standard sequence and a 20-VM churn log **0 order violations** on all three ISAs, or else each one is reported as a finding (not fixed unrequested). |
**Found, not changed:** `ARTEMIS-READY-ACK` (block 4129) was only ever called by the Hermes VM and has no caller now. `experiments/std79-doe/{analysis,report}-20260912/{combine.py,analysis.R}` read `hermes_heat_q48` from their own historical data; they are left as they are.