@tangle-network/agent-runtime 0.158.0 → 0.160.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/{activation-CLicee7D.js → activation-DaUNBcZw.js} +2 -2
  2. package/dist/{activation-CLicee7D.js.map → activation-DaUNBcZw.js.map} +1 -1
  3. package/dist/agent.d.ts +1 -1
  4. package/dist/agent.js +1 -1
  5. package/dist/durable.d.ts +1 -1
  6. package/dist/{graph-BGPO6z_u.js → graph-BN2fCNTN.js} +54 -14
  7. package/dist/graph-BN2fCNTN.js.map +1 -0
  8. package/dist/{improvement-cycle-BEENaoCb.js → improvement-cycle-oUBE1Pzg.js} +2 -2
  9. package/dist/{improvement-cycle-BEENaoCb.js.map → improvement-cycle-oUBE1Pzg.js.map} +1 -1
  10. package/dist/{index-Dto3D25e.d.ts → index-BUoMn70Q.d.ts} +21 -27
  11. package/dist/{index-W5WVBUlZ.d.ts → index-BpWTxm_M.d.ts} +2 -2
  12. package/dist/index.d.ts +3 -3
  13. package/dist/index.js +5 -5
  14. package/dist/intelligence.js +2 -2
  15. package/dist/kernel.d.ts +1 -1
  16. package/dist/kernel.js +3 -3
  17. package/dist/{knowledge-HDCUV1kZ.js → knowledge-6LGnJFc7.js} +2 -2
  18. package/dist/{knowledge-HDCUV1kZ.js.map → knowledge-6LGnJFc7.js.map} +1 -1
  19. package/dist/knowledge.d.ts +1 -1
  20. package/dist/knowledge.js +1 -1
  21. package/dist/{loop-runner-bin-UNn0NLv2.js → loop-runner-bin-8lZGsvdz.js} +2 -2
  22. package/dist/{loop-runner-bin-UNn0NLv2.js.map → loop-runner-bin-8lZGsvdz.js.map} +1 -1
  23. package/dist/{loop-runner-bin-BEzvqbgg.d.ts → loop-runner-bin-DxrZ1wr8.d.ts} +2 -2
  24. package/dist/loop-runner-bin.d.ts +1 -1
  25. package/dist/loop-runner-bin.js +1 -1
  26. package/dist/mcp/index.d.ts +1 -1
  27. package/dist/mcp/index.js +1 -1
  28. package/dist/{runtime-CTs2JsG9.js → runtime-Ccotdixu.js} +3 -3
  29. package/dist/{runtime-CTs2JsG9.js.map → runtime-Ccotdixu.js.map} +1 -1
  30. package/dist/{structural-rollout-Cj58xALQ.js → structural-rollout-JEhoJUjC.js} +39 -3
  31. package/dist/structural-rollout-JEhoJUjC.js.map +1 -0
  32. package/dist/testing.d.ts +1 -1
  33. package/dist/testing.js +10 -10
  34. package/package.json +1 -1
  35. package/dist/graph-BGPO6z_u.js.map +0 -1
  36. package/dist/structural-rollout-Cj58xALQ.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph-BGPO6z_u.js","names":[],"sources":["../src/runtime/supervise/graph.ts"],"sourcesContent":["/**\n *\n * `runGraph` — agent graphs: profiles as nodes, registry-backed prompt directives as edges.\n *\n * A topology is PLAIN DATA an agent can author in a few lines: nodes are canonical\n * `AgentProfile`s (the ONLY way a node is described — no role-builder functions), edges are typed\n * values carrying versioned {@link PromptHandle} directives, `deliverable` (termination) and\n * `budget` (one conserved pool) are mandatory. Driver↔worker is the two-node cyclic instance;\n * \"agent 3 analyzes 1 and 2 and reports to 1\" is ONE edge, not a framework.\n *\n * NOT A SECOND SCHEDULER. `runGraph` is an interpretation layer over what already runs:\n * `supervise()` is the execution core — the same `supervisorAgent`/`driverAgent` machinery,\n * `makeWorkerAgent` seam, conserved-pool budget, and deliverable-gated settlement every\n * supervised run uses. (`runAgentRounds` is deliberately NOT the substrate here.) What the graph\n * layer ADDS is exactly what a bespoke driver loop never\n * had:\n *\n * 1. **Node pinning** — a spawn names a node (`profile.name` = node id) and the node's canonical\n * profile is what runs; a driver cannot smuggle capabilities into a worker it did not define.\n * 2. **Observable edges** — every delegates/analyzes traversal lands in an EDGE LEDGER\n * (`delivered | stripped | empty | unpropagated`, with byte counts), in memory on\n * the result AND as `edge` events in the run journal. The motivating incident: a filter\n * silently replaced 1,700-char steering with 241 chars of boilerplate for three rounds and\n * NO artifact said so — an unobservable edge cannot be trusted and its directive cannot be\n * optimized.\n * 3. **Directives as data** — edge text lives in the prompt registry (`<surface>/v<n>`), so every\n * edge is a versioned optimization target, never prose hardcoded in a builder function.\n * 4. **Per-edge traversal caps** — the cyclic-graph backstop. A delegates edge whose cap is\n * exhausted REFUSES further traversals (fail loud), so a cycle cannot spin the pool dry.\n * 5. **Continuity as data** — a delegates edge may declare `continuity: 'resume'`, so each spawn\n * after the node's first re-attaches to its latest SETTLED session (the spawn context hands\n * the executor seam `resume: { ofWorker, sequence }`; the kernel keeps identity, ordering,\n * ledger truth, and the one conserved pool). Every ledger row states how its hop continued:\n * `'fresh' | 'resume'` for spawns, `'steer'` for mid-run deliveries — fresh respawns, session\n * resumes, and live steers are all plain data, each a ledgered fact.\n *\n * ORACLES ARE ENVIRONMENT, NEVER WORKERS. Graders/verifiers must not be spawnable in the graph —\n * a delegates edge to them leaks the rubric. An `analyzes` edge names its analyst in one of two\n * forms: a LENS id from the environment's registry (a pure function over trace evidence), or the\n * id of a graph NODE — a tool-equipped analyst AGENT spawned on each matching settle with the\n * node's pinned profile, whose settle output IS the findings. Either way the oracle doctrine\n * holds: an analyst node can never be a delegates target (refused loudly), so no driver can hand\n * it work, and an id living in both the registry and the nodes is refused as ambiguous.\n *\n * @experimental\n */\n\nimport {\n type AgentProfile,\n agentProfileSchema,\n canonicalCandidateDigest,\n} from '@tangle-network/agent-interface'\nimport { InMemoryResultBlobStore, InMemorySpawnJournal } from '../../durable/spawn-journal'\nimport { ValidationError } from '../../errors'\nimport type {\n AnalystRegistry,\n AnalyzeOnSettleRoute,\n ContinuityMode,\n CoordinationEvent,\n MakeWorkerAgent,\n WorkerWatchOptions,\n} from '../../mcp/tools/coordination'\nimport { composeRuntimeHooks, type RuntimeHooks } from '../../runtime-hooks'\nimport { harnessRunsAgent } from '../harness-role'\nimport type { RouterTransportConfig } from '../router-client'\nimport type { ToolLoopChat } from '../tool-loop'\nimport type { DeliverableSpec } from './completion-gate'\nimport {\n formatPromptHandle,\n kernelPromptRegistry,\n type PromptHandle,\n type PromptRegistry,\n} from './prompt-registry'\nimport type { ExecutorConfig } from './runtime'\nimport {\n type SuperviseOptions,\n supervise,\n superviseWithTestBrain,\n workerFromBackend,\n} from './supervise'\nimport type { Budget, NodeId, ResultBlobStore, SpawnJournal, SupervisedResult } from './types'\n\n// ── The algebra ────────────────────────────────────────────────────────────────\n\n/** A graph node: an id and a canonical `AgentProfile`. The profile is the ONLY way a node is\n * described — its `prompt.systemPrompt` is the standing role (the 0.117 canonical resolution;\n * never a legacy top-level-only reduction), its tools/mcp/resources are its capabilities. */\nexport interface GraphNode {\n readonly id: NodeId\n readonly profile: AgentProfile\n}\n\nexport type GraphEdge =\n /** Work flows down. The delegation directive is DATA → versionable, sweepable, optimizable.\n * Each spawn of `to` by `from` — and each mid-run steer from `from` to a live `to` worker —\n * is one traversal. */\n | {\n readonly kind: 'delegates'\n readonly from: NodeId\n readonly to: NodeId\n readonly directive: PromptHandle\n /** Cyclic-graph backstop: traversals beyond this REFUSE (fail loud). Default\n * {@link defaultEdgeTraversalCap}. */\n readonly maxTraversals?: number\n /** Default continuity for this edge's SPAWN traversals. `'resume'` makes every spawn after\n * the node's first re-attach to its most recent SETTLED worker: a NEW live worker whose\n * spawn context carries `resume: { ofWorker, sequence }` for the executor seam, spending\n * from the same conserved pool — the node's first spawn is effectively `'fresh'`, and a\n * spawn while a prior worker is still live refuses loudly (steer is the live channel).\n * The driver's per-call `spawn_agent` `continuity` argument overrides either way. Omit =\n * `'fresh'` (today's behavior, byte-identical). Caps count resumes exactly like fresh\n * spawns. */\n readonly continuity?: ContinuityMode\n }\n /** Findings flow anywhere: an analyst over N nodes' settled traces, delivered to ONE node.\n * With a LENS analyst the directive wraps the findings for the recipient; with a NODE analyst\n * the directive is the analyst agent's task and the findings are its settle output. */\n | {\n readonly kind: 'analyzes'\n /** The analyst REFERENCE, in one of two forms: a lens id resolved against\n * `RunGraphOptions.analysts` (environment), or the id of a graph NODE with no delegates\n * edge pointing at it — then each matching settle spawns that node's pinned profile as a\n * tool-equipped analyst WORKER (same spawn machinery, conserved budget, trace join) whose\n * task is this edge's directive plus the settled worker's trace evidence and whose settle\n * output is the findings. An id that is both a node and a registry lens is refused. */\n readonly analyst: string\n readonly over: ReadonlyArray<NodeId>\n readonly to: NodeId\n readonly directive: PromptHandle\n /** Observability cap: traversals beyond this are LEDGERED as exhausted (`unpropagated`).\n * Only delegates caps refuse traversal — they are what close the spawn cycle. */\n readonly maxTraversals?: number\n }\n\nexport interface AgentGraph {\n readonly nodes: ReadonlyArray<GraphNode>\n readonly edges: ReadonlyArray<GraphEdge>\n /** Termination is mandatory, not optional: the independent completion oracle. */\n readonly deliverable: DeliverableSpec<unknown>\n /** One conserved pool across the whole graph — cycles without conservation never terminate. */\n readonly budget: Budget\n}\n\n// ── The edge ledger ────────────────────────────────────────────────────────────\n\nexport type EdgeDeliveryOutcome = 'delivered' | 'stripped' | 'empty' | 'unpropagated'\n\n/** How one ledgered hop CONTINUED: a spawn traversal stamps its effective spawn mode\n * (`'fresh'` | `'resume'`), and every mid-run delivery into an already-live recipient — a\n * driver steer leg and every analyzes delivery (routed steer or driver-destined finding) —\n * stamps `'steer'`. Zero ambiguity: every row carries exactly one of the three. */\nexport type TraversalContinuity = ContinuityMode | 'steer'\n\n/** One recorded edge traversal — the in-memory row; the journal twin is the `edge` SpawnEvent. */\nexport interface EdgeTraversal {\n /** Stable edge id: `delegates:<from>-><to>` or `analyzes:<analyst>:<over…>-><to>`. */\n readonly edge: string\n readonly kind: 'delegates' | 'analyzes'\n readonly from: string\n readonly to: string\n /** The resolved directive reference (`<surface>/v<n>`). */\n readonly directive: string\n /** 1-based per-edge ordinal. */\n readonly traversal: number\n readonly outcome: EdgeDeliveryOutcome\n /** How this hop continued — see {@link TraversalContinuity}. */\n readonly continuity: TraversalContinuity\n /** Bytes of directive + payload that actually crossed the edge. */\n readonly bytes: number\n readonly reason?: string\n /** The concrete worker node id, once known. */\n readonly workerId?: string\n}\n\n/** Default per-edge traversal cap — the cyclic-graph backstop when an edge names none. */\nexport const defaultEdgeTraversalCap = 32\n\n/** A delegates edge exhausted its traversal cap and the run produced no winner: the cap, not the\n * task, ended it. Carries the full evidence so failing loud loses nothing. */\nexport class GraphEdgeCapError extends Error {\n readonly exhaustedEdges: ReadonlyArray<string>\n readonly ledger: ReadonlyArray<EdgeTraversal>\n readonly result: SupervisedResult<unknown>\n constructor(\n exhaustedEdges: ReadonlyArray<string>,\n ledger: ReadonlyArray<EdgeTraversal>,\n result: SupervisedResult<unknown>,\n ) {\n super(\n `runGraph: edge traversal cap exhausted on ${exhaustedEdges.join(', ')} and the run ` +\n 'delivered no winner — the cap (the cyclic-graph backstop), not the task, ended this run. ' +\n 'Raise maxTraversals on the edge or fix the cycle; the full edge ledger and the ' +\n 'supervised result ride on this error.',\n )\n this.name = 'GraphEdgeCapError'\n this.exhaustedEdges = exhaustedEdges\n this.ledger = ledger\n this.result = result\n }\n}\n\n// ── Options / result ───────────────────────────────────────────────────────────\n\nexport interface RunGraphOptions {\n /** WHERE worker nodes run — the executor backend. Provide this OR `makeWorkerAgent`. */\n readonly backend?: ExecutorConfig\n /** WHERE the ROOT node's harness brain runs — forwarded to `supervise()` verbatim (see\n * `SuperviseOptions.driverBackend`). Needed when the root node's profile declares an external\n * harness (`codex`, `claude-code`, `opencode`): that root is driven by the harness, not by the\n * router brain, and automatic execution supports a local `bridge`. Unlike `supervise()`, this\n * does NOT default to `backend`: a graph's `backend` places WORKER nodes, so the root driver\n * is selected only by this field. Omit = no harness driver, which is correct for a root whose\n * `profile.harness` is omitted or `cli-base` (that root runs on the router brain). */\n readonly driverBackend?: ExecutorConfig\n /** Leaf-execution override (offline tests / advanced). `runGraph` still owns node pinning,\n * directive delivery, and the edge ledger AROUND this seam — only the leaf `act` is yours. */\n readonly makeWorkerAgent?: MakeWorkerAgent\n /** The driver brain's router substrate (`profile.harness` omitted or `cli-base`). */\n readonly router?: RouterTransportConfig\n /** The ROOT driver's inference seam — a caller-owned `ToolLoopChat` that makes every root\n * model call. Use it when the root's decisions must be caller-owned orchestration (a\n * deterministic conversation driver, a persona loop with its own LLM calls) rather than a\n * router-derived model call. The graph machinery around the seam is unchanged: node pinning,\n * directive delivery, the edge ledger, and the journal twin all run the same shipped path,\n * and the root profile keeps prompt control (`prompt-control-execution` materialization —\n * `systemPrompt`/`instructions` still apply). What moves to the caller with the brain:\n * model selection and provider-identity validation (`expectedModel` cannot be enforced on a\n * call the runtime did not place) and per-turn usage reporting (a brain that reports no\n * usage meters nothing into the pool). Omit = the router brain derived from the root\n * profile — the unchanged default. Mutually exclusive with `driverBackend`, and refused\n * when the root profile declares an external harness (that root is driven BY the harness). */\n readonly brain?: ToolLoopChat\n /** Caller-side runtime hooks (telemetry, policy, product extensions). Composed AFTER the\n * graph's own spawn-binding hook on the SAME event stream — the graph never swallows the\n * seam supervise() exposes. */\n readonly hooks?: RuntimeHooks\n /** The analyst lens registry `analyzes` edges resolve against. ENVIRONMENT — needed only for\n * lens analysts; an analyzes edge naming a graph NODE as its analyst needs no registry. */\n readonly analysts?: AnalystRegistry\n /** Watch every worker's LIVE tool trace with the online detector panel and raise a `finding`\n * on the bus the moment one loops or error-storms — forwarded to `supervise()` verbatim (see\n * `SuperviseOptions.watchWorkers`). Online findings (`analyst: 'online:<detector>'`) are bus\n * events for the driver, not graph edges, so they are never ledgered as traversals. Omit =\n * off (no online watching, no extra events). */\n readonly watchWorkers?: WorkerWatchOptions\n /** Directive registry. Default: the seeded kernel registry (`kernelPromptRegistry()`). */\n readonly registry?: PromptRegistry\n /** The run journal the edge ledger and every spawn/settle ride. Default: in-memory. */\n readonly journal?: SpawnJournal\n readonly blobs?: ResultBlobStore\n readonly runId?: string\n /** Per-child budget reserved from the conserved pool on each spawn. */\n readonly perWorker?: Budget\n readonly maxTurns?: number\n readonly maxLiveWorkers?: number\n /** Resolve product-owned tools from the exact trusted manager context — forwarded to the root's\n * `supervise()` verbatim (see `SuperviseOptions.resolveSupervisorTools`). Without it a declared\n * graph mounts only the coordination MCP, so a root that is supposed to reach a product tool\n * (a claim ledger, a knowledge base) finds nothing and writes its output somewhere ungraded.\n * A graph run and a supervise run mount the same tools when this is set. */\n readonly resolveSupervisorTools?: SuperviseOptions['resolveSupervisorTools']\n /** Product authority over every steer/answer instruction (the filter seam). `runGraph` observes\n * what it CHANGES: a narrowed instruction ledgers its steer traversal as `stripped`. */\n readonly authorizeMessage?: SuperviseOptions['authorizeMessage']\n readonly signal?: AbortSignal\n readonly now?: () => number\n readonly otel?: SuperviseOptions['otel']\n readonly stallAfterMs?: number\n readonly allowedModels?: readonly string[]\n}\n\nexport interface GraphResult<Out = unknown> {\n readonly result: SupervisedResult<Out>\n /** Every edge traversal, in occurrence order — the observable-edge contract. */\n readonly ledger: ReadonlyArray<EdgeTraversal>\n /** Edge ids whose traversal cap was hit — analyzes exhaustion included (observable here, never\n * a refusal). A DELEGATES cap paired with a `no-winner` result THROWS\n * ({@link GraphEdgeCapError}) instead of returning: only delegates caps refuse spawns, so only\n * they can have ended the run. A LIFECYCLE no-winner (`aborted` / `budget-exhausted`) returns\n * normally even with an exhausted delegates cap — the abort or the pool, not the cap, ended\n * that run, and the exhaustion stays observable here. */\n readonly exhaustedEdges: ReadonlyArray<string>\n readonly runId: string\n}\n\n/** `RunGraphOptions` with the brain REQUIRED — the shape the `/testing` entry's\n * `runGraphWithTestBrain` keeps accepting now that `brain` is a production option. */\nexport interface RunGraphTestOptions extends RunGraphOptions {\n readonly brain: ToolLoopChat\n}\n\n// ── Validation ─────────────────────────────────────────────────────────────────\n\ninterface ValidatedGraph {\n readonly root: GraphNode\n readonly workers: ReadonlyMap<NodeId, GraphNode>\n readonly delegatesByWorker: ReadonlyMap<NodeId, Extract<GraphEdge, { kind: 'delegates' }>>\n readonly analyzes: ReadonlyArray<Extract<GraphEdge, { kind: 'analyzes' }>>\n /** Nodes referenced as an analyzes edge's ANALYST (the analyst-agent form): reachable through\n * their analyzes edge (spawned on settle), never through a delegates edge. */\n readonly analystNodes: ReadonlyMap<NodeId, GraphNode>\n}\n\nfunction edgeId(edge: GraphEdge): string {\n return edge.kind === 'delegates'\n ? `delegates:${edge.from}->${edge.to}`\n : `analyzes:${edge.analyst}:${edge.over.join('+')}->${edge.to}`\n}\n\n/** Validate the graph and resolve every directive BEFORE any compute is spent — an invalid\n * topology or an unknown directive is a configuration fault, never a mid-run surprise. */\nfunction validateGraph(\n graph: AgentGraph,\n registry: PromptRegistry,\n analysts: AnalystRegistry | undefined,\n): ValidatedGraph {\n if (!Array.isArray(graph.nodes) || graph.nodes.length === 0) {\n throw new ValidationError('runGraph: graph.nodes must be a non-empty array')\n }\n if (!Array.isArray(graph.edges) || graph.edges.length === 0) {\n throw new ValidationError('runGraph: graph.edges must be a non-empty array')\n }\n if (typeof graph.deliverable?.check !== 'function') {\n throw new ValidationError('runGraph: graph.deliverable is mandatory (termination oracle)')\n }\n if (typeof graph.budget !== 'object' || graph.budget === null) {\n throw new ValidationError('runGraph: graph.budget is mandatory (the conserved pool)')\n }\n const byId = new Map<NodeId, GraphNode>()\n for (const node of graph.nodes) {\n if (typeof node.id !== 'string' || node.id.length === 0) {\n throw new ValidationError('runGraph: every node needs a non-empty string id')\n }\n if (byId.has(node.id)) throw new ValidationError(`runGraph: duplicate node id '${node.id}'`)\n const parsed = agentProfileSchema.safeParse(node.profile)\n if (!parsed.success) {\n throw new ValidationError(\n `runGraph: node '${node.id}' has an invalid AgentProfile: ${parsed.error.message}`,\n )\n }\n // The profile NAME is the node identity everywhere downstream: node pinning resolves a\n // spawn's `profile.name` against node ids, and the coordination layer matches analyst\n // routes (`over`/`to`) against the settled worker's PROFILE NAME. A divergent name would\n // make every analyzes edge touching this node silently never match — refuse it up front.\n if (node.profile.name !== node.id) {\n throw new ValidationError(\n `runGraph: node '${node.id}' has profile.name ${JSON.stringify(node.profile.name)} — ` +\n 'profile.name IS the node identity (node pinning and analyst routing match on it) and ' +\n 'must equal the node id',\n )\n }\n byId.set(node.id, node)\n }\n const requireNode = (id: NodeId, where: string): GraphNode => {\n const node = byId.get(id)\n if (!node) throw new ValidationError(`runGraph: ${where} references unknown node '${id}'`)\n return node\n }\n const delegates = graph.edges.filter(\n (edge): edge is Extract<GraphEdge, { kind: 'delegates' }> => edge.kind === 'delegates',\n )\n const analyzes = graph.edges.filter(\n (edge): edge is Extract<GraphEdge, { kind: 'analyzes' }> => edge.kind === 'analyzes',\n )\n if (delegates.length === 0) {\n throw new ValidationError('runGraph: at least one delegates edge is required (who spawns whom)')\n }\n for (const edge of graph.edges) registry.resolve(edge.directive)\n for (const edge of delegates) {\n requireNode(edge.from, edgeId(edge))\n requireNode(edge.to, edgeId(edge))\n if (edge.from === edge.to) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} delegates to itself — the driver↔worker cycle is the ` +\n 'settle-return loop, not a self-edge',\n )\n }\n // The type admits only 'fresh' | 'resume', but a graph is plain data that often arrives\n // through JSON — refuse a nonsense mode here, never let it reach the spawn tool as a string.\n if (\n edge.continuity !== undefined &&\n edge.continuity !== 'fresh' &&\n edge.continuity !== 'resume'\n ) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} has invalid continuity ${JSON.stringify(edge.continuity)} — ` +\n \"a delegates edge's continuity is 'fresh' or 'resume'\",\n )\n }\n }\n // Root: the one node that delegates and is never delegated TO. P0 executes the star/2-node\n // cyclic family (one driver, N workers); nested driver graphs are the recorded P3 absorption.\n const delegatedTo = new Set(delegates.map((edge) => edge.to))\n const roots = [...new Set(delegates.map((edge) => edge.from))].filter(\n (id) => !delegatedTo.has(id),\n )\n if (roots.length !== 1) {\n throw new ValidationError(\n `runGraph: expected exactly ONE root (a node that delegates and is never delegated to), ` +\n `found ${roots.length === 0 ? 'none — delegates edges form a cycle with no entry' : roots.join(', ')}. ` +\n 'P0 executes driver↔worker(s); nested driver graphs are P3.',\n )\n }\n const root = requireNode(roots[0] as string, 'root resolution')\n for (const edge of delegates) {\n if (edge.from !== root.id) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} delegates from a non-root node — P0 executes one driver over ` +\n 'its workers (the 2-node cyclic case, star-generalized); deeper delegation is P3',\n )\n }\n }\n const analystIds = new Set<string>()\n const analystNodes = new Map<NodeId, GraphNode>()\n for (const edge of analyzes) {\n // Continuity is a delegates-edge axis ONLY: analysts (lens or node) are spawned by the\n // analyst-on-settle machinery, each run a fresh session over settled evidence — an analyzes\n // edge carrying continuity would silently mean nothing, so it is refused as data.\n if ((edge as { continuity?: unknown }).continuity !== undefined) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} carries continuity — analysts are spawned by the analyst ` +\n 'machinery (every analyst run is a fresh session over settled evidence), so ' +\n 'continuity is a delegates-edge axis only',\n )\n }\n // The runner's traversal ledger resolves a finding/steer back to its edge BY ANALYST ID\n // alone, so a second edge sharing an analyst would silently absorb the first edge's\n // traversals (last-registered wins). Multi-edge-per-analyst is not yet supported; refuse it\n // rather than mis-ledger it.\n if (analystIds.has(edge.analyst)) {\n throw new ValidationError(\n `runGraph: two analyzes edges share analyst '${edge.analyst}' — one analyzes edge per ` +\n 'analyst lens (traversals are ledgered by analyst id; a second edge would silently ' +\n \"absorb the first's). Register the lens under a second id for a second edge.\",\n )\n }\n analystIds.add(edge.analyst)\n // The analyst REFERENCE has two forms — a registry lens id or a graph node id — and the id\n // itself is what distinguishes them, so an id living in both is refused as ambiguous rather\n // than silently resolved by precedence.\n const analystNode = byId.get(edge.analyst)\n const inRegistry = analysts?.kinds.some((kind) => kind.id === edge.analyst) === true\n if (analystNode !== undefined && inRegistry) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} analyst '${edge.analyst}' is BOTH a graph node and a lens in ` +\n 'the analysts registry — the id alone distinguishes the two analyst forms, so this is ' +\n 'ambiguous; rename the node or register the lens under another id',\n )\n }\n if (analystNode !== undefined) {\n // The analyst-AGENT form. Oracle doctrine holds structurally: the analyst node can never\n // receive work — not from the root (a delegates edge to it is refused) and not by being\n // the root (the root delegates by definition).\n if (analystNode.id === root.id) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} names the ROOT as its analyst — the root is the driver; ` +\n 'give the analyst its own node with no delegates edge pointing at it',\n )\n }\n if (delegatedTo.has(analystNode.id)) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} names node '${edge.analyst}' as its analyst, but that node ` +\n 'is a delegates target — oracle doctrine: an analyst is never delegated to. An ' +\n 'analyst NODE is legal only with NO delegates edge pointing at it; give the analyst ' +\n 'its own delegates-free node or pass a lens id from RunGraphOptions.analysts.',\n )\n }\n analystNodes.set(analystNode.id, analystNode)\n } else if (!analysts) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} analyst '${edge.analyst}' is not a graph node, and no ` +\n 'RunGraphOptions.analysts registry was provided to resolve it as a lens',\n )\n } else if (!inRegistry) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} analyst '${edge.analyst}' is neither a graph node nor in the ` +\n `analysts registry (known lenses: ${analysts.kinds.map((kind) => kind.id).join(', ') || 'none'})`,\n )\n }\n if (edge.over.length === 0) {\n throw new ValidationError(`runGraph: ${edgeId(edge)} must analyze at least one node`)\n }\n for (const over of edge.over) {\n requireNode(over, edgeId(edge))\n // Analysts observe SETTLED WORKERS, matched by profile name — the root drives and never\n // settles as a worker, so an edge over the root would silently never fire; refuse it.\n if (over === root.id) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} analyzes the ROOT — analysts observe settled workers, and ` +\n 'the root never settles as one, so this edge would silently never fire; list ' +\n 'delegates-target nodes only',\n )\n }\n }\n requireNode(edge.to, edgeId(edge))\n }\n // Second pass, once every analyst NODE is known: an analyst run's settlement is a FINDING,\n // never a worker settle, so an analyzes edge OVER an analyst node would silently never fire —\n // refuse it rather than let it rot unobserved.\n for (const edge of analyzes) {\n for (const over of edge.over) {\n if (analystNodes.has(over)) {\n throw new ValidationError(\n `runGraph: ${edgeId(edge)} analyzes '${over}', which is an analyst node — an analyst ` +\n 'run settles as a finding, never as a worker, so this edge would silently never ' +\n 'fire; analyst nodes are not analyzable',\n )\n }\n }\n }\n const workers = new Map<NodeId, GraphNode>()\n const delegatesByWorker = new Map<NodeId, Extract<GraphEdge, { kind: 'delegates' }>>()\n for (const edge of delegates) {\n if (delegatesByWorker.has(edge.to)) {\n throw new ValidationError(\n `runGraph: node '${edge.to}' is the target of two delegates edges — one delegation ` +\n 'directive per worker node (version the directive instead of forking the edge)',\n )\n }\n delegatesByWorker.set(edge.to, edge)\n workers.set(edge.to, requireNode(edge.to, edgeId(edge)))\n }\n // Every non-root node must be reachable by SOME edge, or it can never run. A worker node is\n // reached by its delegates edge; an analyst node by its analyzes edge (spawned on settle).\n for (const node of graph.nodes) {\n if (node.id !== root.id && !workers.has(node.id) && !analystNodes.has(node.id)) {\n throw new ValidationError(\n `runGraph: node '${node.id}' has no delegates edge to it — an unreachable node never runs`,\n )\n }\n }\n return { root, workers, delegatesByWorker, analyzes, analystNodes }\n}\n\n// ── The runner ─────────────────────────────────────────────────────────────────\n\nconst byteLength = (text: string): number => Buffer.byteLength(text, 'utf8')\n\nfunction stringifyPayload(payload: unknown): string {\n if (typeof payload === 'string') return payload\n try {\n return JSON.stringify(payload) ?? String(payload)\n } catch {\n return String(payload)\n }\n}\n\n/**\n * Execute an {@link AgentGraph}. The root node becomes the supervisor (`supervise()` — the\n * execution core), each worker node is spawnable BY NODE ID (`spawn_agent` with\n * `profile: { name: '<node id>' }`; the node's canonical profile is pinned by the graph), each\n * delegates directive is appended to the worker profile's `prompt.instructions` per traversal,\n * and each analyzes edge becomes an analyst-on-settle route with a real DESTINATION. Every\n * traversal is ledgered and journaled.\n */\nexport function runGraph(graph: AgentGraph, opts: RunGraphOptions): Promise<GraphResult> {\n const { brain, ...runtimeOptions } = opts\n return runGraphInternal(graph, runtimeOptions, brain)\n}\n\n/** Alias for graph tests written before `RunGraphOptions.brain` was production. The production\n * entry accepts the same shape; this wrapper only keeps the `/testing` import path working. */\nexport function runGraphWithTestBrain(\n graph: AgentGraph,\n opts: RunGraphTestOptions,\n): Promise<GraphResult> {\n const { brain, ...runtimeOptions } = opts\n return runGraphInternal(graph, runtimeOptions, brain)\n}\n\nfunction runGraphInternal(\n graph: AgentGraph,\n opts: RunGraphOptions,\n brain?: ToolLoopChat,\n): Promise<GraphResult> {\n const registry = opts.registry ?? kernelPromptRegistry()\n const { root, workers, delegatesByWorker, analyzes, analystNodes } = validateGraph(\n graph,\n registry,\n opts.analysts,\n )\n // A caller brain and a harness driver are two answers to WHO makes the root's calls: refuse\n // the contradiction before any compute, and refuse a harness-driven root outright — the\n // harness IS that root's brain, so a supplied one would be silently ignored downstream.\n if (brain && opts.driverBackend) {\n throw new ValidationError(\n 'runGraph: brain and driverBackend are mutually exclusive — a caller brain makes the root model calls, a driverBackend places a harness that makes its own',\n )\n }\n if (brain && harnessRunsAgent(root.profile.harness)) {\n throw new ValidationError(\n `runGraph: root node '${root.id}' declares harness '${root.profile.harness}', so the harness drives it — a caller brain applies only to a router-brained root (profile.harness omitted or 'cli-base')`,\n )\n }\n if (!opts.backend && !opts.makeWorkerAgent) {\n throw new ValidationError(\n 'runGraph: provide opts.backend (where nodes run) or opts.makeWorkerAgent',\n )\n }\n const journal = opts.journal ?? new InMemorySpawnJournal()\n const blobs = opts.blobs ?? new InMemoryResultBlobStore()\n const runId =\n opts.runId ??\n `graph-${canonicalCandidateDigest(graph.nodes.map((n) => n.id)).slice('sha256:'.length, 'sha256:'.length + 12)}`\n const now = opts.now ?? Date.now\n\n // ── Ledger state ──\n const ledger: EdgeTraversal[] = []\n const journaled = new Set<EdgeTraversal>()\n const traversalCounts = new Map<string, number>()\n const exhausted = new Set<string>()\n // The subset of `exhausted` that REFUSED work. Only a delegates cap closes the spawn cycle, so\n // only it can be the reason a run ended winnerless — an analyzes cap refuses nothing.\n const exhaustedDelegates = new Set<string>()\n const journalWrites: Promise<void>[] = []\n let ledgerSeq = 0\n const appendJournal = (entry: EdgeTraversal, nodeIdForEvent: string): Promise<void> => {\n if (journaled.has(entry)) return Promise.resolve()\n journaled.add(entry)\n const write = journal.appendEvent(runId, {\n kind: 'edge',\n id: nodeIdForEvent,\n edge: { kind: entry.kind, from: entry.from, to: entry.to, directive: entry.directive },\n traversal: entry.traversal,\n outcome: entry.outcome,\n continuity: entry.continuity,\n bytes: entry.bytes,\n ...(entry.reason !== undefined ? { reason: entry.reason } : {}),\n seq: ledgerSeq++,\n at: new Date(now()).toISOString(),\n })\n journalWrites.push(write)\n return write\n }\n const record = (entry: Omit<EdgeTraversal, 'traversal'>, journalNow: boolean): EdgeTraversal => {\n const count = (traversalCounts.get(entry.edge) ?? 0) + 1\n traversalCounts.set(entry.edge, count)\n const row: EdgeTraversal = { ...entry, traversal: count }\n ledger.push(row)\n if (journalNow) void appendJournal(row, row.workerId ?? `graph:${row.to}`)\n return row\n }\n\n // ── Node pinning + delegates spawn traversals (the makeWorkerAgent wrapper) ──\n const makeLeaf =\n opts.makeWorkerAgent ?? workerFromBackend(opts.backend as ExecutorConfig, graph.deliverable)\n const nodeByWorkerId = new Map<string, NodeId>()\n const pendingByAssignment = new Map<string, EdgeTraversal>()\n const graphWorker: MakeWorkerAgent = (authoredProfile, spawnContext) => {\n const requested =\n typeof (authoredProfile as { name?: unknown } | undefined)?.name === 'string'\n ? (authoredProfile as { name: string }).name\n : undefined\n // An analyst-AGENT run: the coordination settle hook — never the driver; the marker is\n // authored by the runtime, not accepted from model arguments — spawns the analyst NODE.\n // Pin the node's canonical profile; the analysis directive travels as the TASK (composed by\n // the coordination layer with the settled worker's trace evidence), so nothing is appended\n // to the profile's instructions here. Its traversal is ledgered on the finding/steer it\n // produces, exactly like a registry analyst's.\n if (spawnContext?.analyst !== undefined) {\n const analystNode = analystNodes.get(spawnContext.analyst)\n if (!analystNode || requested !== analystNode.id) {\n throw new ValidationError(\n `runGraph: analyst run for ${JSON.stringify(spawnContext.analyst)} does not name an ` +\n `analyst node of this graph (analyst nodes: ${[...analystNodes.keys()].join(', ') || 'none'})`,\n )\n }\n return makeLeaf(analystNode.profile, spawnContext)\n }\n const node = requested !== undefined ? workers.get(requested) : undefined\n if (!node) {\n throw new ValidationError(\n `runGraph: spawn_agent named profile ${JSON.stringify(requested)} which is not a worker ` +\n `node of this graph (nodes: ${[...workers.keys()].join(', ')}). Spawn by node id: ` +\n 'profile.name selects the node; the node profile itself is pinned by the graph.',\n )\n }\n const edge = delegatesByWorker.get(node.id) as Extract<GraphEdge, { kind: 'delegates' }>\n const id = edgeId(edge)\n const cap = edge.maxTraversals ?? defaultEdgeTraversalCap\n const used = traversalCounts.get(id) ?? 0\n // The EFFECTIVE spawn mode the coordination layer resolved (per-call override, else this\n // edge's declared default, else fresh) — stamped on the row so the ledger states how each\n // hop continued, never how it was merely configured to.\n const spawnContinuity = spawnContext?.continuity ?? 'fresh'\n if (used >= cap) {\n exhausted.add(id)\n exhaustedDelegates.add(id)\n record(\n {\n edge: id,\n kind: 'delegates',\n from: edge.from,\n to: edge.to,\n directive: formatPromptHandle(edge.directive),\n outcome: 'unpropagated',\n continuity: spawnContinuity,\n bytes: 0,\n reason: `traversal-cap-exhausted (max ${cap})`,\n },\n true,\n )\n throw new ValidationError(\n `runGraph: delegates edge ${id} exhausted its traversal cap (${cap}) — the ` +\n 'cyclic-graph backstop refused this spawn',\n )\n }\n const directiveText = registry.resolve(edge.directive).text\n const taskText = stringifyPayload(spawnContext?.task)\n const bytes = byteLength(directiveText) + byteLength(taskText)\n const row = record(\n {\n edge: id,\n kind: 'delegates',\n from: edge.from,\n to: edge.to,\n directive: formatPromptHandle(edge.directive),\n outcome: bytes === 0 ? 'empty' : 'delivered',\n continuity: spawnContinuity,\n bytes,\n ...(bytes === 0 ? { reason: 'no directive text and no task payload' } : {}),\n },\n false,\n )\n if (spawnContext?.assignmentId !== undefined) {\n pendingByAssignment.set(spawnContext.assignmentId, row)\n } else {\n void appendJournal(row, `graph:${row.to}`)\n }\n // The delegation directive is a STANDING instruction of this traversal: appended to the\n // node's canonical prompt instructions, so the worker runs under node profile + edge\n // directive, and the driver-authored profile contributes ONLY the node selection.\n const pinned: AgentProfile =\n directiveText.length === 0\n ? node.profile\n : {\n ...node.profile,\n prompt: {\n ...(node.profile.prompt ?? {}),\n instructions: [\n ...((node.profile.prompt?.instructions as readonly string[] | undefined) ?? []),\n directiveText,\n ],\n },\n }\n return makeLeaf(pinned, spawnContext)\n }\n\n // ── Analyzes edges → analyst-on-settle routes with destinations ──\n // A LENS edge's directive wraps the findings for the recipient (so a driver-destined lens\n // route carries no directive — it becomes the driver brief below). A NODE edge's directive is\n // the analyst AGENT's task, so it always rides the route, wherever the findings go.\n const routes: Array<string | AnalyzeOnSettleRoute> = analyzes.map((edge) => {\n const analystNode = analystNodes.get(edge.analyst)\n if (analystNode) {\n return {\n kind: edge.analyst,\n over: edge.over,\n agent: analystNode.profile,\n directive: registry.resolve(edge.directive).text,\n ...(edge.to === root.id ? {} : { to: edge.to }),\n }\n }\n return edge.to === root.id\n ? { kind: edge.analyst, over: edge.over }\n : {\n kind: edge.analyst,\n over: edge.over,\n to: edge.to,\n directive: registry.resolve(edge.directive).text,\n }\n })\n // Driver-destined analyzes findings are standing knowledge for the ROOT: the findings arrive\n // as bus events. For a lens edge the directive tells the driver what to do with them; for a\n // node edge the directive already went to the analyst agent as its task.\n const driverAnalyzesBriefs = analyzes\n .filter((edge) => edge.to === root.id)\n .map((edge) =>\n analystNodes.has(edge.analyst)\n ? `Findings from analyst '${edge.analyst}' (a tool-equipped analyst agent node, over: ` +\n `${edge.over.join(', ')}) will arrive as finding events.`\n : `Findings from analyst '${edge.analyst}' (over: ${edge.over.join(', ')}) will arrive as ` +\n `finding events.\\n${registry.resolve(edge.directive).text}`,\n )\n\n // ── Edge continuity defaults, threaded to the spawn tool by node id (= profile name) ──\n const continuityByProfile: Record<string, ContinuityMode> = {}\n for (const [nodeId, edge] of delegatesByWorker) {\n if (edge.continuity !== undefined) continuityByProfile[nodeId] = edge.continuity\n }\n\n // ── The driver graph brief: which nodes it may spawn, by exact name ──\n const workerLines = [...workers.values()].map((node) => {\n const edge = delegatesByWorker.get(node.id) as Extract<GraphEdge, { kind: 'delegates' }>\n const cap = edge.maxTraversals ?? defaultEdgeTraversalCap\n const description =\n typeof node.profile.description === 'string' && node.profile.description.length > 0\n ? ` — ${node.profile.description}`\n : ''\n const continuityNote =\n edge.continuity === 'resume'\n ? \"; continuity: resume — each spawn after the first re-attaches to this node's latest \" +\n 'settled session (spawn again to continue it; steer while it is live)'\n : ''\n return `- '${node.id}'${description} (delegation cap: ${cap} traversals${continuityNote})`\n })\n const graphBrief = [\n 'AGENT GRAPH: you are the driver node of a fixed topology. You may spawn ONLY these worker',\n \"nodes, by EXACT name (spawn_agent with profile: { name: '<node id>' }; the node's full\",\n 'profile is pinned by the graph — any other profile fields you author are ignored):',\n ...workerLines,\n ...(driverAnalyzesBriefs.length > 0 ? ['', ...driverAnalyzesBriefs] : []),\n ].join('\\n')\n const rootProfile: AgentProfile = {\n ...root.profile,\n prompt: {\n ...(root.profile.prompt ?? {}),\n instructions: [\n ...((root.profile.prompt?.instructions as readonly string[] | undefined) ?? []),\n graphBrief,\n ],\n },\n }\n\n // ── Steer + finding observation (delegates steers, analyzes traversals) ──\n // The filter seam: when the caller's authorizeMessage NARROWS an instruction, the delivered\n // bytes differ from the composed bytes — that steer traversal is `stripped` (the VB incident:\n // authored steering silently replaced by boilerplate, byte-indistinguishable downstream).\n const strippedByDigest = new Map<string, { composedBytes: number }>()\n const authorizeMessage: SuperviseOptions['authorizeMessage'] | undefined = opts.authorizeMessage\n ? (input) => {\n const decision = (\n opts.authorizeMessage as NonNullable<SuperviseOptions['authorizeMessage']>\n )(input)\n if (decision.instruction !== input.instruction) {\n strippedByDigest.set(canonicalCandidateDigest(decision.instruction), {\n composedBytes: byteLength(input.instruction),\n })\n }\n return decision\n }\n : undefined\n\n const routedAnalyzesByAnalyst = new Map<string, Extract<GraphEdge, { kind: 'analyzes' }>>()\n const driverAnalyzesByAnalyst = new Map<string, Extract<GraphEdge, { kind: 'analyzes' }>>()\n for (const edge of analyzes) {\n ;(edge.to === root.id ? driverAnalyzesByAnalyst : routedAnalyzesByAnalyst).set(\n edge.analyst,\n edge,\n )\n }\n const analyzesCapReached = (edge: Extract<GraphEdge, { kind: 'analyzes' }>): boolean => {\n const cap = edge.maxTraversals ?? defaultEdgeTraversalCap\n const used = traversalCounts.get(edgeId(edge)) ?? 0\n if (used < cap) return false\n exhausted.add(edgeId(edge))\n return true\n }\n const ledgerAnalyzes = (\n edge: Extract<GraphEdge, { kind: 'analyzes' }>,\n outcome: EdgeDeliveryOutcome,\n bytes: number,\n reason: string | undefined,\n workerId: string | undefined,\n ): void => {\n const capped = analyzesCapReached(edge)\n record(\n {\n edge: edgeId(edge),\n kind: 'analyzes',\n from: edge.over.join('+'),\n to: edge.to,\n directive: formatPromptHandle(edge.directive),\n outcome: capped ? 'unpropagated' : outcome,\n // Every analyzes traversal is a mid-run delivery into an already-live recipient (a\n // routed steer leg, or the finding reaching the live driver) — never a spawn.\n continuity: 'steer',\n bytes,\n ...(capped\n ? {\n reason: `traversal-cap-exhausted (max ${edge.maxTraversals ?? defaultEdgeTraversalCap})`,\n }\n : reason !== undefined\n ? { reason }\n : {}),\n ...(workerId !== undefined ? { workerId } : {}),\n },\n true,\n )\n }\n\n const onCoordinationEvent = async (\n _context: unknown,\n _eventId: unknown,\n recordEnvelope: { readonly event: CoordinationEvent },\n ): Promise<void> => {\n const event = recordEnvelope.event\n if (event.type === 'finding') {\n // A routed edge's traversal is ledgered on its STEER (the delivery); the finding event is\n // its audit copy. A driver-destined edge's traversal IS the finding reaching the bus.\n const edge = driverAnalyzesByAnalyst.get(event.finding.analyst)\n if (!edge) return\n const sourceNode = nodeByWorkerId.get(event.finding.fromWorker)\n if (sourceNode === undefined || !edge.over.includes(sourceNode)) return\n // Absent findings (the analyst returned `undefined` — the producer omits the key so the\n // event stays digestable) contribute ZERO bytes, never the text \"undefined\".\n const findingsText =\n event.finding.findings === undefined ? '' : stringifyPayload(event.finding.findings)\n const directiveBytes = byteLength(registry.resolve(edge.directive).text)\n const empty = findingsText.length === 0\n ledgerAnalyzes(\n edge,\n empty ? 'empty' : 'delivered',\n directiveBytes + byteLength(findingsText),\n empty ? 'analyst returned no findings' : undefined,\n event.finding.fromWorker,\n )\n return\n }\n if (event.type === 'steer') {\n const down = event.down\n if (event.analyst !== undefined) {\n const edge = routedAnalyzesByAnalyst.get(event.analyst)\n if (!edge) return\n ledgerAnalyzes(\n edge,\n down.delivered ? 'delivered' : 'unpropagated',\n byteLength(down.instruction),\n down.delivered ? undefined : down.outcome,\n down.toWorker,\n )\n return\n }\n // A driver-authored steer to a live worker node is a delegates traversal too — the\n // mid-run leg of the same edge (the leg the motivating incident lost).\n const nodeId = nodeByWorkerId.get(down.toWorker)\n if (nodeId === undefined) return\n const edge = delegatesByWorker.get(nodeId)\n if (!edge) return\n const stripped = strippedByDigest.get(down.instructionDigest)\n record(\n {\n edge: edgeId(edge),\n kind: 'delegates',\n from: edge.from,\n to: edge.to,\n directive: formatPromptHandle(edge.directive),\n outcome: !down.delivered ? 'unpropagated' : stripped ? 'stripped' : 'delivered',\n // The mid-run leg of the edge: a delivery into the LIVE worker, never a spawn.\n continuity: 'steer',\n bytes: byteLength(down.instruction),\n ...(!down.delivered\n ? { reason: down.outcome }\n : stripped\n ? { reason: `authorization narrowed ${stripped.composedBytes} composed bytes` }\n : {}),\n workerId: down.toWorker,\n },\n true,\n )\n }\n }\n\n // ── Spawn-hook: bind ledger rows to concrete worker ids, then journal them ──\n const graphHooks = {\n onEvent: (event: {\n target?: string\n phase?: string\n payload?: unknown\n }): void | Promise<void> => {\n if (event.target !== 'agent.spawn' || event.phase !== 'after') return\n const payload = event.payload as { childId?: unknown; assignmentId?: unknown } | undefined\n if (typeof payload?.childId !== 'string' || typeof payload.assignmentId !== 'string') return\n const pending = pendingByAssignment.get(payload.assignmentId)\n if (!pending) return\n pendingByAssignment.delete(payload.assignmentId)\n const bound: EdgeTraversal = { ...pending, workerId: payload.childId }\n ledger[ledger.indexOf(pending)] = bound\n nodeByWorkerId.set(payload.childId, bound.to)\n return appendJournal(bound, payload.childId)\n },\n }\n const hooks = composeRuntimeHooks(graphHooks, opts.hooks)\n\n // Every configuration fault above throws SYNCHRONOUSLY (matching `supervise()`'s own\n // contract); only the run itself is asynchronous.\n const start = async (): Promise<GraphResult> => {\n const superviseOptions = {\n budget: graph.budget,\n deliverable: graph.deliverable,\n makeWorkerAgent: graphWorker,\n journal,\n blobs,\n runId,\n hooks,\n onCoordinationEvent,\n // Lens routes resolve against the registry; agent routes carry their own analyst profile,\n // so a graph whose only analysts are nodes needs no registry at all.\n ...(routes.length > 0\n ? { analyzeOnSettle: routes, ...(opts.analysts ? { analysts: opts.analysts } : {}) }\n : {}),\n ...(Object.keys(continuityByProfile).length > 0 ? { continuityByProfile } : {}),\n ...(opts.watchWorkers ? { watchWorkers: opts.watchWorkers } : {}),\n ...(opts.router ? { router: opts.router } : {}),\n // The root's harness driver. `backend` is NOT forwarded: it already became the worker seam\n // (`makeWorkerAgent` above), so the root driver is an explicit choice, never a side effect\n // of where workers run.\n ...(opts.driverBackend ? { driverBackend: opts.driverBackend } : {}),\n ...(opts.resolveSupervisorTools\n ? { resolveSupervisorTools: opts.resolveSupervisorTools }\n : {}),\n ...(authorizeMessage ? { authorizeMessage } : {}),\n ...(opts.perWorker ? { perWorker: opts.perWorker } : {}),\n ...(opts.maxTurns !== undefined ? { maxTurns: opts.maxTurns } : {}),\n ...(opts.maxLiveWorkers !== undefined ? { maxLiveWorkers: opts.maxLiveWorkers } : {}),\n ...(opts.signal ? { signal: opts.signal } : {}),\n ...(opts.now ? { now: opts.now } : {}),\n ...(opts.otel ? { otel: opts.otel } : {}),\n ...(opts.stallAfterMs !== undefined ? { stallAfterMs: opts.stallAfterMs } : {}),\n ...(opts.allowedModels ? { allowedModels: opts.allowedModels } : {}),\n } satisfies SuperviseOptions\n const result =\n brain === undefined\n ? await supervise(rootProfile, graphTask(graph, root), superviseOptions)\n : await superviseWithTestBrain(rootProfile, graphTask(graph, root), {\n ...superviseOptions,\n brain,\n })\n\n // A spawn row is PROVISIONAL until the `agent.spawn` hook (fired synchronously once a worker\n // exists) binds it to a live worker id. A row still unbound here means the factory ran but no\n // NEW worker went live: the spawn was refused after the factory (identity conflict, runtime\n // floor) or a keyed re-spawn deduplicated to an already-completed result (prepare() runs the\n // factory, no hook fires). Both state the same truth every unpropagated row states — the\n // directive never reached a live worker — so rewrite rather than mint a new outcome. Then\n // settle every journal write, so the ledger's journal twin is complete when this returns.\n for (const pending of pendingByAssignment.values()) {\n const refused: EdgeTraversal = {\n ...pending,\n outcome: 'unpropagated',\n bytes: 0,\n reason: `no-live-worker-bound (spawn refused after the factory, or a keyed re-spawn deduplicated to a completed result; ${pending.bytes} composed bytes never crossed)`,\n }\n ledger[ledger.indexOf(pending)] = refused\n await appendJournal(refused, `graph:${refused.to}`)\n }\n pendingByAssignment.clear()\n await Promise.all(journalWrites)\n\n const exhaustedEdges = Object.freeze([...exhausted])\n const frozenLedger = Object.freeze(ledger.map((row) => Object.freeze({ ...row })))\n // A LIFECYCLE ending (caller abort, exhausted budget) is its own complete explanation: the\n // cap did not end that run even when it was exhausted along the way, and blaming it would\n // misattribute the ending (and turn a caller-initiated abort into a throw). The exhaustion\n // stays observable in `exhaustedEdges` either way.\n const lifecycleEnded =\n result.kind === 'no-winner' &&\n (result.reason === 'aborted' || result.reason === 'budget-exhausted')\n if (result.kind !== 'winner' && !lifecycleEnded && exhaustedDelegates.size > 0) {\n // Fail LOUD: the backstop, not the task, ended this run. The evidence rides on the error.\n // Only DELEGATES caps refuse spawns, so only they can be the cause named here.\n throw new GraphEdgeCapError(Object.freeze([...exhaustedDelegates]), frozenLedger, result)\n }\n return { result, ledger: frozenLedger, exhaustedEdges, runId }\n }\n\n return start()\n}\n\n/** The root task: the graph's own framing. The deliverable (mandatory) is the termination; the\n * task names what the topology exists to produce. */\nfunction graphTask(graph: AgentGraph, root: GraphNode): string {\n const describe = graph.deliverable.describe\n return (\n describe ?? `Deliver the graph's deliverable by driving your worker nodes (root: '${root.id}').`\n )\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"structural-rollout-Cj58xALQ.js","names":[],"sources":["../src/improvement/optimizer-prompt.ts","../src/runtime/profile-chat-client.ts","../src/runtime/observe.ts","../src/runtime/strategy.ts","../src/runtime/structural-rollout.ts"],"sourcesContent":["/**\n * The senior scientific-method optimizer doctrine — the ONE substantial prompt\n * core shared by every builder/author surface (tool build, MCP build, codebase\n * improvement, and strategy authoring).\n *\n * Seeded from the proven senior prompts rather than invented: GEPA's\n * `REFLECTION_SYSTEM` (localize → diagnose → minimal generalizable fix →\n * preserve what works), the /evolve loop (one hypothesis with a mechanism and a\n * falsifiable prediction; attack the largest measured gap first), /pursue (one\n * coherent change set, no partial scaffolding), and the self-improving-loop /\n * supervisor doctrine (a keep is decided by a real check, never by the author;\n * observe → rate → decide). Generalized from \"mutate a prompt string\" to\n * \"build a code surface a held-out measurement will grade\".\n */\n\n/**\n * The shared method block every build/author prompt embeds. Domain framing\n * (what a tool/MCP/codebase-edit deliverable looks like) wraps around it; this\n * is the process itself.\n */\nexport const optimizerMethod = [\n 'THE METHOD — you are a senior engineer-scientist improving a measured system, not a code',\n 'generator. Your change is an experiment: it exists to move a real, externally graded number,',\n 'and it will be measured against a baseline on held-out tasks you cannot see. Work in this order:',\n '',\n '1. DIAGNOSE FIRST. Read every finding before touching anything — findings are ranked evidence',\n ' from real failed runs. Name the DOMINANT failure mode (the single mechanism behind the',\n ' largest share of failures) in one sentence. Attack that first; leave long-tail noise until',\n ' the dominant mode is closed. A fix aimed at the wrong mechanism measures zero however clean',\n ' the code is.',\n '2. STATE A HYPOTHESIS WITH A PREDICTED LIFT. Before designing, write down: \"failures like X',\n ' happen because MECHANISM; this change interrupts that mechanism; I predict it addresses',\n ' roughly N of the M findings shown.\" A change you cannot connect to a mechanism is a guess,',\n ' not an experiment.',\n '3. DECOMPOSE INTO SUB-GOALS. Break the work into steps that are each independently checkable',\n ' (it compiles, a test passes, the server answers). Sequence them so the riskiest assumption',\n ' is tested first — if the hypothesis is wrong, find out on step 1, not step 5.',\n '4. DESIGN TO ISOLATE THE MECHANISM. Make the smallest COHERENT change that fully tests the',\n ' hypothesis: small enough that a measured lift is attributable to this change alone, complete',\n ' enough that it actually fires on the real execution path (a lever that exists but never',\n ' fires measures zero). No drive-by refactors, no unrelated cleanup, no speculative scope —',\n ' anything changed alongside confounds the measurement.',\n '5. GENERALIZE, NEVER MEMORIZE. Fix the failure CLASS, not the shown instances: encode rules and',\n ' logic that transfer to unseen tasks. A patch memorized to the quoted examples will not',\n ' survive the held-out measurement — that is overfitting, and the gate will catch it.',\n '6. PRESERVE WHAT WORKS. The baseline already passes tasks; do not delete or weaken the behavior',\n ' those passes depend on. A fix that trades one failure class for a new one measures as noise.',\n '7. VERIFY FOR REAL, THEN REFLECT. Run the verification you were given and make it genuinely',\n ' pass — never weaken a check, stub the thing it exercises, or special-case its inputs; a',\n ' gamed check delivers nothing because promotion is decided by a separate measurement you',\n ' never see. Then record briefly: what you predicted, what the verifier actually showed, and',\n ' what you would try next if the measured lift comes back null.',\n].join('\\n')\n\n/**\n * The senior authoring process for `authorStrategy` — the same method, shaped\n * to the strategy contract (author-blind, conserved budget, one module out).\n */\nexport const strategyAuthorMethod = [\n 'Work as a senior researcher, in this order:',\n '1. DIAGNOSE: read the per-task losses above and name the DOMINANT failure mode in one sentence',\n ' — the single mechanism behind the largest share of lost score (e.g. first attempts near-miss',\n ' and never get corrected; fresh retries discard progress; one persona plateaus).',\n '2. HYPOTHESIS + PREDICTED LIFT: state \"these losses happen because MECHANISM; the composition',\n ' below interrupts it; I predict roughly +N on this environment at the same budget.\"',\n '3. DESIGN TO ISOLATE THE MECHANISM: change ONE coordination mechanism relative to the baselines',\n ' (carry vs fresh, where the critique lands, a persona split, a tool restriction) so any',\n ' measured lift is attributable to it. Do not stack three clever ideas — a tangled win teaches',\n ' nothing and a tangled loss cannot be debugged.',\n '4. DECOMPOSE THE BUDGET: plan how the shots divide across explore / attempt / critique / repair',\n ' before writing code, and spend the whole budget — an early stop on a mid score is a loss.',\n '5. GENERALIZE: the strategy runs on unseen tasks from this environment. Read tools via',\n ' listTools(handle), never hardcode task specifics from the losses shown.',\n '6. PREDICT, THEN REFLECT: put the hypothesis, the mechanism, and the predicted lift in a',\n ' comment at the top of the module — the holdout verdict will be read against it.',\n].join('\\n')\n","import type {\n ChatClient,\n ChatRequest,\n ChatResponse,\n CostReceiptInput,\n CustomTokenPricing,\n} from '@tangle-network/agent-eval'\nimport { costForTokenPricing } from '@tangle-network/agent-eval'\nimport type {\n ExternalOptimizerModelCall,\n ExternalOptimizerModelCallRequest,\n} from '@tangle-network/agent-eval/campaign'\nimport {\n type AgentProfile,\n agentProfileSchema,\n canonicalAgentProfileDigest,\n canonicalCandidateDigest,\n} from '@tangle-network/agent-interface'\nimport { observedModelMatchesDeclared } from './model-identity'\nimport { type CollectedAgentTurn, collectAgentTurn, streamAgentTurn } from './stream-agent-turn'\nimport { executableAgentProfileSnapshot } from './supervise/executable-spec'\nimport {\n concreteModelId,\n enforceTokenLimits,\n type ProfileModelExecutionSettings,\n profileModelExecutionSettings,\n} from './supervise/model-policy'\nimport {\n captureReusableExecutorConfig,\n createExecutor,\n type ExecutorConfig,\n} from './supervise/runtime'\n\n/** Profile-exact adapter for packages that consume agent-eval's ChatClient contract.\n * Every call still enters Runtime through createExecutor -> streamAgentTurn, and every\n * behavioral field is checked against the exact AgentProfile before any transport runs. */\nexport function profileChatClient(args: {\n profile: AgentProfile\n executor: ExecutorConfig\n context: string\n}): ChatClient {\n const binding = bindProfileChat(args)\n\n return {\n transport: 'custom',\n defaultModel: binding.model,\n ...(binding.settings.retry?.maxAttempts !== undefined\n ? { maximumAttempts: binding.settings.retry.maxAttempts }\n : {}),\n async chat(req, callOpts) {\n const run = await runBoundProfileChat(binding, req, callOpts)\n if (!run.succeeded) throw new Error(run.error)\n return run.response\n },\n }\n}\n\n/** Profile-exact adapter for agent-eval's external optimizer callback.\n * Eval validates and freezes the provider-neutral request; Runtime owns the exact\n * AgentProfile, execution route, retries, usage, and finite execution evidence. */\nexport function profileOptimizerModelCall(args: {\n profile: AgentProfile\n executor: ExecutorConfig\n context: string\n pricing?: CustomTokenPricing\n}): ExternalOptimizerModelCall {\n const binding = bindProfileChat(args)\n const profileDigest = canonicalAgentProfileDigest(binding.profile)\n\n return async (request) => {\n const requestDigest = canonicalCandidateDigest({\n callId: request.callId,\n request: request.request,\n endpointFormat: request.endpointFormat ?? null,\n })\n let run: ProfileChatRun\n try {\n run = await runBoundProfileChat(binding, structuredClone(request.request) as ChatRequest, {\n signal: request.signal,\n idempotencyKey: request.callId,\n correlationId: request.callId,\n })\n } catch (error) {\n return {\n succeeded: false,\n error: errorMessage(error),\n receipt: unknownOptimizerReceipt(binding.model),\n execution: {\n kind: 'agent-runtime-profile-model-call',\n profileDigest,\n requestDigest,\n callId: request.callId,\n endpointFormat: request.endpointFormat ?? null,\n executed: false,\n error: errorMessage(error),\n },\n }\n }\n const execution = optimizerExecution(profileDigest, requestDigest, request, run)\n const receiptModel = optimizerReceiptModel(binding.model, run)\n try {\n const receipt = optimizerReceipt(receiptModel, run, args.pricing)\n return run.succeeded\n ? {\n succeeded: true,\n response: { ...run.response, costUsd: optimizerResponseCostUsd(receipt) },\n receipt,\n execution,\n }\n : { succeeded: false, error: run.error, receipt, execution }\n } catch (error) {\n const message = `profile optimizer receipt normalization failed after execution: ${errorMessage(error)}`\n return {\n succeeded: false,\n error: message,\n receipt: rawOptimizerReceipt(receiptModel, run, args.pricing),\n execution: {\n ...execution,\n succeeded: false,\n postCallError: message,\n },\n }\n }\n }\n}\n\ninterface BoundProfileChat {\n readonly profile: AgentProfile\n readonly executor: ExecutorConfig\n readonly context: string\n readonly model: string\n readonly settings: ProfileModelExecutionSettings\n}\n\nexport type ProfileChatRun =\n | { readonly succeeded: true; readonly response: ChatResponse; readonly turn: CollectedAgentTurn }\n | { readonly succeeded: false; readonly error: string; readonly turn: CollectedAgentTurn }\n\nexport function bindProfileChat(args: {\n profile: AgentProfile\n executor: ExecutorConfig\n context: string\n}): BoundProfileChat {\n const profile = executableAgentProfileSnapshot(args.profile, args.context)\n const model = concreteModelId(profile.model?.default)\n if (!model) throw new Error(`${args.context}: AgentProfile.model.default must be concrete`)\n return {\n profile,\n executor: captureReusableExecutorConfig(args.executor, args.context),\n context: args.context,\n model,\n settings: profileModelExecutionSettings(profile, args.context),\n }\n}\n\nexport async function runBoundProfileChat(\n binding: BoundProfileChat,\n req: ChatRequest,\n callOpts?: Parameters<ChatClient['chat']>[1],\n): Promise<ProfileChatRun> {\n assertProfileChatRequest(\n req,\n binding.model,\n binding.profile.model?.reasoningEffort,\n binding.settings,\n binding.context,\n )\n assertSupportedChatCallOptions(callOpts, binding.context)\n const turnProfile = responseProfile(binding.profile, req, binding.context)\n const startedAt = performance.now()\n const turn = await collectAgentTurn(\n streamAgentTurn(\n {\n kind: 'executor',\n profile: turnProfile,\n factory: createExecutor(binding.executor),\n },\n {\n providerOptions: {\n messages: req.messages,\n },\n },\n {\n ...(req.timeoutMs !== undefined ? { timeoutMs: req.timeoutMs } : {}),\n ...(callOpts?.signal ? { signal: callOpts.signal } : {}),\n ...(callOpts?.idempotencyKey ? { callId: callOpts.idempotencyKey } : {}),\n ...(callOpts?.correlationId ? { correlationId: callOpts.correlationId } : {}),\n },\n ),\n )\n if (turn.status !== 'completed') {\n return {\n succeeded: false,\n error: `${binding.context} failed: ${turn.error?.message ?? turn.status}`,\n turn,\n }\n }\n const observedModel = turn.usage.model\n if (observedModel === undefined) {\n return {\n succeeded: false,\n error: `${binding.context}: Runtime turn did not report the model actually used; refusing to label the response with the requested model`,\n turn,\n }\n }\n if (!observedModelMatchesDeclared(observedModel, binding.model)) {\n return {\n succeeded: false,\n error: `${binding.context}: Runtime reported model ${JSON.stringify(observedModel)} but AgentProfile requires ${JSON.stringify(binding.model)}`,\n turn,\n }\n }\n const resultOut = turn.output as\n | { finishReason?: string; system_fingerprint?: unknown }\n | undefined\n const promptTokens = turn.usage.input\n const completionTokens = turn.usage.output\n return {\n succeeded: true,\n turn,\n response: {\n content: turn.finalText,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n ...(turn.usage.tokensKnown === false ? { captured: false } : {}),\n ...(typeof turn.usage.promptCache?.readTokens === 'number'\n ? { cachedPromptTokens: turn.usage.promptCache.readTokens }\n : {}),\n ...(turn.usage.reasoningTokens !== undefined\n ? { reasoningTokens: turn.usage.reasoningTokens }\n : {}),\n },\n // ChatResponse.costUsd is provider-billed spend only. Runtime keeps catalog estimates in\n // `raw.estimatedCostUsd` and marks the billed channel unknown when no receipt arrived.\n costUsd:\n turn.usage.usdKnown === false || turn.usage.costUsd === undefined\n ? null\n : turn.usage.costUsd,\n model: observedModel,\n durationMs: terminalDurationMs(turn.events, performance.now() - startedAt),\n finishReason: resultOut?.finishReason ?? null,\n contentEmpty: turn.finalText.trim().length === 0,\n raw: {\n ...(turn.usage.estimatedCostUsd !== undefined\n ? { estimatedCostUsd: turn.usage.estimatedCostUsd }\n : {}),\n ...(turn.usage.promptCache ? { promptCache: turn.usage.promptCache } : {}),\n ...(turn.transportAttempts !== undefined\n ? { transportAttempts: turn.transportAttempts }\n : {}),\n ...(typeof resultOut?.system_fingerprint === 'string'\n ? { systemFingerprint: resultOut.system_fingerprint }\n : {}),\n },\n },\n }\n}\n\n/** @internal Exported for the adapter's fail-honest duration contract test. */\nexport function terminalDurationMs(\n events: ReadonlyArray<{ type: string; metadata?: Record<string, unknown> }>,\n measuredWallMs: number,\n): number {\n const final = events.at(-1)?.metadata?.timing\n if (final && typeof final === 'object') {\n const duration = (final as Record<string, unknown>).durationMs\n if (typeof duration === 'number' && Number.isFinite(duration) && duration >= 0) return duration\n }\n if (Number.isFinite(measuredWallMs) && measuredWallMs >= 0) return measuredWallMs\n throw new Error('profileChatClient: measured wall duration must be a finite non-negative number')\n}\n\nfunction assertSupportedChatCallOptions(\n opts: Parameters<ChatClient['chat']>[1],\n context: string,\n): void {\n if (opts?.maxCostUsd !== undefined) {\n throw new Error(\n `${context}: maxCostUsd is not enforced by Runtime's exact turn path; refusing to treat it as a limit`,\n )\n }\n}\n\nfunction responseProfile(profile: AgentProfile, req: ChatRequest, context: string): AgentProfile {\n const responseFormat = req.jsonSchema\n ? { type: 'json_schema', json_schema: req.jsonSchema }\n : req.jsonMode\n ? { type: 'json_object' }\n : undefined\n if (!responseFormat) return profile\n const existing = profile.model?.metadata?.extraBody\n if (\n existing !== undefined &&\n (typeof existing !== 'object' || existing === null || Array.isArray(existing))\n ) {\n throw new Error(`${context}: AgentProfile.model.metadata.extraBody must be an object`)\n }\n const existingFormat = (existing as Record<string, unknown> | undefined)?.response_format\n if (\n existingFormat !== undefined &&\n JSON.stringify(existingFormat) !== JSON.stringify(responseFormat)\n ) {\n throw new Error(`${context}: requested response format conflicts with AgentProfile`)\n }\n return agentProfileSchema.parse({\n ...profile,\n model: {\n ...profile.model,\n metadata: {\n ...(profile.model?.metadata ?? {}),\n extraBody: {\n ...(existing as Record<string, unknown> | undefined),\n response_format: responseFormat,\n },\n },\n },\n })\n}\n\nfunction assertProfileChatRequest(\n req: ChatRequest,\n model: string,\n reasoningEffort: NonNullable<AgentProfile['model']>['reasoningEffort'],\n settings: ProfileModelExecutionSettings,\n context: string,\n): void {\n if (req.model !== undefined && req.model !== model) {\n throw new Error(\n `${context}: request model ${JSON.stringify(req.model)} conflicts with AgentProfile model ${JSON.stringify(model)}`,\n )\n }\n if (req.temperature !== undefined && req.temperature !== settings.temperature) {\n throw new Error(`${context}: request temperature conflicts with AgentProfile model metadata`)\n }\n if (req.maxTokens !== undefined) {\n // Eval callers may restate the profile's ceiling, never widen or narrow it. The comparison is\n // against the visible ceiling the router path actually sends as `max_tokens`.\n const applied = enforceTokenLimits(settings.tokenLimits, 'router', context).applied\n if (req.maxTokens !== applied.maxTokens) {\n throw new Error(\n `${context}: request maxTokens ${req.maxTokens} conflicts with AgentProfile.model.maxVisibleOutputTokens ${applied.maxTokens ?? 'unset'}`,\n )\n }\n }\n if (req.thinking !== undefined) {\n const expected =\n reasoningEffort === undefined\n ? undefined\n : reasoningEffort === 'none'\n ? 'disabled'\n : 'enabled'\n if (req.thinking !== expected) {\n throw new Error(\n `${context}: request thinking conflicts with AgentProfile.model.reasoningEffort`,\n )\n }\n }\n}\n\n/**\n * Which dollar fact a receipt carries, in the one order that never presents an estimate as a\n * measurement: a provider receipt, else this runtime's own estimate, else the catalog rate the\n * caller supplied, else an explicit refusal to state a cost.\n *\n * `pricing` is deliberately withheld on the unknown-usage path. A per-token rate applied to the\n * zero token counts that path reports would produce a fabricated `$0`, which is the one thing\n * `costUnknown` exists to prevent.\n */\nfunction costAttribution(\n usage: ProfileChatRun['turn']['usage'],\n pricing: CustomTokenPricing | undefined,\n): Pick<\n CostReceiptInput,\n 'actualCostUsd' | 'estimatedCostUsd' | 'customTokenPricing' | 'costUnknown'\n> {\n const actualCostUsd = usage.usdKnown === false ? undefined : usage.costUsd\n if (actualCostUsd !== undefined) return { actualCostUsd }\n if (usage.estimatedCostUsd !== undefined) return { estimatedCostUsd: usage.estimatedCostUsd }\n if (pricing) return { customTokenPricing: pricing }\n return { costUnknown: true }\n}\n\nfunction optimizerReceipt(\n model: string,\n run: ProfileChatRun,\n pricing: CustomTokenPricing | undefined,\n): CostReceiptInput {\n const usage = run.turn.usage\n if (usage.tokensKnown === false) {\n return {\n // The receipt model is the served identity when Runtime observed one. Eval and the response\n // must carry the same identity, while this branch still preserves unknown token usage.\n model,\n inputTokens: 0,\n outputTokens: 0,\n usageUnknown: true,\n ...costAttribution(usage, undefined),\n }\n }\n const cachedTokens = optimizerTokenCount(usage.promptCache?.readTokens, 'cache read tokens')\n const cacheWriteTokens = optimizerTokenCount(usage.promptCache?.writeTokens, 'cache write tokens')\n const classified = (cachedTokens ?? 0) + (cacheWriteTokens ?? 0)\n if (classified > usage.input) {\n throw new Error('profile optimizer cache classes exceed total input tokens')\n }\n return {\n model,\n inputTokens: usage.input - classified,\n outputTokens: usage.output,\n ...(cachedTokens !== undefined ? { cachedTokens } : {}),\n ...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {}),\n ...(usage.reasoningTokens !== undefined ? { reasoningTokens: usage.reasoningTokens } : {}),\n ...costAttribution(usage, pricing),\n }\n}\n\n/** Preserve the observed call totals when finer receipt classification is inconsistent. */\nfunction rawOptimizerReceipt(\n model: string,\n run: ProfileChatRun,\n pricing: CustomTokenPricing | undefined,\n): CostReceiptInput {\n const usage = run.turn.usage\n const tokensKnown = usage.tokensKnown !== false\n return {\n model,\n inputTokens: tokensKnown ? usage.input : 0,\n outputTokens: tokensKnown ? usage.output : 0,\n ...(tokensKnown ? {} : { usageUnknown: true }),\n ...(usage.reasoningTokens !== undefined ? { reasoningTokens: usage.reasoningTokens } : {}),\n ...costAttribution(usage, pricing),\n }\n}\n\nfunction optimizerReceiptModel(model: string, run: ProfileChatRun): string {\n const observedModel = run.succeeded ? run.response.model : run.turn.usage.model\n return observedModel !== undefined && observedModelMatchesDeclared(observedModel, model)\n ? observedModel\n : model\n}\n\nfunction optimizerExecution(\n profileDigest: string,\n requestDigest: string,\n request: ExternalOptimizerModelCallRequest,\n run: ProfileChatRun,\n): Record<string, unknown> {\n return {\n kind: 'agent-runtime-profile-model-call',\n profileDigest,\n requestDigest,\n callId: request.callId,\n endpointFormat: request.endpointFormat ?? null,\n executed: true,\n succeeded: run.succeeded,\n status: run.turn.status,\n model: run.turn.usage.model ?? null,\n transportAttempts: run.turn.transportAttempts ?? null,\n eventTypes: run.turn.events.map((event) => event.type),\n }\n}\n\nfunction unknownOptimizerReceipt(model: string): CostReceiptInput {\n return {\n model,\n inputTokens: 0,\n outputTokens: 0,\n usageUnknown: true,\n costUnknown: true,\n }\n}\n\nfunction optimizerResponseCostUsd(receipt: CostReceiptInput): number | null {\n if (receipt.actualCostUsd !== undefined) return receipt.actualCostUsd\n if (receipt.estimatedCostUsd !== undefined) return receipt.estimatedCostUsd\n if (receipt.customTokenPricing !== undefined && receipt.usageUnknown !== true) {\n return costForTokenPricing(receipt.customTokenPricing, receipt)\n }\n return null\n}\n\nfunction optimizerTokenCount(value: unknown, label: string): number | undefined {\n if (value === undefined) return undefined\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n throw new Error(`profile optimizer ${label} must be a non-negative integer`)\n }\n return value as number\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","/**\n * The third-person observer — the connective tissue that closes the loop.\n *\n * A driver spawns a worker; the worker can't see itself. `observe` reads the\n * worker's TRACE (what it actually did — every tool call, cost, failure) and\n * produces two streams:\n * - `findings` / `report` — fed back DOWN (a steer for the next attempt) and\n * OUT (the operator-facing \"what I noticed + what to change\").\n * - `learned` — durable facts written to the cross-run `Corpus` so the NEXT\n * run starts smarter (the continuous half of \"continuous self-improvement\").\n *\n * Findings are production observations (`proposal_origin:'production'`) and\n * never come from final evaluation (`derived_from_judge:false`). The observer is harness-agnostic: it\n * reads a trace + an output, so it watches opencode, codex, hermes, or a BYO\n * agent identically.\n */\nimport {\n type AnalystFinding,\n makeProposalFinding,\n type ProposalFinding,\n} from '@tangle-network/agent-eval'\nimport { assertProposalFindings } from '@tangle-network/agent-eval/analyst'\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport type { Corpus, CorpusRecord } from './personify/wave-types'\nimport { profileChatClient } from './profile-chat-client'\nimport type { ExecutorConfig } from './supervise/runtime'\n\nconst observerId = 'observe/trace'\n\nexport interface ObserveInput {\n /** What the worker was asked to do. */\n task: string\n /** What it produced (its final answer / artifact summary). */\n output: string\n /** The worker's trace — any event array (sandbox events, tool-call records). */\n trace: ReadonlyArray<unknown>\n /** Terminal status only (passed/failed/unknown) — NOT a judge score; the\n * observer never reads the verdict, it reads behavior. */\n outcome?: 'passed' | 'failed' | 'unknown'\n /** Provenance back to the run. */\n runId?: string\n}\n\nexport interface ObserveOptions {\n /** Exact analyst identity. */\n profile: AgentProfile\n /** Execution substrate. All behavior comes from the profile. */\n executor: ExecutorConfig\n /** When set, learned facts are appended (idempotent) for the next run to read. */\n corpus?: Corpus\n /** Tags written onto learned facts + used by the next run's corpus query. */\n tags?: ReadonlyArray<string>\n signal?: AbortSignal\n /** Cap the trace lines fed to the observer (keeps the call cheap). Default 80. */\n maxTraceLines?: number\n}\n\n/** The default observer instruction — exported so an optimizer can seed its population. */\nexport const defaultAnalystInstruction =\n 'You are a third-person OBSERVER watching an AI agent work. You see its TRACE (what it did), not its grader. ' +\n 'From the trace, name SPECIFIC, behavior-grounded findings: wasted/duplicated tool calls, thrash/retries, ' +\n 'token/cost waste, missing verification, failure patterns. For each, a concrete recommended_action, and ' +\n 'whether the AGENT (fix its skills/prompt/tools) or the OPERATOR (fix framing/decomposition/config) should act. ' +\n 'Only claim what the trace shows. No findings if the run was clean.'\n\nexport interface Observation {\n findings: ProposalFinding[]\n /** Facts persisted to the corpus (empty when no corpus was supplied). */\n learned: CorpusRecord[]\n /** Operator-facing markdown: what the observer noticed + what to change. */\n report: string\n /** Measured model usage for this analysis turn. */\n usage: { input: number; output: number; known: boolean }\n}\n\n/** Compact the trace into the lines the observer reasons over — tool calls,\n * errors, and statuses, in order. Keeps the model call bounded + grounded. */\nfunction summarizeTrace(trace: ReadonlyArray<unknown>, maxLines: number): string {\n const lines: string[] = []\n for (const ev of trace) {\n const e = ev as { type?: string; data?: Record<string, unknown> }\n const t = (e.type ?? '').toLowerCase()\n const d = e.data ?? {}\n const part = (d.part ?? {}) as { type?: string; tool?: string; state?: { status?: string } }\n if (part.type === 'tool')\n lines.push(`tool:${part.tool}${part.state?.status ? `(${part.state.status})` : ''}`)\n else if (t.includes('error'))\n lines.push(`ERROR: ${String(d.message ?? d.detail ?? '').slice(0, 200)}`)\n else if (t === 'status' && typeof d.status === 'string') lines.push(`status:${d.status}`)\n else if (t.includes('tool')) lines.push(`tool-event:${t}`)\n }\n // Collapse runs of identical lines into \"xN\" so repeated thrash is visible + short.\n const out: string[] = []\n for (const ln of lines) {\n const prev = out[out.length - 1]\n const m = prev?.match(/^(.*?)(?: x(\\d+))?$/)\n if (m && m[1] === ln) out[out.length - 1] = `${ln} x${(Number(m[2]) || 1) + 1}`\n else out.push(ln)\n }\n return out.slice(0, maxLines).join('\\n') || '(no tool/error events in trace)'\n}\n\nconst findingsSchema = {\n name: 'observer_findings',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n findings: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n properties: {\n area: {\n type: 'string',\n description: 'tool-use | cost | verification | process | failure | latency',\n },\n severity: { type: 'string', enum: ['critical', 'high', 'medium', 'low', 'info'] },\n claim: {\n type: 'string',\n description: 'what you OBSERVED in the trace (a fact, with the evidence)',\n },\n recommended_action: {\n type: 'string',\n description: 'the concrete change for the agent or operator',\n },\n audience: {\n type: 'string',\n enum: ['agent', 'operator'],\n description: 'who should act on this',\n },\n confidence: { type: 'number' },\n },\n required: ['area', 'severity', 'claim', 'recommended_action', 'audience', 'confidence'],\n },\n },\n },\n required: ['findings'],\n },\n} as const\n\n/** The third-person trace analyst: read a worker's trace and produce steer findings for the next attempt plus durable `learned` facts for the cross-run corpus. */\nexport async function observe(input: ObserveInput, opts: ObserveOptions): Promise<Observation> {\n const traceSummary = summarizeTrace(input.trace, opts.maxTraceLines ?? 80)\n const res = await profileChatClient({\n profile: opts.profile,\n executor: opts.executor,\n context: 'observe analyst',\n }).chat(\n {\n jsonSchema: findingsSchema as unknown as { name: string; schema: Record<string, unknown> },\n messages: [\n {\n role: 'user',\n content:\n `TASK: ${input.task}\\n\\nOUTCOME: ${input.outcome ?? 'unknown'}\\n\\n` +\n `FINAL OUTPUT (truncated):\\n${input.output.slice(0, 1200)}\\n\\n` +\n `TRACE (in order; \"xN\" = repeated):\\n${traceSummary}`,\n },\n ],\n },\n { ...(opts.signal ? { signal: opts.signal } : {}) },\n )\n\n const parsed = parseFindings(res.content)\n const producedAt = input.runId ? `${input.runId}` : observerId\n const findings = assertProposalFindings(\n parsed.map((f) =>\n makeProposalFinding({\n analyst_id: observerId,\n area: `${f.area}`,\n severity: f.severity,\n claim: f.claim,\n recommended_action: f.recommended_action,\n confidence: typeof f.confidence === 'number' ? f.confidence : 0.5,\n evidence_refs: [],\n // The observer reads behavior, never a final evaluation result.\n derived_from_judge: false,\n proposal_origin: 'production',\n metadata: { audience: f.audience },\n ...(input.runId ? { subject: input.runId } : {}),\n }),\n ),\n 'observe findings',\n )\n\n const learned: CorpusRecord[] = []\n if (opts.corpus) {\n for (const f of findings) {\n const record: CorpusRecord = {\n schemaVersion: '1.0.0',\n id: f.finding_id,\n runId: input.runId ?? observerId,\n producedAt: f.produced_at ?? producedAt,\n area: f.area,\n claim: f.recommended_action ?? f.claim,\n ...(f.claim ? { rationale: f.claim } : {}),\n tags: [...(opts.tags ?? []), `audience:${(f.metadata?.audience as string) ?? 'agent'}`],\n confidence: f.confidence,\n evidence: [{ kind: 'finding', uri: f.finding_id }],\n }\n const r = await opts.corpus.append(record)\n if (r.succeeded) learned.push(record)\n }\n }\n\n const usage = res.usage\n const inputTokens = usage?.promptTokens\n const outputTokens = usage?.completionTokens\n return {\n findings: [...findings],\n learned,\n report: renderReport(findings),\n usage: {\n input: inputTokens ?? 0,\n output: outputTokens ?? 0,\n known:\n usage?.captured !== false &&\n typeof inputTokens === 'number' &&\n typeof outputTokens === 'number',\n },\n }\n}\n\ninterface RawFinding {\n area: string\n severity: AnalystFinding['severity']\n claim: string\n recommended_action: string\n audience: 'agent' | 'operator'\n confidence: number\n}\n\nfunction parseFindings(content: string): RawFinding[] {\n let obj: unknown\n try {\n obj = JSON.parse(content)\n } catch {\n const m = content.match(/\\{[\\s\\S]*\\}/)\n obj = m ? JSON.parse(m[0]) : { findings: [] }\n }\n const arr = (obj as { findings?: unknown }).findings\n return Array.isArray(arr) ? (arr as RawFinding[]) : []\n}\n\n/** Operator-facing report, split by who should act. The agent block is the\n * steer; the operator block is the advice. */\nexport function renderReport(findings: ReadonlyArray<AnalystFinding>): string {\n if (findings.length === 0) return '✓ clean run — the observer found nothing to change.'\n const audience = (f: AnalystFinding): string => (f.metadata?.audience as string) ?? 'agent'\n const forAgent = findings.filter((f) => audience(f) === 'agent')\n const forOperator = findings.filter((f) => audience(f) === 'operator')\n const block = (title: string, fs: ReadonlyArray<AnalystFinding>): string =>\n fs.length === 0\n ? ''\n : `**${title}**\\n${fs\n .map((f) => `- [${f.severity}] ${f.claim}\\n → ${f.recommended_action ?? ''}`)\n .join('\\n')}\\n`\n return [\n block('For the agent (fix skills / prompt / tools)', forAgent),\n block('For you (the operator)', forOperator),\n ]\n .filter(Boolean)\n .join('\\n')\n}\n","/**\n * The general agentic primitive — sequential (depth) and parallel (breadth) over a shared,\n * checkable artifact, driven through the keystone Supervisor as one recursive `Agent.act`.\n *\n * The domain lives behind ONE seam — `AgenticSurface` (open an artifact, list tools, call a tool,\n * score the artifact, close it). EnterpriseOps implements it (seed a gym DB, MCP tools, SQL\n * verifier); Commit0/AppWorld/terminal-bench implement it the same way (a repo workspace, shell\n * tools, the test suite). The drivers below are domain-blind: they run over any surface.\n *\n * Two shapes, the agent's POMDP rollout as the unit:\n * - DEPTH one persistent artifact carried across shots. Each shot the agent works the tool loop;\n * between shots a trace-analyst (selector≠judge: reads the trajectory, never the score)\n * steers the resumed session toward what's unfinished. shot n stands on shot n-1's\n * artifact state + history. This is continuation — long-horizon, same artifact.\n * - BREADTH K independent artifacts, each a fresh rollout, the deployable verifier picks the best.\n *\n * Both are an `Agent` whose `act` spawns leaf shots through `scope.spawn` and reacts via\n * `scope.next()` — so the conserved budget pool meters them (equal-k by construction), the journal\n * records the tree, and the same primitive nests. `runAgentic` runs the chosen driver through\n * `createSupervisor().run`. The leaf (one shot over a handle) is resolved per-spawn from a\n * surface-closed registry — the open `Executor` seam, not bespoke per-benchmark glue.\n */\n\nimport type { ChatClient } from '@tangle-network/agent-eval'\nimport { type AgentProfile, agentProfileSchema } from '@tangle-network/agent-interface'\nimport { InMemoryResultBlobStore, InMemorySpawnJournal } from '../durable/spawn-journal'\nimport type { RuntimeHooks } from '../runtime-hooks'\nimport { observe } from './observe'\nimport type { Outcome } from './personify/types'\nimport type { Corpus } from './personify/wave-types'\nimport { profileChatClient } from './profile-chat-client'\nimport { collectAgentTurn, streamAgentTurn } from './stream-agent-turn'\nimport { withDriverExecutor } from './supervise/driver-executor'\nimport {\n assertExecutableAgentProfile,\n concreteModelId,\n profileModelExecutionSettings,\n} from './supervise/model-policy'\nimport { createExecutor } from './supervise/runtime'\nimport { createSupervisor } from './supervise/supervisor'\nimport type {\n Agent,\n AgentSpec,\n Budget,\n Executor,\n ExecutorContext,\n ExecutorFactory,\n ExecutorRegistry,\n ExecutorResult,\n ExecutorToolCall,\n Scope,\n Settled,\n} from './supervise/types'\n\n// ── The general surface seam (the only thing a new benchmark implements) ─────────\n\nexport interface AgenticTask {\n readonly id: string\n readonly userPrompt: string\n /** Opaque domain payload the surface reads (EOPS: servers/verifiers/tools). Drivers never read it. */\n readonly meta?: Record<string, unknown>\n}\n\nexport interface ArtifactHandle {\n readonly id: string\n readonly surface: string\n /** Opaque per-artifact context the surface stashes (EOPS: the seeded gym server + db id). */\n readonly ctx?: unknown\n}\n\nexport interface AgenticTool {\n readonly type: 'function'\n readonly function: { name: string; description?: string; parameters: Record<string, unknown> }\n}\n\nexport interface SurfaceScore {\n passes: number\n total: number\n /** Checks excluded as malformed (data defect, not the agent). `total === 0` ⇒ unscoreable. */\n errored: number\n}\n\n/** A stateful, checkable environment an agent operates over with tools. Open behind one interface. */\nexport interface AgenticSurface {\n readonly name: string\n open(task: AgenticTask): Promise<ArtifactHandle>\n tools(task: AgenticTask, handle: ArtifactHandle): Promise<AgenticTool[]>\n call(handle: ArtifactHandle, name: string, args: Record<string, unknown>): Promise<string>\n score(task: AgenticTask, handle: ArtifactHandle): Promise<SurfaceScore>\n close(handle: ArtifactHandle): Promise<void>\n}\n\nexport interface AgenticOptions {\n routerBaseUrl: string\n routerKey: string\n /** Exact worker identity. Model and standing instructions are read only from this profile. */\n workerProfile: AgentProfile\n /** Optional completion transport (see `RouterConfig.complete`): when set, BOTH legs of an\n * offline run use it instead of `fetch`-ing the router — the worker's tool loop (threaded into\n * its `routerToolLoop` cfg) AND the analyst's critic (its `ChatClient` is bound to this same\n * transport). One injected responder serves both, as a localhost mock endpoint would. Absent ⇒\n * the live router fetch path (the default). */\n complete?: (body: Record<string, unknown>) => Promise<unknown>\n /** Exact critic identity. Omitted means the exact worker profile also runs the critic. */\n analystProfile?: AgentProfile\n /** Across-run learning: when set, the analyst's observe() pass appends trace-derived\n * facts here (the flywheel write side). Read-back is opt-in via `corpusReadback`\n * because unconditional priming can pollute context on some domains. */\n corpus?: Corpus\n /** Tags written onto learned facts (and used by the caller's priming query). */\n corpusTags?: string[]\n /** In-context learning: when set, query `corpus` before each depth shot and inject\n * the top trace-derived facts as guidance for the active run. No corpus means no read-back. */\n corpusReadback?: CorpusReadbackOptions\n}\n\nexport interface CorpusReadbackOptions {\n /** Minimum confidence for a fact to be injected. Default 0.7. */\n minConfidence?: number\n /** Extra tags a fact must carry, in addition to `corpusTags`. */\n tags?: ReadonlyArray<string>\n /** Max facts injected per shot. Default 3. */\n maxFacts?: number\n /** Default false: only facts tagged `audience:agent` are injected into the worker. */\n includeOperatorFacts?: boolean\n}\n\n// ── The unit: one agentic shot (a bounded tool loop) over a handle ───────────────\n\n/** One provider-neutral conversation record carried between strategy shots. */\nexport type StrategyMessage = Record<string, unknown>\ninterface ToolCall {\n id: string\n function: { name: string; arguments: string }\n}\n\ninterface ShotTask {\n task: AgenticTask\n handle?: ArtifactHandle // present ⇒ DEPTH (shared artifact); absent ⇒ BREADTH (open own)\n messages?: StrategyMessage[] // carried conversation (depth); fresh when absent\n steer?: string // analyst-derived steer injected before this shot (depth)\n profile?: AgentProfile // exact role/model override for this shot\n tools?: string[] // restrict THIS shot to these domain tools (names); unknown names throw\n /** analyst leaf only: a RAW instruction — the analyst answers it over the trajectory\n * directly (no findings schema). The verdict-capable channel. */\n rawInstruction?: string\n}\n\ninterface ShotOut {\n messages: StrategyMessage[]\n completions: number\n toolCalls: number\n toolErrors: number\n /** Real router usage summed over the shot's turns; zeros only when the provider omits usage. */\n tokens: { input: number; output: number }\n /** False when any Router turn omitted usage. */\n tokensKnown?: false\n}\n\nconst taskNudge =\n 'Use the available tools to bring the artifact to the required final state. Address EVERY distinct ' +\n 'change the request implies. After each tool result, check what remains and continue. Re-read the ' +\n 'values you set to confirm they took. Reply DONE only once every required change is made and verified.'\n\nfunction exactAgenticProfile(profile: AgentProfile, context: string): AgentProfile {\n const parsed = agentProfileSchema.safeParse(profile)\n if (!parsed.success) throw new Error(`${context}: invalid AgentProfile: ${parsed.error.message}`)\n return parsed.data\n}\n\nfunction requiredProfileModel(profile: AgentProfile, context: string): string {\n assertExecutableAgentProfile(profile, context)\n const model = concreteModelId(profile.model?.default)\n if (!model) {\n throw new Error(\n `${context}: AgentProfile.model.default must name the exact provider model; runtime-selected and missing models are not executable`,\n )\n }\n return model\n}\n\nfunction profileSystemPrompt(profile: AgentProfile): string {\n const sections = [profile.prompt?.systemPrompt, ...(profile.prompt?.instructions ?? [])].filter(\n (value): value is string => typeof value === 'string' && value.trim().length > 0,\n )\n const instructions = profile.resources?.instructions\n if (typeof instructions === 'string' && instructions.trim()) sections.push(instructions)\n else if (\n instructions &&\n typeof instructions === 'object' &&\n instructions.kind === 'inline' &&\n instructions.content.trim()\n ) {\n sections.push(instructions.content)\n } else if (instructions && typeof instructions === 'object' && instructions.kind === 'github') {\n throw new Error(\n 'agentic profile: github resource instructions require a workspace materializer; use inline instructions for the direct Router worker',\n )\n }\n return sections.join('\\n\\n')\n}\n\nfunction assertProfileTools(\n profile: AgentProfile,\n tools: ReadonlyArray<AgenticTool>,\n context: string,\n): void {\n const supplied = new Set(tools.map((tool) => tool.function.name))\n const declared = profile.tools ?? {}\n for (const name of supplied) {\n if (declared[name] !== true) {\n throw new Error(\n `${context}: tool ${JSON.stringify(name)} is not enabled by AgentProfile.tools`,\n )\n }\n }\n for (const [name, enabled] of Object.entries(declared)) {\n if (enabled && !supplied.has(name)) {\n throw new Error(\n `${context}: AgentProfile enables tool ${JSON.stringify(name)} but the surface did not supply it`,\n )\n }\n }\n}\n\n/** One shot: run the agent's tool loop (≤ innerTurns) over the handle, mutating the artifact via\n * `surface.call`, carrying `messages`. Returns the updated conversation + counts. */\nasync function runShot(\n surface: AgenticSurface,\n _task: AgenticTask,\n handle: ArtifactHandle,\n tools: AgenticTool[],\n messages: StrategyMessage[],\n opts: AgenticOptions,\n profileOverride?: AgentProfile,\n): Promise<ShotOut> {\n // The canonical off-box tool loop (routerToolLoop) drives the turns; this shot supplies\n // the carried conversation (depth continuation, via initialMessages) and the tool dispatch\n // (surface.call). An ERROR:-prefixed result or a thrown call is a real tool outcome —\n // counted as a toolError and fed back to the model, never thrown to kill the shot.\n let toolErrors = 0\n const execute = async (name: string, args: Record<string, unknown>): Promise<string> => {\n try {\n const out = await surface.call(handle, name, args)\n if (out.startsWith('ERROR:')) toolErrors += 1\n return out\n } catch (e) {\n toolErrors += 1\n return `ERROR: ${e instanceof Error ? e.message : String(e)}`\n }\n }\n const profile = exactAgenticProfile(profileOverride ?? opts.workerProfile, 'agentic shot')\n requiredProfileModel(profile, 'agentic shot')\n profileModelExecutionSettings(profile, 'agentic shot')\n assertProfileTools(profile, tools, 'agentic shot')\n const factory = createExecutor({\n backend: 'router-tools',\n routerBaseUrl: opts.routerBaseUrl,\n routerKey: opts.routerKey,\n tools,\n executeToolCall: execute,\n ...(opts.complete ? { complete: opts.complete } : {}),\n })\n const turn = await collectAgentTurn(\n streamAgentTurn(\n { kind: 'executor', profile, factory },\n {\n providerOptions: {\n messages,\n },\n },\n ),\n )\n if (turn.status !== 'completed') {\n throw new Error(`agentic shot failed: ${turn.error?.message ?? turn.status}`)\n }\n const out = turn.output as\n | { messages?: StrategyMessage[]; turns?: number; toolCalls?: ExecutorToolCall[] }\n | undefined\n return {\n messages: out?.messages ?? messages,\n completions: out?.turns ?? 0,\n toolCalls: out?.toolCalls?.length ?? 0,\n toolErrors,\n tokens: { input: turn.usage.input, output: turn.usage.output },\n ...(turn.usage.tokensKnown === false ? { tokensKnown: false } : {}),\n }\n}\n\n/** The trace-analyst (selector≠judge): reads ONLY the trajectory + task, never the score. */\n/** The depth STEERER, on the CANONICAL analyst: agent-eval's `observe()` (makeFinding +\n * ChatClient + the derived_from_judge firewall) reads the agent's tool-call trajectory\n * (behavior, never the score) and returns findings; we steer on their recommended_actions.\n * The trajectory (calls + RESULTS) rides in `output` so the analyst sees what actually\n * happened, not just tool names. No actionable findings ⇒ COMPLETE (depth self-terminates). */\ninterface AnalyzeOut {\n steer: string\n tokens: { input: number; output: number }\n /** False when any analyst call omitted usage. */\n tokensKnown?: false\n}\n\n/** The firewall's input shape: the trajectory as compacted text — calls, results,\n * assistant text. NEVER scores, NEVER check internals. Shared by both analyst channels. */\nfunction compactTrajectory(messages: StrategyMessage[]): string {\n return messages\n .filter((m) => m.role === 'assistant' || m.role === 'tool')\n .map((m) => {\n if (m.role === 'tool') return `RESULT ${String(m.content).slice(0, 280)}`\n const calls = (m.tool_calls as ToolCall[] | undefined)\n ?.map((c) => `${c.function.name}(${c.function.arguments})`)\n .join(', ')\n return calls ? `CALL ${calls}` : `SAY ${String(m.content).slice(0, 200)}`\n })\n .join('\\n')\n .slice(0, 7000)\n}\n\n/** The analyst's chat seam: the live router by default, or — when a `complete` transport is\n * injected — that SAME transport, so an offline run drives the critic with no network too (the\n * worker and the analyst share the one injected responder, exactly as a localhost mock would\n * serve both). The critic speaks the OpenAI request shape; we forward it to `complete` and lift\n * the parsed `/chat/completions` JSON back into a `ChatResponse`. */\nfunction analystChat(opts: AgenticOptions, profile: AgentProfile): ChatClient {\n return profileChatClient({\n profile,\n context: 'agentic analyst',\n executor: {\n backend: 'router',\n routerBaseUrl: opts.routerBaseUrl,\n routerKey: opts.routerKey,\n ...(opts.complete ? { complete: opts.complete } : {}),\n },\n })\n}\n\n/** The RAW analyst channel: the firewalled critic answers `instruction` over the\n * trajectory directly — no findings schema, no recommended-action extraction. The\n * channel for verdict-shaped steering (budget controllers, calibrated predictions)\n * whose output format the findings protocol would strip. Same firewall as analyze():\n * trajectory in, never scores. */\nasync function consultAnalyst(\n task: AgenticTask,\n messages: StrategyMessage[],\n instruction: string,\n opts: AgenticOptions,\n): Promise<AnalyzeOut> {\n const trajectory = compactTrajectory(messages)\n const analystProfile = exactAgenticProfile(\n opts.analystProfile ?? opts.workerProfile,\n 'agentic analyst',\n )\n const analystModel = requiredProfileModel(analystProfile, 'agentic analyst')\n const chat = analystChat(opts, analystProfile)\n // The profile owns the standing system instruction. This strategy-authored question is task\n // input, so it stays in the user turn even when a trajectory is present.\n const consultMessages = [\n {\n role: 'user' as const,\n content: trajectory\n ? `${instruction}\\n\\nTASK: ${task.userPrompt.slice(0, 1500)}\\n\\nTRAJECTORY:\\n${trajectory}`\n : `${instruction}\\n\\nTASK:\\n${task.userPrompt.slice(0, 1500)}`,\n },\n ]\n const res = await chat.chat({\n model: analystModel,\n messages: consultMessages,\n })\n const usage = (\n res as {\n usage?: {\n promptTokens?: number\n prompt_tokens?: number\n completionTokens?: number\n completion_tokens?: number\n captured?: boolean\n }\n }\n ).usage\n const input = usage?.promptTokens ?? usage?.prompt_tokens\n const output = usage?.completionTokens ?? usage?.completion_tokens\n const tokensKnown =\n usage?.captured !== false && typeof input === 'number' && typeof output === 'number'\n return {\n steer: res.content.trim(),\n tokens: {\n input: input ?? 0,\n output: output ?? 0,\n },\n ...(tokensKnown ? {} : { tokensKnown: false }),\n }\n}\n\nasync function analyze(\n task: AgenticTask,\n messages: StrategyMessage[],\n opts: AgenticOptions,\n): Promise<AnalyzeOut> {\n const trajectory = compactTrajectory(messages)\n const analystProfile = exactAgenticProfile(\n opts.analystProfile ?? opts.workerProfile,\n 'agentic analyst',\n )\n const obs = await observe(\n {\n task: task.userPrompt,\n output: trajectory,\n trace: messages,\n outcome: 'failed',\n runId: task.id,\n },\n {\n profile: analystProfile,\n executor: {\n backend: 'router',\n routerBaseUrl: opts.routerBaseUrl,\n routerKey: opts.routerKey,\n ...(opts.complete ? { complete: opts.complete } : {}),\n },\n ...(opts.corpus ? { corpus: opts.corpus, tags: opts.corpusTags ?? [] } : {}),\n },\n )\n // The steer = the analyst's recommended actions for the agent. Empty ⇒ nothing left to do.\n const steer = obs.findings\n .map((f) => f.recommended_action)\n .filter((a): a is string => typeof a === 'string' && a.trim().length > 0)\n .join('\\n')\n .trim()\n return {\n steer: steer || 'COMPLETE',\n tokens: { input: obs.usage.input, output: obs.usage.output },\n ...(obs.usage.known ? {} : { tokensKnown: false }),\n }\n}\n\nasync function renderCorpusReadback(opts: AgenticOptions): Promise<string> {\n if (!opts.corpus || !opts.corpusReadback) return ''\n const maxFacts = opts.corpusReadback.maxFacts ?? 3\n if (!Number.isInteger(maxFacts) || maxFacts < 0) {\n throw new Error(`corpusReadback.maxFacts must be a non-negative integer, got ${maxFacts}`)\n }\n if (maxFacts === 0) return ''\n\n const tags = [\n ...(opts.corpusTags ?? []),\n ...(opts.corpusReadback.tags ?? []),\n ...(opts.corpusReadback.includeOperatorFacts ? [] : ['audience:agent']),\n ]\n const facts = await opts.corpus.query({\n ...(tags.length > 0 ? { tags } : {}),\n minConfidence: opts.corpusReadback.minConfidence ?? 0.7,\n limit: maxFacts,\n })\n if (facts.length === 0) return ''\n\n const rendered = facts.map((fact) =>\n fact.rationale ? `- ${fact.claim} (${fact.rationale})` : `- ${fact.claim}`,\n )\n return `Relevant learned facts from prior attempts:\\n${rendered.join('\\n')}`\n}\n\n// ── Leaf executors (one shot / one analyst), resolved per-spawn from the surface ──\n\n/** Measured result of one strategy shot. */\nexport interface StrategyShotResult {\n messages: StrategyMessage[]\n score: number\n passes: number\n total: number\n completions: number\n toolErrors: number\n}\n\n/** Resolve a shot: if `handle` given, operate on the SHARED artifact (depth); else open+score+close\n * an OWN artifact (breadth). Always scores the artifact's final state as the deployable verdict. */\nfunction shotExecutor(surface: AgenticSurface, opts: AgenticOptions): Executor<unknown> {\n let artifact: ExecutorResult<unknown> | undefined\n return {\n runtime: 'agentic-shot',\n async execute(task: unknown): Promise<ExecutorResult<unknown>> {\n const t = task as ShotTask\n const own = !t.handle\n const handle = t.handle ?? (await surface.open(t.task))\n try {\n const allTools = await surface.tools(t.task, handle)\n // Tool SELECTION is a strategy decision (which of the domain's tools this shot\n // sees) — restriction-only: a strategy can focus a shot, never grant a tool the\n // domain didn't offer. Unknown names fail loud (an authored typo must not\n // silently become an unrestricted shot).\n let tools = allTools\n if (t.tools) {\n const known = new Set(allTools.map((tool) => tool.function.name))\n const unknown = t.tools.filter((name) => !known.has(name))\n if (unknown.length > 0) {\n throw new Error(\n `shot tools: unknown tool name(s) ${unknown.join(', ')} — domain offers: ${[...known].join(', ')}`,\n )\n }\n const want = new Set(t.tools)\n tools = allTools.filter((tool) => want.has(tool.function.name))\n }\n // An EMPTY messages array means \"fresh\" too — an authored body passing\n // `messages: []` must not silently blank the worker's system/task prompt.\n const profile = exactAgenticProfile(t.profile ?? opts.workerProfile, 'agentic shot')\n const systemPrompt = profileSystemPrompt(profile)\n const messages: StrategyMessage[] = t.messages?.length\n ? [...t.messages]\n : [\n ...(systemPrompt ? [{ role: 'system', content: systemPrompt }] : []),\n { role: 'user', content: `${t.task.userPrompt}\\n\\n${taskNudge}` },\n ]\n // On a CARRIED conversation, a profile switch arrives as a role hand-off message.\n if (t.messages?.length && t.profile && systemPrompt) {\n messages.push({\n role: 'user',\n content: `[hand-off] You are now acting as: ${systemPrompt}`,\n })\n }\n if (t.steer) messages.push({ role: 'user', content: t.steer })\n const shot = await runShot(surface, t.task, handle, tools, messages, opts, profile)\n const s = await surface.score(t.task, handle)\n const score = s.total > 0 ? s.passes / s.total : 0\n const out: StrategyShotResult = {\n messages: shot.messages,\n score,\n passes: s.passes,\n total: s.total,\n completions: shot.completions,\n toolErrors: shot.toolErrors,\n }\n artifact = {\n outRef: `shot:${handle.id}:${shot.completions}:${s.passes}/${s.total}`,\n out,\n verdict: { valid: s.total > 0 && s.passes === s.total, score },\n // Real usage to the conserved pool: tokens from the router responses; usd only\n // when the model is in the price table (never a fabricated number).\n spent: {\n iterations: shot.completions,\n tokens: shot.tokens,\n ...(shot.tokensKnown === false ? { tokensKnown: false } : {}),\n usd: 0,\n usdKnown: false,\n ms: 0,\n },\n }\n return artifact\n } finally {\n if (own) await surface.close(handle)\n }\n },\n teardown: () => Promise.resolve({ destroyed: true }),\n resultArtifact() {\n if (!artifact) throw new Error('shotExecutor: resultArtifact before execute')\n return artifact\n },\n }\n}\n\nfunction analystExecutor(opts: AgenticOptions): Executor<unknown> {\n let artifact: ExecutorResult<unknown> | undefined\n return {\n runtime: 'agentic-analyst',\n async execute(task: unknown): Promise<ExecutorResult<unknown>> {\n const t = task as { task: AgenticTask; messages: StrategyMessage[]; rawInstruction?: string }\n const { steer, tokens, tokensKnown } = t.rawInstruction\n ? await consultAnalyst(t.task, t.messages, t.rawInstruction, opts)\n : await analyze(t.task, t.messages, opts)\n artifact = {\n outRef: `analyst:${steer.length}`,\n out: steer,\n spent: {\n iterations: 1,\n tokens,\n ...(tokensKnown === false ? { tokensKnown: false } : {}),\n usd: 0,\n usdKnown: false,\n ms: 0,\n },\n }\n return artifact\n },\n teardown: () => Promise.resolve({ destroyed: true }),\n resultArtifact() {\n if (!artifact) throw new Error('analystExecutor: resultArtifact before execute')\n return artifact\n },\n }\n}\n\n/**\n * Registry dispatching on the child's role tag — fresh executor per spawn (no\n * shared-instance race). `withDriverExecutor` wraps it so a `role:'driver'` child resolves\n * to the recursive driver-executor (a child that drives its OWN children — agents drive\n * agents) before this leaf dispatch; `shot`/`analyst` children resolve to their leaf\n * executors here unchanged.\n */\nfunction agenticRegistry(surface: AgenticSurface, opts: AgenticOptions): ExecutorRegistry {\n const leaves: ExecutorRegistry = {\n register() {\n throw new Error('agenticRegistry: register unsupported')\n },\n resolve<Out>(spec: AgentSpec) {\n const role = (spec.profile.metadata as { role?: string } | undefined)?.role\n const factory: ExecutorFactory<Out> = (_s: AgentSpec, _ctx: ExecutorContext) =>\n (role === 'analyst' ? analystExecutor(opts) : shotExecutor(surface, opts)) as Executor<Out>\n return { succeeded: true as const, value: factory }\n },\n }\n return withDriverExecutor(leaves)\n}\n\nfunction leaf(\n name: string,\n role: 'shot' | 'analyst',\n profile: AgentProfile,\n): Agent<unknown, Outcome<unknown>> {\n const exactProfile = exactAgenticProfile(profile, `agentic ${role}`)\n const agent = {\n name,\n executorSpec: {\n profile: {\n ...exactProfile,\n name,\n metadata: { ...exactProfile.metadata, role },\n },\n harness: null,\n } as AgentSpec,\n act(): Promise<Outcome<unknown>> {\n // SPAWNED, not run: its `executorSpec` (role shot/analyst) resolves a leaf executor\n // the scope drives. `act` is never called for a spawned child; it fails loud if\n // mis-used as a root. A `role:'driver'` child instead resolves to the recursive\n // driver-executor (agents drive agents) — see `withDriverExecutor`.\n throw new Error(`agentic: spawned child \"${name}\" was run directly (the executor drives it)`)\n },\n }\n return agent as Agent<unknown, Outcome<unknown>>\n}\n\n/** Drain exactly one settlement (the just-spawned child). */\nasync function drainOne(scope: Scope<Outcome<unknown>>): Promise<Settled<Outcome<unknown>>> {\n const s = await scope.next()\n if (!s) throw new Error('agentic: spawned child never settled')\n return s\n}\n\n// ── The result + the two drivers (domain-blind Agents run by the Supervisor) ─────\n\nexport interface AgenticRunResult {\n /** The strategy name (built-in 'depth'/'breadth' or a custom strategy's name). */\n mode: string\n score: number\n resolved: boolean\n completions: number\n /** DEPTH: score after each shot — the progress-over-rounds curve. BREADTH: best-so-far per rollout. */\n progression: number[]\n shots: number\n /** Observed billed subtotal. `usdKnown:false` means it is incomplete, never a measured zero. */\n usd: number\n usdKnown: boolean\n ms: number\n tokens: { input: number; output: number }\n tokensKnown: boolean\n}\n\nconst UNBOUNDED_TURN_RESERVATION = 1_000_000_000\n\nfunction profileTurnLimit(profile: AgentProfile, context: string): number {\n return profileModelExecutionSettings(profile, context).maxTurns ?? 0\n}\n\nconst perChild = (maxTurns: number): Budget => ({\n maxIterations: maxTurns === 0 ? UNBOUNDED_TURN_RESERVATION : maxTurns + 1,\n maxTokens: 1_000_000,\n})\n\n/** DEPTH: one persistent artifact, carried across analyst-steered shots. */\nexport function depthStrategy(\n surface: AgenticSurface,\n task: AgenticTask,\n opts: AgenticOptions,\n cfg: { maxShots: number },\n): Agent<unknown, Outcome<unknown>> {\n const innerTurns = profileTurnLimit(opts.workerProfile, 'depth worker')\n let pendingSteer: string | undefined // analyst-derived steer carried between shots\n return {\n name: 'depth',\n async act(_t, scope): Promise<Outcome<unknown>> {\n const handle = await surface.open(task)\n const progression: number[] = []\n let messages: StrategyMessage[] | undefined\n let completions = 0\n let shots = 0\n try {\n for (shots = 0; shots < cfg.maxShots; shots += 1) {\n const child = leaf(`shot:${shots}`, 'shot', opts.workerProfile)\n const memorySteer = await renderCorpusReadback(opts)\n const steer = [shots === 0 ? undefined : pendingSteer, memorySteer]\n .filter((part): part is string => typeof part === 'string' && part.trim().length > 0)\n .join('\\n\\n')\n const res = scope.spawn(child, { task, handle, messages, steer } as ShotTask, {\n budget: perChild(innerTurns),\n label: `shot:${shots}`,\n })\n if (!res.ok) break\n const settled = await drainOne(scope)\n if (settled.kind === 'down') break\n const out = settled.out as unknown as StrategyShotResult\n messages = out.messages\n completions += out.completions\n progression.push(out.score)\n if (out.score >= 1 || shots === cfg.maxShots - 1) break\n // Analyst reads the trajectory (firewalled) → steer the resumed session.\n const aChild = leaf(\n `analyst:${shots}`,\n 'analyst',\n opts.analystProfile ?? opts.workerProfile,\n )\n const aRes = scope.spawn(\n aChild,\n { task, messages },\n { budget: perChild(1), label: `analyst:${shots}` },\n )\n if (!aRes.ok) break\n const aSettled = await drainOne(scope)\n completions += 1\n if (aSettled.kind === 'down') break\n const findings = aSettled.out as unknown as string\n if (/^\\s*COMPLETE\\b/i.test(findings)) break\n pendingSteer = `A reviewer flagged unfinished items:\\n${findings}\\n\\nAddress each with the tools, verify they took, then continue.`\n }\n const final = await surface.score(task, handle)\n const score = final.total > 0 ? final.passes / final.total : 0\n return {\n kind: 'done',\n deliverable: {\n mode: 'depth',\n score,\n resolved: final.total > 0 && final.passes === final.total,\n completions,\n progression,\n shots: shots + 1,\n },\n }\n } finally {\n await surface.close(handle)\n }\n },\n }\n}\n\n/** BREADTH: K independent rollouts (each own artifact), verifier picks the best. */\nexport function breadthStrategy(\n _surface: AgenticSurface,\n task: AgenticTask,\n opts: AgenticOptions,\n cfg: { width: number },\n): Agent<unknown, Outcome<unknown>> {\n const innerTurns = profileTurnLimit(opts.workerProfile, 'breadth worker')\n return {\n name: 'breadth',\n async act(_t, scope): Promise<Outcome<unknown>> {\n let opened = 0\n for (let k = 0; k < cfg.width; k += 1) {\n const res = scope.spawn(\n leaf(`rollout:${k}`, 'shot', opts.workerProfile),\n { task } as ShotTask,\n {\n budget: perChild(innerTurns),\n label: `rollout:${k}`,\n },\n )\n if (res.ok) opened += 1\n }\n if (opened === 0) return { kind: 'blocked', blockers: ['breadth: pool admitted no rollout'] }\n let best = -1\n let bestResolved = false\n let completions = 0\n const progression: number[] = []\n for (let s = await scope.next(); s !== null; s = await scope.next()) {\n if (s.kind === 'down') continue\n const out = s.out as unknown as StrategyShotResult\n completions += out.completions\n if (out.score > best) best = out.score\n if (out.total > 0 && out.passes === out.total) bestResolved = true\n progression.push(best)\n }\n if (best < 0) return { kind: 'blocked', blockers: ['breadth: every rollout went down'] }\n return {\n kind: 'done',\n deliverable: {\n mode: 'breadth',\n score: best,\n resolved: bestResolved,\n completions,\n progression,\n shots: opened,\n },\n }\n },\n }\n}\n\n/**\n * A Strategy is HOW you spend the compute budget to beat the Environment's check — it\n * builds the driver `Agent` the Supervisor runs. This is the OPEN extension point: a dev\n * authors their own by implementing `driver()` to return an Agent whose `act()` spawns\n * shots/analysts via `scope.spawn` / `scope.next` / `scope.send`. The two built-ins are\n * the reference implementations to copy:\n * sample — K INDEPENDENT attempts, keep the best-verifying (best-of-N / resample).\n * refine — attempt → observe() reads the trace → steer the next → repeat (iterate).\n * (A multi-agent \"team\" is just a Strategy whose driver spawns several different agents.)\n */\ndeclare const strategyResult: unique symbol\n\nexport interface Strategy<Result extends StrategyResult = StrategyResult> {\n readonly name: string\n /** @internal Associates a strategy with its typed result without adding a runtime field. */\n readonly [strategyResult]?: Result\n driver(\n surface: AgenticSurface,\n task: AgenticTask,\n opts: AgenticOptions,\n budget: number,\n ): Agent<unknown, Outcome<unknown>>\n}\n\n/** Built-in `Strategy`: K independent attempts, keep the best-verifying (best-of-N / resample). */\nexport const sample: Strategy = {\n name: 'sample',\n driver: (surface, task, opts, budget) => breadthStrategy(surface, task, opts, { width: budget }),\n}\n/** Built-in `Strategy`: attempt → `observe()` reads the trace → steer the next attempt → repeat (deepen one lineage). */\nexport const refine: Strategy = {\n name: 'refine',\n driver: (surface, task, opts, budget) => depthStrategy(surface, task, opts, { maxShots: budget }),\n}\n\n// ── The composable LEGO: author a strategy in ~15 lines from two steps ───────────\n//\n// A strategy body gets `shot()` (run one worker attempt over an artifact) and\n// `critique()` (the firewalled analyst reads the trace → a steer). Compose them — no\n// Supervisor/Scope ceremony. This is the skillifiable unit: an agent can emit a\n// `defineStrategy(name, body)` of a few step-calls; it can't reliably emit a 70-line\n// driver. (depthStrategy/breadthStrategy are the hand-written reference impls; refine/sample\n// stay on them — proven — while NEW strategies are authored compactly here.)\n\nexport interface ShotSpec {\n /** present ⇒ continue this artifact (depth); absent ⇒ the shot opens a fresh one (sample/restart). */\n handle?: ArtifactHandle\n messages?: StrategyMessage[]\n steer?: string\n /** Exact profile for this shot. Omitted means `AgenticOptions.workerProfile`. */\n profile?: AgentProfile\n /** Restrict THIS shot to a subset of the domain's tools (by name) — focus a shot on\n * the relevant capabilities. Restriction-only; unknown names throw. Omitted ⇒ all. */\n tools?: string[]\n}\nexport interface StrategyResult {\n score: number\n resolved: boolean\n completions: number\n progression: number[]\n shots: number\n}\n/** Artifact lifecycle a strategy may manage itself — open/close ONLY. Raw `call`/`score`\n * are withheld: scores reach the body solely through `shot()`'s StrategyShotResult (the\n * harness-verified channel), so a body cannot peek the check or fabricate around it. */\nexport interface StrategyArtifacts {\n readonly name: string\n open(task: AgenticTask): Promise<ArtifactHandle>\n close(handle: ArtifactHandle): Promise<void>\n}\n\n/** What a strategy body composes with: the artifact lifecycle, the budget, and the two steps. */\nexport interface StrategyCtx {\n /** Open/close artifacts the body manages itself (e.g. one persistent handle for depth). */\n readonly surface: StrategyArtifacts\n readonly task: AgenticTask\n readonly opts: AgenticOptions\n readonly budget: number\n readonly scope: Scope<Outcome<unknown>>\n /** Run ONE worker shot; its harness-scored result, or null if it went down. */\n shot(spec?: ShotSpec): Promise<StrategyShotResult | null>\n /** The firewalled critic reads the trajectory → a steer string, or null on COMPLETE/down. */\n critique(messages: StrategyMessage[]): Promise<string | null>\n /** The RAW analyst channel: the firewalled critic answers `instruction` over the\n * trajectory verbatim — no findings extraction, so verdict-shaped formats\n * (CONTINUE/STOP decisions, calibrated predictions) survive. Same firewall:\n * trajectory in, never scores. Null when the analyst went down. */\n consult(messages: StrategyMessage[], instruction: string): Promise<string | null>\n /** The tools THIS artifact's task actually offers (names + descriptions only — never\n * the implementations). Tool sets vary per task on heterogeneous domains; a strategy\n * that restricts shots MUST select from this list, never from hardcoded names. */\n listTools(handle: ArtifactHandle): Promise<Array<{ name: string; description?: string }>>\n}\n\n/** Author a Strategy from the composable steps — the open, compact way. */\nexport function defineStrategy<Result extends StrategyResult>(\n name: string,\n run: (ctx: StrategyCtx) => Promise<Result>,\n): Strategy<Result> {\n return {\n name,\n driver: (surface, task, opts, budget) => ({\n name,\n async act(_t, scope): Promise<Outcome<unknown>> {\n let seq = 0\n // HARNESS-VERIFIED scoring: the deliverable score is computed HERE from the shots\n // the harness actually brokered + scored via surface.score() — NEVER the value the\n // (possibly authored / adversarial) body returns. An authored strategy cannot\n // fabricate a win; it can only report what its real shots achieved. Keep-best.\n let verifiedBest = 0\n let verifiedResolved = false\n // Close is IDEMPOTENT by construction for the body: authored code double-closes\n // (often as a floating promise inside a finally), and a second close must be a\n // no-op rather than a domain error that escapes as an unhandled rejection and\n // kills the whole benchmark run. A close failure on a LIVE handle still throws.\n const openHandles = new Set<string>()\n const ctx: StrategyCtx = {\n // Narrowed to open/close — the body gets no raw call()/score() access.\n surface: {\n name: surface.name,\n open: async (t) => {\n const h = await surface.open(t)\n openHandles.add(h.id)\n return h\n },\n close: async (h) => {\n if (!h || !openHandles.has(h.id)) return\n openHandles.delete(h.id)\n await surface.close(h)\n },\n },\n task,\n opts,\n budget,\n scope,\n async shot(spec) {\n const profile = spec?.profile ?? opts.workerProfile\n const innerTurns = profileTurnLimit(profile, 'authored strategy shot')\n const child = leaf(`shot:${seq}`, 'shot', profile)\n seq += 1\n const res = scope.spawn(\n child,\n {\n task,\n handle: spec?.handle,\n messages: spec?.messages,\n steer: spec?.steer,\n profile,\n tools: spec?.tools,\n } as ShotTask,\n { budget: perChild(innerTurns), label: child.name },\n )\n if (!res.ok) return null\n const settled = await drainOne(scope)\n if (settled.kind === 'down') return null\n const out = settled.out as unknown as StrategyShotResult\n if (out.score > verifiedBest) verifiedBest = out.score\n if (out.total > 0 && out.passes === out.total) verifiedResolved = true\n return out\n },\n async listTools(handle) {\n const tools = await surface.tools(task, handle)\n return tools.map((t) => ({\n name: t.function.name,\n ...(t.function.description ? { description: t.function.description } : {}),\n }))\n },\n async critique(messages) {\n const child = leaf(\n `analyst:${seq}`,\n 'analyst',\n opts.analystProfile ?? opts.workerProfile,\n )\n seq += 1\n const res = scope.spawn(\n child,\n { task, messages },\n { budget: perChild(1), label: child.name },\n )\n if (!res.ok) return null\n const settled = await drainOne(scope)\n if (settled.kind === 'down') return null\n const findings = settled.out as unknown as string\n return /^\\s*COMPLETE\\b/i.test(findings) ? null : findings\n },\n async consult(messages, instruction) {\n const child = leaf(\n `analyst:${seq}`,\n 'analyst',\n opts.analystProfile ?? opts.workerProfile,\n )\n seq += 1\n const res = scope.spawn(\n child,\n { task, messages, rawInstruction: instruction },\n { budget: perChild(1), label: child.name },\n )\n if (!res.ok) return null\n const settled = await drainOne(scope)\n if (settled.kind === 'down') return null\n return settled.out as unknown as string\n },\n }\n const r = await run(ctx)\n // Override the body's self-reported score/resolved with the harness-verified\n // values. The body's progression/completions/shots are advisory (display only) —\n // but NORMALIZED: an authored body that omits them must not poison downstream\n // consumers (losses tables, anytime curves) with undefined.\n return {\n kind: 'done',\n deliverable: {\n mode: name,\n ...r,\n progression: Array.isArray(r.progression) ? r.progression : [],\n completions: typeof r.completions === 'number' ? r.completions : 0,\n shots: typeof r.shots === 'number' ? r.shots : 0,\n score: verifiedBest,\n resolved: verifiedResolved,\n },\n }\n },\n }),\n }\n}\n\n/** A NEW strategy, authored from the steps (~20 lines): refine, but when a steered shot\n * fails to improve the score it ABANDONS that line and restarts fresh (branch-when-stuck)\n * — the widen/MCTS idea the depth-stuck failure motivated. Scored keep-best (the best\n * checkpoint across all lines), the deployable metric. This is the \"experts build BETTER\n * optimizations\" path: a new technique, compact, with zero Supervisor ceremony. */\nexport const adaptiveRefine = defineStrategy(\n 'adaptiveRefine',\n async ({ surface, task, budget, shot, critique }) => {\n let handle = await surface.open(task)\n const progression: number[] = []\n let messages: StrategyMessage[] | undefined\n let steer: string | undefined\n let completions = 0\n let best = -1\n let shots = 0\n try {\n for (shots = 0; shots < budget; shots += 1) {\n const out = await shot({ handle, messages, steer })\n if (!out) break\n completions += out.completions\n progression.push(out.score)\n if (out.score >= 1) break\n if (out.score <= best) {\n // Stuck: steering isn't improving this line — abandon it, restart fresh.\n await surface.close(handle)\n handle = await surface.open(task)\n messages = undefined\n steer = undefined\n continue\n }\n best = out.score\n messages = out.messages\n const findings = await critique(out.messages)\n completions += 1\n if (!findings) break\n steer = `A reviewer flagged unfinished items:\\n${findings}\\n\\nAddress each with the tools, verify they took, then continue.`\n }\n const score = progression.length ? Math.max(...progression) : 0\n return { score, resolved: score >= 1, completions, progression, shots }\n } finally {\n await surface.close(handle)\n }\n },\n)\n\n/** The explore-then-exploit MIX: spend ⌈budget/2⌉ on independent samples (kept open),\n * then refine the best-verifying line with the remaining budget. Sample's basin escape +\n * refine's accumulation — the third built-in, authored from the public steps. */\nexport const sampleThenRefine = defineStrategy(\n 'sampleThenRefine',\n async ({ surface, task, budget, shot, critique }) => {\n const explore = Math.max(1, Math.ceil(budget / 2))\n const open = new Set<ArtifactHandle>()\n const progression: number[] = []\n let completions = 0\n let shots = 0\n try {\n // Explore: independent lines on handles we own (kept open so the best can continue).\n let best: { handle: ArtifactHandle; out: StrategyShotResult } | undefined\n for (let i = 0; i < explore; i += 1) {\n const handle = await surface.open(task)\n open.add(handle)\n const out = await shot({ handle })\n if (!out) continue\n shots += 1\n completions += out.completions\n progression.push(out.score)\n if (!best || out.score > best.out.score) best = { handle, out }\n if (out.score >= 1) break\n }\n if (!best) return { score: 0, resolved: false, completions, progression, shots }\n // Exploit: close the losers, refine the winner with the remaining budget.\n for (const h of [...open]) {\n if (h !== best.handle) {\n await surface.close(h)\n open.delete(h)\n }\n }\n let messages = best.out.messages\n let topScore = best.out.score\n for (let i = explore; i < budget && topScore < 1; i += 1) {\n const findings = await critique(messages)\n completions += 1\n if (!findings) break\n const out = await shot({\n handle: best.handle,\n messages,\n steer: `A reviewer flagged unfinished items:\\n${findings}\\n\\nAddress each with the tools, verify they took, then continue.`,\n })\n if (!out) break\n shots += 1\n completions += out.completions\n progression.push(out.score)\n messages = out.messages\n if (out.score > topScore) topScore = out.score\n }\n const score = progression.length ? Math.max(...progression) : 0\n return { score, resolved: score >= 1, completions, progression, shots }\n } finally {\n for (const h of open) await surface.close(h)\n }\n },\n)\n\nexport interface RunAgenticOptions<Result extends StrategyResult = StrategyResult>\n extends AgenticOptions {\n surface: AgenticSurface\n task: AgenticTask\n /** Lifecycle observability — every spawn/settle (shots, analysts) streams here live.\n * The seam online watchdogs/route-auditors subscribe to. */\n hooks?: RuntimeHooks\n /** A Strategy (the open way) — author/pass your own. Overrides `mode` when present. */\n strategy?: Strategy<Result>\n /** Built-in shorthand: 'depth'→refine, 'breadth'→sample. Default 'depth'. */\n mode?: 'depth' | 'breadth'\n /** budget: refine→max shots; sample→rollout width. */\n budget: number\n rootBudget?: Budget\n}\n\n/** Run a Strategy through the keystone Supervisor — `Agent.act` over a conserved-budget Scope. */\nexport async function runAgentic<Result extends StrategyResult = StrategyResult>(\n opts: RunAgenticOptions<Result>,\n): Promise<AgenticRunResult & Result> {\n const workerProfile = exactAgenticProfile(opts.workerProfile, 'runAgentic worker')\n requiredProfileModel(workerProfile, 'runAgentic worker')\n const analystProfile = exactAgenticProfile(\n opts.analystProfile ?? workerProfile,\n 'runAgentic analyst',\n )\n requiredProfileModel(analystProfile, 'runAgentic analyst')\n const exactOpts: RunAgenticOptions<Result> = {\n ...opts,\n workerProfile,\n analystProfile,\n }\n const strategy: Strategy = opts.strategy ?? (opts.mode === 'breadth' ? sample : refine)\n const driver = strategy.driver(opts.surface, opts.task, exactOpts, opts.budget)\n const supervisor = createSupervisor<unknown, Outcome<unknown>>()\n const rootTurnLimit = profileTurnLimit(workerProfile, 'runAgentic worker')\n const root: Budget = opts.rootBudget ?? {\n maxIterations:\n opts.budget * ((rootTurnLimit === 0 ? UNBOUNDED_TURN_RESERVATION : rootTurnLimit) + 2),\n maxTokens: 1_000_000_000,\n }\n const started = Date.now()\n const result = await supervisor.run(driver, undefined, {\n budget: root,\n runId: `agentic:${strategy.name}:${opts.task.id}`,\n journal: new InMemorySpawnJournal(),\n blobs: new InMemoryResultBlobStore(),\n executors: agenticRegistry(opts.surface, exactOpts),\n maxDepth: 3,\n ...(opts.hooks ? { hooks: opts.hooks } : {}),\n })\n if (result.kind !== 'winner' || result.out.kind !== 'done') {\n const reason =\n result.kind === 'winner'\n ? `blocked: ${(result.out as { blockers?: string[] }).blockers?.join('; ')}`\n : `no-winner: ${result.reason}`\n throw new Error(`runAgentic(${strategy.name}) produced no result — ${reason}`)\n }\n // Drivers deliver the strategy outcome; the cost vector is stamped here from `result.spentTotal`\n // (the journal aggregate: settled child work + metered driver inference) + wall clock.\n const core = result.out.deliverable as Omit<\n AgenticRunResult & Result,\n 'usd' | 'usdKnown' | 'ms' | 'tokens' | 'tokensKnown'\n >\n return {\n ...core,\n usd: result.spentTotal.usd,\n usdKnown: result.spentTotal.usdKnown !== false,\n tokens: result.spentTotal.tokens,\n tokensKnown: result.spentTotal.tokensKnown !== false,\n ms: Date.now() - started,\n } as AgenticRunResult & Result\n}\n","/**\n * structuralRollout — the measured structural lever as a fourth member of the\n * sample/refine/sampleThenRefine strategy family: k independent samples, selection by\n * TASK-VISIBLE checks only, then a guarded self-repair loop steered by the checks'\n * failure output. Design: docs/design/structural-rollout-integration.md; measured basis\n * (bench/src/hev-structural.mts, bench/src/mbpp-structural.mts): +8.5..+21.3pp hidden-test\n * lift across Llama-3-8B/Qwen2.5-7B × HumanEval/MBPP, null only at saturation.\n *\n * Honesty invariants carried over from the proven rigs:\n * - Visible checks are generated from task-visible information only, BEFORE any\n * candidate exists, and FROZEN for every sample and repair round of the task.\n * - OFFICIAL checks (shown in the task itself) rank lexicographically above\n * model-AUTHORED guesses. This ordering is measured, not stylistic: authored guesses\n * run 17–70% wrong depending on model × spec richness, and unweighted they flipped\n * selection NEGATIVE on MBPP (6 noisy guesses outvoting the one reliable check).\n * - A candidate that crashed before the checks could run ranks below one that ran and\n * failed everything.\n * - Repair sees ONLY the checks' failure output, and never displaces a candidate that\n * passes more official checks with one that passes fewer (wrong visible examples\n * poison repair at saturation — the glm /47,/116 regressions).\n *\n * Placement rule: this is an INFERENCE-TIME capability (it wraps the model call via the\n * strategy seam). It does not belong in `improve()` (training-time); `improve()`\n * may later tune `StructuralRolloutPolicy` as an optimizable surface.\n */\n\nimport { randomBytes } from 'node:crypto'\nimport {\n type AgenticTask,\n defineStrategy,\n type Strategy,\n type StrategyCtx,\n type StrategyResult,\n} from './strategy'\nimport type { SelectionReceipt } from './types'\n\n/** Provider-neutral conversation records read by structural candidate extraction. */\nexport type StructuralRolloutMessage = Record<string, unknown>\n\n// ── Policy ────────────────────────────────────────────────────────────────────────\n\n/** The rollout's compute recipe — promoted from the proven rigs' env vars (K/REPAIRS/\n * TESTGEN/DIVERSE/TEMPERATURE). Defaults are the measured sweet spot: repair value\n * concentrates at low k (~+12pp at k=1, +1–3pp at k=5), so `k=5, repairRounds=2` is the\n * full recipe and `k=1, repairRounds=2` the low-compute preset. */\nexport interface StructuralRolloutPolicy {\n /** Independent samples per task (selection breadth). */\n k: number\n /** Repair shots after selection, each steered by the checks' failure output. */\n repairRounds: number\n /** Model-authored visible checks requested per task; 0 disables authoring. */\n testgen: number\n /** Per-slot strategy-lens prefixes on the k samples (attacks the all-k-fail bucket).\n * Measured as a paired null (+0.6pp) — kept as an optional knob, off by default. */\n diverse?: boolean\n}\n\n/** The measured default recipe: 5 samples, 2 guarded repair rounds, 6 authored checks. */\nexport const defaultStructuralRolloutPolicy: StructuralRolloutPolicy = {\n k: 5,\n repairRounds: 2,\n testgen: 6,\n}\n\nfunction resolvePolicy(overrides?: Partial<StructuralRolloutPolicy>): StructuralRolloutPolicy {\n const policy = { ...defaultStructuralRolloutPolicy, ...overrides }\n if (!Number.isInteger(policy.k) || policy.k < 1) {\n throw new Error(`structuralRollout: policy.k must be an integer >= 1, got ${policy.k}`)\n }\n if (!Number.isInteger(policy.repairRounds) || policy.repairRounds < 0) {\n throw new Error(\n `structuralRollout: policy.repairRounds must be an integer >= 0, got ${policy.repairRounds}`,\n )\n }\n if (!Number.isInteger(policy.testgen) || policy.testgen < 0) {\n throw new Error(\n `structuralRollout: policy.testgen must be an integer >= 0, got ${policy.testgen}`,\n )\n }\n return policy\n}\n\n// ── Visible checks: the CheckSource seam (the only net-new seam of the design) ──────\n\n/** One task-visible executable check (e.g. a single-line Python assert). */\nexport interface VisibleCheck {\n code: string\n /** 'official' = shown in the task itself (docstring example, shown assert);\n * 'authored' = the model's own guess. Official outranks authored in selection. */\n kind: 'official' | 'authored'\n}\n\n/** What a CheckSource composes with. `consult` is the strategy family's raw analyst\n * channel (metered by the conserved pool, offline-injectable via `opts.complete`) —\n * check authoring goes through it rather than a bespoke model client. */\nexport interface CheckSourceCtx {\n /** Authored-check budget for this task (`policy.testgen`). */\n count: number\n /** The symbol authored checks must reference; undefined ⇒ authoring is skipped\n * (no guesses beats guesses pinned to nothing). */\n entrySymbol?: string\n /** One metered LLM call: instruction in, reply text out, null when the channel went\n * down. The task's visible prompt is included by the channel itself. */\n consult(instruction: string): Promise<string | null>\n}\n\n/** Produces the task's visible checks. MUST derive them from agent-visible information\n * only, before any candidate exists — the strategy freezes the returned set for every\n * sample and repair round of the task. */\nexport interface CheckSource {\n generate(task: AgenticTask, ctx: CheckSourceCtx): Promise<VisibleCheck[]>\n}\n\nconst authorInstruction = (count: number, entry: string) =>\n `Read the task below. Write exactly ${count} single-line assert statements that test the ` +\n `function \\`${entry}\\`, based ONLY on the behavior the task itself describes. Each assert ` +\n `must be one physical line of the form \\`assert ${entry}(...) == expected\\` (or a True/False ` +\n 'check). Do NOT implement the function. Do NOT copy shown examples verbatim if you can test ' +\n 'other cases too. Output ONLY the assert lines inside a single ```python code block.'\n\n/** The proven authored-assert filter (lifted from the rigs' generateTests): keep only\n * single-line, paren-balanced asserts that reference the entry symbol — malformed lines\n * are dropped here rather than poisoning every candidate's score identically. */\nexport function filterAuthoredAsserts(reply: string, entrySymbol: string, count: number): string[] {\n const fences = [...reply.matchAll(/```(?:python|py)?\\s*\\n([\\s\\S]*?)```/gi)].map((m) =>\n (m[1] ?? '').trim(),\n )\n const block = fences.length > 0 ? fences.join('\\n') : reply\n const balanced = (s: string) => {\n let d = 0\n for (const ch of s) {\n if (ch === '(' || ch === '[' || ch === '{') d += 1\n else if (ch === ')' || ch === ']' || ch === '}') d -= 1\n if (d < 0) return false\n }\n return d === 0\n }\n return block\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.startsWith('assert ') && l.includes(entrySymbol) && balanced(l))\n .slice(0, count)\n}\n\n/** Default authored-check source: one metered LLM call per task, before sampling,\n * filtered through `filterAuthoredAsserts`. Returns [] (no signal, never a fabricated\n * check) when the budget is 0, no entry symbol resolves, or the channel went down. */\nexport function modelAuthoredChecks(overrides: { count?: number } = {}): CheckSource {\n return {\n async generate(_task, ctx): Promise<VisibleCheck[]> {\n const count = overrides.count ?? ctx.count\n if (count <= 0 || !ctx.entrySymbol) return []\n const entry = ctx.entrySymbol\n const reply = await ctx.consult(authorInstruction(count, entry))\n if (!reply) return []\n return filterAuthoredAsserts(reply, entry, count).map((code) => ({\n code,\n kind: 'authored' as const,\n }))\n },\n }\n}\n\n/** Official checks the surface stashed on the task (e.g. MBPP's shown assert). Reads\n * `task.meta[key]` as a string array; anything else means no official checks. */\nexport function officialChecksFromMeta(key = 'visibleChecks'): CheckSource {\n return {\n async generate(task): Promise<VisibleCheck[]> {\n const raw = task.meta?.[key]\n if (!Array.isArray(raw)) return []\n return raw\n .filter((c): c is string => typeof c === 'string' && c.trim().length > 0)\n .map((code) => ({ code, kind: 'official' as const }))\n },\n }\n}\n\n/** Concatenate check sources (official first by convention — ordering does not affect\n * scoring, which reads each check's `kind`). */\nexport function composeCheckSources(...sources: CheckSource[]): CheckSource {\n return {\n async generate(task, ctx): Promise<VisibleCheck[]> {\n const all: VisibleCheck[] = []\n for (const source of sources) all.push(...(await source.generate(task, ctx)))\n return all\n },\n }\n}\n\n/** The symbol authored checks are pinned to: `task.meta.entryPoint` when the surface\n * provides it, else the LAST `def name(` in the visible prompt (a code-completion stub\n * lists helpers first, the entry stub last). Undefined ⇒ authoring is skipped. */\nexport function resolveEntrySymbol(task: AgenticTask): string | undefined {\n const meta = task.meta?.entryPoint\n if (typeof meta === 'string' && meta.trim().length > 0) return meta.trim()\n const defs = [...task.userPrompt.matchAll(/(?:^|\\n)\\s*def\\s+([A-Za-z_]\\w*)\\s*\\(/g)]\n const last = defs[defs.length - 1]\n return last?.[1]\n}\n\n// ── Check execution: the CheckRunner seam ────────────────────────────────────────────\n\n/** How one candidate fared against the frozen visible checks, split by check kind. */\nexport interface CheckOutcome {\n passedOfficial: number\n totalOfficial: number\n passedAuthored: number\n totalAuthored: number\n /** The checks' failure report — the ONLY feedback the repair loop may see. */\n failureOutput: string\n /** True when the candidate crashed before any check could run — ranks below a\n * candidate that ran and failed everything. */\n crashed?: boolean\n}\n\n/** Minimal exec channel the default runner needs. `SandboxInstance` (and therefore\n * `ValidationCtx.box`) satisfies it structurally. */\nexport interface CheckExecChannel {\n exec(\n command: string,\n options?: { timeoutMs?: number },\n ): Promise<{ exitCode: number; stdout: string; stderr: string }>\n}\n\nexport interface CheckRunContext {\n task: AgenticTask\n /** Live exec channel for this run (`ValidationCtx.box` / a sandbox instance). */\n box?: CheckExecChannel\n signal?: AbortSignal\n}\n\n/** Executes the frozen checks against one candidate. Implementations MUST fail loud\n * (throw) when they cannot execute — a silent zero poisons selection. */\nexport interface CheckRunner {\n run(candidate: string, checks: VisibleCheck[], ctx: CheckRunContext): Promise<CheckOutcome>\n}\n\n/** The check program (mirrors the rigs' visible-check judge): candidate executes at\n * module level, then each check runs INDIVIDUALLY in try/except so one malformed line\n * cannot zero the rest; the summary line carries a per-call NONCE so a candidate\n * printing a forged summary cannot be parsed as the verdict. */\nfunction buildCheckProgram(\n candidate: string,\n official: string[],\n authored: string[],\n nonce: string,\n): string {\n const officialB64 = Buffer.from(JSON.stringify(official), 'utf8').toString('base64')\n const authoredB64 = Buffer.from(JSON.stringify(authored), 'utf8').toString('base64')\n return `${candidate}\\n\nimport base64 as _b64, json as _json, sys as _sys\n_official = _json.loads(_b64.b64decode(\"${officialB64}\").decode(\"utf8\"))\n_authored = _json.loads(_b64.b64decode(\"${authoredB64}\").decode(\"utf8\"))\n_lines = []\ndef _run(_tests):\n _att, _fail = 0, 0\n for _t in _tests:\n _att += 1\n try:\n exec(_t, dict(globals()))\n except Exception as _e:\n _fail += 1\n _lines.append(\"CHECK FAILED: %s -> %s: %s\" % (_t.strip()[:200], type(_e).__name__, str(_e)[:200]))\n return _att, _fail\n_o_att, _o_fail = _run(_official)\n_a_att, _a_fail = _run(_authored)\nprint(\"SRCK-${nonce} official=%d/%d authored=%d/%d\" % (_o_att - _o_fail, _o_att, _a_att - _a_fail, _a_att))\n_sys.stdout.write(\"\\\\n\".join(_lines)[-1500:])\n_sys.exit(0 if (_o_fail + _a_fail) == 0 and (_o_att + _a_att) > 0 else 1)\n`\n}\n\n/** Default CheckRunner backend: pipes the check program into `python3` over the sandbox\n * exec channel (`ctx.box`, or one bound at construction). Never shells out to docker\n * itself — the jail is the sandbox's concern. No channel ⇒ throws; it must never\n * silently score 0. Empty check sets short-circuit to a no-signal outcome (nothing to\n * execute, so no channel is required). */\nexport function sandboxCheckRunner(\n options: { box?: CheckExecChannel; python?: string; timeoutMs?: number } = {},\n): CheckRunner {\n const python = options.python ?? 'python3'\n const timeoutMs = options.timeoutMs ?? 20000\n return {\n async run(candidate, checks, ctx): Promise<CheckOutcome> {\n if (checks.length === 0) {\n return {\n passedOfficial: 0,\n totalOfficial: 0,\n passedAuthored: 0,\n totalAuthored: 0,\n failureOutput: '',\n }\n }\n const box = ctx.box ?? options.box\n if (!box) {\n throw new Error(\n 'sandboxCheckRunner: no execution channel — bind one via sandboxCheckRunner({ box }) ' +\n 'or CheckRunContext.box (ValidationCtx.box / a sandbox instance). Refusing to score ' +\n 'without executing: a silent 0 would poison selection.',\n )\n }\n const nonce = randomBytes(8).toString('hex')\n const official = checks.filter((c) => c.kind === 'official').map((c) => c.code)\n const authored = checks.filter((c) => c.kind === 'authored').map((c) => c.code)\n const program = buildCheckProgram(candidate, official, authored, nonce)\n const b64 = Buffer.from(program, 'utf8').toString('base64')\n const r = await box.exec(`printf '%s' '${b64}' | base64 -d | ${python} -`, { timeoutMs })\n const summary = new RegExp(\n `SRCK-${nonce} official=(\\\\d+)/(\\\\d+) authored=(\\\\d+)/(\\\\d+)`,\n ).exec(r.stdout)\n if (!summary) {\n // The candidate crashed (or hung) before the check scaffold could report.\n const detail =\n (r.stderr || r.stdout).slice(-1500) ||\n 'no output (crashed or timed out before the checks could run)'\n return {\n passedOfficial: 0,\n totalOfficial: 0,\n passedAuthored: 0,\n totalAuthored: 0,\n failureOutput: detail,\n crashed: true,\n }\n }\n // Strip the sentinel line from repair feedback — the model must never learn the\n // summary format it could try to forge.\n const failureOutput = r.stdout.replace(summary[0], '').slice(-1500).trim()\n return {\n passedOfficial: Number(summary[1]),\n totalOfficial: Number(summary[2]),\n passedAuthored: Number(summary[3]),\n totalAuthored: Number(summary[4]),\n failureOutput,\n }\n },\n }\n}\n\n// ── Selection order (measured, not stylistic) ────────────────────────────────────────\n\nconst frac = (passed: number, total: number) => (total > 0 ? passed / total : 0)\n\n/** The selection order: crash < ran; then official pass-fraction; authored guesses only\n * break ties. Returns > 0 when `a` outranks `b`. Strictly lexicographic — on MBPP,\n * letting 6 noisy guesses outvote the one official check flipped selection negative. */\nexport function compareCheckOutcomes(a: CheckOutcome, b: CheckOutcome): number {\n const aCrashed = a.crashed === true\n const bCrashed = b.crashed === true\n if (aCrashed !== bCrashed) return aCrashed ? -1 : 1\n if (aCrashed) return 0\n const official = frac(a.passedOfficial, a.totalOfficial) - frac(b.passedOfficial, b.totalOfficial)\n if (official !== 0) return official\n return frac(a.passedAuthored, a.totalAuthored) - frac(b.passedAuthored, b.totalAuthored)\n}\n\n/** Display scalar for receipts/reports (the rigs' `visibleScore` shape): crash = -1,\n * else official fraction + 0.001 × authored fraction. Selection itself uses the exact\n * lexicographic comparator, never this scalar. */\nexport function visibleCheckScore(o: CheckOutcome): number {\n if (o.crashed) return -1\n return frac(o.passedOfficial, o.totalOfficial) + 0.001 * frac(o.passedAuthored, o.totalAuthored)\n}\n\n/** Argmax by `compareCheckOutcomes`, FIRST index wins ties (deterministic; with zero\n * visible coverage every candidate ties at no-signal and index 0 is the blind pick). */\nexport function selectBestIndex(outcomes: ReadonlyArray<CheckOutcome>): number {\n let best = 0\n for (let i = 1; i < outcomes.length; i += 1) {\n if (compareCheckOutcomes(outcomes[i] as CheckOutcome, outcomes[best] as CheckOutcome) > 0) {\n best = i\n }\n }\n return best\n}\n\n/** The repair keep-best guard: a challenger displaces the incumbent only when it is\n * strictly better in the selection order AND passes at least as many official checks.\n * The raw-count clause is deliberate belt-and-braces over the comparator (a custom\n * runner can report shifted totals): repair must NEVER replace a candidate that passes\n * more official checks with one that passes fewer. */\nexport function canDisplace(challenger: CheckOutcome, incumbent: CheckOutcome): boolean {\n if (challenger.crashed === true) return false\n if (challenger.passedOfficial < incumbent.passedOfficial) return false\n return compareCheckOutcomes(challenger, incumbent) > 0\n}\n\nconst totalChecks = (o: CheckOutcome) => o.totalOfficial + o.totalAuthored\n\nconst passesAllChecks = (o: CheckOutcome) =>\n o.crashed !== true &&\n totalChecks(o) > 0 &&\n o.passedOfficial === o.totalOfficial &&\n o.passedAuthored === o.totalAuthored\n\n// ── Candidate extraction ─────────────────────────────────────────────────────────────\n\n/** The candidate a shot produced, read from its conversation: the LAST `submit_answer`\n * tool-call argument (verifier environments submit the artifact explicitly), else the\n * latest assistant reply's fenced code block — preferring a block containing a `def`,\n * because repair replies echo the failure report in a bare fence BEFORE the fixed code\n * (the rigs' extractRepairCode lesson) — else the latest non-empty assistant text. */\nexport function defaultExtractCandidate(messages: ReadonlyArray<StructuralRolloutMessage>): string {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n const calls = messages[i]?.tool_calls as\n | Array<{ function?: { name?: string; arguments?: string } }>\n | undefined\n if (!calls) continue\n for (let j = calls.length - 1; j >= 0; j -= 1) {\n const call = calls[j]\n if (call?.function?.name !== 'submit_answer') continue\n try {\n const args = JSON.parse(call.function.arguments ?? '{}') as { answer?: unknown }\n if (typeof args.answer === 'string' && args.answer.trim()) return args.answer.trim()\n } catch {\n /* malformed arguments — keep scanning */\n }\n }\n }\n const contents: string[] = []\n for (const m of messages) {\n if (m.role === 'assistant' && typeof m.content === 'string' && m.content.trim()) {\n contents.push(m.content)\n }\n }\n const fencesOf = (text: string) =>\n [...text.matchAll(/```(?:python|py)?\\s*\\n([\\s\\S]*?)```/gi)].map((m) => (m[1] ?? '').trim())\n for (let i = contents.length - 1; i >= 0; i -= 1) {\n const fences = fencesOf(contents[i] as string)\n for (let j = fences.length - 1; j >= 0; j -= 1) {\n if (/(^|\\n)\\s*def\\s+\\w+/.test(fences[j] as string)) return fences[j] as string\n }\n }\n for (let i = contents.length - 1; i >= 0; i -= 1) {\n const fences = fencesOf(contents[i] as string)\n if (fences.length > 0) return fences[fences.length - 1] as string\n }\n return (contents[contents.length - 1] ?? '').trim()\n}\n\n// ── The strategy ─────────────────────────────────────────────────────────────────────\n\n/** Per-slot approach lenses for `diverse` mode — copied from bench/src/directives.ts\n * (the measured rig plumbing; a paired null there, kept as an optional knob). */\nconst DIVERSE_LENSES: ReadonlyArray<string> = [\n 'Answer directly and decisively from what you already know. State the single best answer without hedging.',\n 'Decompose the question into the sub-facts it depends on. Establish each sub-fact explicitly, then compose them into the answer.',\n 'Reason from first principles. Ignore the most obvious or popular guess; derive the answer from underlying facts and relationships.',\n 'Name the most plausible WRONG answer and the trap that makes it tempting. Rule it out, then commit to the answer that survives.',\n]\n\nfunction slotLens(slot: number): string {\n const lens = DIVERSE_LENSES[slot % DIVERSE_LENSES.length] as string\n const tag =\n slot < DIVERSE_LENSES.length ? '' : ` (variant ${Math.floor(slot / DIVERSE_LENSES.length) + 1})`\n return `${lens}${tag}`\n}\n\nfunction repairSteer(outcome: CheckOutcome): string {\n return [\n 'Your latest solution failed some of the task-visible checks.',\n 'Result of running the visible checks against it:',\n '```',\n outcome.failureOutput.trim() || '(the code crashed before the checks could run)',\n '```',\n 'Fix the solution so the visible checks pass. Provide the COMPLETE corrected solution the',\n 'same way you provided the original (same tool or format) — not a fragment or a diff.',\n ].join('\\n')\n}\n\nfunction describeOutcome(label: string, o: CheckOutcome): string {\n if (o.crashed) return `${label}: crashed before the checks could run`\n return (\n `${label}: official ${o.passedOfficial}/${o.totalOfficial}, ` +\n `authored ${o.passedAuthored}/${o.totalAuthored}`\n )\n}\n\nexport type RepairStop =\n | 'already-passing'\n | 'no-signal'\n | 'repaired-pass'\n | 'rounds-exhausted'\n | 'no-candidates'\n\n/** The body's deliverable — a `StrategyResult` plus selection provenance. The extra\n * fields ride through `defineStrategy`'s deliverable spread onto `AgenticRunResult`\n * (score/resolved stay harness-verified, exactly as for every authored strategy). */\nexport interface StructuralRolloutResult extends StrategyResult {\n /** Exact selected candidate text passed to the visible checks, or null when no shot ran. */\n artifact: string | null\n /** One receipt per scored candidate (k samples, then repairs), `SelectionReceipt`\n * shaped like the kernel's (`types.ts`), selector 'driver'. */\n selection: SelectionReceipt[]\n repairStop: RepairStop\n officialChecks: number\n authoredChecks: number\n}\n\nexport interface StructuralRolloutConfig {\n /** Knobs; missing fields take the measured defaults (k=5, repairRounds=2, testgen=6). */\n policy?: Partial<StructuralRolloutPolicy>\n /** Where the visible checks come from. Default: official checks from\n * `task.meta.visibleChecks` composed with `modelAuthoredChecks()`. */\n checkSource?: CheckSource\n /** How candidates are measured. Default `sandboxCheckRunner()` — it needs an exec\n * channel (bind one to the runner, or pass `box` here) and fails loud without one. */\n checkRunner?: CheckRunner\n /** Exec channel threaded into every check run of this strategy (a sandbox instance /\n * `ValidationCtx.box`). The strategy seam itself carries no sandbox, so the caller\n * who owns one supplies it here or binds it into the runner. */\n box?: CheckExecChannel\n /** Candidate extraction from a shot's conversation. Default `defaultExtractCandidate`. */\n extractCandidate?: (messages: ReadonlyArray<StructuralRolloutMessage>) => string\n}\n\n/**\n * Build the structuralRollout `Strategy`: k shots → score each by the frozen visible\n * checks (official above authored, crash lowest) → argmax with first-index tie-break →\n * up to `repairRounds` repair shots steered by the failure output, keep-best under the\n * official-check guard. Authored via `defineStrategy`, so the deliverable score stays\n * harness-verified and every shot is metered by the conserved pool.\n *\n * Budget note: `runAgentic`'s `budget` sizes the pool — pass at least\n * `k + repairRounds + 1` so the samples, repairs, and the check-author consult all admit.\n */\nexport function structuralRollout(\n config: StructuralRolloutConfig = {},\n): Strategy<StructuralRolloutResult> {\n const policy = resolvePolicy(config.policy)\n const checkSource =\n config.checkSource ?? composeCheckSources(officialChecksFromMeta(), modelAuthoredChecks())\n const checkRunner = config.checkRunner ?? sandboxCheckRunner()\n const extract = config.extractCandidate ?? defaultExtractCandidate\n\n const inner = defineStrategy(\n 'structuralRollout',\n async (ctx: StrategyCtx): Promise<StructuralRolloutResult> => {\n const { task, shot } = ctx\n const progression: number[] = []\n const receipts: SelectionReceipt[] = []\n let completions = 0\n let shots = 0\n\n // Freeze the visible checks BEFORE any candidate exists — every sample and repair\n // round is measured against this same set. Authoring goes through the strategy's\n // raw analyst channel, so its spend is metered and the offline transport applies.\n const consult = async (instruction: string): Promise<string | null> => {\n const reply = await ctx.consult([], instruction)\n completions += 1\n return reply\n }\n const entrySymbol = resolveEntrySymbol(task)\n const checks = await checkSource.generate(task, {\n count: policy.testgen,\n ...(entrySymbol ? { entrySymbol } : {}),\n consult,\n })\n const officialChecks = checks.filter((c) => c.kind === 'official').length\n const authoredChecks = checks.length - officialChecks\n const runCtx: CheckRunContext = { task, ...(config.box ? { box: config.box } : {}) }\n\n interface Candidate {\n index: number\n messages: StructuralRolloutMessage[]\n artifact: string\n outcome: CheckOutcome\n shotScore: number\n shotResolved: boolean\n }\n\n // k independent samples, each on its own artifact, scored by the frozen checks.\n const candidates: Candidate[] = []\n for (let i = 0; i < policy.k; i += 1) {\n const out = await shot(policy.diverse ? { steer: slotLens(i) } : undefined)\n if (!out) break // pool starved — select among what settled\n shots += 1\n completions += out.completions\n progression.push(out.score)\n const artifact = extract(out.messages)\n const outcome = await checkRunner.run(artifact, checks, runCtx)\n candidates.push({\n index: candidates.length,\n messages: out.messages,\n artifact,\n outcome,\n shotScore: out.score,\n shotResolved: out.total > 0 && out.passes === out.total,\n })\n }\n if (candidates.length === 0) {\n return {\n score: 0,\n resolved: false,\n completions,\n progression,\n shots,\n artifact: null,\n selection: receipts,\n repairStop: 'no-candidates',\n officialChecks,\n authoredChecks,\n }\n }\n\n // Argmax by the official-first order; first index wins ties (the blind pick when\n // the task has zero visible coverage).\n let best = candidates[selectBestIndex(candidates.map((c) => c.outcome))] as Candidate\n for (const c of candidates) {\n receipts.push({\n candidateIndex: c.index,\n selected: false,\n score: visibleCheckScore(c.outcome),\n reason: describeOutcome('sample', c.outcome),\n selector: 'driver',\n })\n }\n\n // Guarded repair: steered ONLY by the checks' failure output, keep-best, and a\n // repair never displaces a candidate that passes more official checks.\n let seq = candidates.length\n let repairStop: RepairStop = 'already-passing'\n if (!passesAllChecks(best.outcome)) {\n if (best.outcome.crashed !== true && totalChecks(best.outcome) === 0) {\n repairStop = 'no-signal' // no visible checks ⇒ nothing honest to steer on\n } else {\n repairStop = 'rounds-exhausted'\n for (let r = 0; r < policy.repairRounds; r += 1) {\n const out = await shot({ messages: best.messages, steer: repairSteer(best.outcome) })\n if (!out) break\n shots += 1\n completions += out.completions\n progression.push(out.score)\n const artifact = extract(out.messages)\n const outcome = await checkRunner.run(artifact, checks, runCtx)\n const displaced = canDisplace(outcome, best.outcome)\n const label = displaced\n ? 'repair (displaced the incumbent)'\n : outcome.crashed !== true && outcome.passedOfficial < best.outcome.passedOfficial\n ? 'repair (held out: passes fewer official checks than the incumbent)'\n : 'repair (held out: no improvement)'\n receipts.push({\n candidateIndex: seq,\n selected: false,\n score: visibleCheckScore(outcome),\n reason: describeOutcome(label, outcome),\n selector: 'driver',\n })\n if (displaced) {\n best = {\n index: seq,\n messages: out.messages,\n artifact,\n outcome,\n shotScore: out.score,\n shotResolved: out.total > 0 && out.passes === out.total,\n }\n }\n seq += 1\n if (passesAllChecks(best.outcome)) {\n repairStop = 'repaired-pass'\n break\n }\n }\n }\n }\n\n const winner = receipts.find((r) => r.candidateIndex === best.index)\n if (winner) winner.selected = true\n\n return {\n score: best.shotScore,\n resolved: best.shotResolved,\n completions,\n progression,\n shots,\n artifact: best.artifact,\n selection: receipts,\n repairStop,\n officialChecks,\n authoredChecks,\n }\n },\n )\n\n return inner\n}\n"],"mappings":"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"}