@tangle-network/agent-runtime 0.109.1 → 0.110.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.
- package/dist/{activation-CM-L6TtL.js → activation-CsuHCZVN.js} +3 -3
- package/dist/{activation-CM-L6TtL.js.map → activation-CsuHCZVN.js.map} +1 -1
- package/dist/agent.d.ts +4 -4
- package/dist/agent.js +2 -2
- package/dist/agent.js.map +1 -1
- package/dist/{analyst-loop-C8cGThTW.js → analyst-loop-BoNIG2hA.js} +30 -9
- package/dist/analyst-loop-BoNIG2hA.js.map +1 -0
- package/dist/analyst-loop.d.ts +1 -1
- package/dist/analyst-loop.js +1 -1
- package/dist/candidate-execution/index.js +4 -4
- package/dist/{candidate-execution-nYMa-bc-.js → candidate-execution-Co3sRC_7.js} +4 -4
- package/dist/{candidate-execution-nYMa-bc-.js.map → candidate-execution-Co3sRC_7.js.map} +1 -1
- package/dist/{environment-provider-CfLUmKmf.js → environment-provider-BsHpW4Dp.js} +52 -5
- package/dist/environment-provider-BsHpW4Dp.js.map +1 -0
- package/dist/{environment-provider-CMqSAp-O.d.ts → environment-provider-CTEMEP9u.d.ts} +9 -1
- package/dist/environment-provider.d.ts +1 -1
- package/dist/environment-provider.js +1 -1
- package/dist/{improvement-adapter-BaAdfJKT.d.ts → improvement-adapter-D5gwwoXQ.d.ts} +2 -2
- package/dist/{improvement-cycle-9O4iVFOA.js → improvement-cycle-ryAyCLKN.js} +5 -5
- package/dist/{improvement-cycle-9O4iVFOA.js.map → improvement-cycle-ryAyCLKN.js.map} +1 -1
- package/dist/{index-Cn5TtHUG.d.ts → index-C-Zn0VrN.d.ts} +3 -3
- package/dist/{index-bXiMVrUv.d.ts → index-D_OdNLe0.d.ts} +290 -96
- package/dist/{index-Bur6uUF4.d.ts → index-WODlt7iz.d.ts} +6 -6
- package/dist/index.d.ts +5 -5
- package/dist/index.js +11 -11
- package/dist/intelligence.d.ts +2 -2
- package/dist/intelligence.js +39 -9
- package/dist/intelligence.js.map +1 -1
- package/dist/kernel.d.ts +3 -3
- package/dist/kernel.js +7 -7
- package/dist/{knowledge-1a38bcUT.js → knowledge-DBNAteaC.js} +5 -5
- package/dist/{knowledge-1a38bcUT.js.map → knowledge-DBNAteaC.js.map} +1 -1
- package/dist/knowledge.d.ts +1 -1
- package/dist/knowledge.js +1 -1
- package/dist/{loop-runner-bin-CSzrWlgE.d.ts → loop-runner-bin-BUm83y1g.d.ts} +4 -4
- package/dist/{loop-runner-bin-V4EN9aNT.js → loop-runner-bin-zE7DyGop.js} +4 -4
- package/dist/{loop-runner-bin-V4EN9aNT.js.map → loop-runner-bin-zE7DyGop.js.map} +1 -1
- package/dist/loop-runner-bin.d.ts +1 -1
- package/dist/loop-runner-bin.js +1 -1
- package/dist/mcp/bin.js +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +5 -5
- package/dist/{openai-tools-DT9FH2_t.js → openai-tools-st-hERvA.js} +2 -2
- package/dist/{openai-tools-DT9FH2_t.js.map → openai-tools-st-hERvA.js.map} +1 -1
- package/dist/{prepare-Pr19X93k.js → prepare-BKVdOn0w.js} +15 -14
- package/dist/prepare-BKVdOn0w.js.map +1 -0
- package/dist/primeintellect/index.d.ts +1 -1
- package/dist/{protected-model-port-uthtDNqu.js → protected-model-port-BtldAE9j.js} +2 -2
- package/dist/{protected-model-port-uthtDNqu.js.map → protected-model-port-BtldAE9j.js.map} +1 -1
- package/dist/{runtime-BVMyqgct.js → runtime-DSkMJb_X.js} +415 -27
- package/dist/runtime-DSkMJb_X.js.map +1 -0
- package/dist/{spawn-journal-CwPvKUTa.js → spawn-journal-DLhnom3e.js} +2 -2
- package/dist/{spawn-journal-CwPvKUTa.js.map → spawn-journal-DLhnom3e.js.map} +1 -1
- package/dist/{structural-rollout-ASQLr4-v.js → structural-rollout-CgnNy7_4.js} +3 -3
- package/dist/{structural-rollout-ASQLr4-v.js.map → structural-rollout-CgnNy7_4.js.map} +1 -1
- package/dist/{supervise-DyPmmhJ6.js → supervise-CeZtA1wu.js} +223 -107
- package/dist/supervise-CeZtA1wu.js.map +1 -0
- package/dist/{supervisor-sTJC9psT.js → supervisor-ByCPHcp9.js} +82 -24
- package/dist/supervisor-ByCPHcp9.js.map +1 -0
- package/dist/testing.js +9 -9
- package/dist/{types-CfGKhIuj.d.ts → types-zWfqDjeL.d.ts} +10 -1
- package/dist/{util-MVgdwuIS.js → util-Cc9g9Y-o.js} +2 -2
- package/dist/{util-MVgdwuIS.js.map → util-Cc9g9Y-o.js.map} +1 -1
- package/dist/{workspace-archive-C9w_rxt6.js → workspace-archive-CYYxZyA7.js} +2 -2
- package/dist/{workspace-archive-C9w_rxt6.js.map → workspace-archive-CYYxZyA7.js.map} +1 -1
- package/package.json +7 -7
- package/dist/analyst-loop-C8cGThTW.js.map +0 -1
- package/dist/environment-provider-CfLUmKmf.js.map +0 -1
- package/dist/prepare-Pr19X93k.js.map +0 -1
- package/dist/runtime-BVMyqgct.js.map +0 -1
- package/dist/supervise-DyPmmhJ6.js.map +0 -1
- package/dist/supervisor-sTJC9psT.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-BVMyqgct.js","names":["isAsyncIterable"],"sources":["../src/runtime/key-provider.ts","../src/runtime/mcp-environment.ts","../src/runtime/stdio-mcp-client.ts","../src/runtime/audit-intent.ts","../src/runtime/benchmark-report.ts","../src/runtime/completion.ts","../src/runtime/loop-dispatch.ts","../src/runtime/inline-sandbox-client.ts","../src/runtime/local-sandbox-client.ts","../src/runtime/resolve-sandbox-client.ts","../src/runtime/steering-drivers.ts","../src/runtime/define-leaderboard.ts","../src/runtime/harvest-corpus.ts","../src/runtime/in-process-sandbox-client.ts","../src/runtime/personify/analyst.ts","../src/runtime/personify/combinators.ts","../src/runtime/personify/corpus.ts","../src/runtime/personify/registry.ts","../src/runtime/personify/persona.ts","../src/runtime/personify/trajectory.ts","../src/runtime/promotion-gate.ts","../src/runtime/run-benchmark.ts","../src/runtime/sandbox-run.ts","../src/runtime/strategy-author.ts","../src/runtime/strategy-evolution.ts","../src/runtime/stream-agent-turn.ts","../src/runtime/supervise/patch-checks.ts","../src/runtime/supervise/patch-deliverable.ts","../src/runtime/supervise/trajectory-recorder.ts","../src/runtime/supervise/worktree-fanout.ts","../src/runtime/supervise-surface.ts","../src/runtime/verifier-environment.ts","../src/runtime/waterfall.ts","../src/runtime/workspace.ts"],"sourcesContent":["/**\n * `KeyProvider` — API-key provisioning for adopted external MCP servers.\n *\n * An adopted server (a `connection` artifact, or a `buildableGenerator` remote\n * emit) usually needs a credential. The credential must never ride the profile\n * or the artifact — both are logged, diffed, and stored as audit records — so\n * the profile carries only a DECLARATIVE reference:\n *\n * `profile.mcp[key].metadata[mcpSecretEnvMetadataKey]`\n * = { ENV_VAR_NAME: 'PROVIDER_KEY_NAME', … }\n *\n * and the VALUE is resolved at materialize time (`materializeLocalMcp`'s\n * `keys` option) and injected straight into the spawned server child's env.\n * Values exist only in the child process env — never in the profile, the\n * artifact registry, an error message, or a log line (errors name the KEY\n * NAME only).\n *\n * Fail-closed at every hop: a declared secret with no provider, or a provider\n * that does not hold the named key, THROWS — booting an external server\n * keyless would fail opaquely mid-eval or silently score a broken candidate.\n *\n * `envKeyProvider` is the same-host default: it reads the process env, which\n * the operator loads via dotenvx (the secrets files never touch the repo).\n *\n * >>> REAL SECRET STORES PLUG IN HERE (flagged): the sandbox SDK's\n * `client.secrets` (`SecretsManager.get(name)`) and the platform hub's\n * short-lived capability tokens (`PlatformHubClient.mintToken` →\n * `{ ENV: token }`) both satisfy `KeyProvider` with a one-line adapter; both\n * need a live service, so neither is constructed here.\n */\n\nimport type { AgentProfileMcpServer } from '@tangle-network/agent-interface'\nimport { ValidationError } from '../errors'\n\n/** Resolve named secrets. The ONE seam every secret store adapts to. */\nexport interface KeyProvider {\n /** The value for `name`, or `undefined` when this provider does not hold it. */\n get(name: string): Promise<string | undefined>\n}\n\n/** The env-backed provider: reads the (dotenvx-loaded) process env. Empty /\n * whitespace-only values count as absent — fail loud, not with a blank key. */\nexport function envKeyProvider(env: Record<string, string | undefined> = process.env): KeyProvider {\n return {\n async get(name: string): Promise<string | undefined> {\n const value = env[name]\n return value !== undefined && value.trim().length > 0 ? value : undefined\n },\n }\n}\n\n/** The `AgentProfileMcpServer.metadata` key the declarative secret-env map\n * rides under: `{ ENV_VAR_NAME: 'PROVIDER_KEY_NAME' }`. Names only — values\n * are resolved at materialize time and never stored. */\nexport const mcpSecretEnvMetadataKey = 'secretEnv'\n\n/** Read (and validate) a server entry's declared secret-env map, if any.\n * Malformed metadata throws — a half-declared secret must never half-boot. */\nexport function secretEnvOfMcpServer(\n server: AgentProfileMcpServer,\n): Record<string, string> | undefined {\n const raw = server.metadata?.[mcpSecretEnvMetadataKey]\n if (raw === undefined || raw === null) return undefined\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n throw new ValidationError(\n `secretEnvOfMcpServer: metadata.${mcpSecretEnvMetadataKey} must be an object mapping env var name -> key name`,\n )\n }\n const entries = Object.entries(raw as Record<string, unknown>)\n if (entries.length === 0) return undefined\n for (const [envName, keyName] of entries) {\n if (!envName.trim() || typeof keyName !== 'string' || !keyName.trim()) {\n throw new ValidationError(\n `secretEnvOfMcpServer: metadata.${mcpSecretEnvMetadataKey}['${envName}'] must name a non-empty provider key`,\n )\n }\n }\n return raw as Record<string, string>\n}\n\n/**\n * Resolve a declared secret-env map into the real env entries for a server\n * spawn. Fail-closed: no provider or a missing key throws, naming the KEY\n * NAME only (the value never appears in any message). `label` names the\n * server for the error (e.g. `profile.mcp['exa']`).\n */\nexport async function resolveSecretEnv(\n secretEnv: Record<string, string>,\n keys: KeyProvider | undefined,\n label: string,\n): Promise<Record<string, string>> {\n const entries = Object.entries(secretEnv)\n if (entries.length === 0) return {}\n if (!keys) {\n throw new ValidationError(\n `${label} declares secret env (${entries.map(([e]) => e).join(', ')}) but no KeyProvider was supplied — refusing to boot an external server keyless`,\n )\n }\n const resolved: Record<string, string> = {}\n for (const [envName, keyName] of entries) {\n const value = await keys.get(keyName)\n if (value === undefined) {\n throw new ValidationError(\n `${label}: the KeyProvider holds no value for '${keyName}' (wanted for env ${envName}) — provision the key or drop the grant`,\n )\n }\n resolved[envName] = value\n }\n return resolved\n}\n","/**\n * createMcpEnvironment — wrap any MCP server as an `Environment` (the product-adoption\n * primitive: a product's agent tools are usually already an MCP surface, so the domain\n * only writes the lifecycle hooks — open a scoped artifact, score it with a deployable\n * check, close it — and the tool plumbing is derived from the server).\n *\n * What the helper owns (the generic 80%, hardened on the EnterpriseOps gym):\n * - JSON-RPC `tools/list` → `AgenticTool[]`, with schemas coerced to the\n * OpenAI-tool-valid shape (top-level oneOf/anyOf/allOf/enum/not are rejected by\n * tool-calling providers; nested combinators are fine).\n * - JSON-RPC `tools/call` → the tool's text content (errors surfaced as `ERROR: …`\n * strings — a bad call is the agent's outcome, not an infra fault).\n * - SSE response parsing (streamable-HTTP MCP servers answer with `data:` lines).\n * - Bounded retry with backoff on thrown fetches (transient network ≠ task failure).\n *\n * What the domain supplies: `open` (create/seed the per-task artifact and return its\n * MCP endpoint — url + headers carry the per-artifact scoping, e.g. a database id\n * header), `score` (the deployable check), and optional `close`/`selectTools`.\n */\n\nimport type { Environment } from './run-benchmark'\nimport type { AgenticTask, AgenticTool, ArtifactHandle, SurfaceScore } from './strategy'\n\n/** Where a handle's MCP server lives; headers carry per-artifact scoping. */\nexport interface McpEndpoint {\n url: string\n headers?: Record<string, string>\n}\n\nexport interface McpEnvironmentOptions {\n name: string\n /** Create/seed the per-task artifact; return its handle + the MCP endpoint scoped to it. */\n open(task: AgenticTask): Promise<{ handle: ArtifactHandle; endpoint: McpEndpoint }>\n /** The deployable check over the artifact's current state. */\n score(task: AgenticTask, handle: ArtifactHandle): Promise<SurfaceScore>\n /** Teardown (delete the seeded artifact). Optional — omit for stateless servers. */\n close?(handle: ArtifactHandle): Promise<void>\n /** Restrict/order the server's tools per task (e.g. the task's selected_tools). Default: all. */\n selectTools?(task: AgenticTask, all: AgenticTool[]): AgenticTool[]\n /** Cap on a tool result's text fed back to the worker. Default 1500 chars. */\n maxResultChars?: number\n}\n\n/** POST JSON-RPC and parse a JSON body OR the last `data:` line of an SSE stream.\n * Retries thrown fetches (transient network) with linear backoff; HTTP status and\n * JSON-RPC errors are returned to the caller, not retried. */\nasync function rpc(\n endpoint: McpEndpoint,\n body: unknown,\n): Promise<{ status: number; json: unknown }> {\n let lastErr: unknown\n for (let attempt = 0; attempt < 4; attempt += 1) {\n try {\n const r = await fetch(endpoint.url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', ...(endpoint.headers ?? {}) },\n body: JSON.stringify(body),\n })\n const text = await r.text()\n const dataLines = text\n .split('\\n')\n .filter((l) => l.startsWith('data:'))\n .map((l) => l.slice(5).trim())\n const payload = dataLines.length ? dataLines[dataLines.length - 1] : text\n try {\n return { status: r.status, json: JSON.parse(payload ?? 'null') }\n } catch {\n return { status: r.status, json: text }\n }\n } catch (err) {\n lastErr = err\n await new Promise((res) => setTimeout(res, 1000 * (attempt + 1)))\n }\n }\n throw new Error(\n `mcp rpc ${endpoint.url} failed after 4 attempts: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`,\n )\n}\n\n/** Coerce an MCP inputSchema to an OpenAI-tool-valid top-level object schema.\n * Shared with the same-host stdio client (`materializeLocalMcp`) — one coercion\n * rule for every MCP tool a worker sees, regardless of transport. */\nexport function sanitizeMcpToolSchema(s: unknown): Record<string, unknown> {\n const o = s && typeof s === 'object' ? (s as Record<string, unknown>) : {}\n const banned = o.oneOf || o.anyOf || o.allOf || o.not || o.enum\n if (o.type === 'object' && !banned && o.properties && typeof o.properties === 'object') {\n return {\n type: 'object',\n properties: o.properties as Record<string, unknown>,\n ...(Array.isArray(o.required) ? { required: o.required as string[] } : {}),\n }\n }\n return { type: 'object', properties: {} }\n}\n\n/** Wrap any MCP server as an `Environment`: `tools/list` becomes `AgenticTool[]` with provider-safe schemas; the domain supplies only the artifact lifecycle hooks. */\nexport function createMcpEnvironment(opts: McpEnvironmentOptions): Environment {\n const endpoints = new Map<string, McpEndpoint>()\n const maxChars = opts.maxResultChars ?? 1500\n\n return {\n name: opts.name,\n\n async open(task) {\n const { handle, endpoint } = await opts.open(task)\n endpoints.set(handle.id, endpoint)\n return handle\n },\n\n async tools(task, handle) {\n const endpoint = endpoints.get(handle.id)\n if (!endpoint) throw new Error(`${opts.name}: tools() before open() for ${handle.id}`)\n const { json } = await rpc(endpoint, {\n jsonrpc: '2.0',\n id: 1,\n method: 'tools/list',\n params: {},\n })\n const all = (\n (\n json as {\n result?: {\n tools?: Array<{ name: string; description?: string; inputSchema?: unknown }>\n }\n }\n ).result?.tools ?? []\n ).map(\n (t): AgenticTool => ({\n type: 'function',\n function: {\n name: t.name,\n description: (t.description ?? '').slice(0, 1000),\n parameters: sanitizeMcpToolSchema(t.inputSchema),\n },\n }),\n )\n return opts.selectTools ? opts.selectTools(task, all) : all\n },\n\n async call(handle, name, args) {\n const endpoint = endpoints.get(handle.id)\n if (!endpoint) return 'ERROR: workspace closed'\n const { json } = await rpc(endpoint, {\n jsonrpc: '2.0',\n id: 2,\n method: 'tools/call',\n params: { name, arguments: args },\n })\n const result =\n (json as {\n result?: { content?: Array<{ text?: string }>; isError?: boolean }\n error?: unknown\n }) ?? {}\n if (result.error) return `ERROR: ${JSON.stringify(result.error).slice(0, 300)}`\n const text =\n result.result?.content?.map((c) => c.text ?? '').join('\\n') ??\n JSON.stringify(result.result ?? json)\n return text.slice(0, maxChars)\n },\n\n score: (task, handle) => opts.score(task, handle),\n\n async close(handle) {\n endpoints.delete(handle.id)\n await opts.close?.(handle)\n },\n }\n}\n","/**\n * Same-host stdio MCP: the ONE persistent newline-delimited JSON-RPC 2.0\n * connection to a spawned MCP server child process. This is the handshake\n * `mcpServeVerifier` boots for its probe (`initialize` →\n * `notifications/initialized` → `tools/list`), extracted so a trusted\n * same-host consumer can keep the server running and route `tools/call` to it.\n * This module does not isolate the child: callers must use a real sandbox for\n * user- or model-authored code.\n *\n * Two layers:\n * - `connectStdioMcp` — spawn ONE server at its cwd, run the real MCP\n * handshake, return a live connection: the listed tools, `callTool`, `close`.\n * - `materializeLocalMcp` — spawn EVERY enabled stdio server in\n * `profile.mcp`, namespace each server's tools as `<server>__<tool>` so\n * they can share a worker's tool list with a domain surface's tools, and\n * expose one route/close facade over the set. Fail-CLOSED: a declared\n * server that cannot boot throws — silently scoring the profile as if it\n * had no MCP surface would fake the with/without ablation.\n *\n * Failure taxonomy (mirrors `commandVerifier`/`mcpServeVerifier`): a missing\n * start binary or spawn fault is a SETUP bug (`McpSpawnFault` — candidate\n * graders must rethrow it, never score it); a server that crashes, errors the\n * handshake, or times out is an ordinary `Error` carrying the stderr tail; a\n * JSON-RPC error on `tools/call` is the AGENT's outcome — returned as an\n * `ERROR: …` string, never thrown (the `createMcpEnvironment` convention).\n *\n * Protocol matches the runtime's own stdio MCP server (src/mcp/server.ts):\n * newline-delimited JSON-RPC 2.0, protocol version 2024-11-05.\n */\n\nimport { spawn } from 'node:child_process'\nimport { createInterface } from 'node:readline'\nimport {\n type AgentProfile,\n type AgentProfileSecurityPolicy,\n validateAgentProfileSecurity,\n} from '@tangle-network/agent-interface'\nimport {\n redactProtectedReason,\n redactProtectedValue,\n} from '../candidate-execution/protected-redaction'\nimport { ValidationError } from '../errors'\nimport { type KeyProvider, resolveSecretEnv, secretEnvOfMcpServer } from './key-provider'\nimport { sanitizeMcpToolSchema } from './mcp-environment'\nimport type { AgenticTool } from './strategy'\n\nconst PROTOCOL_VERSION = '2024-11-05'\n\n/** Non-sensitive process settings a stdio child may inherit without receiving\n * credentials, agent settings, provider configuration, or tracing state. */\nconst SAFE_INHERITED_ENV_NAMES = [\n 'PATH',\n 'LANG',\n 'LC_ALL',\n 'LC_CTYPE',\n 'TZ',\n 'SYSTEMROOT',\n 'WINDIR',\n 'COMSPEC',\n 'PATHEXT',\n] as const\n\nfunction inheritedStdioEnv(source: NodeJS.ProcessEnv = process.env): Record<string, string> {\n const env: Record<string, string> = {}\n for (const name of SAFE_INHERITED_ENV_NAMES) {\n const value = source[name]\n if (value !== undefined) env[name] = value\n }\n return env\n}\n\nexport interface StdioMcpServerSpec {\n /** Command that starts the MCP server (stdio transport). */\n command: string\n args?: string[]\n /** Working directory the server starts in (a built candidate's worktree, typically). */\n cwd?: string\n /** Declared public env for the server process. Only a minimal non-sensitive\n * subset of the parent env is inherited. */\n env?: Record<string, string>\n /** Sensitive env for the server process. These values override `env` and are\n * redacted from child-supplied errors, tool metadata, and tool results. */\n protectedEnv?: Record<string, string>\n /** Handshake AND per-request timeout (ms). Default 30s. */\n timeoutMs?: number\n}\n\n/** A missing start binary / spawn fault: a SETUP bug, never a failed candidate.\n * Graders (the serve verifier) must rethrow this instead of scoring it. */\nexport class McpSpawnFault extends Error {}\n\nexport interface McpToolDescriptor {\n name: string\n description?: string\n inputSchema?: unknown\n}\n\nexport interface StdioMcpConnection {\n /** The tools the server exposed at connect time (`tools/list`). */\n readonly tools: readonly McpToolDescriptor[]\n /** `tools/call` → the result's text content. A JSON-RPC error / `isError`\n * result becomes an `ERROR: …` string (the agent's outcome); a dead\n * transport or timeout throws (an infra fault). */\n callTool(name: string, args: Record<string, unknown>): Promise<string>\n /** Kill the server child. Idempotent. */\n close(): Promise<void>\n}\n\ninterface JsonRpcResponse {\n jsonrpc?: string\n id?: number | string | null\n result?: unknown\n error?: { code: number; message: string }\n}\n\n/** Spawn a trusted host command, complete the stdio MCP handshake, and return\n * the live connection. This low-level function provides no process isolation. */\nexport async function connectStdioMcp(spec: StdioMcpServerSpec): Promise<StdioMcpConnection> {\n const timeoutMs = spec.timeoutMs ?? 30_000\n const protectedValues = Object.values(spec.protectedEnv ?? {})\n const redactReason = (value: string): string => redactProtectedReason(value, protectedValues)\n const child = spawn(spec.command, spec.args ?? [], {\n ...(spec.cwd ? { cwd: spec.cwd } : {}),\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...inheritedStdioEnv(), ...spec.env, ...spec.protectedEnv },\n })\n\n const stderr: string[] = []\n child.stderr.on('data', (d) => stderr.push(String(d)))\n const stderrTail = () =>\n stderr.length > 0 ? `\\nstderr:\\n${redactReason(stderr.join('')).slice(-2000)}` : ''\n let nextId = 1\n let spawnFault: McpSpawnFault | undefined\n let closed = false\n const pending = new Map<\n number,\n { resolve: (r: JsonRpcResponse) => void; reject: (e: Error) => void; timer: NodeJS.Timeout }\n >()\n\n const failAllPending = (err: Error) => {\n for (const p of pending.values()) {\n clearTimeout(p.timer)\n p.reject(err)\n }\n pending.clear()\n }\n\n child.on('error', (err) => {\n const code = (err as NodeJS.ErrnoException).code\n spawnFault =\n code === 'ENOENT'\n ? new McpSpawnFault(\n `'${spec.command}' not found in PATH (setup bug, not a failed candidate)`,\n )\n : new McpSpawnFault(`'${spec.command}' failed to spawn: ${err.message}`)\n failAllPending(spawnFault)\n })\n // Pipe failures normally arrive asynchronously, OUTSIDE send()'s try/catch —\n // a server that closes stdin mid-handshake (EPIPE) must fail the pending\n // request immediately with the same wording as a synchronous write failure,\n // not wait out the handshake timeout.\n child.stdin.on('error', (err) => {\n failAllPending(\n new Error(redactReason(`writing to MCP server stdin failed: ${err.message}${stderrTail()}`)),\n )\n })\n // 'close' (not 'exit'): it fires after stdio flushes, so the stderr tail in\n // the failure message is complete. After our own SIGKILL in close(), pending\n // is already empty and this is a no-op.\n child.on('close', (code, signal) => {\n failAllPending(\n spawnFault ??\n new Error(\n redactReason(\n `MCP server exited (code ${code}, signal ${signal}) before serving${stderrTail()}`,\n ),\n ),\n )\n })\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', (line) => {\n let msg: JsonRpcResponse | undefined\n try {\n msg = JSON.parse(line) as JsonRpcResponse\n } catch {\n return // servers log to stdout too; skip non-JSON lines\n }\n if (!msg || typeof msg !== 'object' || typeof msg.id !== 'number') return\n const p = pending.get(msg.id)\n if (!p) return\n pending.delete(msg.id)\n clearTimeout(p.timer)\n p.resolve(msg)\n })\n\n const send = (msg: Record<string, unknown>): void => {\n child.stdin.write(`${JSON.stringify(msg)}\\n`)\n }\n\n const request = (\n method: string,\n params?: Record<string, unknown>,\n // The handshake-phase timeout keeps the verifier's long-standing feedback\n // wording; live tools/call timeouts name the method instead.\n timeoutMessage = `MCP server did not answer '${method}' within ${timeoutMs}ms`,\n ): Promise<JsonRpcResponse> =>\n new Promise<JsonRpcResponse>((resolve, reject) => {\n if (spawnFault) return reject(spawnFault)\n if (closed) return reject(new Error('MCP connection closed'))\n const id = nextId++\n const timer = setTimeout(() => {\n pending.delete(id)\n reject(new Error(redactReason(`${timeoutMessage}${stderrTail()}`)))\n }, timeoutMs)\n pending.set(id, { resolve, reject, timer })\n try {\n send({ jsonrpc: '2.0', id, method, ...(params ? { params } : {}) })\n } catch (err) {\n pending.delete(id)\n clearTimeout(timer)\n reject(\n new Error(\n redactReason(\n `writing to MCP server stdin failed: ${err instanceof Error ? err.message : String(err)}${stderrTail()}`,\n ),\n ),\n )\n }\n })\n\n const close = async (): Promise<void> => {\n if (closed) return\n closed = true\n rl.close()\n failAllPending(new Error('MCP connection closed'))\n child.kill('SIGKILL')\n }\n\n const handshakeTimeout = `MCP server did not complete the handshake within ${timeoutMs}ms`\n try {\n const init = await request(\n 'initialize',\n {\n protocolVersion: PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: 'agent-runtime-local-mcp', version: '0' },\n },\n handshakeTimeout,\n )\n if (init.error)\n throw new Error(\n redactReason(`initialize errored: ${JSON.stringify(init.error)}${stderrTail()}`),\n )\n send({ jsonrpc: '2.0', method: 'notifications/initialized' })\n const list = await request('tools/list', undefined, handshakeTimeout)\n if (list.error)\n throw new Error(\n redactReason(`tools/list errored: ${JSON.stringify(list.error)}${stderrTail()}`),\n )\n const rawTools = (list.result as { tools?: McpToolDescriptor[] } | undefined)?.tools\n if (!Array.isArray(rawTools))\n throw new Error(`tools/list result has no tools array${stderrTail()}`)\n const tools = redactProtectedValue(rawTools, protectedValues).value\n\n const callTool = async (name: string, args: Record<string, unknown>): Promise<string> => {\n const res = await request('tools/call', { name, arguments: args })\n if (res.error) return `ERROR: ${redactReason(JSON.stringify(res.error)).slice(0, 300)}`\n const result = res.result as\n | { content?: Array<{ text?: string }>; isError?: boolean }\n | undefined\n const chunks = result?.content?.map((c) => c.text ?? '')\n const joined = chunks?.join('\\n') ?? JSON.stringify(result ?? null)\n // MCP content blocks are joined with newlines for the worker. Also scan\n // their raw concatenation so a protected value split across two blocks\n // cannot evade exact-value redaction at the inserted newline.\n const collapsed = chunks?.join('')\n let text = joined\n if (collapsed !== undefined) {\n const collapsedRedacted = redactReason(collapsed)\n if (collapsedRedacted !== collapsed) text = collapsedRedacted\n }\n return redactReason(result?.isError ? `ERROR: ${text}` : text)\n }\n\n return { tools, callTool, close }\n } catch (err) {\n await close()\n throw err\n }\n}\n\nexport interface MaterializeLocalMcpOptions {\n /** Handshake / per-request timeout per server (ms). Default 30s. */\n timeoutMs?: number\n /** Cap on a tool result's text fed back to the worker. Default 2000 chars. */\n maxResultChars?: number\n /** Resolves a server's DECLARED secrets (`metadata.secretEnv`: env var name →\n * provider key name) at spawn time. The resolved values reach ONLY the child\n * process env — never the profile, the logs, or an error message. Fail-closed:\n * a server declaring secrets without a provider (or with a missing key)\n * throws instead of booting keyless. */\n keys?: KeyProvider\n /** Required trust decision for profiles that declare local MCP processes.\n * Omit to refuse all profile-controlled host execution. Passing\n * `allowLocalMcp: true` is only safe for an author-controlled profile: the\n * process receives this Runtime's filesystem and network privileges. */\n profileSecurityPolicy?: AgentProfileSecurityPolicy\n}\n\n/** The live same-host materialization of a profile's `mcp` surface. */\nexport interface LocalMcpMaterialization {\n /** Worker-facing tool specs: namespaced `<server>__<tool>`, provider-safe schemas. */\n tools: AgenticTool[]\n /** Whether `name` is one of this materialization's namespaced tools. */\n owns(name: string): boolean\n /** Route a namespaced call to its server's live stdio child. */\n call(name: string, args: Record<string, unknown>): Promise<string>\n /** Kill every spawned server. Idempotent. */\n close(): Promise<void>\n}\n\n/**\n * Spawn every explicitly trusted stdio server in `profile.mcp` as a same-host\n * child and expose its tools under `<server>__<tool>` names. The default policy\n * refuses local processes. A profile with no MCP surface returns zero tools.\n */\nexport async function materializeLocalMcp(\n profile: AgentProfile,\n opts: MaterializeLocalMcpOptions = {},\n): Promise<LocalMcpMaterialization> {\n const security = validateAgentProfileSecurity(profile, opts.profileSecurityPolicy)\n if (!security.ok) {\n const reasons = security.issues\n .filter((issue) => issue.level === 'error')\n .map((issue) => issue.message)\n .join('; ')\n throw new ValidationError(`materializeLocalMcp: profile host execution refused: ${reasons}`)\n }\n const maxResultChars = opts.maxResultChars ?? 2000\n const connections: StdioMcpConnection[] = []\n const routes = new Map<string, { conn: StdioMcpConnection; tool: string }>()\n const tools: AgenticTool[] = []\n\n const close = async (): Promise<void> => {\n await Promise.all(connections.map((c) => c.close()))\n }\n\n try {\n for (const [key, server] of Object.entries(profile.mcp ?? {})) {\n if (server.enabled === false) continue\n const transport = server.transport ?? 'stdio'\n if (transport !== 'stdio') {\n throw new ValidationError(\n `materializeLocalMcp: profile.mcp['${key}'] has transport '${transport}' — the same-host client only spawns stdio servers; a remote (http/sse) server needs an http MCP client (not yet built here) or the sandbox backend. Failing loud: scoring this profile without its declared server would fake the with/without ablation`,\n )\n }\n if (!server.command || server.command.trim().length === 0) {\n throw new ValidationError(\n `materializeLocalMcp: profile.mcp['${key}'] declares a stdio server with no command`,\n )\n }\n // Provision declared secrets NOW, into the spawn env only. The resolved\n // values live in this local and the child env — nowhere else.\n const secretRefs = secretEnvOfMcpServer(server)\n const provisioned = secretRefs\n ? await resolveSecretEnv(\n secretRefs,\n opts.keys,\n `materializeLocalMcp: profile.mcp['${key}']`,\n )\n : undefined\n const conn = await connectStdioMcp({\n command: server.command,\n ...(server.args ? { args: server.args } : {}),\n ...(server.cwd ? { cwd: server.cwd } : {}),\n ...(server.env ? { env: server.env } : {}),\n ...(provisioned ? { protectedEnv: provisioned } : {}),\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n })\n connections.push(conn)\n const prefix = key.replace(/[^a-zA-Z0-9_-]/g, '_')\n for (const t of conn.tools) {\n const name = `${prefix}__${t.name.replace(/[^a-zA-Z0-9_-]/g, '_')}`\n if (routes.has(name)) {\n throw new ValidationError(\n `materializeLocalMcp: namespaced tool '${name}' collides across servers — rename the profile.mcp keys`,\n )\n }\n routes.set(name, { conn, tool: t.name })\n tools.push({\n type: 'function',\n function: {\n name,\n description: (t.description ?? '').slice(0, 1000),\n parameters: sanitizeMcpToolSchema(t.inputSchema),\n },\n })\n }\n }\n } catch (err) {\n // Fail CLOSED: never hand back a partial materialization of a profile\n // whose declared server could not boot — that would fake the ablation.\n await close()\n throw err\n }\n\n return {\n tools,\n owns: (name) => routes.has(name),\n call: async (name, args) => {\n const route = routes.get(name)\n if (!route) throw new Error(`materializeLocalMcp: unknown tool '${name}'`)\n const out = await route.conn.callTool(route.tool, args)\n return out.length > maxResultChars ? out.slice(0, maxResultChars) : out\n },\n close,\n }\n}\n","/**\n * auditIntent — the route-rigor analyst: is this trajectory even going the RIGHT WAY?\n *\n * `observe()` critiques execution quality (\"what's unfinished\"). This audits ALIGNMENT —\n * a different failure class the score can't see until it's too late: an agent can be\n * executing flawlessly down the wrong route. The auditor reads the trajectory and\n * compares three intents:\n *\n * declared — what the task says to do (the prompt / acceptance criteria)\n * revealed — what the agent is ACTUALLY optimizing, inferred from its action pattern\n * (the inverse-inference move: actions reveal objectives)\n * user — what the principal actually wants (the contract, when it differs from\n * the literal task text), plus where the user's own trajectory is heading\n *\n * and returns a verdict (aligned / drifting / diverged) with evidence and ONE\n * recommended intervention. FIREWALLED like every analyst: input is the trajectory and\n * the intents — never the verifier or its data (zero check-leakage, so route auditing\n * is always Goodhart-safe to run online).\n *\n * Where it runs: between shots (steer the next one), as a watchdog over the lifecycle\n * stream (abort-and-refund a diverged rollout — the budget pool makes early abort\n * strictly valuable), or post-hoc over a whole BenchmarkReport (the meta-intent pass:\n * is the LOOP optimizing the right thing — degenerate submissions, check-gaming shapes,\n * objective drift across tasks).\n */\n\nimport type { ChatClient } from '@tangle-network/agent-eval'\n\nexport interface AuditIntentInput {\n /** The declared intent: the task text / acceptance criteria the agent was given. */\n declaredIntent: string\n /** The trajectory so far — tool calls + results + assistant turns (any event shapes). */\n trace: ReadonlyArray<unknown>\n /** The principal's actual intent when it differs from the literal task (the contract). */\n userIntent?: string\n /** The loop-level purpose (meta-intent): what the WHOLE run is for — lets the auditor\n * flag locally-sensible work that serves the wrong larger objective. */\n metaIntent?: string\n runId?: string\n}\n\nexport interface AuditIntentOptions {\n chat: ChatClient\n model?: string\n /** Override the auditor instruction (optimizable like any analyst prompt). */\n auditorInstruction?: string\n /** Cap trace lines fed to the auditor. Default 80. */\n maxTraceLines?: number\n signal?: AbortSignal\n}\n\nexport interface IntentAudit {\n /** What the agent's actions reveal it is actually optimizing — one sentence. */\n revealedIntent: string\n verdict: 'aligned' | 'drifting' | 'diverged'\n /** Trajectory-grounded evidence for the verdict (specific calls/patterns). */\n evidence: string\n /** The single recommended intervention. */\n recommendation: 'continue' | 'steer' | 'abort'\n /** When recommendation is 'steer': the corrective instruction to inject. */\n steer?: string\n confidence: number\n}\n\n/** Default system instruction for intent-auditor agents: diagnose diverged/drifting trajectories. */\nexport const defaultAuditorInstruction =\n 'You audit whether an AI agent is on the RIGHT ROUTE — not whether it works hard, but whether its ' +\n 'actions serve the stated intents. Infer the REVEALED intent from the action pattern (what the ' +\n 'trajectory is actually optimizing). Compare against the declared task intent, the user intent when ' +\n 'given, and the meta-intent when given. Flawless execution down the wrong route is DIVERGED. ' +\n 'Busy-work that neither advances nor harms is DRIFTING. Judge only from the trajectory — be specific ' +\n 'about which actions ground your verdict. Recommend abort only when continuing cannot serve the intent.'\n\nfunction summarize(trace: ReadonlyArray<unknown>, maxLines: number): string {\n const lines: string[] = []\n for (const ev of trace) {\n const e = ev as Record<string, unknown>\n const role = e.role as string | undefined\n if (role === 'tool') lines.push(`RESULT ${String(e.content).slice(0, 200)}`)\n else if (role === 'assistant') {\n const calls = (\n e.tool_calls as Array<{ function?: { name?: string; arguments?: string } }> | undefined\n )\n ?.map((c) => `${c.function?.name}(${(c.function?.arguments ?? '').slice(0, 120)})`)\n .join(', ')\n lines.push(calls ? `CALL ${calls}` : `SAY ${String(e.content).slice(0, 160)}`)\n } else if (role === 'user') lines.push(`USER ${String(e.content).slice(0, 160)}`)\n }\n return lines.slice(-maxLines).join('\\n')\n}\n\nconst auditSchema = {\n name: 'intent_audit',\n schema: {\n type: 'object',\n additionalProperties: false,\n required: ['revealedIntent', 'verdict', 'evidence', 'recommendation', 'confidence'],\n properties: {\n revealedIntent: { type: 'string' },\n verdict: { type: 'string', enum: ['aligned', 'drifting', 'diverged'] },\n evidence: { type: 'string' },\n recommendation: { type: 'string', enum: ['continue', 'steer', 'abort'] },\n steer: { type: 'string' },\n confidence: { type: 'number' },\n },\n },\n}\n\n/** The route-rigor analyst: compare declared vs revealed vs user intent over a trajectory and return aligned / drifting / diverged with evidence and one recommended intervention. */\nexport async function auditIntent(\n input: AuditIntentInput,\n opts: AuditIntentOptions,\n): Promise<IntentAudit> {\n const res = await opts.chat.chat(\n {\n ...(opts.model ? { model: opts.model } : {}),\n jsonSchema: auditSchema as unknown as { name: string; schema: Record<string, unknown> },\n messages: [\n { role: 'system', content: opts.auditorInstruction ?? defaultAuditorInstruction },\n {\n role: 'user',\n content:\n `DECLARED INTENT (the task):\\n${input.declaredIntent}\\n\\n` +\n (input.userIntent\n ? `USER INTENT (the principal's actual goal):\\n${input.userIntent}\\n\\n`\n : '') +\n (input.metaIntent\n ? `META-INTENT (what the whole run is for):\\n${input.metaIntent}\\n\\n`\n : '') +\n `TRAJECTORY (in order):\\n${summarize(input.trace, opts.maxTraceLines ?? 80)}\\n\\n` +\n 'Audit the route: revealed intent, verdict, evidence, one recommendation.',\n },\n ],\n },\n { ...(opts.signal ? { signal: opts.signal } : {}) },\n )\n let parsed: Partial<IntentAudit>\n try {\n parsed = JSON.parse(res.content) as Partial<IntentAudit>\n } catch {\n throw new Error(`auditIntent: auditor returned non-JSON: ${res.content.slice(0, 200)}`)\n }\n if (!parsed.verdict || !parsed.recommendation) {\n throw new Error(`auditIntent: missing verdict/recommendation: ${res.content.slice(0, 200)}`)\n }\n return {\n revealedIntent: parsed.revealedIntent ?? '',\n verdict: parsed.verdict,\n evidence: parsed.evidence ?? '',\n recommendation: parsed.recommendation,\n ...(parsed.steer ? { steer: parsed.steer } : {}),\n confidence: typeof parsed.confidence === 'number' ? parsed.confidence : 0.5,\n }\n}\n","/**\n * benchmark-report — turn a fleet of `RunRecord`s into a publishable, multi-axis benchmark report:\n * a ranked leaderboard, the full profile×axis score matrix, the cost/latency/token columns, and\n * embeddable charts (SVG) + a self-contained HTML page. Domain-agnostic by construction — it reads ONLY\n * the universal `RunRecord` currency (model, scenario, score, cost, tokens, latency, the `outcome.raw`\n * metric bag), so the SAME engine reports any benchmark in any domain: coding, search, agents, multimodal.\n *\n * This is the surface a hosted leaderboard (à la vals.ai) renders: for every harness×model profile, its\n * score on every axis, not a curated subset. It pairs with `runProfileMatrix` (whose `result.records`\n * feed straight in) but takes the records directly, so it is independent of how they were produced.\n *\n * An AXIS is any way to slice the score into columns — by default one column per scenario group\n * (`groupOf`, default = the scenario id), so the matrix is profile × scenario. Pass `axisScoresOf` to\n * score along judge dimensions or any custom decomposition instead. The reporter never invents a number:\n * a missing cell renders blank, never zero.\n */\nimport {\n benjaminiHochberg,\n confidenceInterval,\n pairedBootstrap,\n type RankTestMethod,\n type RunRecord,\n wilcoxonSignedRank,\n wilson,\n} from '@tangle-network/agent-eval'\n\n/** Pull the headline score in [0,1] from a record. Default: the held-out split, else the search split,\n * else a `composite`/`passed`/`score` entry in the raw bag. Override to score a domain differently. */\nexport type ScoreOf = (record: RunRecord) => number | undefined\n/** The profile (matrix row) a record belongs to — default `harness·model` from the record's profile cell,\n * falling back to the model. This is the leaderboard's unit of comparison. */\nexport type ProfileKeyOf = (record: RunRecord) => string\n/** The axis (matrix column) a record contributes to — default the scenario group. */\nexport type GroupOf = (record: RunRecord) => string\n/** Decompose ONE record into per-axis scores (e.g. judge dimensions). When set, it REPLACES the\n * scenario-group axes: the column set is the union of returned keys. */\nexport type AxisScoresOf = (record: RunRecord) => Record<string, number>\n\nexport interface LeaderboardOptions {\n readonly title?: string\n readonly scoreOf?: ScoreOf\n readonly profileKeyOf?: ProfileKeyOf\n readonly groupOf?: GroupOf\n readonly axisScoresOf?: AxisScoresOf\n /** Display label for a profile key (default: the key itself). */\n readonly labelOf?: (profileKey: string) => string\n /** Commit SHA / dataset / dates surfaced in the provenance block. */\n readonly meta?: Record<string, string>\n /** Compute per-row confidence intervals (bootstrap on score, Wilson on pass rate). Needs a\n * `scenarioId` on every record (reps are collapsed per scenario for the honest n). Default off. */\n readonly stats?: boolean\n /** A score ≥ this counts as a \"pass\" for the pass-rate proportion + its Wilson CI. Default 0.999\n * (fully solved). Lower it (e.g. 0.6) for a partial-credit domain. */\n readonly passThreshold?: number\n}\n\n/** A 95%-by-default confidence interval. */\nexport interface Interval {\n readonly lower: number\n readonly upper: number\n}\n\n/** One leaderboard row — a harness×model profile, every measured column. */\nexport interface LeaderboardRow {\n readonly profileKey: string\n readonly label: string\n readonly model: string\n readonly n: number\n readonly meanScore: number\n /** Fraction of records scoring ≥ `passThreshold` (default 0.999) — the binary pass rate. */\n readonly solveRate: number\n /** axis → mean score for this profile (blank in render when the profile never ran that axis). */\n readonly perAxis: Record<string, number>\n /** Exact total when every run captured cost; otherwise `null`. */\n readonly costUsd: number | null\n /** Sum of captured cost only. This is a lower bound when `uncapturedCostRuns > 0`. */\n readonly capturedCostUsd: number\n /** Runs whose cost was unavailable, never treated as free. */\n readonly uncapturedCostRuns: number\n readonly tokensIn: number\n readonly tokensOut: number\n readonly latencyP50Ms: number\n readonly latencyP90Ms: number\n /** Bootstrap CI on the mean score — present only when `opts.stats` is set. Computed over\n * per-scenario means (reps collapsed first), so identical reps can't fake a narrow interval. */\n readonly scoreCi?: Interval\n /** Wilson CI on the pass rate — present only when `opts.stats` is set. */\n readonly passCi?: Interval\n}\n\nexport interface Leaderboard {\n readonly title: string\n /** Column order — scenario groups (default) or dimension keys (`axisScoresOf`). */\n readonly axes: readonly string[]\n /** Rows ranked by `meanScore` desc (ties → lower cost, then label). */\n readonly profiles: readonly LeaderboardRow[]\n readonly meta: Record<string, string>\n /** Provenance counts — the denominators every honest report leads with. */\n readonly provenance: {\n readonly records: number\n readonly profiles: number\n readonly axes: number\n readonly models: readonly string[]\n /** Exact total when every record captured cost; otherwise `null`. */\n readonly totalCostUsd: number | null\n /** Sum of captured cost only. */\n readonly capturedCostUsd: number\n /** Records whose cost was unavailable. */\n readonly uncapturedCostRecords: number\n }\n}\n\nconst defaultScoreOf: ScoreOf = (r) => {\n const o = r.outcome\n if (typeof o.holdoutScore === 'number') return o.holdoutScore\n if (typeof o.searchScore === 'number') return o.searchScore\n const raw = o.raw ?? {}\n for (const k of ['composite', 'score', 'passed', 'resolved']) {\n if (typeof raw[k] === 'number') return raw[k]\n }\n return undefined\n}\n\nconst defaultProfileKeyOf: ProfileKeyOf = (r) => {\n const harness = r.agentProfile?.harness?.id\n const model = r.agentProfile?.model ?? r.model\n return harness ? `${harness}·${model}` : model\n}\n\nconst defaultGroupOf: GroupOf = (r) => r.scenarioId ?? r.experimentId\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0\n const idx = Math.min(sorted.length - 1, Math.floor(q * (sorted.length - 1)))\n return sorted[idx] ?? 0\n}\n\nfunction mean(xs: readonly number[]): number {\n return xs.length === 0 ? 0 : xs.reduce((a, b) => a + b, 0) / xs.length\n}\n\n/** Collapse reps to ONE mean score per scenario — the honest unit for a CI or a paired test. Reps\n * tighten the per-(profile, scenario) estimate but are NOT independent samples, so feeding raw reps into\n * a CI lets identical reps fake a narrower interval. Fails LOUD on a record missing `scenarioId`: an\n * empty-string fallback would silently merge distinct scenarios into one bucket. */\nfunction meanByScenario(records: readonly RunRecord[], scoreOf: ScoreOf): Map<string, number> {\n const sums = new Map<string, { total: number; n: number }>()\n for (const r of records) {\n const s = scoreOf(r)\n if (typeof s !== 'number') continue\n const id = r.scenarioId\n if (!id) {\n throw new Error(\n `benchmark-report: RunRecord (candidate ${r.candidateId ?? 'unknown'}) is missing scenarioId — ` +\n 'cannot pair or interval it honestly. Pass opts.stats only on a scenario-tagged corpus.',\n )\n }\n const acc = sums.get(id) ?? { total: 0, n: 0 }\n acc.total += s\n acc.n += 1\n sums.set(id, acc)\n }\n const out = new Map<string, number>()\n for (const [id, acc] of sums) out.set(id, acc.n ? acc.total / acc.n : 0)\n return out\n}\n\n/** Aggregate a fleet of records into the ranked, multi-axis report. Pure — no IO, deterministic. */\nexport function leaderboard(\n records: readonly RunRecord[],\n opts: LeaderboardOptions = {},\n): Leaderboard {\n const scoreOf = opts.scoreOf ?? defaultScoreOf\n const profileKeyOf = opts.profileKeyOf ?? defaultProfileKeyOf\n const groupOf = opts.groupOf ?? defaultGroupOf\n const labelOf = opts.labelOf ?? ((k: string) => k)\n\n // Column set: explicit axis decomposition, else the scenario groups present in the data.\n const axisSet = new Set<string>()\n if (opts.axisScoresOf) {\n for (const r of records) for (const k of Object.keys(opts.axisScoresOf(r))) axisSet.add(k)\n } else {\n for (const r of records) axisSet.add(groupOf(r))\n }\n const axes = [...axisSet].sort()\n\n // Bucket records by profile.\n const byProfile = new Map<string, RunRecord[]>()\n for (const r of records) {\n const key = profileKeyOf(r)\n const bucket = byProfile.get(key)\n if (bucket) bucket.push(r)\n else byProfile.set(key, [r])\n }\n\n const rows: LeaderboardRow[] = []\n for (const [profileKey, recs] of byProfile) {\n const scores = recs.map(scoreOf).filter((s): s is number => typeof s === 'number')\n // Per-axis means.\n const axisBuckets = new Map<string, number[]>()\n for (const r of recs) {\n if (opts.axisScoresOf) {\n for (const [axis, s] of Object.entries(opts.axisScoresOf(r))) {\n const b = axisBuckets.get(axis) ?? []\n b.push(s)\n axisBuckets.set(axis, b)\n }\n } else {\n const s = scoreOf(r)\n if (typeof s === 'number') {\n const axis = groupOf(r)\n const b = axisBuckets.get(axis) ?? []\n b.push(s)\n axisBuckets.set(axis, b)\n }\n }\n }\n const perAxis: Record<string, number> = {}\n for (const [axis, b] of axisBuckets) perAxis[axis] = mean(b)\n\n const latencies = recs.map((r) => r.wallMs).sort((a, b) => a - b)\n const pass = opts.passThreshold ?? 0.999\n // Confidence intervals (opt-in) over per-scenario means — the honest n is #scenarios, not #reps.\n let scoreCi: Interval | undefined\n let passCi: Interval | undefined\n if (opts.stats) {\n const collapsed = [...meanByScenario(recs, scoreOf).values()]\n if (collapsed.length > 0) {\n const ci = confidenceInterval(collapsed, 0.95, { seed: 7 })\n scoreCi = { lower: ci.lower, upper: ci.upper }\n const w = wilson(collapsed.filter((s) => s >= pass).length, collapsed.length, 0.95)\n passCi = { lower: w.lower, upper: w.upper }\n }\n }\n const cost = summarizeCost(recs)\n rows.push({\n profileKey,\n label: labelOf(profileKey),\n model: recs[0]?.model ?? profileKey,\n n: recs.length,\n meanScore: mean(scores),\n solveRate: scores.length === 0 ? 0 : scores.filter((s) => s >= pass).length / scores.length,\n perAxis,\n costUsd: cost.uncapturedRecords === 0 ? cost.capturedUsd : null,\n capturedCostUsd: cost.capturedUsd,\n uncapturedCostRuns: cost.uncapturedRecords,\n tokensIn: recs.reduce((a, r) => a + (r.tokenUsage?.input ?? 0), 0),\n tokensOut: recs.reduce((a, r) => a + (r.tokenUsage?.output ?? 0), 0),\n latencyP50Ms: quantile(latencies, 0.5),\n latencyP90Ms: quantile(latencies, 0.9),\n ...(scoreCi ? { scoreCi } : {}),\n ...(passCi ? { passCi } : {}),\n })\n }\n\n // Rank: score desc, then complete cost before unknown cost, then lower cost and label.\n rows.sort(\n (a, b) =>\n b.meanScore - a.meanScore ||\n compareCompleteCost(a.costUsd, b.costUsd) ||\n a.label.localeCompare(b.label),\n )\n\n const models = [...new Set(records.map((r) => r.model))].sort()\n const totalCost = summarizeCost(records)\n return {\n title: opts.title ?? 'Benchmark report',\n axes,\n profiles: rows,\n meta: opts.meta ?? {},\n provenance: {\n records: records.length,\n profiles: rows.length,\n axes: axes.length,\n models,\n totalCostUsd: totalCost.uncapturedRecords === 0 ? totalCost.capturedUsd : null,\n capturedCostUsd: totalCost.capturedUsd,\n uncapturedCostRecords: totalCost.uncapturedRecords,\n },\n }\n}\n\nfunction summarizeCost(records: readonly RunRecord[]): {\n capturedUsd: number\n uncapturedRecords: number\n} {\n return records.reduce(\n (summary, record) => {\n if (record.costUsd === null) {\n summary.uncapturedRecords += 1\n } else {\n summary.capturedUsd += record.costUsd\n }\n return summary\n },\n { capturedUsd: 0, uncapturedRecords: 0 },\n )\n}\n\nfunction compareCompleteCost(left: number | null, right: number | null): number {\n if (left === null) return right === null ? 0 : 1\n if (right === null) return -1\n return left - right\n}\n\n/** One profile pair compared on the scenarios they BOTH ran — the \"who actually beat whom\" verdict. */\nexport interface PairwiseVerdict {\n readonly a: string\n readonly b: string\n /** Paired unit count (shared scenarios). The significance is suppressed below `minPairs`. */\n readonly pairs: number\n /** Median paired delta (b − a) and its bootstrap CI. */\n readonly delta: number\n readonly ciLow: number\n readonly ciHigh: number\n /** Non-zero paired differences used by the signed-rank test. */\n readonly nonZeroPairs: number\n /** How the signed-rank p-value was computed. */\n readonly testMethod: RankTestMethod\n /** Smallest p-value attainable by this paired design. */\n readonly pFloor: number\n /** Raw two-sided signed-rank p-value. */\n readonly p: number\n /** Benjamini-Hochberg adjusted q-value across every profile pair. */\n readonly q: number\n /** BH-significant and above the `minPairs` observation floor. */\n readonly significant: boolean\n}\n\nexport interface PairwiseOptions {\n readonly scoreOf?: ScoreOf\n readonly profileKeyOf?: ProfileKeyOf\n readonly labelOf?: (profileKey: string) => string\n /** False-discovery rate for the Benjamini–Hochberg correction. Default 0.05. */\n readonly fdr?: number\n /** Below this many shared scenarios a paired test can't defensibly separate two profiles, so the\n * `significant` tag is suppressed regardless of p (small-n mirage protection). Default 12. */\n readonly minPairs?: number\n}\n\n/** Compare EVERY profile pair on the scenarios they both ran — paired-bootstrap effect + CI, a real\n * paired-test p-value, BH-corrected across all pairs. This is the honest \"did A beat B\" table the\n * leaderboard's point ranking cannot answer. Reuses the agent-eval statistics substrate. */\nexport function pairwiseSignificance(\n records: readonly RunRecord[],\n opts: PairwiseOptions = {},\n): PairwiseVerdict[] {\n const scoreOf = opts.scoreOf ?? defaultScoreOf\n const profileKeyOf = opts.profileKeyOf ?? defaultProfileKeyOf\n const labelOf = opts.labelOf ?? ((k: string) => k)\n const minPairs = opts.minPairs ?? 12\n\n const byProfile = new Map<string, RunRecord[]>()\n for (const r of records) {\n const k = profileKeyOf(r)\n const b = byProfile.get(k)\n if (b) b.push(r)\n else byProfile.set(k, [r])\n }\n const keys = [...byProfile.keys()].sort()\n const collapsed = new Map(keys.map((k) => [k, meanByScenario(byProfile.get(k) ?? [], scoreOf)]))\n\n const raw: Array<Omit<PairwiseVerdict, 'q' | 'significant'>> = []\n for (let i = 0; i < keys.length; i += 1) {\n for (let j = i + 1; j < keys.length; j += 1) {\n const ka = keys[i] as string\n const kb = keys[j] as string\n const am = collapsed.get(ka) as Map<string, number>\n const bm = collapsed.get(kb) as Map<string, number>\n const aScores: number[] = []\n const bScores: number[] = []\n for (const sid of [...am.keys()].sort()) {\n const bv = bm.get(sid)\n if (bv !== undefined) {\n aScores.push(am.get(sid) as number)\n bScores.push(bv)\n }\n }\n if (aScores.length === 0) continue\n const boot = pairedBootstrap(aScores, bScores, { seed: 7, statistic: 'median' })\n const test = wilcoxonSignedRank(aScores, bScores, { seed: 7 })\n raw.push({\n a: labelOf(ka),\n b: labelOf(kb),\n pairs: aScores.length,\n delta: boot.median,\n ciLow: boot.low,\n ciHigh: boot.high,\n nonZeroPairs: test.nNonZero,\n testMethod: test.method,\n pFloor: test.pFloor,\n p: test.p,\n })\n }\n }\n const { qValues, significant } = benjaminiHochberg(\n raw.map((result) => result.p),\n opts.fdr ?? 0.05,\n )\n return raw.map((r, i) => ({\n ...r,\n q: qValues[i] ?? 1,\n significant: (significant[i] ?? false) && r.pairs >= minPairs,\n }))\n}\n\nconst pct = (x: number): string => `${(100 * x).toFixed(1)}%`\nconst ci = (iv: Interval | undefined): string => (iv ? ` [${pct(iv.lower)}, ${pct(iv.upper)}]` : '')\nconst cost = (\n totalUsd: number | null,\n capturedUsd: number,\n uncapturedRecords: number,\n digits: number,\n): string =>\n totalUsd === null\n ? `at least $${capturedUsd.toFixed(digits)} (${uncapturedRecords} uncaptured)`\n : `$${totalUsd.toFixed(digits)}`\n\n/** Render the report as a publishable Markdown document: provenance → leaderboard → the full profile×axis\n * matrix → cost/latency/token columns. Every axis is shown — a curated subset is a reporting failure. */\nexport function renderLeaderboardMarkdown(report: Leaderboard): string {\n const lines: string[] = []\n lines.push(`# ${report.title}`, '')\n const p = report.provenance\n lines.push(\n `**${p.profiles} profiles × ${p.axes} axes**, ${p.records} runs, ${p.models.length} models · total ${cost(p.totalCostUsd, p.capturedCostUsd, p.uncapturedCostRecords, 2)}`,\n '',\n )\n for (const [k, v] of Object.entries(report.meta)) lines.push(`- **${k}:** ${v}`)\n if (Object.keys(report.meta).length) lines.push('')\n\n // Leaderboard — the headline ranking with every measured column (+ CIs when computed).\n lines.push('## Leaderboard', '')\n lines.push(\n '| # | Profile | Score (95% CI) | Solved (95% CI) | Runs | Cost | Tok in/out | p50 | p90 |',\n )\n lines.push('|---|---|--:|--:|--:|--:|--:|--:|--:|')\n report.profiles.forEach((r, i) => {\n lines.push(\n `| ${i + 1} | ${r.label} | ${pct(r.meanScore)}${ci(r.scoreCi)} | ${pct(r.solveRate)}${ci(r.passCi)} | ${r.n} | ${cost(r.costUsd, r.capturedCostUsd, r.uncapturedCostRuns, 3)} | ${r.tokensIn}/${r.tokensOut} | ${(r.latencyP50Ms / 1000).toFixed(1)}s | ${(r.latencyP90Ms / 1000).toFixed(1)}s |`,\n )\n })\n lines.push('')\n\n // The full matrix — profile × every axis.\n lines.push('## Score matrix — profile × axis', '')\n lines.push(`| Profile | ${report.axes.join(' | ')} |`)\n lines.push(`|---|${report.axes.map(() => '--:').join('|')}|`)\n for (const r of report.profiles) {\n const cells = report.axes.map((a) => {\n const v = r.perAxis[a]\n return v === undefined ? '·' : pct(v)\n })\n lines.push(`| ${r.label} | ${cells.join(' | ')} |`)\n }\n lines.push('')\n lines.push('> `·` = the profile never ran that axis (blank, never zero).')\n return lines.join('\\n')\n}\n\n/** Render the pairwise-significance table — every profile pair's paired delta, CI, and BH-corrected\n * verdict. Feed it `pairwiseSignificance(records)`. This is the \"did A really beat B\" evidence the point\n * ranking cannot give. */\nexport function renderPairwiseMarkdown(\n verdicts: readonly PairwiseVerdict[],\n title = 'Pairwise significance (paired, BH-corrected)',\n): string {\n const lines: string[] = [`## ${title}`, '']\n if (verdicts.length === 0) return lines.concat('_no comparable pairs_').join('\\n')\n lines.push(\n '| A vs B | Δ(b−a) median | 95% CI | pairs | changed | test | p | p floor | q | verdict |',\n )\n lines.push('|---|--:|--:|--:|--:|---|--:|--:|--:|---|')\n for (const v of verdicts) {\n const verdict =\n v.nonZeroPairs === 0 ? 'tie' : v.significant ? `**${v.delta >= 0 ? v.b : v.a} wins**` : 'ns'\n lines.push(\n `| ${v.a} vs ${v.b} | ${v.delta >= 0 ? '+' : ''}${pct(v.delta)} | [${pct(v.ciLow)}, ${pct(v.ciHigh)}] | ${v.pairs} | ${v.nonZeroPairs} | ${v.testMethod} | ${formatProbability(v.p)} | ${formatProbability(v.pFloor)} | ${formatProbability(v.q)} | ${verdict} |`,\n )\n }\n lines.push(\n '',\n '> `changed` excludes exact ties. `p` is the raw two-sided signed-rank probability; `q` is Benjamini-Hochberg adjusted. `ns` means q did not clear the target or the pair count was below the configured minimum.',\n )\n return lines.join('\\n')\n}\n\nfunction formatProbability(value: number): string {\n return value > 0 && value < 0.001 ? value.toExponential(2) : value.toFixed(3)\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\n// A score → color ramp (red→amber→green) for the heatmap, deterministic and dependency-free.\nfunction ramp(score: number): string {\n const x = Math.max(0, Math.min(1, score))\n const r = Math.round(x < 0.5 ? 220 : 220 - (x - 0.5) * 2 * 160)\n const g = Math.round(x < 0.5 ? x * 2 * 170 : 170)\n return `rgb(${r},${g},60)`\n}\n\n/** Render a self-contained SVG: a ranked score bar chart on top, the profile×axis heatmap below. No deps,\n * embeddable anywhere (README, HTML page, hosted leaderboard). */\nexport function renderLeaderboardSvg(report: Leaderboard): string {\n const rowH = 26\n const labelW = 220\n const cellW = 54\n const pad = 16\n const barAreaW = 360\n const profiles = report.profiles\n const barsH = profiles.length * rowH + pad\n const heatTop = barsH + 48\n const heatW = labelW + report.axes.length * cellW + pad\n const heatH = profiles.length * rowH + pad\n const width = Math.max(labelW + barAreaW + pad * 2, heatW)\n const height = heatTop + heatH + pad\n\n const out: string[] = []\n out.push(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"12\">`,\n )\n out.push(`<rect width=\"${width}\" height=\"${height}\" fill=\"white\"/>`)\n out.push(\n `<text x=\"${pad}\" y=\"${pad + 4}\" font-weight=\"700\" font-size=\"14\">${esc(report.title)} — score</text>`,\n )\n\n // Bar chart (ranked).\n profiles.forEach((r, i) => {\n const y = pad + 12 + i * rowH\n out.push(`<text x=\"${pad}\" y=\"${y + 14}\">${esc(r.label)}</text>`)\n const w = Math.round(r.meanScore * barAreaW)\n out.push(`<rect x=\"${labelW}\" y=\"${y + 4}\" width=\"${barAreaW}\" height=\"16\" fill=\"#eef0f2\"/>`)\n out.push(\n `<rect x=\"${labelW}\" y=\"${y + 4}\" width=\"${w}\" height=\"16\" fill=\"${ramp(r.meanScore)}\"/>`,\n )\n out.push(`<text x=\"${labelW + barAreaW + 6}\" y=\"${y + 16}\">${pct(r.meanScore)}</text>`)\n })\n\n // Heatmap.\n out.push(\n `<text x=\"${pad}\" y=\"${heatTop - 12}\" font-weight=\"700\" font-size=\"14\">profile × axis</text>`,\n )\n report.axes.forEach((a, c) => {\n const x = labelW + c * cellW\n out.push(\n `<text x=\"${x + cellW / 2}\" y=\"${heatTop}\" text-anchor=\"middle\" fill=\"#555\">${esc(a.length > 8 ? `${a.slice(0, 7)}…` : a)}</text>`,\n )\n })\n profiles.forEach((r, i) => {\n const y = heatTop + 8 + i * rowH\n out.push(`<text x=\"${pad}\" y=\"${y + 16}\">${esc(r.label)}</text>`)\n report.axes.forEach((a, c) => {\n const x = labelW + c * cellW\n const s = r.perAxis[a]\n if (s !== undefined) {\n out.push(\n `<rect x=\"${x}\" y=\"${y}\" width=\"${cellW - 3}\" height=\"${rowH - 4}\" fill=\"${ramp(s)}\"/>`,\n )\n out.push(\n `<text x=\"${x + (cellW - 3) / 2}\" y=\"${y + 15}\" text-anchor=\"middle\" fill=\"white\" font-size=\"10\">${Math.round(100 * s)}</text>`,\n )\n } else {\n out.push(\n `<rect x=\"${x}\" y=\"${y}\" width=\"${cellW - 3}\" height=\"${rowH - 4}\" fill=\"#f3f4f6\"/>`,\n )\n }\n })\n })\n out.push('</svg>')\n return out.join('\\n')\n}\n\n/** Render a self-contained HTML leaderboard page (the hosted surface): the SVG charts + the full Markdown\n * matrix as a table. Single file, no assets, opens in any browser. */\nexport function renderLeaderboardHtml(report: Leaderboard): string {\n const svg = renderLeaderboardSvg(report)\n const p = report.provenance\n const rows = report.profiles\n .map(\n (r, i) =>\n `<tr><td>${i + 1}</td><td>${esc(r.label)}</td><td class=\"n\">${pct(r.meanScore)}</td><td class=\"n\">${pct(r.solveRate)}</td><td class=\"n\">${r.n}</td><td class=\"n\">${cost(r.costUsd, r.capturedCostUsd, r.uncapturedCostRuns, 3)}</td>${report.axes\n .map((a) => {\n const v = r.perAxis[a]\n return `<td class=\"n\">${v === undefined ? '·' : pct(v)}</td>`\n })\n .join('')}</tr>`,\n )\n .join('\\n')\n const axisHead = report.axes.map((a) => `<th>${esc(a)}</th>`).join('')\n return `<!doctype html><html><head><meta charset=\"utf-8\"><title>${esc(report.title)}</title>\n<style>\nbody{font:14px ui-sans-serif,system-ui,sans-serif;margin:2rem;color:#111}\nh1{font-size:1.4rem}.sub{color:#555;margin:.2rem 0 1.2rem}\ntable{border-collapse:collapse;margin-top:1rem}td,th{border:1px solid #e5e7eb;padding:.35rem .6rem}\nth{background:#f9fafb;text-align:left}.n{text-align:right;font-variant-numeric:tabular-nums}\ntr:first-child td{font-weight:600}\n</style></head><body>\n<h1>${esc(report.title)}</h1>\n<div class=\"sub\">${p.profiles} profiles × ${p.axes} axes · ${p.records} runs · ${p.models.length} models · total ${cost(p.totalCostUsd, p.capturedCostUsd, p.uncapturedCostRecords, 2)}</div>\n${svg}\n<table><thead><tr><th>#</th><th>Profile</th><th>Score</th><th>Solved</th><th>Runs</th><th>Cost</th>${axisHead}</tr></thead>\n<tbody>\n${rows}\n</tbody></table>\n</body></html>`\n}\n","/**\n *\n * Completion / satisfiability — the OTHER output of the pluggable analyst (the steer output\n * is `AnalystFinding[]` via the `analyze` hook; this is the \"is it done?\" output via the\n * `complete` hook). A `CompletionAnalyst` reads a node's trace and returns a `CompletionVerdict`\n * the PARENT (driver) acts on: end the node, or keep going. It fits ANY node and composes to\n * any depth — a 1-deep loop has one; an N-deep tree has one per node.\n *\n * The verdict's authority scales with its DETERMINISM (the thing that varies by task):\n * - `deterministic` — build/test/lint pass, a proof checks, every claim's citation resolves:\n * ground truth, the driver TRUSTS it and ends. Not an opinion.\n * - `probabilistic` — a quality/soundness judgment (marketing, \"the experiment is sound\"):\n * ADVISORY. It passes to the driver with its reasons; the driver validates (here: a\n * confidence threshold; a richer driver may re-examine the reasons) before ending.\n *\n * Two stop-signal mechanisms, by node mode, both → one `CompletionVerdict`:\n * - sandbox-agent (text stream): a unique per-node STOP SENTINEL the agent emits when done\n * (`stopSentinel` / `sentinelCompletion`) — ralph-loop style; the seed makes it\n * unguessable + attributable, so it can't be spuriously emitted or confused with content.\n * - deterministic check (compile/test/citation/proof): `deterministicCompletion(check)` —\n * a verifier over the output, never the judge verdict (selector ≠ judge holds).\n *\n * @experimental\n */\n\nimport type { Iteration } from './types'\n\n/** Trace-derived evidence for a completion claim — an artifact (output) or a verifier metric,\n * never the judge's own verdict. Mirrors the steer-firewall's provenance discipline. */\nexport interface CompletionEvidence {\n kind: 'artifact' | 'metric'\n uri: string\n}\n\n/** The \"is it done?\" verdict an analyst returns to the parent. */\nexport interface CompletionVerdict {\n done: boolean\n /** How verifiable the claim is — sets whether the driver trusts it or validates it. */\n determinism: 'deterministic' | 'probabilistic'\n /** Why the analyst believes it is (or isn't) done — what the driver validates. */\n reasons?: string\n /** 0..1, for probabilistic verdicts; the driver's validation threshold reads this. */\n confidence?: number\n evidence?: ReadonlyArray<CompletionEvidence>\n}\n\n/** Reads a node's trace → a completion verdict. Same input shape as the `analyze` hook, so\n * ONE analyst node can back both channels (findings for steer, a verdict for stop). */\nexport interface CompletionAnalyst<Task, Output> {\n assess(input: {\n task: Task\n history: ReadonlyArray<Iteration<Task, Output>>\n }): CompletionVerdict | Promise<CompletionVerdict>\n}\n\n/** When a verdict authorizes the driver to END. Deterministic → trust (ground truth);\n * probabilistic → validate by confidence threshold (the driver's check). */\nexport interface CompletionPolicy {\n /** Minimum confidence a PROBABILISTIC verdict must clear to end. Default 0.8. */\n minConfidence?: number\n}\n\n/** Decide whether a `CompletionVerdict` may end the node under the policy: authority scales with the verdict's determinism, and probabilistic verdicts must clear `minConfidence`. */\nexport function completionAuthorizes(v: CompletionVerdict, policy?: CompletionPolicy): boolean {\n if (!v?.done) return false\n if (v.determinism === 'deterministic') return true\n return (v.confidence ?? 0) >= (policy?.minConfidence ?? 0.8)\n}\n\n/**\n * A unique, attributable stop sentinel for a node (ralph-loop style). Deterministic from the\n * seed (no Math.random — reproducible + attributable to the node); the agent is instructed to\n * emit it VERBATIM when it judges itself done. Unguessable enough that content never trips it.\n */\nexport function stopSentinel(seed: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < seed.length; i += 1) {\n h ^= seed.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return `<<<{{STOP:${(h >>> 0).toString(16).padStart(8, '0')}}}>>>`\n}\n\n/**\n * Completion for a sandbox-agent node: done iff the latest output carries the node's stop\n * sentinel. PROBABILISTIC (the agent's own self-judgment) — the driver validates it.\n */\nexport function sentinelCompletion<Task>(\n sentinel: string,\n opts?: { confidence?: number },\n): CompletionAnalyst<Task, string> {\n return {\n assess({ history }) {\n const last = history[history.length - 1]\n const out = typeof last?.output === 'string' ? last.output : ''\n const done = out.includes(sentinel)\n return {\n done,\n determinism: 'probabilistic',\n confidence: done ? (opts?.confidence ?? 0.9) : 0,\n reasons: done ? 'agent emitted its assigned stop sentinel' : undefined,\n evidence: done && last ? [{ kind: 'artifact', uri: `attempt:${last.index}` }] : [],\n }\n },\n }\n}\n\n/**\n * Completion for a DETERMINISTIC check (build/test/lint/citation/proof): done iff the check\n * passes. Ground truth — the driver ends directly, no validation. The check reads the output\n * (a verifier), never the judge verdict — selector ≠ judge stays intact.\n */\nexport function deterministicCompletion<Task, Output>(\n check: (\n output: Output,\n history: ReadonlyArray<Iteration<Task, Output>>,\n ) => { passed: boolean; reasons?: string },\n): CompletionAnalyst<Task, Output> {\n return {\n assess({ history }) {\n const last = history[history.length - 1]\n if (last?.output === undefined) {\n return { done: false, determinism: 'deterministic', reasons: 'no output yet' }\n }\n const r = check(last.output, history)\n return {\n done: r.passed,\n determinism: 'deterministic',\n reasons: r.reasons,\n evidence: [{ kind: 'artifact', uri: `attempt:${last.index}` }],\n }\n },\n }\n}\n","/**\n * `loopDispatch` — turn `runAgentRounds` into an agent-eval campaign dispatch.\n *\n * Without this adapter a consumer wiring `runAgentRounds` into `runProfileMatrix` /\n * `runCampaign` has to, by hand, every time: (a) build an `ExecCtx` with a\n * sandbox client, (b) adapt the campaign `DispatchContext.trace` into a\n * `LoopTraceEmitter` (or lose all loop trace correlation), and (c) remember to\n * forward the loop's cost + tokens via `ctx.cost` (forgetting it yields a\n * `{0,0}` cell the backend-integrity guard reads as a stub). Three foot-guns,\n * the third silent. The fleet's products skipped (c) and fell back to a\n * `workerRecords[]` side-channel — the exact anti-pattern the substrate exists\n * to kill.\n *\n * `loopDispatch` collapses all three into one typed call:\n *\n * const dispatch = loopDispatch({\n * sandboxClient,\n * toLoopOptions: (scenario, profile) => ({ driver, agentRun, output, validator, task }),\n * })\n * await runProfileMatrix({ profiles, scenarios, dispatch, judges, commitSha })\n *\n * The complete Runtime cell starts inside `ctx.cost.runPaidCall` before any\n * sandbox work begins. Its provider-reported usage becomes the paid-call\n * receipt before Eval settles the call. A completed `LoopResult` cannot be\n * attached afterward because it cannot prove pre-execution admission.\n * Trace events are forwarded automatically and the Runtime context is built\n * automatically.\n *\n * Typed structurally against the campaign `DispatchContext` (imported type-only\n * from `@tangle-network/agent-eval/campaign`) — a downward dependency, never an\n * inversion.\n */\n\n// agent-eval's AgentProfile (the eval-harness unit of variation, `model: string`)\n// — NOT sandbox's AgentProfile. ProfileDispatchFn is keyed on the former.\nimport type { AgentProfile, CostReceiptInput, MaximumCharge } from '@tangle-network/agent-eval'\nimport type {\n CampaignTraceWriter,\n DispatchContext,\n DispatchFn,\n ProfileDispatchFn,\n Scenario,\n} from '@tangle-network/agent-eval/campaign'\nimport { type RunAgentRoundsOptions, runAgentRounds } from './run-loop'\nimport type { LoopResult, LoopTraceEmitter, SandboxClient } from './types'\n\n/** runAgentRounds options minus the `ctx` (loopDispatch builds the ctx). */\nexport type LoopOptionsForDispatch<Task, Output, Decision> = Omit<\n RunAgentRoundsOptions<Task, Output, Decision>,\n 'ctx'\n>\n\nexport interface LoopDispatchOptions<\n Task,\n Output,\n Decision,\n TScenario extends Scenario,\n TArtifact,\n> {\n /** Sandbox client used for every cell's `runAgentRounds`. Supplied once. */\n sandboxClient: SandboxClient\n /** Build the per-cell runAgentRounds options from the scenario (+ profile, when\n * used with `runProfileMatrix`). */\n toLoopOptions: (\n scenario: TScenario,\n profile: AgentProfile,\n ) => LoopOptionsForDispatch<Task, Output, Decision>\n /** Map the finished loop to the artifact the judges score. Default:\n * `result.winner?.output`. A loop with no winner yields `undefined` (judges\n * skip the cell) — but the loop's token usage is STILL reported, so the\n * integrity guard sees real activity. */\n toArtifact?: (result: LoopResult<Task, Output, Decision>) => TArtifact\n /** Forward `loop.*` trace events into the campaign's scoped trace so loop\n * spans correlate with the cell. Default true. */\n forwardTrace?: boolean\n /** Cost-meter source label for the loop's spend. Default `'loop'`. */\n costSource?: string\n /** Provider- or executor-enforced maximum for this whole cell dispatch.\n * Required by agent-eval before execution when the campaign is cost-capped. */\n maximumCharge?:\n | MaximumCharge\n | ((scenario: TScenario, profile: AgentProfile) => MaximumCharge | undefined)\n /** Resolve the model actually served from the completed loop. */\n resolveCostModel?: (\n result: LoopResult<Task, Output, Decision>,\n scenario: TScenario,\n profile: AgentProfile,\n ) => string | undefined\n}\n\n/** Bridge a campaign `DispatchContext.trace` to a `LoopTraceEmitter` so every\n * `loop.*` event lands as a span under the cell's scoped trace. */\nfunction campaignTraceToLoopEmitter(trace: CampaignTraceWriter): LoopTraceEmitter {\n return {\n emit(event) {\n trace\n .span(event.kind, { runId: event.runId, timestamp: event.timestamp, ...event.payload })\n .end()\n },\n }\n}\n\nasync function runLoopForCell<Task, Output, Decision, TScenario extends Scenario, TArtifact>(\n opts: LoopDispatchOptions<Task, Output, Decision, TScenario, TArtifact>,\n scenario: TScenario,\n profile: AgentProfile,\n ctx: DispatchContext,\n): Promise<TArtifact> {\n const loopOptions = opts.toLoopOptions(scenario, profile)\n return runLoopWithCampaignContext(opts, loopOptions, ctx, {\n model: profile.model?.default ?? modelFromLoopOptions(loopOptions),\n maximumCharge:\n typeof opts.maximumCharge === 'function'\n ? opts.maximumCharge(scenario, profile)\n : opts.maximumCharge,\n resolveModel: opts.resolveCostModel\n ? (result) => opts.resolveCostModel?.(result, scenario, profile)\n : undefined,\n })\n}\n\nasync function runLoopWithCampaignContext<Task, Output, Decision, TArtifact>(\n opts: {\n sandboxClient: SandboxClient\n toArtifact?: (result: LoopResult<Task, Output, Decision>) => TArtifact\n forwardTrace?: boolean\n costSource?: string\n },\n loopOptions: LoopOptionsForDispatch<Task, Output, Decision>,\n ctx: DispatchContext,\n cost: {\n model: string\n maximumCharge?: MaximumCharge\n resolveModel?: (result: LoopResult<Task, Output, Decision>) => string | undefined\n },\n): Promise<TArtifact> {\n const paid = await ctx.cost.runPaidCall({\n channel: 'agent',\n actor: opts.costSource ?? 'loop',\n model: cost.model,\n signal: ctx.signal,\n ...(cost.maximumCharge ? { maximumCharge: cost.maximumCharge } : {}),\n execute: (executionSignal) =>\n runAgentRounds<Task, Output, Decision>({\n ...loopOptions,\n ctx: {\n sandboxClient: opts.sandboxClient,\n signal: executionSignal,\n traceEmitter:\n opts.forwardTrace === false ? undefined : campaignTraceToLoopEmitter(ctx.trace),\n },\n }),\n receipt: (result) => loopCostReceipt(result, cost.resolveModel?.(result) ?? cost.model),\n })\n if (!paid.succeeded) {\n throw paid.error\n }\n const result = paid.value\n const toArtifact =\n opts.toArtifact ?? ((r: LoopResult<Task, Output, Decision>) => r.winner?.output as TArtifact)\n return toArtifact(result)\n}\n\nfunction loopCostReceipt<Task, Output, Decision>(\n result: LoopResult<Task, Output, Decision>,\n model: string,\n): CostReceiptInput {\n return {\n model,\n inputTokens: result.tokenUsage.input,\n outputTokens: result.tokenUsage.output,\n ...(result.costUsd > 0 ? { actualCostUsd: result.costUsd } : {}),\n }\n}\n\nfunction modelFromLoopOptions<Task, Output, Decision>(\n options: LoopOptionsForDispatch<Task, Output, Decision>,\n): string {\n const profiles = options.agentRun\n ? [options.agentRun.profile]\n : (options.agentRuns?.map((run) => run.profile) ?? [])\n const models = new Set(\n profiles.map((profile) => profile.model?.default).filter((model): model is string => !!model),\n )\n if (models.size === 1) return [...models][0] as string\n return models.size > 1 ? 'mixed' : 'unknown'\n}\n\n/** Options for adapting plain agent-eval campaign scenarios into Runtime cells. */\nexport interface LoopCampaignDispatchOptions<\n Task,\n Output,\n Decision,\n TScenario extends Scenario,\n TArtifact,\n> {\n /** Sandbox client used for every campaign cell's `runAgentRounds`. */\n sandboxClient: SandboxClient\n /** Build the per-cell runAgentRounds options from the campaign scenario. */\n toLoopOptions: (scenario: TScenario) => LoopOptionsForDispatch<Task, Output, Decision>\n /** Map the finished loop to the artifact the campaign judges score. */\n toArtifact?: (result: LoopResult<Task, Output, Decision>) => TArtifact\n /** Forward `loop.*` trace events into the campaign's scoped trace. Default true. */\n forwardTrace?: boolean\n /** Cost-meter source label for the loop's spend. Default `'loop'`. */\n costSource?: string\n /** Provider- or executor-enforced maximum for this whole cell dispatch. */\n maximumCharge?: MaximumCharge | ((scenario: TScenario) => MaximumCharge | undefined)\n /** Resolve the model actually served from the completed loop. */\n resolveCostModel?: (\n result: LoopResult<Task, Output, Decision>,\n scenario: TScenario,\n ) => string | undefined\n}\n\n/**\n * Adapter for plain `runCampaign` scenarios. This is the Runtime-side pair for\n * agent-eval fixture scenarios: load fixtures in `agent-eval/campaign`, build\n * the Runtime cell here, and keep paid-call admission, receipts, and traces\n * automatic.\n */\nexport function loopCampaignDispatch<Task, Output, Decision, TScenario extends Scenario, TArtifact>(\n opts: LoopCampaignDispatchOptions<Task, Output, Decision, TScenario, TArtifact>,\n): DispatchFn<TScenario, TArtifact> {\n return (scenario, ctx) => {\n const loopOptions = opts.toLoopOptions(scenario)\n return runLoopWithCampaignContext(opts, loopOptions, ctx, {\n model: modelFromLoopOptions(loopOptions),\n maximumCharge:\n typeof opts.maximumCharge === 'function'\n ? opts.maximumCharge(scenario)\n : opts.maximumCharge,\n resolveModel: opts.resolveCostModel\n ? (result) => opts.resolveCostModel?.(result, scenario)\n : undefined,\n })\n }\n}\n\n/**\n * Adapter for `runProfileMatrix` (profile is an axis). Returns a\n * `ProfileDispatchFn` that runs `runAgentRounds` per (profile, scenario) cell\n * inside Eval's paid-call lifecycle.\n */\nexport function loopDispatch<Task, Output, Decision, TScenario extends Scenario, TArtifact>(\n opts: LoopDispatchOptions<Task, Output, Decision, TScenario, TArtifact>,\n): ProfileDispatchFn<TScenario, TArtifact> {\n return (profile, scenario, ctx) => runLoopForCell(opts, scenario, profile, ctx)\n}\n","/**\n * The ONE pseudo-box adapter: present any one-shot `Executor` (router / bridge /\n * BYO) as a `SandboxClient` so the round-synchronous `runAgentRounds` can drive it\n * without each call site re-faking a box. This is the single shell that\n * `bench/src/router-executor.ts`, generate-eval's old `bridgeSandboxClient`, and\n * the search-bench bridge transport were each re-implementing.\n *\n * It is deliberately for NON-box executors only — a real sandbox harness already\n * IS a `SandboxClient` (boxes, sessions, fs, fork are real there). Here each\n * `streamPrompt` runs the executor once and emits the terminal\n * `{type:'result', data:{finalText, tokenUsage, costUsd}}` event that\n * `answerOutput`/the kernel's cost ledger already parse — no sessions, no fs,\n * no fork (those degrade gracefully via the optional `SandboxClient` methods).\n */\nimport type { CreateSandboxOptions, SandboxEvent, SandboxInstance } from '@tangle-network/sandbox'\nimport type { AgentSpec, Executor, ExecutorFactory, ExecutorResult } from './supervise/types'\nimport type { SandboxClient } from './types'\n\nfunction isAsyncIterable(v: unknown): v is AsyncIterable<unknown> {\n return typeof v === 'object' && v !== null && Symbol.asyncIterator in v\n}\n\n/** Drive a (possibly streaming) executor to its terminal artifact. */\nasync function settle(\n exec: Executor<unknown>,\n task: unknown,\n signal: AbortSignal,\n): Promise<ExecutorResult<unknown>> {\n const r = exec.execute(task, signal)\n if (isAsyncIterable(r)) {\n for await (const _ of r) {\n // streaming executors meter as they run; the artifact is read after drain.\n }\n return exec.resultArtifact()\n }\n return r\n}\n\n/**\n * Adapt an `ExecutorFactory` into a `SandboxClient` for `runAgentRounds`. The factory is\n * instantiated fresh per `streamPrompt` (mirrors the per-spawn executor lifecycle):\n * run once on the prompt, emit the terminal result event, tear down.\n */\nexport function inlineSandboxClient(factory: ExecutorFactory<unknown>): SandboxClient {\n let seq = 0\n return {\n async create(options?: CreateSandboxOptions): Promise<SandboxInstance> {\n const id = `inline-${seq++}`\n // The `create(options)` backend override is threaded to the factory through\n // the `ExecutorContext.seams` channel (the designed opaque-seam extension\n // point), so a BYO executor that varies per-cell — e.g. the cli-bridge\n // executor reading its harness/model off `backend.type`/`backend.model.model`\n // — sees the same per-create config a real sandbox executor gets, without a\n // second client per cell.\n const createOptions = options\n return {\n id,\n async *streamPrompt(\n message: string,\n opts?: { signal?: AbortSignal },\n ): AsyncGenerator<SandboxEvent> {\n // Chain the caller's turn signal into the executor's spawn signal so\n // an abort reaches `exec.execute` — a cooperative executor settles\n // (throws) instead of running to completion after cancellation.\n const controller = new AbortController()\n const callerSignal = opts?.signal\n const onAbort = () =>\n controller.abort(callerSignal?.reason ?? new Error('prompt aborted'))\n if (callerSignal) {\n if (callerSignal.aborted) onAbort()\n else callerSignal.addEventListener('abort', onAbort, { once: true })\n }\n const spec: AgentSpec = { profile: { name: id }, harness: null }\n const exec = factory(spec, { signal: controller.signal, seams: { createOptions } })\n try {\n const artifact = await settle(exec, message, controller.signal)\n const out = artifact.out as { content?: string } | undefined\n // Speak the runtime's metering protocol: `extractLlmCallEvent` reads\n // flat `llm_call` events, not the nested result payload — without\n // this the kernel meters the iteration as a fabricated $0 / 0 tokens.\n const tokensIn = artifact.spent.tokens.input\n const tokensOut = artifact.spent.tokens.output\n const costUsd = artifact.spent.usd\n if (tokensIn || tokensOut || costUsd) {\n yield {\n type: 'llm_call',\n data: { tokensIn, tokensOut, costUsd },\n } as unknown as SandboxEvent\n }\n yield {\n type: 'result',\n data: {\n finalText: out?.content ?? '',\n tokenUsage: {\n inputTokens: tokensIn,\n outputTokens: tokensOut,\n },\n costUsd,\n },\n } as unknown as SandboxEvent\n } finally {\n callerSignal?.removeEventListener('abort', onAbort)\n await exec.teardown('brutalKill').catch(() => {})\n }\n },\n async delete(): Promise<void> {},\n } as unknown as SandboxInstance\n },\n }\n}\n","/**\n * `localSandboxClient` — the SAME-HOST pseudo-box: a `SandboxClient` whose\n * `create()` MATERIALIZES the profile's stdio MCP servers as local child\n * processes (`materializeLocalMcp`) and whose `streamPrompt` drives a real\n * tool loop (`runBrainLoop` over the router brain) with those live tools.\n *\n * Despite the interface name, this does NOT isolate processes. It is only for\n * author-controlled profiles whose local MCP commands a caller explicitly\n * trusts; user- or model-authored code belongs in a real sandbox. `delete()`\n * kills the children.\n *\n * A per-create profile may change the prompt surface. Permission to start a\n * local MCP process applies only when its full canonical bytes match the fixed\n * constructor profile; a different generated profile is refused.\n *\n * Event protocol matches `inlineSandboxClient`: one `llm_call` metering event\n * + one terminal `result` event with finalText/tokenUsage/costUsd.\n */\n\nimport {\n type AgentProfile,\n type AgentProfileSecurityPolicy,\n canonicalCandidateDigest,\n} from '@tangle-network/agent-interface'\nimport type { CreateSandboxOptions, SandboxEvent, SandboxInstance } from '@tangle-network/sandbox'\nimport { ValidationError } from '../errors'\nimport type { KeyProvider } from './key-provider'\nimport { routerBrain } from './router-client'\nimport { materializeLocalMcp } from './stdio-mcp-client'\nimport { runBrainLoop, type ToolLoopChat } from './tool-loop'\nimport type { SandboxClient } from './types'\n\nexport interface LocalSandboxClientOptions {\n /** The worker brain: router chat-completions with tool-calling. All three required. */\n router: { baseUrl: string; key: string; model: string }\n /** Tool-loop turns per prompt. Default 8. */\n maxTurns?: number\n /** Brain sampling temperature. Default: `routerBrain`'s (0.4). */\n temperature?: number\n /** Fallback profile when `create(options)` carries none on `backend.profile`. */\n profile?: AgentProfile\n /** Resolves profile-declared MCP secret names at child-process spawn time. */\n keys?: KeyProvider\n /** Explicit trust decision for the exact `profile` bytes supplied here.\n * Omit to refuse local processes. A permissive policy never transfers to a\n * different per-create profile and provides no host isolation. */\n profileSecurityPolicy?: AgentProfileSecurityPolicy\n}\n\n/** A same-host `SandboxClient` adapter with no process isolation. Local MCP is\n * refused unless the caller explicitly supplies a policy that allows it. */\nexport function localSandboxClient(opts: LocalSandboxClientOptions): SandboxClient {\n if (opts.profileSecurityPolicy?.allowLocalMcp && opts.profile === undefined) {\n throw new ValidationError(\n 'localSandboxClient: allowLocalMcp requires a fixed author-controlled profile; dynamic profiles need a real sandbox',\n )\n }\n const trustedProfileDigest =\n opts.profileSecurityPolicy?.allowLocalMcp && opts.profile !== undefined\n ? canonicalCandidateDigest(opts.profile)\n : undefined\n const maxTurns = opts.maxTurns ?? 8\n let seq = 0\n return {\n async create(options?: CreateSandboxOptions): Promise<SandboxInstance> {\n const profile =\n (options?.backend as { profile?: AgentProfile } | undefined)?.profile ?? opts.profile ?? {}\n const policyApplies =\n opts.profileSecurityPolicy !== undefined &&\n (!opts.profileSecurityPolicy.allowLocalMcp ||\n (trustedProfileDigest !== undefined &&\n canonicalCandidateDigest(profile) === trustedProfileDigest))\n // Materialize NOW: a declared server that cannot boot fails the create,\n // not the first prompt — matching the real sandbox backend, where a box\n // whose MCP cannot start never comes up.\n const mcp = await materializeLocalMcp(profile, {\n ...(opts.keys ? { keys: opts.keys } : {}),\n ...(policyApplies ? { profileSecurityPolicy: opts.profileSecurityPolicy } : {}),\n })\n const brain: ToolLoopChat = routerBrain(\n {\n routerBaseUrl: opts.router.baseUrl,\n routerKey: opts.router.key,\n model: opts.router.model,\n },\n opts.temperature !== undefined ? { temperature: opts.temperature } : {},\n )\n const system = [profile.prompt?.systemPrompt, ...(profile.prompt?.instructions ?? [])]\n .filter((s): s is string => typeof s === 'string' && s.trim().length > 0)\n .join('\\n\\n')\n const id = `local-${seq++}`\n return {\n id,\n async *streamPrompt(\n message: string,\n popts?: { signal?: AbortSignal },\n ): AsyncGenerator<SandboxEvent> {\n let costUsd = 0\n const chat: ToolLoopChat = async (messages, tools) => {\n const r = await brain(messages, tools)\n if (r.costUsd) costUsd += r.costUsd\n return r\n }\n const r = await runBrainLoop({\n chat,\n tools: mcp.tools,\n execute: (name, args) => mcp.call(name, args),\n initialMessages: [\n ...(system ? [{ role: 'system', content: system }] : []),\n { role: 'user', content: message },\n ],\n maxTurns,\n hooks: { stopBefore: () => popts?.signal?.aborted === true },\n })\n // Speak the runtime's metering protocol (see inlineSandboxClient):\n // a flat `llm_call` event so the kernel never meters a fabricated $0.\n if (r.usage.input || r.usage.output || costUsd) {\n yield {\n type: 'llm_call',\n data: { tokensIn: r.usage.input, tokensOut: r.usage.output, costUsd },\n } as unknown as SandboxEvent\n }\n yield {\n type: 'result',\n data: {\n finalText: r.final,\n tokenUsage: { inputTokens: r.usage.input, outputTokens: r.usage.output },\n costUsd,\n },\n } as unknown as SandboxEvent\n },\n async delete(): Promise<void> {\n await mcp.close()\n },\n } as unknown as SandboxInstance\n },\n }\n}\n","/**\n * The product-facing backend selector: one call picks the execution transport a\n * `runAgentRounds` (or any consumer that drives a `SandboxClient`) runs on, from the\n * package a product already depends on. It is pure sugar over the existing\n * primitives — `createExecutor({ backend })` + `inlineSandboxClient` — and adds\n * ZERO transport code (the node:http cli-bridge transport lives in `bridgeExecutor`).\n *\n * The heavy `resolveBenchClient` in `@tangle-network/agent-bench` is the bench-side\n * sibling: it layers router/search specifics a product should not have to depend on.\n * This is the generic, dep-light core products call to switch backends:\n *\n * - `backend: 'sandbox'` → IN-BOX: return the caller's real Sandbox-backed\n * `sandboxClient` unchanged. Fail loud if absent — a\n * product on the sandbox backend already holds its box.\n * - `backend: 'bridge'` → OFF-BOX: a local cli-bridge fronting a harness CLI\n * (opencode / kimi-code / …) as the leaf executor, wired\n * through the resumable `bridgeExecutor`.\n * - `backend: 'router'` → OFF-BOX: a router chat-completion as the leaf executor,\n * presented as a `SandboxClient` (no sandbox dependency).\n * - `backend: 'local'` → SAME-HOST: a router-brain tool loop with the\n * profile's stdio MCP servers spawned as LOCAL child\n * processes — the only backend that can reach an MCP\n * server built into a host worktree.\n */\n\nimport { inlineSandboxClient } from './inline-sandbox-client'\nimport { type LocalSandboxClientOptions, localSandboxClient } from './local-sandbox-client'\nimport { createExecutor } from './supervise/runtime'\nimport type { SandboxClient } from './types'\n\nexport interface ResolveSandboxClientOptions {\n /** The execution transport for the driven loop. */\n backend: 'sandbox' | 'bridge' | 'router' | 'local'\n /** `sandbox` backend: the caller's real Sandbox-backed client. Required for that backend. */\n sandboxClient?: SandboxClient\n /** `bridge` backend: local cli-bridge transport. `bearer` + `model` required. */\n bridge?: {\n /** cli-bridge base URL. Defaults to `http://127.0.0.1:3355`. */\n url?: string\n bearer: string\n /** Bridge model id, doubling as the harness selector (e.g. `claude-code/sonnet`). */\n model: string\n /** Per-turn deadline (ms). */\n timeoutMs?: number\n }\n /** `router` backend: router chat-completion transport. All three fields required. */\n router?: {\n baseUrl: string\n key: string\n model: string\n }\n /** `local` backend: same-host pseudo-box — the router brain drives a tool loop\n * with the profile's stdio MCP servers spawned as local children. */\n local?: LocalSandboxClientOptions\n}\n\n/**\n * Resolve a `SandboxClient` for the chosen backend. The generic, dep-light core\n * that `resolveBenchClient` builds on — reuse this instead of hand-rolling the\n * `createExecutor`/`inlineSandboxClient` branch in each product.\n */\nexport function resolveSandboxClient(opts: ResolveSandboxClientOptions): SandboxClient {\n switch (opts.backend) {\n case 'sandbox': {\n if (!opts.sandboxClient) {\n throw new Error(\"resolveSandboxClient: backend 'sandbox' requires opts.sandboxClient\")\n }\n return opts.sandboxClient\n }\n case 'bridge': {\n const bridge = opts.bridge\n if (!bridge?.bearer || !bridge.model) {\n throw new Error(\n \"resolveSandboxClient: backend 'bridge' requires bridge.bearer and bridge.model\",\n )\n }\n return inlineSandboxClient(\n createExecutor({\n backend: 'bridge',\n bridgeUrl: bridge.url ?? 'http://127.0.0.1:3355',\n bridgeBearer: bridge.bearer,\n model: bridge.model,\n timeoutMs: bridge.timeoutMs,\n }),\n )\n }\n case 'router': {\n const router = opts.router\n if (!router?.baseUrl || !router.key || !router.model) {\n throw new Error(\n \"resolveSandboxClient: backend 'router' requires router.baseUrl, router.key and router.model\",\n )\n }\n return inlineSandboxClient(\n createExecutor({\n backend: 'router',\n routerBaseUrl: router.baseUrl,\n routerKey: router.key,\n model: router.model,\n }),\n )\n }\n case 'local': {\n const local = opts.local\n if (!local?.router?.baseUrl || !local.router.key || !local.router.model) {\n throw new Error(\n \"resolveSandboxClient: backend 'local' requires local.router.baseUrl, local.router.key and local.router.model\",\n )\n }\n return localSandboxClient(local)\n }\n }\n}\n","/**\n *\n * Leak-free steering drivers — the non-LLM controls for the driven loop.\n *\n * These are the two sibling `Driver`s of the `refine` reference driver\n * (examples/driver-loop/driver-loop.ts), differing ONLY in how much of the\n * prior `verdict` their `plan()` is allowed to read. The amount of the verdict\n * a driver reads IS the experimental axis:\n *\n * • refine — reads `verdict.notes` (and/or `verdict.scores`): the grader's\n * findings. A reviewer/judge LLM turns those findings into the\n * next prompt. This is the \"coached\" condition.\n * • dumb — reads ONLY `verdict.valid` (the pass/fail boolean). No findings,\n * no scores, no LLM. The next prompt is one of two fixed strings\n * keyed on pass/fail. This is the leak-free pass/fail control.\n * • naive — reads NOTHING from the verdict. The next prompt is one fixed\n * continuation string every round. This is the leak-free\n * no-signal control.\n *\n * The `dumb → refine` gap measured on the same task therefore isolates how much\n * the grader's findings (its notes/scores) inflate the result beyond a bare\n * pass/fail signal: it is exactly the delta between reading `verdict.valid` and\n * reading `verdict.notes`. The `naive → dumb` gap isolates the value of the\n * pass/fail bit alone. Run all three against one task to attribute a loop's\n * lift to its actual source instead of crediting it to the grader for free.\n *\n * GENERALITY CONTRACT\n * -------------------\n * These builders carry ZERO domain coupling:\n * • The continuation strings are PARAMETERS. The caller passes its own text;\n * the substrate hardcodes none.\n * • The Task shape is OPAQUE. The builder never assumes a `prompt` field (or\n * any field). The caller supplies `applyContinuation(task, text) → Task`,\n * which folds a steering string into the caller's own Task shape — exactly\n * symmetric with the caller-supplied `AgentRunSpec.taskToPrompt`. For a Task\n * that is `{ prompt: string; … }`, the fold is the one-liner\n * `(task, text) => ({ ...task, prompt: text })`.\n *\n * They consume nothing the loop kernel does not already give `plan()`/`decide()`\n * — `runAgentRounds` requires no change. A benchmark picks a driver by name and the\n * kernel does the rest.\n *\n * @experimental\n */\n\nimport type { Driver, Iteration } from './types'\n\n/**\n * Terminal-or-continue decision shared by all three steering drivers. The\n * non-terminal `'refine'` keeps the loop running another shot; the terminal\n * `'pick-winner'`/`'fail'` stop it (`isTerminalDecision` in run-loop.ts treats\n * `'pick-winner'` and `'fail'` as terminal and any other string as a request\n * for another round). Identical to the reference refine driver's decision set.\n */\nexport type SteeringDecision = 'refine' | 'pick-winner' | 'fail'\n\n/**\n * Fold a steering string into the caller's Task shape, producing the Task for\n * the next shot. The substrate never assumes how a Task carries its prompt, so\n * the caller supplies this — the same way it supplies `taskToPrompt`. The\n * original `task` is passed so the fold can preserve task-level fields (ids,\n * fixtures, feature names) and replace only the instruction.\n */\nexport type ApplyContinuation<Task> = (task: Task, continuation: string) => Task\n\n/**\n * Shared `decide()` for the steering drivers. Verbatim semantics of the\n * reference refine driver: a valid iteration anywhere → terminal `'pick-winner'`;\n * otherwise `'refine'` (non-terminal, run another shot) while history is under\n * the shot cap, else terminal `'fail'`. Pure over history; reads only\n * `verdict.valid` (never notes/scores) so it adds no leak of its own.\n */\nfunction decideUntilValidOrCapped<Task, Output>(\n history: ReadonlyArray<Iteration<Task, Output>>,\n maxIterations: number,\n): SteeringDecision {\n if (history.some((it) => it.verdict?.valid)) return 'pick-winner'\n return history.length < maxIterations ? 'refine' : 'fail'\n}\n\n/** Options for {@link naiveDriver}. */\nexport interface NaiveDriverOptions<Task> {\n /**\n * The fixed continuation issued every round after shot 0. The same string is\n * sent whether the prior shot passed inspection or not — the naive driver\n * reads no part of the verdict. Domain text is the caller's; the substrate\n * supplies none.\n */\n continuation: string\n /** Folds `continuation` into the caller's Task shape for the next shot. */\n applyContinuation: ApplyContinuation<Task>\n /** Hard shot cap. The loop stops refining once history reaches this length. */\n maxIterations: number\n /** Trace-event identifier. Default `'naive'`. */\n name?: string\n}\n\n/**\n * `naiveDriver` — the no-signal steering control.\n *\n * `plan()` runs the initial `task` at shot 0, then issues the SAME fixed\n * `continuation` every subsequent round until a shot is valid or the cap is\n * hit. It reads NOTHING from `history[last].verdict` — not `.valid`, not\n * `.notes`, not `.scores`. It is the floor a coached loop must beat to earn its\n * coaching: any lift over naive that is not also present in `dumb` is\n * attributable to the pass/fail bit, and any lift of `refine` over `dumb` is\n * attributable to the grader's findings.\n */\nexport function naiveDriver<Task, Output>(\n options: NaiveDriverOptions<Task>,\n): Driver<Task, Output, SteeringDecision> {\n const { continuation, applyContinuation, maxIterations, name = 'naive' } = options\n return {\n name,\n plan(task, history) {\n if (history.length === 0) return Promise.resolve([task])\n const last = history[history.length - 1]\n // Stop once a shot is valid or the cap is reached. The verdict is read\n // ONLY for `.valid` here, never to compose the prompt — the continuation\n // is fixed regardless of how the prior shot scored.\n if (last?.verdict?.valid) return Promise.resolve([])\n if (history.length >= maxIterations) return Promise.resolve([])\n return Promise.resolve([applyContinuation(task, continuation)])\n },\n decide(history) {\n return decideUntilValidOrCapped(history, maxIterations)\n },\n // Pure refine topology (one task per round) — render the steer move.\n describePlan() {\n return { kind: 'refine', rationale: 'naive fixed continuation (no grade signal)' }\n },\n }\n}\n\n/** Options for {@link dumbDriver}. */\nexport interface DumbDriverOptions<Task> {\n /**\n * Continuation issued when the prior shot's verdict is valid. In a\n * stop-on-pass loop this is rarely reached (a valid shot ends the loop), but\n * it is required so the driver is total over the pass/fail bit; pass a\n * confirmation/keep-going string.\n */\n onPass: string\n /** Continuation issued when the prior shot's verdict is NOT valid. */\n onFail: string\n /** Folds the chosen continuation into the caller's Task shape. */\n applyContinuation: ApplyContinuation<Task>\n /** Hard shot cap. The loop stops refining once history reaches this length. */\n maxIterations: number\n /** Trace-event identifier. Default `'dumb'`. */\n name?: string\n}\n\n/**\n * `dumbDriver` — the pass/fail-only steering control.\n *\n * `plan()` runs the initial `task` at shot 0, then reads ONLY\n * `history[last].verdict.valid` (the boolean) and issues `onPass` or `onFail`\n * accordingly. It MUST NOT read `.notes` or `.scores` — that boundary is the\n * leak-free firewall. A `verdict` with no `valid` set (or no verdict) is\n * treated as not-valid, so the driver is total and never throws on a\n * grader/transport gap.\n *\n * The `dumb → refine` gap is the headline measurement: refine reads the\n * grader's `notes`, dumb reads only the pass/fail bit, so the difference is\n * exactly the value the findings add over a bare boolean.\n */\nexport function dumbDriver<Task, Output>(\n options: DumbDriverOptions<Task>,\n): Driver<Task, Output, SteeringDecision> {\n const { onPass, onFail, applyContinuation, maxIterations, name = 'dumb' } = options\n return {\n name,\n plan(task, history) {\n if (history.length === 0) return Promise.resolve([task])\n const last = history[history.length - 1]\n const passed = last?.verdict?.valid === true\n if (passed) return Promise.resolve([])\n if (history.length >= maxIterations) return Promise.resolve([])\n // The ONLY verdict read in the steering path: the pass/fail boolean.\n // `.notes`/`.scores` are deliberately never touched.\n const continuation = passed ? onPass : onFail\n return Promise.resolve([applyContinuation(task, continuation)])\n },\n decide(history) {\n return decideUntilValidOrCapped(history, maxIterations)\n },\n describePlan() {\n return { kind: 'refine', rationale: 'dumb pass/fail-only continuation (no grader findings)' }\n },\n }\n}\n","/**\n * `defineLeaderboard` — the declarative eval-leaderboard facade.\n *\n * A product's harness×model leaderboard is always the same assembly: expand a\n * base profile across the harness×model axes (`expandProfileAxes`), run every\n * (profile, case) cell as a driven loop (`loopDispatch` + `naiveDriver`), score\n * with the domain's grader, and emit ONE `runProfileMatrix` call. Each product\n * hand-rolled that assembly (~650 lines each) and re-hit the same footguns:\n * stale cell-cache reuse, zero-token stub cells, missing model snapshots.\n *\n * This facade IS that assembly, once, with the domain reduced to a declarative\n * spec: `cases` + `prompt` + `score`. It contains NO execution, judging, or\n * metering logic of its own — every moving part is an existing primitive, and\n * every default is overridable:\n *\n * - LEVEL 0 (declarative): `cases` / `prompt` / `score` / `axis`.\n * - LEVEL 1 (seams): `backends`, `flags`, `parseOutput`, `onCellEvents`,\n * `resolveModel`, `setup`/`teardown`, `export`, `modelBackend`, `matrix`\n * passthrough.\n * - LEVEL 2 (replacement): `dispatch` and `judges` swap out the whole\n * loop wiring or scoring; `runProfileMatrix` itself stays public as the\n * escape floor — a product overriding everything just writes what it has\n * today, no capability removed.\n *\n * `toBenchmarkAdapter()` exposes the same domain surface in the structural\n * `BenchmarkAdapter` shape (`name`/`preflight`/`loadTasks`/`judge`/\n * `goldArtifact`) so a product leaderboard can register into a benchmark\n * registry without this module depending on one.\n *\n * @experimental\n */\nimport { execFileSync } from 'node:child_process'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport {\n type AgentProfile,\n CODING_HARNESSES,\n expandProfileAxes,\n type HarnessType,\n harnessAxisOf,\n type MaximumCharge,\n} from '@tangle-network/agent-eval'\nimport {\n type JudgeConfig,\n type ProfileDispatchFn,\n type RunProfileMatrixOptions,\n type RunProfileMatrixResult,\n runProfileMatrix,\n type Scenario,\n} from '@tangle-network/agent-eval/campaign'\nimport { collectAgentResponseText, type SandboxEvent } from '@tangle-network/sandbox'\nimport { leaderboard, renderLeaderboardMarkdown } from './benchmark-report'\nimport { loopDispatch } from './loop-dispatch'\nimport { resolveSandboxClient } from './resolve-sandbox-client'\nimport { naiveDriver, type SteeringDecision } from './steering-drivers'\nimport type { LoopResult, SandboxClient } from './types'\n\n/** Structured per-case verdict a `score` function may return (a bare number is\n * shorthand for `{ composite }`). `composite` is the [0,1] leaderboard score;\n * `dimensions` are recorded as extra judge dimensions. */\nexport interface LeaderboardScore {\n composite: number\n dimensions?: Record<string, number>\n notes?: string\n}\n\n/** The campaign scenario a case is wrapped into: the case rides along so\n * judges and hooks can reach the full domain payload, not just its id. */\nexport interface LeaderboardScenario<TCase> extends Scenario {\n case: TCase\n}\n\n/** One extra CLI flag a spec declares. Parsed by `run()` as `--<name> <value>`\n * and surfaced to every hook via `ctx.args`. */\nexport interface LeaderboardFlagSpec {\n default?: string\n description: string\n}\n\n/** Resolved run configuration handed to `setup` / `teardown` / `export`. */\nexport interface LeaderboardRunContext {\n name: string\n /** Execution backend name (`--backend`), a key of `backends`. */\n backend: string\n runDir: string\n exportDir: string\n /** Every parsed flag (standard + `spec.flags`), by name without `--`. */\n args: Record<string, string | undefined>\n harnesses: readonly HarnessType[]\n /** Snapshot-stamped model ids (`name@snapshot`) — the eval identity models. */\n models: readonly string[]\n caseIds: readonly string[]\n shots: number\n reps: number\n}\n\n/** Structurally `BenchTask` (bench registry shape) — declared locally so this\n * module adds no dependency on a benchmark package. */\nexport interface LeaderboardBenchTask {\n id: string\n prompt: string\n split?: string\n metadata?: Record<string, unknown>\n}\n\n/** Structurally `BenchScore` (bench registry shape). */\nexport interface LeaderboardBenchScore {\n resolved: boolean\n score: number\n detail?: string\n}\n\n/** Structurally `BenchmarkAdapter` (bench registry shape): `name`,\n * `preflight()`, `loadTasks()`, deterministic `judge()`, `goldArtifact()`.\n * Generic over the artifact channel; the `string` default IS the registry\n * shape, so a default-artifact adapter registers unchanged. */\nexport interface LeaderboardBenchmarkAdapter<TArtifact = string> {\n readonly name: string\n preflight(): Promise<void>\n loadTasks(opts?: {\n limit?: number\n split?: string\n ids?: string[]\n }): Promise<LeaderboardBenchTask[]>\n judge(task: LeaderboardBenchTask, artifact: TArtifact): Promise<LeaderboardBenchScore>\n goldArtifact(task: LeaderboardBenchTask): Promise<string | undefined>\n}\n\n/** Per-shot outcome context passed as `onCellEvents`'s third argument — how a\n * thrown shot (which never reaches `parseOutput`) stays visible through the\n * facade instead of surfacing only as an empty zero-token cell. */\nexport interface LeaderboardIterationInfo {\n /** 0-based shot index within the cell. */\n index: number\n /** The shot's thrown error message, when the shot failed before scoring. */\n error?: string\n /** The shot's validator verdict, when the shot reached scoring. */\n verdict?: { score?: number }\n}\n\n/**\n * The declarative leaderboard spec. `TArtifact` is the artifact channel the\n * dispatch produces and the judges score — `string` (the default) is the plain\n * agent-response-text path; a structured artifact type flows natively once the\n * spec supplies `parseOutput` (or a LEVEL-2 `dispatch`) producing it.\n */\nexport interface LeaderboardSpec<TCase, TArtifact = string> {\n /** Leaderboard name — the scenario `kind`, default profile name, and report title. */\n name: string\n /** The case corpus. Every case needs a stable string id (see `caseId`). */\n cases: TCase[]\n /** Stable id extractor. Default: the case's own `id` property (fail-loud\n * when absent or not a string). */\n caseId?: (c: TCase) => string\n /** The per-case task prompt. May be async (e.g. built by shelling out to a\n * reference implementation); resolved ONCE per case before dispatch. */\n prompt: (c: TCase) => string | Promise<string>\n /** The domain grader: agent output artifact → score. Used BOTH as the\n * per-shot validator (a shot with `composite > 0` stops the naive retry\n * loop) and, wrapped as a campaign judge, as the recorded leaderboard score. */\n score: (output: TArtifact, c: TCase) => number | LeaderboardScore\n /** Harness × model axes for `expandProfileAxes`. Defaults: the canonical\n * `CODING_HARNESSES` × the base profile's `model.default`. `--harnesses` /\n * `--models` override per run. */\n axis?: { harnesses?: readonly HarnessType[]; models?: readonly string[] }\n /** Base profile the axes expand over (prompt/tools/skills held fixed).\n * Default: a minimal `{ name, model: { default: <first model> } }`. */\n baseProfile?: AgentProfile\n /**\n * Execution-backend registry: `--backend <name>` picks the factory that\n * yields the `SandboxClient` every cell runs on. Merged over the defaults:\n * - `sandbox` — throws with guidance (a product must supply its real\n * Sandbox-backed client; the facade has no credentials).\n * - `cli-bridge` — `resolveSandboxClient({ backend: 'bridge' })` reading\n * `CLI_BRIDGE_URL` + `BRIDGE_BEARER`/`CLI_BRIDGE_BEARER`; the per-cell\n * harness/model ride in via `sandboxOverrides.backend`.\n */\n backends?: Record<string, (() => SandboxClient) | undefined>\n /** Extra `--flag value` CLI args `run()` parses and surfaces via `ctx.args`. */\n flags?: Record<string, LeaderboardFlagSpec>\n /** Extra fields merged into each cell's `backend.model` create override —\n * e.g. `{ provider: 'openai-compat', apiKey, baseUrl }` for a router-backed\n * sandbox. The cell's bare model id is set by the facade from the axis. */\n modelBackend?: Record<string, unknown>\n /** Runs once before the matrix (fetch fixtures, warm caches). */\n setup?: (ctx: LeaderboardRunContext) => Promise<void> | void\n /** Runs once after the matrix, even on failure (reap boxes, close handles). */\n teardown?: (ctx: LeaderboardRunContext) => Promise<void> | void\n /** Per-cell event tap: the raw sandbox events of EVERY shot, with the case —\n * the seam for domain metric capture (search counts, citations) without a\n * substrate change. Fires once per shot after the cell's loop settles, in\n * shot order, including thrown shots (whose events may be partial or empty);\n * the third argument carries the shot's index + error/verdict outcome. */\n onCellEvents?: (\n events: readonly SandboxEvent[],\n c: TCase,\n iteration?: LeaderboardIterationInfo,\n ) => void\n /** Output decode override: raw events → the scored artifact. Default: the\n * sandbox SDK's `collectAgentResponseText` (final answer text; empty string\n * when the stream carried none — which then scores 0). The default only\n * produces `string`, so a spec with a structured `TArtifact` MUST supply\n * this (or a LEVEL-2 `dispatch`). */\n parseOutput?: (events: readonly SandboxEvent[], c: TCase) => TArtifact\n /**\n * Resolve the model the backend ACTUALLY served off a shot's raw events.\n * Required for HARNESS_NATIVE_MODEL-snapped cells (a vendor-locked harness ×\n * an out-of-family model expands to the `default` sentinel): the RunRecord\n * must pin a real snapshot-bearing model id, which only the dispatch —\n * reading the backend's usage/terminal events — can know. When this returns\n * a value the default dispatch records it on the paid-call receipt;\n * in-family cells (concrete declared model) never need it.\n */\n resolveModel?: (events: readonly SandboxEvent[]) => string | undefined\n /** Result export. Default: write `matrix-result.json` under the run dir and\n * print (+ write) the ranked leaderboard markdown under the export dir. */\n export?: (\n result: RunProfileMatrixResult<TArtifact, LeaderboardScenario<TCase>>,\n ctx: LeaderboardRunContext,\n ) => Promise<void> | void\n /** LEVEL 2 — full dispatch replacement (in-process products bring their own).\n * The default is `loopDispatch` + `naiveDriver` over the resolved backend. */\n dispatch?: ProfileDispatchFn<LeaderboardScenario<TCase>, TArtifact>\n /** LEVEL 2 — full judge replacement. Default: `score` wrapped as one judge. */\n judges?: JudgeConfig<TArtifact, LeaderboardScenario<TCase>>[]\n /** Naive-retry shot cap per cell (`--shots`). Default 1. */\n shots?: number\n /** Replicates per cell (`--reps`). Default 1. */\n reps?: number\n /** Provider- or executor-enforced maximum for one cell dispatch. Required\n * before execution when `matrix.costCeiling` is configured. */\n maximumCharge?:\n | MaximumCharge\n | ((profile: AgentProfile, scenario: LeaderboardScenario<TCase>) => MaximumCharge | undefined)\n /** Passthrough overrides spread onto the final `runProfileMatrix` call\n * (e.g. `maxConcurrency`, `costCeiling`, `integrity`, `storage`) — spread\n * LAST, so anything the facade wired can be overridden. */\n matrix?: Partial<RunProfileMatrixOptions<LeaderboardScenario<TCase>, TArtifact>>\n}\n\nexport interface DefinedLeaderboard<TCase, TArtifact = string> {\n /**\n * Parse flags, run the matrix, export, and return the raw result.\n *\n * Standard flags: `--backend <name>` (default `sandbox`), `--harnesses a,b`,\n * `--models m1,m2`, `--cases id1,id2`, `--shots N`, `--reps N`,\n * `--model-snapshot <tag>`, `--run-dir <path>`, `--export-dir <path>`,\n * plus every `spec.flags` entry. `argv` defaults to `process.argv.slice(2)`.\n *\n * The default run dir is FRESH per invocation (timestamp+pid under the OS\n * tmpdir). `runProfileMatrix` caches cells by run dir, and a stable default\n * would silently reuse a prior FAILED zero-token cell and skip dispatch —\n * only an explicit `--run-dir` opts into that resume behavior.\n */\n run(argv?: string[]): Promise<RunProfileMatrixResult<TArtifact, LeaderboardScenario<TCase>>>\n /** The same domain surface in the structural `BenchmarkAdapter` shape. */\n toBenchmarkAdapter(): LeaderboardBenchmarkAdapter<TArtifact>\n}\n\n/** Read `--name <value>` from an argv array. */\nfunction argOf(argv: readonly string[], name: string): string | undefined {\n const i = argv.indexOf(`--${name}`)\n if (i >= 0 && i + 1 < argv.length) return argv[i + 1]\n return undefined\n}\n\nfunction splitList(v: string | undefined): string[] | undefined {\n if (v === undefined) return undefined\n const parts = v\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n return parts.length > 0 ? parts : undefined\n}\n\n/** RunRecords reject a bare model id — the eval IDENTITY model must carry a\n * snapshot (`name@<snapshot>`). Unchanged when already stamped. */\nfunction withSnapshot(model: string, snapshot: string): string {\n return model.includes('@') ? model : `${model}@${snapshot}`\n}\n\n/** The bare model id the backend actually serves (identity snapshot stripped). */\nfunction bareModel(model: string): string {\n return model.split('@')[0] ?? model\n}\n\nfunction gitSha(): string {\n try {\n return execFileSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf8' }).trim()\n } catch {\n return 'unknown'\n }\n}\n\nfunction normalizeScore(s: number | LeaderboardScore): LeaderboardScore {\n return typeof s === 'number' ? { composite: s } : s\n}\n\n/**\n * Assemble a declarative spec (`cases` + `prompt` + `score`) into a runnable\n * harness×model leaderboard — `run()` executes the matrix, `toBenchmarkAdapter()`\n * exposes the same domain as a structural `BenchmarkAdapter`.\n */\nexport function defineLeaderboard<TCase, TArtifact = string>(\n spec: LeaderboardSpec<TCase, TArtifact>,\n): DefinedLeaderboard<TCase, TArtifact> {\n const caseId = (c: TCase): string => {\n const id = spec.caseId ? spec.caseId(c) : (c as { id?: unknown }).id\n if (typeof id !== 'string' || id.length === 0) {\n throw new Error(\n `defineLeaderboard(${spec.name}): every case needs a stable string id — ` +\n 'give cases an `id` property or supply spec.caseId',\n )\n }\n return id\n }\n\n const selectCases = (ids?: readonly string[]): TCase[] => {\n if (!ids) return spec.cases\n const byId = new Map(spec.cases.map((c) => [caseId(c), c]))\n return ids.map((id) => {\n const c = byId.get(id)\n if (c === undefined) {\n throw new Error(\n `defineLeaderboard(${spec.name}): unknown case \"${id}\" (have: ${[...byId.keys()].join(', ')})`,\n )\n }\n return c\n })\n }\n\n const scoreJudge: JudgeConfig<TArtifact, LeaderboardScenario<TCase>> = {\n name: `${spec.name}-score`,\n dimensions: [{ key: 'composite', description: `${spec.name} case score` }],\n score({ artifact, scenario }) {\n const s = normalizeScore(spec.score(artifact, scenario.case))\n return {\n composite: s.composite,\n dimensions: { composite: s.composite, ...s.dimensions },\n notes: s.notes ?? '',\n }\n },\n }\n\n async function run(\n argv: string[] = process.argv.slice(2),\n ): Promise<RunProfileMatrixResult<TArtifact, LeaderboardScenario<TCase>>> {\n const args: Record<string, string | undefined> = {}\n for (const name of [\n 'backend',\n 'harnesses',\n 'models',\n 'cases',\n 'shots',\n 'reps',\n 'model-snapshot',\n 'run-dir',\n 'export-dir',\n ]) {\n args[name] = argOf(argv, name)\n }\n for (const [name, flag] of Object.entries(spec.flags ?? {})) {\n args[name] = argOf(argv, name) ?? flag.default\n }\n\n const backendName = args.backend ?? 'sandbox'\n const shots = Number(args.shots ?? spec.shots ?? 1)\n const reps = Number(args.reps ?? spec.reps ?? 1)\n const snapshot = args['model-snapshot'] ?? 'leaderboard'\n // FRESH run dir per invocation: runProfileMatrix caches cells by run dir,\n // and a stable default resumes a prior FAILED zero-token cell without\n // re-dispatching. Only an explicit --run-dir opts into resume.\n const runDir =\n args['run-dir'] ?? join(tmpdir(), `leaderboard-${spec.name}-${Date.now()}-${process.pid}`)\n const exportDir = args['export-dir'] ?? join(runDir, 'export')\n mkdirSync(runDir, { recursive: true })\n\n const cases = selectCases(splitList(args.cases))\n if (cases.length === 0) throw new Error(`defineLeaderboard(${spec.name}): no cases to run`)\n const scenarios: LeaderboardScenario<TCase>[] = cases.map((c) => ({\n id: caseId(c),\n kind: spec.name,\n case: c,\n }))\n\n const harnesses =\n (splitList(args.harnesses) as HarnessType[] | undefined) ??\n spec.axis?.harnesses ??\n CODING_HARNESSES\n const rawModels =\n splitList(args.models) ??\n spec.axis?.models ??\n (spec.baseProfile?.model?.default !== undefined\n ? [spec.baseProfile.model.default]\n : undefined)\n if (!rawModels || rawModels.length === 0) {\n throw new Error(\n `defineLeaderboard(${spec.name}): no models — pass --models, set spec.axis.models, ` +\n 'or give spec.baseProfile a model.default',\n )\n }\n const models = rawModels.map((m) => withSnapshot(m, snapshot))\n\n const base: AgentProfile =\n spec.baseProfile ??\n ({ name: spec.name, model: { default: bareModel(models[0] ?? '') } } as AgentProfile)\n const profiles = expandProfileAxes({ base, harnesses, models })\n\n const ctx: LeaderboardRunContext = {\n name: spec.name,\n backend: backendName,\n runDir,\n exportDir,\n args,\n harnesses,\n models,\n caseIds: scenarios.map((s) => s.id),\n shots,\n reps,\n }\n\n // Backend registry: defaults + spec overrides (spec wins). Factories are\n // lazy so an unused backend never resolves credentials.\n const backends: Record<string, (() => SandboxClient) | undefined> = {\n sandbox: () => {\n throw new Error(\n `defineLeaderboard(${spec.name}): the 'sandbox' backend needs your product's real ` +\n 'Sandbox client — supply spec.backends.sandbox (e.g. () => new Sandbox({ apiKey, baseUrl }))',\n )\n },\n 'cli-bridge': () => {\n const bearer = process.env.BRIDGE_BEARER ?? process.env.CLI_BRIDGE_BEARER\n if (!bearer) {\n throw new Error(\n `defineLeaderboard(${spec.name}): backend 'cli-bridge' needs BRIDGE_BEARER or CLI_BRIDGE_BEARER set`,\n )\n }\n return resolveSandboxClient({\n backend: 'bridge',\n bridge: {\n url: process.env.CLI_BRIDGE_URL,\n bearer,\n model: bareModel(models[0] ?? ''),\n timeoutMs: 900_000,\n },\n })\n },\n ...spec.backends,\n }\n const makeClient = backends[backendName]\n if (!makeClient) {\n throw new Error(\n `defineLeaderboard(${spec.name}): unknown backend \"${backendName}\" (have: ${Object.keys(backends).join(', ')})`,\n )\n }\n const sandboxClient = makeClient()\n\n // Prompts resolve ONCE per case, up front — spec.prompt may be async\n // (shelling out to a reference implementation) but the loop kernel's\n // taskToPrompt is sync.\n const promptById = new Map<string, string>()\n for (const s of scenarios) promptById.set(s.id, await spec.prompt(s.case))\n const promptOf = (s: LeaderboardScenario<TCase>): string => {\n const p = promptById.get(s.id)\n if (p === undefined)\n throw new Error(`defineLeaderboard(${spec.name}): no prompt for case \"${s.id}\"`)\n return p\n }\n\n // Monotonic per-shot nonce appended to each shot's prompt — defeats router\n // response-caching of byte-identical prompts across naive-retry shots.\n let shotNonce = 0\n\n // The default dispatch wraps loopDispatch per cell (closures only — no\n // per-cell resource cost) so the loop's finished iterations can be joined\n // with the campaign ctx: onCellEvents gets EVERY shot's outcome (a thrown\n // shot never reaches parse, so parse-time tapping would hide it), and a\n // the cost receipt records the spec-resolved served model (the only way to\n // pin HARNESS_NATIVE_MODEL-snapped cells to a real model).\n const maximumCharge = spec.maximumCharge\n const dispatch: ProfileDispatchFn<LeaderboardScenario<TCase>, TArtifact> = spec.dispatch ??\n ((profile, scenario, dispatchCtx) => {\n const cellDispatch = loopDispatch<\n LeaderboardScenario<TCase>,\n TArtifact,\n SteeringDecision,\n LeaderboardScenario<TCase>,\n TArtifact\n >({\n sandboxClient,\n maximumCharge:\n typeof maximumCharge === 'function'\n ? (cellScenario, cellProfile) => maximumCharge(cellProfile, cellScenario)\n : maximumCharge,\n resolveCostModel: (result, _cellScenario, cellProfile) => {\n if (!spec.resolveModel) return cellProfile.model?.default\n const served = new Set(\n result.iterations\n .map((iteration) => spec.resolveModel?.(iteration.events))\n .filter((model): model is string => model !== undefined),\n )\n if (served.size > 1) {\n throw new Error(\n `defineLeaderboard(${spec.name}): one cell reported multiple served models: ${[...served].join(', ')}`,\n )\n }\n return [...served][0] ?? cellProfile.model?.default\n },\n toLoopOptions: (cellScenario, cellProfile) => {\n // The cell's harness + model come off the profile's axis stamp set\n // by expandProfileAxes; the sandbox create override carries them to\n // whichever backend client runs the cell.\n const axis = harnessAxisOf(cellProfile)\n const modelId = bareModel(axis?.model ?? models[0] ?? '')\n return {\n // naiveDriver = the no-signal retry floor: re-run the same case as\n // an independent attempt until one scores (>0) or the shot cap.\n driver: naiveDriver<LeaderboardScenario<TCase>, TArtifact>({\n continuation: '',\n applyContinuation: (task) => task,\n maxIterations: shots,\n }),\n agentRun: {\n profile: cellProfile,\n taskToPrompt: (s) => `${promptOf(s)}\\n\\n<!-- independent-attempt:${shotNonce++} -->`,\n ...(axis\n ? {\n sandboxOverrides: {\n backend: {\n type: axis.harness,\n model: { ...spec.modelBackend, model: modelId },\n },\n } as never,\n }\n : {}),\n },\n output: {\n parse: (events) =>\n spec.parseOutput\n ? spec.parseOutput(events, cellScenario.case)\n : // The default decode produces string — the TArtifact\n // default. A structured-TArtifact spec supplies parseOutput\n // (documented on the field), so this cast never lies.\n ((collectAgentResponseText(events) ?? '') as TArtifact),\n },\n validator: {\n validate: async (output: TArtifact) => {\n const s = normalizeScore(spec.score(output, cellScenario.case))\n return { valid: s.composite > 0, score: s.composite }\n },\n },\n task: cellScenario,\n maxIterations: shots,\n }\n },\n toArtifact: (result: LoopResult<LeaderboardScenario<TCase>, TArtifact, unknown>) => {\n for (const iter of result.iterations) {\n spec.onCellEvents?.(iter.events, scenario.case, {\n index: iter.index,\n ...(iter.error ? { error: iter.error.message } : {}),\n ...(iter.verdict ? { verdict: { score: iter.verdict.score } } : {}),\n })\n }\n // Same as loopDispatch's default: no winner → undefined artifact\n // (judges skip the cell; usage is still reported).\n return result.winner?.output as TArtifact\n },\n })\n return cellDispatch(profile, scenario, dispatchCtx)\n })\n\n await spec.setup?.(ctx)\n try {\n const result = await runProfileMatrix<LeaderboardScenario<TCase>, TArtifact>({\n profiles,\n scenarios,\n dispatch,\n judges: spec.judges ?? [scoreJudge],\n runDir,\n commitSha: gitSha(),\n reps,\n ...spec.matrix,\n })\n\n if (spec.export) {\n await spec.export(result, ctx)\n } else {\n mkdirSync(exportDir, { recursive: true })\n writeFileSync(join(runDir, 'matrix-result.json'), `${JSON.stringify(result, null, 2)}\\n`)\n const table = renderLeaderboardMarkdown(\n leaderboard(result.records, { title: spec.name, meta: { backend: backendName } }),\n )\n writeFileSync(join(exportDir, 'leaderboard.md'), table)\n console.log(table)\n }\n return result\n } finally {\n await spec.teardown?.(ctx)\n }\n }\n\n function toBenchmarkAdapter(): LeaderboardBenchmarkAdapter<TArtifact> {\n return {\n name: spec.name,\n async preflight(): Promise<void> {\n // Case-id integrity is the cheap, real check: duplicate or missing ids\n // corrupt every downstream join.\n const seen = new Set<string>()\n for (const c of spec.cases) {\n const id = caseId(c)\n if (seen.has(id)) {\n throw new Error(`defineLeaderboard(${spec.name}): duplicate case id \"${id}\"`)\n }\n seen.add(id)\n }\n },\n async loadTasks(opts): Promise<LeaderboardBenchTask[]> {\n const selected = selectCases(opts?.ids)\n const limited = opts?.limit !== undefined ? selected.slice(0, opts.limit) : selected\n return Promise.all(\n limited.map(async (c) => ({\n id: caseId(c),\n prompt: await spec.prompt(c),\n metadata: { case: c },\n })),\n )\n },\n async judge(task, artifact): Promise<LeaderboardBenchScore> {\n const [c] = selectCases([task.id])\n if (c === undefined)\n throw new Error(`defineLeaderboard(${spec.name}): no case \"${task.id}\"`)\n const s = normalizeScore(spec.score(artifact, c))\n return { resolved: s.composite > 0, score: s.composite, detail: s.notes }\n },\n async goldArtifact(): Promise<string | undefined> {\n return undefined\n },\n }\n }\n\n return { run, toBenchmarkAdapter }\n}\n","/**\n * harvestCorpus — production traces → corpus, the G2 bridge (the playbook's step 6).\n * The flywheel's write side, batched: run the firewalled `observe()` analyst over a\n * stream of completed runs (yesterday's production traces, a benchmark's rollouts, a\n * fleet's day) and accrete the trace-derived facts into the durable corpus.\n *\n * Store-agnostic by design: the caller maps its trace store's rows (a\n * `ProductionTraceSink` ndjson, OTLP spans, RunRecords) to `ObserveInput` — task text,\n * final output, the event trace, terminal outcome. The analyst reads BEHAVIOR only\n * (the firewall is structural: the input carries no judge verdict), and corpus appends\n * are idempotent on (claim + tags), so re-harvesting the same window is safe.\n *\n * The nightly product job is then three lines:\n * const runs = mapSinkRowsToObserveInputs(await readSink(yesterday))\n * const report = await harvestCorpus({ runs, chat, corpus, tags: ['gtm-agent'] })\n * log(report) // runsObserved / findings / learned / failures\n *\n * NOTE on the read side: harvesting is safe and cheap; *injecting* facts back into runs\n * is the measured danger zone — naive unconditional priming tested NEGATIVE (−11.6pp,\n * context pollution; result now in .evolve/current.json + memory). Gate any priming design on its\n * own A/B; the corpus's first consumers are operators and optimizers, not prompts.\n */\n\nimport type { ChatClient } from '@tangle-network/agent-eval'\nimport { type Observation, type ObserveInput, observe } from './observe'\nimport type { Corpus } from './personify/wave-types'\n\nexport interface HarvestCorpusOptions {\n /** The completed runs to analyze — map your store's rows to `ObserveInput`. */\n runs: AsyncIterable<ObserveInput> | Iterable<ObserveInput>\n /** The model-call seam (agent-eval `createChatClient`). */\n chat: ChatClient\n model?: string\n /** The durable corpus the facts accrete into. */\n corpus: Corpus\n /** Tags written onto learned facts (the product/domain key the read side queries by). */\n tags?: ReadonlyArray<string>\n /** Override the analyst instruction (the GEPA-tunable knob). */\n analystInstruction?: string\n /** Runs analyzed in parallel. Default 4. */\n concurrency?: number\n /** Hard cap on runs consumed from the stream (a cost guard for unbounded stores). */\n maxRuns?: number\n signal?: AbortSignal\n}\n\nexport interface HarvestFailure {\n runId: string\n error: string\n}\n\nexport interface HarvestReport {\n runsObserved: number\n /** Total findings the analyst produced (including ones already known). */\n findings: number\n /** NEW facts actually appended (idempotent dedup excludes re-learned ones). */\n learned: number\n /** Per-run analysis failures — reported, never silently dropped. */\n failures: HarvestFailure[]\n}\n\n/** Batch the firewalled `observe()` analyst over completed runs and accrete the trace-derived facts into the durable corpus — the production-traces→corpus write side of the flywheel. */\nexport async function harvestCorpus(opts: HarvestCorpusOptions): Promise<HarvestReport> {\n const concurrency = Math.max(1, opts.concurrency ?? 4)\n const report: HarvestReport = { runsObserved: 0, findings: 0, learned: 0, failures: [] }\n\n // Normalize to an async iterator and pull cooperatively from N workers.\n const iterator = (\n Symbol.asyncIterator in Object(opts.runs)\n ? (opts.runs as AsyncIterable<ObserveInput>)[Symbol.asyncIterator]()\n : (async function* () {\n yield* opts.runs as Iterable<ObserveInput>\n })()\n ) as AsyncIterator<ObserveInput>\n\n let consumed = 0\n let done = false\n const next = async (): Promise<ObserveInput | null> => {\n if (done || (opts.maxRuns !== undefined && consumed >= opts.maxRuns)) return null\n const r = await iterator.next()\n if (r.done) {\n done = true\n return null\n }\n consumed += 1\n return r.value\n }\n\n const workers = Array.from({ length: concurrency }, async () => {\n for (let input = await next(); input !== null; input = await next()) {\n if (opts.signal?.aborted) return\n try {\n const obs: Observation = await observe(input, {\n chat: opts.chat,\n ...(opts.model ? { model: opts.model } : {}),\n corpus: opts.corpus,\n tags: opts.tags ?? [],\n ...(opts.analystInstruction ? { analystInstruction: opts.analystInstruction } : {}),\n ...(opts.signal ? { signal: opts.signal } : {}),\n })\n report.runsObserved += 1\n report.findings += obs.findings.length\n report.learned += obs.learned.length\n } catch (e) {\n report.failures.push({\n runId: input.runId ?? `run-${consumed}`,\n error: e instanceof Error ? e.message.slice(0, 300) : String(e),\n })\n }\n }\n })\n await Promise.all(workers)\n\n // Fail loud when the whole batch failed — that's an infra problem, not a quiet no-op.\n if (report.runsObserved === 0 && report.failures.length > 0) {\n throw new Error(\n `harvestCorpus: every run failed analysis (${report.failures.length}) — first: ${report.failures[0]?.error}`,\n )\n }\n return report\n}\n","/**\n * The ONE in-process pseudo-box: present a plain user callback as a\n * `SandboxClient` so an example or test can drive `runAgentRounds` / `openSandboxRun`\n * with zero credentials and zero network — without re-faking a box at each call\n * site via `as unknown as SandboxInstance`.\n *\n * It is the structural sibling of {@link inlineSandboxClient}: that one adapts an\n * `Executor` (router / bridge / BYO) into a box; this one adapts a single\n * `onPrompt(prompt, round)` callback into a box. Both exist because\n * `SandboxInstance` is a `declare class` with private fields — a plain object\n * literal can NEVER structurally satisfy it, so every offline seam was forced to\n * write `as unknown as SandboxInstance`. The one unavoidable cast now lives HERE,\n * documented and tested, instead of in every example.\n *\n * What the box implements is exactly the subset `runAgentRounds` + `openSandboxRun`\n * actually call on a box:\n * - `id` — stable per box, used for trace correlation.\n * - `streamPrompt(prompt, opts?)` — runs `onPrompt` and streams its events.\n * - `fs.read` / `fs.write` — over the optional real `workdir` (the deliverable\n * artifact + any seeded fixtures live there). Present only when a `workdir`\n * is given.\n * - `exec(command)` — runs the command in `workdir`. Present only when a\n * `workdir` is given.\n * - `delete()` — removes the per-box temp dir (when one was minted) and is a\n * no-op otherwise; `deleteBoxSafe` calls it at teardown.\n *\n * The `SandboxEvent` shape the callback returns — `{ type, data }` — is the\n * runtime metering protocol the kernel reads: emit a flat `llm_call`\n * (`{ tokensIn, tokensOut, costUsd }`) or a terminal `done`\n * (`{ tokenUsage, totalCostUsd }`) / `result` event and the kernel's cost ledger\n * picks it up. No cast is needed on the events (the union is structural); only\n * the box object is cast, once, inside this file.\n */\nimport { mkdtempSync, rmSync } from 'node:fs'\nimport { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport type { CreateSandboxOptions, SandboxEvent, SandboxInstance } from '@tangle-network/sandbox'\nimport type { SandboxClient } from './types'\n\n/** Context handed to each `onPrompt` call. */\nexport interface InProcessPromptCtx {\n /** 0-based round index — increments per `streamPrompt` on the same box.\n * Fresh boxes start at 0. */\n round: number\n /** Absolute path of this box's workspace, when a `workdir` was configured.\n * Write the deliverable / fixtures here; `fs.read`/`fs.write`/`exec` operate\n * over it. `undefined` for pure event-only boxes. */\n workdir?: string\n /** Cooperative cancellation channel for this turn. */\n signal: AbortSignal\n /** The verbatim per-call options the caller passed to the box verb (minus\n * `signal`, surfaced above) — lets an offline test assert an options\n * passthrough (`model`, `sessionId`, …) actually arrived. */\n options?: Record<string, unknown>\n}\n\n/**\n * The user callback: given a prompt and its round, produce the box's event\n * stream for that turn. Return a plain `SandboxEvent[]` (the common case) or an\n * async iterable for streaming. The callback may also write files into\n * `ctx.workdir` (read back via `fs.read` or graded by `exec`).\n */\nexport type InProcessOnPrompt = (\n prompt: string,\n ctx: InProcessPromptCtx,\n) => SandboxEvent[] | AsyncIterable<SandboxEvent> | Promise<SandboxEvent[]>\n\n/** @experimental */\nexport interface InProcessSandboxClientOptions {\n /** The per-turn behavior — see {@link InProcessOnPrompt}. */\n onPrompt: InProcessOnPrompt\n /**\n * Opt in to a REAL filesystem-backed box. When set, each `create()` mints a\n * fresh temp directory (prefixed `<workdir>-`) and the box exposes\n * `fs.read`/`fs.write` and `exec` over it; `delete()` removes the dir. Omit\n * for a pure event-only box (no `fs`/`exec` members), which is all a driver\n * or fanout loop needs.\n */\n workdir?: string\n /**\n * Override the box `id`. A string is used verbatim; a function receives the\n * 0-based create-sequence and returns the id (e.g. machine-keyed placement\n * demos). Default `in-process-<seq>`. The id is the value `describePlacement`\n * tags, so set it when a demo's output reads on a meaningful sandbox id.\n */\n id?: string | ((seq: number) => string)\n}\n\nfunction isAsyncIterable(v: unknown): v is AsyncIterable<SandboxEvent> {\n return typeof v === 'object' && v !== null && Symbol.asyncIterator in v\n}\n\n/**\n * Adapt a single `onPrompt(prompt, ctx)` callback into a `SandboxClient` for\n * `runAgentRounds` / `openSandboxRun`. Returns a PROPERLY-TYPED `SandboxClient`: the\n * lone `SandboxInstance` cast (object literal → `declare class`) lives inside\n * this function, so call sites stay cast-free.\n *\n * @experimental\n */\nexport function inProcessSandboxClient(options: InProcessSandboxClientOptions): SandboxClient {\n const { onPrompt, workdir: workdirPrefix, id: idOption } = options\n let seq = 0\n return {\n async create(_options?: CreateSandboxOptions): Promise<SandboxInstance> {\n const current = seq++\n const id =\n typeof idOption === 'function' ? idOption(current) : (idOption ?? `in-process-${current}`)\n const boxWorkdir =\n workdirPrefix !== undefined ? mkdtempSync(join(tmpdir(), `${workdirPrefix}-`)) : undefined\n let round = 0\n\n const fsMembers =\n boxWorkdir !== undefined\n ? {\n fs: {\n async read(path: string): Promise<string> {\n return readFile(join(boxWorkdir, path), 'utf8')\n },\n async write(path: string, content: string): Promise<void> {\n const abs = join(boxWorkdir, path)\n await mkdir(dirname(abs), { recursive: true })\n await writeFile(abs, content, 'utf8')\n },\n },\n async exec(\n command: string,\n ): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const { exec: execCb } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execAsync = promisify(execCb)\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: boxWorkdir,\n timeout: 30_000,\n })\n return { exitCode: 0, stdout, stderr }\n } catch (err) {\n const e = err as {\n code?: number\n stdout?: string\n stderr?: string\n message?: string\n }\n return {\n exitCode: e.code ?? 1,\n stdout: e.stdout ?? '',\n stderr: e.stderr ?? e.message ?? '',\n }\n }\n },\n }\n : {}\n\n async function* drive(\n behavior: InProcessOnPrompt,\n message: string | unknown[],\n opts?: { signal?: AbortSignal } & Record<string, unknown>,\n ): AsyncGenerator<SandboxEvent> {\n const prompt = typeof message === 'string' ? message : JSON.stringify(message)\n const { signal: optSignal, ...rest } = opts ?? {}\n const signal = optSignal ?? new AbortController().signal\n const ctx: InProcessPromptCtx = {\n round,\n workdir: boxWorkdir,\n signal,\n ...(Object.keys(rest).length > 0 ? { options: rest } : {}),\n }\n round += 1\n const produced = await behavior(prompt, ctx)\n if (isAsyncIterable(produced)) {\n for await (const ev of produced) yield ev\n } else {\n for (const ev of produced) yield ev\n }\n }\n\n const box = {\n id,\n streamPrompt(\n message: string | unknown[],\n opts?: { signal?: AbortSignal } & Record<string, unknown>,\n ): AsyncGenerator<SandboxEvent> {\n return drive(onPrompt, message, opts)\n },\n ...fsMembers,\n async delete(): Promise<void> {\n if (boxWorkdir !== undefined) rmSync(boxWorkdir, { recursive: true, force: true })\n },\n }\n // The ONE unavoidable cast: `SandboxInstance` is a `declare class` with\n // private fields, so an object implementing only the called subset cannot\n // structurally satisfy it. Contained here so call sites never cast.\n return box as unknown as SandboxInstance\n },\n }\n}\n","/**\n *\n * Analyst-on-scope (G1) — the analyze→findings→steer wire over the reactive `Scope`.\n *\n * The analyst runs over the children drained so far and hands its findings to the steer\n * decision behind a provenance firewall (`assertTraceDerivedFindings`) that keeps the external\n * write-only judge out of that decision (selector ≠ judge). The reactive `Scope` has no rounds:\n * a combinator's `act` asks a `ScopeAnalyst` to turn the children it has drained off\n * `scope.next()` SO FAR into `AnalystFinding[]`, and steers from THOSE findings through a single\n * `SteerContext`.\n *\n * The analyst itself is not a new type — it is \"just an `Agent<unknown, AnalystFinding[]>`\" the\n * combinator spawns over a child's trace (harness `null`/`cli`). `createScopeAnalyst` spawns that\n * agent through `Scope.spawn` (so its compute is metered by the conserved pool like any child),\n * drains its settlement, then enforces the firewall on the way out — a judge-derived finding\n * ABORTS, it is never filtered. Fail loud: a down analyst, a non-array result, or a tainted finding\n * throws; there is no silent empty-findings path that would let a combinator steer on nothing.\n *\n * @experimental\n */\n\nimport type { AnalystFinding, AnalystRunInputs } from '@tangle-network/agent-eval'\nimport type { AnalystRegistryLike } from '../../analyst-loop/types'\nimport { AnalystError, PlannerError } from '../../errors'\nimport type { Agent, Budget, DefaultVerdict, NodeId, Scope, Settled } from '../supervise/types'\nimport { stringifySafe } from '../util'\nimport type {\n AssertTraceDerivedFindings,\n Outcome,\n ScopeAnalyst,\n ScopeAnalyzeInput,\n SteerContext,\n} from './wave-types'\n\n// ── The steer firewall (selector ≠ judge) — the single canonical impl ───────\n\n/**\n * The diagnosis a combinator steers from must be TRACE-derived, never JUDGE-derived. A finding\n * whose evidence is a judge/verdict score (an `EvidenceRef` of `kind:'metric'` with a\n * verdict/judge/score uri scheme) would smuggle the external write-only judge back into steering —\n * the one coupling the architecture forbids. This is a PROVENANCE check, not a content check:\n * span/event/artifact/finding refs and empty-evidence findings are allowed; only a judge-scheme\n * metric ref is rejected. Fail loud — a tainted finding aborts.\n */\nconst judgeEvidenceUri = /^(verdict|judge|score)\\b/i\n\n/** Reject analyst findings derived from evaluation scores instead of execution traces. */\nexport const assertTraceDerivedFindings: AssertTraceDerivedFindings = (findings) => {\n for (const f of findings) {\n for (const ref of f.evidence_refs ?? []) {\n if (ref.kind === 'metric' && judgeEvidenceUri.test(ref.uri)) {\n throw new PlannerError(\n `steer-firewall: finding ${stringifySafe(f.finding_id)} cites judge-derived evidence ` +\n `(${stringifySafe(ref.uri)}); findings fed to a combinator's steer decision must be ` +\n 'trace-derived, not judge-derived (selector ≠ judge)',\n )\n }\n }\n }\n}\n\n// ── The reactive analyst — an Agent the combinator spawns over the trace so far ───────\n\n/**\n * The analyst run an `Agent<unknown, AnalystFinding[]>` performs over the children settled so far.\n * The combinator supplies the analyst's task projection (how to frame the drained settlements as\n * the analyst's input) — the analyst's `act` reads the trace and returns its raw findings; the\n * firewall is enforced afterwards by `createScopeAnalyst`, not by the analyst itself.\n */\nexport interface CreateScopeAnalystOptions<D> {\n /** The analyst agent the combinator spawns over the trace. `harness` is the persona's choice\n * (`null` for an inline router analyst, a `BackendType` for a sandboxed one). Its `act` returns\n * the RAW findings; this module asserts the firewall on them before returning. */\n readonly analyst: Agent<unknown, ReadonlyArray<AnalystFinding>>\n /** Build the analyst agent's task from the analyze input (the root-task framing + the children\n * drained so far). Pure projection — the analyst interprets it, this never reads it. */\n buildTask(input: ScopeAnalyzeInput<D>): unknown\n /** The conserved budget reserved for one analyst spawn. The pool reserves against it and fails\n * closed; an analyst that cannot be admitted is a fail-loud abort, never silent empty findings. */\n readonly budget: Budget\n /** Trace/journal label for the spawned analyst child. Default `'analyst'`. */\n readonly label?: string\n}\n\n/**\n * Build a `ScopeAnalyst` that spawns the analyst agent through `Scope.spawn` (so its compute is\n * metered by the conserved pool), drains its single settlement, and enforces the trace-derived\n * firewall before returning. The `scope` is the SAME scope the combinator is draining its children\n * from — the analyst is spawned as a sibling and its result is read off `scope.next()` in cursor\n * order, replay-safe like any other child.\n *\n * Fail loud (no silent empty findings):\n * - the pool refuses the analyst spawn → `AnalystError` (the steer would otherwise run on nothing)\n * - the analyst settles `down` → `AnalystError` (a broken capture path, not a verdict)\n * - the analyst returns a non-array → `PlannerError`\n * - any finding cites judge-derived metric evidence → `PlannerError` via the firewall\n */\nexport function createScopeAnalyst<D>(\n scope: Scope<Outcome<D>>,\n options: CreateScopeAnalystOptions<D>,\n): ScopeAnalyst<D> {\n if (!options.analyst || typeof options.analyst.act !== 'function') {\n throw new AnalystError('createScopeAnalyst: analyst must be an Agent with an act() method')\n }\n const label = options.label ?? 'analyst'\n return {\n async analyze(input: ScopeAnalyzeInput<D>): Promise<ReadonlyArray<AnalystFinding>> {\n const task = options.buildTask(input)\n // The analyst is spawned into the combinator's own scope so its tokens are charged to the\n // conserved pool. The pool fails closed; an analyst it cannot admit is a hard abort, not an\n // excuse to steer on an empty diagnosis. The analyst's `Out` is `AnalystFinding[]`, not the\n // scope's `Outcome<D>` — a genuinely heterogeneous child; the cast through `unknown` mirrors\n // the keystone `spawnChild` seam, and the settlement is narrowed back by `readAnalystFindings`.\n const spawned = scope.spawn(options.analyst as unknown as Agent<unknown, Outcome<D>>, task, {\n budget: options.budget,\n label,\n })\n if (!spawned.ok) {\n throw new AnalystError(\n `createScopeAnalyst: analyst spawn refused by the conserved pool (${spawned.reason}); ` +\n `cannot steer node ${stringifySafe(input.nodeId)} on an unrun analyst`,\n )\n }\n const settled = await drainAnalystSettlement(scope, spawned.handle.id)\n const findings = readAnalystFindings(settled)\n assertTraceDerivedFindings(findings)\n return findings\n },\n }\n}\n\n/**\n * Drain `scope.next()` until the analyst child's own settlement is yielded, matching on its node\n * id so an unrelated sibling that settles first is skipped, not mistaken for the analyst. A\n * `ScopeAnalyst` is invoked AFTER a combinator has drained its workers, so in practice the analyst\n * is the only live child; the id match keeps it correct even when it is not. Fails loud if the\n * scope empties before the analyst settles (the steer would otherwise run on nothing).\n */\nasync function drainAnalystSettlement<D>(\n scope: Scope<Outcome<D>>,\n analystId: NodeId,\n): Promise<Settled<Outcome<D>>> {\n for (;;) {\n const settled = await scope.next()\n if (settled === null) {\n throw new AnalystError(\n `createScopeAnalyst: scope drained before analyst ${stringifySafe(analystId)} settled`,\n )\n }\n if (settled.handle.id === analystId) return settled\n }\n}\n\n/**\n * Read the analyst child's settlement into its `AnalystFinding[]`. A `down` analyst is a broken\n * capture path (fail loud — not \"no findings\"); a `done` analyst whose `out` is not an array is a\n * malformed analyst (fail loud — the dynamic driver's `runAnalyze` contract, carried across).\n */\nfunction readAnalystFindings<D>(settled: Settled<Outcome<D>>): ReadonlyArray<AnalystFinding> {\n if (settled.kind === 'down') {\n throw new AnalystError(\n `createScopeAnalyst: analyst ${stringifySafe(settled.handle.id)} settled down ` +\n `(${settled.infra ? 'infra' : 'result'}): ${stringifySafe(settled.reason)}`,\n )\n }\n const out = settled.out as unknown\n if (!Array.isArray(out)) {\n throw new PlannerError(\n `createScopeAnalyst: analyst ${stringifySafe(settled.handle.id)} must return ` +\n `AnalystFinding[], got ${stringifySafe(out)}`,\n )\n }\n return out as ReadonlyArray<AnalystFinding>\n}\n\n// ── The panel-of-analysts adapter — N analyst KINDS merged into one ScopeAnalyst ───────\n\n/**\n * Project a `ScopeAnalyzeInput` into the `AnalystRegistry.run` arguments. The registry runs over a\n * `runId` + `AnalystRunInputs` (a trace store / run record / artifact dir), NOT in-memory scope\n * settlements — so the CALLER owns the projection from the combinator's drained children to the\n * registry's inputs (e.g. the trace store the run already wrote). This adapter never invents that\n * bridge; it only runs the projected inputs and firewalls the merged findings.\n */\nexport interface RegistryAnalyzeProjection {\n readonly runId: string\n readonly inputs: AnalystRunInputs\n /** Optional `run` opts (e.g. `priorFindings`) forwarded verbatim to the registry. */\n readonly opts?: Parameters<AnalystRegistryLike['run']>[2]\n}\n\n/**\n * A `ScopeAnalyst` backed by an `AnalystRegistry` — the panel-of-analysts seam. The registry merges\n * N analyst KINDS into one `AnalystRunResult.findings`; `analyze` runs it over the caller-projected\n * `{ runId, inputs }` and pipes the merged findings through the SAME `assertTraceDerivedFindings`\n * firewall `createScopeAnalyst` uses (single-sourced selector≠judge). Distinct from `panel()`\n * (judges-vs-one-artifact) — this is analysts-over-a-trace, the diagnosis side of the wire.\n *\n * Fail loud: a registry that throws propagates; a judge-derived finding aborts via the firewall.\n * The projection is the caller's (`buildInputs`) — if the scope settlements do not cleanly map to\n * the registry's `AnalystRunInputs`, that is a caller-side contract gap, surfaced there, not papered\n * over with a fabricated input here.\n */\nexport function registryScopeAnalyst<D>(\n registry: AnalystRegistryLike,\n buildInputs: (input: ScopeAnalyzeInput<D>) => RegistryAnalyzeProjection,\n): ScopeAnalyst<D> {\n return {\n async analyze(input: ScopeAnalyzeInput<D>): Promise<ReadonlyArray<AnalystFinding>> {\n const projection = buildInputs(input)\n const result = await registry.run(projection.runId, projection.inputs, projection.opts)\n const findings = result.findings\n assertTraceDerivedFindings(findings)\n return findings\n },\n }\n}\n\n// ── The single firewalled steer surface every combinator funnels through ──────────────\n\n/**\n * Build the `SteerContext` a combinator reads to steer (its `loopUntil.until`, `widen` gate, any\n * future steer). One place enforces the firewall: `findings` is asserted trace-derived before it is\n * surfaced, and `lastValidScore` is provided for OBSERVABILITY only — a combinator that steers off\n * it re-introduces selector = judge, the coupling the architecture forbids.\n *\n * `findings` is re-asserted here even when it came from `createScopeAnalyst` (which already asserted\n * it): the assertion is cheap and idempotent, and a `SteerContext` may be built from findings that\n * arrived by another path (a caller-supplied diagnosis). Belt-and-suspenders on the one coupling\n * that must never leak.\n */\nexport function buildSteerContext<D>(\n findings: ReadonlyArray<AnalystFinding>,\n settledSoFar: ReadonlyArray<Settled<Outcome<D>>>,\n): SteerContext<D> {\n assertTraceDerivedFindings(findings)\n const lastValidScore = observedBestScore(settledSoFar)\n return {\n findings,\n settledSoFar,\n ...(lastValidScore !== undefined ? { lastValidScore } : {}),\n }\n}\n\n/**\n * The best valid score among the drained children — OBSERVABILITY ONLY. Read for rendering/traces,\n * never to make a steer decision (that is the selector = judge coupling). Reads `verdict.score` off\n * `done` settlements whose verdict is `valid`; a `down` child carries no verdict and contributes\n * nothing.\n */\nfunction observedBestScore<D>(\n settledSoFar: ReadonlyArray<Settled<Outcome<D>>>,\n): number | undefined {\n let best: number | undefined\n for (const s of settledSoFar) {\n if (s.kind !== 'done') continue\n const v: DefaultVerdict | undefined = s.verdict\n if (v?.valid !== true || typeof v.score !== 'number') continue\n if (best === undefined || v.score > best) best = v.score\n }\n return best\n}\n","/**\n *\n * The generic combinator library — the content-free act-bodies the wave's §1 contract froze.\n *\n * Each export is a `CombinatorShape<Task, D>` (an alias of `LoopShape<Task, D>`): a factory\n * `(ShapeContext) => Agent<Task, Outcome<D>>` whose `act` runs ONE composition shape over the\n * keystone `Scope` — spawn children through `ctx.spawnChild` + `scope.spawn`, drain settlements\n * via `scope.next()`, select across `done` children with the SINGLE-SOURCED `settledToIteration`\n * + `defaultSelectWinner` (selector≠judge — never a re-rank behind the driver), and synthesize a\n * terminal `Outcome<D>`.\n *\n * The shapes carry NO domain: a \"research sweep over angles\" is `fanout(angles, { synthesize })`\n * under a research persona; a \"code build test\" is `pipeline([plan, implement, integrate])` under\n * a coder persona. The SHAPE is here; the model/prompt/role/goal live on the `Persona` + task,\n * threaded to each child verbatim by the spec-objects the builders take. No model name, prompt,\n * role, or domain noun appears below.\n *\n * Two fail-loud invariants every combinator honors: a child the conserved pool cannot admit is a\n * CONCRETE blocker (never an eager over-fan, never a silent drop), and a `blocked` outcome always\n * names at least one blocker (a shape that cannot finish MUST say why — `blocked([])` throws).\n *\n * @experimental\n */\n\nimport { ValidationError } from '../../errors'\nimport { defaultSelectWinner } from '../run-loop'\nimport { type DispatchUnit, rollingDispatch } from '../supervise/dispatch'\nimport { settledToIteration } from '../supervise/scope'\nimport type { Agent, Scope, Settled } from '../supervise/types'\nimport type { Iteration } from '../types'\nimport type { Outcome, ShapeContext } from './types'\nimport type {\n CombinatorShape,\n FanoutOptions,\n FanoutWinnerSelector,\n LoopUntilSpec,\n LoopUntilState,\n PanelJudge,\n PanelSpec,\n PanelVerdict,\n PipelineStage,\n ScopeWidenGate,\n VerifySpec,\n WidenDecision,\n WidenSpec,\n WinnerStrategy,\n} from './wave-types'\n\n// ── selectValidWinner — the one shared valid-only fanout selector ─────────────────\n\n/**\n * The single content-free valid-only winner selector. Among the gated-VALID children only\n * (`verdict.valid === true`), pick by `strategy` — best score / smallest delivered artifact /\n * earliest — ties broken by earliest index; returns `undefined` when NONE is valid (an ungated\n * output can never win — the deliverable gate is the point). `sizeOf` (for `'smallest-artifact'`)\n * reads the child's settled deliverable — the raw value a leaf settles, or the unwrapped `Outcome<D>`\n * a delegate path produces; a domain passes e.g. patch diff-lines. This is the de-duplicated home of\n * the selection logic previously copied per role.\n */\nexport function selectValidWinner<D>(opts?: {\n strategy?: WinnerStrategy\n sizeOf?: (deliverable: D) => number\n}): FanoutWinnerSelector<D> {\n const strategy = opts?.strategy ?? 'highest-score'\n const sizeOfIter = (iter: Iteration<unknown, Outcome<D>>): number => {\n const out = iter.output\n if (out === undefined || opts?.sizeOf === undefined) return Number.POSITIVE_INFINITY\n // The worktree-CLI leaf settles the RAW deliverable as iter.output (settledToIteration sets\n // `output = settled.out`); the MCP delegate path wraps it in an Outcome<D>. Accept both: unwrap\n // a `done` Outcome, else the settled value IS the deliverable. A raw artifact carries no `kind`\n // discriminant, so the branch is unambiguous.\n const deliverable = out.kind === 'done' ? out.deliverable : (out as unknown as D)\n return opts.sizeOf(deliverable)\n }\n return (iterations) => {\n const valid = iterations.filter(\n (iter) => iter.output !== undefined && !iter.error && iter.verdict?.valid === true,\n )\n if (valid.length === 0) return undefined\n switch (strategy) {\n case 'first-valid':\n return [...valid].sort((a, b) => a.index - b.index)[0]\n case 'smallest-artifact':\n return [...valid].sort((a, b) => sizeOfIter(a) - sizeOfIter(b) || a.index - b.index)[0]\n default:\n return [...valid].sort(\n (a, b) => (b.verdict?.score ?? 0) - (a.verdict?.score ?? 0) || a.index - b.index,\n )[0]\n }\n }\n}\n\n// ── pipeline — sequential composition, first blocked stage short-circuits ─────────\n\n/**\n * `pipeline(stages)` — run the stages in order, feeding each stage's `done` deliverable into the\n * next stage's task. The first stage that ends `blocked` (a child that went down, a child the\n * pool would not admit, or a stage whose `collect` chose to block) short-circuits — its blockers\n * ARE the pipeline's blockers, never coerced past a failed stage. The terminal stage's `done`\n * deliverable is the pipeline's deliverable.\n */\nexport function pipeline<Task, D>(\n stages: ReadonlyArray<PipelineStage<Task, unknown, unknown>>,\n): CombinatorShape<Task, D> {\n if (stages.length === 0) {\n throw new ValidationError('pipeline: at least one stage is required')\n }\n return (ctx: ShapeContext<D>): Agent<Task, Outcome<D>> => ({\n name: `${ctx.persona.name}/pipeline`,\n async act(task, scope): Promise<Outcome<D>> {\n let carry: unknown = task\n for (const stage of stages) {\n const child = ctx.spawnChild(stage.label, ctx.persona.root)\n const res = scope.spawn(child, stage.feed(carry, ctx, task), {\n budget: ctx.budget.perChild,\n label: stage.label,\n })\n if (!res.ok) {\n return blocked([`${stage.label}: not admitted (${res.reason})`])\n }\n const settled = await drainOne(scope, stage.label)\n const out = stage.collect(settled as Settled<Outcome<unknown>>)\n if (out.kind === 'blocked') return out\n carry = out.deliverable\n }\n return { kind: 'done', deliverable: carry as D }\n },\n })\n}\n\n// ── fanout — N children in one round, optional single synthesis child ─────────────\n\n/**\n * `fanout(items, opts)` — spawn one child per item in a single round (bounded by the conserved\n * pool's fail-closed admission), drain via `scope.next()`, then either synthesize over the\n * gathered settlements (one SEPARATE synthesis child) or return the best-valid child via the\n * single-sourced selector. A round that admitted zero children, or whose synthesis child could\n * not be admitted, is a concrete blocker.\n *\n * `opts.width` swaps the single round for `rollingDispatch`: at most `width` items live at once,\n * refilled the instant one settles. Selection, blockers, and the conserved pool are unchanged —\n * the refill behavior lives in the existing combinator rather than in a rival primitive.\n */\nexport function fanout<Task, Item, D>(\n items: ReadonlyArray<Item>,\n opts: FanoutOptions<Item, D>,\n): CombinatorShape<Task, D> {\n if (opts.synthesize && opts.selectWinner) {\n throw new ValidationError('fanout: pass at most one of `synthesize` or `selectWinner`')\n }\n return (ctx: ShapeContext<D>): Agent<Task, Outcome<D>> => ({\n name: `${ctx.persona.name}/fanout`,\n async act(_task, scope): Promise<Outcome<D>> {\n const rejected: string[] = []\n // One unit per item — the same child, task, label, and per-child budget either dispatch\n // path uses, so batch and rolling differ ONLY in when each unit is admitted.\n const unitAt = (i: number): DispatchUnit<Outcome<D>> | undefined => {\n const item = items[i]\n if (item === undefined) return undefined\n const label = opts.label ? opts.label(item, i) : `item:${i}`\n const spec = opts.itemSpec ? opts.itemSpec(item, i, ctx) : ctx.persona.root\n return {\n agent: ctx.spawnChild(label, spec),\n task: opts.itemTask(item, i, ctx),\n opts: { budget: ctx.budget.perChild, label },\n }\n }\n\n let opened = 0\n let drained: DrainedRound<D>\n if (opts.width !== undefined) {\n // Rolling: hold `width` items in flight, refill on each settle. `rollingDispatch` owns the\n // admission ledger, so its settlements are projected into the same drained shape the batch\n // path produces and everything downstream (selection, synthesis, blockers) is untouched.\n let next = 0\n const report = await rollingDispatch<Outcome<D>>(scope, {\n width: opts.width,\n nextUnit: () => {\n const unit = unitAt(next)\n next += 1\n return unit\n },\n })\n opened = report.admitted\n for (const r of report.rejected) {\n const [label, reason] = splitOnce(r, ': ')\n rejected.push(`${label}: not admitted (${reason})`)\n }\n drained = projectDrain<D>(report.settled)\n } else {\n for (let i = 0; i < items.length; i += 1) {\n const unit = unitAt(i)\n if (unit === undefined) continue\n const res = scope.spawn(unit.agent, unit.task, unit.opts)\n if (res.ok) opened += 1\n else rejected.push(`${unit.opts.label}: not admitted (${res.reason})`)\n }\n drained = opened === 0 ? emptyRound<D>() : await drain<D>(scope)\n }\n if (opened === 0) {\n return blocked(\n rejected.length > 0\n ? rejected\n : ['fanout: budget admitted no item (fanout fully rejected)'],\n )\n }\n\n if (drained.done.length === 0) {\n return blocked(\n orderedBlockers(\n drained.blockers,\n rejected,\n 'fanout: every item settled without a usable result',\n ),\n )\n }\n\n if (!opts.synthesize) {\n const select = opts.selectWinner ?? defaultSelectWinner\n const winner = select(drained.iterations)\n if (!winner || winner.output === undefined) {\n return blocked(\n orderedBlockers(drained.blockers, rejected, 'fanout: no item survived selection'),\n )\n }\n return { kind: 'done', deliverable: winner.output as D }\n }\n\n const synthLabel = 'synthesize'\n const synthChild = ctx.spawnChild(synthLabel, ctx.persona.root)\n const synthRes = scope.spawn(synthChild, opts.synthesize.synthesisTask(drained.done, ctx), {\n budget: ctx.budget.perChild,\n label: synthLabel,\n })\n if (!synthRes.ok) {\n return blocked([...drained.blockers, `${synthLabel}: not admitted (${synthRes.reason})`])\n }\n const synthSettled = await drainOne(scope, synthLabel)\n const out = opts.synthesize.collect(synthSettled)\n if (out.kind === 'blocked') return out\n return out\n },\n })\n}\n\n// ── loopUntil — budget-bounded iterative deepening, deployable non-oracle stop ────\n\n/**\n * `loopUntil(seed, spec)` — one `step` child per round; `fold` accumulates each settlement into\n * the running state; `until` (reading the round's trace findings, NOT a fresh raw verdict) is\n * the deployable stop. The conserved pool IS the loop bound: once `spawn` fails closed the loop\n * stops. A loop that exhausted the pool without `until` ever satisfying is a concrete blocker.\n *\n * When `ctx.analyst` is set, each round runs it over the children settled so far and steers\n * `until` on the resulting trace-derived findings (the analyst spawns into THIS scope, so its\n * compute is conserved-pooled — equal-k holds by construction). Absent an analyst the findings\n * argument is the empty array — never a fabricated finding (fail-loud honesty over a silent default).\n */\nexport function loopUntil<Task, State, D>(\n seed: State,\n spec: LoopUntilSpec<Task, State, D>,\n): CombinatorShape<Task, D> {\n return (ctx: ShapeContext<D>): Agent<Task, Outcome<D>> => ({\n name: `${ctx.persona.name}/loopUntil`,\n async act(task, scope): Promise<Outcome<D>> {\n let state: LoopUntilState<State> = { round: 0, value: seed }\n const blockers: string[] = []\n const settledSoFar: Settled<Outcome<D>>[] = []\n for (;;) {\n const label = spec.label ? spec.label(state.round) : `step:${state.round}`\n const child = ctx.spawnChild(label, ctx.persona.root)\n const res = scope.spawn(child, spec.step(task, state, ctx), {\n budget: ctx.budget.perChild,\n label,\n })\n if (!res.ok) {\n if (state.round === 0) return blocked([`${label}: not admitted (${res.reason})`])\n break\n }\n const settled = await drainOne(scope, label)\n if (settled.kind === 'down') blockers.push(blockerFromDown(settled))\n settledSoFar.push(settled)\n state = spec.fold(state, settled)\n // Wired analyst ⇒ steer `until` on trace-derived findings; absent ⇒ the dormant empty\n // default (the analyst spawns into THIS scope, so its compute is conserved-pooled).\n const findings = ctx.analyst\n ? await ctx.analyst.analyze({ task, settledSoFar, nodeId: scope.view.root })\n : []\n const reached = spec.until(state, findings)\n if (reached) return reached\n state = { round: state.round + 1, value: state.value }\n }\n return blocked(\n blockers.length > 0\n ? blockers\n : ['loopUntil: budget exhausted before the satisfiability gate was reached'],\n )\n },\n })\n}\n\n// ── panel — M judges over ONE artifact, write-only merge (selector≠judge limit) ───\n\n/**\n * `panel(spec)` — spawn the M judge children over the SAME artifact, drain their settlements,\n * and fold them into a panel verdict via the pure WRITE-ONLY `merge` (a judge's output never\n * reaches another judge's task; the merge never spawns or re-ranks). A `down` judge carries no\n * verdict and is excluded from the merge denominator. A panel that admitted no judge is a\n * concrete blocker before `merge` is consulted.\n */\nexport function panel<Task, Artifact, D>(spec: PanelSpec<Artifact, D>): CombinatorShape<Task, D> {\n if (spec.judges.length === 0) {\n throw new ValidationError('panel: at least one judge is required')\n }\n return (ctx: ShapeContext<D>): Agent<Task, Outcome<D>> => ({\n name: `${ctx.persona.name}/panel`,\n async act(task, scope): Promise<Outcome<D>> {\n const artifact = task as unknown as Artifact\n const byLabel = new Map<string, PanelJudge>()\n const rejected: string[] = []\n let opened = 0\n for (const judge of spec.judges) {\n const child = ctx.spawnChild(judge.label, ctx.persona.root)\n const res = scope.spawn(child, spec.judgeTask(artifact, judge, ctx), {\n budget: ctx.budget.perChild,\n label: judge.label,\n })\n if (res.ok) {\n byLabel.set(judge.label, judge)\n opened += 1\n } else {\n rejected.push(`${judge.label}: not admitted (${res.reason})`)\n }\n }\n if (opened === 0) {\n return blocked(rejected.length > 0 ? rejected : ['panel: budget admitted no judge'])\n }\n\n const verdicts: PanelVerdict[] = []\n for (let s = await scope.next(); s !== null; s = await scope.next()) {\n const judge = byLabel.get(s.handle.label)\n if (!judge) {\n throw new ValidationError(\n `panel: settled child \"${s.handle.label}\" has no judge descriptor`,\n )\n }\n if (s.kind === 'down') {\n verdicts.push({ judge, down: true })\n continue\n }\n verdicts.push({\n judge,\n down: false,\n ...(s.verdict ? { verdict: s.verdict } : {}),\n output: s.out,\n })\n }\n return spec.merge(verdicts, artifact)\n },\n })\n}\n\n// ── verify — 2-node implement→verifier gate (selector≠judge) ──────────────────────\n\n/**\n * `verify(spec)` — an IMPLEMENT child produces a candidate, then a SEPARATE VERIFIER child grades\n * it; only a `valid` verifier verdict ships. Any other outcome (implement down, verifier down,\n * verifier verdict absent or not `valid`) is a concrete blocker carrying the failure verbatim —\n * never a coerced \"done\". The implement child does not grade itself.\n */\nexport function verify<Task, Candidate, D>(\n spec: VerifySpec<Task, Candidate, D>,\n): CombinatorShape<Task, D> {\n return (ctx: ShapeContext<D>): Agent<Task, Outcome<D>> => ({\n name: `${ctx.persona.name}/verify`,\n async act(task, scope): Promise<Outcome<D>> {\n const implementLabel = spec.implementLabel ?? 'implement'\n const implChild = ctx.spawnChild(implementLabel, ctx.persona.root)\n const implRes = scope.spawn(implChild, spec.implement(task, ctx), {\n budget: ctx.budget.perChild,\n label: implementLabel,\n })\n if (!implRes.ok) return blocked([`${implementLabel}: not admitted (${implRes.reason})`])\n const candidate = await drainOne(scope, implementLabel)\n if (candidate.kind === 'down') return blocked([blockerFromDown(candidate)])\n\n const verifierLabel = spec.verifierLabel ?? 'verify'\n const verifierChild = ctx.spawnChild(verifierLabel, ctx.persona.root)\n const verifierRes = scope.spawn(\n verifierChild,\n spec.verifier(candidate as Settled<Outcome<Candidate>>, ctx),\n { budget: ctx.budget.perChild, label: verifierLabel },\n )\n if (!verifierRes.ok)\n return blocked([`${verifierLabel}: not admitted (${verifierRes.reason})`])\n const gate = await drainOne(scope, verifierLabel)\n if (gate.kind === 'down') return blocked([blockerFromDown(gate)])\n if (gate.verdict?.valid !== true) {\n return blocked([`${verifierLabel}: gate rejected the candidate (${verdictDetail(gate)})`])\n }\n return spec.collect(candidate as Settled<Outcome<Candidate>>, gate.verdict)\n },\n })\n}\n\n// ── widen — streaming progressive widening (G5), FLAT by default ──────────────────\n\n/**\n * `widen(spec)` — the streaming spawn-on-completion driver. Spawns the seed lineages, then REACTS\n * to each `scope.next()`: on every settled child it consults `spec.gate.decide` and, when the gate\n * returns `widen`, spawns AT MOST ONE more child toward the chosen lineage under the remaining\n * conserved pool. `promising` is derived from the round's trace findings (the analyst seam),\n * never a child's raw `verdict` — and the default gate (`flatWidenGate`) never widens, so the R2\n * firewall stays dormant. Terminal selection is `spec.synthesize` over every settled lineage.\n *\n * When `ctx.analyst` is set, `decide` is consulted with that round's trace-derived findings;\n * absent an analyst the findings argument is the empty array a flat gate ignores. The analyst\n * spawns into THIS scope (conserved-pooled, so equal-k holds). Streaming caveat: a wired analyst\n * drains its own child off the SHARED cursor by id-match, so on a NON-flat gate (which spawns\n * widen children that are live concurrently) the analyst can consume a sibling's settlement before\n * the widen loop sees it. The shipped default (`flatWidenGate`) never widens, so no widen child is\n * ever live when the analyst runs and the wire is exact; a non-flat gate must drive the analyst on\n * a scope whose siblings are quiesced, or read findings without the shared-cursor drain.\n */\nexport function widen<Task, Seed, D>(spec: WidenSpec<Seed, D>): CombinatorShape<Task, D> {\n return (ctx: ShapeContext<D>): Agent<Task, Outcome<D>> => ({\n name: `${ctx.persona.name}/widen`,\n async act(_task, scope): Promise<Outcome<D>> {\n let opened = 0\n for (const [i, seed] of spec.seeds.entries()) {\n const label = `seed:${i}`\n const child = ctx.spawnChild(label, ctx.persona.root)\n const res = scope.spawn(child, spec.seedTask(seed, i, ctx), {\n budget: ctx.budget.perChild,\n label,\n })\n if (res.ok) opened += 1\n }\n if (opened === 0) {\n return blocked(['widen: budget admitted no seed lineage'])\n }\n\n const gathered: Settled<Outcome<D>>[] = []\n let widenIndex = 0\n for (let s = await scope.next(); s !== null; s = await scope.next()) {\n gathered.push(s)\n // Wired analyst ⇒ steer the gate on trace-derived findings; absent ⇒ the dormant empty\n // default the flat gate ignores. The analyst spawns into THIS scope (conserved-pooled).\n const findings = ctx.analyst\n ? await ctx.analyst.analyze({\n task: _task,\n settledSoFar: gathered,\n nodeId: scope.view.root,\n })\n : []\n const decision: WidenDecision<D> = spec.gate.decide(s, findings, scope.budget)\n if (decision.kind !== 'widen') continue\n const label = `widen:${widenIndex}`\n widenIndex += 1\n const child = ctx.spawnChild(label, ctx.persona.root)\n // Fail-closed admission bounds the widening — a rejected widen is simply not opened\n // (the gate may widen again off a later settlement); the budget is the breadth bound.\n scope.spawn(child, spec.widenTask(decision.toward, ctx), {\n budget: ctx.budget.perChild,\n label,\n })\n }\n\n const done = gathered.filter(isDone)\n if (done.length === 0) {\n return blocked(\n orderedBlockers(\n gathered.filter(isDown).map(blockerFromDown),\n [],\n 'widen: every lineage settled without a usable result',\n ),\n )\n }\n return spec.synthesize(done, ctx)\n },\n })\n}\n\n/**\n * The flat default `ScopeWidenGate` — never widens, keeping the R2 selector≠judge collision\n * dormant. A gate run passes this explicitly; a test asserts the default is flat.\n */\nexport function flatWidenGate<D>(): ScopeWidenGate<D> {\n return {\n decide(): WidenDecision<D> {\n return { kind: 'stop' }\n },\n }\n}\n\n// ── Shared drain / select / blocker microstructure ────────────────────────────────\n\n/** Drain every remaining settlement: project `done` children into kernel `Iteration`s for the\n * single-sourced selector + keep the `done` settlements (for a synthesis child), and collect\n * `down` children as concrete blockers (their reason surfaced verbatim). */\n/** The gathered result of one fanout round: the selector's candidates, the `done` settlements the\n * synthesis task reads, and the concrete blockers from every `down` child. */\ninterface DrainedRound<D> {\n iterations: Iteration<unknown, Outcome<D>>[]\n done: Settled<Outcome<D>>[]\n blockers: string[]\n}\n\nfunction emptyRound<D>(): DrainedRound<D> {\n return { iterations: [], done: [], blockers: [] }\n}\n\n/** Fold an already-collected settlement list into the same shape `drain` produces, so the rolling\n * dispatch path and the batch path hand identical evidence to selection/synthesis. */\nfunction projectDrain<D>(settled: ReadonlyArray<Settled<Outcome<D>>>): DrainedRound<D> {\n const round = emptyRound<D>()\n for (const s of settled) {\n if (s.kind === 'down') {\n round.blockers.push(blockerFromDown(s))\n continue\n }\n round.iterations.push(settledToIteration(s))\n round.done.push(s)\n }\n return round\n}\n\n/** Split on the FIRST occurrence of `sep`, keeping any later occurrences in the tail — a reason\n * string may itself contain the separator. */\nfunction splitOnce(text: string, sep: string): [string, string] {\n const at = text.indexOf(sep)\n if (at < 0) return [text, '']\n return [text.slice(0, at), text.slice(at + sep.length)]\n}\n\nasync function drain<D>(scope: Scope<Outcome<D>>): Promise<DrainedRound<D>> {\n const iterations: Iteration<unknown, Outcome<D>>[] = []\n const done: Settled<Outcome<D>>[] = []\n const blockers: string[] = []\n for (let s = await scope.next(); s !== null; s = await scope.next()) {\n if (s.kind === 'down') {\n blockers.push(blockerFromDown(s))\n continue\n }\n iterations.push(settledToIteration(s))\n done.push(s)\n }\n return { iterations, done, blockers }\n}\n\n/**\n * Drain exactly one settlement off a scope whose prior children are fully drained, so `next()`\n * yields precisely the child just spawned. Fail loud if it yields nothing — a spawned child that\n * never settles is a keystone invariant violation, not a result the combinator may swallow.\n */\nasync function drainOne<D>(scope: Scope<Outcome<D>>, label: string): Promise<Settled<Outcome<D>>> {\n const s = await scope.next()\n if (s === null) {\n throw new ValidationError(`combinator: child \"${label}\" was spawned but never settled`)\n }\n return s\n}\n\nfunction isDone<D>(s: Settled<Outcome<D>>): s is Extract<Settled<Outcome<D>>, { kind: 'done' }> {\n return s.kind === 'done'\n}\n\nfunction isDown<D>(s: Settled<Outcome<D>>): s is Extract<Settled<Outcome<D>>, { kind: 'down' }> {\n return s.kind === 'down'\n}\n\nfunction blockerFromDown<D>(s: Extract<Settled<Outcome<D>>, { kind: 'down' }>): string {\n return `${s.handle.label}: ${s.infra ? 'infra' : 'failed'} — ${s.reason}`\n}\n\nfunction verdictDetail<D>(s: Extract<Settled<Outcome<D>>, { kind: 'done' }>): string {\n if (!s.verdict) return 'no verdict'\n return s.verdict.notes ?? `score ${s.verdict.score}`\n}\n\n/** Compose the round's drained blockers + rejected-admission reasons, falling back to a named\n * default ONLY when neither produced a reason — a `blocked` outcome must never be vacuous. */\nfunction orderedBlockers(drained: string[], rejected: string[], fallback: string): string[] {\n const all = [...drained, ...rejected]\n return all.length > 0 ? all : [fallback]\n}\n\n/** Build a `blocked` outcome, failing loud on the empty-blocker contract violation (a shape that\n * cannot finish MUST name at least one concrete blocker — never a vacuous block). */\nfunction blocked<D>(blockers: string[]): Extract<Outcome<D>, { kind: 'blocked' }> {\n if (blockers.length === 0) {\n throw new ValidationError('combinator: a blocked outcome must name at least one blocker')\n }\n return { kind: 'blocked', blockers }\n}\n","/**\n *\n * The cross-run corpus (G2) — the learning-flywheel's durable accreted-fact store.\n *\n * `Corpus` is DISTINCT from the per-run `SpawnJournal` (decisions/replay) and `ResultBlobStore`\n * (payloads): a `CorpusRecord` is a FACT one run LEARNED that a FUTURE run reads back (the\n * world-model), not a replay input. This module owns the two impls the wave surface pins —\n * `InMemoryCorpus` and `FileCorpus` (JSONL, append-only) — plus `renderCorpusToInstructions`,\n * the READ side that projects accreted facts into a fresh `AgentProfile`'s instruction seams.\n *\n * The boundary is fail-loud, typed-outcome: `append` is idempotent on an identical record and\n * returns a typed error (never throws, never a silent overwrite) on a conflicting re-append under\n * the same `id`. Malformed records — a structurally-invalid `CorpusRecord` from disk or a caller —\n * fail loud (the validator throws), since a corpus that silently accepts garbage would poison\n * every downstream run that reads it back.\n *\n * @experimental\n */\n\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport type {\n Corpus,\n CorpusFilter,\n CorpusRecord,\n RenderCorpusToInstructionsOptions,\n} from './wave-types'\n\n// ── Record validation ────────────────────────────────────────────────────────\n\nconst corpusSchemaVersion = '1.0.0'\n\n/**\n * Assert a value is a well-formed `CorpusRecord`. A PROVENANCE-and-shape check: every\n * identity/render-gating field must be present and typed, `confidence` must be a finite 0..1,\n * `evidence` (when present) must be `{ kind, uri }[]`. Throws on any violation — a corpus that\n * silently accepted a malformed fact would project garbage into a future run's prompt. The\n * thrown message names the offending field so a bad on-disk line is diagnosable.\n */\nexport function assertCorpusRecord(value: unknown, where: string): asserts value is CorpusRecord {\n if (typeof value !== 'object' || value === null) {\n throw new Error(`${where}: corpus record is not an object`)\n }\n const r = value as Record<string, unknown>\n if (r.schemaVersion !== corpusSchemaVersion) {\n throw new Error(\n `${where}: corpus record schemaVersion '${String(r.schemaVersion)}' != '${corpusSchemaVersion}'`,\n )\n }\n requireNonEmptyString(r.id, `${where}.id`)\n requireNonEmptyString(r.runId, `${where}.runId`)\n requireNonEmptyString(r.producedAt, `${where}.producedAt`)\n requireNonEmptyString(r.area, `${where}.area`)\n requireNonEmptyString(r.claim, `${where}.claim`)\n if (r.rationale !== undefined && typeof r.rationale !== 'string') {\n throw new Error(`${where}.rationale: expected string, got ${typeof r.rationale}`)\n }\n if (!Array.isArray(r.tags) || r.tags.some((t) => typeof t !== 'string')) {\n throw new Error(`${where}.tags: expected string[]`)\n }\n if (typeof r.confidence !== 'number' || !Number.isFinite(r.confidence)) {\n throw new Error(`${where}.confidence: expected a finite number, got ${String(r.confidence)}`)\n }\n if (r.confidence < 0 || r.confidence > 1) {\n throw new Error(`${where}.confidence: ${r.confidence} is outside the [0, 1] range`)\n }\n if (r.evidence !== undefined) {\n if (!Array.isArray(r.evidence)) {\n throw new Error(`${where}.evidence: expected an array`)\n }\n for (let i = 0; i < r.evidence.length; i++) {\n const ev = r.evidence[i] as Record<string, unknown> | null\n if (typeof ev !== 'object' || ev === null) {\n throw new Error(`${where}.evidence[${i}]: not an object`)\n }\n requireNonEmptyString(ev.kind, `${where}.evidence[${i}].kind`)\n requireNonEmptyString(ev.uri, `${where}.evidence[${i}].uri`)\n }\n }\n}\n\nfunction requireNonEmptyString(value: unknown, where: string): void {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${where}: expected a non-empty string, got ${describe(value)}`)\n }\n}\n\nfunction describe(value: unknown): string {\n if (value === undefined) return 'undefined'\n if (value === null) return 'null'\n if (typeof value === 'string') return `'${value}'`\n return typeof value\n}\n\n// ── Identity + idempotence ───────────────────────────────────────────────────\n\n/**\n * Two records collide IFF they share an `id`. An append under an already-stored `id` is idempotent\n * only when the new record is byte-identical to the stored one (same fact, re-learned); any other\n * field differing under the same `id` is a CONFLICT — a typed-error append, never a silent\n * overwrite. The identity field is `id`; the producer mints it over its identity-defining fields\n * (claim + tags) so a re-learned fact dedups.\n */\nfunction recordsEqual(a: CorpusRecord, b: CorpusRecord): boolean {\n return stableStringify(a) === stableStringify(b)\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null'\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([x], [y]) => (x < y ? -1 : x > y ? 1 : 0))\n return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(',')}}`\n}\n\n// ── Query ─────────────────────────────────────────────────────────────────────\n\n/**\n * Apply a `CorpusFilter` as an AND-narrowing over a record list and sort most-confident first\n * (ties → most-recent `producedAt`, so the freshest of two equally-confident facts wins). Pure —\n * the in-mem and file impls both route their reads through this so query semantics are\n * single-sourced. An empty result is valid (not an error).\n */\nfunction applyFilter(\n records: ReadonlyArray<CorpusRecord>,\n filter: CorpusFilter,\n): ReadonlyArray<CorpusRecord> {\n const matched = records.filter((r) => {\n if (filter.area !== undefined && r.area !== filter.area) return false\n if (filter.runId !== undefined && r.runId !== filter.runId) return false\n if (filter.minConfidence !== undefined && r.confidence < filter.minConfidence) return false\n if (filter.tags !== undefined && !filter.tags.every((t) => r.tags.includes(t))) return false\n return true\n })\n const ordered = [...matched].sort((a, b) =>\n b.confidence !== a.confidence\n ? b.confidence - a.confidence\n : b.producedAt < a.producedAt\n ? -1\n : b.producedAt > a.producedAt\n ? 1\n : 0,\n )\n if (filter.limit !== undefined) {\n if (!Number.isInteger(filter.limit) || filter.limit < 0) {\n throw new Error(\n `corpus query: filter.limit must be a non-negative integer, got ${filter.limit}`,\n )\n }\n return ordered.slice(0, filter.limit)\n }\n return ordered\n}\n\n// ── In-memory corpus ────────────────────────────────────────────────────────\n\n/**\n * In-memory `Corpus`. Keyed by record `id`; `append` validates the record, is idempotent on an\n * identical re-append, and returns a typed `{ succeeded: false }` on a conflicting re-append under\n * the same `id` (never overwrites). `query` routes through the single-sourced `applyFilter`.\n */\nexport class InMemoryCorpus implements Corpus {\n private readonly byId = new Map<string, CorpusRecord>()\n\n async append(\n record: CorpusRecord,\n ): Promise<{ succeeded: true } | { succeeded: false; error: string }> {\n try {\n assertCorpusRecord(record, 'append: record')\n } catch (err) {\n return { succeeded: false, error: err instanceof Error ? err.message : String(err) }\n }\n const existing = this.byId.get(record.id)\n if (existing) {\n if (recordsEqual(existing, record)) return { succeeded: true }\n return {\n succeeded: false,\n error:\n `corpus conflict: id '${record.id}' is already stored with a different record; ` +\n 'a learned fact is append-only — re-mint the id or reconcile before re-appending',\n }\n }\n this.byId.set(record.id, freeze(record))\n return { succeeded: true }\n }\n\n async query(filter: CorpusFilter): Promise<ReadonlyArray<CorpusRecord>> {\n return applyFilter([...this.byId.values()], filter)\n }\n}\n\n// ── File corpus (JSONL, append-only) ──────────────────────────────────────────\n\n/**\n * JSONL on disk — one validated `CorpusRecord` per line, append-only. `query` replays the whole\n * file, validating every line (a malformed line fails loud — a corrupted corpus must never read\n * back silently) and folding by `id`: a later identical line dedups, a later conflicting line\n * under the same `id` is a corruption (fail loud). `append` first replays to enforce the same\n * idempotence/conflict contract as the in-mem impl, then fsyncs the new line so a crash between\n * writes never loses an acknowledged fact. Shares the JSONL append-line spine with the spawn\n * journal, but the interface stays separate (a learned fact is not a replay record).\n */\nexport class FileCorpus implements Corpus {\n constructor(private readonly path: string) {}\n\n async append(\n record: CorpusRecord,\n ): Promise<{ succeeded: true } | { succeeded: false; error: string }> {\n try {\n assertCorpusRecord(record, 'append: record')\n } catch (err) {\n return { succeeded: false, error: err instanceof Error ? err.message : String(err) }\n }\n let stored: Map<string, CorpusRecord>\n try {\n stored = await this.load()\n } catch (err) {\n return { succeeded: false, error: err instanceof Error ? err.message : String(err) }\n }\n const existing = stored.get(record.id)\n if (existing) {\n if (recordsEqual(existing, record)) return { succeeded: true }\n return {\n succeeded: false,\n error:\n `corpus conflict: id '${record.id}' is already stored in ${this.path} with a different ` +\n 'record; a learned fact is append-only — re-mint the id or reconcile before re-appending',\n }\n }\n await this.appendLine(record)\n return { succeeded: true }\n }\n\n async query(filter: CorpusFilter): Promise<ReadonlyArray<CorpusRecord>> {\n const stored = await this.load()\n return applyFilter([...stored.values()], filter)\n }\n\n private async load(): Promise<Map<string, CorpusRecord>> {\n const fs = await import('node:fs/promises')\n let text: string\n try {\n text = await fs.readFile(this.path, 'utf8')\n } catch (err) {\n if (isNoEntError(err)) return new Map()\n throw err\n }\n const lines = text.split('\\n').filter((line) => line.length > 0)\n const byId = new Map<string, CorpusRecord>()\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] as string\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch (err) {\n throw new Error(\n `corpus corrupted: ${this.path} line ${i + 1} is not valid JSON: ` +\n (err instanceof Error ? err.message : String(err)),\n )\n }\n assertCorpusRecord(parsed, `corpus ${this.path} line ${i + 1}`)\n const existing = byId.get(parsed.id)\n if (existing && !recordsEqual(existing, parsed)) {\n throw new Error(\n `corpus corrupted: ${this.path} has two different records for id '${parsed.id}'; ` +\n 'an append-only corpus must never hold a conflicting re-append under one id',\n )\n }\n byId.set(parsed.id, freeze(parsed))\n }\n return byId\n }\n\n private async appendLine(record: CorpusRecord): Promise<void> {\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n await fs.mkdir(path.dirname(this.path), { recursive: true })\n const fh = await fs.open(this.path, 'a')\n try {\n await fh.write(`${JSON.stringify(record)}\\n`)\n await fh.sync()\n } finally {\n await fh.close()\n }\n }\n}\n\n// ── Render-back: project accreted facts into a profile's instruction seams ─────\n\n/**\n * The learning-flywheel READ side. Queries the corpus through `filter`, renders the matching facts\n * (most-confident first, capped by `maxLines`) into instruction lines, and returns a FRESH\n * `AgentProfile` with them merged in — never mutates the input profile. Default `target: 'prompt'`\n * appends the lines to `prompt.instructions[]` (the additive append-line seam); `target:\n * 'resources'` folds them into the single-blob `resources.instructions` string (preserving any\n * existing blob, but failing loud on a non-string existing blob — a `resources.instructions` that\n * was already an `AgentProfileResourceRef` cannot be string-appended without dropping it).\n *\n * An empty query result returns a fresh COPY of the profile with no instruction change (a valid\n * \"nothing learned yet\" read, not an error).\n */\nexport async function renderCorpusToInstructions(\n opts: RenderCorpusToInstructionsOptions,\n): Promise<AgentProfile> {\n const { corpus, filter, profile, target = 'prompt', maxLines } = opts\n if (maxLines !== undefined && (!Number.isInteger(maxLines) || maxLines < 0)) {\n throw new Error(\n `renderCorpusToInstructions: maxLines must be a non-negative integer, got ${maxLines}`,\n )\n }\n const matched = await corpus.query(filter)\n const capped = maxLines !== undefined ? matched.slice(0, maxLines) : matched\n const lines = capped.map(renderLine)\n\n if (lines.length === 0) return structuredClone(profile)\n\n const next = structuredClone(profile)\n if (target === 'resources') {\n const resources = next.resources ?? {}\n const prior = resources.instructions\n if (prior !== undefined && typeof prior !== 'string') {\n throw new Error(\n 'renderCorpusToInstructions: resources.instructions is an AgentProfileResourceRef, not a ' +\n 'string; cannot string-append corpus facts without dropping the ref (pass target: ' +\n \"'prompt' or pre-resolve the ref)\",\n )\n }\n const blob = [prior, ...lines].filter((s): s is string => typeof s === 'string' && s.length > 0)\n next.resources = { ...resources, instructions: blob.join('\\n') }\n return next\n }\n\n const prompt = next.prompt ?? {}\n next.prompt = { ...prompt, instructions: [...(prompt.instructions ?? []), ...lines] }\n return next\n}\n\n/** One corpus fact → one instruction line. The claim is the line; a rationale (when present) is\n * appended in parentheses so a reader sees the why without a second line. Content-only — no\n * metric/score/verdict text is synthesized (the corpus holds facts, not selector evidence). */\nfunction renderLine(record: CorpusRecord): string {\n return record.rationale ? `${record.claim} (${record.rationale})` : record.claim\n}\n\n// ── Internal helpers ───────────────────────────────────────────────────────────\n\nfunction freeze(record: CorpusRecord): CorpusRecord {\n return Object.freeze({ ...record })\n}\n\nfunction isNoEntError(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'code' in err &&\n (err as { code: unknown }).code === 'ENOENT'\n )\n}\n","/**\n *\n * The loop-shape registry — the OPEN, content-free extension point for the personify layer.\n *\n * A `LoopShape` is reusable STRUCTURE (how to decompose / fan out / verify / synthesize),\n * parameterized by a persona's CONTENT. The registry lets a caller resolve a composed shape by\n * NAME: register a factory once, then `runPersonified({ shape: '<name>' })` resolves it with zero\n * edits elsewhere. `register` fails loud on a duplicate; `resolve` returns a typed outcome so an\n * unknown name is a named error, never a silent default.\n *\n * No shape is pre-registered: the generic combinators (`pipeline`/`fanout`/`loopUntil`/`panel`/\n * `verify`/`widen`) take spec arguments, so they are not bare zero-arg factories — a caller that\n * wants name-resolution registers its own COMPOSED shape (a combinator already applied to its\n * spec) on a registry instance. The registry carries SHAPE only; the domain lives on the persona.\n *\n * @experimental\n */\n\nimport { ValidationError } from '../../errors'\nimport type { LoopShape, ShapeRegistry } from './types'\n\n/**\n * Build a fresh open `ShapeRegistry`. A factory is stored type-erased and re-cast on resolve — the\n * caller asserts the `<Task, D>` it expects, exactly as the executor registry stores its factories.\n */\nexport function createShapeRegistry(): ShapeRegistry {\n const shapes = new Map<string, LoopShape<unknown, unknown>>()\n return {\n register<Task, D>(name: string, factory: LoopShape<Task, D>): void {\n if (shapes.has(name)) {\n throw new ValidationError(`shape registry: shape \"${name}\" already registered`)\n }\n shapes.set(name, factory as LoopShape<unknown, unknown>)\n },\n resolve<Task, D>(name: string) {\n const factory = shapes.get(name)\n if (!factory) {\n return { succeeded: false as const, error: `shape registry: unknown shape \"${name}\"` }\n }\n return { succeeded: true as const, value: factory as LoopShape<Task, D> }\n },\n names(): string[] {\n return [...shapes.keys()]\n },\n }\n}\n\n/** The default registry `runPersonified` resolves a shape name against. Empty by construction —\n * a caller registers its own composed shapes; the engine ships no domain shape. */\nexport const builtinShapes: ShapeRegistry = createShapeRegistry()\n\n/** Register a composed shape on the default `builtinShapes` registry — the one-call extension\n * point a caller invokes so its shape is resolvable by name with zero edits to the engine. */\nexport function registerShape<Task, D>(name: string, factory: LoopShape<Task, D>): void {\n builtinShapes.register(name, factory)\n}\n","/**\n *\n * The personify layer impl — `definePersona` (the thin builder) + `runPersonified` (composes\n * the persona + chosen shape onto the keystone `Supervisor`), plus `createShapeContext`, the\n * seam that hands a shape its spawn helpers without it touching the registry.\n *\n * This file adds NO engine: `runPersonified` is `createSupervisor().run(rootAgent, task, …)`\n * where `rootAgent` is the persona's chosen `LoopShape` applied to a `ShapeContext`. All the\n * conserved-budget / journal / abort / typed-result machinery is the keystone's; this layer\n * only wires the persona's CONTENT (root spec + directive + context + seams) into it.\n *\n * One non-obvious invariant it must honor: `createSupervisor().run` builds the root `Scope`\n * with an EMPTY seam bag (`seams: {}`), so the built-in metered runtimes (router/sandbox/cli)\n * cannot read their seams off `ExecutorContext` through the default supervisor path. A persona\n * that supplies raw `seams` is therefore wrapped here into a registry whose resolved factories\n * receive a ctx with the persona seams merged in — so a persona never has to pre-close its\n * factories by hand. A persona may instead supply a fully-built `registry` and skip the wrap.\n *\n * @experimental\n */\n\nimport { InMemoryResultBlobStore, InMemorySpawnJournal } from '../../durable/spawn-journal'\nimport { ValidationError } from '../../errors'\nimport { withDriverExecutor } from '../supervise/driver-executor'\nimport { createExecutorRegistry } from '../supervise/runtime'\nimport { createSupervisor } from '../supervise/supervisor'\nimport type {\n Agent,\n AgentSpec,\n Budget,\n ExecutorContext,\n ExecutorFactory,\n ExecutorRegistry,\n Runtime,\n SupervisedResult,\n SupervisorOpts,\n} from '../supervise/types'\nimport { builtinShapes } from './registry'\nimport type {\n DefinePersonaInput,\n LoopShape,\n Outcome,\n Persona,\n RunPersonifiedOptions,\n ShapeBudget,\n ShapeContext,\n} from './types'\nimport type { ScopeAnalyst } from './wave-types'\n\n// ── definePersona ─────────────────────────────────────────────────────────────\n\n/**\n * Build a frozen `Persona`. Fails loud on the executors-supplied invariant: a persona with\n * neither a pre-built registry nor a seam bag cannot resolve its built-in runtimes, so it is\n * unrunnable — refuse it at definition time, not at the first spawn. Pure; no I/O.\n */\nexport function definePersona<D = unknown>(input: DefinePersonaInput<D>): Persona<D> {\n if (!input.executors.registry && !input.executors.seams) {\n throw new ValidationError(\n `definePersona(\"${input.name}\"): executors must supply a registry or a seams bag ` +\n '(built-in runtimes read their seams off ExecutorContext; neither was provided)',\n )\n }\n if (!input.root || typeof input.root !== 'object' || !('harness' in input.root)) {\n throw new ValidationError(`definePersona(\"${input.name}\"): root must be an AgentSpec`)\n }\n return Object.freeze({\n name: input.name,\n root: input.root,\n directive: input.directive,\n context: input.context,\n executors: input.executors,\n ...(input.extensions ? { extensions: input.extensions } : {}),\n }) as Persona<D>\n}\n\n// ── ShapeContext construction ───────────────────────────────────────────────────\n\n/**\n * Build the `ShapeContext` a `LoopShape` factory consumes. `spawnChild` wraps an `AgentSpec`\n * into a leaf `Agent` carrying it as `executorSpec` (the structural field `scope.spawn`\n * reads); `childSpec` derives a narrower child spec from the persona's root by overriding the\n * profile. The shape never touches the registry — resolution stays single-sourced in the\n * scope/registry the supervisor owns.\n */\nexport function createShapeContext<D>(\n persona: Persona<D>,\n budget: ShapeBudget,\n analyst?: ScopeAnalyst<D>,\n): ShapeContext<D> {\n return {\n persona,\n budget,\n ...(analyst ? { analyst } : {}),\n spawnChild(name, spec): Agent<unknown, Outcome<D>> {\n // The wrapped agent is SPAWNED, not run — the resolved Executor drives it. The\n // executor is a LEAF for a plain spec OR the recursive driver-executor for a\n // `role:'driver'` spec (a child that is itself a driver — agents drive agents). `act`\n // is never invoked by the keystone for a spawned child (the executor drives it); it\n // throws if mis-used as a root (fail loud), never a vacuous outcome.\n const agent = {\n name,\n executorSpec: spec,\n act(): Promise<Outcome<D>> {\n throw new ValidationError(\n `personify: spawned child \"${name}\" was run directly; its executorSpec drives it ` +\n '(a leaf, or — for a driver child — a nested scope through the recursive driver-executor)',\n )\n },\n }\n return agent as Agent<unknown, Outcome<D>> & { executorSpec: AgentSpec }\n },\n childSpec(profile, harness): AgentSpec {\n return {\n profile,\n harness: harness === undefined ? persona.root.harness : harness,\n ...(persona.root.executor ? { executor: persona.root.executor } : {}),\n }\n },\n }\n}\n\n// ── runPersonified ──────────────────────────────────────────────────────────────\n\n/**\n * Compose the persona + chosen shape onto a fresh keystone `Supervisor`. Resolves the shape\n * (a factory verbatim, or a registered name through `builtinShapes`), applies it to a\n * `ShapeContext`, and runs the resulting root `Agent` to a typed `SupervisedResult<Outcome>`.\n * Fail loud on an unknown shape name or an unresolvable persona registry — never a silent\n * default-shape fallback.\n */\nexport async function runPersonified<Task, D>(\n options: RunPersonifiedOptions<Task, D>,\n): Promise<SupervisedResult<Outcome<D>>> {\n const { persona } = options\n const shape = resolveShape<Task, D>(options.shape)\n const shapeBudget = resolveShapeBudget(options.budget, options.shapeBudget)\n const ctx = createShapeContext(persona, shapeBudget, options.analyst)\n const rootAgent = shape(ctx)\n\n const executors = personaRegistry(persona)\n const supervisor = createSupervisor<Task, Outcome<D>>()\n if (options.handle) supervisor.attach(options.handle)\n\n const supervisorOpts: SupervisorOpts = {\n budget: options.budget,\n runId: options.runId ?? `${persona.name}:${shapeName(options.shape, shape)}`,\n journal: options.journal ?? new InMemorySpawnJournal(),\n blobs: options.blobs ?? new InMemoryResultBlobStore(),\n executors,\n ...(options.maxDepth !== undefined ? { maxDepth: options.maxDepth } : {}),\n ...(options.maxRestarts !== undefined ? { maxRestarts: options.maxRestarts } : {}),\n ...(options.withinMs !== undefined ? { withinMs: options.withinMs } : {}),\n ...(options.now ? { now: options.now } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n ...(options.hooks ? { hooks: options.hooks } : {}),\n }\n return supervisor.run(rootAgent, options.task, supervisorOpts)\n}\n\n// ── Resolution helpers ──────────────────────────────────────────────────────────\n\nfunction resolveShape<Task, D>(shape: LoopShape<Task, D> | string): LoopShape<Task, D> {\n if (typeof shape !== 'string') return shape\n const resolved = builtinShapes.resolve<Task, D>(shape)\n if (!resolved.succeeded) {\n throw new ValidationError(\n `runPersonified: ${resolved.error} (registered: ${builtinShapes.names().join(', ')})`,\n )\n }\n return resolved.value\n}\n\nfunction shapeName<Task, D>(\n shape: LoopShape<Task, D> | string,\n _resolved: LoopShape<Task, D>,\n): string {\n return typeof shape === 'string' ? shape : shape.name || 'shape'\n}\n\n/**\n * Default the shape's per-child sizing + fanout width from the root budget when the caller\n * omits them. The per-child token ceiling is the root divided across the fanout so the\n * conserved pool can admit a full round; iterations default to the root's. A caller override\n * wins per-field.\n */\nfunction resolveShapeBudget(root: Budget, over?: Partial<ShapeBudget>): ShapeBudget {\n const fanout = over?.fanout ?? defaultFanout\n const perChild: Budget = over?.perChild ?? {\n maxIterations: Math.max(1, Math.floor(root.maxIterations / fanout)),\n maxTokens: Math.max(1, Math.floor(root.maxTokens / fanout)),\n ...(root.maxUsd !== undefined ? { maxUsd: root.maxUsd / fanout } : {}),\n ...(root.deadlineMs !== undefined ? { deadlineMs: root.deadlineMs } : {}),\n }\n return { perChild, fanout }\n}\n\nconst defaultFanout = 3\n\n/**\n * Resolve the persona's executor resolution into a single `ExecutorRegistry`. A pre-built\n * `registry` is used verbatim; otherwise the persona's raw `seams` are wrapped so resolved\n * factories receive an `ExecutorContext` with the persona seams merged in — the supervisor\n * threads an empty bag, so this is the one place the persona seams reach the built-ins.\n */\nfunction personaRegistry<D>(persona: Persona<D>): ExecutorRegistry {\n const { registry, seams } = persona.executors\n // `withDriverExecutor` routes a `role:'driver'` child to the recursive driver-executor\n // (a child that drives its own children) BEFORE the base leaf resolution — so a persona\n // shape can spawn a driver child and the recursion composes. A plain leaf child falls\n // through to the base registry unchanged.\n if (registry) return withDriverExecutor(registry)\n if (!seams) {\n throw new ValidationError(\n `personify: persona \"${persona.name}\" supplies neither a registry nor seams`,\n )\n }\n return withDriverExecutor(withSeams(createExecutorRegistry(), seams))\n}\n\n/**\n * Wrap a registry so every resolved `ExecutorFactory` receives a ctx whose `seams` are\n * the persona seams merged over whatever the scope threaded (the scope threads `{}`, so the\n * persona seams win). A BYO `spec.executor` still resolves to a trivial factory that ignores\n * ctx — so this wrap is transparent for BYO and only matters for the metered built-ins.\n */\nfunction withSeams(\n base: ExecutorRegistry,\n seams: Readonly<Record<string, unknown>>,\n): ExecutorRegistry {\n return {\n register<Out>(runtime: Runtime, factory: ExecutorFactory<Out>): void {\n base.register(runtime, factory)\n },\n resolve<Out>(spec: AgentSpec) {\n const resolved = base.resolve<Out>(spec)\n if (!resolved.succeeded) return resolved\n const inner = resolved.value\n const wrapped: ExecutorFactory<Out> = (s, ctx) => inner(s, mergeSeams(ctx, seams))\n return { succeeded: true, value: wrapped }\n },\n }\n}\n\nfunction mergeSeams(\n ctx: ExecutorContext,\n seams: Readonly<Record<string, unknown>>,\n): ExecutorContext {\n return { signal: ctx.signal, seams: { ...seams, ...ctx.seams } }\n}\n","/**\n *\n * Trajectory trace + cost ledger — the post-hoc tree reconstructor (§4 of `wave-types`).\n *\n * `trajectoryReport` rebuilds the WHOLE realized spawn tree from the durable\n * `SpawnJournal` (+ optionally the `ResultBlobStore` for `done` artifacts): every node\n * (driver AND leaf), the real parent/child edges, each node's terminal status, its OWN\n * conserved `Spend`, and the `Spend` ROLLED UP over its subtree. Roll-up is a post-order\n * fold over the parent edges: a node's `rolledUpSpend` is its own spend plus every\n * descendant's, so a driver is charged for the fanout it caused — the root's roll-up is\n * the whole run's conserved total (tokens + usd + iterations + ms).\n *\n * `equalKOnCost` compares separate runs (arms) on that conserved COST, not on raw\n * iteration COUNT. The sandbox executor reports tokens/usd INCLUSIVE of a leaf's internal\n * sub-agent fanout, so charging an arm by `total.tokens`/`total.usd` (not by how many\n * `next()` cursors it logged) closes the leaf-fanout confound: a treatment leaf that fanned\n * out internally pays for it in cost, where a per-iteration count would hide it. The\n * within-run conserved pool already guarantees `Σk` equal by construction; this check is the\n * CROSS-run analogue the pool cannot reach — proving equal compute before any win is claimed.\n *\n * Pure over the journal/blobs — no live agent calls; safe to run on a finished run's log.\n *\n * @experimental\n */\n\nimport type {\n DefaultVerdict,\n NodeId,\n ResultBlobStore,\n SpawnEvent,\n SpawnJournal,\n Spend,\n} from '../supervise/types'\nimport { addTokenUsage, zeroTokenUsage } from '../util'\nimport type {\n EqualKArm,\n EqualKOnCostOptions,\n EqualKVerdict,\n TrajectoryNode,\n TrajectoryReport,\n TrajectoryReportOptions,\n} from './wave-types'\n\nconst defaultEqualKTolerance = 0.05\n\n/**\n * Reconstruct the whole spawn tree for `root` with per-node + rolled-up `Spend`. Reads the\n * journal for structure + spend and, when `withOutputs`, the blob store for each `done`\n * node's artifact. Fail loud on a tree that was never journaled, a settle/cancel for an\n * un-spawned node (a corrupted log), or — under `withOutputs` — a `done` node whose blob the\n * store cannot rehydrate (a silent gap would mis-cost or mis-evidence the tree).\n */\nexport async function trajectoryReport(\n journal: SpawnJournal,\n blobs: ResultBlobStore,\n root: NodeId,\n options: TrajectoryReportOptions = {},\n): Promise<TrajectoryReport> {\n const events = await journal.loadTree(root)\n if (events === undefined) {\n throw new Error(`trajectoryReport: no journaled tree for root '${root}'`)\n }\n\n // Spawns (ordinal seq) create the nodes; settlements/cancellations (cursor seq) close\n // them. The two seq namespaces overlap, so create every node from its `spawned` event\n // first, then apply settlements/cancellations — mirrors `materializeTreeView`.\n const spawns = events.filter(isNodeCreation).sort(bySeq)\n // `metered` events (driver inference) are folded onto each node in a separate pass below, so\n // they accumulate ONTO the settled child-work base regardless of seq order; closes are the\n // settlements/cancellations that set node status.\n const closes = events\n .filter((ev) => ev.kind !== 'spawned' && ev.kind !== 'waiting' && ev.kind !== 'metered')\n .sort(bySeq)\n\n const nodes = new Map<NodeId, MutableNode>()\n for (const ev of spawns) {\n nodes.set(ev.id, {\n id: ev.id,\n parent: ev.parent,\n label: ev.label,\n // A wait-state has no executor, so it has no runtime in the executor sense — it is tagged\n // `'wait'` so a reader can separate zero-cost waiting from paid work in the trajectory.\n runtime: ev.kind === 'waiting' ? 'wait' : ev.runtime,\n status: ev.kind === 'waiting' ? 'waiting' : 'pending',\n ownSpend: zeroSpend(),\n children: [],\n })\n }\n for (const ev of closes) {\n const node = requireNode(nodes, ev.id, root)\n if (ev.kind === 'cancelled') {\n node.status = 'cancelled'\n continue\n }\n if (ev.kind === 'woken') {\n // A wait's spend stays zero by construction — it never reserved and never reconciled.\n node.status = ev.by === 'cancelled' ? 'cancelled' : 'done'\n node.outRef = ev.outRef\n continue\n }\n node.status = ev.status === 'done' ? 'done' : 'failed'\n node.ownSpend = ev.spent\n node.verdict = ev.verdict\n node.outRef = ev.outRef\n }\n // Driver inference: add each `metered` event onto its node's ownSpend. Because a driver re-homes\n // its nested subtree's inference up the tree, this single tree's events already carry the whole\n // sub-tree's driver cost — so `total` matches `SupervisedResult.spentTotal` directly, with no\n // caller plumbing.\n for (const ev of events) {\n if (ev.kind !== 'metered') continue\n const node = requireNode(nodes, ev.id, root)\n node.ownSpend = addNodeSpend(node.ownSpend, ev.spend)\n }\n\n if (!nodes.has(root)) {\n throw new Error(\n `trajectoryReport: root '${root}' has no spawned event in its journaled tree (corrupted log)`,\n )\n }\n\n // Wire the realized parent/child edges in spawn order, then roll spend up the tree.\n for (const ev of spawns) {\n if (ev.parent === undefined) continue\n requireNode(nodes, ev.parent, root).children.push(ev.id)\n }\n const rolledUp = rollUpSpend(nodes, root)\n\n if (options.withOutputs) {\n await attachOutputs(nodes, blobs)\n }\n\n // Emit in spawn order so the node list reads as the realized tree, root first.\n const ordered = spawns.map((ev) => nodes.get(ev.id)).filter(isNode)\n const reported: TrajectoryNode[] = ordered.map((node) =>\n freezeNode(node, requireSpend(rolledUp, node.id, root)),\n )\n\n return {\n root,\n nodes: reported,\n total: requireSpend(rolledUp, root, root),\n statusCounts: countStatuses(reported),\n }\n}\n\n/**\n * Assert the arms are comparable at EQUAL conserved COST (tokens + usd), NOT raw iteration\n * count. Compares each arm's root-rolled-up `total` on the two conserved channels: an arm is\n * within-tolerance when the per-channel spread (max − min across arms) over the median is\n * `≤ tolerance`. Pure over the reports — no I/O. Fails loud on an empty arm list (nothing to\n * compare) so a vacuous \"equal\" is never returned.\n */\nexport function equalKOnCost(\n arms: ReadonlyArray<EqualKArm>,\n options: EqualKOnCostOptions = {},\n): EqualKVerdict {\n if (arms.length === 0) {\n throw new Error('equalKOnCost: no arms to compare')\n }\n const tolerance = options.tolerance ?? defaultEqualKTolerance\n\n const armCosts = arms.map((arm) => ({\n label: arm.label,\n tokens: arm.report.total.tokens.input + arm.report.total.tokens.output,\n usd: arm.report.total.usd,\n iterations: arm.report.total.iterations,\n }))\n\n const tokenValues = armCosts.map((a) => a.tokens)\n const usdValues = armCosts.map((a) => a.usd)\n const spread = {\n tokens: spreadOf(tokenValues),\n usd: spreadOf(usdValues),\n }\n const withinTolerance =\n fractionalSpread(tokenValues) <= tolerance && fractionalSpread(usdValues) <= tolerance\n\n return {\n withinTolerance,\n arms: armCosts,\n spread,\n tolerance,\n }\n}\n\n// ── Tree fold internals ────────────────────────────────────────────────────────\n\ninterface MutableNode {\n id: NodeId\n parent?: NodeId\n label: string\n runtime: string\n status: TrajectoryNode['status']\n ownSpend: Spend\n children: NodeId[]\n verdict?: DefaultVerdict\n output?: unknown\n outRef?: string\n}\n\n/**\n * Post-order fold: a node's rolled-up spend is its own spend plus every child's rolled-up\n * spend. Iterative (an explicit stack) so a deep tree never overflows the call stack; a node\n * is finalized only after all its children are, so the parent edges are honored exactly.\n */\nfunction rollUpSpend(nodes: Map<NodeId, MutableNode>, root: NodeId): Map<NodeId, Spend> {\n const rolled = new Map<NodeId, Spend>()\n const stack: { id: NodeId; expanded: boolean }[] = [{ id: root, expanded: false }]\n while (stack.length > 0) {\n const frame = stack.pop()\n if (frame === undefined) continue\n const node = requireNode(nodes, frame.id, root)\n if (!frame.expanded) {\n stack.push({ id: frame.id, expanded: true })\n for (const child of node.children) stack.push({ id: child, expanded: false })\n continue\n }\n const sum = cloneSpend(node.ownSpend)\n for (const child of node.children) addSpend(sum, requireSpend(rolled, child, root))\n rolled.set(frame.id, sum)\n }\n return rolled\n}\n\n/**\n * Rehydrate each `done` node's artifact from the blob store. Fail loud on a `done` node whose\n * blob the store cannot resolve — a missing payload under `withOutputs` is a corrupted store,\n * not an absent output (a `down`/`cancelled` node legitimately has none).\n */\nasync function attachOutputs(\n nodes: Map<NodeId, MutableNode>,\n blobs: ResultBlobStore,\n): Promise<void> {\n for (const node of nodes.values()) {\n if (node.status !== 'done' || node.outRef === undefined) continue\n const out = await blobs.get(node.outRef)\n if (out === undefined) {\n throw new Error(\n `trajectoryReport: blob store has no artifact for outRef '${node.outRef}' (node '${node.id}')`,\n )\n }\n node.output = out\n }\n}\n\nfunction freezeNode(node: MutableNode, rolledUpSpend: Spend): TrajectoryNode {\n return {\n id: node.id,\n parent: node.parent,\n children: [...node.children],\n label: node.label,\n runtime: node.runtime,\n status: node.status,\n ownSpend: node.ownSpend,\n rolledUpSpend,\n verdict: node.verdict,\n output: node.output,\n outRef: node.outRef,\n }\n}\n\nfunction countStatuses(\n reported: ReadonlyArray<TrajectoryNode>,\n): Readonly<Record<TrajectoryNode['status'], number>> {\n const counts: Record<TrajectoryNode['status'], number> = {\n done: 0,\n failed: 0,\n cancelled: 0,\n pending: 0,\n waiting: 0,\n }\n for (const node of reported) counts[node.status] += 1\n return counts\n}\n\n// ── Spend arithmetic (single-sourced on `addTokenUsage`) ─────────────────────────\n\nfunction zeroSpend(): Spend {\n return { iterations: 0, tokens: zeroTokenUsage(), usd: 0, ms: 0 }\n}\n\n/** Add a `metered` event's spend onto a node's accumulated ownSpend (per channel). */\nfunction addNodeSpend(a: Spend, b: Spend): Spend {\n return {\n iterations: a.iterations + b.iterations,\n tokens: { input: a.tokens.input + b.tokens.input, output: a.tokens.output + b.tokens.output },\n usd: a.usd + b.usd,\n ...(a.usdKnown === false || b.usdKnown === false ? { usdKnown: false } : {}),\n ms: a.ms + b.ms,\n }\n}\n\nfunction cloneSpend(spend: Spend): Spend {\n return {\n iterations: spend.iterations,\n tokens: { input: spend.tokens.input, output: spend.tokens.output },\n usd: spend.usd,\n ...(spend.usdKnown === false ? { usdKnown: false } : {}),\n ms: spend.ms,\n }\n}\n\n/** Add `delta` into `acc` in place across every conserved channel. */\nfunction addSpend(acc: Spend, delta: Spend): void {\n acc.iterations += delta.iterations\n addTokenUsage(acc.tokens, delta.tokens)\n acc.usd += delta.usd\n if (delta.usdKnown === false) acc.usdKnown = false\n acc.ms += delta.ms\n}\n\n// ── Cross-arm spread ─────────────────────────────────────────────────────────────\n\nfunction spreadOf(values: ReadonlyArray<number>): number {\n if (values.length === 0) return 0\n return Math.max(...values) - Math.min(...values)\n}\n\n/**\n * Fractional spread on one channel: `(max − min) / median`. A zero-median channel (every arm\n * spent zero on it) is trivially equal — spread is also zero, so it never trips the tolerance.\n */\nfunction fractionalSpread(values: ReadonlyArray<number>): number {\n const spread = spreadOf(values)\n if (spread === 0) return 0\n const median = medianOf(values)\n if (median === 0) {\n throw new Error(\n 'equalKOnCost: arms have a non-zero cost spread on a zero-median channel; cannot express it as a fraction',\n )\n }\n return spread / median\n}\n\nfunction medianOf(values: ReadonlyArray<number>): number {\n if (values.length === 0) {\n throw new Error('equalKOnCost: cannot take the median of an empty channel')\n }\n const sorted = [...values].sort((a, b) => a - b)\n const mid = Math.floor(sorted.length / 2)\n const hi = sorted[mid] as number\n if (sorted.length % 2 !== 0) return hi\n const lo = sorted[mid - 1] as number\n return (lo + hi) / 2\n}\n\n// ── Guards + narrowers ───────────────────────────────────────────────────────────\n\n/** Node-CREATION events — a spawned child or an armed wait-state. Both mint a node in the\n * ordinal namespace; their settlements (`settled` / `woken`) close them in the cursor namespace. */\nfunction isNodeCreation(\n ev: SpawnEvent,\n): ev is Extract<SpawnEvent, { kind: 'spawned' | 'waiting' }> {\n return ev.kind === 'spawned' || ev.kind === 'waiting'\n}\n\nfunction isNode(node: MutableNode | undefined): node is MutableNode {\n return node !== undefined\n}\n\nfunction bySeq(a: SpawnEvent, b: SpawnEvent): number {\n return a.seq - b.seq\n}\n\nfunction requireNode(nodes: Map<NodeId, MutableNode>, id: NodeId, root: NodeId): MutableNode {\n const node = nodes.get(id)\n if (!node) {\n throw new Error(\n `trajectoryReport: tree '${root}' references node '${id}' with no prior spawn (corrupted log)`,\n )\n }\n return node\n}\n\nfunction requireSpend(rolled: Map<NodeId, Spend>, id: NodeId, root: NodeId): Spend {\n const spend = rolled.get(id)\n if (!spend) {\n throw new Error(\n `trajectoryReport: node '${id}' was never rolled up in tree '${root}' (unreachable from root)`,\n )\n }\n return spend\n}\n","/**\n * promotionGate — the statistical promotion decision over a holdout benchmark: does the\n * candidate strategy beat the incumbent on held-out tasks by a margin the task noise\n * cannot fake? The statistics are the substrate's (`heldoutSignificance`): a SEEDED\n * paired bootstrap over per-task (candidate − incumbent) deltas — deterministic verdict,\n * a minimum-evidence floor, and the CI lower bound must clear `deltaThreshold`. A raw\n * h1>h0 point comparison on m≈8 holdout tasks certifies false champions at near\n * coin-flip rates; this gate is the instrument-grade replacement.\n */\nimport { heldoutSignificance } from '@tangle-network/agent-eval/campaign'\nimport type { BenchmarkReport } from './run-benchmark'\n\nexport interface PromotionGateOptions {\n /** The HOLDOUT report — must carry per-task cells for both strategy names. */\n report: BenchmarkReport\n /** The incumbent champion's strategy name. */\n incumbent: string\n /** The challenger's strategy name. */\n candidate: string\n /** 'superiority' (default): the candidate must score significantly BETTER.\n * 'non-inferiority': the candidate must prove its score is not worse than the\n * incumbent by more than `scoreTolerance` AND its cost savings are significant —\n * the gate for \"same quality, cheaper\" claims. */\n mode?: 'superiority' | 'non-inferiority'\n /** non-inferiority: the score CI lower bound must clear −scoreTolerance. Default 0.05. */\n scoreTolerance?: number\n /** The CI lower bound on the paired lift must EXCEED this (score scale). Default 0. */\n deltaThreshold?: number\n /** Minimum paired tasks before significance can be claimed. Default 6 — below that\n * the bootstrap CI is too wide to separate a real lift from the per-task noise. */\n minPairedTasks?: number\n /** Bootstrap statistic over the paired deltas. Default 'mean'. */\n statistic?: 'mean' | 'median'\n /** Fixed by the substrate by default — the same report always yields the same verdict. */\n seed?: number\n resamples?: number\n}\n\nexport interface PromotionVerdict {\n promoted: boolean\n reason:\n | 'identical-champion'\n | 'few-tasks'\n | 'no-margin'\n | 'significant'\n | 'non-inferior-and-cheaper'\n | 'non-inferiority-unproven'\n | 'not-cheaper'\n mode: 'superiority' | 'non-inferiority'\n /** Paired tasks that carried both strategies' cells. */\n n: number\n /** Paired (candidate − incumbent) lift across the holdout tasks. */\n lift: { mean: number; median: number; low: number; high: number }\n /** non-inferiority mode: paired (incumbent − candidate) cost SAVINGS per task (usd) —\n * positive means the candidate is cheaper; significant iff the CI low clears zero. */\n costSavings?: { mean: number; median: number; low: number; high: number }\n /** Paired (candidate − incumbent) wall-clock per task (ms) — negative = the candidate\n * is FASTER. Informational in every mode (never gates); the latency answer to \"what\n * does this win actually cost the user?\". */\n latency?: { mean: number; median: number; low: number; high: number }\n}\n\n/** Statistical promotion decision over a holdout benchmark: a seeded paired bootstrap (`heldoutSignificance`) whose CI lower bound must clear `deltaThreshold`. */\nexport function promotionGate(opts: PromotionGateOptions): PromotionVerdict {\n const mode = opts.mode ?? 'superiority'\n if (opts.candidate === opts.incumbent) {\n return {\n promoted: false,\n reason: 'identical-champion',\n mode,\n n: 0,\n lift: { mean: 0, median: 0, low: 0, high: 0 },\n }\n }\n const before: number[] = []\n const after: number[] = []\n const incUsd: number[] = []\n const candUsd: number[] = []\n const incMs: number[] = []\n const candMs: number[] = []\n const cellIds: string[] = []\n for (const row of opts.report.perTask) {\n const inc = row.cells?.[opts.incumbent]\n const cand = row.cells?.[opts.candidate]\n if (!inc || !cand) continue\n before.push(inc.score)\n after.push(cand.score)\n incUsd.push(inc.usd)\n candUsd.push(cand.usd)\n incMs.push(inc.ms)\n candMs.push(cand.ms)\n cellIds.push(row.taskId)\n }\n if (before.length === 0) {\n throw new Error(\n `promotionGate: no holdout task carried cells for both \"${opts.incumbent}\" and \"${opts.candidate}\" — the report must come from a run that included both strategies`,\n )\n }\n const sig = heldoutSignificance(\n { before, after, cellIds },\n {\n deltaThreshold: opts.deltaThreshold ?? 0,\n minProductiveRuns: opts.minPairedTasks ?? 6,\n statistic: opts.statistic ?? 'mean',\n ...(opts.seed !== undefined ? { seed: opts.seed } : {}),\n ...(opts.resamples !== undefined ? { resamples: opts.resamples } : {}),\n },\n )\n const lift = {\n mean: sig.bootstrap.mean,\n median: sig.bootstrap.median,\n low: sig.bootstrap.low,\n high: sig.bootstrap.high,\n }\n const latSig = heldoutSignificance(\n { before: incMs, after: candMs, cellIds },\n {\n deltaThreshold: 0,\n minProductiveRuns: 1,\n statistic: opts.statistic ?? 'mean',\n ...(opts.seed !== undefined ? { seed: opts.seed } : {}),\n ...(opts.resamples !== undefined ? { resamples: opts.resamples } : {}),\n },\n )\n const latency = {\n mean: latSig.bootstrap.mean,\n median: latSig.bootstrap.median,\n low: latSig.bootstrap.low,\n high: latSig.bootstrap.high,\n }\n if (mode === 'superiority') {\n if (sig.fewRuns) return { promoted: false, reason: 'few-tasks', mode, n: sig.n, lift, latency }\n return sig.significant\n ? { promoted: true, reason: 'significant', mode, n: sig.n, lift, latency }\n : { promoted: false, reason: 'no-margin', mode, n: sig.n, lift, latency }\n }\n // non-inferiority: (a) score not worse than −scoreTolerance, proven (CI low clears\n // −tolerance); (b) cost SAVINGS (incumbent − candidate, usd/task) significantly > 0.\n const tolerance = opts.scoreTolerance ?? 0.05\n const scoreSig = heldoutSignificance(\n { before, after, cellIds },\n {\n deltaThreshold: -tolerance,\n minProductiveRuns: opts.minPairedTasks ?? 6,\n statistic: opts.statistic ?? 'mean',\n ...(opts.seed !== undefined ? { seed: opts.seed } : {}),\n ...(opts.resamples !== undefined ? { resamples: opts.resamples } : {}),\n },\n )\n const costSig = heldoutSignificance(\n { before: candUsd, after: incUsd, cellIds },\n {\n deltaThreshold: 0,\n minProductiveRuns: opts.minPairedTasks ?? 6,\n statistic: opts.statistic ?? 'mean',\n ...(opts.seed !== undefined ? { seed: opts.seed } : {}),\n ...(opts.resamples !== undefined ? { resamples: opts.resamples } : {}),\n },\n )\n const costSavings = {\n mean: costSig.bootstrap.mean,\n median: costSig.bootstrap.median,\n low: costSig.bootstrap.low,\n high: costSig.bootstrap.high,\n }\n if (scoreSig.fewRuns)\n return { promoted: false, reason: 'few-tasks', mode, n: scoreSig.n, lift, costSavings, latency }\n if (!scoreSig.significant)\n return {\n promoted: false,\n reason: 'non-inferiority-unproven',\n mode,\n n: scoreSig.n,\n lift,\n costSavings,\n latency,\n }\n if (!costSig.significant)\n return {\n promoted: false,\n reason: 'not-cheaper',\n mode,\n n: scoreSig.n,\n lift,\n costSavings,\n latency,\n }\n return {\n promoted: true,\n reason: 'non-inferior-and-cheaper',\n mode,\n n: scoreSig.n,\n lift,\n costSavings,\n latency,\n }\n}\n","/**\n * runBenchmark — the packaged optimization suite. Define a domain by implementing an\n * `Environment` (open / tools / call / score / close); get the optimization strategies\n * compared, scored by your own deployable check, with a paired-bootstrap report — free.\n *\n * The mental model: you have a TASK + a deployable CHECK + a compute BUDGET. A strategy\n * is how you spend the budget to beat the check. Two built-ins:\n *\n * sample — N independent attempts, keep the best-verifying one. (best-of-N / resample)\n * refine — attempt → a critic reads the trace → steer the next → repeat. (iterate-with-feedback)\n *\n * Both run at equal budget through the Supervisor's conserved pool; the headline is the\n * paired lift of refine over sample. Author your own strategy with `defineStrategy`.\n */\n\nimport { pairedBootstrap, paretoFrontier } from '@tangle-network/agent-eval'\nimport type { RuntimeHooks } from '../runtime-hooks'\nimport { routerChatWithUsage } from './router-client'\nimport {\n type AgenticOptions,\n type AgenticSurface,\n type AgenticTask,\n refine,\n runAgentic,\n type Strategy,\n sample,\n} from './strategy'\n\n/** A checkable task domain — implement these 5 hooks and the suite does the rest. The\n * same seam as `AgenticSurface`; `Environment` is the RL/gym-standard name for it. */\nexport type Environment = AgenticSurface\n\nexport interface BenchmarkConfig {\n /** The task domain (5 hooks). */\n environment: Environment\n /** The tasks to score across. */\n tasks: AgenticTask[]\n /** The worker: model + router + (optional) the critic's instruction (the steerer knob). */\n worker: AgenticOptions\n /** Which strategies to compare. Pass the built-ins (`refine`, `sample`) or your own.\n * Default: [sample, refine]. */\n strategies?: Strategy[]\n /** Shots (refine) / width (sample) — the equal compute budget per strategy. Default 3. */\n budget?: number\n /** Tasks scored in parallel. Default 3. */\n concurrency?: number\n /** Progress hook — fires as each task settles (the live-monitoring seam: append to a\n * progress file, render a tree, stream to a dashboard). `done` counts settled tasks. */\n onTask?: (row: BenchmarkTaskRow, done: number, total: number) => void\n /** Lifecycle observability — every spawn/settle of every cell's shots/analysts streams\n * here live (the watchdog/route-auditor seam, passed through to `runAgentic`). */\n hooks?: RuntimeHooks\n /**\n * Model availability check before tasks start.\n *\n * By default, live router workers send one one-token request per unique worker and analyst\n * model. Injected `worker.complete` transports skip the check. Pass `false` to disable it or a\n * callback to check each unique model through a custom transport.\n */\n modelPreflight?:\n | false\n | ((model: string, worker: Readonly<AgenticOptions>, signal: AbortSignal) => Promise<void>)\n /** Maximum time for each model availability check. Default 30 seconds. */\n modelPreflightTimeoutMs?: number\n}\n\nexport interface BenchmarkLift {\n /** Mean of paired deltas (refine − sample). */\n mean: number\n low: number\n high: number\n n: number\n}\n\n/** One strategy's outcome on one task — the per-task cell an optimizer consumes. */\nexport interface BenchmarkCell {\n score: number\n resolved: boolean\n /** The progress curve (refine: score per shot; sample: best-so-far per rollout). */\n progression: number[]\n usd: number\n ms: number\n tokens: { input: number; output: number }\n}\n\nexport interface BenchmarkTaskRow {\n taskId: string\n /** Per-strategy cells; absent when the task errored before completing all strategies. */\n cells?: Record<string, BenchmarkCell>\n /** Per-strategy failures on this task: the strategy competed, threw, and scored an\n * honest zero — it loses, it does not poison the row. The message is kept so a later\n * generation's author can see WHY a candidate died. */\n errors?: Record<string, string>\n /** Why the task was excluded (infra/setup failure) — never silently dropped. */\n error?: string\n}\n\nexport interface BenchmarkStrategySummary {\n /** Mean verifier score (0..1). */\n score: number\n /** Fraction of tasks fully resolved. */\n resolved: number\n /** Mean cost vector per task. */\n usd: number\n ms: number\n}\n\n/** Benchmark output: per-strategy means plus the full per-task × per-strategy losses table an optimizer mines. */\nexport interface BenchmarkReport {\n n: number\n excluded: number\n /** Per-strategy means (keyed by strategy.name). */\n perStrategy: Record<string, BenchmarkStrategySummary>\n /** The full per-task × per-strategy table — the LOSSES an optimizer (GEPA, a\n * strategy-author, an operator) consumes. Includes errored tasks with the reason. */\n perTask: BenchmarkTaskRow[]\n /** The non-dominated strategies on (score ↑, $/task ↓) — collapse-last, per the canon:\n * a strategy that ties on score at half the cost WINS and a scalar would hide it. */\n pareto: string[]\n /** The headline when both `refine` and `sample` ran: paired-bootstrap lift of refine over sample. */\n refineVsSample?: BenchmarkLift\n}\n\n/** Bounded-concurrency map preserving order. */\nasync function pool<T, R>(\n items: readonly T[],\n limit: number,\n fn: (item: T, i: number) => Promise<R>,\n): Promise<R[]> {\n const out: R[] = new Array(items.length)\n let next = 0\n const workers = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {\n while (next < items.length) {\n const i = next\n next += 1\n out[i] = await fn(items[i] as T, i)\n }\n })\n await Promise.all(workers)\n return out\n}\n\nasync function preflightModels(cfg: BenchmarkConfig): Promise<void> {\n if (cfg.modelPreflight === false) return\n if (cfg.worker.complete && !cfg.modelPreflight) return\n\n const models = [...new Set([cfg.worker.model, cfg.worker.analystModel ?? cfg.worker.model])]\n const timeoutMs = cfg.modelPreflightTimeoutMs ?? 30_000\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)\n throw new Error('modelPreflightTimeoutMs must be a positive finite number')\n const check =\n cfg.modelPreflight ??\n (async (model: string, worker: Readonly<AgenticOptions>, signal: AbortSignal) => {\n await routerChatWithUsage(\n {\n routerBaseUrl: worker.routerBaseUrl,\n routerKey: worker.routerKey,\n model,\n },\n [{ role: 'user', content: 'Reply OK.' }],\n { maxTokens: 1, reasoningEffort: 'none', signal },\n )\n })\n\n const results = await Promise.allSettled(\n models.map(async (model) => {\n const controller = new AbortController()\n let timeoutError: Error | undefined\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n await Promise.race([\n check(model, cfg.worker, controller.signal),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n timeoutError = new Error(`timed out after ${timeoutMs} ms`)\n controller.abort(timeoutError)\n reject(timeoutError)\n }, timeoutMs)\n }),\n ])\n } catch (cause) {\n const reported = timeoutError ?? cause\n const message = reported instanceof Error ? reported.message : String(reported)\n throw new Error(`Benchmark model \"${model}\" preflight failed: ${message}`, {\n cause: reported,\n })\n } finally {\n if (timer) clearTimeout(timer)\n }\n }),\n )\n\n const failures = results.flatMap((result) =>\n result.status === 'rejected' ? [result.reason] : [],\n )\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n const message = failures\n .map((failure) => (failure instanceof Error ? failure.message : String(failure)))\n .join('; ')\n throw new AggregateError(failures, message)\n }\n}\n\n/** Run the requested strategies over the tasks, scored by the Environment's own check.\n * Resilient: a task whose rollouts fail (transient infra) is excluded from the stats but\n * reported in `perTask` with the error — never silently dropped. */\nexport async function runBenchmark(cfg: BenchmarkConfig): Promise<BenchmarkReport> {\n const strategies = cfg.strategies ?? [sample, refine]\n const budget = cfg.budget ?? 3\n const concurrency = cfg.concurrency ?? 3\n\n await preflightModels(cfg)\n\n let settled = 0\n const perTask = await pool(cfg.tasks, concurrency, async (task): Promise<BenchmarkTaskRow> => {\n const cells: Record<string, BenchmarkCell> = {}\n const errors: Record<string, string> = {}\n let row: BenchmarkTaskRow\n try {\n // Per-strategy isolation: one strategy throwing (a broken authored candidate, a\n // hallucinated tool name) must not destroy the other strategies' cells for the\n // task. The thrower scores an honest zero — it competed, it failed, it loses.\n for (const s of strategies) {\n try {\n const r = await runAgentic({\n ...cfg.worker,\n surface: cfg.environment,\n task,\n strategy: s,\n budget,\n ...(cfg.hooks ? { hooks: cfg.hooks } : {}),\n })\n cells[s.name] = {\n score: r.score,\n resolved: r.resolved,\n progression: r.progression,\n usd: r.usd,\n ms: r.ms,\n tokens: r.tokens,\n }\n } catch (e) {\n errors[s.name] = e instanceof Error ? e.message.slice(0, 300) : String(e)\n cells[s.name] = {\n score: 0,\n resolved: false,\n progression: [],\n usd: 0,\n ms: 0,\n tokens: { input: 0, output: 0 },\n }\n }\n }\n row = {\n taskId: task.id,\n cells,\n ...(Object.keys(errors).length > 0 ? { errors } : {}),\n }\n } catch (e) {\n row = { taskId: task.id, error: e instanceof Error ? e.message.slice(0, 300) : String(e) }\n }\n settled += 1\n cfg.onTask?.(row, settled, cfg.tasks.length)\n return row\n })\n\n const ok = perTask.filter(\n (r): r is BenchmarkTaskRow & { cells: Record<string, BenchmarkCell> } => !!r.cells,\n )\n const mean = (xs: number[]) => (xs.length ? xs.reduce((s, x) => s + x, 0) / xs.length : 0)\n const perStrategy: Record<string, BenchmarkStrategySummary> = {}\n for (const s of strategies) {\n const cells = ok.map((r) => r.cells[s.name]).filter((c): c is BenchmarkCell => !!c)\n perStrategy[s.name] = {\n score: mean(cells.map((c) => c.score)),\n resolved: mean(cells.map((c) => (c.resolved ? 1 : 0))),\n usd: mean(cells.map((c) => c.usd)),\n ms: mean(cells.map((c) => c.ms)),\n }\n }\n\n const frontier = paretoFrontier(\n Object.entries(perStrategy).map(([name, v]) => ({ name, score: v.score, usd: v.usd })),\n [\n { name: 'score', direction: 'maximize', value: (c) => c.score },\n { name: 'usd', direction: 'minimize', value: (c) => c.usd },\n ],\n ).frontier.map((c) => c.name)\n\n const report: BenchmarkReport = {\n n: ok.length,\n excluded: perTask.length - ok.length,\n perStrategy,\n perTask,\n pareto: frontier,\n }\n const names = strategies.map((s) => s.name)\n if (names.includes('refine') && names.includes('sample') && ok.length >= 2) {\n const b = pairedBootstrap(\n ok.map((r) => r.cells.sample?.score ?? 0),\n ok.map((r) => r.cells.refine?.score ?? 0),\n )\n report.refineVsSample = { mean: b.mean, low: b.low, high: b.high, n: b.n }\n }\n return report\n}\n\n/** Pretty-print a report — the \"free optimization\" verdict, with the cost vector. */\nexport function printBenchmarkReport(report: BenchmarkReport): void {\n const pct = (x: number) => `${(x * 100).toFixed(1)}%`\n const pp = (x: number) => `${x >= 0 ? '+' : ''}${(x * 100).toFixed(1)}pp`\n console.log(\n `\\n=== benchmark · n=${report.n}${report.excluded ? ` (excluded ${report.excluded})` : ''} ===`,\n )\n console.log(\n ` ${'strategy'.padEnd(16)} ${'score'.padStart(7)} ${'resolved'.padStart(9)} ${'$/task'.padStart(8)} ${'s/task'.padStart(7)}`,\n )\n for (const [s, v] of Object.entries(report.perStrategy))\n console.log(\n ` ${(report.pareto.includes(s) ? `${s} *` : s).padEnd(16)} ${pct(v.score).padStart(7)} ${pct(v.resolved).padStart(9)} ${`$${v.usd.toFixed(3)}`.padStart(8)} ${(v.ms / 1000).toFixed(0).padStart(6)}s`,\n )\n if (report.pareto.length) console.log(` * = on the (score, $) Pareto frontier`)\n for (const row of report.perTask)\n if (row.error) console.log(` ⚠ ${row.taskId}: ${row.error.slice(0, 120)}`)\n const l = report.refineVsSample\n if (l) {\n const sig = l.low > 0 ? 'SIGNIF +' : l.high < 0 ? 'SIGNIF -' : 'n.s.'\n console.log(` refine − sample: ${pp(l.mean)} CI [${pp(l.low)}, ${pp(l.high)}] (${sig})`)\n }\n}\n","/**\n * `openSandboxRun` — the ONE harness-agnostic seam for running an agent in a\n * sandbox over a persistent artifact: run it, stream it, RESUME the same session\n * across turns. Domain-agnostic: a coding agent, a research agent, a tax/legal\n * agent — all flow through this; the domain lives only in the `Deliverable<Out>`\n * the caller supplies, never in a per-domain copy of this function.\n *\n * It is a thin facade (NOT a new layer) over code that already exists and is\n * already hardened:\n * - `acquireSandbox` — cold-start / 502-503-504 / gateway-timeout recovery,\n * - `buildBackendOptions` — the harness IS `backend.type` (opencode / codex /\n * claude-code / kimi-code / hermes / pi); the only \"which agent\" knob,\n * - `createSandboxLineage` — `start` mints a session; `resume` continues the\n * SAME server-side session with a fail-loud `assertSessionLive`.\n *\n * The one genuinely-new piece is {@link Deliverable}: it widens the pure\n * `OutputAdapter.parse(events)` to ALSO admit a post-turn read off the box FS —\n * the structural gap that made the bench gates hand-roll `box.fs.read`, because a\n * large produced file (a git diff, a generated document) truncates in the chat\n * stream and a pure events-parser cannot reach the workspace. Per the SDK, a\n * RELATIVE `deliverable.path` resolves from the workspace root and an ABSOLUTE one\n * (e.g. `/tmp/solution.patch`) reads the container filesystem directly — both are\n * valid; pick the one the agent actually wrote to. Avoid `..` traversal segments.\n *\n * What this deliberately does NOT do (so it stays a facade, not slop): no custom\n * reconnect/replay (the SDK + platform own per-session buffering + `Last-Event-ID`);\n * no fork verb (platform CRIU is probe-gated and currently absent — fork lives in\n * `SandboxLineage.fork` behind the capability probe, surfaced only if it returns).\n * It is also distinct from `runAgentRounds`: `runAgentRounds` is the multi-round, driver-driven\n * kernel (fresh box per round, events deliverable); this is a SINGLE rollout +\n * artifact-or-events deliverable + resume over ONE persistent box.\n */\n\nimport type { PromptOptions, SandboxEvent, SandboxInstance } from '@tangle-network/sandbox'\nimport type { RuntimeHooks, RuntimeHookTarget } from '../runtime-hooks'\nimport { notifyRuntimeHookEvent } from '../runtime-hooks'\nimport { probeSandboxCapabilities } from './sandbox-capabilities'\nimport { notifySandboxEventObserver } from './sandbox-events'\nimport { createSandboxLineage, type SandboxLineageHandle } from './sandbox-lineage'\nimport type { AgentRunSpec, SandboxClient } from './types'\nimport { isAbortError, randomSuffix, sleep } from './util'\n\n/**\n * How a typed deliverable `Out` is materialized from a finished turn.\n * - `events` — pure parse over the event array (identical to `OutputAdapter`).\n * - `artifact` — read a file off the box AFTER the turn drains, then map it (+ the\n * events). For diffs/codebases/documents that don't fit the chat\n * stream. `path` relative ⇒ workspace root; absolute ⇒ container FS.\n *\n * @experimental\n */\nexport type Deliverable<Out> =\n | { kind: 'events'; fromEvents: (events: SandboxEvent[]) => Out }\n | { kind: 'artifact'; path: string; fromArtifact: (raw: string, events: SandboxEvent[]) => Out }\n\n/**\n * One finished turn over the artifact. A failed FS read is surfaced in `readError`\n * (never masked as an empty deliverable) so a caller distinguishes \"agent produced\n * nothing\" from a transport/FS fault.\n *\n * @experimental\n */\nexport interface TurnResult<Out> {\n out: Out\n events: SandboxEvent[]\n readError?: string\n}\n\n/**\n * Thrown when a turn is aborted/timed-out mid-settle. Carries the events drained\n * BEFORE the abort fired (and any in-progress `readError`) so an aborted run is\n * DIAGNOSABLE — the caller can tell never-started (`events: []`) from looped\n * (many events, no terminal `result`) from produced-nothing-then-cancelled.\n *\n * `name === 'AbortError'`, so existing `err.name === 'AbortError'` callers (the\n * loop kernel, scope, supervise runtime) keep matching it unchanged.\n *\n * @experimental\n */\nexport class SandboxRunAbortError extends Error {\n override readonly name = 'AbortError'\n /** Events drained from the stream before the abort interrupted the turn. */\n readonly events: SandboxEvent[]\n /** The last artifact read error, if the abort fired during the retry loop. */\n readonly readError?: string\n constructor(events: SandboxEvent[], readError?: string) {\n super('aborted')\n this.events = events\n if (readError !== undefined) this.readError = readError\n }\n}\n\n/** @experimental A live run over ONE persistent artifact (box + session). Close it\n * when done — `close()` tears the box down. */\nexport interface SandboxRun<Out> {\n readonly box: SandboxInstance\n readonly sessionId: string\n /** First turn over the fresh box (mints the session). Throws if already started. */\n start(prompt: string): Promise<TurnResult<Out>>\n /** Continue THE SAME session over THE SAME artifact — a resumed turn/rollout. */\n resume(prompt: string): Promise<TurnResult<Out>>\n close(): Promise<void>\n}\n\n/** Prompt options forwarded to every sandbox prompt turn in this run. The\n * runtime owns `sessionId` and `signal` so callers cannot accidentally break\n * resume or cancellation semantics while still setting backend-level prompt\n * controls such as `timeoutMs`.\n *\n * @experimental\n */\nexport type OpenSandboxRunPromptOptions = Omit<PromptOptions, 'signal' | 'sessionId'>\n\n/** Context available after the box/session exists and before the first prompt is\n * drained. Intended for benchmark-owned workspace setup such as cloning a repo\n * into a fixed path. */\nexport interface OpenSandboxRunBeforeStartContext {\n readonly box: SandboxInstance\n readonly sessionId: string\n readonly signal: AbortSignal\n}\n\n/** @experimental */\nexport interface OpenSandboxRunOptions {\n /** Profile + sandbox env/overrides. `sandboxOverrides.backend.type` is the harness. */\n agentRun: AgentRunSpec<string>\n signal: AbortSignal\n /** Optional execution-scoped observers. Hook failures never fail the run. */\n hooks?: RuntimeHooks\n /** Stable run id for trace joins. Defaults to a short runtime-minted id. */\n runId?: string\n /** Optional benchmark/scenario id carried into emitted hook events. */\n scenarioId?: string\n /** Per-prompt sandbox SDK options forwarded to both `start()` and `resume()`.\n * The runtime still owns the session id and abort signal for each turn. */\n promptOptions?: OpenSandboxRunPromptOptions\n /** Optional pre-start workspace setup. Runs after `lineage.start()` creates the\n * box/session and before the first prompt stream is consumed. A thrown error\n * fails the turn before the agent spends tokens. */\n beforeStart?: (ctx: OpenSandboxRunBeforeStartContext) => Promise<void> | void\n /** Receives a defensive copy of every streamed event. Observer work is\n * non-blocking; synchronous throws and rejected promises never fail the run. */\n onSandboxEvent?: (\n event: SandboxEvent,\n meta: {\n turnIndex: number\n turnKind: 'start' | 'resume'\n agentRunName: string\n },\n ) => void | PromiseLike<void>\n /** Test seam for deterministic hook timestamps. Defaults to `Date.now`. */\n now?: () => number\n /** Bounds box-creation bursts inside lineage fanout. Default from lineage. */\n maxConcurrency?: number\n /** Base backoff (ms) for retrying a transient artifact `fs.read` failure; the i-th\n * retry waits `readRetryDelayMs * i`. Default 1000. Set 0 to disable the wait (tests). */\n readRetryDelayMs?: number\n}\n\n/**\n * Open a sandbox run. Harness-agnostic: the harness lives in\n * `options.agentRun.sandboxOverrides.backend.type`, so opencode/codex/claude-code/\n * kimi-code all flow through this one entrypoint with identical env/auth wiring.\n *\n * @experimental\n */\nexport async function openSandboxRun<Out>(\n client: SandboxClient,\n options: OpenSandboxRunOptions,\n deliverable: Deliverable<Out>,\n): Promise<SandboxRun<Out>> {\n const runId = options.runId ?? `sandbox-run-${randomSuffix()}`\n const now = options.now ?? Date.now\n const agentRunName = options.agentRun.name ?? options.agentRun.profile.name ?? 'agent'\n const capabilities = await probeSandboxCapabilities(client)\n const lineage = createSandboxLineage(client, capabilities, {\n ...(options.maxConcurrency !== undefined ? { maxConcurrency: options.maxConcurrency } : {}),\n })\n let handle: SandboxLineageHandle | undefined\n let started = false\n let runStartedAt: number | undefined\n let failed = false\n let turnCount = 0\n\n function emit(event: {\n target: RuntimeHookTarget\n phase: 'before' | 'after' | 'error'\n timestamp: number\n stepIndex?: number\n payload?: Record<string, unknown>\n }): void {\n notifyRuntimeHookEvent(\n options.hooks,\n {\n id: `${runId}:${event.target}:${event.phase}${\n event.stepIndex === undefined ? '' : `:${event.stepIndex}`\n }`,\n runId,\n scenarioId: options.scenarioId,\n target: event.target,\n phase: event.phase,\n timestamp: event.timestamp,\n stepIndex: event.stepIndex,\n payload: event.payload,\n metadata: { producer: 'openSandboxRun' },\n },\n { signal: options.signal },\n )\n }\n\n const runPayload = (): Record<string, unknown> => ({\n agentName: agentRunName,\n profileName: options.agentRun.profile.name,\n backendType: backendType(options.agentRun),\n deliverableKind: deliverable.kind,\n ...(deliverable.kind === 'artifact' ? { deliverablePath: deliverable.path } : {}),\n ...(handle ? { sessionId: handle.sessionId, sandboxId: handle.box.id } : {}),\n })\n\n const turnPayload = (\n prompt: string,\n turnKind: 'start' | 'resume',\n startedAt: number,\n result?: TurnResult<Out>,\n error?: unknown,\n ): Record<string, unknown> => ({\n ...runPayload(),\n turnKind,\n promptChars: prompt.length,\n promptHash: hashText(prompt),\n ...(result !== undefined || error !== undefined\n ? { durationMs: Math.max(0, now() - startedAt) }\n : {}),\n ...(result\n ? {\n eventCount: result.events.length,\n eventTypes: eventTypeCounts(result.events),\n ...(result.readError !== undefined ? { readError: result.readError } : {}),\n }\n : {}),\n ...(error !== undefined ? { error: errorMessage(error) } : {}),\n })\n\n // `box` is passed in (not read from the closed-over `handle`) so the invariant\n // is type-level, not call-order discipline.\n async function settle(\n box: SandboxInstance,\n events: AsyncIterable<SandboxEvent>,\n turnIndex: number,\n turnKind: 'start' | 'resume',\n ): Promise<TurnResult<Out>> {\n const collected: SandboxEvent[] = []\n // The stream itself can throw an AbortError when the run is cancelled mid-drain;\n // re-throw it carrying the events drained so far so the partial trace is not lost.\n try {\n for await (const ev of events) {\n collected.push(ev)\n notifySandboxEventObserver(ev, options.onSandboxEvent, {\n turnIndex,\n turnKind,\n agentRunName,\n })\n }\n } catch (err) {\n if (isAbortError(err)) throw new SandboxRunAbortError(collected)\n throw err\n }\n if (deliverable.kind === 'events') {\n return { out: deliverable.fromEvents(collected), events: collected }\n }\n if (options.signal.aborted) throw new SandboxRunAbortError(collected)\n let raw = ''\n let readError: string | undefined\n // The data plane can transiently 404 a just-written artifact (write not yet\n // flushed, or an edge-read blip) — retry a few times with backoff before\n // declaring the deliverable empty, so a transient read failure is not recorded\n // as \"the agent produced nothing\".\n const readAttempts = 4\n const readDelayMs = options.readRetryDelayMs ?? 1000\n for (let attempt = 0; attempt < readAttempts; attempt += 1) {\n if (options.signal.aborted) throw new SandboxRunAbortError(collected, readError)\n try {\n raw = await box.fs.read(deliverable.path)\n readError = undefined\n break\n } catch (err) {\n readError = err instanceof Error ? err.message : String(err)\n if (attempt < readAttempts - 1 && readDelayMs > 0)\n await sleep(readDelayMs * (attempt + 1), options.signal)\n }\n }\n return {\n out: deliverable.fromArtifact(raw, collected),\n events: collected,\n ...(readError !== undefined ? { readError } : {}),\n }\n }\n\n return {\n get box(): SandboxInstance {\n if (!handle) throw new Error('openSandboxRun: box unavailable before start()')\n return handle.box\n },\n get sessionId(): string {\n if (!handle) throw new Error('openSandboxRun: sessionId unavailable before start()')\n return handle.sessionId\n },\n async start(prompt) {\n if (started)\n throw new Error(\n 'openSandboxRun: start() already called — use resume() to continue the session',\n )\n started = true\n runStartedAt = now()\n emit({\n target: 'agent.run',\n phase: 'before',\n timestamp: runStartedAt,\n payload: { ...runPayload(), turnCount: 0 },\n })\n const stepIndex = turnCount\n const turnStartedAt = now()\n emit({\n target: 'agent.turn',\n phase: 'before',\n timestamp: turnStartedAt,\n stepIndex,\n payload: turnPayload(prompt, 'start', turnStartedAt),\n })\n // lineage.start uses only spec.profile + sandboxOverrides (the prompt is passed\n // directly, not via taskToPrompt), so the task type is irrelevant here.\n try {\n const r = await lineage.start(\n options.agentRun as AgentRunSpec<unknown>,\n prompt,\n options.signal,\n options.promptOptions,\n )\n handle = r.handle\n await options.beforeStart?.({\n box: handle.box,\n sessionId: handle.sessionId,\n signal: options.signal,\n })\n const result = await settle(handle.box, r.events, stepIndex, 'start')\n turnCount += 1\n emit({\n target: 'agent.turn',\n phase: 'after',\n timestamp: now(),\n stepIndex,\n payload: turnPayload(prompt, 'start', turnStartedAt, result),\n })\n return result\n } catch (error) {\n failed = true\n emit({\n target: 'agent.turn',\n phase: 'error',\n timestamp: now(),\n stepIndex,\n payload: turnPayload(prompt, 'start', turnStartedAt, undefined, error),\n })\n emit({\n target: 'agent.run',\n phase: 'error',\n timestamp: now(),\n payload: { ...runPayload(), turnCount, error: errorMessage(error) },\n })\n throw error\n }\n },\n async resume(prompt) {\n if (!handle) throw new Error('openSandboxRun: resume() called before start()')\n const stepIndex = turnCount\n const turnStartedAt = now()\n emit({\n target: 'agent.turn',\n phase: 'before',\n timestamp: turnStartedAt,\n stepIndex,\n payload: turnPayload(prompt, 'resume', turnStartedAt),\n })\n try {\n const result = await settle(\n handle.box,\n await lineage.continue(handle, prompt, options.signal, options.promptOptions),\n stepIndex,\n 'resume',\n )\n turnCount += 1\n emit({\n target: 'agent.turn',\n phase: 'after',\n timestamp: now(),\n stepIndex,\n payload: turnPayload(prompt, 'resume', turnStartedAt, result),\n })\n return result\n } catch (error) {\n failed = true\n emit({\n target: 'agent.turn',\n phase: 'error',\n timestamp: now(),\n stepIndex,\n payload: turnPayload(prompt, 'resume', turnStartedAt, undefined, error),\n })\n emit({\n target: 'agent.run',\n phase: 'error',\n timestamp: now(),\n payload: { ...runPayload(), turnCount, error: errorMessage(error) },\n })\n throw error\n }\n },\n async close() {\n await lineage.teardown()\n if (runStartedAt !== undefined) {\n emit({\n target: 'agent.run',\n phase: 'after',\n timestamp: now(),\n payload: {\n ...runPayload(),\n turnCount,\n status: failed ? 'error' : 'completed',\n durationMs: Math.max(0, now() - runStartedAt),\n },\n })\n }\n },\n }\n}\n\nfunction backendType<Task>(spec: AgentRunSpec<Task>): unknown {\n const backend = spec.sandboxOverrides?.backend as { type?: unknown } | undefined\n return backend?.type\n}\n\nfunction eventTypeCounts(events: SandboxEvent[]): Record<string, number> {\n const counts: Record<string, number> = {}\n for (const event of events) counts[event.type] = (counts[event.type] ?? 0) + 1\n return counts\n}\n\nfunction hashText(value: string): string {\n let hash = 2166136261\n for (let i = 0; i < value.length; i += 1) {\n hash ^= value.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","/**\n * authorStrategy — the agent-authored layer as a package primitive (software-3.0): an\n * LLM reads a benchmark's per-task LOSSES + the defineStrategy contract and writes a NEW\n * optimization strategy as code; the caller gates it like any human-built candidate\n * (runBenchmark + a frozen holdout).\n *\n * Structurally safe by construction: the authored body composes shot()/critique() and\n * spends through the Supervisor's conserved pool — it can be wrong, but it cannot\n * Goodhart the check (it never sees the verifiers) and it cannot win by overspending.\n *\n * The authored module is written to `outDir` and dynamically imported — run under a\n * TS-capable loader (tsx) since models often emit type annotations.\n */\n\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { ChatClient } from '@tangle-network/agent-eval'\nimport { strategyAuthorMethod } from '../improvement/optimizer-prompt'\nimport type { Strategy } from './strategy'\n\n/** The compressed consumable a skill carries: everything an author needs to emit a loop. */\nexport const strategyAuthorContract = `\nYou author an OPTIMIZATION STRATEGY for an agentic loop system. A strategy decides how to\nspend a compute budget to beat a task's deployable check. You compose exactly two steps:\n\n shot(spec?: { handle?, messages?, steer?, persona?, tools? }): Promise<ShotResult | null>\n Runs ONE worker attempt (a bounded tool loop) over an artifact.\n - omit handle => the shot opens its OWN fresh artifact and closes it after (a sample).\n - pass handle => the shot CONTINUES that artifact (state accumulates across shots).\n - messages => the carried conversation (pass the previous ShotResult.messages to continue).\n - steer => a corrective instruction injected before the shot.\n - persona => { systemPrompt?, model? } — give THIS shot its own role and/or model\n (multi-agent strategies: a researcher shot then an engineer shot, a panel of k\n personas over one budget). On a fresh shot the systemPrompt replaces the task's; on\n a carried conversation it arrives as a hand-off message. Same conserved budget.\n - tools => string[] — restrict THIS shot to a subset of the task's tools by\n name (focus an explore shot on read-only tools, an execute shot on write tools).\n Restriction-only; unknown names make the shot fail. ALWAYS select from\n await listTools(handle) — never hardcode. Omitted => the shot sees every tool.\n ShotResult = { messages, score (0..1 on the task's check), passes, total, completions, toolErrors }\n Returns null if the attempt failed infra-wise.\n\n critique(messages): Promise<string | null>\n A firewalled trace-analyst reads the attempt's trajectory and returns ONE corrective\n instruction (or null when it judges the work complete). Costs ~1 completion.\n\n consult(messages, instruction): Promise<string | null>\n The RAW analyst channel: the same firewalled critic answers YOUR instruction over the\n trajectory verbatim (no reformatting) — use it when you need a specific reply format\n (a decision, a prediction). Costs ~1 completion.\n\n surface.open(task) / surface.close(handle)\n Open a persistent artifact you manage yourself (remember to close in a finally).\n close is idempotent — closing an already-closed handle is a safe no-op.\n\n listTools(handle): Promise<Array<{ name, description? }>>\n The tools THIS task actually offers. TOOL SETS VARY PER TASK — if you restrict a\n shot with \\`tools\\`, you MUST pick names from await listTools(handle); hardcoding\n names from an example kills your shots on every task whose tools differ.\n\nRules:\n- ALWAYS await every shot/critique/surface call — a floating promise that rejects\n crashes the whole benchmark run.\n- Stay within ~budget total shots; every shot/critique spends from a conserved pool.\n- For a FRESH attempt OMIT \\`messages\\` entirely (never pass \\`[]\\` — an empty array is a\n fresh conversation too, but be explicit). To CONTINUE, pass the previous\n ShotResult.messages unchanged.\n- Return { score, resolved, completions, progression, shots } — score = the BEST checkpoint\n you reached (keep-best, never final-state), progression = score after each shot.\n- The module must be EXACTLY this shape (no other imports, no commentary outside code):\n\nimport { defineStrategy } from '@tangle-network/agent-runtime/kernel'\nexport default defineStrategy('your-strategy-name', async ({ surface, task, budget, shot, critique, listTools }) => {\n // your composition (listTools comes from the destructured context — it is NOT a global)\n})\n`\n\nexport interface AuthorStrategyOptions {\n /** The model-call seam (agent-eval `createChatClient`). */\n chat: ChatClient\n model?: string\n /** A NAMED fallback author tried once when the primary call fails or returns no code\n * block (thinking models time out at the edge on long authoring prompts, or return\n * empty content without `maxTokens`). Opt-in — absent means the primary's failure\n * propagates. */\n fallbackModel?: string\n /** The contract text shown to the author. Default `strategyAuthorContract`. The\n * meta-optimization coordinate: a GEPA/skill loop can evolve this text and gate each\n * variant on the same frozen holdout as any strategy. */\n contract?: string\n /** The environment the losses came from (orientation only — never the verifiers). */\n environmentName: string\n /** The per-task losses table (e.g. JSON.stringify(report.perTask)) — the gradient. */\n lossesJson: string\n /** The budget the strategy must respect (shots/width). */\n budget: number\n /** Where the authored module file is written (created if missing). */\n outDir: string\n temperature?: number\n /** Completion cap — required by thinking-model authors that stream reasoning first. */\n maxTokens?: number\n signal?: AbortSignal\n}\n\n/** Static CONTRACT lint over an authored strategy module — the module-boundary\n * enforcement of the harness's two measurement invariants:\n * - author blindness: the only import allowed is the kernel surface. A body that could\n * reach the filesystem, network, or process could read or mutate verifier/artifact\n * state outside the brokered shots, and the harness-verified score would stop\n * meaning \"what the shots achieved\".\n * - conserved dose: no out-of-band compute (fetch/require/eval) — every unit a\n * strategy spends is metered by the Supervisor's pool, which is what makes\n * equal-budget comparisons between strategies valid.\n * A lint, not a sandbox: its job is keeping the benchmark numbers interpretable. */\nexport function assertStrategyContract(code: string): void {\n const allowedImport =\n /^\\s*import\\s+\\{[^}]*\\}\\s+from\\s+['\"]@tangle-network\\/agent-runtime\\/kernel['\"]/\n for (const line of code.split('\\n')) {\n if (/^\\s*import\\s/.test(line) && !allowedImport.test(line)) {\n throw new Error(`authored code rejected: foreign import — ${line.trim().slice(0, 120)}`)\n }\n }\n const banned: Array<[RegExp, string]> = [\n [/\\brequire\\s*\\(/, 'require()'],\n [/\\bimport\\s*\\(/, 'dynamic import()'],\n [/\\beval\\s*\\(/, 'eval()'],\n [/new\\s+Function\\s*\\(/, 'new Function()'],\n [/\\bprocess\\s*[.[]/, 'process access'],\n [/\\bglobalThis\\s*[.[]/, 'globalThis access'],\n [/\\bfetch\\s*\\(/, 'network access'],\n [/child_process|node:fs|node:net|node:http|worker_threads/, 'node builtin access'],\n ]\n for (const [re, what] of banned) {\n if (re.test(code)) throw new Error(`authored code rejected: ${what}`)\n }\n}\n\nexport interface AuthoredStrategy {\n strategy: Strategy\n file: string\n code: string\n}\n\n/** One authoring attempt: chat with the given model, extract the fenced module. Throws\n * when the reply carries no code block. */\nasync function requestAuthoredCode(\n opts: AuthorStrategyOptions,\n model: string | undefined,\n): Promise<string> {\n const res = await opts.chat.chat(\n {\n ...(model ? { model } : {}),\n ...(opts.temperature !== undefined ? { temperature: opts.temperature } : {}),\n ...(opts.maxTokens !== undefined ? { maxTokens: opts.maxTokens } : {}),\n messages: [\n {\n role: 'system',\n content:\n 'You are a senior researcher authoring optimization strategies for agent loops: you read ' +\n 'per-task losses like experimental data, form a mechanism-level hypothesis, and author the ' +\n 'one composition that tests it. Output exactly one fenced ```ts code block and nothing else.',\n },\n {\n role: 'user',\n content: `${opts.contract ?? strategyAuthorContract}\\n\\nBASELINE RESULTS on the \"${opts.environmentName}\" environment (budget=${opts.budget}) — the per-task losses are your gradient:\\n${opts.lossesJson}\\n\\nAuthor ONE new strategy that you expect to beat the baselines on THIS environment at the same budget.\\n${strategyAuthorMethod}\\n\\nOutput only the module code block.`,\n },\n ],\n },\n { ...(opts.signal ? { signal: opts.signal } : {}) },\n )\n const match = res.content.match(/```(?:ts|typescript)?\\s*\\n([\\s\\S]*?)```/)\n if (!match?.[1]) {\n throw new Error(\n `authorStrategy: no code block in the author's reply (model=${model ?? 'default'}): ${res.content.slice(0, 300)}`,\n )\n }\n return match[1]\n}\n\n/** Author + load a strategy from losses. Throws when the author emits no loadable module;\n * with `fallbackModel` set, the named fallback gets one attempt first. */\nexport async function authorStrategy(opts: AuthorStrategyOptions): Promise<AuthoredStrategy> {\n let code: string\n try {\n code = await requestAuthoredCode(opts, opts.model)\n } catch (primaryError) {\n if (!opts.fallbackModel) throw primaryError\n code = await requestAuthoredCode(opts, opts.fallbackModel)\n }\n assertStrategyContract(code)\n mkdirSync(opts.outDir, { recursive: true })\n const file = join(opts.outDir, `authored-${Date.now()}.mts`)\n writeFileSync(file, code)\n const mod = (await import(`file://${file}`)) as { default?: Strategy }\n if (!mod.default || typeof mod.default.driver !== 'function' || !mod.default.name) {\n throw new Error(`authorStrategy: ${file} does not export a default Strategy`)\n }\n return { strategy: mod.default, file, code }\n}\n","/**\n * runStrategyEvolution — the multi-generation strategy search: per generation the system\n * authors a POPULATION of candidate strategies from the current tournament's losses,\n * plays them against the incumbent at equal budget, and advances a champion; one final\n * promotion decision runs on a NEVER-BEFORE-USED holdout slice through `promotionGate`.\n *\n * Measurement invariants (the reasons this design is shaped the way it is):\n * - The author sees TRAIN losses only. The holdout slice is drawn fresh (disjoint task\n * offsets) after all authoring is done — one promotion decision, one untouched slice,\n * so adaptive reuse of evaluation data never enters the verdict.\n * - Every tournament runs at the same per-strategy budget through the conserved pool;\n * candidates cannot win by overspending.\n * - Champion selection within the search is a SEARCH policy (configurable, default\n * cost-aware: ties on score go to the cheapest strategy — a scalar hides a strategy\n * that ties at half the cost). The promotion verdict never comes from search\n * selection; it comes from the gate on the fresh slice.\n * - Every authored artifact's description length (gzip bits) is recorded, so the\n * artifact-complexity-vs-holdout-gap relation is analyzable from any run's report.\n *\n * Lineage fields (`parent`, `generation`) are recorded on every archive node so a\n * descendant-productivity parent-selection policy can be added without changing the\n * report schema; the v1 search authors from the latest tournament's losses.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { gzipSync } from 'node:zlib'\nimport type { ChatClient } from '@tangle-network/agent-eval'\nimport type { RuntimeHooks } from '../runtime-hooks'\nimport { type PromotionVerdict, promotionGate } from './promotion-gate'\nimport {\n type BenchmarkConfig,\n type BenchmarkReport,\n type BenchmarkTaskRow,\n type Environment,\n runBenchmark,\n} from './run-benchmark'\nimport {\n type AgenticOptions,\n type AgenticTask,\n refine,\n type Strategy,\n sample,\n sampleThenRefine,\n} from './strategy'\nimport { authorStrategy, strategyAuthorContract } from './strategy-author'\n\nexport interface EvolutionAuthor {\n /** The model-call seam (agent-eval `createChatClient`). */\n chat: ChatClient\n model?: string\n fallbackModel?: string\n temperature?: number\n maxTokens?: number\n}\n\nexport type ChampionPolicy = 'score' | 'costAware'\n\nexport interface StrategyEvolutionConfig {\n environment: Environment\n /** Task supply by DISJOINT slice: `(offset, n)` must return n tasks unique to that\n * offset range. Train draws [0, trainN); the holdout draws [trainN + holdoutOffset,\n * …) — tasks the search never touched. */\n tasks: (offset: number, n: number) => Promise<AgenticTask[]>\n trainN: number\n holdoutN: number\n /** Extra offset past the train slice for the holdout draw (rotate across runs). */\n holdoutOffset?: number\n worker: AgenticOptions\n /**\n * Model availability check before the first benchmark phase.\n *\n * A successful check is reused for the remaining phases in this evolution run.\n * See `BenchmarkConfig.modelPreflight`.\n */\n modelPreflight?: BenchmarkConfig['modelPreflight']\n /** Maximum time for each model availability check. Default 30 seconds. */\n modelPreflightTimeoutMs?: BenchmarkConfig['modelPreflightTimeoutMs']\n author: EvolutionAuthor\n /** Rollouts (sample) / shots (refine) per strategy per task. Default 3. */\n budget?: number\n concurrency?: number\n /** Author→tournament rounds after gen0. Default 2. */\n generations?: number\n /** Authored candidates per generation. Default 2. */\n populationSize?: number\n /** The gen0 field. Default [sample, refine, sampleThenRefine]. */\n baselines?: Strategy[]\n /** What \"better\" means for PROMOTION. 'score' (default): the candidate must beat the\n * incumbent's score (superiority gate). 'cost': the candidate must prove score\n * NON-INFERIORITY (not worse by more than `scoreTolerance`) plus significant cost\n * savings — the \"same quality, cheaper\" objective. The author is told the objective\n * and sees per-task spend either way. */\n objective?: 'score' | 'cost'\n /** Cost objective: the score CI lower bound must clear −scoreTolerance. Default 0.05. */\n scoreTolerance?: number\n /** Search-side champion selection. Default 'costAware'. */\n champion?: ChampionPolicy\n /** Score band treated as a tie under 'costAware'. Default 0.01. */\n championEpsilon?: number\n /** Where authored modules are written. */\n outDir: string\n /** Promotion-gate evidence floor (paired holdout tasks). */\n minPairedTasks?: number\n /** BAND-AWARE scoring — concentrate the measurement where lift is possible.\n * Holdout: draw `holdoutPoolN` candidate tasks and run `baselines[0]` once at the run\n * budget as an INDEPENDENT reference screen; keep tasks scoring ≤ `maxRefScore`\n * (headroom exists) and take the first `holdoutN`. Band membership is decided before\n * either finalist touches a task and both finalists then face the SAME tasks — the\n * estimand becomes \"paired lift on headroom tasks\", pre-registered by this config.\n * Train: champion selection ignores zero-spread tasks (every field strategy scored\n * identically — zero selection information, pure noise dilution). */\n band?: {\n holdoutPoolN: number\n /** Keep holdout tasks where the reference scores ≤ this. Default 0.99 — drop only\n * tasks the reference already solves fully (no headroom, a candidate can only tie). */\n maxRefScore?: number\n }\n /** What the author learns from a tournament. 'exact' (default) = scores + progressions\n * per task; 'binary' = pass/fail only — the leakage-bounded channel (one bit per cell\n * per generation reaches the author from the evaluation data). */\n lossesDetail?: 'exact' | 'binary'\n /** Reproducer certification (arXiv:2606.11045): when the final champion is AUTHORED,\n * compress it to a short natural-language summary, have a fresh author re-implement\n * from the summary alone (no losses, no code), and score the reproduction on the same\n * holdout. A reproduction gap is an overfitting signal (their detector: 100%\n * sensitivity / 91% specificity in the ML-agent setting) — recorded on the report,\n * never gate-blocking in v1. */\n reproducerCheck?: {\n /** Word budget for the strategy summary. Default 64. */\n summaryMaxWords?: number\n /** Reproduction counts as faithful when reproducedScore ≥ championScore − tolerance.\n * Default 0.05. */\n tolerance?: number\n }\n /** Endurance: write the run state after every completed phase; with `resume`, a\n * restart skips completed phases (authored modules re-imported from their files).\n * Worst case after a mid-run death is re-paying ONE phase, never the run. */\n checkpoint?: {\n path: string\n resume?: boolean\n }\n /** Called before each benchmark phase (gen0, gen1…, band-screen, holdout, reproduce).\n * The seam for environment recycling — no artifacts span phases, so a runner may\n * recreate a wedge-prone environment container here. */\n onPhase?: (phase: string) => Promise<void>\n onTask?: (phase: string, row: BenchmarkTaskRow, done: number, total: number) => void\n hooks?: RuntimeHooks\n}\n\n/** The on-disk phase ledger — everything needed to skip completed phases on resume. */\ninterface EvolutionCheckpoint {\n gen0?: BenchmarkReport\n gen0Champion?: ChampionPick\n generations: EvolutionGeneration[]\n archive: EvolutionArchiveNode[]\n trajectory: Array<{ generation: number; champion: string; score: number; usd: number }>\n holdout?: BenchmarkReport\n verdict?: PromotionVerdict\n band?: EvolutionBandInfo\n}\n\nexport interface ChampionPick {\n name: string\n score: number\n usd: number\n}\n\nexport interface EvolutionCandidate {\n name: string\n file?: string\n gzipBits?: number\n codeChars?: number\n /** Present when this author attempt failed (recorded, never silent). */\n error?: string\n}\n\nexport interface EvolutionGeneration {\n generation: number\n candidates: EvolutionCandidate[]\n report: BenchmarkReport\n champion: ChampionPick\n}\n\nexport interface EvolutionArchiveNode {\n name: string\n source: 'baseline' | 'authored'\n generation: number\n /** The champion whose tournament losses this candidate was authored from. */\n parent?: string\n gzipBits?: number\n file?: string\n /** Latest measured tournament result — 0 until the node's first tournament settles\n * (an authored node is created before its generation's benchmark runs). */\n score: number\n usd: number\n}\n\nexport interface ReproductionCheck {\n /** The compressed strategy description the reproducer implemented from. */\n summary: string\n reproducedName: string\n file?: string\n championHoldoutScore: number\n reproducedHoldoutScore: number\n /** champion − reproduced (positive = the reproduction fell short). */\n gap: number\n /** reproducedScore ≥ championScore − tolerance. A failed reproduction is an\n * overfitting signal: the champion's win did not fit through the summary. */\n reproducible: boolean\n /** Infra failure during reproduction (distinct from a semantic reproduction failure). */\n error?: string\n}\n\nexport interface EvolutionBandInfo {\n /** Tasks screened by the reference on the holdout pool. */\n screened: number\n /** Tasks kept (reference score ≤ maxRefScore) before truncating to holdoutN. */\n inBand: number\n /** Reference scores per screened task (the screening record). */\n refScores: Array<{ taskId: string; score: number }>\n}\n\nexport interface EvolutionReport {\n gen0: BenchmarkReport\n gen0Champion: ChampionPick\n generations: EvolutionGeneration[]\n archive: EvolutionArchiveNode[]\n finalChampion: ChampionPick\n holdout: BenchmarkReport\n verdict: PromotionVerdict\n /** Present when band screening ran — the verdict's estimand is then \"paired lift on\n * headroom tasks\" (band membership fixed by the reference screen, pre-registered). */\n band?: EvolutionBandInfo\n /** Present when reproducerCheck ran (final champion was authored). */\n reproduction?: ReproductionCheck\n /** SEARCH TELEMETRY, not evidence: each entry is that generation's own train-slice\n * re-measurement, so cross-generation deltas mix true drift with run-to-run variance\n * (entries are unpaired across generations). The only evidence-grade comparison in\n * this report is `verdict` — both finalists measured fresh, paired, on the holdout. */\n trajectory: Array<{ generation: number; champion: string; score: number; usd: number }>\n}\n\n/** Strategy means recomputed over the DISCRIMINATING tasks only — tasks where the field\n * strategies did not all score identically. Zero-spread tasks (everyone 1.0, everyone\n * 0.0, everyone tied) carry no selection information; averaging over them dilutes real\n * differences toward zero. Search-side denoising only — the gate never uses this. */\nexport function discriminatingMeans(\n report: BenchmarkReport,\n fieldOrder: string[],\n): Record<string, { score: number; usd: number }> | null {\n const rows = report.perTask.filter((r) => {\n if (!r.cells) return false\n const scores = fieldOrder.map((n) => r.cells?.[n]?.score).filter((s) => s !== undefined)\n if (scores.length < fieldOrder.length) return false\n return Math.max(...scores) - Math.min(...scores) > 0\n })\n if (rows.length === 0) return null\n const out: Record<string, { score: number; usd: number }> = {}\n for (const name of fieldOrder) {\n const cells = rows.map((r) => r.cells?.[name]).filter((c) => !!c)\n out[name] = {\n score: cells.reduce((s, c) => s + c.score, 0) / cells.length,\n usd: cells.reduce((s, c) => s + c.usd, 0) / cells.length,\n }\n }\n return out\n}\n\n/** The champion pick over a means table. 'score' takes the best mean score (ties →\n * field order). 'costAware' treats scores within `epsilon` of the best as tied and\n * takes the cheapest — the (score, $) Pareto rule collapsed to one pick. */\nexport function pickChampion(\n means: Record<string, { score: number; usd: number }>,\n fieldOrder: string[],\n policy: ChampionPolicy,\n epsilon: number,\n): ChampionPick {\n const entries = fieldOrder\n .map((name) => ({ name, summary: means[name] }))\n .filter((e): e is { name: string; summary: NonNullable<typeof e.summary> } => !!e.summary)\n if (entries.length === 0)\n throw new Error('pickChampion: the means table carries none of the field strategies')\n const best = Math.max(...entries.map((e) => e.summary.score))\n const pick =\n policy === 'score'\n ? entries.find((e) => e.summary.score === best)\n : entries\n .filter((e) => e.summary.score >= best - epsilon)\n .sort((a, b) => a.summary.usd - b.summary.usd || b.summary.score - a.summary.score)[0]\n if (!pick) throw new Error('pickChampion: empty pick (unreachable)')\n return { name: pick.name, score: pick.summary.score, usd: pick.summary.usd }\n}\n\n/** Search-side champion selection over a tournament report. */\nexport function selectChampion(\n report: BenchmarkReport,\n fieldOrder: string[],\n policy: ChampionPolicy,\n epsilon: number,\n): ChampionPick {\n return pickChampion(report.perStrategy, fieldOrder, policy, epsilon)\n}\n\nconst fieldSummary = (archive: EvolutionArchiveNode[]): string =>\n archive\n .map(\n (n) =>\n `- ${n.name} (${n.source}, gen ${n.generation}, last score ${(n.score * 100).toFixed(0)}%)`,\n )\n .join('\\n')\n\n/** The author-visible losses: EVERY train task in compact form (score/resolved/\n * progression per cell). A pretty-printed prefix slice would hide the tail tasks from\n * the author and bias which failure modes it can target; the hard cap stays only as a\n * guard against enormous fields. */\nconst compactLosses = (report: BenchmarkReport, detail: 'exact' | 'binary'): string => {\n const r2 = (x: number) => Math.round(x * 100) / 100\n const rows = report.perTask.map((row) =>\n row.cells\n ? {\n task: row.taskId,\n ...(row.errors\n ? {\n errors: Object.fromEntries(\n Object.entries(row.errors).map(([n, msg]) => [n, msg.slice(0, 100)]),\n ),\n }\n : {}),\n cells: Object.fromEntries(\n Object.entries(row.cells).map(([name, c]) => [\n name,\n // 'binary' is the leakage-bounded channel: the author learns pass/fail per\n // task and nothing else — the per-generation leak from the evaluation data\n // is capped at one bit per cell (arXiv:2606.11045 measured that exploration\n // survives this; whether AUTHORING does is the E1-coarse A/B).\n detail === 'binary'\n ? { resolved: c.resolved, usd: Math.round(c.usd * 10000) / 10000 }\n : {\n score: r2(c.score),\n resolved: c.resolved,\n usd: Math.round(c.usd * 10000) / 10000,\n progression: (c.progression ?? []).map(r2),\n },\n ]),\n ),\n }\n : { task: row.taskId, error: row.error?.slice(0, 80) },\n )\n return JSON.stringify(rows).slice(0, 12000)\n}\n\n/** Rename a strategy AND the deliverable's mode label its driver closes over — report\n * keys and observability labels must never diverge for a renamed candidate. */\nfunction renameStrategy(orig: Strategy, unique: string): Strategy {\n if (orig.name === unique) return orig\n return {\n name: unique,\n driver: (s, t, o, b) => {\n const agent = orig.driver(s, t, o, b)\n return {\n ...agent,\n name: unique,\n act: async (task, scope) => {\n const out = await agent.act(task, scope)\n if (out.kind !== 'done') return out\n const deliverable = { ...(out.deliverable as Record<string, unknown>), mode: unique }\n return { ...out, deliverable }\n },\n }\n },\n }\n}\n\n/** Multi-generation strategy search: author candidates from tournament losses, play them against the incumbent at equal budget, promote via `promotionGate` on an untouched holdout slice. */\nexport async function runStrategyEvolution(cfg: StrategyEvolutionConfig): Promise<EvolutionReport> {\n const budget = cfg.budget ?? 3\n const concurrency = cfg.concurrency ?? 3\n const generations = cfg.generations ?? 2\n const populationSize = cfg.populationSize ?? 2\n const baselines = cfg.baselines ?? [sample, refine, sampleThenRefine]\n const policy = cfg.champion ?? 'costAware'\n // FUNNEL ALIGNMENT: the search-side tie band must be no stricter than the promotion\n // criterion, or the gate never sees the candidates it was designed to judge. Under the\n // cost objective the gate accepts score within −scoreTolerance; a candidate that the\n // gate would promote must therefore be able to DISPLACE in search at that same band.\n const epsilon =\n cfg.championEpsilon ?? (cfg.objective === 'cost' ? (cfg.scoreTolerance ?? 0.05) : 0.01)\n const byName = new Map<string, Strategy>(baselines.map((s) => [s.name, s]))\n const codeByName = new Map<string, string>()\n\n // Endurance: the phase ledger. Resume refuses a checkpoint from a different design\n // (silently mixing configs would corrupt every downstream comparison).\n const fingerprint = {\n trainN: cfg.trainN,\n holdoutN: cfg.holdoutN,\n budget,\n generations,\n populationSize,\n }\n let ckpt: EvolutionCheckpoint | undefined\n if (cfg.checkpoint?.resume && existsSync(cfg.checkpoint.path)) {\n const raw = JSON.parse(readFileSync(cfg.checkpoint.path, 'utf8')) as EvolutionCheckpoint & {\n fingerprint?: typeof fingerprint\n }\n if (JSON.stringify(raw.fingerprint) !== JSON.stringify(fingerprint)) {\n throw new Error(\n `evolution resume: checkpoint design mismatch — checkpoint ${JSON.stringify(raw.fingerprint)} vs config ${JSON.stringify(fingerprint)}; delete ${cfg.checkpoint.path} or match the config`,\n )\n }\n ckpt = raw\n }\n const save = (state: EvolutionCheckpoint): void => {\n if (cfg.checkpoint)\n writeFileSync(cfg.checkpoint.path, JSON.stringify({ ...state, fingerprint }, null, 1))\n }\n\n let modelsPreflighted = false\n const bench = async (phase: string, tasks: AgenticTask[], strategies: Strategy[]) => {\n await cfg.onPhase?.(phase)\n const report = await runBenchmark({\n environment: cfg.environment,\n tasks,\n worker: cfg.worker,\n strategies,\n budget,\n concurrency,\n modelPreflight: modelsPreflighted ? false : cfg.modelPreflight,\n modelPreflightTimeoutMs: cfg.modelPreflightTimeoutMs,\n ...(cfg.onTask\n ? { onTask: (row, done, total) => cfg.onTask?.(phase, row, done, total) }\n : {}),\n ...(cfg.hooks ? { hooks: cfg.hooks } : {}),\n })\n modelsPreflighted = true\n return report\n }\n\n const train = await cfg.tasks(0, cfg.trainN)\n // One probe round-trip lists the domain's tools so the author can write tool-focused\n // shots (shot({tools})) — names + descriptions, never the implementations.\n const probeTask = train[0]\n if (!probeTask) throw new Error('runStrategyEvolution: empty train slice')\n const probe = await cfg.environment.open(probeTask)\n let toolCatalog: string\n try {\n const tools = await cfg.environment.tools(probeTask, probe)\n toolCatalog = tools\n .map(\n (t) =>\n `- ${t.function.name}${t.function.description ? ` — ${t.function.description.slice(0, 120)}` : ''}`,\n )\n .join('\\n')\n } finally {\n await cfg.environment.close(probe)\n }\n const gen0 = ckpt?.gen0 ?? (await bench('gen0', train, baselines))\n const archive: EvolutionArchiveNode[] = ckpt?.archive\n ? [...ckpt.archive]\n : baselines.map((s) => ({\n name: s.name,\n source: 'baseline' as const,\n generation: 0,\n score: gen0.perStrategy[s.name]?.score ?? 0,\n usd: gen0.perStrategy[s.name]?.usd ?? 0,\n }))\n const gen0Champion =\n ckpt?.gen0Champion ??\n selectChampion(\n gen0,\n baselines.map((s) => s.name),\n policy,\n epsilon,\n )\n\n const generationRows: EvolutionGeneration[] = ckpt?.generations ? [...ckpt.generations] : []\n const trajectory = ckpt?.trajectory\n ? [...ckpt.trajectory]\n : [\n {\n generation: 0,\n champion: gen0Champion.name,\n score: gen0Champion.score,\n usd: gen0Champion.usd,\n },\n ]\n // Re-import resumed authored modules from their files (the collision rename re-applied\n // so report keys stay stable across the restart).\n for (const row of generationRows) {\n for (const c of row.candidates) {\n if (!c.file || c.error) continue\n const mod = (await import(`file://${c.file}`)) as { default?: Strategy }\n if (!mod.default || typeof mod.default.driver !== 'function') {\n throw new Error(\n `evolution resume: ${c.file} no longer exports a Strategy — cannot restore \"${c.name}\"`,\n )\n }\n byName.set(c.name, renameStrategy(mod.default, c.name))\n codeByName.set(c.name, readFileSync(c.file, 'utf8'))\n }\n }\n let authoredOk = generationRows.reduce(\n (n, row) => n + row.candidates.filter((c) => !c.error).length,\n 0,\n )\n const lastRow = generationRows[generationRows.length - 1]\n let incumbent = lastRow ? lastRow.champion : gen0Champion\n let latestReport = lastRow ? lastRow.report : gen0\n if (!ckpt) save({ gen0, gen0Champion, generations: generationRows, archive, trajectory })\n\n for (let g = generationRows.length + 1; g <= generations; g += 1) {\n const lossesJson = compactLosses(latestReport, cfg.lossesDetail ?? 'exact')\n const candidates: EvolutionCandidate[] = []\n const newStrategies: Strategy[] = []\n for (let i = 0; i < populationSize; i += 1) {\n const objectiveNote =\n cfg.objective === 'cost'\n ? `\\n\\nYOUR OBJECTIVE: match or exceed the incumbent's SCORE while spending LESS (the losses include usd per task). Promotion requires proven score non-inferiority PLUS significant cost savings — a strategy that ties the score at half the cost WINS; a cheaper strategy that loses score by more than ${((cfg.scoreTolerance ?? 0.05) * 100).toFixed(0)}pp LOSES.`\n : ''\n const contract = `${strategyAuthorContract}${objectiveNote}\\n\\nEXAMPLE TOOLS FROM ONE TASK (tool sets VARY per task on this domain — a strategy MUST select tool names from await listTools(handle) at runtime; hardcoding these example names will zero your score on most tasks):\\n${toolCatalog}\\n\\nSTRATEGIES ALREADY IN THE TOURNAMENT (author something MEANINGFULLY different — a new composition, not a rename):\\n${fieldSummary(archive)}\\n\\nYou are authoring candidate ${i + 1} of ${populationSize} this generation; explore a distinct region of the strategy space from your siblings.`\n try {\n const authored = await authorStrategy({\n chat: cfg.author.chat,\n ...(cfg.author.model ? { model: cfg.author.model } : {}),\n ...(cfg.author.fallbackModel ? { fallbackModel: cfg.author.fallbackModel } : {}),\n ...(cfg.author.temperature !== undefined ? { temperature: cfg.author.temperature } : {}),\n ...(cfg.author.maxTokens !== undefined ? { maxTokens: cfg.author.maxTokens } : {}),\n contract,\n environmentName: cfg.environment.name,\n lossesJson,\n budget,\n outDir: cfg.outDir,\n })\n // A name collision with the archive would silently overwrite a report cell —\n // disambiguate the strategy key. The defineStrategy driver closes over the\n // ORIGINAL name for its deliverable's `mode` label, so the wrapper must rename\n // the returned agent AND its deliverable or observability labels diverge from\n // the report keys.\n const unique = byName.has(authored.strategy.name)\n ? `${authored.strategy.name}-g${g}c${i + 1}`\n : authored.strategy.name\n const strategy: Strategy = renameStrategy(authored.strategy, unique)\n byName.set(unique, strategy)\n codeByName.set(unique, authored.code)\n newStrategies.push(strategy)\n archive.push({\n name: unique,\n source: 'authored',\n generation: g,\n parent: incumbent.name,\n gzipBits: gzipSync(Buffer.from(authored.code)).length * 8,\n file: authored.file,\n score: 0,\n usd: 0,\n })\n candidates.push({\n name: unique,\n file: authored.file,\n gzipBits: gzipSync(Buffer.from(authored.code)).length * 8,\n codeChars: authored.code.length,\n })\n authoredOk += 1\n } catch (e) {\n candidates.push({\n name: `(author-failed g${g}c${i + 1})`,\n error: e instanceof Error ? e.message.slice(0, 300) : String(e),\n })\n }\n }\n\n const incumbentStrategy = byName.get(incumbent.name)\n if (!incumbentStrategy)\n throw new Error(`evolution: incumbent \"${incumbent.name}\" missing from the field`)\n const field = [incumbentStrategy, ...newStrategies]\n const report = await bench(`gen${g}`, train, field)\n for (const node of archive) {\n const cell = report.perStrategy[node.name]\n if (cell) {\n node.score = cell.score\n node.usd = cell.usd\n }\n }\n // With banding on, the champion is picked over the DISCRIMINATING tasks (any\n // zero-spread task carries no selection information). Falls back to full means\n // when every task tied — a degenerate generation, not an error.\n const fieldNames = field.map((s) => s.name)\n const means = cfg.band\n ? (discriminatingMeans(report, fieldNames) ?? report.perStrategy)\n : report.perStrategy\n const champion = pickChampion(means, fieldNames, policy, epsilon)\n generationRows.push({ generation: g, candidates, report, champion })\n trajectory.push({\n generation: g,\n champion: champion.name,\n score: champion.score,\n usd: champion.usd,\n })\n incumbent = champion\n latestReport = report\n save({ gen0, gen0Champion, generations: generationRows, archive, trajectory })\n }\n\n if (authoredOk === 0) {\n throw new Error(\n 'runStrategyEvolution: every author attempt failed across all generations — no search happened; see the candidates[].error entries',\n )\n }\n\n // The promotion decision: ONE fresh slice the search never touched, drawn after all\n // authoring is done. The gate, not the search policy, owns this verdict.\n const holdoutOffset = cfg.trainN + (cfg.holdoutOffset ?? 0)\n let holdoutTasks: AgenticTask[] = []\n let bandInfo: EvolutionBandInfo | undefined\n if (ckpt?.holdout && ckpt.verdict) {\n // Gate already settled before the restart. Reconstruct the exact gate tasks only if\n // the reproducer still needs to bench on them.\n bandInfo = ckpt.band\n if (cfg.reproducerCheck && codeByName.has(incumbent.name)) {\n const pool = await cfg.tasks(holdoutOffset, cfg.band?.holdoutPoolN ?? cfg.holdoutN)\n const gateIds = new Set(ckpt.holdout.perTask.map((r) => r.taskId))\n holdoutTasks = pool.filter((t) => gateIds.has(t.id))\n }\n } else if (cfg.band) {\n // Reference screening: baselines[0] runs once over the pool; tasks it already fully\n // solves carry no headroom (a candidate can only tie there) and are dropped. The\n // screen is independent of both finalists' gate runs — band membership is fixed\n // before either touches a task, and both then face the SAME kept tasks.\n const maxRef = cfg.band.maxRefScore ?? 0.99\n const reference = baselines[0]\n if (!reference)\n throw new Error('evolution band: baselines[0] required as the screening reference')\n const pool = await cfg.tasks(holdoutOffset, cfg.band.holdoutPoolN)\n const screen = await bench('band-screen', pool, [reference])\n const refScores = screen.perTask\n .filter((r) => r.cells?.[reference.name])\n .map((r) => ({ taskId: r.taskId, score: r.cells?.[reference.name]?.score ?? 0 }))\n const inBandIds = new Set(refScores.filter((r) => r.score <= maxRef).map((r) => r.taskId))\n const kept = pool.filter((t) => inBandIds.has(t.id))\n if (kept.length < cfg.holdoutN) {\n throw new Error(\n `evolution band: only ${kept.length}/${cfg.holdoutN} holdout tasks have headroom (pool ${cfg.band.holdoutPoolN}, reference \"${reference.name}\" ≤ ${maxRef}) — widen holdoutPoolN or raise maxRefScore`,\n )\n }\n holdoutTasks = kept.slice(0, cfg.holdoutN)\n bandInfo = { screened: refScores.length, inBand: kept.length, refScores }\n } else {\n holdoutTasks = await cfg.tasks(holdoutOffset, cfg.holdoutN)\n }\n let holdout: BenchmarkReport\n let verdict: PromotionVerdict\n if (ckpt?.holdout && ckpt.verdict) {\n holdout = ckpt.holdout\n verdict = ckpt.verdict\n } else {\n const finalists = [...new Set([gen0Champion.name, incumbent.name])]\n .map((n) => byName.get(n))\n .filter((s): s is Strategy => !!s)\n holdout = await bench('holdout', holdoutTasks, finalists)\n verdict = promotionGate({\n report: holdout,\n incumbent: gen0Champion.name,\n candidate: incumbent.name,\n ...(cfg.objective === 'cost'\n ? {\n mode: 'non-inferiority' as const,\n ...(cfg.scoreTolerance !== undefined ? { scoreTolerance: cfg.scoreTolerance } : {}),\n }\n : {}),\n ...(cfg.minPairedTasks !== undefined ? { minPairedTasks: cfg.minPairedTasks } : {}),\n })\n save({\n gen0,\n gen0Champion,\n generations: generationRows,\n archive,\n trajectory,\n holdout,\n verdict,\n ...(bandInfo ? { band: bandInfo } : {}),\n })\n }\n\n let reproduction: ReproductionCheck | undefined\n const championCode = codeByName.get(incumbent.name)\n if (cfg.reproducerCheck && championCode) {\n const words = cfg.reproducerCheck.summaryMaxWords ?? 64\n const tolerance = cfg.reproducerCheck.tolerance ?? 0.05\n const championHoldoutScore = holdout.perStrategy[incumbent.name]?.score ?? 0\n try {\n const summaryRes = await cfg.author.chat.chat({\n ...(cfg.author.model ? { model: cfg.author.model } : {}),\n temperature: 0.2,\n maxTokens: 512,\n messages: [\n {\n role: 'system',\n content: `Summarize the optimization strategy implemented by this code in at most ${words} words. Describe the COMPOSITION (shots, critique, artifact handling, restarts, stopping) — not the code. Output only the summary.`,\n },\n { role: 'user', content: championCode },\n ],\n })\n const summary = summaryRes.content.trim()\n // The reproducer sees the summary and the contract — never the losses, never the\n // original code. If its implementation matches the champion on the SAME holdout,\n // the champion's win fits through the summary and cannot be holdout-specific.\n const reproduced = await authorStrategy({\n chat: cfg.author.chat,\n ...(cfg.author.model ? { model: cfg.author.model } : {}),\n ...(cfg.author.fallbackModel ? { fallbackModel: cfg.author.fallbackModel } : {}),\n ...(cfg.author.maxTokens !== undefined ? { maxTokens: cfg.author.maxTokens } : {}),\n temperature: 0.2,\n contract: `${strategyAuthorContract}\\n\\nIMPLEMENT EXACTLY THIS STRATEGY (a colleague's description — do not invent a different approach):\\n${summary}`,\n environmentName: cfg.environment.name,\n lossesJson: '[]',\n budget,\n outDir: cfg.outDir,\n })\n const reproStrategy: Strategy = {\n name: `${incumbent.name}-reproduced`,\n driver: reproduced.strategy.driver,\n }\n const reproReport = await bench('reproduce', holdoutTasks, [reproStrategy])\n const reproducedHoldoutScore = reproReport.perStrategy[reproStrategy.name]?.score ?? 0\n reproduction = {\n summary,\n reproducedName: reproStrategy.name,\n file: reproduced.file,\n championHoldoutScore,\n reproducedHoldoutScore,\n gap: championHoldoutScore - reproducedHoldoutScore,\n reproducible: reproducedHoldoutScore >= championHoldoutScore - tolerance,\n }\n } catch (e) {\n reproduction = {\n summary: '',\n reproducedName: '',\n championHoldoutScore,\n reproducedHoldoutScore: 0,\n gap: championHoldoutScore,\n reproducible: false,\n error: e instanceof Error ? e.message.slice(0, 300) : String(e),\n }\n }\n }\n\n return {\n gen0,\n gen0Champion,\n generations: generationRows,\n archive,\n finalChampion: incumbent,\n holdout,\n verdict,\n ...(bandInfo ? { band: bandInfo } : {}),\n ...(reproduction ? { reproduction } : {}),\n trajectory,\n }\n}\n","/**\n * `streamAgentTurn` — the ONE run-a-turn event-stream contract over every\n * execution substrate: a sandbox box (`SandboxInstance.streamPrompt`), a\n * one-shot `Executor` (cli-bridge / router / BYO, via `ExecutorFactory`), and\n * an in-process `AgentExecutionBackend` (the `resolveAgentBackend` output).\n *\n * One function, one vocabulary: every backend kind yields the existing\n * `RuntimeStreamEvent` union incrementally and ALWAYS terminates with a\n * `final` event whose `text` is the turn's final text and whose\n * `metadata.tokenUsage` / `metadata.costUsd` / `metadata.model` carry the\n * turn's metered usage. `collectAgentTurn` drains a stream into that terminal\n * summary plus the full event list.\n *\n * This is a UNIFICATION seam, not a new stream parser — each kind is a thin\n * adapter over code that already exists and is already hardened:\n * - `box` — `mapSandboxEvent` + `extractLlmCallEvent` (sandbox-events.ts)\n * project the sandbox event stream; nothing is re-mapped here.\n * - `executor` — `inlineSandboxClient` (the ONE executor→box adapter) turns\n * the factory into a box, then the box path drives it. The\n * executor's settle/teardown lifecycle stays in that adapter.\n * - `chat` — the backend's own `stream()` surface, normalized by\n * `normalizeBackendStreamEvent` (the same projection\n * `runAgentTaskStream` applies).\n *\n * Distinct from `openSandboxRun` (box-only, session resume over one persistent\n * artifact, raw `SandboxEvent` deliverables) and from `runAgentTaskStream`\n * (full task lifecycle: knowledge preflight, session store, resume). This is\n * the minimal turn primitive underneath both worlds: prompt in, one normalized\n * event stream out, terminal result+usage guaranteed on every non-thrown path.\n *\n * Stream envelope: `backend_start` → incremental events → (`backend_error` on\n * failure) → `final`. A caller-initiated abort terminates with\n * `final.status: 'aborted'`; an expired `timeoutMs` deadline with\n * `final.status: 'failed'` — so cancellation stays distinguishable from a\n * blown deadline.\n *\n * Mid-stream lifecycle work needs NO extra API: the generator is pull-based,\n * so the producer is suspended between yields and resumes only when the caller\n * pulls again. A consumer can therefore run arbitrary async work between\n * events — sync state on each `tool_result`, decide a no-op retry after\n * draining, run a pre-`done` flush when it receives `final` and BEFORE it\n * forwards its own terminal event downstream. The interleaving is guaranteed\n * (and locked by test): nothing is produced past the event the caller is\n * holding.\n *\n * @experimental\n */\n\nimport { scoreKnowledgeReadiness } from '@tangle-network/agent-eval'\nimport type { PromptOptions, SandboxEvent, SandboxInstance } from '@tangle-network/sandbox'\nimport { normalizeBackendStreamEvent } from '../backends'\nimport { BackendTransportError } from '../errors'\nimport { newRuntimeSession, nowIso } from '../sessions'\nimport type {\n AgentExecutionBackend,\n AgentTaskSpec,\n AgentTaskStatus,\n BackendErrorDetail,\n RuntimeSession,\n RuntimeStreamEvent,\n} from '../types'\nimport { inlineSandboxClient } from './inline-sandbox-client'\nimport { createSandboxToolPartState, mapSandboxEvent, mapSandboxToolEvent } from './sandbox-events'\nimport type { ExecutorFactory } from './supervise/types'\n\n/**\n * The execution substrate one turn runs on — a closed discriminated union over\n * the three stream surfaces the runtime already owns.\n *\n * @experimental\n */\nexport type AgentTurnBackend =\n | {\n /** A live sandbox box: the turn is one `box.streamPrompt(prompt)` call. */\n kind: 'box'\n box: SandboxInstance\n /**\n * Per-turn `PromptOptions` forwarded verbatim to `streamPrompt`\n * (`sessionId`, `turnId`, `model`, `backend` profile, `timeoutMs`, …).\n * The turn's derived abort signal (caller `signal` + `timeoutMs`\n * deadline) is always installed as `signal` — pass cancellation through\n * `StreamAgentTurnOptions`, not here.\n */\n options?: Omit<PromptOptions, 'signal'>\n /** Model label stamped on cost-only `llm_call` events. Default `'agent'`. */\n agentRunName?: string\n }\n | {\n /**\n * A one-shot `Executor` (cli-bridge / router / BYO): the factory is\n * instantiated fresh for the turn via `inlineSandboxClient`, run once on\n * the prompt, and torn down — the same per-spawn lifecycle the supervise\n * runtime gives it.\n */\n kind: 'executor'\n factory: ExecutorFactory<unknown>\n /** Model label stamped on cost-only `llm_call` events. Default `'agent'`. */\n agentRunName?: string\n }\n | {\n /**\n * An in-process `AgentExecutionBackend` (`resolveAgentBackend` output or\n * any custom backend): the turn is one `backend.stream()` call.\n */\n kind: 'chat'\n backend: AgentExecutionBackend\n }\n\n/** @experimental */\nexport interface StreamAgentTurnOptions {\n /** Caller-initiated cancellation. Terminates the stream with `final.status: 'aborted'`. */\n signal?: AbortSignal\n /**\n * Wall-clock deadline for the whole turn in ms. An expired deadline aborts\n * the backend and terminates the stream with `final.status: 'failed'`\n * (a blown deadline is a turn failure, not a caller cancellation).\n */\n timeoutMs?: number\n /**\n * Opt-in tool-part projection for box and executor backends: sandbox tool\n * parts additionally surface in-stream as\n * `tool_call` / `tool_result` events (`mapSandboxToolEvent`), so a consumer\n * rendering tool activity needs no bespoke sandbox-event parser. Default\n * off — the stream vocabulary existing consumers see is unchanged. No-op\n * for the `chat` kind (its backend emits `RuntimeStreamEvent`s directly,\n * tool events included when the backend produces them).\n */\n preserveToolParts?: boolean\n /**\n * Raw-event tap for box-kind backends: called (and awaited) with every\n * unmapped `SandboxEvent` BEFORE it is projected, so a consumer can read\n * parts the chat-UX projection drops (part ids, step markers, custom\n * backend events) without forking the mapper. Purely observational — it\n * cannot alter the mapped stream. Never called for the `chat` kind, which\n * has no sandbox events.\n */\n onRawEvent?: (event: SandboxEvent) => void | Promise<void>\n}\n\n/**\n * Metered usage of one turn, summed over every cost-bearing event the backend\n * emitted. `input`/`output` are token counts (0 when the backend reported\n * none — the honest sum, never a fabricated estimate). `costUsd`/`model` are\n * present only when the backend actually reported them.\n *\n * @experimental\n */\nexport interface AgentTurnUsage {\n input: number\n output: number\n costUsd?: number\n model?: string\n}\n\n/**\n * A drained turn: the terminal summary plus every event the stream yielded.\n * `status`/`error` mirror the terminal `final` event so a failed or aborted\n * turn stays inspectable without re-scanning `events`.\n *\n * @experimental\n */\nexport interface CollectedAgentTurn {\n finalText: string\n usage: AgentTurnUsage\n events: RuntimeStreamEvent[]\n status: AgentTaskStatus\n error?: BackendErrorDetail\n}\n\n/** Mutable per-turn accumulator threaded through the backend adapters. */\ninterface TurnAccumulator {\n /** Concatenated incremental text (`text_delta` events). */\n deltaText: string\n /** Final text read off a terminal `result`/`done`/`final` event, when the\n * backend emitted one. Preferred over `deltaText` for box streams, whose\n * `message.part.updated` fallback carries running accumulations. */\n terminalText?: string\n input: number\n output: number\n costUsd: number\n model?: string\n}\n\n/**\n * Run ONE agent turn on any backend kind and stream its events. Yields the\n * `RuntimeStreamEvent` vocabulary incrementally and always ends with a `final`\n * event carrying the turn's text and usage (`metadata.tokenUsage`,\n * `metadata.costUsd?`, `metadata.model?`) — on success, failure, abort, and\n * timeout alike. The generator never throws; failures surface in-band as\n * `backend_error` + `final` with a typed `error` detail.\n *\n * @experimental\n */\nexport async function* streamAgentTurn(\n backend: AgentTurnBackend,\n prompt: string,\n opts: StreamAgentTurnOptions = {},\n): AsyncGenerator<RuntimeStreamEvent> {\n const label = backend.kind === 'chat' ? backend.backend.kind : backend.kind\n const task: AgentTaskSpec = { id: `turn-${crypto.randomUUID()}`, intent: prompt }\n const acc: TurnAccumulator = { deltaText: '', input: 0, output: 0, costUsd: 0 }\n const deadline = deriveTurnSignal(opts.signal, opts.timeoutMs ?? 0)\n\n let session: RuntimeSession | undefined\n try {\n session = await startTurnSession(backend, task, prompt, deadline.signal, label)\n yield { type: 'backend_start', task, session, backend: label, timestamp: nowIso() }\n\n const inner =\n backend.kind === 'chat'\n ? driveChatTurn(backend.backend, task, session, prompt, deadline.signal, acc)\n : driveBoxTurn(\n backend.kind === 'executor'\n ? await inlineSandboxClient(backend.factory).create()\n : backend.box,\n prompt,\n deadline.signal,\n backend.agentRunName ?? 'agent',\n acc,\n {\n ...(backend.kind !== 'executor' && backend.options\n ? { options: backend.options }\n : {}),\n preserveToolParts: opts.preserveToolParts === true,\n ...(opts.onRawEvent ? { onRawEvent: opts.onRawEvent } : {}),\n },\n )\n for await (const event of inner) {\n yield event\n throwIfAborted(deadline.signal)\n }\n\n yield buildFinalEvent(task, session, acc, { status: 'completed', reason: 'turn completed' })\n } catch (err) {\n const callerAborted = opts.signal?.aborted === true\n const status: AgentTaskStatus = callerAborted ? 'aborted' : 'failed'\n const message = err instanceof Error ? err.message : String(err)\n const error: BackendErrorDetail =\n err instanceof BackendTransportError\n ? { kind: 'transport', message, status: err.status, body: err.body }\n : { kind: 'backend', message }\n yield {\n type: 'backend_error',\n task,\n ...(session ? { session } : {}),\n backend: label,\n message,\n recoverable: !callerAborted,\n error,\n timestamp: nowIso(),\n }\n yield buildFinalEvent(task, session, acc, { status, reason: message, error })\n } finally {\n deadline.dispose()\n }\n}\n\n/**\n * Drain a `streamAgentTurn` stream (or any `RuntimeStreamEvent` stream that\n * honors its terminal contract) into the turn summary plus the full event\n * list. Fail-loud: throws when the stream ends without a terminal `final`\n * event — a stream that violates the contract must not read as an empty turn.\n *\n * @experimental\n */\nexport async function collectAgentTurn(\n stream: AsyncIterable<RuntimeStreamEvent>,\n): Promise<CollectedAgentTurn> {\n const events: RuntimeStreamEvent[] = []\n for await (const event of stream) events.push(event)\n const final = events.at(-1)\n if (final?.type !== 'final') {\n throw new Error(\n `collectAgentTurn: stream ended without a terminal 'final' event (last: ${final ? final.type : 'none'})`,\n )\n }\n const metadata = final.metadata ?? {}\n const tokenUsage =\n metadata.tokenUsage && typeof metadata.tokenUsage === 'object'\n ? (metadata.tokenUsage as Record<string, unknown>)\n : {}\n const usage: AgentTurnUsage = {\n input: finiteNumber(tokenUsage.input) ?? 0,\n output: finiteNumber(tokenUsage.output) ?? 0,\n }\n const costUsd = finiteNumber(metadata.costUsd)\n if (costUsd !== undefined) usage.costUsd = costUsd\n if (typeof metadata.model === 'string' && metadata.model.length > 0) {\n usage.model = metadata.model\n }\n return {\n finalText: final.text ?? '',\n usage,\n events,\n status: final.status,\n ...(final.error ? { error: final.error } : {}),\n }\n}\n\n/** Start the backend's session when it owns one (`chat` kind); mint a local\n * correlation session otherwise. Box/executor turns carry no server session\n * here — resume lives in `openSandboxRun`/`SandboxLineage`, not this primitive. */\nasync function startTurnSession(\n backend: AgentTurnBackend,\n task: AgentTaskSpec,\n prompt: string,\n signal: AbortSignal,\n label: string,\n): Promise<RuntimeSession> {\n if (backend.kind === 'chat' && backend.backend.start) {\n return backend.backend.start(\n { task, message: prompt },\n { task, knowledge: emptyReadiness(task), signal },\n )\n }\n return newRuntimeSession(label)\n}\n\n/** Box-drive configuration derived from the backend kind + turn options. */\ninterface BoxTurnConfig {\n /** Caller `PromptOptions` forwarded to `streamPrompt`; the turn's derived\n * signal is installed over any caller value. */\n options?: Omit<PromptOptions, 'signal'>\n /** Project tool parts to `tool_call`/`tool_result` (see `mapSandboxToolEvent`). */\n preserveToolParts: boolean\n /** Awaited raw-event tap, before projection. */\n onRawEvent?: (event: SandboxEvent) => void | Promise<void>\n}\n\n/**\n * One turn over a box: `box.streamPrompt` projected through the existing\n * `mapSandboxEvent` (text/reasoning deltas +\n * cost-bearing `llm_call`s), plus the opt-in `mapSandboxToolEvent` tool-part\n * projection. Usage accumulates off the mapped `llm_call` events — the same\n * fold `sumSandboxUsage` applies. Final text prefers the terminal\n * `result`/`done`/`final` payload over concatenated deltas, because the\n * sandbox `message.part.updated` fallback may carry running accumulations.\n */\nasync function* driveBoxTurn(\n box: SandboxInstance,\n prompt: string,\n signal: AbortSignal,\n agentRunName: string,\n acc: TurnAccumulator,\n cfg: BoxTurnConfig,\n): AsyncGenerator<RuntimeStreamEvent> {\n const callOptions: PromptOptions = { ...(cfg.options ?? {}), signal }\n const stream = box.streamPrompt(prompt, callOptions)\n const toolParts = cfg.preserveToolParts ? createSandboxToolPartState() : undefined\n for await (const event of stream) {\n if (cfg.onRawEvent) await cfg.onRawEvent(event)\n const terminalText = terminalTextFromSandboxEvent(event)\n if (terminalText !== undefined) acc.terminalText = terminalText\n if (toolParts) {\n for (const toolEvent of mapSandboxToolEvent(event, toolParts)) yield toolEvent\n }\n const mapped = mapSandboxEvent(event, { agentRunName })\n if (!mapped) continue\n // `mapSandboxEvent` stamps `agentRunName` as the model label when the\n // event carried none — a run label, not a reported model. Exclude it from\n // the terminal usage so `usage.model` is never a fabricated value.\n foldEvent(mapped, acc, agentRunName)\n yield mapped\n }\n}\n\n/** One turn over an in-process backend: its own `stream()` surface, projected\n * through the same `normalizeBackendStreamEvent` the task lifecycle applies. */\nasync function* driveChatTurn(\n backend: AgentExecutionBackend,\n task: AgentTaskSpec,\n session: RuntimeSession,\n prompt: string,\n signal: AbortSignal,\n acc: TurnAccumulator,\n): AsyncGenerator<RuntimeStreamEvent> {\n const input = { task, message: prompt }\n const context = { task, knowledge: emptyReadiness(task), session, signal }\n for await (const raw of backend.stream(input, context)) {\n const event = normalizeBackendStreamEvent(raw, task, session)\n foldEvent(event, acc)\n yield event\n }\n}\n\n/** Fold one normalized event into the turn accumulator (text + usage).\n * `fallbackModelLabel` — a mapper-stamped run label to exclude from\n * `usage.model` (it is not a backend-reported model). */\nfunction foldEvent(\n event: RuntimeStreamEvent,\n acc: TurnAccumulator,\n fallbackModelLabel?: string,\n): void {\n if (event.type === 'text_delta') {\n acc.deltaText += event.text\n return\n }\n if (event.type === 'llm_call') {\n acc.input += event.tokensIn ?? 0\n acc.output += event.tokensOut ?? 0\n acc.costUsd += event.costUsd ?? 0\n if (event.model && event.model !== fallbackModelLabel) acc.model = event.model\n }\n}\n\n/** Read the final text off a terminal sandbox event, when present. */\nfunction terminalTextFromSandboxEvent(event: SandboxEvent): string | undefined {\n if (!event || typeof event !== 'object') return undefined\n const type = String(event.type ?? '')\n if (type !== 'result' && type !== 'done' && type !== 'final') return undefined\n const data =\n event.data && typeof event.data === 'object'\n ? (event.data as Record<string, unknown>)\n : ({} as Record<string, unknown>)\n for (const key of ['finalText', 'text', 'response', 'content']) {\n const value = data[key]\n if (typeof value === 'string') return value\n }\n return undefined\n}\n\nfunction buildFinalEvent(\n task: AgentTaskSpec,\n session: RuntimeSession | undefined,\n acc: TurnAccumulator,\n outcome: { status: AgentTaskStatus; reason: string; error?: BackendErrorDetail },\n): RuntimeStreamEvent {\n const finalText = acc.terminalText ?? acc.deltaText\n return {\n type: 'final',\n task,\n ...(session ? { session } : {}),\n status: outcome.status,\n reason: outcome.reason,\n ...(finalText ? { text: finalText } : {}),\n metadata: {\n tokenUsage: { input: acc.input, output: acc.output },\n ...(acc.costUsd > 0 ? { costUsd: acc.costUsd } : {}),\n ...(acc.model ? { model: acc.model } : {}),\n },\n ...(outcome.error ? { error: outcome.error } : {}),\n timestamp: nowIso(),\n }\n}\n\n/** Minimal ready-by-construction readiness report for a requirement-free turn. */\nfunction emptyReadiness(task: AgentTaskSpec) {\n return scoreKnowledgeReadiness({ taskId: task.id, requirements: [] })\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (!signal.aborted) return\n throw signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason))\n}\n\n/**\n * Derive the turn's effective abort signal: fires when EITHER the caller's\n * signal aborts OR the `timeoutMs` deadline elapses. `dispose()` clears the\n * timer so a finished turn never leaks a pending timeout. `timeoutMs <= 0`\n * disables the deadline. Node-portable (no `AbortSignal.any`, which needs\n * >=20.3 — the package floor is >=20).\n */\nfunction deriveTurnSignal(\n callerSignal: AbortSignal | undefined,\n timeoutMs: number,\n): { signal: AbortSignal; dispose: () => void } {\n const controller = new AbortController()\n const timer =\n timeoutMs > 0\n ? setTimeout(\n () => controller.abort(new Error(`agent turn timed out after ${timeoutMs}ms`)),\n timeoutMs,\n )\n : undefined\n if (timer && typeof (timer as { unref?: () => void }).unref === 'function') {\n ;(timer as { unref: () => void }).unref()\n }\n const onCallerAbort = () =>\n controller.abort(callerSignal?.reason ?? new Error('agent turn aborted'))\n if (callerSignal) {\n if (callerSignal.aborted) onCallerAbort()\n else callerSignal.addEventListener('abort', onCallerAbort, { once: true })\n }\n return {\n signal: controller.signal,\n dispose: () => {\n if (timer) clearTimeout(timer)\n callerSignal?.removeEventListener('abort', onCallerAbort)\n },\n }\n}\n","/**\n *\n * The mechanical patch gate — the SINGLE source of the no-op / always-on secret-path floor /\n * forbidden-path / diff-size / test / typecheck checks over a captured diff. No I/O: it scores a\n * patch plus its already-derived test/typecheck PASS signals. The generic worktree-CLI deliverable\n * (`patchDelivered`, which runs the commands itself) calls this, so the gate logic never forks.\n *\n * The always-on safety floors (no-op rejection + secret-path) are also exported standalone\n * (`isNonEmptyPatch` / `touchesSecretPath`) for reuse outside the full scorer.\n *\n * @experimental\n */\n\nimport type { DefaultVerdict } from '../types'\n\nconst DEFAULT_MAX_DIFF_LINES = 400\n\n/**\n * Default-on credential-path floor: a patch that touches a credential-shaped path is rejected\n * regardless of the per-task `forbiddenPaths` config. Catches `.env`, private keys, keystores,\n * wallets, and the common secret/credential JSON files.\n */\nconst secretPathPattern =\n /(^|\\/)(\\.env(\\.|$)|.*\\.(pem|key|p12|pfx|keystore|wallet)|id_rsa|id_ed25519|secrets?\\.json|credentials?\\.json)$/i\n\n/** @experimental The patch + its derived PASS signals the mechanical gate decides on. */\nexport interface CoderCheckInput {\n /** The unified diff produced by the run. */\n patch: string\n /** Did `testCmd` exit clean? */\n testsPassed: boolean\n /** Did `typecheckCmd` exit clean? */\n typecheckPassed: boolean\n}\n\n/** @experimental The per-task constraints the mechanical gate enforces. */\nexport interface CoderCheckConstraints {\n /** Default 400. Hard cap; gate fails when exceeded. */\n maxDiffLines?: number\n /** Literal path prefixes the patch must not touch. */\n forbiddenPaths?: string[]\n}\n\n/** The unified-diff paths the patch touches — the `+++`/`---` headers, de-`a/`/`b/`-prefixed,\n * with `/dev/null` (a delete's other side) dropped. */\nexport function touchedPathsFromPatch(patch: string): string[] {\n const out = new Set<string>()\n for (const line of patch.split(/\\r?\\n/)) {\n if (line.startsWith('+++ ') || line.startsWith('--- ')) {\n const rest = line.slice(4).trim()\n if (rest === '/dev/null') continue\n const stripped = rest.startsWith('a/') || rest.startsWith('b/') ? rest.slice(2) : rest\n out.add(stripped)\n }\n }\n return [...out]\n}\n\n/** Count the added/removed content lines in a unified diff (excludes the `+++`/`---` headers). */\nexport function countDiffLines(patch: string): number {\n let count = 0\n for (const line of patch.split(/\\r?\\n/)) {\n if (\n (line.startsWith('+') || line.startsWith('-')) &&\n !line.startsWith('+++') &&\n !line.startsWith('---')\n ) {\n count += 1\n }\n }\n return count\n}\n\n/** True when the patch actually changes something — at least one touched path AND non-blank body.\n * An empty patch can trivially \"pass\" tests/typecheck (nothing changed) yet does no work. */\nexport function isNonEmptyPatch(patch: string): boolean {\n return touchedPathsFromPatch(patch).length > 0 && patch.trim().length > 0\n}\n\n/** The credential-shaped paths the patch touches (always-on floor, independent of `forbiddenPaths`). */\nexport function touchesSecretPath(patch: string): string[] {\n return touchedPathsFromPatch(patch).filter((p) => secretPathPattern.test(p))\n}\n\n/**\n *\n * The pure mechanical gate — the SINGLE source of the no-op / always-on secret-path floor /\n * diff-size / forbidden-path / test / typecheck checks. No I/O: it scores a patch + its\n * already-derived pass signals.\n *\n * Checks in order: (1) no-op rejection, (2) always-on secret-path floor (independent of\n * `forbiddenPaths`), (3) forbidden-path, (4) diff-size cap, (5) tests, (6) typecheck.\n * Aggregate score: `0.5*tests + 0.3*typecheck + 0.2*(1 - diffLines/maxDiff)`; `valid` is the\n * conjunction of all six.\n *\n * @experimental\n */\nexport function runCoderChecks(\n input: CoderCheckInput,\n constraints: CoderCheckConstraints = {},\n): DefaultVerdict {\n const maxDiff = constraints.maxDiffLines ?? DEFAULT_MAX_DIFF_LINES\n const forbidden = constraints.forbiddenPaths ?? []\n const scores: Record<string, number> = {}\n const notes: string[] = []\n let pass = true\n\n const touched = touchedPathsFromPatch(input.patch)\n\n // No-op rejection: an empty patch can trivially \"pass\" tests/typecheck (nothing changed) yet\n // does no work — never a valid result.\n if (touched.length === 0 || input.patch.trim().length === 0) {\n pass = false\n scores.nonEmpty = 0\n notes.push('empty patch — no files changed')\n } else {\n scores.nonEmpty = 1\n }\n\n // Secret-path floor: always-on, independent of `forbiddenPaths`.\n const touchedSecrets = touched.filter((p) => secretPathPattern.test(p))\n if (touchedSecrets.length > 0) {\n pass = false\n scores.noSecrets = 0\n notes.push(`touched secret-shaped paths: ${touchedSecrets.join(', ')}`)\n } else {\n scores.noSecrets = 1\n }\n\n const touchedForbidden = forbidden.filter((path) => {\n const prefix = path.endsWith('/') ? path : `${path}/`\n const exact = prefix.slice(0, -1)\n return touched.some((p) => p === exact || p.startsWith(prefix))\n })\n if (touchedForbidden.length > 0) {\n pass = false\n scores.forbiddenPath = 0\n notes.push(`touched forbidden paths: ${touchedForbidden.join(', ')}`)\n } else {\n scores.forbiddenPath = 1\n }\n\n const diffLines = countDiffLines(input.patch)\n if (diffLines > maxDiff) {\n pass = false\n scores.diffSize = 0\n notes.push(`diff ${diffLines} lines exceeds cap ${maxDiff}`)\n } else {\n scores.diffSize = maxDiff === 0 ? 0 : Math.max(0, 1 - diffLines / maxDiff)\n }\n\n scores.tests = input.testsPassed ? 1 : 0\n scores.typecheck = input.typecheckPassed ? 1 : 0\n if (!input.testsPassed) {\n pass = false\n notes.push('tests failed')\n }\n if (!input.typecheckPassed) {\n pass = false\n notes.push('typecheck failed')\n }\n\n const score = 0.5 * scores.tests + 0.3 * scores.typecheck + 0.2 * scores.diffSize\n const verdict: DefaultVerdict = {\n valid: pass,\n score: Number.isFinite(score) ? score : 0,\n scores,\n }\n if (notes.length > 0) verdict.notes = notes.join('; ')\n return verdict\n}\n","/**\n *\n * `patchDelivered` — the mechanical patch gate as a generic `DeliverableSpec` over the worktree-CLI\n * artifact. It is one construction of a `DeliverableSpec` (a plain `check(artifact) => boolean`\n * function); a domain customizes \"is it done\" by building its own spec, not by extending this one.\n * The canonical use: a `fanout(createWorktreeCliExecutor)` of authored harness profiles, each\n * `gateOnDeliverable(patchDelivered(...))`.\n *\n * The checks themselves are NOT re-implemented here — `runCoderChecks` (`./patch-checks`) is the\n * single source of the no-op / always-on secret-path floor / forbidden-path / diff-size / test /\n * typecheck logic. This factory only adapts the `WorktreePatchArtifact` shape (its `checks` carry\n * the test/typecheck PASS signals the executor derived in the live worktree) into the check inputs\n * and returns the boolean the gate consumes.\n *\n * Test/typecheck enforcement is OPT-IN per `require`: when a command was not run in the worktree\n * (the executor's `testCmd`/`typecheckCmd` were omitted) the corresponding signal is treated as\n * passed UNLESS `require` lists it — so a gate that demands a tests-pass on an artifact that never\n * ran tests fails closed (the honest outcome) rather than passing on a missing signal.\n *\n * @experimental\n */\n\nimport type { DeliverableSpec } from './completion-gate'\nimport { type CoderCheckConstraints, type CoderCheckInput, runCoderChecks } from './patch-checks'\nimport type { WorktreePatchArtifact } from './worktree-cli-executor'\n\n/** @experimental */\nexport interface PatchDeliverableOptions extends CoderCheckConstraints {\n /**\n * Which verification signals the gate REQUIRES to be present-and-passing. A required signal\n * that the artifact never derived (the command was not configured on the executor) fails the\n * gate closed. Unlisted signals default to passed-when-absent (the executor simply didn't run\n * that command). Default `[]` — gate on no-op / secret / forbidden / diff-size only.\n */\n require?: ReadonlyArray<'tests' | 'typecheck'>\n}\n\n/**\n * Build the `DeliverableSpec<WorktreePatchArtifact>`: `check(artifact)` runs the shared mechanical\n * gate (`runCoderChecks`) over the captured patch + the worktree-derived pass signals and returns\n * whether the patch is DELIVERED (the `valid` conjunction).\n *\n * @experimental\n */\nexport function patchDelivered(\n options: PatchDeliverableOptions = {},\n): DeliverableSpec<WorktreePatchArtifact> {\n const require = new Set(options.require ?? [])\n const constraints: CoderCheckConstraints = {\n ...(options.maxDiffLines !== undefined ? { maxDiffLines: options.maxDiffLines } : {}),\n ...(options.forbiddenPaths !== undefined ? { forbiddenPaths: options.forbiddenPaths } : {}),\n }\n return {\n describe: 'patch: no-op/secret/forbidden/diff-size + required test/typecheck pass',\n check(artifact) {\n const input: CoderCheckInput = {\n patch: artifact.patch,\n testsPassed: signalPass(artifact.checks?.tests?.passed, require.has('tests')),\n typecheckPassed: signalPass(artifact.checks?.typecheck?.passed, require.has('typecheck')),\n }\n return runCoderChecks(input, constraints).valid === true\n },\n }\n}\n\n/**\n * Resolve a derived PASS signal into the boolean the gate folds in:\n * - signal present → its value (true/false).\n * - signal absent + required → false (fail closed: the gate demanded a signal that was never run).\n * - signal absent + not required → true (the executor simply didn't run that command).\n */\nfunction signalPass(value: boolean | undefined, required: boolean): boolean {\n if (value !== undefined) return value\n return !required\n}\n","/**\n *\n * The SETTLE-time analyst: when a worker finishes, collect its tool spans from a `TraceSource` and run\n * agent-eval's PUBLISHED batch analyzers over them — `buildTrajectory` (structured run summary),\n * `stuckLoopView` (full-run repeated-call view, complementing the online consecutive detector), and\n * `toolWasteView`. Substrate-agnostic: the spans come from any source (an owned loop's buffer OR a\n * sandbox box session). No analysis reimplemented — this is the thin bridge into agent-eval's analyzers.\n *\n * @experimental\n */\n\nimport { buildTrajectory, InMemoryTraceStore } from '@tangle-network/agent-eval'\nimport { stuckLoopView, toolWasteView } from '@tangle-network/agent-eval/pipelines'\nimport type { TraceSource } from './trace-source'\n\nexport interface TrajectoryAnalysis {\n /** Structured run summary (tool-call count, step order). Steps carry a single timestamp, so per-span\n * duration is 0; loop/waste detection keys on call PATTERNS + cross-span windows, not durations. */\n readonly trajectory: Awaited<ReturnType<typeof buildTrajectory>>\n /** Full-run repeated-call view (total occurrences + window) — allows one intervening call so it\n * catches a loop the online consecutive detector interleaves past. */\n readonly stuckLoop: Awaited<ReturnType<typeof stuckLoopView>>\n /** Wasted-vs-total tool-call ratio for the run. */\n readonly toolWaste: Awaited<ReturnType<typeof toolWasteView>>\n}\n\n/** Collect the source's spans and run the agent-eval batch analyzers over them under one `runId`. */\nexport async function analyzeTrace(\n source: TraceSource,\n runId = 'worker',\n): Promise<TrajectoryAnalysis> {\n const spans = await source.collect()\n const store = new InMemoryTraceStore()\n const laneSpanId = `${runId}-session-lane`\n if (spans.length > 0) {\n const startedAt = Math.min(...spans.map((span) => span.startedAt))\n const endedAt = Math.max(...spans.map((span) => span.endedAt ?? span.startedAt))\n const agentSpanId = `${runId}-agent`\n await store.appendSpan({\n spanId: agentSpanId,\n runId,\n kind: 'agent',\n name: 'trace-source-agent',\n startedAt,\n endedAt,\n })\n await store.appendSpan({\n spanId: laneSpanId,\n parentSpanId: agentSpanId,\n runId,\n kind: 'custom',\n name: 'trace-source-session',\n startedAt,\n endedAt,\n })\n }\n // Re-stamp onto one runId so the runId-filtered analyzers see the whole trace regardless of the\n // source's own id scheme. A TraceSource carries tool spans only, so attach\n // them to one explicit session lane; 0.117's analyzer uses ancestry plus\n // overlap times to distinguish serial repeats from parallel siblings.\n for (let i = 0; i < spans.length; i += 1) {\n const s = spans[i]\n if (s) {\n await store.appendSpan({\n ...s,\n runId,\n spanId: `${runId}-t${i}`,\n parentSpanId: laneSpanId,\n })\n }\n }\n const [trajectory, stuckLoop, toolWaste] = await Promise.all([\n buildTrajectory(store, runId),\n stuckLoopView(store, { runId, maxInterveningToolCalls: 1 }),\n toolWasteView(store, { runId }),\n ])\n return { trajectory, stuckLoop, toolWaste }\n}\n","/**\n *\n * `worktreeFanout` — the GENERIC coding combinator: a `fanout` of N supervisor-authored harness\n * profiles, each on its OWN worktree-CLI leaf, each `gateOnDeliverable(deliverable)`, winner via the\n * shared `selectValidWinner` (valid-only — an ungated patch never wins, the deliverable gate is the\n * point). The `deliverable` is passed as DATA: it defaults to `patchDelivered(opts)` but any\n * `DeliverableSpec<WorktreePatchArtifact>` a domain authors slots in unchanged.\n *\n * The shape is content-free at the `fanout` layer; this builder only assembles the pieces (the\n * worktree-CLI executor + the injected deliverable + the diff-size selector) into the generic\n * combinator's `itemSpec`/`selectWinner` seams. Nothing here re-implements selection, gating, or\n * fanout — it composes the existing primitives.\n *\n * @experimental\n */\n\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport { fanout, selectValidWinner } from '../personify/combinators'\nimport type { CombinatorShape, WinnerStrategy } from '../personify/wave-types'\nimport { type DeliverableSpec, gateOnDeliverable } from './completion-gate'\nimport { type PatchDeliverableOptions, patchDelivered } from './patch-deliverable'\nimport type { AgentSpec } from './types'\nimport {\n createWorktreeCliExecutor,\n type WorktreeCliExecutorOptions,\n type WorktreePatchArtifact,\n} from './worktree-cli-executor'\n\n/** @experimental One authored harness profile in a worktree fanout: the §1.5 profile + which local\n * harness CLI drives it. The supervisor authors `profile` per sub-task; `harness` chooses the leaf. */\nexport interface AuthoredHarness {\n /** A short label for the worktree branch + trace node. */\n name: string\n /** The supervisor-authored `AgentProfile` (systemPrompt + model reach the harness via §1.5). */\n profile: AgentProfile\n /** Which local harness CLI drives this leaf. */\n harness: 'claude' | 'codex' | 'opencode'\n /** Per-harness model/runId/baseRef overrides flow through the profile + these. */\n runId?: string\n baseRef?: string\n}\n\n/** @experimental */\nexport interface WorktreeFanoutOptions extends PatchDeliverableOptions {\n /** Absolute path to the git checkout each worktree is cut from. */\n repoRoot: string\n /** The per-task instruction handed to every harness (composed under each profile's systemPrompt). */\n taskPrompt: string\n /** The authored harness profiles — one fanout item (and one worktree-CLI leaf) each. */\n harnesses: ReadonlyArray<AuthoredHarness>\n /**\n * The completion check each leaf is gated on. Defaults to `patchDelivered(opts)` (the mechanical\n * no-op/secret/forbidden/diff-size + required test/typecheck gate). Pass any\n * `DeliverableSpec<WorktreePatchArtifact>` to customize \"is it delivered\" as DATA.\n */\n deliverable?: DeliverableSpec<WorktreePatchArtifact>\n /** Shell command run in each worktree to derive the tests-PASS signal. */\n testCmd?: string\n /** Shell command run in each worktree to derive the typecheck-PASS signal. */\n typecheckCmd?: string\n /** Wall-clock cap per harness subprocess (ms). */\n harnessTimeoutMs?: number\n /** Winner-selection strategy. Default `highest-score`. */\n winnerStrategy?: WinnerStrategy\n /** Test seams forwarded to every worktree-CLI leaf (inject git/harness/command runners so the\n * whole fanout runs offline). Production callers leave these unset. */\n runGit?: WorktreeCliExecutorOptions['runGit']\n runHarness?: WorktreeCliExecutorOptions['runHarness']\n runCommand?: WorktreeCliExecutorOptions['runCommand']\n}\n\n/**\n * Build the worktree fanout combinator. Run it with `runPersonified({ persona, shape, task, budget })`\n * — equal-k holds by construction (the conserved budget pool bounds the N leaves), and selection is\n * the shared valid-only `selectValidWinner` (never a judge).\n *\n * @experimental\n */\nexport function worktreeFanout<Task>(\n options: WorktreeFanoutOptions,\n): CombinatorShape<Task, WorktreePatchArtifact> {\n const deliverable =\n options.deliverable ??\n patchDelivered({\n ...(options.maxDiffLines !== undefined ? { maxDiffLines: options.maxDiffLines } : {}),\n ...(options.forbiddenPaths !== undefined ? { forbiddenPaths: options.forbiddenPaths } : {}),\n ...(options.require !== undefined ? { require: options.require } : {}),\n })\n\n const itemSpec = (item: AuthoredHarness): AgentSpec => {\n const executor = gateOnDeliverable(\n createWorktreeCliExecutor({\n repoRoot: options.repoRoot,\n profile: item.profile,\n harness: item.harness,\n taskPrompt: options.taskPrompt,\n ...(item.runId ? { runId: item.runId } : {}),\n ...(item.baseRef ? { baseRef: item.baseRef } : {}),\n ...(options.testCmd !== undefined ? { testCmd: options.testCmd } : {}),\n ...(options.typecheckCmd !== undefined ? { typecheckCmd: options.typecheckCmd } : {}),\n ...(options.harnessTimeoutMs !== undefined\n ? { harnessTimeoutMs: options.harnessTimeoutMs }\n : {}),\n ...(options.runGit ? { runGit: options.runGit } : {}),\n ...(options.runHarness ? { runHarness: options.runHarness } : {}),\n ...(options.runCommand ? { runCommand: options.runCommand } : {}),\n }),\n deliverable,\n )\n return { profile: item.profile, harness: null, executor: executor as AgentSpec['executor'] }\n }\n\n const selectWinner = selectValidWinner<WorktreePatchArtifact>({\n strategy: options.winnerStrategy ?? 'highest-score',\n sizeOf: (a) => a.stats.insertions + a.stats.deletions,\n })\n\n return fanout<Task, AuthoredHarness, WorktreePatchArtifact>(options.harnesses, {\n itemTask: () => options.taskPrompt,\n label: (item, i) => `${item.name}:${i}`,\n itemSpec: (item) => itemSpec(item),\n selectWinner,\n })\n}\n","/**\n * superviseSurface — drive a team of agents to solve a graded `AgenticSurface` task. ONE capability that\n * replaces the worker-seam + \"self-improving supervisor\" wrapper pair: the driver (`profile`) spawns\n * workers that each run `runAgentic` over the surface (`refine` by default), settle on the surface's OWN\n * check (settled ⟺ resolved — a worker that ran but didn't pass settles invalid, so a keep-best driver\n * never counts it done), and feed the driver a self-improvement lens (the still-FAILING tests, by default)\n * so the next spawn targets the persistently-hard cases. Returns the deployable outcome + the full\n * conserved spend.\n *\n * WHY this lives here and not as a `supervise()` backend: `runAgentic` depends on the supervise core\n * (`strategy.ts` → `supervise/`), so a surface-solving worker cannot be a supervise built-in without an\n * import cycle. It is therefore a COMPOSITION of `supervise()` + `runAgentic` at the layer above both —\n * the right home for \"supervise over a graded surface\". The within-run self-improvement is the analyst\n * (authored content, swap `analysts`); the across-run kind wraps this call in `improve()`.\n */\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport type { AnalystRegistry, MakeWorkerAgent } from '../mcp/tools/coordination'\nimport type { RouterConfig } from './router-client'\nimport {\n type AgenticSurface,\n type AgenticTask,\n refine,\n runAgentic,\n type Strategy,\n} from './strategy'\nimport type { DeliverableSpec } from './supervise/completion-gate'\nimport { supervise } from './supervise/supervise'\nimport type { SupervisorProfile } from './supervise/supervisor-agent'\nimport type { Agent, AgentSpec, Budget, Executor, ExecutorResult, Spend } from './supervise/types'\n\n/** What a surface worker settles with — the surface verdict the driver + deliverable read. `resolved` is\n * the surface check's pass/fail (settled ⟺ resolved); `score` is the partial-credit fraction; `failing`\n * carries the tests this worker left red (so the analyst can target them). */\nexport interface SurfaceWorkerOut {\n readonly resolved: boolean\n readonly score: number\n readonly shots: number\n readonly summary: string\n readonly failing?: readonly string[]\n}\n\n/** Remember the worker's LAST `run_tests` output so the analyst can name the still-failing tests — a\n * transparent passthrough for every other surface call. Local to this module (no surface-zoo concept). */\nfunction captureFailures(base: AgenticSurface): {\n surface: AgenticSurface\n failing: () => string[]\n} {\n let lastReport = ''\n const surface: AgenticSurface = {\n name: base.name,\n open: (t) => base.open(t),\n tools: (t, h) => base.tools(t, h),\n async call(h, name, args) {\n const out = await base.call(h, name, args)\n if (name === 'run_tests') lastReport = out\n return out\n },\n score: (t, h) => base.score(t, h),\n close: (h) => base.close(h),\n }\n const failing = () => {\n const body = /FAILING:\\s*(.+)/i.exec(lastReport)?.[1]\n return body\n ? body\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n : []\n }\n return { surface, failing }\n}\n\n/** The default self-improvement LENS — authored content, not a code path. On each settled worker it hands\n * the driver the still-FAILING tests (not just a score), so the next spawn targets the persistently-hard\n * cases. Swap `analysts` to change what the driver improves from — that's the one knob. */\nexport function failuresAnalyst(): AnalystRegistry {\n return {\n kinds: [\n {\n id: 'failures',\n description: \"Surface the worker's still-failing tests so the driver targets them next.\",\n area: 'progress',\n },\n ],\n run: async (_kindId: string, trace: unknown) => {\n const w = (trace ?? {}) as Partial<SurfaceWorkerOut>\n if (!(typeof w === 'object' && w !== null && 'resolved' in w))\n return { summary: `worker produced: ${JSON.stringify(trace).slice(0, 300)}` }\n if (w.resolved) return { summary: 'worker RESOLVED — every check passed; stop.' }\n const failing = (w.failing ?? []) as readonly string[]\n const head = `worker did NOT resolve — score ${(100 * (w.score ?? 0)).toFixed(0)}%, ${w.shots ?? '?'} shot(s)`\n return {\n summary: failing.length\n ? `${head}. STILL FAILING (${failing.length}): ${failing.slice(0, 12).join(', ')}. Spawn the next worker to fix exactly these; if a test keeps failing across workers, give it concrete guidance about that case.`\n : `${head}. (no failing-test list available this round)`,\n }\n },\n }\n}\n\n/** How a worker runs the surface task (its router substrate + per-attempt bounds). */\nexport interface SurfaceWorkerConfig {\n readonly routerBaseUrl: string\n readonly routerKey: string\n readonly model: string\n readonly maxTokens?: number\n readonly innerTurns?: number\n /** Refine-shot budget for ONE worker attempt (max steered shots). Default 1. */\n readonly budget?: number\n}\n\n/** One spawned worker = one `runAgentic` attempt over the surface task. The driver's brief is threaded\n * into the attempt (so a re-spawn can take a targeted angle, not an identical retry); `runAgentic` stamps\n * real tokens/usd/ms, forwarded as `Spend`; the still-failing tests are captured for the analyst. */\nfunction surfaceWorkerExecutor(\n surface: AgenticSurface,\n task: AgenticTask,\n worker: SurfaceWorkerConfig,\n strategy: Strategy,\n): Executor<SurfaceWorkerOut> {\n let artifact: ExecutorResult<SurfaceWorkerOut> | undefined\n return {\n runtime: 'surface-worker',\n async execute(brief: unknown): Promise<ExecutorResult<SurfaceWorkerOut>> {\n const guidance = typeof brief === 'string' ? brief.trim() : brief ? JSON.stringify(brief) : ''\n const attemptTask: AgenticTask = guidance\n ? {\n ...task,\n systemPrompt: `${task.systemPrompt ?? ''}\\n\\n— Supervisor guidance for THIS attempt (incorporate it; do not just repeat a prior approach) —\\n${guidance}`,\n }\n : task\n const cap = captureFailures(surface)\n const r = await runAgentic({\n surface: cap.surface,\n task: attemptTask,\n strategy,\n budget: worker.budget ?? 1,\n routerBaseUrl: worker.routerBaseUrl,\n routerKey: worker.routerKey,\n model: worker.model,\n ...(worker.maxTokens !== undefined ? { maxTokens: worker.maxTokens } : {}),\n ...(worker.innerTurns !== undefined ? { innerTurns: worker.innerTurns } : {}),\n })\n const out: SurfaceWorkerOut = {\n resolved: r.resolved,\n score: r.score,\n shots: r.shots,\n summary: `${strategy.name} ${r.shots} shot(s) → ${(100 * r.score).toFixed(0)}% (${r.resolved ? 'resolved' : 'unresolved'})`,\n failing: r.resolved ? [] : cap.failing(),\n }\n const spent: Spend = { iterations: r.completions, tokens: r.tokens, usd: r.usd, ms: r.ms }\n artifact = {\n outRef: `surface-worker:${task.id}:${r.shots}:${r.resolved ? 'ok' : 'no'}`,\n out,\n verdict: { valid: r.resolved, score: r.score },\n spent,\n }\n return artifact\n },\n teardown: () => Promise.resolve({ destroyed: true }),\n resultArtifact() {\n if (!artifact) throw new Error('surfaceWorkerExecutor: resultArtifact before execute')\n return artifact\n },\n }\n}\n\nexport interface SuperviseSurfaceOptions {\n /** The graded surface workers solve (open/tools/call/score/close). */\n readonly surface: AgenticSurface\n /** Where/how each worker runs the surface task. */\n readonly worker: SurfaceWorkerConfig\n /** The conserved compute pool for the whole supervised run. Default: sized off the worker's inner-loop\n * bounds for a handful of worker spawns — raise it to let the driver try more. */\n readonly budget?: Budget\n /** The driver brain's router substrate (its own inference). Default: the worker's router + model — the\n * driver and workers share one router unless you separate them (e.g. a stronger driver model). */\n readonly router?: RouterConfig\n /** The self-improvement lens fed to the driver on each settled worker. Default `failuresAnalyst()`\n * (target the still-failing tests). Pass a custom registry to change it, or `null` to turn the\n * within-run self-improvement OFF (the driver sees raw settled outputs). */\n readonly analysts?: AnalystRegistry | null\n /** The strategy each worker runs over the surface. Default `refine` (iterate-with-feedback). */\n readonly strategy?: Strategy\n /** Max workers live at once. Default 1 (serial — required when workers share a persistent artifact, so\n * they continue each other instead of racing the file). */\n readonly maxLiveWorkers?: number\n}\n\n/** The deployable outcome of a supervised surface run. */\nexport interface SuperviseSurfaceResult {\n readonly resolved: boolean\n readonly score: number\n readonly usd: number\n readonly tokensIn: number\n readonly tokensOut: number\n readonly ms: number\n /** Total conserved-pool iterations = the driver + worker LLM rounds the run actually spent. */\n readonly completions: number\n}\n\n/** Drive a team of agents (spawned + steered by `profile`) to solve a graded `AgenticSurface` task, and\n * report the deployable outcome + the full conserved spend. This is `supervise()` configured for surfaces\n * — there is no other entrypoint to learn. */\nexport async function superviseSurface(\n profile: SupervisorProfile,\n task: AgenticTask,\n opts: SuperviseSurfaceOptions,\n): Promise<SuperviseSurfaceResult> {\n const strategy = opts.strategy ?? refine\n const innerTurns = opts.worker.innerTurns ?? 6\n // Default the driver to the worker's router (one router unless separated) and the pool to a handful of\n // worker spawns sized off the worker bounds — so the minimal call is\n // `superviseSurface(profile, task, { surface, worker })`.\n const router = opts.router ?? {\n routerBaseUrl: opts.worker.routerBaseUrl,\n routerKey: opts.worker.routerKey,\n model: opts.worker.model,\n }\n const budget = opts.budget ?? {\n maxIterations: (innerTurns + 2) * 5 + 16,\n maxTokens: (opts.worker.maxTokens ?? 4000) * 8,\n }\n\n // Every spawned worker is a BYO executor that runs the surface task; the deliverable is the completion\n // oracle (delivered ⟺ the surface check passed).\n const makeWorkerAgent: MakeWorkerAgent = (rawProfile) => {\n const p = (rawProfile ?? {}) as { name?: unknown }\n const name = typeof p.name === 'string' && p.name.length > 0 ? p.name : 'surface-worker'\n const spec: AgentSpec = {\n profile: rawProfile as AgentProfile,\n harness: null,\n executor: surfaceWorkerExecutor(\n opts.surface,\n task,\n opts.worker,\n strategy,\n ) as Executor<unknown>,\n }\n return { name, act: async () => '', executorSpec: spec } as Agent<unknown, unknown> & {\n executorSpec: AgentSpec\n }\n }\n const deliverable: DeliverableSpec<unknown> = {\n describe: `resolve the surface task ${task.id} (every required check passes)`,\n check: (out) => (out as SurfaceWorkerOut | undefined)?.resolved === true,\n }\n\n // `null` analysts → self-improvement off; otherwise default to the failures lens and fire every kind it\n // declares on each settled worker.\n const analysts = opts.analysts === null ? undefined : (opts.analysts ?? failuresAnalyst())\n\n const result = await supervise(profile, task, {\n makeWorkerAgent,\n deliverable,\n budget,\n maxLiveWorkers: opts.maxLiveWorkers ?? 1,\n // A SMALL per-worker reservation so MULTIPLE workers fit the pool (the default reserves the whole pool\n // per worker → only one ever spawns, defeating the spawn-a-targeted-worker steering).\n perWorker: { maxIterations: innerTurns + 2, maxTokens: opts.worker.maxTokens ?? 4000 },\n router,\n ...(analysts ? { analysts, analyzeOnSettle: analysts.kinds.map((k) => k.id) } : {}),\n })\n\n const out = result.kind === 'winner' ? (result.out as SurfaceWorkerOut | undefined) : undefined\n const sp = result.spentTotal\n return {\n resolved: out?.resolved ?? false,\n score: out?.score ?? 0,\n usd: sp.usd,\n tokensIn: sp.tokens.input,\n tokensOut: sp.tokens.output,\n ms: sp.ms,\n completions: sp.iterations,\n }\n}\n","/**\n * createVerifierEnvironment — ANY checkable task as an `Environment`, no tool surface\n * required. The generalization piece: EOPS/commit0-style domains have tools that mutate\n * an external artifact, but math problems, legal drafts, creative briefs, GTM copy, and\n * QA tasks have a different shape — the artifact IS the worker's answer, and the domain\n * is defined by one function: the deployable check over that answer.\n *\n * const gsm8k = createVerifierEnvironment({\n * name: 'gsm8k',\n * check: (task, answer) => ({\n * passes: extractFinalNumber(answer) === task.meta?.answer ? 1 : 0,\n * total: 1,\n * errored: 0,\n * }),\n * })\n * await runBenchmark({ environment: gsm8k, tasks, worker }) // sample vs refine on math\n *\n * The worker gets one built-in tool — `submit_answer` — plus any read-only domain tools\n * the caller adds (a calculator, a retrieval call, a style guide lookup). Every\n * submission is kept; `score()` checks the BEST submission (keep-best is the measured\n * law: workers reach correct answers then revise past them). The refine strategy's\n * critic reads the submission trajectory like any other trace, so iterate-with-feedback\n * works unchanged on answer domains.\n *\n * The check can be graded (passes/total expresses partial credit — rubric points,\n * sub-answers, unit-test counts), and MUST be deployable (computable without an oracle\n * at serve time): exact/numeric match, schema validation, a compiled rubric — not a\n * peek at held-out labels the production system wouldn't have.\n */\n\nimport type { Environment } from './run-benchmark'\nimport type { AgenticTask, AgenticTool, ArtifactHandle, SurfaceScore } from './strategy'\n\nexport interface VerifierEnvironmentOptions {\n name: string\n /** The deployable check over a submitted answer. Graded via passes/total. */\n check(task: AgenticTask, answer: string): Promise<SurfaceScore> | SurfaceScore\n /** Extra domain tools (read-only helpers: calculator, retrieval, style lookup). */\n extraTools?: AgenticTool[]\n /** Executes the extra tools. Required when `extraTools` is set. */\n callExtra?(\n task: AgenticTask,\n name: string,\n args: Record<string, unknown>,\n ): Promise<string> | string\n}\n\ninterface AnswerState {\n task: AgenticTask\n submissions: string[]\n}\n\nconst submitTool: AgenticTool = {\n type: 'function',\n function: {\n name: 'submit_answer',\n description:\n 'Submit your answer for evaluation. You may submit more than once — the best-scoring submission counts. Submit the COMPLETE final answer, not a fragment.',\n parameters: {\n type: 'object',\n properties: { answer: { type: 'string', description: 'The complete final answer.' } },\n required: ['answer'],\n },\n },\n}\n\n/** Any checkable task as an `Environment`, no tool surface required: the artifact is the worker's answer and the domain is one deployable `check` over it. */\nexport function createVerifierEnvironment(opts: VerifierEnvironmentOptions): Environment {\n if (opts.extraTools?.length && !opts.callExtra) {\n throw new Error(`${opts.name}: extraTools requires callExtra`)\n }\n const states = new Map<string, AnswerState>()\n let seq = 0\n\n return {\n name: opts.name,\n\n async open(task) {\n seq += 1\n const handle: ArtifactHandle = { id: `${opts.name}-${seq}`, surface: opts.name }\n states.set(handle.id, { task, submissions: [] })\n return handle\n },\n\n async tools() {\n return [submitTool, ...(opts.extraTools ?? [])]\n },\n\n async call(handle, name, args) {\n const state = states.get(handle.id)\n if (!state) return 'ERROR: workspace closed'\n if (name === 'submit_answer') {\n const answer = String(args.answer ?? '').trim()\n if (!answer) return 'ERROR: empty answer'\n state.submissions.push(answer)\n return `submission ${state.submissions.length} recorded`\n }\n if (opts.callExtra && opts.extraTools?.some((t) => t.function.name === name)) {\n try {\n return await opts.callExtra(state.task, name, args)\n } catch (e) {\n return `ERROR: ${e instanceof Error ? e.message : String(e)}`\n }\n }\n return `ERROR: unknown tool ${name}`\n },\n\n // Keep-best across submissions — the measured law (workers reach correct answers,\n // then revise past them; final-state scoring undersells every strategy).\n async score(task, handle) {\n const state = states.get(handle.id)\n if (!state || state.submissions.length === 0) return { passes: 0, total: 1, errored: 0 }\n let best: SurfaceScore = { passes: 0, total: 1, errored: 0 }\n const ratio = (s: SurfaceScore) => (s.total > 0 ? s.passes / s.total : 0)\n for (const answer of state.submissions) {\n const s = await opts.check(task, answer)\n if (ratio(s) > ratio(best)) best = s\n }\n return best\n },\n\n async close(handle) {\n states.delete(handle.id)\n },\n }\n}\n","/**\n * createWaterfallCollector — 100% trajectory observability from the lifecycle stream:\n * every spawn/settle (shots, analysts, nested agents) becomes one timed, billed span.\n * The sum of spans IS the run's cost story — what each step cost in dollars, tokens,\n * and wall-clock, rendered as a text waterfall or exported as structured rows for any\n * chart. Attach the collector's `hooks` to `runAgentic`/`runBenchmark`; spans accumulate\n * across every task the hooks observe.\n */\nimport type { RuntimeHookEvent, RuntimeHooks } from '../runtime-hooks'\n\nexport interface WaterfallSpan {\n id: string\n /** The spawn label (`shot:0`, `analyst:1`, a nested agent's label) — the row name. */\n label: string\n runId: string\n parentId?: string\n startMs: number\n endMs?: number\n status: 'running' | 'done' | 'down'\n usd: number\n tokens: { input: number; output: number }\n score?: number\n}\n\nexport interface WaterfallReport {\n spans: WaterfallSpan[]\n /** Wall-clock of the observed window (first spawn → last settle). */\n totalMs: number\n totalUsd: number\n totalTokens: { input: number; output: number }\n /** Rollup by label prefix (the part before ':') — shots vs analysts vs anything else. */\n byKind: Record<\n string,\n { count: number; ms: number; usd: number; tokens: { input: number; output: number } }\n >\n}\n\ninterface SpawnPayload {\n childId?: string\n label?: string\n}\ninterface SettlePayload {\n childId?: string\n status?: string\n score?: number\n spent?: { usd?: number; tokens?: { input?: number; output?: number } }\n}\n\nexport interface WaterfallCollector {\n /** Attach these to RunAgenticOptions.hooks / BenchmarkConfig.hooks. */\n hooks: RuntimeHooks\n report(): WaterfallReport\n /** The text waterfall — one row per span, bars scaled to the observed window. */\n render(opts?: { width?: number; maxRows?: number }): string\n reset(): void\n}\n\n/** Build a `WaterfallCollector` that records agent spans and renders them as an ASCII timeline. */\nexport function createWaterfallCollector(): WaterfallCollector {\n let spans = new Map<string, WaterfallSpan>()\n\n const onEvent = (event: RuntimeHookEvent): void => {\n if (event.target === 'agent.spawn') {\n const p = (event.payload ?? {}) as SpawnPayload\n const id = p.childId ?? event.id\n spans.set(id, {\n id,\n label: p.label ?? id,\n runId: event.runId,\n ...(event.parentId !== undefined ? { parentId: event.parentId } : {}),\n startMs: event.timestamp,\n status: 'running',\n usd: 0,\n tokens: { input: 0, output: 0 },\n })\n return\n }\n if (event.target === 'agent.child') {\n const p = (event.payload ?? {}) as SettlePayload\n const id = p.childId\n if (!id) return\n const span = spans.get(id)\n if (!span) return\n span.endMs = event.timestamp\n span.status = p.status === 'down' ? 'down' : 'done'\n span.usd = p.spent?.usd ?? 0\n span.tokens = {\n input: p.spent?.tokens?.input ?? 0,\n output: p.spent?.tokens?.output ?? 0,\n }\n if (typeof p.score === 'number') span.score = p.score\n }\n }\n\n const report = (): WaterfallReport => {\n const all = [...spans.values()].sort((a, b) => a.startMs - b.startMs)\n const start = all[0]?.startMs ?? 0\n const end = Math.max(start, ...all.map((s) => s.endMs ?? s.startMs))\n const byKind: WaterfallReport['byKind'] = {}\n let totalUsd = 0\n const totalTokens = { input: 0, output: 0 }\n for (const s of all) {\n totalUsd += s.usd\n totalTokens.input += s.tokens.input\n totalTokens.output += s.tokens.output\n const kind = s.label.includes(':') ? (s.label.split(':')[0] as string) : s.label\n let k = byKind[kind]\n if (!k) {\n k = { count: 0, ms: 0, usd: 0, tokens: { input: 0, output: 0 } }\n byKind[kind] = k\n }\n k.count += 1\n k.ms += (s.endMs ?? s.startMs) - s.startMs\n k.usd += s.usd\n k.tokens.input += s.tokens.input\n k.tokens.output += s.tokens.output\n }\n return { spans: all, totalMs: end - start, totalUsd, totalTokens, byKind }\n }\n\n const render = (opts?: { width?: number; maxRows?: number }): string => {\n const { spans: all, totalMs, totalUsd, byKind } = report()\n if (all.length === 0) return '(no spans observed)'\n const width = opts?.width ?? 48\n const maxRows = opts?.maxRows ?? 60\n const start = all[0]?.startMs ?? 0\n const scale = totalMs > 0 ? width / totalMs : 0\n const lines: string[] = []\n const labelWidth = Math.min(24, Math.max(...all.map((s) => s.label.length)) + 1)\n for (const s of all.slice(0, maxRows)) {\n const offset = Math.round((s.startMs - start) * scale)\n const dur = (s.endMs ?? s.startMs) - s.startMs\n const len = Math.max(1, Math.round(dur * scale))\n const bar = `${' '.repeat(Math.min(offset, width))}${(s.status === 'down' ? '░' : '█').repeat(Math.max(1, Math.min(len, width - Math.min(offset, width) + 1)))}`\n const mark =\n s.status === 'down'\n ? ' DOWN'\n : s.score !== undefined\n ? ` ${(s.score * 100).toFixed(0)}%`\n : ''\n lines.push(\n `${s.label.padEnd(labelWidth)}|${bar.padEnd(width + 1)}| ${(dur / 1000).toFixed(1)}s $${s.usd.toFixed(4)} ${s.tokens.input}/${s.tokens.output}tok${mark}`,\n )\n }\n if (all.length > maxRows) lines.push(`… ${all.length - maxRows} more spans`)\n lines.push('—'.repeat(labelWidth + width + 2))\n for (const [kind, k] of Object.entries(byKind)) {\n lines.push(\n `${kind.padEnd(labelWidth)} ×${k.count} ${(k.ms / 1000).toFixed(1)}s busy $${k.usd.toFixed(4)} ${k.tokens.input}/${k.tokens.output}tok`,\n )\n }\n lines.push(\n `TOTAL${' '.repeat(labelWidth - 5)} ${(totalMs / 1000).toFixed(1)}s wall $${totalUsd.toFixed(4)}`,\n )\n return lines.join('\\n')\n }\n\n return {\n hooks: { onEvent },\n report,\n render,\n reset: () => {\n spans = new Map()\n },\n }\n}\n","/** Command runner seam. Host code can use `localShell`; sandbox code can wrap `box.exec`. */\nexport type Shell = (\n args: ReadonlyArray<string>,\n cwd?: string,\n) => Promise<{ stdout: string; stderr: string; code: number }>\n\nexport type WorkspaceCommit =\n | { readonly ok: true; readonly rev: string }\n | { readonly ok: false; readonly conflict: string }\n\nexport interface Workspace {\n readonly ref: string\n materialize(dir: string): Promise<void>\n commit(dir: string, message: string): Promise<WorkspaceCommit>\n head(): Promise<string>\n}\n\n/** Host-process `Shell`: run a command via `execFile`, resolving `{ stdout, stderr, code }` (never throws on non-zero exit). */\nexport function localShell(): Shell {\n return async (args, cwd) => {\n const { execFile } = await import('node:child_process')\n const [bin, ...rest] = args\n return new Promise((resolve) => {\n execFile(\n bin ?? '',\n rest,\n { cwd, encoding: 'utf-8', maxBuffer: 64 * 1024 * 1024 },\n (err: Error | null, stdout: string, stderr: string) => {\n resolve({\n stdout: stdout ?? '',\n stderr: stderr ?? '',\n code: err ? ((err as { code?: number }).code ?? 1) : 0,\n })\n },\n )\n })\n }\n}\n\nexport interface GitWorkspaceOptions {\n readonly ref: string\n readonly shell?: Shell\n readonly branch?: string\n readonly noHooks?: boolean\n}\n\n/** A `Workspace` over a git checkout: materialize an isolated worktree at `ref`, commit produced changes (conflict-aware), and read `head` — hooks disabled, identity pinned. */\nexport function gitWorkspace(opts: GitWorkspaceOptions): Workspace {\n const shell = opts.shell ?? localShell()\n const branch = opts.branch ?? 'main'\n const cfg = opts.noHooks === false ? [] : ['-c', 'core.hooksPath=/dev/null']\n const ident = ['-c', 'user.email=workspace@tangle.local', '-c', 'user.name=workspace']\n\n const run = async (args: string[], cwd?: string): Promise<string> => {\n const res = await shell(['git', ...cfg, ...ident, ...args], cwd)\n if (res.code !== 0) {\n throw new Error(\n `git ${args.join(' ')} failed (${res.code}): ${tail(res.stderr || res.stdout)}`,\n )\n }\n return res.stdout\n }\n\n return {\n ref: opts.ref,\n materialize: (dir) => run(['clone', '--branch', branch, opts.ref, dir]).then(() => {}),\n async commit(dir, message) {\n await run(['add', '-A'], dir)\n const status = await run(['status', '--porcelain'], dir)\n if (!status.trim()) return { ok: true, rev: (await run(['rev-parse', 'HEAD'], dir)).trim() }\n await run(['commit', '-m', message], dir)\n const pull = await shell(['git', ...cfg, ...ident, 'pull', '--rebase', 'origin', branch], dir)\n if (pull.code !== 0) {\n await shell(['git', ...cfg, 'rebase', '--abort'], dir).catch(() => {})\n return { ok: false, conflict: tail(pull.stderr || pull.stdout) }\n }\n const push = await shell(['git', ...cfg, ...ident, 'push', 'origin', branch], dir)\n if (push.code !== 0) return { ok: false, conflict: tail(push.stderr || push.stdout) }\n return { ok: true, rev: (await run(['rev-parse', 'HEAD'], dir)).trim() }\n },\n async head() {\n const out = await run(['ls-remote', opts.ref, `refs/heads/${branch}`])\n return out.split(/\\s+/)[0] ?? ''\n },\n }\n}\n\n/** A jj-backed `Workspace` (Jujutsu, colocated with git for the durable remote).\n * Same port, same `Shell` — a drop-in for `gitWorkspace`. jj suits agent loops:\n * no staging area, and a first-class operation log (native resume/undo). Live use\n * requires `jj` on the `Shell`'s host. */\nexport function jjWorkspace(opts: GitWorkspaceOptions): Workspace {\n const shell = opts.shell ?? localShell()\n const branch = opts.branch ?? 'main'\n // jj reads its author identity from config, not per-call flags like git's `-c\n // user.*`; inject it via --config-toml so a throwaway clone is self-contained\n // (parallels gitWorkspace's `ident`). Global flags must precede the subcommand.\n const ident = [\n '--config-toml',\n 'user.name=\"workspace\"',\n '--config-toml',\n 'user.email=\"workspace@tangle.local\"',\n ]\n\n const jj = async (args: string[], cwd?: string): Promise<string> => {\n const res = await shell(['jj', ...ident, ...args], cwd)\n if (res.code !== 0) {\n throw new Error(\n `jj ${args.join(' ')} failed (${res.code}): ${tail(res.stderr || res.stdout)}`,\n )\n }\n return res.stdout\n }\n\n return {\n ref: opts.ref,\n // Colocated clone: jj manages history, git holds the durable remote.\n materialize: (dir) => jj(['git', 'clone', '--colocate', opts.ref, dir]).then(() => {}),\n async commit(dir, message) {\n // jj auto-snapshots the working copy; describe the change, then open a fresh\n // empty change so the next commit doesn't amend this one. A rejected push is\n // surfaced as a typed blocker (conflicts are first-class in jj, not aborted).\n await jj(['describe', '-m', message], dir)\n await jj(['new'], dir)\n const push = await shell(['jj', ...ident, 'git', 'push', '--branch', branch], dir)\n if (push.code !== 0) return { ok: false, conflict: tail(push.stderr || push.stdout) }\n const rev = (await jj(['log', '--no-graph', '-r', '@-', '-T', 'commit_id'], dir)).trim()\n return { ok: true, rev }\n },\n async head() {\n const out = await shell(['git', 'ls-remote', opts.ref, `refs/heads/${branch}`])\n return out.stdout.split(/\\s+/)[0] ?? ''\n },\n }\n}\n\nexport interface WorkspaceRun<T> {\n readonly valid: boolean\n readonly value: T\n /** Present when a commit was attempted (valid, or `commitOnInvalid`). */\n readonly commit?: WorkspaceCommit\n}\n\n/**\n * Run a worker `body` inside a FRESH clone of a shared `Workspace`, then commit its work back\n * so the next worker (or the supervisor) builds on it. This is the seam that turns isolated\n * per-worker cwds into one compounding artifact — `body` gets a real materialized dir, its\n * delivery is committed to the shared ref iff it's valid (a conflict is returned, never thrown).\n * The clone is removed after; durable state lives only in the ref.\n */\nexport async function runInWorkspace<T>(\n ws: Workspace,\n body: (cwd: string) => Promise<{ valid: boolean; value: T; message?: string }>,\n opts: { tmpPrefix?: string; commitOnInvalid?: boolean } = {},\n): Promise<WorkspaceRun<T>> {\n const { mkdtempSync, rmSync } = await import('node:fs')\n const { tmpdir } = await import('node:os')\n const { join } = await import('node:path')\n const dir = mkdtempSync(join(tmpdir(), opts.tmpPrefix ?? 'ws-run-'))\n try {\n await ws.materialize(dir)\n const r = await body(dir)\n if (r.valid || opts.commitOnInvalid) {\n const message = r.message ?? (r.valid ? 'worker: delivered' : 'worker: wip')\n const commit = await ws.commit(dir, message)\n return { valid: r.valid, value: r.value, commit }\n }\n return { valid: r.valid, value: r.value }\n } finally {\n rmSync(dir, { recursive: true, force: true })\n }\n}\n\nfunction tail(s: string): string {\n return s.slice(-400)\n}\n"],"mappings":"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"}
|