diff --git a/audit/release-2026-11-02/director.md b/audit/release-2026-11-02/director.md index 3e881bdd..9c4b6d7e 100644 --- a/audit/release-2026-11-02/director.md +++ b/audit/release-2026-11-02/director.md @@ -42,6 +42,8 @@ Written per `release/director/README.md` § the measurement. Sessions append to - session 544: **P9b opened**: [cybernode#13](https://github.com/cyberia-to/cybernode/pull/13), the revert-by-release machinery with an empty table (`wide`, sonnet subagent, reviewed by the director). Rehearsal 41411831611 was dispatched. - session 545: **41411831611 void**: it ran with a lone `cybernode` override, so soft3 `main` and lens `master` were built and every leg died in package-resolution. It was re-dispatched with the stand's full override set as [41414017957](https://github.com/cyberia-to/soft3/actions/runs/41414017957). - session 546: **41414017957, leg 1 of 5 (Linux x86_64)**: [cybernode#13](https://github.com/cyberia-to/cybernode/pull/13) holds: 336 / 0 against the baseline's 323 / 0, the new revert tests are green, and the reds are only the baseline pair. The other four legs are still running. +- sessions 547–557: see the plan's log. **P9b done**: cybernode#13 merged as `1d126da` (gate 41423930605). **P9c done**: cybernode#15 merged as `599cd85` (gate 41448682465). +- session 558: **P9d doing**: [cybernode#16](https://github.com/cyberia-to/cybernode/pull/16) (the owner's key in pussy's and pussy-rc's genesis) opened, and measuring rehearsal [41464171130](https://github.com/cyberia-to/soft3/actions/runs/41464171130) dispatched. ## PRs merged diff --git a/release/director/plan.md b/release/director/plan.md index 6dad3be5..fd2d9d76 100644 --- a/release/director/plan.md +++ b/release/director/plan.md @@ -169,7 +169,7 @@ status: `open → doing → done`, or `closed`. each row is one unit; its accept | G19 | an override ref that is neither a full 40-hex SHA, a branch on origin, nor `pull/N/head` fails at dispatch, not after a leg: `parse_overrides` (`release/train_sources.py`) refuses a 7–39-hex ref with a message that names the full-SHA and `pull/N/head` forms. Session 515 lost a 24-min rehearsal (41365724425) to `simulation=c312ab9` | soft3 · contained (release engine and its test) | `Release engine / test` green on the PR, with a unit test that `simulation=c312ab9` is refused and that a 40-hex SHA and `pull/2/head` are accepted. Allowed in the freeze: it is a fix to a gate, with a failing test first | **done 2026-11-02 (session 516): [soft3#623](https://github.com/cyberia-to/soft3/pull/623) merged into `release/phase1` as `2e3a050`** (`--match-head-commit f970cb1`, 00:55:34 UTC). `parse_overrides` refuses a ref that fully matches `[0-9a-f]{7,39}`, and the error names the 40-hex, branch and `pull/N/head` forms. `snapshot()` parses overrides before it resolves them, so the dispatch now fails in the `snapshot` job instead of on the legs. Gate `Release engine / test` [41369692758](https://github.com/cyberia-to/soft3/actions/runs/41369692758): 61 tests OK, including the 6 cases of `ParseOverridesTests`. Before the fix the 2 refusal cases failed (test first). The stand pins only 40-hex revs, so `test_pussy_stand` is unaffected | | P9 | **revert in the protocol** (D19): specify and build a protocol revert for pussy — the chain can return to an earlier height H and continue from it, every node doing the same thing by rule, no signature. Write the options into a spec amendment of `cybernode/specs/chain.md` §5 (the owner's hand, D6, labelled `decision`) with a recommendation, then implement the chosen one on `release/phase1` behind a test. Candidates to weigh: (a) a revert carried by the miners' signal bits of the header `version` (§7, bits 16–31): a revert to (H, block id) activates when a threshold of blocks in a window signals it — proof of work is the authority, as for ordering; (b) a revert manifest published as data in the network repository (`proposals/network-repos.md`) and taken by the binary at a named height — the release is the authority; (c) an `era` counter: blocks of era e+1 descend from block H of era e and outrank era e at any depth, entered by (a) or (b). Each option answers: who triggers, how deep, what happens to transactions after H (dropped, or replayed when still valid), how wallets and explorers learn of it, and what state a node keeps to rewind fast (per-epoch bbg snapshots). Acceptance includes a real revert rehearsed on the alpha network (`pussy-rc` on 194.107.163.6 + agent-a, live since 2026-11-01 19:47 UTC) **The owner answered the questions on 2026-11-02** (translated, no link exists): "who triggers the revert — for now, me; provide an address that we will write in. any block can be set. transactions after it are dropped, of course — if we use this mechanism, every client replays its links. the network is plainly not financial now: it is collective learning, an experiment, and for some time it must be understood that security grows. there are no wallets or explorers at first — only cyb, and we will support it there." So the design is fixed in its shape and the options (a)–(c) above are superseded: (1) the genesis params carry a revert authority — one key whose holder is the owner; the existing `checkpoint_key: [u8;33]` field (§4.4, today all zero) is the natural slot, its statement domain-separated from checkpoints; the owner supplies the key, and pussy's and pussy-rc's genesis are re-blessed with it (G5, G6, P4's pins); (2) a revert statement names (chain, target height H, block id at H, a revert counter), is authorized the way every transaction of the rule set is — NSIG1 today, by proof once P5 lands — and is gossiped like checkpoints (`checkpoints` topic, `/checkpoints`); (3) a node accepting it rewinds state to H (per-epoch bbg snapshots or replay from genesis, measured), drops every block above H and every transaction in them, and accepts only blocks descending from H under the new counter, at any depth, overriding `MAX_REORG`; (4) the mempool is cleared of transactions that no longer apply; (5) cyb learns the revert from the node and replays its own neuron's links (a cyb task, not consensus); (6) no sunset is set now — handing the authority over or retiring it is a later rule set, named as a hole. **The key exists (2026-11-02, generated on the owner's machine, secret held by the owner):** compressed secp256k1 public key `0354814b25ec4214b782b48b0d4cd562331f43ce77513f5ca0dd4414096959f473`, neuron id `3c51813c79349f501a1b6fe0dc84af204980d3c8a70622b812655bbcab171292` (`soft3 chain key --seed`, stand `d9a1613`). Write it into the genesis params of pussy and pussy-rc in place of the zero key (`crate/src/bin/soft3.rs` genesis build), re-bless both particles and P4's pins, and redeploy the alpha network from the new pussy-rc genesis; a test proves a revert statement signed by this key's secret is accepted and one signed by any other key is refused (the secret never enters the repository: the test uses its own key). | soft3 · cybernode · wide (a consensus rule) | the spec PR with the options and the measured cost of each; the chosen option merged with a test that reverts a mined chain by rule on two nodes; a revert performed on the alpha network with both nodes on the same tip after it | **done 2026-11-02 (session 552), P9b: [cybernode#13](https://github.com/cyberia-to/cybernode/pull/13) merged into cybernode `release/phase1` as `1d126da`** (`--match-head-commit a21ffee`, 11:14 UTC; base `f26b79c` unchanged since the gate). Gate: rehearsal [41423930605](https://github.com/cyberia-to/soft3/actions/runs/41423930605) (cybernode `a21ffee`, simulation `16abd2d`, the stand's full override set). **`simulation-gate` is green on the stack leg** (job finished 11:13:06Z). The reds are exactly the baseline's: phase1-pins, release-notes-source, stack-zheng, stack-mudra, stack-neuron. The three stack reds have the same failure lines as in 41414017957, differing only in thread ids. cybernode-tests is 336 / 0 with all 15 `revert` tests ok on Linux x86_64, Linux aarch64, macOS aarch64 and the stack leg. macOS x86_64 was still running at merge; it read 336 / 0 on the pre-sync head in 41414017957. Second-pass review: the same 16 files, +1205 −44, as session 544, with `REVERTS` empty. No sibling of the stand besides simulation names `OpenOptions` (`git grep`). Receipt: [cybernode#13 comment 6575743243](https://github.com/cyberia-to/cybernode/pull/13#issuecomment-6575743243). simulation#2 (`16abd2d`, into simulation `main`) is now required by cybernode `release/phase1` and goes to the owner with R0's landings. P9 stays open for P9c–P9e; the measured per-block undo/replay cost is still unread, since the gate runs without `--nocapture`, and is carried into P9e. **Next:** P9c. Earlier, **doing 2026-11-02 (session 550): 41414017957 read in full; #13 adds one red, `simulation-gate`, and is not merged.** Legs 4 and 5 (macOS x86_64 job 125173559064, stack job 125173559176): cybernode-tests 336 / 0 and all 15 `revert` tests ok on both. The stack leg also turns **`simulation-gate` red**, exit 101: `E0063 missing field reverts in initializer of OpenOptions` at simulation `chain/src/scenarios.rs:121` and `chain/src/launch.rs:88`. The sibling simulator builds `OpenOptions` with literals that name every field, so session 544's review claim ("the sibling simulation crate is not affected") was wrong. **Fixed on the consumer:** `OpenOptions` derives `Default`, and cybernode's own callers use `..Default::default()`. [simulation#2](https://github.com/cyberia-to/simulation/pull/2), the stand's simulation input, gains `16abd2d`, pushed to the fork branch as a fast-forward. Both literals now use `..Default::default()` without the two default-valued fields, so they build against cybernode before #13 and after it, and `needless_update` does not fire. The stand's simulation moves `c312ab9` → `16abd2d`. **#13 brought up to date:** session 549 merged cybernode#14 (`f26b79c`, which touches `cli.rs`, `chain/mod.rs` and `chain_node.rs`), so `pull/13/head` no longer showed what would merge. `release/phase1` was merged into #13 (no rewrite): head `a21ffee`, tree `aa0e978`, the clean `merge-tree`. Rehearsal 41423712587 (`pull/13/head`) is void, cancelled at its snapshot. **Gate: rehearsal [41423930605](https://github.com/cyberia-to/soft3/actions/runs/41423930605)** (`candidate-20261102.98`, `cut=false`, snapshot green), 41414017957's override set with `cybernode=a21ffee` and `simulation=16abd2d`. Receipts: [cybernode#13 comment 6574072013](https://github.com/cyberia-to/cybernode/pull/13#issuecomment-6574072013), [correction 6574117208](https://github.com/cyberia-to/cybernode/pull/13#issuecomment-6574117208). **Rule from this:** a sibling API change is reviewed against every consumer in the stand (`git grep` over each sibling of `release/phase1.toml`), and a PR whose base moved is brought up to date before its gate. **Next:** read 41423930605. If no red is added to the baseline (phase1-pins, release-notes-source, stack-zheng, stack-mudra, stack-neuron) and `simulation-gate` is green, merge #13, then P9c. simulation#2 goes to the owner with R0's landings. Earlier, **doing 2026-11-02 (session 548): 41414017957 legs 2 and 3 of 5 read onto #13 ([comment 6573302732](https://github.com/cyberia-to/cybernode/pull/13#issuecomment-6573302732)).** Linux aarch64 (08:54:38Z) and macOS aarch64 (08:55:45Z) both report cybernode-tests 336 / 0. On each, all 15 `revert` tests pass, among them `two_nodes_revert_by_rule_and_end_on_one_tip_above_h` and `p9b_timing_undo_and_replay_per_block`. soft3-tests is 2 / 0, and the only reds are phase1-pins and release-notes-source. Overrides are `cybernode=pull/13/head` (`7eae92d`), `soft3=2ada471` and `lens=d6dcc3f`. macOS x86_64 and the stack leg are still `in_progress`. **Decision (the director, after the owner's answers above):** #13 stays P9's core and merges on its gate. Its `RevertTable` is already a runtime table, the compiled `REVERTS` plus the `--revert` entries. The owner-key statement becomes a third source of entries (P9c). The rewind, the veto, the ASERT re-anchor, `Event::Reverted` and `/status` are the same under either trigger. Recommendation (b) of #12 is superseded *as a trigger* ([#12 comment 6573303086](https://github.com/cyberia-to/cybernode/pull/12#issuecomment-6573303086)); #12 is revised in P9c. The remainder is split into P9c, P9d and P9e below. No fable question. **Next:** read the last two legs onto #13, then merge it if they add no red. Earlier, **doing 2026-11-02 (session 546): rehearsal [41414017957](https://github.com/cyberia-to/soft3/actions/runs/41414017957) read on leg 1 of 5 (Linux x86_64): #13 holds.** `sources.json` takes cybernode `7eae92d` (#13's head), soft3 `2ada471` and lens `d6dcc3f`. cybernode-tests is 336 / 0, against the baseline's 323 / 0 on the same leg, which included #10's test. Every new `chain::revert::*` and `chain::tests::revert::*` test passes, among them `two_nodes_revert_by_rule_and_end_on_one_tip_above_h`. The reds are only phase1-pins and release-notes-source, as in the baseline. `p9b_timing_undo_and_replay_per_block` passes, but its numbers are not in the log because the gate runs without `--nocapture`, so P9's measured cost is still open. Receipt: [cybernode#13 comment 6572963724](https://github.com/cyberia-to/cybernode/pull/13#issuecomment-6572963724). macOS aarch64, macOS x86_64, Linux aarch64 and the stack leg were `in_progress` at 08:5x UTC. **Next:** read those four legs onto #13, merge it if they add no red, then P9c. Earlier, **doing 2026-11-02 (session 545): P9b's gate re-dispatched as rehearsal [41414017957](https://github.com/cyberia-to/soft3/actions/runs/41414017957)** (`candidate-20261102.96`, `cut=false`). It uses baseline 41400293113's override set with `cybernode=pull/13/head` and `soft3=2ada471`. Session 544's rehearsal [41411831611](https://github.com/cyberia-to/soft3/actions/runs/41411831611) is **void**: its only override was `cybernode=pull/13/head`, so soft3 `main` `3045d54` and lens `master` `11113c6` were built, and every leg died in package-resolution (`cyber-lens-gpu`: no `lens/gpu/Cargo.toml`) before any test ran. Receipt: [cybernode#13 comment 6572670444](https://github.com/cyberia-to/cybernode/pull/13#issuecomment-6572670444). **Rule from this:** a P-row rehearsal carries the stand's full override set, never a lone override. **Next:** read 41414017957 onto #13. Merge it if no red is added to the baseline's (phase1-pins, release-notes-source, stack-zheng, stack-mudra, stack-neuron) and the new tests pass on every leg. Then P9c. Earlier, doing 2026-11-02 (session 544): P9b opened as [cybernode#13](https://github.com/cyberia-to/cybernode/pull/13)** (into cybernode `release/phase1`, head `7eae92d`, `wide`, +1205 −44 across 16 files, empty `REVERTS`). It has the §5.6 rules in `check_header` and `accept_header`, the ASERT re-anchor (`daa::next_bits_reverted`), `upgrade-required`, the open-time rollback by replay, `Event::Reverted`, `--revert` refused on pussy and bostrom, and the `/status` fields. Tests: two nodes reverting by rule, an old release reporting upgrade-required, an inconsistent table, the ASERT re-anchor, and `p9b-timing`. It was written by a sonnet subagent and reviewed by the director: with an empty table each path takes the old code, the node opens with the same options, and the sibling simulation crate is not affected. It is uncompiled until rehearsal [41411831611](https://github.com/cyberia-to/soft3/actions/runs/41411831611) (`override=cybernode=pull/13/head`, dispatched 08:16 UTC) returns. **Next:** read 41411831611 onto #13, then merge it if green, then P9c (the alpha drill). Earlier, doing 2026-11-02 (session 542): the spec half is [cybernode#12](https://github.com/cyberia-to/cybernode/pull/12)** (draft into cybernode `release/phase1`, head `e574ed4`, `decision` `wide`, spec only, no checks run on it). It adds a new `specs/chain.md` §5.6 *revert by release*, with hooks in §1.5, §5.2, §7.1, §7.3, §8 and §10 row 13, and edits chain-wire §3.1, §5 and §7. **Recommended: (b).** A table `REVERTS` is compiled into the release like `ACTIVATIONS`, with entries `(H, keep, vetoed, anchor_time, rule_set)`. `keep` acts as a checkpoint without a key, and the old H+1 and its descendants are invalid. ASERT is re-anchored at `anchor_time`: §1.5 is anchored on genesis and measures absolute drift, so without the re-anchor one GPU re-mines the gap at `POW_LIMIT`. A new rule set starts at H+1, so an older release reports `upgrade-required`. At open the node rolls back by undo journal or replay. `MAX_REORG` does not change. (a) and (c) are rejected because the single majority GPU writes both the signal bits and an era. The code facts, at cybernode `f1065eb`: per-block undo journals are never pruned (`store.rs` `put_undo`); `replay()` from genesis on every open rebuilds the economy snapshots (`engine.rs:138`, `economy/run.rs:94`); `reject_main_from` already retracts and vetoes, bounded by `MAX_REORG` (`engine.rs:469`). fable #1 of 2026-11-02 agreed with (b) and supplied the re-anchor, the veto instead of a bypass, the rule set per entry and the rehearsal guard. **Not yet met:** the measured cost (no replay or undo timing receipt exists, so the page states costs from code paths and makes timing part of the implementation's acceptance), the implementation with its two-node test, and the alpha rehearsal. **Next unit (P9b):** implement the machinery with an empty table on a branch off cybernode `release/phase1`. The pieces are `REVERTS` in `params.rs`, the open-time rollback, the ASERT re-anchor, `upgrade-required`, `Event::Reverted`, `--revert` with the rehearsal guard, and the `/status` fields. The test reverts a mined chain on two nodes by rule, and the build service times undo and replay per block. That unit does not wait for the owner's verdict on #12, because the table ships empty | | P9c | the revert statement (owner's shape, P9): a `RevertStatement { chain, height H, keep = block id at H, counter, anchor_time }`, domain-separated from `Checkpoint` (its own tag, so a checkpoint signature never verifies as a revert). It is signed by the genesis key in the `checkpoint_key` slot (§4.4) and **not bound by `checkpoint_sunset`** (the owner: no sunset now; retiring it is a named hole). It is gossiped on the `checkpoints` topic and `/checkpoints`, and persisted in the store. On acceptance it becomes a `RevertEntry` of `RevertTable`, and the rewind of #13 runs at any depth, overriding `MAX_REORG`. Counter rule: only a strictly higher counter applies. The mempool is cleared of transactions that no longer apply. A `soft3 chain revert-sign` verb signs from a seed and never stores it. Revise #12's §5.6 to this trigger on #12 itself (D6: the spec text passes the owner's hand; the code PR carries no `specs/`). | cybernode · wide (a consensus rule) | tests on the build service: a statement signed by the genesis key's secret is accepted (the test makes its own key), one signed by any other key is refused, a checkpoint signature is refused as a revert, a lower or equal counter is ignored, two nodes rewind by gossip and end on one tip above H, a revert past `MAX_REORG` applies, and every pre-P9c test passes | **done 2026-11-02 (session 557): [cybernode#15](https://github.com/cyberia-to/cybernode/pull/15) merged into cybernode `release/phase1` as `599cd85`.** Gate: rehearsal [41448682465](https://github.com/cyberia-to/soft3/actions/runs/41448682465), all five legs read against the baseline 41423930605. Reds = baseline only on every leg; the stack leg's zheng, mudra and neuron failures are the same, and only zheng's duration differs. `cybernode-tests` 350 / 0 (336 before) with 29 revert tests ok on every leg; `simulation-gate`, `stack-pussy-identity` and `stack-chain-genesis` green. Before the merge, #15 was split by D6: its §5.6/`chain-wire.md` text moved verbatim to #12 (`9b0705a`), and #15 kept the code (`cb2e34d`, which differs from the gated `3f878fe` only in `specs/*.md`, read by no build or gate). Review: a zero `checkpoint_key` refuses every statement (`StatementError::Disabled`, tested), so nothing is live until P9d. Receipt: [comment 6579577065](https://github.com/cyberia-to/cybernode/pull/15#issuecomment-6579577065) | -| P9d | the owner's key in pussy's and pussy-rc's genesis: `0354814b25ec4214b782b48b0d4cd562331f43ce77513f5ca0dd4414096959f473` in place of the zero `checkpoint_key` (`cli.rs` genesis build, `chain/genesis.rs`). Re-bless both particles and P4's pins (`params.rs` chain id and block-0 id), and update G5/G6's receipts | cybernode · soft3 · wide | `stack-pussy-identity` and `stack-chain-genesis` green with the new particles, and the key read back from the built genesis files | open (after P9c) | +| P9d | the owner's key in pussy's and pussy-rc's genesis: `0354814b25ec4214b782b48b0d4cd562331f43ce77513f5ca0dd4414096959f473` in place of the zero `checkpoint_key` (`cli.rs` genesis build, `chain/genesis.rs`). Re-bless both particles and P4's pins (`params.rs` chain id and block-0 id), and update G5/G6's receipts | cybernode · soft3 · wide | `stack-pussy-identity` and `stack-chain-genesis` green with the new particles, and the key read back from the built genesis files | **doing 2026-11-02 (session 558): [cybernode#16](https://github.com/cyberia-to/cybernode/pull/16) is open as a draft into cybernode `release/phase1` (`dcded79`, lane `wide`; sonnet subagent, reviewed by the director).** `genesis::Chain.checkpoint_key` is `OWNER_KEY` for pussy and pussy-rc and zero for bostrom; dev and conformance nets stay zero. `derive.rs` writes it. The build report (`receipt/genesis/.tade.json`) and `genesis verify` decode the key back out of the written bytes, which is the acceptance's read-back. Two new tests check the hex, the neuron id `3c51813c…`, the per-chain key, the round trip and that the chain id commits to the key. The snapshot-gated pussy and pussy-rc build tests assert the key. Review note: a non-zero `checkpoint_key` also enables §4.4 checkpoints until `checkpoint_sunset`, as the owner's choice of slot implies; this is stated under Risk in the PR. **Measuring** rehearsal [41464171130](https://github.com/cyberia-to/soft3/actions/runs/41464171130) uses P9c's override set from 41448682465 (`soft3=2ada471` included) and changes only `cybernode=pull/16/head`. `stack-chain-genesis`, `stack-pussy-identity` and `conformance-snapshot` are expected red, because that red is the measurement. **Next:** read the new particles, `block0_id`s and `chain.snap` drift. Bless them in #16 (`params.rs` pins, `chain/genesis.rs` cached-file test) and in a soft3 PR (`conformance/chain-genesis.toml` `[pussy]`/`[pussy-rc]`, `chain.snap`). Re-gate the pair, then merge. | | P9e | the revert drill on the alpha network (`pussy-rc`, 194.107.163.6 + agent-a): redeploy from P9d's pussy-rc genesis, mine past some H, the owner signs a revert to H (the secret never leaves the owner's machine), and both nodes rewind and continue | cybernode · ops (the owner signs) | `/status` of both nodes shows `reverted height=H` and the same tip above H after it, with the log excerpt of `Event::Reverted` on each | open (after P9d; the signature is the owner's step) | | P10 | the node's read API for the public explorer (spacepussy.ai/explorer, space-pussy#16/#17, live on edge-b since 2026-11-02): the explorer derives today what the node should answer. Add read-only routes, no consensus change: (1) `GET /axons?top=N&by=flow|weight|stake` — p, q, weight, stake by valence, authors, focus flow φ*(p)·w/Σ_out w at the last settled epoch; (2) `GET /neurons?top=N&by=…` — links authored, genesis weight, stake active/passive, earned, focus authored; (3) transaction history per neuron and per particle (`/txs/neuron/`, `/txs/particle/`, paged); (4) `chainwork` on every `/header/` and `/blocks` row, not only on `/tip`; (5) fix `/stats` and `/status` reporting `particles: 0` while the epoch records say 16,273; (6) `GET /` answers 404 although its handler exists; (7) φ* per past epoch (`/focus?epoch=E`), since the node keeps only the last settled one and the explorer's index records it meanwhile | cybernode · contained (read routes) | each route with a test on a mined chain; the explorer's derived axon and neuron tables equal the node's answers on the alpha network | open | | R1 | the candidate: a dispatched `cut=false` run green on all five legs from origin defaults, then the 12:00 cut of the same inputs | soft3 | `release-validation.json` green on every leg; the draft `candidate-YYYYMMDD.N` exists; the owner's promotion the only step left | open | @@ -729,3 +729,4 @@ every ask below carries its link inline, where the decision is named: the pull r | 2026-11-02 10:26–11:20 | director session 552 | **P9b landed: [cybernode#13](https://github.com/cyberia-to/cybernode/pull/13) merged into cybernode `release/phase1` as `1d126da`.** Rehearsal [41423930605](https://github.com/cyberia-to/soft3/actions/runs/41423930605) was waited out in-session. `simulation-gate` is green, and the reds are exactly the baseline's five, with identical failure lines. cybernode-tests is 336 / 0 with 15 `revert` ok on four legs; macOS x86_64 was still running at merge. Receipt: [comment 6575743243](https://github.com/cyberia-to/cybernode/pull/13#issuecomment-6575743243). No subagent, no dispatch, no fable question (today: 1). **Next:** P9c (the owner-key revert statement). | | 2026-11-02 12:53–13:05 | director session 554 | **P9c gated: [cybernode#15](https://github.com/cyberia-to/cybernode/pull/15) opened, and rehearsal [41448682465](https://github.com/cyberia-to/soft3/actions/runs/41448682465) dispatched.** Sessions 553–556 (11:20–12:38) each left a sonnet subagent running in the background and ended before it reported, so nothing was pushed and the plan did not move. Their commits (`05af348`…`3f878fe`, on top of #12's `e574ed4`) were found clean in the `p9c-revert-statement` worktree. The director reviewed them against P9c's acceptance: domain separation, the counter rule, any depth, gossip on two nodes, dropping the retracted transactions. They were then pushed. Lesson: a session does not end while it waits on a subagent. It either waits in the foreground or does not delegate. Merges: this plan only. Dispatches: 1. Subagents: none this session. No fable question (today: 1). **Next:** read 41448682465 onto cybernode#15, then merge it | | 2026-11-02 13:12–14:30 | director session 557 | **P9c landed: [cybernode#15](https://github.com/cyberia-to/cybernode/pull/15) merged into cybernode `release/phase1` as `599cd85`.** Rehearsal [41448682465](https://github.com/cyberia-to/soft3/actions/runs/41448682465) was waited out in the foreground. All five legs show baseline reds only, `cybernode-tests` is 350 / 0, and `simulation-gate` is green. D6 caught that #15 carried `specs/` text, which the director may not merge. The text moved verbatim to #12 (`9b0705a`, now the owner's statement trigger), and #15 kept the code. One slip, undone before any push: a misdirected script committed the split onto the local `main` of the base clone, which was reset to `origin/main`. Merges: cybernode#15, this plan. Dispatches: none. Subagents: none. No fable question (today: 1). **Next:** P9d (the owner's key in pussy's and pussy-rc's genesis, re-bless) | +| 2026-11-02 14:36–14:50 | director session 558 | **P9d doing: [cybernode#16](https://github.com/cyberia-to/cybernode/pull/16) opened (draft, `wide`), and measuring rehearsal [41464171130](https://github.com/cyberia-to/soft3/actions/runs/41464171130) dispatched.** Tick `20261102T143629Z`. The red file handed over was `red-41423930605.json`, not the last run's (41448682465); #535 addresses this. Both runs show only the baseline reds outside P9: phase1-pins (G9) and release-notes-source (G8), so no new unit. The owner's key is written into pussy's and pussy-rc's genesis `checkpoint_key` by `derive`, and decoded back into the build receipt. The particles move, and the rehearsal measures them before the bless. Merges: this plan only. Dispatches: 1. Subagents: 1 (sonnet, foreground, reviewed). No fable question (today: 1). **Next:** read 41464171130, then bless P9d's particles in cybernode#16 and soft3, and re-gate |