Implementation plan · one shot · draft for red pen

The Five Arcs — implementation plan

When you message Neo, a real Claude Code session on your own seat answers — not a metered API call — and every judgment it makes is tracked and checked against the truth every week. The Codex thread that has been running Neo’s team voice retires onto the same machinery, with nothing for you to re-type.

2026-08-23 · awaiting Robert’s red pen · nothing runs until he says go
00

The journey, at a glance

Thirteen stops, preflight to cutover. Click any to jump — the picture is the index.

01

Assumptions standing in for rulings

Nine calls nobody has ratified yet. The workflow builds on all of them — flip one and only the named build item changes.

Q1
Production-derived honesty audit — synthetic traps retired
Built as B4.1 + B4.2; scripts/schedule-calibration.ts marked superseded, the scheduled task deleted by the keeper, not the code.
↘ if you flip it
A: keep the traps run and add a run-start seeder leg (one extra build). B: no code; keeper runs the walk attended, monthly.
Q2
Extract the Codex body from disk — automations, memory, transcripts, the obligation sheet
Built as B1.5, a Claude-only leg — private context never leaves the Anthropic family.
↘ if you flip it
Nothing to flip; your read-through happens on the extracted docs before the thread is retired.
Q3
Your Max seat runs Neo Ops, with a documented concurrency budget (2 concurrent wakes)
Built as B1.2 dispatcher config.
↘ if you flip it
A dedicated seat = one claude login on a second account + one env line.
Q4
#bot-test first; the cost ceiling is replies/day, since the path is seat-backed with no API spend
Built as Worker vars in B2.4b.
↘ if you flip it
A channel list is a config value; the dial and budget are yours at cutover.
Q5
The rehearsal's own number decides in-build: ≥3 opportunities/week ships in-thread ambient, fewer ships the daily digest
Built as B2.6 measures; B2.7 builds conditionally.
↘ if you flip it
Pre-approve either form and the branch is skipped.
Q6
The germline home is ~/.claude — already a repo; committing its 1,315 dirty files is your call, not a build step
Built as B5.1 manifest + census; B5.2's drill clones ~/.claude and Digital-Empathy/de-skills.
↘ if you flip it
A new dedicated repo = the manifest's home field changes; the drill's clone list changes.
The Codex branch lands first — production is already serving it
Built as B0.2.
↘ if you flip it
There is no alternative: production is serving it.
Ambient's judge is the seat, not a Worker classifier — a queued judgment, never a scored filter
Built as B2.4a, B2.5.
↘ if you flip it
Keeping a Worker-side classifier would violate the spec's standing law; flag only if you want that law reopened.
Migration debt stays — this shot moves the face and every new judgment, not the other 26 in-Worker call sites
Scoped in B1.4.
↘ if you flip it
“Move them all” is a separate arc with its own risk.
02

The build, start to finish

One path, in order. Each stop opens to its build items underneath.

  1. Preflight Before anything builds, the machinery checks itself: enough disk, a clean workspace, the base branch cut and pushed, the deployed code matching what’s on the branch, and a starting gate that means something. If any of that is wrong, the run stops before spending a single build.
    ↘ the mechanical checks
    Preflight (in-harness, mechanical, stops the run if red): bay doctor; disk headroom ≥ 20 GB; git worktree baseline clean; base branch five-arcs/base cut from main, the Codex branch merged (B0.2) — conflicts go to a grok repair leg — and pushed; live-source parity receipt; gate baseline timed; Plato change briefs for the eleven seam files written into the sidecars.
  2. What the readers found Six readers spent the morning checking what’s actually true on the live system, not what the docs say. Nine findings changed the plan before a line of it was written.
    1. 1. The team's Slack replies are already coming from code that has never been merged.
      ↘ the receipt
      src/runtime/neo-team-control.ts (1,122 lines, 74 assertions) lives only on codex/neo-control-plane; the Mac-side dispatcher is an untracked script under ~/Documents/Codex/…/work/, running as com.robert.neo-team-dispatcher, and it delivered real Slack replies Thursday night. B0.2 lands the branch first; preflight proves the live version matches it.
    2. 2. The starting gate itself is broken.
      ↘ the receipt
      npm run gate is red on clean main (two unallowlisted person: literals in worker.ts:775-776) and typecheck fails independently (scripts/corpus-decisions-run.ts:56). B0.1 repairs the baseline so every later red means something.
    3. 3. Today's assistant runs on a different engine than the one this plan builds.
      ↘ the receipt
      The dispatcher's engine is Codex (codex app-server --stdio), authenticating with the Telegram webhook secret from eve/.dev.vars. The Claude replacement is a different engine on the same doors, with its own credential (B1.2).
    4. 4. The Slack app's own paperwork doesn't match how it actually behaves.
      ↘ the receipt
      “Writes are bot-token on every path; reads use Robert’s personal user token; the on-disk manifest still describes an app sending “as Robert” with user scopes only and no bot scopes. The event door handles only app_mention. main carries a live fetch-binding bug in slack-write.ts the unmerged branch already fixes. B2.1 proves identity by live readback and a negative test, never by the file.
    5. 5. There's no durable record of what Neo has actually told people.
      ↘ the receipt
      The Telegram ring holds 20 turns/24h; the outbound ledger keeps hashes only — no durable store of the claim text itself. B4.1 builds the claims ledger before B4.2 can audit anything against it.
    6. 6. The company's own standing rules live in an uncommitted folder.
      ↘ the receipt
      ~/.claude is a GitHub repo with 1,315 uncommitted changes including the constitution; ADVERSARY-CHARTER.md was never committed; session memory is gitignored; GENOME-ROADMAP.md is cited by ratification number in code and in every deposited fact, and exists nowhere.
    7. 7. Three claims in the spec don't hold up against what's actually on disk.
      ↘ the receipt
      “1,400+ genome events” is unverifiable (340 mirrored rows, 47 days stale). “Southtown was the accidental cold-start prototype” was a loose metaphor — it is a client-site migration. Provenance actually lives in src/runtime/world-model.ts, not src/contract/world.ts.
    8. 8. There is now a tool that can measure blast radius instead of guessing at it.
      ↘ the receipt
      plato brief <file> emits blast-radius JSON — work candidates in Arc 3 carry a real blast radius (B3.1) instead of a claim.
    9. 9. The scheduling pattern this plan needs already exists elsewhere in the system.
      ↘ the receipt
      Scheduled sessions run as cloud scheduled-tasks routines on Robert's seat, not launchd — the daily audit and weekly calibration already work this way. The Codex automations map onto it 1:1 (B1.5); the low-latency team loop still needs the Mac dispatcher (B1.2).
  3. Phase 0 — foundation Two repairs, done first and serially, because everything else depends on them: fix the broken gate, and land the branch that’s already running production onto a base every court can see.
    ↘ go deeper — the build items
    IDBuildEngineTouchesDone when
    B0.1Gate baseline repair — clear the two pre-existing redsgroksrc/runtime/worker.ts:775-776 (mint the ids or allowlist with a reason), scripts/corpus-decisions-run.ts:56npm run person-id:gate, npm run typecheck, npx vitest run all exit 0 on the base
    B0.2Land the Neo control plane — merge codex/neo-control-plane; the first non-author court it has ever hadkeeper merge + grok conflict repair if needed; claude courtsthe 11-file diff (worker.ts +383 is the conflict surface)gate green on the merged base; live-source parity receipt: the deployed version id appears in the branch's DEPLOY-ANCHOR.md entries
  4. Arc 1 — the brain moves to seats The brain moves off the metered API and onto seats already paid for — Telegram, the morning brief, and Neo’s own standing orders extracted from the Codex thread that’s been running it, so nothing has to be pasted by hand.
    ↘ go deeper — the build items
    IDBuildEngineSeam (from inventory)Done when
    B1.1Judgment queue — generalize NeoRequestLedger into typed judgment tasks: kind ∈ {neo_team_request, telegram_reply, one_converse, morning_brief, ambient_triage, ambient_investigate, work_candidate_review, dispatch_build}, lease/claim/receipt/verdict doors, heartbeat, fail-closed-to-silence (a lease that dies N times is failed, recorded as machinery failure — never rendered as an answer)grokneo-team-control.ts (claim SQL :535-549), new src/runtime/judgment-queue.ts, admin routes in worker.tsa task enqueued by a test client is claimed, answered, receipted, and readable; expired leases reclaim; zero api.anthropic.com on the new path
    B1.2Dispatcher in-repo, Claude engine, own credentialscripts/neo-ops/dispatcher.mjs (port of the Codex dispatcher; wake = claude -p headless session with a versioned system prompt, fresh per wake, state from ledgers never scrollback), scripts/neo-ops/door.mjs (the session's only hands: read-thread, reply, transition, world-query, receipt — all Worker doors), new secret NEO_CONTROL_ADMIN_TOKEN (Worker) + ~/.config/neo-ops/env (never .dev.vars), launchd plist com.digitalempathy.neo-ops-dispatcher, install/start/stop/status/rollback script, dead-man heartbeat (call-log pattern: Worker alarms if the dispatcher is silent > 15 min)claude (security-domain)the Codex dispatcher's loop (runOnce: health → claim → wake → receipt); call-log/worker.ts:52-99the 11 ported assertions + new ones pass; --once against a local Worker round-trips a task; no Slack write when health is unsafe; the Telegram secret is not read anywhere in the new code
    B1.3Neo Ops session definitiondocs/neo-ops/RUNBOOK.md (wake contract, silence bias, the authority charter lifted verbatim from DEFAULT_NEO_TEAM_POLICIES, context-firewall rules, receipt requirements), docs/neo-ops/prompts/neo-ops.system.md with a version stamp every verdict carriesclaude (team-facing words — draft until Robert earns them)neo-team-control.ts:59-86a fresh sonnet following the runbook answers a fixture request correctly (walk); prompt version appears in every verdict payload
    B1.4The face on seatsingestTelegramUpdate, diagThinkTurn, and morningBrief enqueue judgment tasks instead of calling the in-Worker brain; the Worker keeps transport, idempotency, the outbound chokepoint; flag FACE_ON_SEATS (default off) with the in-Worker path as fallback; honest “Neo is offline” system line on machinery failure, never silencegrokworker.ts:15066 (Telegram), :16434 (One), :10370 (brief); brain.ts:940,2207with the flag on and a stub seat answering, a Telegram update round-trips through the queue; with the flag off, byte-identical behavior to today (existing 30+ conversation tests green)
    B1.5DailyHQ extraction — automations → docs/neo-ops/runbooks/<id>.md (prompt verbatim, schedule, status, proposed Claude routine); memory task-groups tagged Daily HQ / chief-of-staff lanes → docs/neo-ops/knowledge/; last 14 days of the thread's assistant turns → docs/neo-ops/standing-state-2026-08-23.md; obligation sheet → scripts/neo-ops/import-obligations.mjs (reads a CSV the keeper exports; posts to the ask ledger door); retirement noteclaude (private data)~/.codex/automations/*/automation.toml, ~/.codex/memories/MEMORY.md, the thread rollout JSONL, the sheet id in the morning-command-brief promptevery automation has a runbook; the excluded personal task-groups are listed by title; the standing-state doc cites thread timestamps
  5. Arc 2 — Neo faces the team Neo starts talking in the channels you name — proving who it’s speaking as, carrying receipts on every claim, and noticing things in the room without being asked, at a volume you control with one dial.
    ↘ go deeper — the build items
    IDBuildEngineSeamDone when
    B2.1Identity proof — (a) negative test: inject a user token everywhere and assert no write call ever carries it (all three post sites + the Neo reply door); (b) /admin/slack-identity secret-gated live readback (auth.test with the bot token → bot user id, team, granted scopes; never the token); (c) scripts/slack-app-manifest.neo.json — the proposed bot-scoped manifest with event subscriptions (app_mention, message.channels), for Robert to apply in Slack admin; (d) apply the fetchImpl.bind fix; (e) route the two stray posts through SlackPostExecutor so the chokepoint claim is trueclaude (security-domain)slack-write.ts:105, eve-slack-lane.ts:1705,2219, branch postNeoTeamReply, scripts/slack-app-manifest.jsonthe negative test goes red when a write path is sabotaged to use the user token (planted-break proof); readback route returns metadata only
    B2.2Receipt-source registrysrc/runtime/receipt-sources.ts: per source {identity it reads as, freshness semantics, trust-table fields, how to cite, what questions it can answer}; includes deploy-readback (checked Mac-side via wrangler deployments status, tier T0); conformance test: every ALL_SOURCES entry and every TRUST_TABLE field maps; the doc is a generated projection of the codegroksources/composite.ts:69-77, contract/trust.ts:91,133 (additive only — frozen contract)conformance test green; docs/ai/design/receipt-source-registry-2026-08-23.md regenerates byte-identical
    B2.3Tone contract + “@Neo check”docs/neo-ops/tone-contract.md (receipts never people · offer-to-recheck · concede when corrected, never argue · tier-honest hedging · mute honored forever); runbook section for a check (claim → registry → door → receipt + tier); fixtures prove the mechanism (every reply carries a receipt ref and a tier label)clauderegistry (B2.2), runbook (B1.3)fixtures green; walk: a fresh sonnet answers a fixture check with a receipt and the right hedge
    B2.4aAmbient observe — event door handles message.channels/message.groups (eligibility: allowlisted channel + mode, human message, supported subtype, self/bot exclusion, event_id dedupe, edit/delete revisions); NeoAmbientObservation (content hash long-lived; text only for the pending window); conversation lease; delay-and-recheck window (vars NEO_AMBIENT_DELAY_MIN_MS, _MAX_MS); at window open, enqueue one ambient_triage task per thread carrying the posture dial as question framing; verdict recorded (silent / candidate{class, reasons, evidenceRefs}) — no score, no thresholdgrokslack-events-door.ts:145-168, branch control plane, B1.1 queuefixtures: 24 golden scenarios produce the expected observation/lease/task records with every write recorded; lease races and dedupe replays hold (deterministic suite)
    B2.4bAmbient reply — candidate → promotion into the request lifecycle → ambient_investigate task → reply through the existing idempotent door with write-time gates re-checked at write (kill switch, posture ≠ observe-only, budget NEO_AMBIENT_BUDGET_PER_CHANNEL_DAY, lease owned, trigger unchanged, a human answered first → cancel, firewall, receipt for any completion language); circuit breaker NEO_AMBIENT_DAILY_CEILING → observe-only; mute list honored forever; health readback fieldsgrokB2.4a, reply door (branch :1206), hand-drain.ts:81-105 dual-post patternthe zero-tolerance suite: 0 writes with the kill switch on, 0 duplicate replies, 0 writes over budget, 0 writes as a user token, 0 completion replies without a receipt; each proven by a planted break
    B2.5Ambient judgment prompts — triage + investigate sections of the runbook: the three receipt-backed classes, the posture framings (what receipts-only asks vs helpful), typed JSON output with reasons and evidence refs, fail-closed-to-silent on any machinery doubt (recorded as machinery, not as an answer)claudeB1.3, B2.3a fresh sonnet given the golden-24 as fixtures stays silent on 6–8, 21–24 and proposes on 1–5 (walk, not a statistic)
    B2.6Rehearsal harnessscripts/neo-ops/rehearse-ambient.ts: replays (a) the golden-24 fixtures and (b) real channel history for the allowlisted channels over N days (fetched through the Worker's reader; local only, never committed) through the REAL eligibility → observation → window → triage path, with the judgment leg executed by a local claude -p on the seat and every write seam recorded; outputs artifacts/neo-ops/rehearsal-<date>/{prevalence.json, decisions.jsonl, disagreements.md}; loads the worker's toml [vars] and fails closed on a missing key (rehearsal-config parity)grok builds; claude runs (private data)B2.4a/b, scripts/daily-independent-audit.ts:100-112 (config-parity pattern)the run over the last 30 days produces the prevalence number and the disagreement list; the list is attached to the ledger for Robert
    B2.7Digest renderer (conditional on B2.6 < 3/week) — a scheduled ambient_digest task renders the day’s candidates into one ignorable postgrokobservation ledgerone post per day, budget-counted, posture-gated
  6. Arc 3 — senses meet hands A finding about the company can turn into a real piece of work — with an honest blast radius, built by the fleet, checked by an outside court, and landed back as proof, not opinion.
    ↘ go deeper — the build items
    IDBuildEngineSeamDone when
    B3.1Work candidatesrc/runtime/hands/work-candidate.ts (mintWorkCandidate fail-closed like mintSignalCandidate: finding, evidence refs with verbatim-quote floor, proposed work class, blast radius from plato brief JSON or unknown: plato unavailable, authority class mapped onto NeoAction, rollback plan); candidate_json column on eve_asks via the backfill idiom; doors to mint/list; work_candidate_review judgment kindgrokask-ledger.ts:625-666, signals/types.ts:107-146, plato briefa candidate with a fabricated quote is refused with a named reason; a real one lists a real blast radius
    B3.2The warp hand — third Hand cartridge (investigate automatic read-only; build_on_branch standing-or-Robert; deploy never); act enqueues a dispatch_build task for the Neo Ops session (the only thing with hands), which dispatches through the engine-bay skill and returns {branch, ledger row, report, court verdict}; dual-post receipts; /admin/world/receipt door → writeBack({provenance:“ground”, source: receipt ref, supportingSpan}) with derivedFrom: candidate id; runbook section “dispatching to warp”grok (Worker + hand) · claude (runbook)hands/hand.ts:129,177, hand-drain.ts:112-190, world-model.ts:2324EXPECTED_HANDS_COUNT = 3 and conformance green; a deploy request is refused at the actionKind gate; a receipt lands as a ground entry with a derived-from edge
    B3.3First-loop rehearsal — a synthetic finding → candidate → dispatch_build → a Claude leg standing in for Neo Ops dispatches a trivial real bay build → one deepseek verify → receipt lands in a local WorldStore → the close-out line is composed and recorded, not postedclaude runsB3.1, B3.2, the baythe loop's ledger is on disk with every hop's receipt
  7. Arc 4 — the truth spine Every claim Neo makes gets written down, and a weekly audit checks a sample of them against reality — replacing the honesty check that has never once passed.
    ↘ go deeper — the build items
    IDBuildEngineSeamDone when
    B4.1Claims ledger — durable outbound-claims store (text, channel, at, task id, receipt refs) hooked at the Telegram outbound chokepoint, the Neo reply door, and the morning-brief render; retention var (30 days); /admin/claims?since= readbackgrokoutbound.ts:29-31, reply door, worker.ts:7199-7209a send appears in the readback with its text and refs; retention evicts on schedule (test)
    B4.2Weekly honesty audit (Option C)scripts/weekly-honesty-audit.ts in the daily audit's shape: sample N claims from B4.1 (+ call-log receipts), recompute each against ground through the registry (mechanical where possible; judgment rows flagged for the session), write artifacts/audit/honesty-<date>.md, bank a v2 verdict line in docs/ai/how-calibration-history.md, post one line to #ops-infra, stamp the dead-man; schedule-calibration.ts marked supersededgrokscripts/daily-independent-audit.ts (structure), B4.1, B2.2a run against a fixture ledger produces a verdict line and a flagged-rows section; a planted false claim is caught
    B4.3Wire c4-meta-gate — into groundSynthesisOrFallback with the existing EntailmentLeg; the verdict is recorded on the card; a not-entailed synthesis falls back to the raw claim (nothing hidden)grokworkqueue/mirror-synthesizer.ts:212-273, c4-meta-gate.ts, post-gen-audit.ts (leg pattern)Plato backward reach of c4-meta-gate.ts > 1; a real-quote/false-conclusion fixture falls back
    B4.4Genome receipts + labels — per-call-site GenomeReceipt{fenced:false, proof} where a re-runnable proof exists (ask-ledger state events, signal receipts, call-log SF ids); honest fence reasons elsewhere; /admin/genome/labels census (fenced vs receipted, queryable); insert() counts ground entries lacking a supporting span and exposes the count on /admin/worldno new rejectiongrokgenome-deposit.ts:225-229,351, world-model.ts:1147census readable; a sampled week (fixture) shows zero unlabeled claims; insert() behavior unchanged for every existing test
    B4.5Two SF postures + audit-cadence tiledocs/ai/design/sf-write-two-postures-2026-08-23.md; One-Surface census lane “audit cadence” (last daily audit, last weekly honesty audit)grok (tile) · claude (doc)sf-write-rail.ts, sf-rest-executor.ts, one-surface-html.ts:503-515doc names both lanes with flags and justifications; the tile renders from /one/api/plate
  8. Arc 5 — the germline The company’s own standing rules and skills get a home, a map of what’s actually there, and a rehearsed way to rebuild from nothing if they’re ever lost.
    ↘ go deeper — the build items
    IDBuildEngineSeamDone when
    B5.1Germline manifest + censusgenome/GERMLINE.md + genome/germline.manifest.json (every heritable artifact: home, repo, VC status, owner, ratification pointer); scripts/germline-census.mjs recomputes VC status live and names absent citations (GENOME-ROADMAP.md) — legibility, never a gategrokinventory/arc5.md manifestcensus runs clean on this machine and names the dirty files and the absent citation
    B5.2Cold-start drillscripts/cold-start-drill.sh: fresh temp HOME, clone the two germline repos at pinned refs, materialize what can be materialized offline (bay setup, hooks, skills, templates, charters), score categories re-grown as a percentage with named gaps, plant one gap and prove it is named; artifacts/cold-start/<date>.jsongrok builds; claude runs drill #1scripts/rebirth-drill.ts (the four-move shape)drill #1 receipt on disk with a score and named gaps; the planted gap is named
    B5.3Rulings indexgenome/RULINGS.md seeded from the scattered ruling docs, court briefs, and memory files (pick + why + pointer + date), DRAFT for ratification; a quarterly dead-gene review routine definitionclaudeinventory/arc5.md §4every entry has a pointer that resolves; marked DRAFT
  9. Courts Nothing ships on a green test alone. Every build gets an outside judge who never wrote it, and the judging itself follows a written charter so verification can’t quietly turn into another layer of rules policing people.
    ↘ the charter rules the courts are cut from
    1. Kind-(a) findings are never auto-repaired. A court finding classified as “this change adds a judgment-constraining rule” is parsed into the YOUR CALL ledger for Robert. No builder is dispatched to “fix” it.
    2. Repair briefs carry the cure-shape guardrail. A repair may add receipts, legibility, reversibility, say-it-out-loud, or a write-time invariant on facts. It may not add a threshold, a score, a filter, an auto-defer, or a new refusal on a teammate-reachable path.
    3. Two rounds, then the frame. A build gets at most two repair rounds. A second refutation on the same surface escalates the frame question to Robert; no third cleverer patch is dispatched.
    4. The drift sentinel. After all repairs, a cold opus leg reads the cumulative diff of the integration branch against base and lists every code path that decides a meaning question, tagged kind-(a) or kind-(b), plus the teammate-path refusal-site census before and after. Any kind-(a) or any census rise marks the PR HELD for Robert.
    5. Courts prove mechanism; data proves judgment (ratified 2026-08-18). Three rehearsals on real data run inside the shot: ambient over 30 days of real channel history (B2.6), the first warp loop (B3.3), cold-start drill #1 (B5.2). Their disagreement lists are products, not scores.
    6. The APEX walk outranks the suite. Every consumer-facing increment is walked on the real artifact by a fresh mind: a sonnet that has never seen the build follows the runbook, the tone contract, the registry doc, the dispatcher install script, the manifest. A green suite under a failed walk fails.
    ↘ who judges what
    StakesItemsBuilderVerifyFalsifyExtra lenses
    Security-domain (credentials, posting identity, admin doors, context firewall)B0.2 courts, B1.2, B2.1claude (sonnet)opusopus (a second instance)none non-Anthropic — the guard fences them
    Trust machinery (queue, face, ambient gates, warp hand, claims, audit)B1.1, B1.4, B2.4a, B2.4b, B3.2, B4.1, B4.2grokopusdeepseek-proon divergence: glm-5.3 + ox-alpha panel (diff under judgment is retained by those providers — Robert's named choice)
    Ordinary code (registry, candidate, meta-gate, genome labels, tile, census, drill)B0.1, B2.2, B2.7, B3.1, B4.3, B4.4, B4.5, B5.1, B5.2grokdeepseek-pro— (solo, per the record)kimi-k3 lens on any RED for a second pedigree
    Docs, runbooks, prompts (judgment-adjacent, team-facing)B1.3, B1.5, B2.3, B2.5, B5.3claude (sonnet)walk by a fresh sonnetkimi-k3 “would a stranger succeed?” lensopus only on the tone contract and the authority charter

    Reviewer is never the author: a grok build is never judged by grok; a Claude build is judged by a different Claude instance; an opus verdict is never the leg that wrote the brief. Divergent verdicts are HELD, never averaged.

  10. Walk Before anything merges, six people who never built it try to follow it cold — the runbook, the tone contract, the registry doc, the install script, the manifest — each on that item’s own branch. A passing test suite under a failed walk still fails.
  11. Integrate All the separately-built, separately-judged pieces get merged together, in the order they depend on each other, gated again after every merge, until one branch holds the whole shot.
    ↘ go deeper — the workflow, phase by phase
    1. 0Preflight (in-harness, mechanical, stops the run if red): bay doctor; disk headroom ≥ 20 GB; git worktree baseline clean; base branch five-arcs/base cut from main, the Codex branch merged (B0.2) — conflicts go to a grok repair leg — and pushed; live-source parity receipt; gate baseline timed; Plato change briefs for the eleven seam files written into the sidecars.
    2. 1Build (pipeline): each item’s brief → its engine → harvest bay/<slug> → gate in a clean worktree → push five-arcs/<id>. The code chain runs serially, each item on its predecessor’s branch, so a build inherits every sibling it depends on — conflict-free and test-complete by construction: B0.1 → B0.2 → B1.1 → B2.2 → B1.2 → B2.1 → B2.4a → B2.4b → B1.4 → B2.6 → B3.1 → B3.2 → B3.3 → B4.1 → B4.2 → B4.4 → B4.5. The docs chain (B1.3 → B2.3 → B2.5) and the independents (B1.5, B4.3, B5.1 → B5.2, B5.3) fan out off the merged base in parallel. B2.7 is built on the integration branch only if B2.6’s number says so.
    3. 2Court (pipelined per item, no barrier): verify ∥ falsify per the composition table → parse verdict, altitude, Environment section, YOUR CALL entries → RED at instance/class → repair (max 2) → re-court by a non-author → divergence → panel → still divergent → HOLD.
    4. 3Walk: the six walks, each by a fresh sonnet on the item’s branch.
    5. 4Integrate: merge five-arcs/<id> branches into five-arcs/integration in dependency order, gate after each merge (conflict → a headless sonnet merge leg), full gate at the end.
    6. 5Rehearse (on the integration branch, where code and docs meet): the three real-data runs — ambient over 30 days of real history, the first warp loop, cold-start drill #1; B2.7 built, courted, and merged if prevalence < 3/week.
    7. 6Sentinel: the cold opus drift audit over the integration diff.
    8. 7Deliver: one PR five-arcs/integration → main whose body is the verdict ledger (per item: builder, engines, verdicts, altitude, repairs, walk, Environment); the HANDOFF doc; the YOUR CALL list; genome deposits for the ratifiable artifacts.

    Dispatch mechanics (verified with the warp desk, 2026-08-23): no courier agents. The orchestrator is a standalone Node script that calls the bay’s two direct doors — `durable-sealed.sh` (the sealed room on this Mac: `grok-build`, `opus-verdict`) and `sandbox-lane-worker.sh` (off-box: `grok-46-sandbox`, `deepseek-pro`, `kimi-k3-sandbox`, `glm-53`, `ox-alpha`) — and headless `claude -p` legs (sonnet builds in their own worktrees, walks, the real-data runs). Every dispatch leaves a ledger row with its `run_id`, report path, and harvested branch; briefs stay compact (~2 KB), and the full work order is the spec sidecar on the pinned branch.

    Fleet discipline baked in: every brief names `security_domain: false` explicitly or routes to Claude; every court brief carries `Brief-Class: read-only`; the filled brief stays under 5,120 bytes with the sidecar doing the work; infra failures retry once then reroute to a substitute engine of the same independence class; a report on disk is read even when the lane classed the row `NOTHING_TO_DO`; named-path `git add` only, never `-A`; nothing deletes.

    Size and cost: ~25 builds, ~50 court legs, ~10 repairs, 6 walks, 3 rehearsals, 1 sentinel, ~6 integration legs — roughly 100 agent legs, well past the session’s default “under 15” guideline, per Robert’s ask for thoroughness. Builders run on the grok seat (flat). Sandbox judges are metered on the org meter. Opus legs spend Claude usage: held to the security and trust-machinery rows, roughly 20 legs. Wall clock: 8–10 hours — the code chain is serial on purpose (17 items × 25–40 min), with the docs chain, the independents, and every court pipelined alongside it.

    What the workflow never does: deploy, merge to `main`, post to Slack or Telegram, touch the live Codex dispatcher or its plist, delete a branch or a file, change `~/.claude`, or read a secret into a network call from this session (the identity readback is executed by the keeper at cutover).

  12. Rehearse Once the pieces are merged, three parts get tested against real data instead of fixtures: a month of real Slack history run through the noticing path, one real finding pushed all the way through a real build and a real outside check, and a rehearsal of rebuilding the company’s own rules from a blank machine. If the noticing path stays quiet, the daily digest gets built, judged, and merged in the same run instead.
    ↘ the three rehearsals
    Rehearse (on the integration branch, where code and docs meet): the three real-data runs — ambient over 30 days of real history, the first warp loop, cold-start drill #1; B2.7 built, courted, and merged if prevalence < 3/week.
  13. Sentinel One last read, by a mind that built none of it: does anything in the finished diff quietly decide a judgment call in code instead of asking a person? If yes, or if it’s harder to say no to something than it was before, the whole thing holds for Robert instead of shipping.
    ↘ the drift sentinel, in full

    After all repairs, a cold opus leg reads the cumulative diff of the integration branch against base and lists every code path that decides a meaning question (classifier, threshold, score, filter, auto-defer, forced default), tagged kind-(a) or kind-(b), plus the teammate-path refusal-site census before and after. Any kind-(a) or any census rise marks the PR HELD for Robert. This is the report Robert asked for, as a mechanism.

  14. Cutover Nothing here goes live in this shot. Cutover is a separate, later checklist the keeper runs after Robert has read the ledger — ten steps, each with its own undo.
    1. Merge. five-arcs/integration after reading the ledger; any HELD item stays on its branch. Undo: Revert merge commit.
    2. Slack app. Robert applies scripts/slack-app-manifest.neo.json in Slack admin (bot scopes + event subscriptions) and reinstalls; the keeper runs the identity readback and pastes the receipt (bot user id, scopes). Undo: The previous manifest is exported first.
    3. Secrets. NEO_CONTROL_ADMIN_TOKEN minted and set on the Worker; ~/.config/neo-ops/env written by Robert (the keeper never sees the value). Undo: Delete the secret; the old door still honors the Telegram secret until step 5.
    4. Deploy. Through scripts/deploy-gated.ts (baseline smoke → promote → post-smoke), after DEPLOY-ANCHOR.md is brought current (the anchor discipline is RED today, 26 days stale). Flags at deploy: FACE_ON_SEATS=0, NEO_AMBIENT_POSTURE=observe-only, budget 1, #bot-test only. Undo: npx wrangler rollback -y.
    5. Dispatcher swap. Install the Claude dispatcher (scripts/neo-ops/install.sh), confirm --once round-trip on a test request, then launchctl unload the Codex plist (kept on disk 30 days). Undo: launchctl load the Codex plist; stop the Claude one.
    6. Face on seats. Flip FACE_ON_SEATS=1; the keeper walks a Telegram exchange and the morning brief; Robert’s first real morning decides. Undo: Flip to 0.
    7. Social contract. Robert posts the team message (drafted in B2.3's deliverable) before the dial leaves observe-only. Undo:
    8. Dial. After the first clean observe-only week (the observation ledger shows what Neo would have said), Robert turns receipts-only. Undo: The dial.
    9. Routines. Register the weekly honesty audit and the extracted Codex automations as scheduled routines; delete the traps-mode routine. Undo: Re-register.
    10. DailyHQ. Robert reads docs/neo-ops/standing-state-2026-08-23.md and the obligation import diff; the thread is archived, not deleted; the Codex automations are paused (they already are, mostly). Undo:
03

Risks that remain after all of this

Honest, not hidden.

worker.ts is 16,915 lines and Plato undercounts its consumers.
Five builds touch it. Mitigation: the chain order, a Plato brief in every sidecar, the merge-gate after each integration step. Residual: a route-level regression a test does not cover — caught by the keeper’s walk at cutover, not before.
The Codex branch has never been courted by a non-author.
Its first court (B0.2) may find real defects in production code. If it does, they are repairs on the base, and the shot takes longer. That is the point.
Sandbox judges are noisy.
This week: 23 NOTHING_TO_DO, 11 cancelled, 10 blocked on deepseek-pro alone. Mitigation: read-only declaration, retry-then-reroute, reports read off disk. Residual: a leg that dies twice leaves its item with one adversary — the ledger says so, and trust-machinery items without two living adversaries are HELD.
Two judges retain what they read.
ox-alpha (anonymous provider) and glm-5.3 (provider collects). Robert named them; they receive only code diffs, never the DailyHQ extraction, credentials, or identity work. Stated once here.
Headless Claude latency.
A fresh claude -p per wake costs 20–60s before the first token. For Telegram this replaces a ~5s in-Worker reply. Robert accepted this (“can just be a Claude Code session”). Mitigation: the “thinking” acknowledgement the Worker already sends; a persistent-session variant is a follow-up if it grates.
The prevalence number may be low.
Then the digest ships and in-thread ambient waits for evidence. The build covers both.
The germline's dirty home.
The manifest will say, in numbers, that the constitution is uncommitted. Committing is Robert’s; nothing here does it.
04

What I need from you

No new open questions — three decisions only you can make.

a
Red pen on the assumptions.
Q1–Q6 above are stated assumptions, not rulings. Flip any one and only its named build item changes.
b
The go/no-go to run.
Nothing builds until you say go — roughly 100 agent legs, 8–10 hours wall clock, no deploy or merge to trunk in this shot.
c
The 12 GB disk headroom.
The run wants ≥ 10 GB free. Reclaim candidates, if you want them cleared first: 60 old lane worktrees (33 GB), bay staging (7.5 GB), bay run dirs (2.8 GB). Deletion is your call.
05

Reference strip

By type, for lookup — every link resolves to an atom above.

Arcs1 · 2 · 3 · 4 · 5

ItemsB0.1 · B0.2 · B1.1 · B1.2 · B1.3 · B1.4 · B1.5 · B2.1 · B2.2 · B2.3 · B2.4a · B2.4b · B2.5 · B2.6 · B2.7 · B3.1 · B3.2 · B3.3 · B4.1 · B4.2 · B4.3 · B4.4 · B4.5 · B5.1 · B5.2 · B5.3

Courtsthe gate · charter rules · who judges what

Cutover steps1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 · 9 · 10

Risks1 · 2 · 3 · 4 · 5 · 6 · 7

06

Receipts and provenance