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.
Thirteen stops, preflight to cutover. Click any to jump — the picture is the index.
Nine calls nobody has ratified yet. The workflow builds on all of them — flip one and only the named build item changes.
scripts/schedule-calibration.ts marked superseded, the scheduled task deleted by the keeper, not the code.claude login on a second account + one env line.#bot-test first; the cost ceiling is replies/day, since the path is seat-backed with no API spend~/.claude — already a repo; committing its 1,315 dirty files is your call, not a build step~/.claude and Digital-Empathy/de-skills.home field changes; the drill's clone list changes.One path, in order. Each stop opens to its build items underneath.
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.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.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.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).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.~/.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.src/runtime/world-model.ts, not src/contract/world.ts.plato brief <file> emits blast-radius JSON — work candidates in Arc 3 carry a real blast radius (B3.1) instead of a claim.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).| ID | Build | Engine | Touches | Done when |
|---|---|---|---|---|
| B0.1 | Gate baseline repair — clear the two pre-existing reds | grok | src/runtime/worker.ts:775-776 (mint the ids or allowlist with a reason), scripts/corpus-decisions-run.ts:56 | npm run person-id:gate, npm run typecheck, npx vitest run all exit 0 on the base |
| B0.2 | Land the Neo control plane — merge codex/neo-control-plane; the first non-author court it has ever had | keeper merge + grok conflict repair if needed; claude courts | the 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 |
| ID | Build | Engine | Seam (from inventory) | Done when |
|---|---|---|---|---|
| B1.1 | Judgment 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) | grok | neo-team-control.ts (claim SQL :535-549), new src/runtime/judgment-queue.ts, admin routes in worker.ts | a task enqueued by a test client is claimed, answered, receipted, and readable; expired leases reclaim; zero api.anthropic.com on the new path |
| B1.2 | Dispatcher in-repo, Claude engine, own credential — scripts/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-99 | the 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.3 | Neo Ops session definition — docs/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 carries | claude (team-facing words — draft until Robert earns them) | neo-team-control.ts:59-86 | a fresh sonnet following the runbook answers a fixture request correctly (walk); prompt version appears in every verdict payload |
| B1.4 | The face on seats — ingestTelegramUpdate, 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 silence | grok | worker.ts:15066 (Telegram), :16434 (One), :10370 (brief); brain.ts:940,2207 | with 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.5 | DailyHQ 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 note | claude (private data) | ~/.codex/automations/*/automation.toml, ~/.codex/memories/MEMORY.md, the thread rollout JSONL, the sheet id in the morning-command-brief prompt | every automation has a runbook; the excluded personal task-groups are listed by title; the standing-state doc cites thread timestamps |
| ID | Build | Engine | Seam | Done when |
|---|---|---|---|---|
| B2.1 | Identity 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 true | claude (security-domain) | slack-write.ts:105, eve-slack-lane.ts:1705,2219, branch postNeoTeamReply, scripts/slack-app-manifest.json | the negative test goes red when a write path is sabotaged to use the user token (planted-break proof); readback route returns metadata only |
| B2.2 | Receipt-source registry — src/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 code | grok | sources/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.3 | Tone 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) | claude | registry (B2.2), runbook (B1.3) | fixtures green; walk: a fresh sonnet answers a fixture check with a receipt and the right hedge |
| B2.4a | Ambient 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 threshold | grok | slack-events-door.ts:145-168, branch control plane, B1.1 queue | fixtures: 24 golden scenarios produce the expected observation/lease/task records with every write recorded; lease races and dedupe replays hold (deterministic suite) |
| B2.4b | Ambient 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 fields | grok | B2.4a, reply door (branch :1206), hand-drain.ts:81-105 dual-post pattern | the 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.5 | Ambient 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) | claude | B1.3, B2.3 | a 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.6 | Rehearsal harness — scripts/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.7 | Digest renderer (conditional on B2.6 < 3/week) — a scheduled ambient_digest task renders the day’s candidates into one ignorable post | grok | observation ledger | one post per day, budget-counted, posture-gated |
| ID | Build | Engine | Seam | Done when |
|---|---|---|---|---|
| B3.1 | Work candidate — src/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 kind | grok | ask-ledger.ts:625-666, signals/types.ts:107-146, plato brief | a candidate with a fabricated quote is refused with a named reason; a real one lists a real blast radius |
| B3.2 | The 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:2324 | EXPECTED_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.3 | First-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 posted | claude runs | B3.1, B3.2, the bay | the loop's ledger is on disk with every hop's receipt |
| ID | Build | Engine | Seam | Done when |
|---|---|---|---|---|
| B4.1 | Claims 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= readback | grok | outbound.ts:29-31, reply door, worker.ts:7199-7209 | a send appears in the readback with its text and refs; retention evicts on schedule (test) |
| B4.2 | Weekly 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 superseded | grok | scripts/daily-independent-audit.ts (structure), B4.1, B2.2 | a run against a fixture ledger produces a verdict line and a flagged-rows section; a planted false claim is caught |
| B4.3 | Wire 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) | grok | workqueue/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.4 | Genome 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/world — no new rejection | grok | genome-deposit.ts:225-229,351, world-model.ts:1147 | census readable; a sampled week (fixture) shows zero unlabeled claims; insert() behavior unchanged for every existing test |
| B4.5 | Two SF postures + audit-cadence tile — docs/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-515 | doc names both lanes with flags and justifications; the tile renders from /one/api/plate |
| ID | Build | Engine | Seam | Done when |
|---|---|---|---|---|
| B5.1 | Germline manifest + census — genome/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 gate | grok | inventory/arc5.md manifest | census runs clean on this machine and names the dirty files and the absent citation |
| B5.2 | Cold-start drill — scripts/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>.json | grok builds; claude runs drill #1 | scripts/rebirth-drill.ts (the four-move shape) | drill #1 receipt on disk with a score and named gaps; the planted gap is named |
| B5.3 | Rulings index — genome/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 definition | claude | inventory/arc5.md §4 | every entry has a pointer that resolves; marked DRAFT |
| Stakes | Items | Builder | Verify | Falsify | Extra lenses |
|---|---|---|---|---|---|
| Security-domain (credentials, posting identity, admin doors, context firewall) | B0.2 courts, B1.2, B2.1 | claude (sonnet) | opus | opus (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.2 | grok | opus | deepseek-pro | on 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.2 | grok | deepseek-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.3 | claude (sonnet) | walk by a fresh sonnet | kimi-k3 “would a stranger succeed?” lens | opus 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.
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.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.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.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).
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.
five-arcs/integration after reading the ledger; any HELD item stays on its branch. Undo: Revert merge commit.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.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.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.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.FACE_ON_SEATS=1; the keeper walks a Telegram exchange and the morning brief; Robert’s first real morning decides. Undo: Flip to 0.observe-only. Undo: —receipts-only. Undo: The dial.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: —Honest, not hidden.
worker.ts is 16,915 lines and Plato undercounts its consumers.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.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.No new open questions — three decisions only you can make.
By type, for lookup — every link resolves to an atom above.
Items — B0.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
Courts — the gate · charter rules · who judges what
five-arcs-build-2026-08-23/inventory/{arc1..arc5,infra}.md — six sonnet readers, 2026-08-23, main @ c290101f0; Plato index @ 45ebff4cd (19 behind) where cited.~/.codex/automations/*/automation.toml (9), ~/.codex/memories/, ~/.codex/sessions/2026/07/29/rollout-…-019faebe-fdb3-…jsonl (804 MB, the DailyHQ thread), ~/Documents/Codex/2026-08-14/neo-control/work/neo-team-dispatcher.mjs + plist; launchctl list shows com.robert.neo-team-dispatcher pid 33101.~/.claude/engine-bay/ledger.jsonl, last 7 days (grok-46-sandbox 21 ok; grok-build 5 unreported; deepseek-pro 19 ok / 23 nothing-to-do; glm-53 20 ok; ox-alpha 5 nothing-to-do; kimi-k3-sandbox 12 ok / 30 nothing-to-do).