Skip to content

A director can do load-bearing work through harness subagents that Runtime never records #1264

Description

@drewstone

The worked example, happening live

capability-per-parameter-cpp-glm-20260915c, a director at 9h18m on runtime 0.226.0. Its headline result — a pre-registered stake refuted with a paired cluster bootstrap — needed an independent check, so at 06:50:18Z the director spawned an opencode Task subagent on the same host to re-score the arms from raw generations.

That checker has since reproduced three of four arms exactly (12B n=1350 acc=0.4222, base 0.1593, multi exact) and found, diagnosed and explained the fourth as a staleness artifact (g4 fresh 0.2970 n=1350 against the claimed 0.2978 n=1340, ten late-arriving rows). It is the verification the result stands on.

Runtime has no idea it exists.

where what it shows
spawn-journal.jsonl spawned count unchanged at 69. No entry.
root-stream.jsonl last event 06:50:18Z. Silent for the checker's entire life.
result.json / blobs nothing; the checker has no outRef, no trace, no spend record
opencode's own opencode.db 152 parts and counting — the complete transcript, in harness scratch

An operator reading Runtime's records sees a root that went quiet for half an hour. What actually happened is the most important half-hour of the run.

Why this is not the same as #1244

#1244 is a Runtime child whose transcript dies at teardown — Runtime knows the child existed and loses its contents. This is different and worse: Runtime never learns the work happened at all. There is no id to attach a receipt to, no spend to meter, and no settle to hang a reason on. The recursion the supervisor believes it is observing (69 children, 33 settled) is not the recursion that ran.

It also silently breaks two properties the stack advertises:

  • Replay. Rehydrating this run reconstructs a tree in which the result's verification never occurred.
  • Budget conservation. The checker's tokens were spent through the director's own harness session, so they land in the root's own-inference total rather than as a child's reservation. The pool is not wrong, but "what did this run spend on verification" is unanswerable.

Why a director does it anyway

It is the cheapest correct move available. A Runtime child runs in a sandbox and could not see pursuits/…-glm-20260915b/workspace, where the generations being re-scored live; a same-host harness subagent can. The director reasoned exactly this, in its own words: "The checker must see the glm-b workspace paths — a fresh Task subagent on this host (independent context, did not produce the result) fits the contract."

So this is not misbehaviour to prompt away. The placement the director needed — an independent worker with access to the root's local filesystem — is one Runtime does not offer, so it stepped outside the substrate to get it.

Ask, in preference order

  1. A same-host worker placement. If Runtime could place a child on the root's own host with the root's workspace visible, this work would be a normal child with a journal entry, a blob and a spend record, and no one would need to leave the substrate.
  2. Failing that, record the departure. A harness that spawns its own subagents should surface them as at least a journal note with a count and a token total, so the record says "work happened here that I did not supervise" instead of showing silence.
  3. At minimum, document that spawned counts Runtime children only, and that a root's own-inference spend may include an unbounded amount of unsupervised subagent work.

Related: #1244 (dropped child transcripts), #1247 (reconciliation never recovers; fleet yield), #1245 (a sandbox-placed root cannot use its coordination tools).

🤖 Generated with Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions