Skip to content

feat(cognition): bind the benchmark board to citizen eyes — BenchViewState via the ViewState pipe (#426) - #2298

Merged
joelteply merged 1 commit into
canaryfrom
feat/426-bench-viewstate-to-citizen-eyes
Aug 14, 2026
Merged

feat(cognition): bind the benchmark board to citizen eyes — BenchViewState via the ViewState pipe (#426)#2298
joelteply merged 1 commit into
canaryfrom
feat/426-bench-viewstate-to-citizen-eyes

Conversation

@joelteply

Copy link
Copy Markdown
Contributor

What

The citizenship audit (2026-08-14, AXIS 1c) found BenchViewState's RagRenderable impl carried a doctrine-citing comment promising citizens could perceive run state "through the same pipe the human's screen uses" — and was never bound. Worse, binding alone would have read an empty store: the bench emitter published only into the websocket substrate. Citizens' only route to run state was benchmark/runs, a progress-dir scrape — the exact acceptance-test failure BENCHMARKS-ARE-ADAPTERS-NOT-A-RUNNER.md names.

How

The roster repair's one-definition-two-render-targets contract, applied to the bench outlier:

  • ipc::global_bench_substrate() — the ONE mind-side handle (a single substrate, not PerRoomSubstrates, because the bench board is one global fold unlike the per-room roster).
  • spawn_bench_emitter dual-publishes the same builder.session(view) revision into the websocket substrate (human eyes) and the global bench substrate (citizen minds) — a screen and a mind can never disagree about the board.
  • PersonaCognition gains bench_source + set_bench_source (same capture-sink decoration as roster/doctrine — deliveries recorded + replayable), pushed through THE budgeter in compose_for_turn. Budget rides the generic floor_tokens arm (the renderable's own 18-token floor) — no new constants, de-hardcode guard untouched.
  • supervisor binds ViewStateRagSource::<BenchViewState> at persona boot, right after the roster.

Test

New compose_for_turn_delivers_the_benchmark_board (// what this catches: the #426 wiring itself): a bound bench source delivers REAL run rows (run-7, sympy__sympy-24152) through the same compose path as every other source — if the push or setter regresses, minds go blind to the board again and only this fails. 16/16 targeted tests green (unified::tests, viewstate_rag, positron_bench_source); cargo check --features metal,accelerate clean.

Siblings (tracked, not in this PR)

  • Gap analysis: 49 open issues, 20 closed #425-class: retire the detached-runner auto-dispatch (Joel's timing call — changes benchmark behavior mid-campaign)
  • L1 fork capture contamination
  • doc/dead-wire hygiene (orphan agent:solve:complete, stale service_loop comment, pipeline doc's 6 dead verbs)

🤖 Generated with Claude Code

https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo

…State reaches minds via the ViewState pipe (#426)

The renderable existed with a doctrine-citing comment ("a citizen standing in
the run's room can perceive the run's state through the same pipe the human's
screen uses") and was NEVER BOUND — supervisor bound only the Roster. Worse,
binding alone would have read an empty store: the bench emitter published only
into the websocket substrate, so the mind-side had no data to read. Citizens'
only route to run state was the benchmark/runs command, whose implementation
scrapes the progress dir — the exact acceptance-test failure
BENCHMARKS-ARE-ADAPTERS-NOT-A-RUNNER.md names.

The fix is the roster repair's one-definition-two-render-targets contract
applied to the bench outlier:

- ipc::global_bench_substrate() — the ONE mind-side handle. The bench board is
  a single global fold (unlike the per-room roster), so its handle is one
  substrate, not PerRoomSubstrates.
- spawn_bench_emitter dual-publishes the SAME builder.session(view) revision
  into the websocket substrate (human eyes) and the global bench substrate
  (citizen minds) — a screen and a mind can never disagree about the board.
- PersonaCognition gains bench_source + set_bench_source (same capture-sink
  decoration as roster/doctrine — deliveries recorded + replayable), pushed
  through THE budgeter in compose_for_turn; budget rides the generic
  floor_tokens arm (the renderable's own 18-token floor), no new constants.
- supervisor binds ViewStateRagSource::<BenchViewState> at persona boot.

// what this catches (new test): a bound bench source delivers REAL run rows
through the same compose path as every other source — if the push or setter
regresses, minds go blind to the board again and only this fails.

Found by the 2026-08-14 citizenship audit (AXIS 1c). Siblings tracked: #425
(retire the detached-runner auto-dispatch, Joel's timing call), #427 (L1 fork
capture contamination), #428 (doc/dead-wire hygiene).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
@joelteply
joelteply merged commit 001b96e into canary Aug 14, 2026
5 checks passed
@joelteply
joelteply deleted the feat/426-bench-viewstate-to-citizen-eyes branch August 14, 2026 21:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant