diff --git a/docs/architecture/ghostlight-dungeon-mvp.md b/docs/architecture/ghostlight-dungeon-mvp.md index 87e23ec..5b5d2c2 100644 --- a/docs/architecture/ghostlight-dungeon-mvp.md +++ b/docs/architecture/ghostlight-dungeon-mvp.md @@ -581,19 +581,17 @@ boundaries. ## Verification contract -Focused tests prove the machine under fixture inference ports. The one place -the road is exercised against a real controller is the local live smoke -(`notes/local-live-smoke.md`): the production tick driver, cover, Persona -membrane, operational lane, clock, and elaboration sweep against a -CodexConnector on a genesis world. Its first run (2026-09-05) proved the path -end to end and showed that a three-subject, one-room genesis yields thin -prose; a seed producer is the gap that finding names. Step 8 landed that seed -producer: `world.create` v2 carries the scale intent at genesis, `world.seed` -runs one `SeedRunner` session per invocation against a `VaultEvidenceSource`, -and the extended live smoke seeds a world before it ticks. Creation's current -payload is `world_create.v4`: title, brief, targets, jurisdiction roots and -lens weights are required, and Dungeon's create surface offers uniform weights -as its editable default. +Focused tests prove the machine under fixture inference ports. No live smoke +exists: the play agent's Cut 1 (`d69e9d4`) deleted the tick driver, cover and +Active elaboration sweep it exercised, along with the ignored test itself, to +clear the ground for the play agent's own owner. `notes/local-live-smoke.md` +now documents only connector and Claude SDK sidecar bring-up, which the seed +lane still uses. Exercising the road against a real controller again is the +play agent's own gate (`ghostlight-play-agent.md`), not this contract. +`world.create`'s current payload is `world_create.v4`: title, brief, targets, +jurisdiction roots and lens weights are required, and Dungeon's create surface +offers uniform weights as its editable default. `world.seed` runs one +`SeedRunner` session per invocation against a `VaultEvidenceSource`. Focused tests must prove: diff --git a/docs/architecture/ghostlight-stock-lenses.md b/docs/architecture/ghostlight-stock-lenses.md index e66d6be..5003292 100644 --- a/docs/architecture/ghostlight-stock-lenses.md +++ b/docs/architecture/ghostlight-stock-lenses.md @@ -60,7 +60,9 @@ detail rules", which separates what L1 implemented from what L2 to L4 owe. (L1-Q4). Elaboration draws from its own pool, a ceiling (`GHOSTLIGHT_ELABORATION_MAX_CONCURRENT`, default 2), separate from the simulation budget, and saturating either pool never delays the other. - Holds. + Dungeon runs no Active elaboration since the play agent's Cut 1 + (`d69e9d4`) deleted its sweep and pool; the claim stands as a library + capability. Holds. 6. **The lens is recorded and resume reads state.** The drawn lens and its instruction text are persisted on the session (`controller_work.v16`, L1-Q7). A resumed session keeps both even if the weights or the lens's diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index ecf053e..14f5fa5 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -221,9 +221,11 @@ transports: the CodexConnector and, per `claude`-prefixed lane model, the Node sidecar on the Claude Agent SDK. The Rust decoder is the one validator on both; the sidecar hands arguments through unvalidated. The sidecar and its receipt shape are a named stopgap, deleted whole when a Messages-API port -has budget. The SDK transport is proven on the road: seeded runs on -`claude-sonnet-5` committed ticks end to end (`notes/local-live-smoke.md`, -"SDK runs, 2026-09-10"). A kernel refusal continues the authoring +has budget. The SDK transport was proven on the road before the play agent's +Cut 1 (`d69e9d4`) deleted the tick driver those runs exercised: seeded runs on +`claude-sonnet-5` committed ticks end to end (evidence ledger; the runbook +that recorded them, `notes/local-live-smoke.md`, no longer carries that +narrative). A kernel refusal continues the authoring conversation (`Refusal` rows, `controller_work.v16`); the Interpreter cites prose by quote (`source_quote`), and a quote not in the prose is a gap. Plan step 12 is landed: `PersonaMaterial` is the thirteenth component, a promise @@ -306,8 +308,10 @@ follow-ups are listed in stock lens set, is implemented (`835ea4d..872ba35`; cut map `docs/architecture/ghostlight-stock-lenses-cut.md`): lens weights are world data the owner replaces with `SetLensWeights`, each elaborator session records -the lens it drew and that lens's instruction text, and elaboration sessions run -concurrently under the caller's ceiling. +the lens it drew and that lens's instruction text, and the library runs a +caller's elaboration sessions concurrently under that caller's own ceiling. +Dungeon runs no Active elaboration since the play agent's Cut 1 (`d69e9d4`) +deleted its sweep and ceiling; nothing in Dungeon calls this path today. Also owed on the way, found 2026-09-15 by reading source: @@ -317,7 +321,9 @@ Also owed on the way, found 2026-09-15 by reading source: - Active elaboration runs with `NullEvidenceSource` (`controllers.rs`), so no Vault reaches it. This is L2's subject and is deferred with L2; the play path stops elaborating while Active. -- Ticks run cells in sequence at 15–50 s each; a reply takes minutes. +- Dungeon runs no tick driver since the play agent's Cut 1 (`d69e9d4`) + deleted it; when cells ran, they ran in sequence at 15–50 s each. Cut 8 + owns Persona dispatch going forward. The eight titles ship as the library's stock lens set. Their 2026-09 removal had no operator decision; the correction record in `state/evidence.jsonl` @@ -388,7 +394,8 @@ acceptance roots, and local run scaffolding. - Consumer contract: `docs/architecture/ghostlight-world-consumer-api.md` - Frozen teardown map: `notes/ghostlight-current-system-map.md` - Current implementation plan: `notes/ghostlight-implementation-plan.md` -- Local live smoke runbook: `notes/local-live-smoke.md` +- Connector and Claude SDK sidecar bring-up (no live smoke exists): + `notes/local-live-smoke.md` - Human-readable state: `state/map.yaml` - Distilled evidence: `state/evidence.jsonl` (full history in `state/evidence.archive.jsonl`) diff --git a/notes/ghostlight-implementation-plan.md b/notes/ghostlight-implementation-plan.md index fb6c3a7..44aa6fe 100644 --- a/notes/ghostlight-implementation-plan.md +++ b/notes/ghostlight-implementation-plan.md @@ -408,10 +408,12 @@ defined by the digest, so a neighbour's act, a clock tick that rolls a routine's `due`, an elaborator patch, a consumer document, and a world-scale event are one case, indistinguishable at the handler. Schema bumps: `controller_work.v11` and `ghostlight.persona_turn_receipt.v3`; prior rows -are refused, not migrated. Eve reports the interruption through -`ControllerHttpResult::Interrupted`, which renders as `denied` in the -command result today; the receipt text carries the subject, both scope -digests, the persona prose and receipt digest, and the untranslatable gap. +are refused, not migrated. The kernel's interruption still carries the +subject, both scope digests, the persona prose and receipt digest, and the +untranslatable gap; the play agent's Cut 1 (`d69e9d4`) deleted the owner's +dispatch surface and `ControllerHttpResult::Interrupted` with it, so nothing +in Dungeon reports an interruption today. Reporting a re-lowered turn to the +play agent's own turn record is Cut 8's. Cut line held: no new kernel arm, bundle, or joint command; no second Persona turn; no event log reaches a controller; the delta shown to the Interpreter @@ -424,10 +426,12 @@ What is undone: no road run has exercised the re-lowering against a live provider; none exists yet. Closed since landing: fork D's branch was dead by construction (grants are insert-only, so a fresh opportunity always carries speech) and is deleted; transfer, route-closing, and grant-revocation causes -are proven anonymous by Soul; a `run_cover_tick` end-to-end carries an -interruption through a real tick and shows the overtaken turn committing -nothing; a witness landing mid-turn yields the anonymous knowledge line and -no overheard row. Still open: the elaborator-patch cause is proven only by +are proven anonymous by Soul; an end-to-end test carried an interruption +through a real tick via `run_cover_tick` and showed the overtaken turn +committing nothing, before the play agent's Cut 1 (`d69e9d4`) deleted +`run_cover_tick` and the tick driver it drove; a witness landing mid-turn +yields the anonymous knowledge line and no overheard row. Still open: the +elaborator-patch cause is proven only by the shared code path, not by a fixture that drives the elaborator past its answer gate; and whether Eve's command-result vocabulary needs a fourth state for an overtaken turn is the Eve owner's question. diff --git a/notes/local-live-smoke.md b/notes/local-live-smoke.md index 58ccc79..98920ed 100644 --- a/notes/local-live-smoke.md +++ b/notes/local-live-smoke.md @@ -1,12 +1,17 @@ -# Local Live Smoke +# Connector And Claude SDK Sidecar Bring-Up -The one place the road is tested: the seed lane, the production tick driver, -elaboration sweep, and clock against a real CodexConnector on a created -world, for a configured number of seed sessions and ticks. Everything else -proves the machine under fixture inference ports. The harness is the ignored -test -`runtime::tests::live_smoke_seeds_then_ticks_a_world_against_the_connector`; -its log is the deliverable. +No live smoke exists in this tree. The ignored test this file once documented, +`runtime::tests::live_smoke_seeds_then_ticks_a_world_against_the_connector`, +ran the production tick driver and the Active elaboration sweep against a real +CodexConnector; the play agent's Cut 1 (`d69e9d4`) deleted both, and the test +with them. A command that names it now matches nothing and exits 0. No +replacement exists until the play agent's own gate (`ghostlight-play-agent.md`) +lands one. + +What remains true and stays here: bringing up a real CodexConnector and a +built Claude SDK sidecar. The seed lane (`world.seed`) still runs real +inference through `ControllerRunner`, and both transports below are how a +session gets real model responses instead of a fixture inference port. ## Substrate @@ -17,13 +22,12 @@ Machine-local, outside the repo: `F:\Projects\Ghostlight-smoke\`. - `connector\ghostlight.key`: 64 hex characters, no trailing newline; the shared connection secret. Both sides read the same file. - `connector\connector.cc`: the daemon's single-caller config. -- `logs\`: connector stdout/stderr and pid, smoke logs. +- `logs\`: connector stdout/stderr and pid. The connector binary is `F:\Projects\CodexConnector\target\debug\codex-connector.exe` built from the repo head with the `daemon` feature. Ghostlight's `Cargo.lock` pins the connector library at an older revision whose daemon does not build -against its own lockfile; the head daemon speaks the same wire law, proven by -the handshake in the run below. +against its own lockfile; the head daemon speaks the same wire law. ## Bring-up @@ -42,117 +46,18 @@ $R='F:\Projects\Ghostlight-smoke'; $p = Start-Process -FilePath 'F:\Projects\Cod Stop it with `Stop-Process -Id (Get-Content F:\Projects\Ghostlight-smoke\logs\connector.pid)`. -## Run - -```bash -export GHOSTLIGHT_CONTROLLER_CONNECTOR=127.0.0.1:4103 \ - GHOSTLIGHT_CONTROLLER_CREDENTIAL='F:\Projects\Ghostlight-smoke\connector\ghostlight.key' \ - GHOSTLIGHT_ACCEPTANCE_RUNTIME_ID=ghostlight-smoke \ - GHOSTLIGHT_CONTROLLER_PROJECTOR_MODEL=gpt-5.6-luna \ - GHOSTLIGHT_CONTROLLER_PERSONA_MODEL=gpt-5.6-terra \ - GHOSTLIGHT_CONTROLLER_INTERPRETER_MODEL=gpt-5.6-terra \ - GHOSTLIGHT_CONTROLLER_OPERATIONAL_MODEL=gpt-5.6-terra \ - GHOSTLIGHT_CONTROLLER_ELABORATOR_MODEL=gpt-5.6-terra \ - GHOSTLIGHT_SMOKE_TICKS=3 \ - GHOSTLIGHT_SMOKE_LOG='F:\Projects\Ghostlight-smoke\logs\smoke-ticks.log' \ - GHOSTLIGHT_SEED_VAULT_ROOT='F:\Projects\Kalsa\Kalsa' \ - GHOSTLIGHT_SMOKE_VAULT_SCOPE='Public' \ - GHOSTLIGHT_SMOKE_SEED_SESSIONS=4 \ - GHOSTLIGHT_SMOKE_SEED_TARGET=6 \ - GHOSTLIGHT_SMOKE_SEED_ROOT_LABEL='Low Sere' \ - GHOSTLIGHT_SMOKE_SEED_BRIEF='A dry basin town that owes its water to the gate above it.' -cargo test -p ghostlight-dungeon --bin ghostlight-dungeon live_smoke_seeds_then_ticks -- --ignored --nocapture -``` - -`GHOSTLIGHT_SEED_VAULT_ROOT` is required; the runner refuses to seed with it -unset. `GHOSTLIGHT_SMOKE_VAULT_SCOPE` and `GHOSTLIGHT_SMOKE_SEED_BRIEF` are -optional; the brief is the world's brief, set at creation and projected to -every lane as guidance, and the world is titled by the seed root label unless -`GHOSTLIGHT_SMOKE_WORLD_TITLE` names it. The scope is a directory under the root; Kalsa's spoiler split is -that scope, so a world that must not see `Spoilers` is seeded from `Public`. -The root label must name a place the Vault knows; Low Sere has a Public note. The caller runtime id must equal the one the -connector config admits. - -## First run, 2026-09-05, before the seed lane - -Genesis: Active, three subjects (Operator, Persona, Operational Agent) in -`commons`, three opportunities, no boundaries, no deficit rows (no scale -intent at genesis). - -| Tick | Wall time | Cells | Revision | Persona speech | -|---|---|---|---|---| -| 1 | 71 s | 2 singletons | 2 → 5 | "I am here." | -| 2 | 41 s | 2 singletons | 5 → 8 | "I am here. Time 60." | -| 3 | 44 s | 2 singletons | 8 → 11 | "Is anyone there?" | - -Each tick committed one narrative command, one operational command, and one -clock advance; the elaboration sweep returned clean every tick because the -world derives nothing to answer. The store's final digest is in the log. - -What this proves: the connector handshake, the Persona membrane end to end -(projector, persona, interpreter), the operational lane, the cover, the tick -driver, the clock, and the elaboration sweep all work on the road. What it -does not prove: anything about a world with structure. The prose is thin -because the world is three subjects in one room with one affordance; that is -the seed-producer gap, not a cognition fault. - -The older ignored test `real_codex_connector_cognition_modes_commit_speech` -in `world/controllers.rs` predates pass 6 and declares its subjects unplaced, -so it fails at `NoAudience` before reaching the provider; retire or place it. - -## Seeded run, 2026-09-05 - -Kalsa `Public` scope, root Low Sere, target six persons, brief "A dry basin -town that owes its water to the gate above it." - -| Stage | Wall time | Result | -|---|---|---| -| Seed session 1 | 39 s | one round, committed: six persons in Low Sere, all qualified, deficit 6 → 0; session 2 skipped, no shortfall left | -| Activate | | nine subjects, nine opportunities, six boundaries for the elaborator | -| Tick 1 | 95 s | 8 singleton cells, revision 3 → 7, Bren Ash: "I'm here." | -| Tick 2 | 95 s | 8 singleton cells, revision 7 → 11, Mara Dene: "Bren?" | -| Tick 3 | 123 s | 8 singleton cells, revision 11 → 15, Tovin Rusk: "Bren?", the Persona asking for a beginning | - -Twelve runs were needed to get here. Every failure was on the road, not in -the kernel, and each became a rule the tree now carries: - -- The copied Codex credential diverged from the live session and its refresh - token was invalidated; the connector's Codex home is now the operator's - real `~/.codex`, one credential family. -- Strict function schemas refuse `oneOf` and a `const` without a `type`; the - emitter uses `anyOf` and types every tag, and a test walks every tool of - both authoring lanes against the strict rules offline. -- `gpt-5.6-sol` is not available to a ChatGPT account; the Persona runs on - `gpt-5.6-terra` here. -- A seed generation exceeded the five-minute socket read; the connector's - expiry skew stays at five minutes while the response read timeout is - fifteen. -- The model referenced existing things by label; the brief prints every - canonical id beside its label. -- One tool call per response spent the six-round budget; the seed lane has - its own budget of 24, requests parallel tool calls, and submits the draft - as authored when the budget ends instead of discarding it. -- A repair round re-used the first attempt's provider request id and the - connector refused it as a replay conflict; request ids are content-addressed. -- Obligations carried a period; the tool description states the commitment - shape rule the resolver enforces. -- The first landed seed put all six people in the commons; the brief states - that a subject must stand at the row's root or inside it to count. - -The harness fails when no seed patch lands, so a run that reaches the -provider and authors nothing is a failed run. Silence is not failure: a -person given a place, a debt, and a clock and nothing else says nothing, and -since run 6 the prompts render that honestly instead of borrowing a voice. +A session that wants the connector reads +`GHOSTLIGHT_CONTROLLER_CONNECTOR=127.0.0.1:4103` and +`GHOSTLIGHT_CONTROLLER_CREDENTIAL='F:\Projects\Ghostlight-smoke\connector\ghostlight.key'`, +the same variables the deleted harness read. ## Claude SDK route -Run; see "SDK runs, 2026-09-10" below. `world/sdk_inference.rs`'s `SdkInferencePort` gives the same -ignored smoke a second transport: a lane whose configured model is -`claude`-prefixed (matching `GHOSTLIGHT_SDK_MODEL_PREFIX`, default `claude`) -routes to a Node sidecar instead of the CodexConnector, so the road can run -on the Claude subscription with no Codex budget. `LiveController` and -`ControllerRunner::open` (through `open_inference`) already carry this -optional binding; only the operator side and a real run are outstanding. +`world/sdk_inference.rs`'s `SdkInferencePort` gives any lane whose configured +model is `claude`-prefixed (matching `GHOSTLIGHT_SDK_MODEL_PREFIX`, default +`claude`) a second transport: a Node sidecar on the Claude Agent SDK instead of +the CodexConnector, so a session can run on the Claude subscription with no +Codex budget. **Operator prerequisites, none of which Ghostlight performs:** @@ -182,120 +87,9 @@ GHOSTLIGHT_SDK_MODEL_PREFIX=claude # optional; this is already the default ``` `GHOSTLIGHT_SDK_SIDECAR`'s absence means no SDK binding at all — a -`claude`-prefixed lane model then fails at open with `UnroutableModel` -rather than silently reaching the connector. Any of the five +`claude`-prefixed lane model then fails at open with `UnroutableModel` rather +than silently reaching the connector. Any of the five `GHOSTLIGHT_CONTROLLER_*_MODEL` variables can be set to a `claude`-prefixed model (for example `claude-opus-5`) to route that lane through the sidecar; -the connector variables (`GHOSTLIGHT_CONTROLLER_CONNECTOR`, -`GHOSTLIGHT_CONTROLLER_CREDENTIAL`) are only required for the lanes that -still route to the connector, and an all-`claude` configuration needs -neither. - -The harness is the same ignored test, -`runtime::tests::live_smoke_seeds_then_ticks_a_world_against_the_connector`; -its `#[ignore]` reason names both prerequisites this route adds: "requires a -vault plus either a running CodexConnector or a built Claude SDK sidecar -with an ambient Claude Code login; see `GHOSTLIGHT_SMOKE_*` and -`GHOSTLIGHT_SDK_*` environment." - -### SDK runs, 2026-09-10 - -Every lane on `claude-sonnet-5`, Kalsa `Public`, Low Sere, target six, two -seed sessions, three ticks. The operator installed the CLI and logged in -interactively; the sidecar inherited the login. No connector variables were -set. - -| Run | Seed | Ticks | Result | -|---|---|---|---| -| 1 | both sessions refused: subjects with no grant, twelve commitments due at or before the clock | 3 committed, 2 cells each, Persona spoke | harness failed on the empty seed; the transport itself worked end to end | -| 2 | one session, one round, 89 s: six qualified persons, deficit 6 to 0 | 456 s, 395 s, 326 s; 8 singleton cells each; revision 3 to 24 | passed; tick 3 quarantined one cell | -| 3 | one session, one round, 109 s: six persons and an institution, deficit 6 to 0 | two ticks, 230 s and 138 s; 9 singleton cells each; revision 3 to 15 | passed; no quarantine; speech cited by quote arrives whole | -| 4 | one round, 87 s | two ticks, 219 s and 235 s; 8 cells | passed; Projector now carries the subject's own life; five people say "Fourteen days", the due on their obligation | -| 5 | one round | two ticks, 316 s and 251 s; 9 cells; whole membrane traced (`GHOSTLIGHT_SMOKE_TRACE`) | passed; first exchange: Sera Venn "Maro first, then the rest.", Maro Seln "First for what, Sera?"; every voice was the model's | -| 6 | one round, 90 s | two ticks, 299 s and 235 s; 9 cells; flat prompts | passed; eighteen cells, nobody spoke; the honest baseline of an unauthored person | -| 7 | refused: six distinct people with memories, reads, and worded promises, every `declare_subject` carrying `"controller": {}` | 2 ticks on genesis alone | harness failed on the empty seed; the repair continuation faulted on the SDK lane (one user turn) | -| 8 | one round, 97 s: six people, each with a voice, values, memories, reads, and a promise in words | two ticks, 191 s and 261 s; 8 cells; 43 speak captures to 9 gaps | passed; seven distinct lines about the grate, the roll, and the crew | -| 9 | one round, 94 s; world titled Low Sere with its brief on every lane | two ticks, 218 s and 209 s; 8 cells; 20 speak captures to 24 gaps | passed; no fixture name anywhere in the trace; promises and speech in the world's own terms (the grate, the ration boards, the kiln on stored ash) | -| 10 | one round, 95 s | two ticks, 220 s and 166 s; 8 cells; revision 3 to 15; 29 speak, 18 display, 10 gaps | passed; the first displays ("I set the spindle down where both of them can see the face of it", "I look to Yeshe, not unkind."); every gap is private reasoning; the first live interrupted cell (below) | -| 11 | one round, 100 s | two ticks, 241 s and 221 s; 8 cells; revision 3 to 16; 27 speak, 24 display, 14 gaps | passed; three interrupted cells, each printed as its own line with the subject and both digests; the operator feed shows displays beside speech ("So, [seen: I shift the spindle from one hand to the other, then back]") | -| 12 | round 1 rejected after 200 s (the seed model wrote `kind` where the controller schema says `type`, omitted the `over` tag, and narrated it as tool bugs); round 2 committed in 99 s: six people and an institution | two ticks, 288 s and 150 s; 9 cells; revision 3 to 16; 39 speak, 6 display, 10 gaps | passed; every cited span landed, no overlap gaps; two interrupted cells in tick 1; a two-sentence act arrives as one display ("I stand near the wall where the shade still holds... I watch the dust settle where their boots have been.") | - -Rules run 1 imposed are in the implementation plan under step 11 (descriptions -carried through the sidecar, `due` described and the clock printed, the grant -rule on the subject tool, raw tool calls logged, refusal continues the -conversation). Run 2's two findings: three of eight speech captures were cut -mid-word ("just t", "a?\" I") because the Interpreter cited byte spans the -model counted wrong, and the tick-3 quarantine was a mis-spanned utterance -failing the canonical-text rule at invocation, which is a translation gap -wearing an infrastructure fault's coat. Run 3, after speech and gaps moved to -`source_quote`, shows every utterance whole and no quarantine. Ticks are slow -because singleton cells run in sequence at roughly 15 to 50 s per cell on this -lane. - -Runs 4 to 6 read the membrane itself. Set `GHOSTLIGHT_SMOKE_TRACE` to a file -and every request is appended with its purpose, model, instructions, input -turns, tool catalog, and output, so a cell can be read end to end: Projector -in and out, Persona in and out, Interpreter in and out. Run 5's trace showed -the machine working as designed (the Interpreter captured only quoted speech -and recorded honest gaps for posture, private priority, and provisional -belief) and two faults of context, not of prose: a `Commitment` carries no -statement of what is promised, so `due: 1000` was read as a thousand owed; -and the ontology's `PersonaMaterial` (values, voice, memories, reads) is -named in the doc and built nowhere, so every person spoke in the model's one -voice. Run 6, after the prompts were flattened to render only what the -context carries, is silent, which is correct. Run 6's trace also shows the -Projector saying "no one before me" for two people in the same house: the -context carries the subject's own place and not who else stands in it. - -Run 10 is plan step 14 on the road: a visible act is captured by `display` -and lands as a seen row on the room. Sera set the spindle down where Maro and -Behn could see it, and Maro's re-lowered turn read it as seen and her "Not -finished yet." as said. The ten gaps are what the cut leaves private on -purpose ("There's nothing to tell them until the spindle's finished telling -me."). Run 11 showed the one fault the runs 10 and 11 shared: "So," was -captured whole and the rest of the sentence dropped, and a turn with four -visible acts kept one, because the fold allowed one span per kind and made -the rest ambiguity gaps. The Interpreter was citing correctly; the fold was -discarding. The fold now takes every span cited for a kind, in prose order, -as one utterance and one display, and only an overlapping span is an -ambiguity (`controller_work.v15`; run 12 below). - -Runs 7 and 8 are plan step 12 on the road. Run 7 authored the best seed so -far and lost it to a field with no description and a tool result that said -only "recorded as a gap"; the controller variant now describes its shapes, -a decode failure's reason goes back to the model, and the SDK lowering -carries a later user turn (the refusal) in its transcript. Run 8 is the -first run whose people are people: Maro "Sera. Where's the crew.", Sera "Not -yet, Bren. I haven't given Maro the condition of the intake, and until I do, -I won't say send them down.", Iva keeping the roll of names before anyone -goes below. Speech captures went from one per tick to twenty-one, and gaps -from most of the prose to nine. One promise in run 8 read "I promise Maro -Seln I will mend the tick fixture by the appointed hour, though Maro Seln -holds no authority to command my compliance and no forum will hear a suit": -the world was still titled "Cover Tick Fixture" and the brief's boundary -language leaked into a vow. Run 9, after `world_create.v3` gave the world -its title and brief, has no fixture name in its trace and its promises read -"I want every one of the forty-one hearths accounted for on the ration -boards, with no favorites". - -## Interrupted cell - -Exercised live in runs 10 and 11. A subject whose room changed mid-turn gets -one re-lowering, not a lost turn: in run 10 Maro Seln's turn was bound, Sera -Venn then spoke and set the spindle down in the same room, and the runner -re-lowered Maro's prose once with the section "What was said or done before -this person since" carrying her line as said and her act as seen. Run 11 -printed the line this section asked for, once per re-lowered cell, after the -tick line: - -```text - interrupted cell subject=Sera Venn bound=sha256:8ac0… renewed=sha256:2c71… -``` - -The pair of digests is read from the committed turn's own receipt -(`NarrativeDecision::re_lowering`, the `interrupted_from` binding and the one -that replaced it), the cover driver carries it on the tick summary -(`CoverSummary.interrupted`) and logs it per cell, and the harness prints it -from the summary. Three cells re-lowered in run 11, three lines printed, -three `Interrupted:` sections in the trace, and each act appears once in the -operator feed. +the connector variables are only required for lanes that still route to the +connector, and an all-`claude` configuration needs neither.