# FABRIC-3.9.8.md — Observers and participants: execution plan and log **Status: PLANNED. No stage started.** The design and its open rulings (O-1 to O-4, plus the discard question) are in `FABRIC-3.9.0.md`. Each stage: - needs Captain Bob's explicit go; - gets its own commit; - gets its own three-architecture acceptance (`clean qemu`; amd64, then aarch64, then riscv64; foreground; visible framebuffer; one at a time; coupled images reset before each). Evidence is named **before** each stage runs. **The standing acceptance sequence for every stage**, unchanged from `FABRIC-3.8.md`: - a boot to `[zuse@Hera] ok>` with zero `UNKNOWN WORD`, faults and frame corruption; - the `dict_hash` set identical across ISAs; - the Stage G interleave (two workers, `A`/`B`), byte-identical across ISAs; - mint → WIREBIND → `USE` → `1 2 + .` → `3`; - 0 bytes of idle log growth over 20 s. ## 1. Staged plan | Stage | Change | Evidence (named in advance) | |---|---|---| | **O-A** | Observer role (`FABRIC-3.9.0.md` §2.1). The absolute-heat-share charge is discarded (ruling 5). Observers are left out of the decision's candidates, the work-heat charge and the floor. (Also the absolute charge, if O-2 is ruled so.) Observers with events go ahead at clean boundaries, among themselves by wait stamp (§2.4, per O-1). | The standard sequence. A probe (reverted after capture) shows the decision never returning an observer as a heat candidate, and an observer with mail switched to at the next participant checkpoint. **The busy-wait DoE driver, unchanged, run as a cfg-0 trial with rows on for a fixed window:** Hera's share of rows falls from about ½ (the stopped relaunch's tail) to near 0 while both workers have work. That is the measured symptom this design exists to fix. | | **O-B** | Hera's own mail drained at `sk_vm_idle_point()`, with the readline `n > 0` gate; the timer-paced pump drain removed (§2.5). | The standard sequence, plus: a message sent to Hera while she sits idle at the prompt is acted on **without waiting for the idle beat**. A probe records the delay in beats from admission to drain; it must be well under `SK_IDLE_BEAT_INTERVAL`. The relay and BLK-ATTACH flows are unchanged. | | **O-C** | An event-driven DoE driver (§3): `DOE` starts trial 1 and returns to the prompt; `MU-DONE` counts, ends trials and starts the next; `MU-WAIT-ALL` is deleted. Capsule only. | A 1-rep smoke campaign on amd64 runs all 6 cells to `MU-CAMPAIGN: complete`, with every trial `fail=0` and N/N `KILL … dead`. Hera's rows during trials are only event handling. The prompt answers typed input while trials run. Then the standard sequence on all three ISAs. | | **O-D** | The DoE relaunch: `12345 3 S" " DOE`, amd64, then aarch64, then riscv64, with the ring extracted between ISAs and `artemis.img` **not** reset in between. | A fresh time estimate from O-C's measured row rate, **before** launch. Then per ISA: 18 `MU-TRIAL` markers, `fail=0`, `MU-CAMPAIGN: complete`. | | **Merge** | This branch to `master`, once all three ISAs have completed O-D. | Per this project's own merge practice, at Captain Bob's word. | **Stop conditions** (re-plan rather than push on): - `dict_hash` diverges across ISAs; - conservation (`vm_physics_conserved()`, `stadium_conserved()`) goes false; - an observer is ever returned as a heat candidate; - a switch storm: log growth at an idle prompt, with QEMU pinned; - a trial that never produces its marker. ## 2. Execution log *(empty: no stage started)*