Chronicler · human view
The native-child rail: taking job dispatch off the shell
Corpus needs a provider host to run a Hands or Eyes job. How does it start one — and what was the Popen route actually blocking?
- Dispositionread as live — no act has disposed this arc. FIND-1018 closed an office, not the work, and FIND-1009 is a declared living edge, not a hold. That is a reading from the record,…
- arc
library/work/native-child-rail/README.md
What the account is
A live library arc for taking job dispatch off the shell. Disposition is read as live — FIND-1018 closed an office, not the work; FIND-1009 is a declared living edge. PATCH-086 through PATCH-091 verified; PATCH-092 abandoned as a dead claim over code that had already shipped. Evidence: strong — fourteen live canaries against one baseline, preserved byte-for-byte. Last observed 2026-08-30.
Why it had to change
FIND-993 named the disease: provider hosts were fitted to a Claude-shaped contract. Bounded invocation, read-only Eyes, controlled children, and turn/spend rails learned on Claude were treated as the provider contract; Codex and Grok were forced to fit. Turn native children off and what remains is a shell — collapsing the Eyes-after-Hands hop. FIND-988 and FIND-992 showed the field cost the same day; FIND-995 opened the recut.
Canary-first
One probe, one claim, one FIND, production untouched until the mouth is proven. Each canary drove one host's native mouth against a real pre-created Hands worktree at parent HEAD 79b0e53, captured a JSON receipt, and proved or refused exactly one thing. Host-level isolation was deliberately not used so any child tree had to be the one Corpus made.
Two mouths that write
Codex production (FIND-1004) launches codex app-server over stdio and drives initialize → model/list → thread/start → turn/start → turn/interrupt → thread/archive. Grok's headless -p --cwd bound the tree but cancelled the write (FIND-1005); ACP is the mouth that writes (FIND-1006), with spawn lineage on the subagent_spawned notification (FIND-1007). Live ACP dispatch needed --no-subagents before agent in argv (FIND-1010).
Ownership inverted
FIND-1011 and FIND-1012 turned the assumption around: the resident host owns the session; Corpus attaches with --leader, so the stdio process is a client shim and closing it must not be read as killing the host. FIND-1014 pushed the same inversion up: Orchestrator invokes dispatch_job in process over MCP rather than through a shell. Landed across commits 80b9720, ce0697c, and ebb3420.
What remains unmet
The living edge is FIND-1009 / MSG-1664 — the Eyes AMEND hop. TUI attach is not a loose end beside the arc: FIND-1015 names leader-root invisibility, which is exactly what FIND-1027 says the recut was for. Six verified patches moved the transports; the window is still not there. A grok-build compile bluescreen stopped the edge mid-edit — treat the build, not the protocol, as the known hazard.
Surveyor · mouths and custody
Structure drawn only from the export's question, canary table, code cuts, and ownership turns. No wall-clock bars — this arc publishes canary proofs and patch cuts, not comparable suite timings.
- 1Shell / PopenPre-2026-08-28 route: build a command line and launch with Popen
- 2Canary-firstOne probe, one claim, one FIND; production untouched until the mouth is proven
- 3Codex app-serverFIND-1004 production path: app-server stdio; prompt/model/cwd as turn params
- 4Grok ACPFIND-1005 -p cancelled the write; FIND-1006 ACP is the mouth that writes
- 5--leader attachFIND-1012: resident host owns the session; stdio process is a client shim
- 6Controller mouthFIND-1014: dispatch_job in process over MCP; corpus_job_start / corpus_job_dispatch
- 7FIND-1009 living edgeEyes AMEND hop; TUI visibility unmet (FIND-1015 / FIND-1027)
- Codexapp-server job schema codex-app-server-job/v1; legacy exec still on v3/v5
- GrokACP run_native_job; --leader; v5 omits --no-subagents
- ClaudeStayed behind in capability_bundles; seams extracted for Grok and Codex only
Mermaid source
flowchart LR
Popen["Shell / Popen"] --> Canary["Canary-first"]
Canary --> Codex["Codex app-server"]
Canary --> Acp["Grok ACP"]
Codex --> Leader["--leader attach"]
Acp --> Leader
Leader --> Mouth["Controller mouth"]
Mouth -.-> Edge["FIND-1009 living edge"]Surveyor · wall-clock figures
Bars use only numbers verified in the exported markdown for this arc. Each row shows value and source commit SHA. Gaps stay gaps.
No verified wall-clock figures in this export — structure above carries the weight.