@tangle-network/agent-runtime 0.133.2 → 0.133.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/{activation-ChGJ2T70.js → activation-WLt7Dmfv.js} +2 -2
  2. package/dist/{activation-ChGJ2T70.js.map → activation-WLt7Dmfv.js.map} +1 -1
  3. package/dist/agent.d.ts +1 -1
  4. package/dist/agent.js +2 -2
  5. package/dist/{authoring-CCzHzhCy.js → authoring-Da9lWfh7.js} +2 -2
  6. package/dist/{authoring-CCzHzhCy.js.map → authoring-Da9lWfh7.js.map} +1 -1
  7. package/dist/{graph-DiFPPTdk.js → graph-TkrwBJCS.js} +2 -2
  8. package/dist/{graph-DiFPPTdk.js.map → graph-TkrwBJCS.js.map} +1 -1
  9. package/dist/{improvement-cycle-d0O_nkmj.js → improvement-cycle-ClbcuXvP.js} +3 -3
  10. package/dist/{improvement-cycle-d0O_nkmj.js.map → improvement-cycle-ClbcuXvP.js.map} +1 -1
  11. package/dist/{index-BNz-BzLt.d.ts → index-C7tsPEzj.d.ts} +2 -2
  12. package/dist/{index-B7qKWyMV.d.ts → index-kMp8g-jT.d.ts} +125 -3
  13. package/dist/index.d.ts +3 -3
  14. package/dist/index.js +7 -7
  15. package/dist/intelligence.js +3 -3
  16. package/dist/kernel.d.ts +2 -2
  17. package/dist/kernel.js +7 -7
  18. package/dist/{knowledge-CtFA0_YY.js → knowledge-CwPnD1pI.js} +3 -3
  19. package/dist/{knowledge-CtFA0_YY.js.map → knowledge-CwPnD1pI.js.map} +1 -1
  20. package/dist/knowledge.d.ts +1 -1
  21. package/dist/knowledge.js +1 -1
  22. package/dist/{loop-runner-bin-CBW9ri20.d.ts → loop-runner-bin-CC5c39zY.d.ts} +2 -2
  23. package/dist/{loop-runner-bin-Cak-SbgO.js → loop-runner-bin-DWQCX7cS.js} +3 -3
  24. package/dist/{loop-runner-bin-Cak-SbgO.js.map → loop-runner-bin-DWQCX7cS.js.map} +1 -1
  25. package/dist/loop-runner-bin.d.ts +1 -1
  26. package/dist/loop-runner-bin.js +1 -1
  27. package/dist/mcp/bin.js +3 -3
  28. package/dist/mcp/index.d.ts +1 -1
  29. package/dist/mcp/index.js +4 -4
  30. package/dist/{openai-tools-BeYChImD.js → openai-tools-DYZaZVDC.js} +2 -2
  31. package/dist/{openai-tools-BeYChImD.js.map → openai-tools-DYZaZVDC.js.map} +1 -1
  32. package/dist/{runtime-B6YK6v3I.js → runtime-DRr7g_2C.js} +261 -22
  33. package/dist/runtime-DRr7g_2C.js.map +1 -0
  34. package/dist/{structural-rollout-BQh7Rzoa.js → structural-rollout-BfOB1pIb.js} +9 -4
  35. package/dist/structural-rollout-BfOB1pIb.js.map +1 -0
  36. package/dist/{supervise-C_P4yxA4.js → supervise-C3yRHeDk.js} +35 -6
  37. package/dist/supervise-C3yRHeDk.js.map +1 -0
  38. package/dist/{supervisor-C5pAAPb5.js → supervisor-D8sBmGYd.js} +2 -1
  39. package/dist/supervisor-D8sBmGYd.js.map +1 -0
  40. package/dist/testing.d.ts +1 -1
  41. package/dist/testing.js +11 -11
  42. package/package.json +1 -1
  43. package/dist/runtime-B6YK6v3I.js.map +0 -1
  44. package/dist/structural-rollout-BQh7Rzoa.js.map +0 -1
  45. package/dist/supervise-C_P4yxA4.js.map +0 -1
  46. package/dist/supervisor-C5pAAPb5.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-B6YK6v3I.js","names":["isAsyncIterable","fsConstants"],"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/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/retained-run-binding.ts","../src/runtime/retained-run-events.ts","../src/runtime/retained-run-handle.ts","../src/runtime/turn-input.ts","../src/runtime/retained-run-start.ts","../src/runtime/run-benchmark.ts","../src/runtime/sandbox-run.ts","../src/runtime/strategy-author.ts","../src/runtime/strategy-evolution.ts","../src/runtime/supervise/chat-transport-executor.ts","../src/runtime/supervise/patch-checks.ts","../src/runtime/supervise/patch-deliverable.ts","../src/runtime/supervise/trajectory-recorder.ts","../src/runtime/supervise/untracked-clone.ts","../src/runtime/supervise/worker-evidence.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, on either channel:\n *\n * - interface ≥0.40 canonical: `profile.mcp[key].env.ENV_VAR_NAME`\n * = `{ kind: 'secret-ref', key: 'PROVIDER_KEY_NAME', format? }`\n * - legacy metadata channel: `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 {\n AgentProfileConfigValue,\n AgentProfileMcpServer,\n AgentProfileSecretRef,\n} 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/** Apply a secret-ref's declared decoration to its resolved raw value. */\nfunction formatSecretValue(value: string, format: AgentProfileSecretRef['format']): string {\n return format === 'bearer' ? `Bearer ${value}` : value\n}\n\n/** The spawn-ready strings for one stdio MCP server: profile config values\n * resolved, secrets separated so the client can redact them. */\nexport interface ResolvedMcpServerLaunch {\n args?: string[]\n /** Public env, safe to appear in diagnostics. */\n env?: Record<string, string>\n /** Resolved secret env. Reaches only the child process; redacted everywhere else. */\n protectedEnv?: Record<string, string>\n}\n\n/**\n * Resolve a profile MCP server's `args`/`env` config values (interface ≥0.40\n * `AgentProfileConfigValue`) plus the legacy `metadata.secretEnv` channel into\n * the plain strings a spawn needs.\n *\n * Rules, all fail-closed:\n * - `args` must be public values. A secret-ref in argv is refused: argv is\n * readable by every host process (/proc/PID/cmdline) and outside the\n * protected-value redaction channel, so a secret there cannot be contained.\n * - `env` secret-refs resolve through the KeyProvider (missing provider or key\n * throws, naming the KEY NAME only) and land in `protectedEnv`.\n * - An env var declared secret on BOTH channels (env secret-ref and\n * metadata.secretEnv) is ambiguous configuration and throws.\n * - A public `env` entry shadowed by a legacy metadata secret keeps the\n * pre-0.40 spawn precedence: the secret value wins in the child env.\n */\nexport async function resolveMcpServerLaunch(\n server: AgentProfileMcpServer,\n keys: KeyProvider | undefined,\n label: string,\n): Promise<ResolvedMcpServerLaunch> {\n const args = server.args?.map((value: AgentProfileConfigValue, index: number): string => {\n if (value.kind !== 'public') {\n throw new ValidationError(\n `${label}.args[${index}] is a secret-ref ('${value.key}') — argv is readable by every host process and exempt from redaction; declare the secret in env instead`,\n )\n }\n return value.value\n })\n\n const publicEnv: Record<string, string> = {}\n const envSecretRefs: Record<string, string> = {}\n const envSecretFormats: Record<string, AgentProfileSecretRef['format']> = {}\n for (const [envName, value] of Object.entries(server.env ?? {})) {\n if (value.kind === 'public') {\n publicEnv[envName] = value.value\n } else {\n envSecretRefs[envName] = value.key\n envSecretFormats[envName] = value.format\n }\n }\n\n const legacySecretEnv = secretEnvOfMcpServer(server)\n for (const envName of Object.keys(legacySecretEnv ?? {})) {\n if (envName in envSecretRefs) {\n throw new ValidationError(\n `${label}: env ${envName} is declared secret twice — once as an env secret-ref and once in metadata.${mcpSecretEnvMetadataKey}; keep exactly one declaration`,\n )\n }\n }\n\n const resolvedRefs = await resolveSecretEnv(envSecretRefs, keys, label)\n const protectedEnv: Record<string, string> = {\n ...(legacySecretEnv ? await resolveSecretEnv(legacySecretEnv, keys, label) : {}),\n ...Object.fromEntries(\n Object.entries(resolvedRefs).map(([envName, raw]) => [\n envName,\n formatSecretValue(raw, envSecretFormats[envName]),\n ]),\n ),\n }\n\n return {\n ...(args ? { args } : {}),\n ...(server.env ? { env: publicEnv } : {}),\n ...(Object.keys(protectedEnv).length > 0 ? { protectedEnv } : {}),\n }\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, resolveMcpServerLaunch } 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 at spawn time — env entries of kind\n * `secret-ref` (interface ≥0.40) and the legacy `metadata.secretEnv` map\n * (env var name → provider key name). The resolved values reach ONLY the\n * child process env — never the profile, the logs, or an error message.\n * Fail-closed: a server declaring secrets without a provider (or with a\n * missing key) 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 // Resolve profile config values (public args/env, env secret-refs, and\n // the legacy metadata.secretEnv channel) into spawn strings NOW. The\n // resolved secret values live in this local and the child env — nowhere\n // else — and every resolution failure aborts the whole materialization.\n const launch = await resolveMcpServerLaunch(\n server,\n opts.keys,\n `materializeLocalMcp: profile.mcp['${key}']`,\n )\n const conn = await connectStdioMcp({\n command: server.command,\n ...(launch.args ? { args: launch.args } : {}),\n ...(server.cwd ? { cwd: server.cwd } : {}),\n ...(launch.env ? { env: launch.env } : {}),\n ...(launch.protectedEnv ? { protectedEnv: launch.protectedEnv } : {}),\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 { AgentProfile } from '@tangle-network/agent-interface'\nimport { profileChatClient } from './profile-chat-client'\nimport type { ExecutorConfig } from './supervise/runtime'\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 /** Exact auditor identity. */\n profile: AgentProfile\n /** Execution substrate. All behavior comes from the profile. */\n executor: ExecutorConfig\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 profileChatClient({\n profile: opts.profile,\n executor: opts.executor,\n context: 'intent auditor',\n }).chat(\n {\n jsonSchema: auditSchema as unknown as { name: string; schema: Record<string, unknown> },\n messages: [\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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\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 { canonicalObservedModel } from './model-identity'\nimport { type RunAgentRoundsOptions, runAgentRounds } from './run-loop'\nimport { type SuperviseOptions, supervise } from './supervise/supervise'\nimport type { ProviderModelExecutionEvidence, SupervisedResult } from './supervise/types'\nimport type { LoopResult, LoopTokenUsage, LoopTraceEmitter, SandboxClient } from './types'\nimport { hasCompleteCacheBreakdown } from './util'\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 costReceiptFromUsage(result.tokenUsage, model, {\n usageUnknown: result.tokenUsage.tokensKnown === false,\n actualCostUsd: result.costUsdKnown !== false ? result.costUsd : undefined,\n costUnknown: result.costUsdKnown === false,\n estimatedCostUsd: result.estimatedCostUsd,\n })\n}\n\n/** Map Runtime usage into Eval's canonical paid-call receipt without inventing cache classes. */\nfunction costReceiptFromUsage(\n usage: LoopTokenUsage,\n model: string,\n cost: {\n usageUnknown?: boolean\n actualCostUsd?: number\n costUnknown?: boolean\n estimatedCostUsd?: number\n },\n): CostReceiptInput {\n const cacheComplete =\n hasCompleteCacheBreakdown(usage) &&\n (usage.freshInput !== undefined ||\n usage.cacheRead !== undefined ||\n usage.cacheWrite !== undefined)\n const cacheRead = cacheComplete ? (usage.cacheRead ?? 0) : undefined\n const cacheWrite = cacheComplete ? (usage.cacheWrite ?? 0) : undefined\n const classified = (cacheRead ?? 0) + (cacheWrite ?? 0)\n return {\n model,\n // Eval prices fresh prompt input separately. A partial cache split remains one total input\n // number, rather than pretending omitted classes were zero.\n inputTokens: cacheComplete ? usage.input - classified : usage.input,\n outputTokens: usage.output,\n ...(cacheComplete ? { cachedTokens: cacheRead, cacheWriteTokens: cacheWrite } : {}),\n ...(usage.tokensKnown === false || cost.usageUnknown ? { usageUnknown: true } : {}),\n ...(cost.actualCostUsd !== undefined ? { actualCostUsd: cost.actualCostUsd } : {}),\n ...(cost.costUnknown ? { costUnknown: true } : {}),\n ...(cost.estimatedCostUsd !== undefined ? { estimatedCostUsd: cost.estimatedCostUsd } : {}),\n }\n}\n\n/** `supervise` options minus Eval-owned cancellation. */\nexport type SuperviseOptionsForDispatch = Omit<SuperviseOptions, 'signal'>\n\n/**\n * Adapt a recursive Runtime `supervise()` tree to one Agent Eval profile-matrix cell.\n *\n * The adapter starts Eval's paid-call record before the tree starts. Runtime remains the sole\n * owner of recursive execution, budgets, and the journal; Eval remains the sole owner of the\n * paid-call admission and resulting receipt.\n */\nexport interface SuperviseDispatchOptions<TScenario extends Scenario, TArtifact> {\n /** Build the task passed to the root supervisor for this profile/scenario cell. */\n toTask: (scenario: TScenario, profile: AgentProfile) => unknown\n /** Build the Runtime-owned recursive-run options for this profile/scenario cell. */\n toSuperviseOptions: (scenario: TScenario, profile: AgentProfile) => SuperviseOptionsForDispatch\n /** Map the terminal tree result to the artifact judges score. Default: winner output. */\n toArtifact?: (result: SupervisedResult<unknown>) => TArtifact\n /** Cost-meter source label. Default `'supervise'`. */\n costSource?: string\n /** Provider- or executor-enforced maximum for the complete supervised tree. */\n maximumCharge?:\n | MaximumCharge\n | ((scenario: TScenario, profile: AgentProfile) => MaximumCharge | undefined)\n}\n\ntype SupervisedTreeModel =\n | { readonly kind: 'known'; readonly model: string }\n | { readonly kind: 'mixed'; readonly models: readonly string[] }\n | { readonly kind: 'unknown' }\n\n/** Eval has one pre-admitted paid call for this dispatch. A tree can settle that call only when\n * Runtime has provider-served identity for every inference attempt that actually started. Plan\n * materialization is deliberately ignored: it describes what Runtime requested, not what the\n * provider served. Every visible terminal child must carry provider attempt evidence; a missing\n * evidence record stays unknown, including zero-valued or incomplete spend.\n * @internal Testable identity projection used by superviseDispatch. */\nexport function supervisedTreeModelForDispatch(\n result: SupervisedResult<unknown>,\n rootProfile: AgentProfile,\n): SupervisedTreeModel {\n void rootProfile\n const canonicalModels = new Set<string>()\n const observedModels: string[] = []\n const wholeTreeEvidence = result.providerModel\n if (\n wholeTreeEvidence === undefined ||\n (wholeTreeEvidence.status !== 'known' &&\n wholeTreeEvidence.reason !== 'provider-model-conflict') ||\n wholeTreeEvidence.attempts.length === 0\n ) {\n return { kind: 'unknown' }\n }\n // Runtime validates each configured executor against its own profile before this boundary. The\n // whole-tree reducer intentionally erases ownership, so this final pass checks only that every\n // served attempt has one homogeneous canonical identity.\n const wholeTreeIdentity = collectProviderModels(wholeTreeEvidence, () => true)\n if (wholeTreeIdentity.kind !== 'known') return wholeTreeIdentity\n for (const model of wholeTreeIdentity.observed) {\n observedModels.push(model.raw)\n canonicalModels.add(model.canonical)\n }\n if (canonicalModels.size === 0) return { kind: 'unknown' }\n if (canonicalModels.size !== 1) {\n return { kind: 'mixed', models: [...canonicalModels].sort() }\n }\n return { kind: 'known', model: observedModels[0] as string }\n}\n\ntype CollectedProviderModel = { readonly raw: string; readonly canonical: string }\n\ntype ProviderModelCollection =\n | { readonly kind: 'known'; readonly observed: ReadonlyArray<CollectedProviderModel> }\n | { readonly kind: 'mixed'; readonly models: ReadonlyArray<string> }\n | { readonly kind: 'unknown' }\n\nfunction collectProviderModels(\n evidence: ProviderModelExecutionEvidence,\n validate: (model: string) => boolean,\n): ProviderModelCollection {\n if (\n (evidence.status !== 'known' && evidence.reason !== 'provider-model-conflict') ||\n !Array.isArray(evidence.attempts) ||\n evidence.attempts.length === 0 ||\n !Array.isArray(evidence.models)\n ) {\n return { kind: 'unknown' }\n }\n const observed: CollectedProviderModel[] = []\n const canonical = new Set<string>()\n const observedRaw = new Set<string>()\n for (const attempt of evidence.attempts) {\n // An attempt entry is created immediately before provider execution. Empty means that\n // execution started but no trusted served model arrived, including an abort after spend.\n if (\n attempt === null ||\n typeof attempt !== 'object' ||\n !Array.isArray(attempt.observations) ||\n attempt.observations.length === 0 ||\n attempt.identityConflict === true\n ) {\n return { kind: 'unknown' }\n }\n let attemptBase: string | undefined\n let attemptSnapshot: string | undefined\n let representative: string | undefined\n for (const model of attempt.observations) {\n if (typeof model !== 'string' || !validate(model)) return { kind: 'unknown' }\n const identity = canonicalObservedModel(model)\n if (identity === undefined) return { kind: 'unknown' }\n const at = identity.lastIndexOf('@')\n const base = at < 0 ? identity : identity.slice(0, at)\n const snapshot = at < 0 ? undefined : identity.slice(at + 1)\n if (attemptBase !== undefined && attemptBase !== base) {\n return {\n kind: 'mixed',\n models: [...new Set([...(attemptBase ? [attemptBase] : []), identity])],\n }\n }\n if (attemptSnapshot !== undefined && snapshot !== undefined && attemptSnapshot !== snapshot) {\n return {\n kind: 'mixed',\n models: [`${attemptBase}@${attemptSnapshot}`, `${base}@${snapshot}`],\n }\n }\n attemptBase = base\n attemptSnapshot ??= snapshot\n if (snapshot !== undefined) representative = model\n observedRaw.add(model)\n }\n if (\n attemptBase === undefined ||\n attemptSnapshot === undefined ||\n representative === undefined\n ) {\n // A bare route name is useful only as a prefix observation. Exact identity still requires\n // one qualified snapshot from the same provider attempt.\n return { kind: 'unknown' }\n }\n const attemptIdentity = `${attemptBase}@${attemptSnapshot}`\n observed.push({ raw: representative, canonical: attemptIdentity })\n canonical.add(attemptIdentity)\n }\n if (observed.length === 0) return { kind: 'unknown' }\n const declaredRaw = new Set<string>()\n for (const model of evidence.models) {\n if (typeof model !== 'string') return { kind: 'unknown' }\n declaredRaw.add(model)\n }\n if (\n declaredRaw.size !== observedRaw.size ||\n [...declaredRaw].some((model) => !observedRaw.has(model))\n ) {\n return { kind: 'unknown' }\n }\n return canonical.size > 1\n ? { kind: 'mixed', models: [...canonical].sort() }\n : { kind: 'known', observed }\n}\n\n/** The Eval receipt surface has no pre-admitted per-model recursive-tree receipt bundle yet. */\nclass SupervisedTreeModelIdentityError extends Error {\n constructor(identity: Exclude<SupervisedTreeModel, { readonly kind: 'known' }>) {\n const detail =\n identity.kind === 'mixed'\n ? `multiple models (${identity.models.join(', ')})`\n : 'an unknown materialized model'\n super(`superviseDispatch: cannot settle one Eval paid-call receipt for a tree with ${detail}`)\n this.name = 'SupervisedTreeModelIdentityError'\n }\n}\n\nfunction unknownSupervisedTreeReceipt(): CostReceiptInput {\n return {\n model: 'unknown',\n inputTokens: 0,\n outputTokens: 0,\n usageUnknown: true,\n costUnknown: true,\n }\n}\n\n/** Run one recursive supervised tree inside Eval's pre-execution paid-call lifecycle. */\nexport function superviseDispatch<TScenario extends Scenario, TArtifact>(\n opts: SuperviseDispatchOptions<TScenario, TArtifact>,\n): ProfileDispatchFn<TScenario, TArtifact> {\n return async (profile, scenario, ctx) => {\n const superviseOptions = opts.toSuperviseOptions(scenario, profile)\n const task = opts.toTask(scenario, profile)\n const maximumCharge =\n typeof opts.maximumCharge === 'function'\n ? opts.maximumCharge(scenario, profile)\n : opts.maximumCharge\n const paid = await ctx.cost.runPaidCall({\n channel: 'agent',\n actor: opts.costSource ?? 'supervise',\n // A child profile can choose a different model after this call has been admitted. Until the\n // finished tree proves one uniform materialized model, naming the root model would be false.\n model: 'unknown',\n signal: ctx.signal,\n ...(maximumCharge ? { maximumCharge } : {}),\n // The execution signal is written last so a caller cannot bypass Eval cancellation.\n execute: async (executionSignal) => {\n const result = await supervise(profile, task, {\n ...superviseOptions,\n signal: executionSignal,\n })\n const identity = supervisedTreeModelForDispatch(result, profile)\n if (identity.kind !== 'known') throw new SupervisedTreeModelIdentityError(identity)\n return result\n },\n receipt: (result) => {\n const identity = supervisedTreeModelForDispatch(result, profile)\n if (identity.kind !== 'known') throw new SupervisedTreeModelIdentityError(identity)\n return costReceiptFromUsage(result.spentTotal.tokens, identity.model, {\n usageUnknown: result.spentTotal.tokensKnown === false,\n actualCostUsd: result.spentTotal.usdKnown !== false ? result.spentTotal.usd : undefined,\n costUnknown: result.spentTotal.usdKnown === false,\n })\n },\n receiptFromError: (error) =>\n error instanceof SupervisedTreeModelIdentityError\n ? unknownSupervisedTreeReceipt()\n : undefined,\n })\n if (!paid.succeeded) throw paid.error\n const toArtifact =\n opts.toArtifact ??\n ((result: SupervisedResult<unknown>) => {\n if (result.kind !== 'winner') {\n throw new Error(\n `superviseDispatch: supervised tree ended without a winner (${result.reason})`,\n )\n }\n return result.out as TArtifact\n })\n return toArtifact(paid.value)\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 */\n\nimport { type AgentProfile, agentProfileSchema } from '@tangle-network/agent-interface'\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(\n factory: ExecutorFactory<unknown>,\n defaults: { profile?: AgentProfile } = {},\n): SandboxClient {\n const capturedDefaultProfile =\n defaults.profile === undefined\n ? undefined\n : agentProfileSchema.parse(structuredClone(defaults.profile))\n let seq = 0\n return {\n async create(options?: CreateSandboxOptions): Promise<SandboxInstance> {\n const id = `inline-${seq++}`\n // The requested backend remains visible so Runtime can reject a conflicting redundant\n // declaration. The exact profile below remains the sole behavioral source.\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 requestedProfile =\n (options?.backend && typeof options.backend === 'object'\n ? (options.backend as { profile?: unknown }).profile\n : undefined) ?? capturedDefaultProfile\n const parsedProfile = agentProfileSchema.safeParse(requestedProfile)\n if (!parsedProfile.success) {\n throw new Error(\n 'inlineSandboxClient: an exact AgentProfile is required; pass defaults.profile or create({ backend: { profile } })',\n )\n }\n const spec: AgentSpec = { profile: parsedProfile.data, 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\n | {\n content?: string\n estimatedCostUsd?: number\n promptCache?: Readonly<Record<string, number | string>>\n }\n | 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 const estimatedCostUsd = out?.estimatedCostUsd\n if (\n artifact.spent.iterations > 0 ||\n artifact.spent.tokensKnown === false ||\n artifact.spent.usdKnown === false ||\n tokensIn > 0 ||\n tokensOut > 0 ||\n costUsd > 0 ||\n estimatedCostUsd !== undefined\n ) {\n yield {\n type: 'llm_call',\n data: {\n ...(artifact.spent.tokensKnown === false ? {} : { tokensIn, tokensOut }),\n ...(artifact.spent.usdKnown !== false ? { costUsd } : {}),\n ...(artifact.spent.tokensKnown === false ? { tokensKnown: false } : {}),\n ...(artifact.spent.usdKnown === false ? { costKnown: false } : {}),\n ...(artifact.spent.usdKnown !== false\n ? {\n costKnown: true,\n costProvenance: 'provider-receipt',\n }\n : {}),\n ...(estimatedCostUsd !== undefined ? { estimatedCostUsd } : {}),\n ...(out?.promptCache ? { promptCache: out.promptCache } : {}),\n },\n } as unknown as SandboxEvent\n }\n yield {\n type: 'result',\n data: {\n finalText: out?.content ?? '',\n ...(artifact.spent.tokensKnown === false\n ? { tokensKnown: false }\n : {\n tokenUsage: {\n inputTokens: tokensIn,\n outputTokens: tokensOut,\n },\n }),\n ...(artifact.spent.usdKnown === false\n ? { costKnown: false, ...(costUsd > 0 ? { costUsd } : {}) }\n : {\n costUsd,\n costKnown: true,\n costProvenance: 'provider-receipt',\n }),\n ...(estimatedCostUsd !== undefined ? { estimatedCostUsd } : {}),\n ...(out?.promptCache ? { promptCache: out.promptCache } : {}),\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`: known token usage is emitted as one `llm_call`;\n * Router catalog cost remains a separately-labelled estimate, never billed spend.\n */\n\nimport {\n type AgentProfile,\n type AgentProfileSecurityPolicy,\n canonicalAgentProfileDigest,\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 { executableAgentProfileSnapshot } from './supervise/executable-spec'\nimport { profileModelExecutionSettings, profileProviderModel } from './supervise/model-policy'\nimport { runBrainLoop, type ToolLoopChat } from './tool-loop'\nimport type { SandboxClient } from './types'\n\nexport interface LocalSandboxClientOptions {\n /** Router endpoint/auth. The exact per-create profile owns model and loop behavior. */\n router: { baseUrl: string; key: string }\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 const defaultProfile =\n opts.profile === undefined\n ? undefined\n : executableAgentProfileSnapshot(opts.profile, 'localSandboxClient default profile')\n const router = Object.freeze({ ...opts.router })\n if (opts.profileSecurityPolicy?.allowLocalMcp && defaultProfile === 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 && defaultProfile !== undefined\n ? canonicalAgentProfileDigest(defaultProfile)\n : undefined\n let seq = 0\n return {\n async create(options?: CreateSandboxOptions): Promise<SandboxInstance> {\n const profile = executableAgentProfileSnapshot(\n (options?.backend as { profile?: AgentProfile } | undefined)?.profile ?? defaultProfile,\n 'localSandboxClient',\n )\n const profileModel = profileProviderModel(profile)\n const model = profileModel!\n const settings = profileModelExecutionSettings(profile, 'localSandboxClient')\n const policyApplies =\n opts.profileSecurityPolicy !== undefined &&\n (!opts.profileSecurityPolicy.allowLocalMcp ||\n (trustedProfileDigest !== undefined &&\n canonicalAgentProfileDigest(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: router.baseUrl,\n routerKey: router.key,\n model,\n ...(settings.retry !== undefined ? { retry: settings.retry } : {}),\n ...(settings.maxTokens !== undefined ? { maxTokens: settings.maxTokens } : {}),\n ...(settings.stream !== undefined ? { stream: settings.stream } : {}),\n },\n {\n ...(settings.temperature !== undefined ? { temperature: settings.temperature } : {}),\n ...(settings.seed !== undefined ? { seed: settings.seed } : {}),\n ...(settings.toolChoice !== undefined ? { toolChoice: settings.toolChoice } : {}),\n ...(settings.extraBody !== undefined ? { extraBody: settings.extraBody } : {}),\n ...(profile.model?.reasoningEffort\n ? { reasoningEffort: profile.model.reasoningEffort }\n : {}),\n },\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 estimatedCostUsd = 0\n let sawEstimatedCost = false\n const chat: ToolLoopChat = async (messages, tools) => {\n const r = await brain(messages, tools)\n if (r.costProvenance === 'catalog-estimate' && r.costUsd !== undefined) {\n estimatedCostUsd += r.costUsd\n sawEstimatedCost = true\n }\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: settings.maxTurns ?? 0,\n hooks: { stopBefore: () => popts?.signal?.aborted === true },\n })\n // RouterClient prices locally. Emit measured tokens only when every turn reported them;\n // never project the catalog estimate into SandboxEvent.costUsd.\n if (r.turns > 0) {\n yield {\n type: 'llm_call',\n data: {\n model,\n ...(r.tokensKnown === false\n ? { tokensKnown: false }\n : { tokensIn: r.usage.input, tokensOut: r.usage.output }),\n costKnown: false,\n ...(sawEstimatedCost ? { estimatedCostUsd } : {}),\n },\n } as unknown as SandboxEvent\n }\n yield {\n type: 'result',\n data: {\n finalText: r.final,\n ...(r.tokensKnown === false\n ? { tokensKnown: false }\n : { tokenUsage: { inputTokens: r.usage.input, outputTokens: r.usage.output } }),\n costKnown: false,\n ...(sawEstimatedCost ? { estimatedCostUsd } : {}),\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. The per-create profile owns the model. */\n bridge?: {\n /** cli-bridge base URL. Defaults to `http://127.0.0.1:3355`. */\n url?: string\n bearer: string\n /** Per-turn deadline (ms). */\n timeoutMs?: number\n }\n /** `router` backend: endpoint/auth only; the per-create profile owns behavior. */\n router?: {\n baseUrl: string\n key: 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) {\n throw new Error(\"resolveSandboxClient: backend 'bridge' requires bridge.bearer\")\n }\n return inlineSandboxClient(\n createExecutor({\n backend: 'bridge',\n bridgeUrl: bridge.url ?? 'http://127.0.0.1:3355',\n bridgeBearer: bridge.bearer,\n timeoutMs: bridge.timeoutMs,\n }),\n )\n }\n case 'router': {\n const router = opts.router\n if (!router?.baseUrl || !router.key) {\n throw new Error(\n \"resolveSandboxClient: backend 'router' requires router.baseUrl and router.key\",\n )\n }\n return inlineSandboxClient(\n createExecutor({\n backend: 'router',\n routerBaseUrl: router.baseUrl,\n routerKey: router.key,\n }),\n )\n }\n case 'local': {\n const local = opts.local\n if (!local?.router?.baseUrl || !local.router.key) {\n throw new Error(\n \"resolveSandboxClient: backend 'local' requires local.router.baseUrl and local.router.key\",\n )\n }\n return localSandboxClient(local)\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` + the naive retry driver), 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`, `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 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 { assertExecutableAgentProfile } from './supervise/model-policy'\nimport type { Driver, 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/** Terminal-or-continue decision set of {@link naiveRetryDriver}: the non-terminal `'refine'`\n * requests another shot; `'pick-winner'`/`'fail'` stop the loop (`isTerminalDecision` in\n * run-loop.ts treats them as terminal). */\nexport type NaiveRetryDecision = 'refine' | 'pick-winner' | 'fail'\n\n/**\n * The no-signal retry floor as a bare `Driver` literal: re-run the case VERBATIM as an\n * independent attempt until one shot scores (`verdict.valid`) or the shot cap. It reads ONLY\n * `verdict.valid` — never `notes`/`scores` — so a leaderboard cell's retries carry no grader\n * findings into the next shot (the leak-free firewall). Steering POLICY texts are registry data\n * (`delegates/naive-continuation` and siblings in the kernel prompt registry) attached to graph\n * edges; this loop-kernel control folds no text in — each shot is the same task object, and the\n * per-shot nonce in `taskToPrompt` keeps the attempts independent at the router.\n */\nexport function naiveRetryDriver<TCase, TArtifact>(\n shots: number,\n): Driver<LeaderboardScenario<TCase>, TArtifact, NaiveRetryDecision> {\n return {\n name: 'naive',\n plan(task, history) {\n if (history.length === 0) return Promise.resolve([task])\n const last = history[history.length - 1]\n if (last?.verdict?.valid === true) return Promise.resolve([])\n if (history.length >= shots) return Promise.resolve([])\n return Promise.resolve([task])\n },\n decide(history) {\n if (history.some((it) => it.verdict?.valid)) return 'pick-winner'\n return history.length < shots ? 'refine' : 'fail'\n },\n describePlan() {\n return { kind: 'refine', rationale: 'naive fixed continuation (no grade signal)' }\n },\n }\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 /** Exact base profile the axes expand over (prompt/tools/skills held fixed).\n * Its provider remains authoritative while each axis cell replaces the\n * harness and concrete 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 /** 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 from a shot's raw events.\n * When this returns a value the default dispatch records it on the paid-call\n * receipt. It cannot complete an inexact planning profile: every expanded\n * cell must already declare a concrete model before backend work starts.\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` + the naive retry driver 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\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 profiles = expandProfileAxes({ base: spec.baseProfile, harnesses, models })\n for (const profile of profiles) {\n assertExecutableAgentProfile(profile, `defineLeaderboard(${spec.name})`)\n }\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 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.\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 NaiveRetryDecision,\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 return {\n // The no-signal retry floor: re-run the same case as an independent attempt until\n // one scores (>0) or the shot cap. The task is re-run verbatim — no grader findings\n // cross into the next shot.\n driver: naiveRetryDriver<TCase, TArtifact>(shots),\n agentRun: {\n profile: cellProfile,\n taskToPrompt: (s) => `${promptOf(s)}\\n\\n<!-- independent-attempt:${shotNonce++} -->`,\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 { AgentProfile } from '@tangle-network/agent-interface'\nimport { type Observation, type ObserveInput, observe } from './observe'\nimport type { Corpus } from './personify/wave-types'\nimport type { ExecutorConfig } from './supervise/runtime'\n\nexport interface HarvestCorpusOptions {\n /** The completed runs to analyze — map your store's rows to `ObserveInput`. */\n runs: AsyncIterable<ObserveInput> | Iterable<ObserveInput>\n /** Exact analyst identity. */\n profile: AgentProfile\n /** Execution substrate. All behavior comes from the profile. */\n executor: ExecutorConfig\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 /** 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 profile: opts.profile,\n executor: opts.executor,\n corpus: opts.corpus,\n tags: opts.tags ?? [],\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`, `chainFindings`) 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 * @stable\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 *\n * @stable\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 *\n * @stable\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 *\n * @stable\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 *\n * @stable\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 *\n * @stable\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 *\n * @stable\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 * @stable\n */\n\nimport { InMemoryResultBlobStore, InMemorySpawnJournal } from '../../durable/spawn-journal'\nimport { ValidationError } from '../../errors'\nimport { withDriverExecutor } from '../supervise/driver-executor'\nimport { executableAgentSpecSnapshot } from '../supervise/executable-spec'\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 *\n * @stable\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 const root = executableAgentSpecSnapshot(input.root, `definePersona(\"${input.name}\")`)\n return Object.freeze({\n name: input.name,\n 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 *\n * @stable\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, cloneTokenUsage, 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(\n (ev) =>\n ev.kind !== 'spawned' &&\n ev.kind !== 'waiting' &&\n ev.kind !== 'metered' &&\n ev.kind !== 'materialized' &&\n ev.kind !== 'execution-bound' &&\n ev.kind !== 'edge' &&\n ev.kind !== 'trace-unpropagated',\n )\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 = cloneSpend(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: (() => {\n const tokens = cloneTokenUsage(a.tokens)\n addTokenUsage(tokens, b.tokens)\n return tokens\n })(),\n ...(a.tokensKnown === false || b.tokensKnown === false ? { tokensKnown: false } : {}),\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: cloneTokenUsage(spend.tokens),\n ...(spend.tokensKnown === false ? { tokensKnown: false } : {}),\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 if (delta.tokensKnown === false) acc.tokensKnown = false\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 come from `heldoutSignificance`, which chooses the\n * decision interval that matches the outcome shape, applies a minimum-evidence floor,\n * and requires the interval's lower bound to clear `deltaThreshold`. A raw h1>h0 point\n * comparison on m≈8 holdout tasks certifies false champions at near coin-flip rates.\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. `low` and `high`\n * are the bounds that carried the decision; `mean` and `median` are diagnostics. */\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; `low` and `high` carried the decision. */\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 using the outcome-appropriate interval selected by `heldoutSignificance`. */\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.decision.low,\n high: sig.decision.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.decision.low,\n high: latSig.decision.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.decision.low,\n high: costSig.decision.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","import {\n type AgentExactRunControlRef,\n AgentExactRunControlRefSchema,\n type AgentRunCancellationAcknowledgement,\n AgentRunCancellationAcknowledgementSchema,\n type AgentRunCancellationRequest,\n AgentRunCancellationRequestSchema,\n agentRunCancellationAcknowledgementMatchesRequest,\n agentRunCancellationRequestDigest,\n canonicalCandidateDigest,\n type InteractionResponseCommand,\n type NativeContextBoundaryProof,\n} from '@tangle-network/agent-interface'\nimport type {\n AgentEnvironment,\n AgentEnvironmentEvent,\n AgentSession,\n AgentSessionStatus,\n AgentTurnResult,\n} from '@tangle-network/agent-interface/environment-provider'\n\nexport function exactSession(\n environment: AgentEnvironment,\n controlRef: AgentExactRunControlRef,\n): { session: AgentSession; controlRef: AgentExactRunControlRef } {\n if (environment.id !== controlRef.environmentId || environment.provider !== controlRef.provider) {\n throw new Error('provider reconstructed a different retained environment')\n }\n if (!environment.session || !controlRef.sessionId) {\n throw new Error('retained run control requires a provider session id')\n }\n const session = environment.session(controlRef.sessionId, { controlRef })\n if (session.id !== controlRef.sessionId) {\n throw new Error('provider reconstructed a different session')\n }\n if (session.controlRef === undefined) {\n throw new Error('provider session did not return its provider-owned run control reference')\n }\n const currentControlRef = AgentExactRunControlRefSchema.parse(session.controlRef)\n if (!sameControlCoordinates(currentControlRef, controlRef)) {\n throw new Error('provider session reconstructed a different retained session')\n }\n if (canonicalCandidateDigest(currentControlRef) !== canonicalCandidateDigest(controlRef)) {\n throw new Error('provider session did not retain the exact run control reference')\n }\n return { session, controlRef: currentControlRef }\n}\n\nexport function sameControlCoordinates(\n left: AgentExactRunControlRef,\n right: AgentExactRunControlRef,\n): boolean {\n return canonicalCandidateDigest(left) === canonicalCandidateDigest(right)\n}\n\nexport function freezeControlRef(controlRef: AgentExactRunControlRef): AgentExactRunControlRef {\n return Object.freeze({ ...AgentExactRunControlRefSchema.parse(controlRef) })\n}\n\nexport function copyControlRef(controlRef: AgentExactRunControlRef): AgentExactRunControlRef {\n return { ...controlRef }\n}\n\nexport function exactControlRef(\n candidate: unknown,\n expected: { provider: string; environmentId: string; sessionId: string },\n): AgentExactRunControlRef {\n if (!candidate) throw new Error('provider dispatch returned no durable run control reference')\n const controlRef = AgentExactRunControlRefSchema.parse(candidate)\n if (\n controlRef.provider !== expected.provider ||\n controlRef.environmentId !== expected.environmentId ||\n controlRef.sessionId !== expected.sessionId\n ) {\n throw new Error('provider dispatch returned control coordinates for another run')\n }\n return controlRef\n}\n\nexport function exactContinuedControlRef(\n candidate: AgentExactRunControlRef,\n initial: AgentExactRunControlRef,\n): AgentExactRunControlRef {\n const controlRef = AgentExactRunControlRefSchema.parse(candidate)\n if (\n controlRef.provider !== initial.provider ||\n controlRef.environmentId !== initial.environmentId ||\n controlRef.sessionId !== initial.sessionId\n ) {\n throw new Error('provider continuation advanced to another retained session')\n }\n if (controlRef.runId === initial.runId && controlRef.executionId === initial.executionId) {\n throw new Error('provider continuation did not return a new exact run execution')\n }\n return controlRef\n}\n\nexport function assertInteractionBinding(\n controlRef: AgentExactRunControlRef,\n command: InteractionResponseCommand,\n): void {\n if (\n command.binding.runId !== controlRef.runId ||\n command.binding.provider !== controlRef.provider ||\n command.binding.environmentId !== controlRef.environmentId ||\n command.binding.sessionId !== controlRef.sessionId ||\n command.binding.executionId !== controlRef.executionId ||\n command.binding.requestDigest !== controlRef.requestDigest\n ) {\n throw new Error('interaction response command does not target this retained run')\n }\n}\n\nexport function assertBoundaryBinding(\n controlRef: AgentExactRunControlRef,\n proof: NativeContextBoundaryProof,\n): void {\n if (\n proof.runId !== controlRef.runId ||\n proof.provider !== controlRef.provider ||\n proof.environmentId !== controlRef.environmentId ||\n proof.sessionId !== controlRef.sessionId ||\n proof.executionId !== controlRef.executionId ||\n proof.requestDigest !== controlRef.requestDigest\n ) {\n throw new Error('native context proof does not identify this retained run')\n }\n}\n\nexport function assertSequence(value: unknown, label: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative safe integer`)\n }\n}\n\nexport function assertResultBinding(\n controlRef: AgentExactRunControlRef,\n result: AgentTurnResult,\n): void {\n if (result.sessionId !== controlRef.sessionId) {\n throw new Error('provider returned a result for another retained session')\n }\n const metadata = result.metadata\n if (controlRef.executionId !== undefined && metadata?.executionId !== controlRef.executionId) {\n throw new Error('provider returned a result for another retained execution')\n }\n if (metadata?.runId !== controlRef.runId) {\n throw new Error('provider returned a result for another retained run')\n }\n if (metadata?.requestDigest !== controlRef.requestDigest) {\n throw new Error('provider returned a result for another retained request')\n }\n}\n\ninterface ExactCancelOptions {\n readonly signal?: AbortSignal\n}\n\nexport class RetainedRunProviderContractError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'RetainedRunProviderContractError'\n }\n}\n\nexport function cancellationRequest(\n controlRef: AgentExactRunControlRef,\n operationId: string,\n reason?: string,\n): AgentRunCancellationRequest {\n const material = {\n operationId,\n run: AgentExactRunControlRefSchema.parse(controlRef),\n ...(reason === undefined ? {} : { reason }),\n }\n return AgentRunCancellationRequestSchema.parse({\n ...material,\n requestDigest: agentRunCancellationRequestDigest(material),\n })\n}\n\nexport async function exactSessionCancel(\n session: AgentSession,\n request: AgentRunCancellationRequest,\n options: ExactCancelOptions,\n): Promise<AgentRunCancellationAcknowledgement> {\n if (!session.cancelRun) {\n throw new Error('provider session does not expose durable cancellation operations')\n }\n let acknowledgement: unknown\n try {\n acknowledgement = await awaitAbortable(\n Promise.resolve().then(() => session.cancelRun!(request, options)),\n options.signal,\n )\n } catch (error) {\n if (error instanceof RetainedRunProviderContractError) throw error\n throw error\n }\n let exactAcknowledgement: AgentRunCancellationAcknowledgement\n try {\n exactAcknowledgement = AgentRunCancellationAcknowledgementSchema.parse(acknowledgement)\n } catch {\n throw new RetainedRunProviderContractError(\n 'provider returned an invalid retained cancellation acknowledgement',\n )\n }\n if (!agentRunCancellationAcknowledgementMatchesRequest(request, exactAcknowledgement)) {\n throw new RetainedRunProviderContractError(\n 'provider returned a retained cancellation acknowledgement for another request',\n )\n }\n return exactAcknowledgement\n}\n\nexport function hasDurableCancel(session: AgentSession): boolean {\n return typeof session.cancelRun === 'function'\n}\n\nexport async function awaitAbortable<T>(\n work: PromiseLike<T>,\n signal: AbortSignal | undefined,\n): Promise<T> {\n if (signal === undefined) return await work\n if (signal.aborted) {\n void Promise.resolve(work).catch(() => undefined)\n throw abortError(signal.reason)\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false\n const cleanup = () => signal.removeEventListener('abort', onAbort)\n const onAbort = () => {\n queueMicrotask(() => {\n if (settled) return\n settled = true\n cleanup()\n reject(abortError(signal.reason))\n })\n }\n signal.addEventListener('abort', onAbort, { once: true })\n Promise.resolve(work).then(\n (value) => {\n if (settled) return\n settled = true\n cleanup()\n resolve(value)\n },\n (error) => {\n if (settled) return\n settled = true\n cleanup()\n reject(error)\n },\n )\n })\n}\n\nexport async function exactSessionResult(session: AgentSession): Promise<AgentTurnResult> {\n return session.result()\n}\n\nexport function assertEventBinding(\n source: AgentEnvironmentEvent,\n controlRef: AgentExactRunControlRef,\n): void {\n const transport = isRecord(source) ? source : undefined\n const record = isRecord(source.data) ? source.data : undefined\n const providerEvent = isRecord(source.providerEvent) ? source.providerEvent : undefined\n const values = [transport, record, providerEvent].filter(\n (value): value is Record<string, unknown> => value !== undefined,\n )\n for (const value of values) {\n if (value.runId !== undefined && value.runId !== controlRef.runId) {\n throw new Error('provider returned an event for another retained run')\n }\n if (value.executionId !== undefined && value.executionId !== controlRef.executionId) {\n throw new Error('provider returned an event for another retained execution')\n }\n if (value.sessionId !== undefined && value.sessionId !== controlRef.sessionId) {\n throw new Error('provider returned an event for another retained session')\n }\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function assertStableText(value: string, label: string): void {\n if (value.length === 0 || value.trim() !== value) {\n throw new Error(`${label} must be non-empty and have no outer whitespace`)\n }\n}\n\nexport function abortError(reason: unknown): Error {\n const error = new Error(reason === undefined ? 'aborted' : String(reason))\n error.name = 'AbortError'\n return error\n}\n\nexport function assertWaitDuration(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative safe integer`)\n }\n}\n\nexport function isTerminalSessionStatus(status: AgentSessionStatus | null): boolean {\n return (\n status === 'completed' || status === 'failed' || status === 'cancelled' || status === 'expired'\n )\n}\n\nexport function delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(abortError(signal.reason))\n return new Promise((resolveDelay, rejectDelay) => {\n const timer = setTimeout(finish, ms)\n function finish() {\n signal?.removeEventListener('abort', onAbort)\n resolveDelay()\n }\n function onAbort() {\n clearTimeout(timer)\n signal?.removeEventListener('abort', onAbort)\n rejectDelay(abortError(signal?.reason))\n }\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n","import {\n type AgentExactRunControlRef,\n type RuntimeEventEnvelope,\n RuntimeEventEnvelopeSchema,\n type StreamEvent,\n} from '@tangle-network/agent-interface'\nimport type {\n AgentEnvironmentEvent,\n AgentSession,\n} from '@tangle-network/agent-interface/environment-provider'\nimport {\n abortError,\n assertEventBinding,\n assertSequence,\n assertStableText,\n awaitAbortable,\n} from './retained-run-binding'\nimport type { RetainedRunEventOptions } from './retained-run-types'\nimport { extractTransportEventIdentity, parseCanonicalTransportEvent } from './sandbox-events'\n\nexport async function* retainedRunEvents(\n session: AgentSession,\n controlRef: AgentExactRunControlRef,\n options: RetainedRunEventOptions | undefined,\n now: () => number,\n): AsyncGenerator<RuntimeEventEnvelope> {\n const after = options?.after\n if (after) {\n assertStableText(after.cursor, 'replay cursor')\n assertSequence(after.sequence, 'replay sequence')\n }\n let nextSequence = after === undefined ? 1 : after.sequence + 1\n let lastSequence = after?.sequence ?? -1\n const seen = new Set<string>()\n let firstAfterEvent = after !== undefined\n const iterator = session\n .events({\n ...(after === undefined ? {} : { since: after.cursor }),\n ...(controlRef.executionId === undefined ? {} : { executionId: controlRef.executionId }),\n ...(options?.signal === undefined ? {} : { signal: options.signal }),\n })\n [Symbol.asyncIterator]()\n try {\n for (;;) {\n const next = await awaitAbortable(\n Promise.resolve().then(() => iterator.next()),\n options?.signal,\n )\n if (next.done) break\n const source = next.value\n const identity = extractTransportEventIdentity(source)\n const sourceCursor = identity.cursor ?? identity.eventId\n assertEventBinding(source, controlRef)\n if (sourceCursor === after?.cursor) continue\n const event = canonicalEvent(source)\n if (!event) continue\n if (firstAfterEvent && after !== undefined) {\n if (identity.sequence !== undefined && identity.sequence <= after.sequence) {\n throw new Error(\n 'provider replay did not prove that the first event follows the requested cursor',\n )\n }\n firstAfterEvent = false\n }\n const eventId = identity.eventId ?? identity.cursor\n if (!eventId) {\n throw new Error('replayable canonical event has no stable provider event id or cursor')\n }\n assertStableText(eventId, 'provider event id')\n if (seen.has(eventId)) throw new Error(`provider replay repeated event id \"${eventId}\"`)\n seen.add(eventId)\n const sourceSequence = identity.sequence\n const sequence = sourceSequence ?? nextSequence\n if (sequence <= lastSequence) {\n throw new Error(\n `provider event sequence is not monotonic: ${sequence} follows ${lastSequence}`,\n )\n }\n const occurredAt = identity.occurredAt\n const envelope = RuntimeEventEnvelopeSchema.parse({\n runId: controlRef.runId,\n eventId,\n sequence,\n cursor: identity.cursor ?? eventId,\n ...(occurredAt === undefined ? {} : { occurredAt }),\n receivedAt: new Date(now()).toISOString(),\n event,\n })\n yield envelope\n lastSequence = sequence\n nextSequence = sequence + 1\n }\n } catch (error) {\n if (options?.signal?.aborted) {\n try {\n void Promise.resolve(iterator.return?.()).catch(() => undefined)\n } catch {\n // The caller's abort is the only observable result of an interrupted read.\n }\n throw abortError(options.signal.reason)\n }\n throw error\n } finally {\n if (!options?.signal?.aborted) await iterator.return?.()\n }\n}\n\nfunction canonicalEvent(source: AgentEnvironmentEvent): StreamEvent | undefined {\n return parseCanonicalTransportEvent(\n source.type,\n source.data,\n source.normalized ?? source.data.normalized,\n 'provider',\n )\n}\n","import {\n type AgentExactRunControlRef,\n AgentNativeContextContinuationResultSchema,\n AgentTurnResultSchema,\n agentNativeContextContinuationResultMatchesRequest,\n canonicalCandidateDigest,\n type InteractionAcknowledgement,\n InteractionAcknowledgementSchema,\n InteractionResponseCommandSchema,\n type NativeContextBoundaryProof,\n NativeContextBoundaryProofSchema,\n NativeContextContinuationRequestSchema,\n nativeContextContinuationTurnDigest,\n} from '@tangle-network/agent-interface'\nimport type {\n AgentEnvironment,\n AgentEnvironmentCapabilities,\n AgentSession,\n AgentSessionStatus,\n} from '@tangle-network/agent-interface/environment-provider'\nimport {\n abortError,\n assertBoundaryBinding,\n assertInteractionBinding,\n assertResultBinding,\n assertStableText,\n assertWaitDuration,\n awaitAbortable,\n cancellationRequest,\n copyControlRef,\n delay,\n exactContinuedControlRef,\n exactSessionCancel,\n exactSessionResult,\n freezeControlRef,\n hasDurableCancel,\n isTerminalSessionStatus,\n RetainedRunProviderContractError,\n sameControlCoordinates,\n} from './retained-run-binding'\nimport { retainedRunEvents } from './retained-run-events'\nimport type {\n NativeContextContinuationExecution,\n RetainedRunCancellation,\n RetainedRunEffect,\n RetainedRunHandle,\n RetainedRunSnapshot,\n} from './retained-run-types'\n\nexport function createRetainedRunHandle(\n environment: AgentEnvironment,\n session: AgentSession,\n initialControlRef: AgentExactRunControlRef,\n capabilities: AgentEnvironmentCapabilities,\n now: (() => number) | undefined,\n): RetainedRunHandle {\n const clock = now ?? Date.now\n let activeControlRef = freezeControlRef(initialControlRef)\n const snapshot = async (reason?: string, signal?: AbortSignal): Promise<RetainedRunSnapshot> => {\n if (signal?.aborted) throw abortError(signal.reason)\n let status: AgentSessionStatus | null\n try {\n status = await awaitAbortable(\n Promise.resolve().then(() => session.status({ signal })),\n signal,\n )\n } catch {\n if (signal?.aborted) throw abortError(signal.reason)\n status = 'unknown'\n }\n const effect: RetainedRunEffect =\n status === 'cancelled'\n ? 'cancelled'\n : status === 'completed' || status === 'failed' || status === 'expired'\n ? 'not_live'\n : 'unknown'\n return {\n runId: activeControlRef.runId,\n controlRef: copyControlRef(activeControlRef),\n status,\n effect,\n observedAt: new Date(clock()).toISOString(),\n ...(reason === undefined ? {} : { reason }),\n ...(signal?.aborted ? { signal: String(signal.reason ?? 'aborted') } : {}),\n }\n }\n return {\n get controlRef() {\n return copyControlRef(activeControlRef)\n },\n status: async (options) => {\n const waitMs = options?.waitMs ?? 0\n assertWaitDuration(waitMs, 'retained status wait')\n const initial = await snapshot(undefined, options?.signal)\n if (waitMs === 0 || isTerminalSessionStatus(initial.status)) return initial\n const deadline = Date.now() + waitMs\n let current = initial\n while (Date.now() < deadline) {\n await delay(Math.min(25, Math.max(1, deadline - Date.now())), options?.signal)\n current = await snapshot(undefined, options?.signal)\n if (current.status !== initial.status || isTerminalSessionStatus(current.status)) {\n return current\n }\n }\n return current\n },\n events: (options) =>\n retainedRunEvents(session, copyControlRef(activeControlRef), options, clock),\n result: async () => {\n const result = AgentTurnResultSchema.parse(await exactSessionResult(session))\n assertResultBinding(activeControlRef, result)\n return structuredClone(result)\n },\n async respondToInteraction(command, options): Promise<InteractionAcknowledgement> {\n const exactCommand = InteractionResponseCommandSchema.parse(command)\n assertInteractionBinding(activeControlRef, exactCommand)\n if (capabilities.interactions?.responseIdempotency !== true) {\n throw new Error(\n `provider \"${activeControlRef.provider}\" does not promise retry-safe interaction responses`,\n )\n }\n const respond = session.respondToInteraction ?? environment.respondToInteraction\n if (!respond) {\n throw new Error(\n `provider \"${activeControlRef.provider}\" does not support interaction responses`,\n )\n }\n const acknowledgement = InteractionAcknowledgementSchema.parse(\n await awaitAbortable(\n Promise.resolve().then(() =>\n respond.call(\n session.respondToInteraction ? session : environment,\n exactCommand,\n options,\n ),\n ),\n options?.signal,\n ),\n )\n if (\n acknowledgement.operationId !== exactCommand.operationId ||\n acknowledgement.commandDigest !== exactCommand.commandDigest ||\n canonicalCandidateDigest(acknowledgement.binding) !==\n canonicalCandidateDigest(exactCommand.binding)\n ) {\n throw new Error('provider returned an interaction acknowledgement for another command')\n }\n return structuredClone(acknowledgement)\n },\n async contextBoundary(options): Promise<NativeContextBoundaryProof | null> {\n if (!session.contextBoundary) return null\n const proof = await awaitAbortable(\n Promise.resolve().then(() => session.contextBoundary!(options)),\n options?.signal,\n )\n if (proof === null) return null\n const exactProof = NativeContextBoundaryProofSchema.parse(proof)\n assertBoundaryBinding(activeControlRef, exactProof)\n return structuredClone(exactProof)\n },\n async continueNative(request, turn): Promise<NativeContextContinuationExecution> {\n const exactRequest = NativeContextContinuationRequestSchema.parse(request)\n if (!sameControlCoordinates(exactRequest.run, activeControlRef)) {\n throw new Error('native continuation request targets another retained run')\n }\n const { timeoutMs, signal, ...semanticTurn } = turn\n if (nativeContextContinuationTurnDigest(semanticTurn) !== exactRequest.turnDigest) {\n throw new Error('native continuation request targets another user turn')\n }\n if (\n capabilities.nativeContinuation?.atomicBoundary !== true ||\n capabilities.nativeContinuation.requestIdempotency !== true ||\n !session.continueNative\n ) {\n throw new Error(\n `provider \"${activeControlRef.provider}\" does not support retry-safe native continuation`,\n )\n }\n const outcome = AgentNativeContextContinuationResultSchema.parse(\n await awaitAbortable(\n Promise.resolve().then(() =>\n session.continueNative!(exactRequest, {\n turn: semanticTurn,\n ...(timeoutMs === undefined ? {} : { timeoutMs }),\n ...(signal === undefined ? {} : { signal }),\n }),\n ),\n signal,\n ),\n )\n if (\n outcome.acknowledgement.operationId !== exactRequest.operationId ||\n outcome.acknowledgement.requestDigest !== exactRequest.requestDigest\n ) {\n throw new Error('provider returned a native continuation result for another request')\n }\n if (outcome.acknowledgement.actualBoundary !== undefined) {\n const actualBoundary = NativeContextBoundaryProofSchema.parse(\n outcome.acknowledgement.actualBoundary,\n )\n assertBoundaryBinding(exactRequest.run, actualBoundary)\n }\n if (\n outcome.acknowledgement.status !== 'accepted' &&\n outcome.acknowledgement.status !== 'replayed'\n ) {\n return structuredClone(outcome)\n }\n if (!('result' in outcome) || !('controlRef' in outcome)) {\n throw new Error('provider omitted the successful native continuation result')\n }\n if (!agentNativeContextContinuationResultMatchesRequest(exactRequest, outcome)) {\n throw new Error('provider returned a native continuation result for another request')\n }\n const nextControlRef = exactContinuedControlRef(outcome.controlRef, activeControlRef)\n assertResultBinding(nextControlRef, outcome.result)\n activeControlRef = freezeControlRef(nextControlRef)\n return structuredClone({ ...outcome, controlRef: copyControlRef(activeControlRef) })\n },\n async cancel(options): Promise<RetainedRunCancellation> {\n assertStableText(options.operationId, 'retained cancellation operation id')\n if (options.reason !== undefined)\n assertStableText(options.reason, 'retained cancellation reason')\n if (options.signal?.aborted) throw abortError(options.signal.reason)\n if (!hasDurableCancel(session)) {\n throw new Error(\n `provider \"${activeControlRef.provider}\" does not expose durable cancellation operations`,\n )\n }\n const request = cancellationRequest(activeControlRef, options.operationId, options.reason)\n let effect: RetainedRunEffect = 'unknown'\n let providerStatus: RetainedRunCancellation['status'] | undefined\n try {\n const acknowledgement = await exactSessionCancel(session, request, {\n signal: options.signal,\n })\n effect = acknowledgement.effect\n providerStatus = acknowledgement.status\n } catch (error) {\n if (error instanceof RetainedRunProviderContractError) throw error\n if (error instanceof Error && error.name === 'AbortError') throw error\n effect = 'unknown'\n }\n const current = await snapshot(options.reason, options.signal)\n const observedEffect =\n effect === 'unknown' && providerStatus === undefined && current.status === 'cancelled'\n ? 'cancelled'\n : effect\n const acknowledgement: RetainedRunCancellation = {\n operationId: options.operationId,\n requestDigest: request.requestDigest,\n status:\n providerStatus ?? (observedEffect === 'unknown' ? 'unknown' : ('accepted' as const)),\n effect: observedEffect,\n snapshot: { ...current, effect: observedEffect },\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n ...(options.signal?.aborted ? { signal: String(options.signal.reason ?? 'aborted') } : {}),\n }\n return structuredClone(acknowledgement)\n },\n }\n}\n","import type { ContextTransferRequest } from '@tangle-network/agent-interface'\nimport type { AgentTurnInput } from '@tangle-network/agent-interface/environment-provider'\n\n/**\n * Copy only fields that describe a new provider turn.\n *\n * Session, replay, continuation, and transfer coordinates are runtime-owned\n * and are injected by the caller that owns that lifecycle. Keeping this copy\n * explicit also makes JavaScript callers subject to the same boundary.\n */\nexport function freshTurnInput(\n input: AgentTurnInput,\n runtime: {\n readonly turnId: string\n readonly detach: true\n readonly sessionId?: string\n readonly executionId?: string\n readonly contextTransfer?: ContextTransferRequest\n },\n): AgentTurnInput {\n const fresh: AgentTurnInput = {\n ...(input.prompt === undefined ? {} : { prompt: input.prompt }),\n ...(input.parts === undefined ? {} : { parts: input.parts }),\n ...(input.model === undefined ? {} : { model: input.model }),\n ...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),\n ...(input.context === undefined ? {} : { context: input.context }),\n ...(input.providerOptions === undefined ? {} : { providerOptions: input.providerOptions }),\n ...(input.signal === undefined ? {} : { signal: input.signal }),\n turnId: runtime.turnId,\n detach: runtime.detach,\n ...(runtime.sessionId === undefined ? {} : { sessionId: runtime.sessionId }),\n ...(runtime.executionId === undefined ? {} : { executionId: runtime.executionId }),\n ...(runtime.contextTransfer === undefined ? {} : { contextTransfer: runtime.contextTransfer }),\n }\n return fresh\n}\n","import {\n AgentEnvironmentCapabilitiesSchema,\n AgentExactRunControlRefSchema,\n} from '@tangle-network/agent-interface'\nimport type {\n AgentEnvironmentCapabilities,\n AgentEnvironmentProvider,\n AgentSession,\n} from '@tangle-network/agent-interface/environment-provider'\nimport { RetainedRunAdmissionError, RetainedRunDispatchBindingError } from '../errors'\nimport {\n assertStableText,\n exactControlRef,\n exactSession,\n freezeControlRef,\n} from './retained-run-binding'\nimport { createRetainedRunHandle } from './retained-run-handle'\nimport type {\n ReconnectRetainedRunOptions,\n RecoverRetainedRunOptions,\n RecoverRetainedRunResult,\n RetainedRunAdmission,\n RetainedRunAdmissionHook,\n RetainedRunHandle,\n StartRetainedRunOptions,\n} from './retained-run-types'\nimport { freshTurnInput } from './turn-input'\n\n/**\n * Mint deterministic dispatch coordinates from the two caller-supplied keys.\n * The same `(idempotencyKey, turnId)` pair yields the same coordinates in\n * every process, so a pre-dispatch admission record always names the exact\n * session and execution the dispatch will request. Format is readable, not\n * hashed, following `deriveExecutionId`: components are URL-encoded so\n * delimiters inside caller keys cannot collapse distinct pairs, and the\n * result stays inside the 256-byte identifier bound.\n */\nexport function mintRetainedIdentity(\n idempotencyKey: string,\n turnId: string,\n): { sessionId: string; executionId: string } {\n const base = `${encodeURIComponent(idempotencyKey)}:${encodeURIComponent(turnId)}`\n const sessionId = `retained-session:${base}`\n const executionId = `retained-execution:${base}`\n if (executionId.length > 256) {\n throw new RangeError('minted retained identity must not exceed 256 bytes')\n }\n return { sessionId, executionId }\n}\n\n/**\n * Dispatch one detached, replayable run and return only after exact durable\n * coordinates are confirmed by the provider and persisted by the caller.\n *\n * The required `onAdmission` hook is awaited twice: with the recovery\n * coordinates after environment creation, and with the verified exact control\n * reference after dispatch. The returned promise resolves only after the\n * dispatched admission is durable, so no caller can observe a successful start\n * whose exact reference a crash would lose.\n *\n * @stable\n */\nexport async function startRetainedRun(\n options: StartRetainedRunOptions,\n): Promise<RetainedRunHandle> {\n assertStableText(options.environment.idempotencyKey, 'environment idempotency key')\n assertStableText(options.turn.turnId, 'turn idempotency key')\n if (options.identity !== undefined) {\n assertStableText(options.identity.sessionId, 'retained session id')\n assertStableText(options.identity.executionId, 'retained execution id')\n }\n if (typeof options.onAdmission !== 'function') {\n throw new Error('startRetainedRun requires an awaited onAdmission durability hook')\n }\n const identity =\n options.identity ??\n mintRetainedIdentity(options.environment.idempotencyKey, options.turn.turnId)\n const capabilities = await assertRetainedCapabilities(options.provider)\n if (!options.provider.get) {\n throw new Error(`provider \"${options.provider.name}\" cannot reconstruct an environment by id`)\n }\n\n // Runtime-owned keys in metadata give operators provider-side visibility\n // into which retained coordinates created this environment. Caller metadata\n // is preserved; the runtime keys overwrite same-named caller keys.\n const environment = await options.provider.create({\n ...options.environment,\n metadata: {\n ...options.environment.metadata,\n retainedIdempotencyKey: options.environment.idempotencyKey,\n sessionId: identity.sessionId,\n executionId: identity.executionId,\n },\n })\n if (!environment.dispatch || !environment.session) {\n try {\n await environment.destroy?.()\n } catch (cleanupError) {\n throw new AggregateError(\n [\n new Error(`provider \"${options.provider.name}\" does not expose detached session control`),\n cleanupError,\n ],\n 'retained run could not start and its unused environment could not be destroyed',\n )\n }\n throw new Error(`provider \"${options.provider.name}\" does not expose detached session control`)\n }\n\n // The environment admission fires only for a dispatch-capable environment:\n // an environment destroyed above must never leave a durable record.\n await admitDurably(options.onAdmission, {\n phase: 'environment',\n provider: options.provider.name,\n environmentId: environment.id,\n idempotencyKey: options.environment.idempotencyKey,\n turnId: options.turn.turnId,\n sessionId: identity.sessionId,\n executionId: identity.executionId,\n })\n\n // Once dispatch begins, its outcome may be unknown to this process. Keep the\n // idempotently-created environment so a retry or reconnect can recover the\n // retained operation instead of destroying work that may already be live.\n const reference = await environment.dispatch(\n freshTurnInput(options.turn, {\n turnId: options.turn.turnId,\n detach: true,\n ...identity,\n }),\n )\n // Every post-dispatch binding failure is triageable: the durable\n // environment admission names the requested coordinates, and the error\n // carries the provider's actual answer. The environment is kept.\n let exact: ReturnType<typeof exactSession>\n try {\n if (reference.provider !== undefined && reference.provider !== options.provider.name) {\n throw new Error('provider dispatch returned a session reference for another provider')\n }\n if (reference.id !== identity.sessionId) {\n throw new Error('provider dispatched into another session than the requested identity')\n }\n const controlRef = exactControlRef(reference.controlRef, {\n provider: options.provider.name,\n environmentId: environment.id,\n sessionId: identity.sessionId,\n })\n if (controlRef.executionId !== identity.executionId) {\n throw new Error('provider bound another execution than the requested identity')\n }\n exact = exactSession(environment, controlRef)\n } catch (error) {\n throw new RetainedRunDispatchBindingError(\n {\n provider: options.provider.name,\n environmentId: environment.id,\n sessionId: identity.sessionId,\n executionId: identity.executionId,\n },\n {\n ...(reference.id === undefined ? {} : { id: reference.id }),\n ...(reference.provider === undefined ? {} : { provider: reference.provider }),\n ...(reference.controlRef === undefined ? {} : { controlRef: reference.controlRef }),\n },\n { cause: error },\n )\n }\n await admitDurably(options.onAdmission, {\n phase: 'dispatched',\n controlRef: freezeControlRef(exact.controlRef),\n idempotencyKey: options.environment.idempotencyKey,\n turnId: options.turn.turnId,\n })\n return createRetainedRunHandle(\n environment,\n exact.session,\n exact.controlRef,\n capabilities,\n options.now,\n )\n}\n\n/**\n * Await one admission record through the caller's durability hook. A rejection\n * keeps the environment alive — the provider state plus any partial admission\n * record is the recovery path — and surfaces as `RetainedRunAdmissionError` so\n * callers can distinguish a persistence failure from a provider failure.\n */\nasync function admitDurably(\n onAdmission: RetainedRunAdmissionHook,\n admission: RetainedRunAdmission,\n): Promise<void> {\n try {\n await onAdmission(Object.freeze(admission))\n } catch (error) {\n throw new RetainedRunAdmissionError(admission, { cause: error })\n }\n}\n\n/**\n * Rebuild the exact run named by pre-dispatch admission coordinates, or\n * report why the provider cannot prove it.\n *\n * `not_found`: the provider no longer holds the environment, so nothing\n * remains to destroy. `recovered`: the provider self-identified the session\n * with a strict exact reference matching the recorded coordinates.\n * `unverifiable`: the environment exists but the provider cannot\n * self-identify the session — no session accessor, an accessor that throws,\n * a lazy accessor with no stored reference, or a loose reference. That\n * outcome is never destroy-safe: keep the environment, retry\n * `reconnectRetainedRun` with a dispatched admission record, or inspect the\n * environment with provider-native tools. A session that self-identifies\n * with different coordinates throws: something live is not the recorded run.\n *\n * @stable\n */\nexport async function recoverRetainedRun(\n options: RecoverRetainedRunOptions,\n): Promise<RecoverRetainedRunResult> {\n assertStableText(options.environmentId, 'retained environment id')\n assertStableText(options.sessionId, 'retained session id')\n assertStableText(options.executionId, 'retained execution id')\n const capabilities = await assertRetainedCapabilities(options.provider)\n if (!options.provider.get) {\n throw new Error(`provider \"${options.provider.name}\" cannot reconstruct an environment by id`)\n }\n const environment = await options.provider.get(options.environmentId)\n if (!environment) return { outcome: 'not_found' }\n if (!environment.session) return { outcome: 'unverifiable', environment }\n let session: AgentSession\n try {\n session = environment.session(options.sessionId)\n } catch {\n return { outcome: 'unverifiable', environment }\n }\n // A lazy accessor returns a session for any id and only echoes a reference\n // the caller supplied, so an absent or loose reference proves nothing about\n // the run either way: the answer is unverifiable, never destroy-safe.\n const parsed = AgentExactRunControlRefSchema.safeParse(session.controlRef)\n if (!parsed.success) return { outcome: 'unverifiable', environment }\n const controlRef = parsed.data\n if (\n controlRef.provider !== options.provider.name ||\n controlRef.environmentId !== options.environmentId ||\n controlRef.sessionId !== options.sessionId ||\n controlRef.executionId !== options.executionId\n ) {\n throw new Error('provider session is bound to other retained run coordinates')\n }\n const exact = exactSession(environment, controlRef)\n return {\n outcome: 'recovered',\n handle: createRetainedRunHandle(\n environment,\n exact.session,\n exact.controlRef,\n capabilities,\n options.now,\n ),\n }\n}\n\n/** Rebuild a retained-run client without retaining any object from the starter. @stable */\nexport async function reconnectRetainedRun(\n options: ReconnectRetainedRunOptions,\n): Promise<RetainedRunHandle | null> {\n const controlRef = AgentExactRunControlRefSchema.parse(options.controlRef)\n if (controlRef.provider !== options.provider.name) {\n throw new Error(\n `run provider \"${controlRef.provider}\" does not match \"${options.provider.name}\"`,\n )\n }\n const capabilities = await assertRetainedCapabilities(options.provider)\n if (!options.provider.get) {\n throw new Error(`provider \"${options.provider.name}\" cannot reconstruct an environment by id`)\n }\n const environment = await options.provider.get(controlRef.environmentId)\n if (!environment) return null\n const exact = exactSession(environment, controlRef)\n return createRetainedRunHandle(\n environment,\n exact.session,\n exact.controlRef,\n capabilities,\n options.now,\n )\n}\n\nexport async function assertRetainedCapabilities(\n provider: AgentEnvironmentProvider,\n): Promise<AgentEnvironmentCapabilities> {\n const capabilities = AgentEnvironmentCapabilitiesSchema.parse(await provider.capabilities())\n const retained = capabilities.retainedControl\n if (\n retained?.exactRunIdentity !== true ||\n retained.resultIdentity !== true ||\n retained.eventIdentity !== true ||\n retained.cancellationIdempotency !== true ||\n !capabilities.streaming.detach ||\n !capabilities.streaming.replay ||\n !capabilities.streaming.turnIdempotency\n ) {\n throw new Error(`provider \"${provider.name}\" cannot control a retry-safe retained run`)\n }\n return capabilities\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 { profileChatClient } from './profile-chat-client'\nimport {\n type AgenticOptions,\n type AgenticSurface,\n type AgenticTask,\n refine,\n runAgentic,\n type Strategy,\n sample,\n} from './strategy'\nimport { concreteModelId } from './supervise/model-policy'\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 usdKnown: boolean\n ms: number\n tokens: { input: number; output: number }\n tokensKnown: boolean\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 /** Fraction of task cells whose billed-dollar total was complete. */\n usdKnownRate: 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 profiles = [cfg.worker.workerProfile, cfg.worker.analystProfile ?? cfg.worker.workerProfile]\n const profilesByModel = new Map<string, (typeof profiles)[number]>()\n for (const [index, profile] of profiles.entries()) {\n const model = concreteModelId(profile.model?.default)\n if (!model) {\n throw new Error(\n `Benchmark ${index === 0 ? 'worker' : 'analyst'} AgentProfile.model.default must name an exact model`,\n )\n }\n if (!profilesByModel.has(model)) profilesByModel.set(model, profile)\n }\n const models = [...profilesByModel.keys()]\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 const profile = profilesByModel.get(model)\n if (!profile) throw new Error(`Benchmark preflight has no AgentProfile for model ${model}`)\n await profileChatClient({\n profile,\n context: `runBenchmark model preflight (${model})`,\n executor: {\n backend: 'router',\n routerBaseUrl: worker.routerBaseUrl,\n routerKey: worker.routerKey,\n },\n }).chat({ model, messages: [{ role: 'user', content: 'Reply OK.' }] }, { signal })\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 usdKnown: r.usdKnown,\n ms: r.ms,\n tokens: r.tokens,\n tokensKnown: r.tokensKnown,\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 usdKnown: true,\n ms: 0,\n tokens: { input: 0, output: 0 },\n tokensKnown: true,\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 usdKnownRate: mean(cells.map((c) => (c.usdKnown ? 1 : 0))),\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 { AgentProfile } from '@tangle-network/agent-interface'\nimport { strategyAuthorMethod } from '../improvement/optimizer-prompt'\nimport { profileChatClient } from './profile-chat-client'\nimport type { Strategy } from './strategy'\nimport type { ExecutorConfig } from './supervise/runtime'\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 /** Exact author identity. Runtime binds it to every authoring turn. */\n profile: AgentProfile\n /** Execution substrate for the author. Behavioral settings are forbidden here. */\n executor: ExecutorConfig\n /** An exact 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 fallbackProfile?: AgentProfile\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 signal?: AbortSignal\n}\n\n/** Standing behavior callers put in the strategy-author AgentProfile. */\nexport const strategyAuthorSystemPrompt =\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/** 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 profile: AgentProfile,\n): Promise<string> {\n const chat = profileChatClient({\n profile,\n executor: opts.executor,\n context: 'strategy author',\n })\n const res = await chat.chat(\n {\n messages: [\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: ${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.profile)\n } catch (primaryError) {\n if (!opts.fallbackProfile) throw primaryError\n code = await requestAuthoredCode(opts, opts.fallbackProfile)\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 * @experimental\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { gzipSync } from 'node:zlib'\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport type { RuntimeHooks } from '../runtime-hooks'\nimport { profileChatClient } from './profile-chat-client'\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'\nimport type { ExecutorConfig } from './supervise/runtime'\n\nexport interface EvolutionAuthor {\n /** Exact author identity. */\n profile: AgentProfile\n /** Execution substrate. All behavior comes from the profile. */\n executor: ExecutorConfig\n /** Optional exact fallback identity. */\n fallbackProfile?: AgentProfile\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 profile: cfg.author.profile,\n executor: cfg.author.executor,\n ...(cfg.author.fallbackProfile ? { fallbackProfile: cfg.author.fallbackProfile } : {}),\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 summaryProfile: AgentProfile = {\n ...cfg.author.profile,\n prompt: {\n ...cfg.author.profile.prompt,\n systemPrompt: `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 }\n const summaryRes = await profileChatClient({\n profile: summaryProfile,\n executor: cfg.author.executor,\n context: 'strategy reproducer summary',\n }).chat({\n messages: [{ role: 'user', content: championCode }],\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 profile: cfg.author.profile,\n executor: cfg.author.executor,\n ...(cfg.author.fallbackProfile ? { fallbackProfile: cfg.author.fallbackProfile } : {}),\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 * A session-owning composition over Runtime's canonical Router tool-loop executor.\n *\n * This module adds conversation persistence for graph-edge `resume` continuity. It does not own\n * model selection, prompts, generation controls, retries, tool policy, or provider accounting:\n * those are lowered from one exact `AgentProfile` by `createExecutor({ backend: 'router-tools' })`.\n *\n * @experimental\n */\n\nimport { type AgentProfile, agentProfileSchema } from '@tangle-network/agent-interface'\nimport { contentAddress } from '../../durable/content-address'\nimport { ValidationError } from '../../errors'\nimport type {\n MakeWorkerAgent,\n WorkerResumeContext,\n WorkerSpawnContext,\n} from '../../mcp/tools/coordination'\nimport type { ToolSpec } from '../router-client'\nimport { type DeliverableSpec, gateOnDeliverable, mapExecutorResult } from './completion-gate'\nimport { assertExecutableAgentProfile } from './model-policy'\nimport { createExecutor, type RouterToolsSeam } from './runtime'\nimport type { Agent, AgentSpec, Executor, ExecutorContext, ExecutorResult } from './types'\n\n/** Buffered OpenAI-compatible completion port used only for offline execution. */\nexport type ChatCompletionsTransport = NonNullable<RouterToolsSeam['complete']>\n\n/** Conversation history keyed by the settled Runtime worker id. */\nexport interface ChatSessionStore {\n load(workerId: string): ReadonlyArray<Readonly<Record<string, unknown>>> | undefined\n save(workerId: string, messages: ReadonlyArray<Readonly<Record<string, unknown>>>): void\n}\n\n/** In-memory, process-local conversation store with detached reads and writes. */\nexport function createChatSessionStore(): ChatSessionStore {\n const sessions = new Map<string, ReadonlyArray<Readonly<Record<string, unknown>>>>()\n return {\n load(workerId) {\n const messages = sessions.get(workerId)\n return messages === undefined\n ? undefined\n : (structuredClone(messages) as ReadonlyArray<Readonly<Record<string, unknown>>>)\n },\n save(workerId, messages) {\n sessions.set(\n workerId,\n structuredClone(messages) as ReadonlyArray<Readonly<Record<string, unknown>>>,\n )\n },\n }\n}\n\n/** One profile-authorized function tool and its host implementation. */\nexport interface ChatTransportTool {\n readonly spec: ToolSpec\n readonly execute: (args: Record<string, unknown>, task: unknown) => Promise<string>\n}\n\n/**\n * Transport and session data for one exact profile-driven conversation.\n * Behavioral controls belong only in `profile.model.metadata`.\n */\nexport interface ChatTransportExecutorOptions {\n readonly profile: AgentProfile\n readonly url?: string\n readonly bearer?: string\n readonly tools?: ReadonlyArray<ChatTransportTool>\n readonly complete?: ChatCompletionsTransport\n readonly sessions?: ChatSessionStore\n readonly sessionKey?: string\n readonly resume?: WorkerResumeContext\n}\n\nfunction exactProfile(profile: AgentProfile, context: string): AgentProfile {\n const parsed = agentProfileSchema.safeParse(profile)\n if (!parsed.success)\n throw new ValidationError(`${context}: invalid AgentProfile: ${parsed.error.message}`)\n assertExecutableAgentProfile(parsed.data, context)\n return parsed.data\n}\n\nfunction initialMessages(\n opts: ChatTransportExecutorOptions,\n): ReadonlyArray<Readonly<Record<string, unknown>>> | undefined {\n if (!opts.resume) return undefined\n if (!opts.sessions) {\n throw new ValidationError(\n \"chat transport: a 'resume' spawn needs the session store holding the prior conversation\",\n )\n }\n const prior = opts.sessions.load(opts.resume.ofWorker)\n if (prior === undefined) {\n throw new ValidationError(\n `chat transport: no recorded conversation for worker '${opts.resume.ofWorker}'`,\n )\n }\n return prior\n}\n\nfunction executorConfig(opts: ChatTransportExecutorOptions): {\n config: { backend: 'router-tools' } & RouterToolsSeam\n profile: AgentProfile\n} {\n const profile = exactProfile(opts.profile, 'chat transport')\n if (!opts.complete && !opts.url) {\n throw new ValidationError('chat transport: url required unless complete is injected')\n }\n const tools = opts.tools ?? []\n for (const tool of tools) {\n if (!tool.spec.function.name || typeof tool.execute !== 'function') {\n throw new ValidationError('chat transport: every tool needs spec.function.name and execute')\n }\n }\n const resumed = initialMessages(opts)\n return {\n profile,\n config: {\n backend: 'router-tools',\n routerBaseUrl: opts.url ?? 'http://injected.invalid',\n routerKey: opts.bearer ?? (opts.complete ? 'injected-transport' : ''),\n tools: tools.map((tool) => tool.spec),\n executeToolCall: async (name, args, task) => {\n const tool = tools.find((candidate) => candidate.spec.function.name === name)\n if (!tool) throw new ValidationError(`chat transport: unknown tool ${JSON.stringify(name)}`)\n return tool.execute(args, task)\n },\n ...(opts.complete ? { complete: opts.complete } : {}),\n ...(resumed ? { initialMessages: resumed } : {}),\n ...(opts.sessions && opts.sessionKey\n ? {\n onMessages: (messages: ReadonlyArray<Readonly<Record<string, unknown>>>) => {\n opts.sessions?.save(opts.sessionKey as string, messages)\n },\n }\n : {}),\n },\n }\n}\n\nfunction buildChatTransportExecutor(\n opts: ChatTransportExecutorOptions,\n context: ExecutorContext,\n): Executor<string> {\n const { config, profile } = executorConfig(opts)\n const spec: AgentSpec = { profile, harness: null }\n const inner = createExecutor(config)(spec, context) as Executor<unknown>\n return mapExecutorResult(inner, (result: ExecutorResult<unknown>) => {\n const raw = result.out as { content?: unknown }\n const content = typeof raw?.content === 'string' ? raw.content : ''\n return {\n outRef: contentAddress({ kind: 'chat-transport', profile, content }),\n out: content,\n ...(result.verdict ? { verdict: result.verdict } : {}),\n }\n })\n}\n\n/**\n * Build one exact profile-driven chat executor through `createExecutor`.\n * Prefer `chatWorkerSeam` for supervised work because it supplies trusted node identity.\n */\nexport function chatTransportExecutor(opts: ChatTransportExecutorOptions): Executor<string> {\n return buildChatTransportExecutor(opts, {\n signal: new AbortController().signal,\n seams: {},\n })\n}\n\n/** Transport/session configuration shared by every spawned exact profile. */\nexport interface ChatWorkerSeamOptions {\n readonly url?: string\n readonly bearer?: string\n readonly tools?: ReadonlyArray<ChatTransportTool>\n readonly complete?: ChatCompletionsTransport\n readonly sessions?: ChatSessionStore\n readonly deliverable?: DeliverableSpec<unknown>\n}\n\n/** Session-owning worker factory for graph continuity. */\nexport function chatWorkerSeam(opts: ChatWorkerSeamOptions): MakeWorkerAgent {\n if (!opts.complete && !opts.url) {\n throw new ValidationError('chatWorkerSeam: url required unless complete is injected')\n }\n const sessions = opts.sessions ?? createChatSessionStore()\n return (rawProfile, spawnContext?: WorkerSpawnContext) => {\n const profile = exactProfile(rawProfile, 'chatWorkerSeam')\n const name = profile.name ?? 'chat-worker'\n const spec: AgentSpec = {\n profile,\n harness: null,\n executorFactory: (executorSpec, context) => {\n const executor = buildChatTransportExecutor(\n {\n profile: executorSpec.profile,\n ...(opts.url ? { url: opts.url } : {}),\n ...(opts.bearer ? { bearer: opts.bearer } : {}),\n ...(opts.tools ? { tools: opts.tools } : {}),\n ...(opts.complete ? { complete: opts.complete } : {}),\n sessions,\n ...(context.node?.nodeId ? { sessionKey: context.node.nodeId } : {}),\n ...(spawnContext?.resume ? { resume: spawnContext.resume } : {}),\n },\n context,\n )\n return opts.deliverable ? gateOnDeliverable(executor, opts.deliverable) : executor\n },\n }\n return { name, act: async () => undefined, executorSpec: spec } as Agent<unknown, unknown> & {\n executorSpec: AgentSpec\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","import { spawnSync } from 'node:child_process'\nimport {\n appendFileSync,\n chmodSync,\n copyFileSync,\n constants as fsConstants,\n lstatSync,\n mkdirSync,\n readlinkSync,\n rmSync,\n symlinkSync,\n} from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\nimport type { Workspace } from '../workspace'\n\n/**\n * Worker-clone preparation: make each worker's fresh clone a FAITHFUL copy of the\n * shared workspace's working tree, not just of its git history.\n *\n * `runInWorkspace` materializes a worker dir via `git clone`, which carries only\n * COMMITTED files. Real workspaces (SWE-bench instance images: astropy,\n * matplotlib) hold compiled extension modules (.so/.pyd) as UNTRACKED build\n * artifacts — inside a bare clone `import astropy` dies with \"cannot import name\n * '_compiler'\" before the worker's first edit, so its verify gate is physically\n * unpassable regardless of patch quality (observed: 7/7 astropy and 6/6\n * matplotlib workers failed exactly this way while the shared workspace verified\n * fine). The fix copies the source tree's untracked files — including git-ignored\n * build outputs — into the clone right after materialize and before the worker\n * starts.\n *\n * Isolation is preserved: artifacts are COPIED (copy-on-write via FICLONE where\n * the filesystem supports it — never hardlinked, a worker rebuild opening an\n * artifact with O_TRUNC on a shared inode would corrupt the source workspace for\n * every sibling), and an absolute symlink pointing inside the source tree is\n * rewritten to the clone-local path so no worker holds a live handle back into\n * shared mutable state.\n *\n * Fidelity stops at git history: every copied path is appended to the clone's\n * `.git/info/exclude`, so the clone-side `git add -A` (both the local delegate's\n * diff capture and `gitWorkspace.commit`) can never stage pre-existing build\n * artifacts into the shared ref — in the source they are untracked, and a\n * delivery must not silently start tracking them.\n *\n * Promoted verbatim from `loops/src/worker-clone.ts` (see agent-dev-container#4519): any harness\n * that materializes workers via `git clone` needs the working tree, not just the history.\n *\n * @experimental\n */\n\n/** Agent-infra dirs living inside a workspace; orchestration state, never build inputs. `.loops` is the pre-rename location of `.agent` supervisor state. */\nconst SKIPPED_TOP_LEVEL = new Set(['.agent', '.loops', '.evolve', '.agent-worktrees', '.claude'])\n\n/** Warn (and copy anyway) past this untracked payload size. */\nconst DEFAULT_WARN_BYTES = 2 * 1024 * 1024 * 1024\n\nexport interface UntrackedCopyStats {\n /** Files + symlinks that landed in the clone. */\n copied: number\n /** Total regular-file bytes enumerated (pre-copy, so the size warning fires first). */\n bytes: number\n}\n\nexport interface CopyOptions {\n warnBytes?: number\n log?: (message: string) => void\n}\n\ninterface PlannedEntry {\n rel: string\n kind: 'file' | 'symlink'\n size: number\n mode: number\n}\n\n/**\n * Copy every untracked file of `sourceDir`'s working tree — including git-ignored\n * build outputs (`git ls-files --others` with NO exclude flags lists both) — into\n * `cloneDir`, then shield the copied paths from the clone's `git add -A` via\n * `.git/info/exclude`. Nested git repos (listed as bare `dir/` entries), any path\n * containing a `.git` segment, and loop-infra dirs are skipped.\n */\nexport function copyUntrackedIntoClone(\n sourceDir: string,\n cloneDir: string,\n opts: CopyOptions = {},\n): UntrackedCopyStats {\n const warnBytes = opts.warnBytes ?? DEFAULT_WARN_BYTES\n const log = opts.log ?? ((message: string) => console.warn(message))\n const src = resolve(sourceDir)\n const dst = resolve(cloneDir)\n\n const ls = spawnSync('git', ['-C', src, 'ls-files', '--others', '-z'], {\n encoding: 'utf8',\n maxBuffer: 256 * 1024 * 1024,\n })\n if (ls.status !== 0) {\n throw new Error(\n `git ls-files --others failed in ${src}: ${(ls.stderr ?? '').trim() || `exit ${ls.status}`}`,\n )\n }\n\n // Enumerate + stat BEFORE copying so the payload-size warning precedes the work.\n const plan: PlannedEntry[] = []\n for (const rel of (ls.stdout ?? '').split('\\0')) {\n if (!rel || rel.endsWith('/')) continue // '' from split; 'dir/' = nested git repo, skip\n const segments = rel.split('/')\n if (segments.includes('.git')) continue\n if (SKIPPED_TOP_LEVEL.has(segments[0] ?? '')) continue\n let stat: ReturnType<typeof lstatSync>\n try {\n stat = lstatSync(join(src, rel))\n } catch {\n continue // vanished between enumerate and stat — a live workspace is allowed to move\n }\n if (stat.isSymbolicLink()) plan.push({ rel, kind: 'symlink', size: 0, mode: stat.mode })\n else if (stat.isFile()) plan.push({ rel, kind: 'file', size: stat.size, mode: stat.mode })\n // sockets/FIFOs/devices are not copyable artifacts — skip silently\n }\n\n const bytes = plan.reduce((sum, entry) => sum + entry.size, 0)\n if (bytes > warnBytes) {\n log(\n `worker clone: untracked payload in ${src} is ${(bytes / 1024 / 1024).toFixed(0)}MB ` +\n `(> ${(warnBytes / 1024 / 1024).toFixed(0)}MB) — copying anyway so the clone stays runnable`,\n )\n }\n\n let copied = 0\n const excludeLines: string[] = []\n for (const entry of plan) {\n const from = join(src, entry.rel)\n const to = join(dst, entry.rel)\n try {\n mkdirSync(dirname(to), { recursive: true })\n if (entry.kind === 'symlink') {\n let target = readlinkSync(from)\n if (isAbsolute(target)) {\n // Never let a clone hold a live path back into the shared source tree.\n const resolved = resolve(target)\n if (resolved === src || resolved.startsWith(src + sep))\n target = join(dst, relative(src, resolved))\n }\n rmSync(to, { force: true })\n symlinkSync(target, to)\n } else {\n // FICLONE = copy-on-write clone when the fs supports it, plain copy otherwise.\n copyFileSync(from, to, fsConstants.COPYFILE_FICLONE)\n chmodSync(to, entry.mode & 0o7777)\n }\n copied += 1\n excludeLines.push(toExcludePattern(entry.rel))\n } catch (err) {\n // One uncopyable artifact must not kill the worker before it starts; for that\n // file alone the clone degrades to the pre-fix (history-only) state.\n log(\n `worker clone: failed to copy untracked ${entry.rel}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n\n if (excludeLines.length > 0) {\n const infoDir = join(dst, '.git', 'info')\n mkdirSync(infoDir, { recursive: true })\n appendFileSync(\n join(infoDir, 'exclude'),\n `# untracked artifacts copied from the shared workspace — never commit them back\\n${excludeLines.join('\\n')}\\n`,\n 'utf8',\n )\n }\n\n return { copied, bytes }\n}\n\n/** Root-anchored literal exclude pattern: glob metachars and trailing spaces escaped. */\nfunction toExcludePattern(rel: string): string {\n const escaped = rel\n .replace(/([\\\\*?[\\]])/g, '\\\\$1')\n .replace(/ +$/, (spaces) => '\\\\ '.repeat(spaces.length))\n return `/${escaped}`\n}\n\n/**\n * Wrap a `Workspace` so every `materialize` (the per-worker `git clone` inside\n * `runInWorkspace`) is followed by the untracked-artifact copy above — the clone\n * the worker starts in matches the source WORKING TREE, not just its history.\n * `commit`/`head` pass through untouched, so delivery semantics are unchanged.\n */\nexport function withUntrackedArtifacts(\n ws: Workspace,\n sourceDir: string,\n log?: (message: string) => void,\n): Workspace {\n return {\n ref: ws.ref,\n materialize: async (dir: string) => {\n await ws.materialize(dir)\n copyUntrackedIntoClone(sourceDir, dir, log ? { log } : {})\n },\n commit: (dir: string, message: string) => ws.commit(dir, message),\n head: () => ws.head(),\n }\n}\n","/**\n * Evidence-rich worker settlement.\n *\n * The supervisor BRAIN decides respawn/steer/stop from what a settled worker\n * shows it. A bare `finished passed=false patchBytes=6138` starves that\n * decision: the brain cannot quote the failing assertion, so its next worker\n * goal is authored blind. This module composes the bounded evidence block a\n * settling worker appends to its event stream and — on failure — returns as\n * its output artifact, so `observe_agent` hands the brain the failing verify\n * tail, a diff summary, and the worker's final note instead of counters.\n */\n\n/** Hard cap on one worker's evidence block so the brain's context cannot blow up. */\nexport const EVIDENCE_MAX_CHARS = 3000\n/** Tail of the verify output — the failing assertion lives at the END of a test log. */\nexport const VERIFY_TAIL_CHARS = 1200\nconst TYPECHECK_TAIL_CHARS = 400\nconst PATCH_HEAD_LINES = 40\nconst PATCH_LINE_MAX_CHARS = 200\n/** Cap on the worker's closing note inside the evidence block. */\nexport const NOTE_MAX_CHARS = 300\n\nexport interface WorkerEvidenceInput {\n readonly passed: boolean\n readonly testPassed: boolean\n readonly typecheckPassed: boolean\n /** Combined stdout+stderr of the verify/test command (already backend-capped). */\n readonly testOutput: string\n readonly typecheckOutput: string\n readonly patch: string\n /** The worker's own closing commentary, when the backend surfaces one. */\n readonly reviewerNotes?: string\n}\n\n/**\n * Compose the settle evidence block. Section order is priority order under the\n * hard cap: the verify tail (what failed) survives before the diff head (what\n * was tried) and the worker note — a truncated diff is recoverable from the\n * persisted patch file, a truncated failing assertion is not recoverable at all.\n */\nexport function composeWorkerEvidence(input: WorkerEvidenceInput): string {\n const sections: string[] = []\n const failures = [\n ...(input.testPassed ? [] : ['tests failed']),\n ...(input.typecheckPassed ? [] : ['typecheck failed']),\n ]\n sections.push(\n input.passed ? 'verify PASSED' : `verify FAILED (${failures.join(', ') || 'gate not passed'})`,\n )\n const testTail = input.testOutput.trim().slice(-VERIFY_TAIL_CHARS)\n if (testTail) sections.push(`--- verify output (tail) ---\\n${testTail}`)\n if (!input.typecheckPassed) {\n const typecheckTail = input.typecheckOutput.trim().slice(-TYPECHECK_TAIL_CHARS)\n if (typecheckTail) sections.push(`--- typecheck output (tail) ---\\n${typecheckTail}`)\n }\n sections.push(diffSummary(input.patch))\n const note = input.reviewerNotes?.trim()\n if (note) sections.push(`--- worker note ---\\n${note.slice(0, NOTE_MAX_CHARS)}`)\n return sections.join('\\n').slice(0, EVIDENCE_MAX_CHARS)\n}\n\n/**\n * What a settled worker exposes as its output artifact (the blob the brain's\n * `observe_agent` reads). A passing worker's output is its patch — the\n * deliverable. A failing worker's output is its evidence block. A passing\n * worker with NO edits — the post-delivery read-only reviewer: the workspace\n * already holds a delivered fix, so the gate stays green under an empty diff —\n * would otherwise settle with an EMPTY output and its review would be lost, so\n * it exposes its evidence block instead (the worker note carries the review).\n */\nexport function settledWorkerOut(input: {\n readonly passed: boolean\n readonly patch: string\n readonly evidence: string\n}): string {\n if (input.evidence.length === 0) return input.patch\n if (!input.passed) return input.evidence\n return input.patch.trim().length > 0 ? input.patch : input.evidence\n}\n\n/**\n * The worker's closing commentary off a local harness run: the TAIL of its\n * stdout (falling back to stderr), bounded to the note cap so a reviewer's\n * final verdict line — written last — survives into the evidence block\n * (`composeWorkerEvidence` keeps the note's FIRST `NOTE_MAX_CHARS` chars).\n */\nexport function closingWorkerNote(stdout: string, stderr: string): string | undefined {\n const source = stdout.trim() || stderr.trim()\n if (!source) return undefined\n return source.slice(-NOTE_MAX_CHARS)\n}\n\nfunction diffSummary(patch: string): string {\n const trimmed = patch.trim()\n if (!trimmed) return '--- diff: EMPTY (the worker produced no edits) ---'\n const lines = trimmed.split('\\n')\n const filesChanged = lines.filter((line) => line.startsWith('diff --git ')).length\n const head = lines\n .slice(0, PATCH_HEAD_LINES)\n .map((line) =>\n line.length > PATCH_LINE_MAX_CHARS ? `${line.slice(0, PATCH_LINE_MAX_CHARS)}~` : line,\n )\n const omitted = lines.length - head.length\n const header = `--- diff: ${filesChanged} file(s) changed, ${Buffer.byteLength(patch)} bytes; first ${head.length} line(s) ---`\n return `${header}\\n${head.join('\\n')}${omitted > 0 ? `\\n... (${omitted} more patch lines; full patch persisted per worker)` : ''}`\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, ExecutorFactory } from './types'\nimport {\n createWorktreeCliExecutor,\n type WorktreeCliExecutorOptions,\n type WorktreePatchArtifact,\n} from './worktree-cli-executor'\n\n/** @experimental One authored profile in a worktree fanout. Its exact `harness` field chooses the\n * local CLI; the supervisor authors the complete profile per sub-task. */\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 /** Require measured usage from this leaf. Budgeted supervision refuses the default unmetered\n * local-CLI mode; set false only when the selected runner actually returns token usage. */\n budgetExempt?: WorktreeCliExecutorOptions['budgetExempt']\n /** Run Codex through its measured, isolated JSONL path. This implies `budgetExempt: false`. */\n codexReproducible?: WorktreeCliExecutorOptions['codexReproducible']\n /** Host paths denied to a reproducible Codex leaf. */\n codexReadDeniedPaths?: WorktreeCliExecutorOptions['codexReadDeniedPaths']\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 executorFactory: ExecutorFactory<WorktreePatchArtifact> = (_spec, ctx) => {\n if (!ctx.node) {\n throw new Error('worktreeFanout: supervised node context required')\n }\n return gateOnDeliverable(\n createWorktreeCliExecutor({\n repoRoot: options.repoRoot,\n profile: item.profile,\n taskPrompt: options.taskPrompt,\n executionAttemptId: ctx.node.attemptId,\n ...(item.budgetExempt !== undefined ? { budgetExempt: item.budgetExempt } : {}),\n ...(item.codexReproducible !== undefined\n ? { codexReproducible: item.codexReproducible }\n : {}),\n ...(item.codexReadDeniedPaths !== undefined\n ? { codexReadDeniedPaths: item.codexReadDeniedPaths }\n : {}),\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 }\n return { profile: item.profile, harness: null, executorFactory }\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 { OUTPUT_VALUE, type TraceAnalysisStore } from '@tangle-network/agent-eval'\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport type { AnalystRegistry, MakeWorkerAgent } from '../mcp/tools/coordination'\nimport type { RouterTransportConfig } 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 { isTraceAnalysisStore } from './supervise/trace-evidence'\nimport { createPushTraceSource, type TraceSource } from './supervise/trace-source'\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/** Instrument every real surface call with the shared push trace source. The last test report remains\n * available on `SurfaceWorkerOut` for compatibility, but analysts read only the persisted spans. */\nexport function traceSurfaceCalls(base: AgenticSurface): {\n surface: AgenticSurface\n failing: () => string[]\n traceSource: TraceSource\n} {\n let lastReport = ''\n const trace = createPushTraceSource()\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 startedAt = Date.now()\n const recordedArgs = structuredClone(args)\n try {\n const out = await base.call(h, name, args)\n trace.record({\n toolName: name,\n args: recordedArgs,\n result: out,\n status: out.startsWith('ERROR:') ? 'error' : 'ok',\n startedAt,\n endedAt: Date.now(),\n })\n if (name === 'run_tests') lastReport = out\n return out\n } catch (error) {\n trace.record({\n toolName: name,\n args: recordedArgs,\n result: `ERROR: ${error instanceof Error ? error.message : String(error)}`,\n status: 'error',\n startedAt,\n endedAt: Date.now(),\n })\n throw error\n }\n },\n score: (t, h) => base.score(t, h),\n close: (h) => base.close(h),\n }\n return { surface, failing: () => failingTestNames(lastReport), traceSource: trace.source }\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: TraceAnalysisStore) => {\n if (!isTraceAnalysisStore(trace)) return missingRunTestsEvidence()\n const report = await latestRunTestsReport(trace)\n if (report === undefined) return missingRunTestsEvidence()\n const failing = failingTestNames(report)\n return {\n summary: failing.length\n ? `Latest structured run_tests evidence reports STILL FAILING (${failing.length}): ${failing.join(', ')}. Spawn the next worker to fix exactly these; if a test keeps failing across workers, give it concrete guidance about that case.`\n : allTestsPassed(report)\n ? 'Latest structured run_tests evidence reports every test passed; stop.'\n : `Latest structured run_tests evidence contains no parseable failing-test names. Refusing to infer them from worker prose. run_tests output: ${report.slice(0, 300)}`,\n }\n },\n }\n}\n\nasync function latestRunTestsReport(store: TraceAnalysisStore): Promise<string | undefined> {\n const overview = await store.getOverview({ tool_names: ['run_tests'] })\n const candidates: Array<{ output: string; endedAt: string; ordinal: number }> = []\n let ordinal = 0\n for (const traceId of overview.sample_trace_ids) {\n const view = await store.viewTrace({ trace_id: traceId, per_attribute_byte_cap: 16_384 })\n let spans = view.spans\n if (spans === undefined) {\n const matches = await store.searchTrace({\n trace_id: traceId,\n regex_pattern: 'run_tests',\n max_matches: 100,\n })\n const spanIds = [\n ...new Set(\n matches.hits.filter((hit) => hit.span_name === 'run_tests').map((hit) => hit.span_id),\n ),\n ]\n spans = spanIds.length\n ? (\n await store.viewSpans({\n trace_id: traceId,\n span_ids: spanIds,\n per_attribute_byte_cap: 16_384,\n })\n ).spans\n : []\n }\n for (const span of spans) {\n if (span.tool_name !== 'run_tests') continue\n const output = span.attributes[OUTPUT_VALUE]\n if (typeof output !== 'string') continue\n candidates.push({ output, endedAt: span.end_time, ordinal: ordinal++ })\n }\n }\n candidates.sort(\n (left, right) =>\n Date.parse(left.endedAt) - Date.parse(right.endedAt) || left.ordinal - right.ordinal,\n )\n return candidates.at(-1)?.output\n}\n\nfunction failingTestNames(report: string): string[] {\n const body = /FAILING:\\s*([^\\n]+)/iu.exec(report)?.[1]\n if (body === undefined) return []\n return body\n .replace(/\\.\\s+COLLECTION-BLOCKED:.*$/iu, '')\n .replace(/\\s*\\(\\+\\d+\\s+more\\)\\s*$/iu, '')\n .split(',')\n .map((name) => name.trim())\n .filter(Boolean)\n}\n\nfunction allTestsPassed(report: string): boolean {\n const fraction = /(\\d+)\\s*\\/\\s*(\\d+)\\s+tests?\\s+passed/iu.exec(report)\n return fraction !== null && Number(fraction[1]) === Number(fraction[2])\n}\n\nfunction missingRunTestsEvidence(): { summary: string } {\n return {\n summary:\n 'Missing structured run_tests span evidence. Refusing to infer failing-test names from worker prose.',\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 /** Exact worker behavior, tools, and model. */\n readonly profile: AgentProfile\n readonly analystProfile?: AgentProfile\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 const traced = traceSurfaceCalls(surface)\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 userPrompt: `${task.userPrompt}\\n\\n— Supervisor guidance for THIS attempt (incorporate it; do not just repeat a prior approach) —\\n${guidance}`,\n }\n : task\n const r = await runAgentic({\n surface: traced.surface,\n task: attemptTask,\n strategy,\n budget: worker.budget ?? 1,\n routerBaseUrl: worker.routerBaseUrl,\n routerKey: worker.routerKey,\n workerProfile: worker.profile,\n ...(worker.analystProfile ? { analystProfile: worker.analystProfile } : {}),\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 ? [] : traced.failing(),\n }\n const spent: Spend = {\n iterations: r.completions,\n tokens: r.tokens,\n ...(r.tokensKnown ? {} : { tokensKnown: false }),\n usd: r.usd,\n ...(r.usdKnown ? {} : { usdKnown: false }),\n ms: r.ms,\n }\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 traceSource: () => traced.traceSource,\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 endpoint/auth. Model and behavior remain owned by `profile`. */\n readonly router?: RouterTransportConfig\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: RouterTransportConfig = opts.router ?? {\n routerBaseUrl: opts.worker.routerBaseUrl,\n routerKey: opts.worker.routerKey,\n }\n const budget = opts.budget ?? {\n maxIterations: (innerTurns + 2) * 5 + 16,\n maxTokens: 1_000_000_000,\n }\n const workerMaxTokens =\n profileMaxTokens(opts.worker.profile) ?? Math.max(1, Math.floor(budget.maxTokens / 8))\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: workerMaxTokens },\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\nfunction profileMaxTokens(profile: AgentProfile): number | undefined {\n const value = profile.model?.metadata?.maxTokens\n if (value === undefined) return undefined\n if (!Number.isSafeInteger(value) || (value as number) < 1) {\n throw new Error(\n 'superviseSurface: AgentProfile.model.metadata.maxTokens must be a positive safe integer',\n )\n }\n return value as number\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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"}