@tangle-network/agent-eval 0.135.2 → 0.135.3

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 (31) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/analyst/index.js +1 -1
  3. package/dist/{analyst-LsnNpSkm.js → analyst-j5je5J7c.js} +2 -2
  4. package/dist/{analyst-LsnNpSkm.js.map → analyst-j5je5J7c.js.map} +1 -1
  5. package/dist/benchmarks/index.js +1 -1
  6. package/dist/{benchmarks-Mtu251Jz.js → benchmarks-Dfgm9ts5.js} +2 -2
  7. package/dist/{benchmarks-Mtu251Jz.js.map → benchmarks-Dfgm9ts5.js.map} +1 -1
  8. package/dist/campaign/index.js +1 -1
  9. package/dist/{campaign-RVIqtJh0.js → campaign-Dz8uQnhC.js} +2 -2
  10. package/dist/{campaign-RVIqtJh0.js.map → campaign-Dz8uQnhC.js.map} +1 -1
  11. package/dist/contract/index.js +3 -3
  12. package/dist/{default-registry-BAhV-lbE.js → default-registry-CHmdy2An.js} +2 -2
  13. package/dist/{default-registry-BAhV-lbE.js.map → default-registry-CHmdy2An.js.map} +1 -1
  14. package/dist/{extract-usage-2j25whHw.js → extract-usage-DIQpN-ww.js} +2 -2
  15. package/dist/{extract-usage-2j25whHw.js.map → extract-usage-DIQpN-ww.js.map} +1 -1
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +8 -8
  18. package/dist/openapi.json +1 -1
  19. package/dist/{replay-BI6CVKkp.d.ts → replay-BRfMIs81.d.ts} +39 -21
  20. package/dist/replay-BRfMIs81.d.ts.map +1 -0
  21. package/dist/{replay-CJfGLdx4.js → replay-C6wRg47C.js} +23 -41
  22. package/dist/replay-C6wRg47C.js.map +1 -0
  23. package/dist/{tools-BmuN627J.js → tools-D8yTtNSN.js} +132 -27
  24. package/dist/tools-D8yTtNSN.js.map +1 -0
  25. package/dist/traces.d.ts +2 -2
  26. package/dist/traces.js +5 -5
  27. package/docs/trace-analysis.md +24 -0
  28. package/package.json +1 -1
  29. package/dist/replay-BI6CVKkp.d.ts.map +0 -1
  30. package/dist/replay-CJfGLdx4.js.map +0 -1
  31. package/dist/tools-BmuN627J.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,17 @@ All notable changes to `@tangle-network/agent-eval` and its sibling `agent-eval-
4
4
 
5
5
  ---
6
6
 
7
+ ## [0.135.3] - 2026-07-29 - preserve real tool evidence for trace learning
8
+
9
+ ### Added
10
+
11
+ - `toolSpansToTraceAnalysisStore()` converts captured runtime `ToolSpan` records into the canonical trace-analysis store without a Discovery-specific adapter.
12
+ - The adapter preserves run, trace, span, parent, tool, timing, input, output, error, and attribute evidence in one deterministic projection.
13
+
14
+ ### Fixed
15
+
16
+ - Trace-analysis intake now refuses missing or structurally empty tool evidence explicitly instead of allowing an empty projection to masquerade as an observed trace.
17
+
7
18
  ## [0.135.2] - 2026-07-29 - correct paired promotion decisions
8
19
 
9
20
  ### Fixed
@@ -1,4 +1,4 @@
1
- import { A as parseFindingSubject, C as stripCodeFences, D as FindingSubjectStringSchema, E as FINDING_SUBJECT_SYNTAX, F as createChatClient, I as createAnalystAi, M as behavioralAnalyst, N as deriveEfficiencyFindings, O as KIND_EXPECTED_SUBJECTS, S as coerceToFindingRows, T as FINDING_SUBJECT_KINDS, _ as RawAnalystEvidenceSchema, a as KNOWLEDGE_GAP_KIND_SPEC, b as parseRawFinding, c as buildTraceToolsForGroup, d as renderUpstreamFindings, f as settleUsageReceiptFromCostLedger, g as RAW_FINDING_SCHEMA_PROMPT, h as ANALYST_SEVERITIES, i as KNOWLEDGE_POISONING_KIND_SPEC, j as renderFindingSubject, k as findingSubjectGrammarPromptFor, l as createTraceAnalystKind, m as structureFindings, n as AnalystRegistry, o as IMPROVEMENT_KIND_SPEC, p as validateUsageSettlementTimeout, r as DEFAULT_TRACE_ANALYST_KINDS, s as FAILURE_MODE_KIND_SPEC, t as buildDefaultAnalystRegistry, u as renderPriorFindings, v as RawAnalystFindingSchema, w as FINDING_SUBJECT_GRAMMAR_PROMPT, x as coerceJson, y as evidenceRefsFromRawFinding } from "../default-registry-BAhV-lbE.js";
1
+ import { A as parseFindingSubject, C as stripCodeFences, D as FindingSubjectStringSchema, E as FINDING_SUBJECT_SYNTAX, F as createChatClient, I as createAnalystAi, M as behavioralAnalyst, N as deriveEfficiencyFindings, O as KIND_EXPECTED_SUBJECTS, S as coerceToFindingRows, T as FINDING_SUBJECT_KINDS, _ as RawAnalystEvidenceSchema, a as KNOWLEDGE_GAP_KIND_SPEC, b as parseRawFinding, c as buildTraceToolsForGroup, d as renderUpstreamFindings, f as settleUsageReceiptFromCostLedger, g as RAW_FINDING_SCHEMA_PROMPT, h as ANALYST_SEVERITIES, i as KNOWLEDGE_POISONING_KIND_SPEC, j as renderFindingSubject, k as findingSubjectGrammarPromptFor, l as createTraceAnalystKind, m as structureFindings, n as AnalystRegistry, o as IMPROVEMENT_KIND_SPEC, p as validateUsageSettlementTimeout, r as DEFAULT_TRACE_ANALYST_KINDS, s as FAILURE_MODE_KIND_SPEC, t as buildDefaultAnalystRegistry, u as renderPriorFindings, v as RawAnalystFindingSchema, w as FINDING_SUBJECT_GRAMMAR_PROMPT, x as coerceJson, y as evidenceRefsFromRawFinding } from "../default-registry-CHmdy2An.js";
2
2
  import { i as CostLedger } from "../cost-ledger-DHAjwNj7.js";
3
3
  import { c as makeFinding, l as makeProposalFinding, n as isProposalFinding, s as computeFindingId, t as assertProposalFindings } from "../proposal-findings-DCawte-y.js";
4
4
  import { a as RunCritic, c as buildSkillUsageReport, d as defaultIsMaterial, f as diffFindings, i as runSemanticConceptJudge, l as emitSkillUsageFindings, n as SEMANTIC_CONCEPT_JUDGE_VERSION, o as SKILL_USAGE_ANALYST, s as SkillUsageAnalyst, u as FindingsStore } from "../semantic-concept-judge-Btozx3Vc.js";
@@ -1,4 +1,4 @@
1
- import { i as OtlpFileTraceStore, r as runTraceAnalysisLoop, t as buildTraceAnalystTools } from "./tools-BmuN627J.js";
1
+ import { i as OtlpFileTraceStore, r as runTraceAnalysisLoop, t as buildTraceAnalystTools } from "./tools-D8yTtNSN.js";
2
2
  //#region src/trace-analyst/prompts.ts
3
3
  /** Ax RLM prompt for bounded trace discovery and evidence-backed analysis. */
4
4
  const TRACE_ANALYST_ACTOR_DESCRIPTION = `You answer questions about an OTLP-shaped JSONL trace dataset using the trace tools provided in the \`traces\` namespace.
@@ -149,4 +149,4 @@ function normalizeRecordArray(value) {
149
149
  //#endregion
150
150
  export { TRACE_ANALYST_ACTOR_DESCRIPTION as n, TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION as r, analyzeTraces as t };
151
151
 
152
- //# sourceMappingURL=analyst-LsnNpSkm.js.map
152
+ //# sourceMappingURL=analyst-j5je5J7c.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyst-LsnNpSkm.js","names":[],"sources":["../src/trace-analyst/prompts.ts","../src/trace-analyst/analyst.ts"],"sourcesContent":["/** Ax RLM prompt for bounded trace discovery and evidence-backed analysis. */\n\nexport const TRACE_ANALYST_ACTOR_DESCRIPTION = `You answer questions about an OTLP-shaped JSONL trace dataset using the trace tools provided in the \\`traces\\` namespace.\n\nDISCOVERY → NARROW → DEEP-READ protocol — follow exactly:\n\n1. ALWAYS call \\`traces.getDatasetOverview({})\\` FIRST without a regex_pattern. The result tells you total_traces, raw_jsonl_bytes, services, agents, models, and sample_trace_ids (real ids — never fabricate one).\n\n2. Use raw_jsonl_bytes to gauge how expensive raw scans will be. \\`filters.regex_pattern\\` is the one scan-heavy filter on getDatasetOverview / queryTraces / countTraces — narrow with indexed fields (has_errors, model_names, service_names, agent_names, time bounds) BEFORE adding a regex on a large dataset.\n\n3. To list more traces than the sample, call \\`traces.queryTraces({ filters?, limit, offset? })\\`. Each summary carries raw_jsonl_bytes — use it to choose between viewTrace and searchTrace BEFORE calling either.\n\n4. Per-trace inspection:\n - SMALL trace (raw_jsonl_bytes well under 150_000): call \\`traces.viewTrace({ trace_id })\\`. Returns all spans. Per-attribute payloads are head-capped at ~4KB; large \\`input.value\\` / \\`output.value\\` / \\`llm.input_messages\\` will show a \\`[trace-analyst truncated: N bytes]\\` marker.\n - LARGE trace (raw_jsonl_bytes near or above 150_000, or you saw an \\`oversized\\` response): use \\`traces.searchTrace({ trace_id, regex_pattern })\\` to get bounded SpanMatchRecords (span metadata + matched text + surrounding context). Then call \\`traces.viewSpans({ trace_id, span_ids: [...] })\\` for surgical reads (~16KB cap, 4× higher than discovery), or \\`traces.searchSpan({ trace_id, span_id, regex_pattern })\\` for one large span. Stays bounded regardless of trace size.\n - Useful regex patterns: \\`STATUS_CODE_ERROR\\` (failures), tool names like \\`grep\\` or \\`view_trace\\`, error strings like \\`MaxTurnsExceeded\\`, model names, attribute keys.\n\n5. ONLY call viewTrace / viewSpans / searchTrace / searchSpan with trace/span ids you have already seen in sample_trace_ids, a queryTraces page, or a previous search result. Never invent ids.\n\n5a. **Result-shape contract** — searchTrace and searchSpan return \\`{ trace_id, hits, total_matches, has_more }\\`. Iterate \\`result.hits\\` (NOT result.matches). Each hit has \\`{ span_id, span_name, span_kind, attribute_path, matched_text, context_before, context_after, match_offset }\\`. viewTrace returns \\`{ trace_id, spans }\\` (or \\`oversized\\`). viewSpans returns \\`{ trace_id, spans, missing_span_ids, truncated_attribute_count }\\`. Never assume a field name — log the result shape first if unsure.\n\n6. If viewTrace returns an \\`oversized\\` summary instead of \\`spans\\`, DO NOT retry the same call. Read the summary's top_span_names, span_count, span_response_bytes_max, error_span_count to plan a follow-up: switch to searchTrace (or searchSpan for one large span), then viewSpans on a smaller, surgical span_ids set.\n\n7. If searchTrace or searchSpan returns has_more=true, REFINE the regex to be more specific rather than blindly raising max_matches.\n\n8. If a tool errors (invalid regex, range error), STOP and reconsider — don't retry with a guessed id or argument. Use the discovery tools above to recover.\n\n9. If a ~4KB-truncated payload from viewTrace / searchTrace matters for your answer, first try viewSpans on that span id (~16KB cap). If a 16KB-truncated payload from viewSpans still matters, narrow further with searchSpan against a more specific regex rather than asking for the full payload again.\n\n10. If the question splits into independent reasoning branches, use bounded \\`llmQuery(...)\\` calls over evidence you already loaded. Subqueries cannot inspect the trace store, so pass the exact trace excerpts they need. Example:\n\n const reviews = await llmQuery([\n { query: 'Classify the failure mechanism in this excerpt.', context: traceAbcExcerpt },\n { query: 'Classify the failure mechanism in this excerpt.', context: traceDefExcerpt },\n ]);\n\nOBSERVABILITY rules:\n- Each discovery turn must emit at least one concise \\`console.log(...)\\` showing what evidence was learned.\n- Finish gathering evidence before submitting the analysis.\n- Reuse runtime variables across turns; don't recompute.\n\nOUTPUT contract — your final answer must include:\n- A clear prose conclusion answering the user's question.\n- Trace ids and span ids cited as evidence for each claim.\n- Failure modes named in the user's domain language, with frequency and concrete examples.\n- A concise findings array containing only claims supported by inspected evidence.\n\nDo NOT invent trace ids, span ids, error messages, or model names. Every fact must be traceable to a tool result.`\n\nexport const TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION = 'trace-analyst-actor-v6-2026-07-14'\n","import type { AxAgentActorTurnCallbackArgs, AxAIService, AxFunction } from '@ax-llm/ax'\nimport { runTraceAnalysisLoop, type TraceAnalysisLoopResult } from './loop'\nimport { TRACE_ANALYST_ACTOR_DESCRIPTION, TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION } from './prompts'\nimport type { TraceAnalysisStore } from './store'\nimport { OtlpFileTraceStore } from './store-otlp'\nimport { buildTraceAnalystTools } from './tools'\n\nexport interface AnalyzeTracesInput {\n /** The user-facing question. Domain framing belongs here, not in the\n * actor description. */\n question: string\n}\n\nexport interface AnalyzeTracesResult {\n /** The actor's submitted prose answer. */\n answer: string\n /** Bulleted findings from the actor's structured completion. */\n findings: string[]\n /** Per-turn snapshots captured via `actorTurnCallback`. */\n turns: AnalyzeTracesTurnSnapshot[]\n /** Total turns the actor took. */\n turnCount: number\n /** Token usage by role. */\n usage: TraceAnalystUsage\n /** Full system + assistant + tool message log by role. */\n chatLog: TraceAnalystChatLog\n /** Prompt version that produced this run. */\n actorPromptVersion: string\n}\n\nexport interface TraceAnalystUsage {\n actor: TraceAnalystUsageEntry[]\n responder: TraceAnalystUsageEntry[]\n}\n\nexport interface TraceAnalystUsageEntry {\n [key: string]: unknown\n}\n\nexport interface TraceAnalystChatLog {\n actor: TraceAnalystChatMessage[]\n responder: TraceAnalystChatMessage[]\n}\n\nexport interface TraceAnalystChatMessage {\n [key: string]: unknown\n}\n\nexport interface AnalyzeTracesTurnSnapshot {\n stage: AxAgentActorTurnCallbackArgs['stage']\n turn: number\n isError: boolean\n /** The JS code the actor produced for this turn. */\n code: string\n /** The formatted action-log entry the actor sees on the next turn. */\n output: string\n /** Provider thought (when `executorOptions.showThoughts` is true and the\n * provider returns it). */\n thought?: string\n}\n\nexport interface AnalyzeTracesOptions {\n /** Trace data source. Pass either an OTLP-JSONL path or a custom store. */\n source: string | TraceAnalysisStore\n /** Caller-provided AxAIService. */\n ai: AxAIService\n /** Model id forwarded to the actor. */\n model?: string\n /** Maximum model subqueries. 0 disables model fan-out. Default 4. */\n maxSubqueries?: number\n /** Maximum actor turns. Default 12. */\n maxTurns?: number\n /** Maximum parallel model subqueries. Default 2. */\n maxParallelSubqueries?: number\n /** Cancels in-flight model and tool work. */\n signal?: AbortSignal\n /** Override the actor description. */\n actorDescription?: string\n /** Per-turn observability hook. */\n onTurn?: (turn: AnalyzeTracesTurnSnapshot) => void | Promise<void>\n /** Override max runtime characters per turn. Default 6000. */\n maxRuntimeChars?: number\n /** When set, every turn's snapshot is appended to this JSONL file\n * immediately. If the analyst crashes mid-loop (provider 503,\n * network error, validator reject) the partial reasoning is still\n * on disk for diagnosis and recovery. */\n progressLogPath?: string\n}\n\n/**\n * Run the trace analyst.\n *\n * Throws:\n * - `TraceFileMissingError` if `source` is a path and doesn't exist.\n * - `AxAgentClarificationError` if the analyst asks for clarification.\n * - Provider errors (auth, rate limits) propagate from the AI service.\n */\nexport async function analyzeTraces(\n input: AnalyzeTracesInput,\n options: AnalyzeTracesOptions,\n): Promise<AnalyzeTracesResult> {\n if (!input.question || typeof input.question !== 'string') {\n throw new TypeError('analyzeTraces: input.question must be a non-empty string')\n }\n rejectRemovedOptions(options)\n\n const store: TraceAnalysisStore =\n typeof options.source === 'string'\n ? new OtlpFileTraceStore({ path: options.source })\n : options.source\n\n // Pre-warm file stores so missing inputs fail before the RLM starts.\n if (store instanceof OtlpFileTraceStore) {\n await store.ensureIndexed()\n }\n\n const tools: AxFunction[] = buildTraceAnalystTools({ store })\n const turns: AnalyzeTracesTurnSnapshot[] = []\n\n // Persist each turn as JSONL so interrupted analyst runs keep useful evidence.\n let progressFs: import('node:fs').WriteStream | undefined\n if (options.progressLogPath) {\n const { createWriteStream } = await import('node:fs')\n const { mkdir } = await import('node:fs/promises')\n const { dirname } = await import('node:path')\n await mkdir(dirname(options.progressLogPath), { recursive: true })\n progressFs = createWriteStream(options.progressLogPath, { flags: 'a' })\n }\n\n const actorTurnCallback = async (turn: AxAgentActorTurnCallbackArgs): Promise<void> => {\n const snap: AnalyzeTracesTurnSnapshot = {\n stage: turn.stage,\n turn: turn.turn,\n isError: turn.isError,\n code: turn.code,\n output: turn.output,\n thought: turn.thought,\n }\n turns.push(snap)\n if (progressFs) {\n try {\n progressFs.write(`${JSON.stringify({ ...snap, ts: Date.now() })}\\n`)\n } catch {\n // Progress logging must never fail the analyst.\n }\n }\n if (options.onTurn) await options.onTurn(snap)\n }\n\n const maxSubqueries = options.maxSubqueries ?? 4\n const maxTurns = options.maxTurns ?? 12\n const maxParallelSubqueries = options.maxParallelSubqueries ?? 2\n const maxRuntimeChars = options.maxRuntimeChars ?? 6000\n let completed: TraceAnalysisLoopResult<string>\n try {\n completed = await runTraceAnalysisLoop({\n id: 'TraceAnalyst',\n description:\n 'Analyzes OTLP-shaped JSONL traces using bounded discovery tools to identify systemic failure modes.',\n prompt: `${options.actorDescription ?? TRACE_ANALYST_ACTOR_DESCRIPTION}\n\nThe report must answer the user's question, and findings must be an array of concise evidence-backed strings.`,\n question: input.question,\n ai: options.ai,\n ...(options.model ? { model: options.model } : {}),\n tools,\n findingType: 'string',\n maxSubqueries,\n maxParallelSubqueries,\n maxTurns,\n maxRuntimeChars,\n ...(options.signal ? { signal: options.signal } : {}),\n onTurn: actorTurnCallback,\n })\n } finally {\n if (progressFs) {\n await new Promise<void>((resolve) => progressFs!.end(() => resolve()))\n }\n }\n\n return {\n answer: completed.report,\n findings: completed.findings,\n turns,\n turnCount: turns.length,\n usage: { actor: normalizeRecordArray(completed.usage), responder: [] },\n chatLog: { actor: normalizeRecordArray(completed.chatLog), responder: [] },\n actorPromptVersion: TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION,\n }\n}\n\nfunction rejectRemovedOptions(options: AnalyzeTracesOptions): void {\n const supplied = options as unknown as Record<string, unknown>\n const migrations = [\n ['maxDepth', 'maxSubqueries'],\n ['maxParallelSubagents', 'maxParallelSubqueries'],\n ['subagentDescription', 'actorDescription'],\n ] as const\n for (const [removed, replacement] of migrations) {\n if (removed in supplied) {\n throw new TypeError(`analyzeTraces: '${removed}' is unsupported; use '${replacement}'`)\n }\n }\n}\n\nfunction normalizeRecordArray(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return []\n return value.map((item) =>\n item && typeof item === 'object' ? { ...(item as Record<string, unknown>) } : { value: item },\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"analyst-j5je5J7c.js","names":[],"sources":["../src/trace-analyst/prompts.ts","../src/trace-analyst/analyst.ts"],"sourcesContent":["/** Ax RLM prompt for bounded trace discovery and evidence-backed analysis. */\n\nexport const TRACE_ANALYST_ACTOR_DESCRIPTION = `You answer questions about an OTLP-shaped JSONL trace dataset using the trace tools provided in the \\`traces\\` namespace.\n\nDISCOVERY → NARROW → DEEP-READ protocol — follow exactly:\n\n1. ALWAYS call \\`traces.getDatasetOverview({})\\` FIRST without a regex_pattern. The result tells you total_traces, raw_jsonl_bytes, services, agents, models, and sample_trace_ids (real ids — never fabricate one).\n\n2. Use raw_jsonl_bytes to gauge how expensive raw scans will be. \\`filters.regex_pattern\\` is the one scan-heavy filter on getDatasetOverview / queryTraces / countTraces — narrow with indexed fields (has_errors, model_names, service_names, agent_names, time bounds) BEFORE adding a regex on a large dataset.\n\n3. To list more traces than the sample, call \\`traces.queryTraces({ filters?, limit, offset? })\\`. Each summary carries raw_jsonl_bytes — use it to choose between viewTrace and searchTrace BEFORE calling either.\n\n4. Per-trace inspection:\n - SMALL trace (raw_jsonl_bytes well under 150_000): call \\`traces.viewTrace({ trace_id })\\`. Returns all spans. Per-attribute payloads are head-capped at ~4KB; large \\`input.value\\` / \\`output.value\\` / \\`llm.input_messages\\` will show a \\`[trace-analyst truncated: N bytes]\\` marker.\n - LARGE trace (raw_jsonl_bytes near or above 150_000, or you saw an \\`oversized\\` response): use \\`traces.searchTrace({ trace_id, regex_pattern })\\` to get bounded SpanMatchRecords (span metadata + matched text + surrounding context). Then call \\`traces.viewSpans({ trace_id, span_ids: [...] })\\` for surgical reads (~16KB cap, 4× higher than discovery), or \\`traces.searchSpan({ trace_id, span_id, regex_pattern })\\` for one large span. Stays bounded regardless of trace size.\n - Useful regex patterns: \\`STATUS_CODE_ERROR\\` (failures), tool names like \\`grep\\` or \\`view_trace\\`, error strings like \\`MaxTurnsExceeded\\`, model names, attribute keys.\n\n5. ONLY call viewTrace / viewSpans / searchTrace / searchSpan with trace/span ids you have already seen in sample_trace_ids, a queryTraces page, or a previous search result. Never invent ids.\n\n5a. **Result-shape contract** — searchTrace and searchSpan return \\`{ trace_id, hits, total_matches, has_more }\\`. Iterate \\`result.hits\\` (NOT result.matches). Each hit has \\`{ span_id, span_name, span_kind, attribute_path, matched_text, context_before, context_after, match_offset }\\`. viewTrace returns \\`{ trace_id, spans }\\` (or \\`oversized\\`). viewSpans returns \\`{ trace_id, spans, missing_span_ids, truncated_attribute_count }\\`. Never assume a field name — log the result shape first if unsure.\n\n6. If viewTrace returns an \\`oversized\\` summary instead of \\`spans\\`, DO NOT retry the same call. Read the summary's top_span_names, span_count, span_response_bytes_max, error_span_count to plan a follow-up: switch to searchTrace (or searchSpan for one large span), then viewSpans on a smaller, surgical span_ids set.\n\n7. If searchTrace or searchSpan returns has_more=true, REFINE the regex to be more specific rather than blindly raising max_matches.\n\n8. If a tool errors (invalid regex, range error), STOP and reconsider — don't retry with a guessed id or argument. Use the discovery tools above to recover.\n\n9. If a ~4KB-truncated payload from viewTrace / searchTrace matters for your answer, first try viewSpans on that span id (~16KB cap). If a 16KB-truncated payload from viewSpans still matters, narrow further with searchSpan against a more specific regex rather than asking for the full payload again.\n\n10. If the question splits into independent reasoning branches, use bounded \\`llmQuery(...)\\` calls over evidence you already loaded. Subqueries cannot inspect the trace store, so pass the exact trace excerpts they need. Example:\n\n const reviews = await llmQuery([\n { query: 'Classify the failure mechanism in this excerpt.', context: traceAbcExcerpt },\n { query: 'Classify the failure mechanism in this excerpt.', context: traceDefExcerpt },\n ]);\n\nOBSERVABILITY rules:\n- Each discovery turn must emit at least one concise \\`console.log(...)\\` showing what evidence was learned.\n- Finish gathering evidence before submitting the analysis.\n- Reuse runtime variables across turns; don't recompute.\n\nOUTPUT contract — your final answer must include:\n- A clear prose conclusion answering the user's question.\n- Trace ids and span ids cited as evidence for each claim.\n- Failure modes named in the user's domain language, with frequency and concrete examples.\n- A concise findings array containing only claims supported by inspected evidence.\n\nDo NOT invent trace ids, span ids, error messages, or model names. Every fact must be traceable to a tool result.`\n\nexport const TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION = 'trace-analyst-actor-v6-2026-07-14'\n","import type { AxAgentActorTurnCallbackArgs, AxAIService, AxFunction } from '@ax-llm/ax'\nimport { runTraceAnalysisLoop, type TraceAnalysisLoopResult } from './loop'\nimport { TRACE_ANALYST_ACTOR_DESCRIPTION, TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION } from './prompts'\nimport type { TraceAnalysisStore } from './store'\nimport { OtlpFileTraceStore } from './store-otlp'\nimport { buildTraceAnalystTools } from './tools'\n\nexport interface AnalyzeTracesInput {\n /** The user-facing question. Domain framing belongs here, not in the\n * actor description. */\n question: string\n}\n\nexport interface AnalyzeTracesResult {\n /** The actor's submitted prose answer. */\n answer: string\n /** Bulleted findings from the actor's structured completion. */\n findings: string[]\n /** Per-turn snapshots captured via `actorTurnCallback`. */\n turns: AnalyzeTracesTurnSnapshot[]\n /** Total turns the actor took. */\n turnCount: number\n /** Token usage by role. */\n usage: TraceAnalystUsage\n /** Full system + assistant + tool message log by role. */\n chatLog: TraceAnalystChatLog\n /** Prompt version that produced this run. */\n actorPromptVersion: string\n}\n\nexport interface TraceAnalystUsage {\n actor: TraceAnalystUsageEntry[]\n responder: TraceAnalystUsageEntry[]\n}\n\nexport interface TraceAnalystUsageEntry {\n [key: string]: unknown\n}\n\nexport interface TraceAnalystChatLog {\n actor: TraceAnalystChatMessage[]\n responder: TraceAnalystChatMessage[]\n}\n\nexport interface TraceAnalystChatMessage {\n [key: string]: unknown\n}\n\nexport interface AnalyzeTracesTurnSnapshot {\n stage: AxAgentActorTurnCallbackArgs['stage']\n turn: number\n isError: boolean\n /** The JS code the actor produced for this turn. */\n code: string\n /** The formatted action-log entry the actor sees on the next turn. */\n output: string\n /** Provider thought (when `executorOptions.showThoughts` is true and the\n * provider returns it). */\n thought?: string\n}\n\nexport interface AnalyzeTracesOptions {\n /** Trace data source. Pass either an OTLP-JSONL path or a custom store. */\n source: string | TraceAnalysisStore\n /** Caller-provided AxAIService. */\n ai: AxAIService\n /** Model id forwarded to the actor. */\n model?: string\n /** Maximum model subqueries. 0 disables model fan-out. Default 4. */\n maxSubqueries?: number\n /** Maximum actor turns. Default 12. */\n maxTurns?: number\n /** Maximum parallel model subqueries. Default 2. */\n maxParallelSubqueries?: number\n /** Cancels in-flight model and tool work. */\n signal?: AbortSignal\n /** Override the actor description. */\n actorDescription?: string\n /** Per-turn observability hook. */\n onTurn?: (turn: AnalyzeTracesTurnSnapshot) => void | Promise<void>\n /** Override max runtime characters per turn. Default 6000. */\n maxRuntimeChars?: number\n /** When set, every turn's snapshot is appended to this JSONL file\n * immediately. If the analyst crashes mid-loop (provider 503,\n * network error, validator reject) the partial reasoning is still\n * on disk for diagnosis and recovery. */\n progressLogPath?: string\n}\n\n/**\n * Run the trace analyst.\n *\n * Throws:\n * - `TraceFileMissingError` if `source` is a path and doesn't exist.\n * - `AxAgentClarificationError` if the analyst asks for clarification.\n * - Provider errors (auth, rate limits) propagate from the AI service.\n */\nexport async function analyzeTraces(\n input: AnalyzeTracesInput,\n options: AnalyzeTracesOptions,\n): Promise<AnalyzeTracesResult> {\n if (!input.question || typeof input.question !== 'string') {\n throw new TypeError('analyzeTraces: input.question must be a non-empty string')\n }\n rejectRemovedOptions(options)\n\n const store: TraceAnalysisStore =\n typeof options.source === 'string'\n ? new OtlpFileTraceStore({ path: options.source })\n : options.source\n\n // Pre-warm file stores so missing inputs fail before the RLM starts.\n if (store instanceof OtlpFileTraceStore) {\n await store.ensureIndexed()\n }\n\n const tools: AxFunction[] = buildTraceAnalystTools({ store })\n const turns: AnalyzeTracesTurnSnapshot[] = []\n\n // Persist each turn as JSONL so interrupted analyst runs keep useful evidence.\n let progressFs: import('node:fs').WriteStream | undefined\n if (options.progressLogPath) {\n const { createWriteStream } = await import('node:fs')\n const { mkdir } = await import('node:fs/promises')\n const { dirname } = await import('node:path')\n await mkdir(dirname(options.progressLogPath), { recursive: true })\n progressFs = createWriteStream(options.progressLogPath, { flags: 'a' })\n }\n\n const actorTurnCallback = async (turn: AxAgentActorTurnCallbackArgs): Promise<void> => {\n const snap: AnalyzeTracesTurnSnapshot = {\n stage: turn.stage,\n turn: turn.turn,\n isError: turn.isError,\n code: turn.code,\n output: turn.output,\n thought: turn.thought,\n }\n turns.push(snap)\n if (progressFs) {\n try {\n progressFs.write(`${JSON.stringify({ ...snap, ts: Date.now() })}\\n`)\n } catch {\n // Progress logging must never fail the analyst.\n }\n }\n if (options.onTurn) await options.onTurn(snap)\n }\n\n const maxSubqueries = options.maxSubqueries ?? 4\n const maxTurns = options.maxTurns ?? 12\n const maxParallelSubqueries = options.maxParallelSubqueries ?? 2\n const maxRuntimeChars = options.maxRuntimeChars ?? 6000\n let completed: TraceAnalysisLoopResult<string>\n try {\n completed = await runTraceAnalysisLoop({\n id: 'TraceAnalyst',\n description:\n 'Analyzes OTLP-shaped JSONL traces using bounded discovery tools to identify systemic failure modes.',\n prompt: `${options.actorDescription ?? TRACE_ANALYST_ACTOR_DESCRIPTION}\n\nThe report must answer the user's question, and findings must be an array of concise evidence-backed strings.`,\n question: input.question,\n ai: options.ai,\n ...(options.model ? { model: options.model } : {}),\n tools,\n findingType: 'string',\n maxSubqueries,\n maxParallelSubqueries,\n maxTurns,\n maxRuntimeChars,\n ...(options.signal ? { signal: options.signal } : {}),\n onTurn: actorTurnCallback,\n })\n } finally {\n if (progressFs) {\n await new Promise<void>((resolve) => progressFs!.end(() => resolve()))\n }\n }\n\n return {\n answer: completed.report,\n findings: completed.findings,\n turns,\n turnCount: turns.length,\n usage: { actor: normalizeRecordArray(completed.usage), responder: [] },\n chatLog: { actor: normalizeRecordArray(completed.chatLog), responder: [] },\n actorPromptVersion: TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION,\n }\n}\n\nfunction rejectRemovedOptions(options: AnalyzeTracesOptions): void {\n const supplied = options as unknown as Record<string, unknown>\n const migrations = [\n ['maxDepth', 'maxSubqueries'],\n ['maxParallelSubagents', 'maxParallelSubqueries'],\n ['subagentDescription', 'actorDescription'],\n ] as const\n for (const [removed, replacement] of migrations) {\n if (removed in supplied) {\n throw new TypeError(`analyzeTraces: '${removed}' is unsupported; use '${replacement}'`)\n }\n }\n}\n\nfunction normalizeRecordArray(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return []\n return value.map((item) =>\n item && typeof item === 'object' ? { ...(item as Record<string, unknown>) } : { value: item },\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { _ as deterministicSplit, a as normalizeRetrievedDocumentIds, c as parseJsonlRows, d as retrievalMetricsAtCutoff, f as renderBenchmarkReportMarkdown, g as BENCHMARK_SPLIT_SEED, h as routing_exports, i as evaluateStandardRetrieval, l as parseQrels, m as summarizeBenchmarkCampaign, n as buildStandardRetrievalItems, o as parseBeirCorpusJsonl, p as runBenchmarkAdapter, r as createRetrievalIdBenchmarkAdapter, s as parseBeirQueriesJsonl, u as parseTsvRows, v as calibrateBenchmarkMetric } from "../benchmarks-Mtu251Jz.js";
1
+ import { _ as deterministicSplit, a as normalizeRetrievedDocumentIds, c as parseJsonlRows, d as retrievalMetricsAtCutoff, f as renderBenchmarkReportMarkdown, g as BENCHMARK_SPLIT_SEED, h as routing_exports, i as evaluateStandardRetrieval, l as parseQrels, m as summarizeBenchmarkCampaign, n as buildStandardRetrievalItems, o as parseBeirCorpusJsonl, p as runBenchmarkAdapter, r as createRetrievalIdBenchmarkAdapter, s as parseBeirQueriesJsonl, u as parseTsvRows, v as calibrateBenchmarkMetric } from "../benchmarks-Dfgm9ts5.js";
2
2
  export { BENCHMARK_SPLIT_SEED, buildStandardRetrievalItems, calibrateBenchmarkMetric, createRetrievalIdBenchmarkAdapter, deterministicSplit, evaluateStandardRetrieval, normalizeRetrievedDocumentIds, parseBeirCorpusJsonl, parseBeirQueriesJsonl, parseJsonlRows, parseQrels, parseTsvRows, renderBenchmarkReportMarkdown, retrievalMetricsAtCutoff, routing_exports as routing, runBenchmarkAdapter, summarizeBenchmarkCampaign };
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { Y as runCampaign, Z as fsCampaignStorage } from "./skillopt-optimization-method-0UmPD6aP.js";
3
- import "./campaign-RVIqtJh0.js";
3
+ import "./campaign-Dz8uQnhC.js";
4
4
  import { join } from "node:path";
5
5
  //#region src/benchmarks/calibration.ts
6
6
  async function calibrateBenchmarkMetric(options) {
@@ -751,4 +751,4 @@ var benchmarks_exports = /* @__PURE__ */ __exportAll({
751
751
  //#endregion
752
752
  export { deterministicSplit as _, normalizeRetrievedDocumentIds as a, parseJsonlRows as c, retrievalMetricsAtCutoff as d, renderBenchmarkReportMarkdown as f, BENCHMARK_SPLIT_SEED as g, routing_exports as h, evaluateStandardRetrieval as i, parseQrels as l, summarizeBenchmarkCampaign as m, buildStandardRetrievalItems as n, parseBeirCorpusJsonl as o, runBenchmarkAdapter as p, createRetrievalIdBenchmarkAdapter as r, parseBeirQueriesJsonl as s, benchmarks_exports as t, parseTsvRows as u, calibrateBenchmarkMetric as v };
753
753
 
754
- //# sourceMappingURL=benchmarks-Mtu251Jz.js.map
754
+ //# sourceMappingURL=benchmarks-Dfgm9ts5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"benchmarks-Mtu251Jz.js","names":["clamp01","entries"],"sources":["../src/benchmarks/calibration.ts","../src/benchmarks/types.ts","../src/benchmarks/routing/dataset.ts","../src/benchmarks/routing/index.ts","../src/benchmarks/runner.ts","../src/benchmarks/standard-formats.ts","../src/benchmarks/index.ts"],"sourcesContent":["import type { BenchmarkAdapter, BenchmarkDatasetItem, BenchmarkEvaluation } from './types'\n\nexport interface BenchmarkMetricCalibrationOptions<TPayload = unknown, TArtifact = string> {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n item: BenchmarkDatasetItem<TPayload>\n weakArtifact: TArtifact\n strongArtifact: TArtifact\n maxWeakScore?: number\n minStrongScore?: number\n minGap?: number\n}\n\nexport interface BenchmarkMetricCalibrationResult {\n passed: boolean\n weak: BenchmarkEvaluation\n strong: BenchmarkEvaluation\n weakScore: number\n strongScore: number\n gap: number\n reasons: string[]\n}\n\nexport async function calibrateBenchmarkMetric<TPayload = unknown, TArtifact = string>(\n options: BenchmarkMetricCalibrationOptions<TPayload, TArtifact>,\n): Promise<BenchmarkMetricCalibrationResult> {\n const weak = await options.adapter.evaluate(options.item, options.weakArtifact)\n const strong = await options.adapter.evaluate(options.item, options.strongArtifact)\n const weakScore = clamp01(weak.score)\n const strongScore = clamp01(strong.score)\n const maxWeakScore = options.maxWeakScore ?? 0.3\n const minStrongScore = options.minStrongScore ?? 0.7\n const minGap = options.minGap ?? 0.4\n const gap = strongScore - weakScore\n const reasons = [\n weakScore <= maxWeakScore\n ? undefined\n : `weak score ${weakScore.toFixed(3)} exceeds max ${maxWeakScore.toFixed(3)}`,\n strongScore >= minStrongScore\n ? undefined\n : `strong score ${strongScore.toFixed(3)} below min ${minStrongScore.toFixed(3)}`,\n gap >= minGap ? undefined : `gap ${gap.toFixed(3)} below min ${minGap.toFixed(3)}`,\n ].filter((reason): reason is string => Boolean(reason))\n\n return {\n passed: reasons.length === 0,\n weak,\n strong,\n weakScore,\n strongScore,\n gap,\n reasons,\n }\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n","/**\n * Shared types for the reference benchmark wrappers under\n * `src/benchmarks/`. Each wrapper exports the three functions in\n * `BenchmarkAdapter` plus its own typed `DatasetItem` shape.\n */\n\nimport type { DispatchContext, Scenario } from '../campaign/types'\nimport type { RunSplitTag } from '../run-record'\n\nexport type BenchmarkTaskKind =\n | 'retrieval'\n | 'rag-answer'\n | 'hallucination'\n | 'kb-improvement'\n | 'routing'\n | 'custom'\n\nexport type BenchmarkFamily =\n | 'beir'\n | 'mteb-retrieval'\n | 'msmarco'\n | 'trec-dl'\n | 'miracl'\n | 'lotte'\n | 'bright'\n | 'crag'\n | 'hotpotqa'\n | 'kilt'\n | 'ragtruth'\n | 'faithbench'\n | 'first-party'\n | 'custom'\n\nexport interface BenchmarkDatasetItem<TPayload = unknown> {\n /** Stable dataset-local item id (used for split assignment + paper\n * references). Unique within a benchmark. */\n id: string\n /** Free-form payload. Each benchmark defines its own shape. */\n payload: TPayload\n /** Optional precomputed split. When absent, adapters use assignSplit(id). */\n split?: RunSplitTag\n /** Benchmark family this row came from, e.g. `beir` or `crag`. */\n family?: BenchmarkFamily | string\n /** Benchmark-local task kind, e.g. retrieval vs answer quality. */\n taskKind?: BenchmarkTaskKind | string\n /** Slice labels such as language, domain, freshness, multihop, long-tail. */\n tags?: string[]\n /** Dataset provenance, version, URL, or license notes. */\n source?: BenchmarkSource\n metadata?: Record<string, unknown>\n}\n\nexport interface BenchmarkEvaluation {\n /** [0, 1] score for the response on this item. Exact-match\n * benchmarks use 0/1; partial-credit benchmarks may return\n * fractional values. */\n score: number\n /** Optional pass/fail projection. Defaults to `score > 0` when absent. */\n passed?: boolean\n /** Numeric sub-metrics. These become report dimensions. */\n dimensions?: Record<string, number>\n /** Optional bag of raw scoring signals — e.g. parsed numeric\n * answer, regex match, judge sub-scores. */\n raw: Record<string, unknown>\n notes?: string\n}\n\nexport interface BenchmarkSource {\n name?: string\n url?: string\n version?: string\n license?: string\n citation?: string\n}\n\n/** Common signature implemented by every adapter under `src/benchmarks/*`. */\n// `TPayload` is the per-item payload type; `_TItem` is preserved for\n// downstream type-narrowing extensions (a richer `BenchmarkDatasetItem`\n// subclass that adds e.g. provenance metadata) but is intentionally\n// unused here. `noUnusedLocals` requires the leading underscore.\nexport interface BenchmarkAdapter<_TItem = unknown, TPayload = unknown, TArtifact = string> {\n /** Stable benchmark id such as `beir/nfcorpus` or `crag/smoke`. */\n id?: string\n family?: BenchmarkFamily | string\n taskKind?: BenchmarkTaskKind | string\n description?: string\n source?: BenchmarkSource\n defaultMetric?: string\n /** Load the dataset for the given split. May hit the network on\n * first call but should be cache-friendly. Adapters that don't\n * ship the dataset itself MUST throw a clearly-marked error\n * pointing the caller at the loader script. */\n loadDataset(split: RunSplitTag): Promise<BenchmarkDatasetItem<TPayload>[]>\n /** Score a single response. Pure with respect to the inputs. */\n evaluate(item: BenchmarkDatasetItem<TPayload>, artifact: TArtifact): Promise<BenchmarkEvaluation>\n /** Deterministic split assignment via item id hashing. The\n * fraction of items in each split is implementation-defined but\n * MUST be stable across processes and platforms. */\n assignSplit(itemId: string): RunSplitTag\n}\n\nexport interface BenchmarkScenario<TPayload = unknown> extends Scenario {\n kind: 'benchmark'\n benchmarkId: string\n family: BenchmarkFamily | string\n taskKind: BenchmarkTaskKind | string\n splitTag: RunSplitTag\n item: BenchmarkDatasetItem<TPayload>\n}\n\nexport type BenchmarkResponder<TPayload = unknown, TArtifact = string> = (input: {\n scenario: BenchmarkScenario<TPayload>\n item: BenchmarkDatasetItem<TPayload>\n context: DispatchContext\n}) => Promise<TArtifact> | TArtifact\n\n// ── Deterministic split assignment ───────────────────────────────────\n\n/**\n * 32-bit FNV-1a hash. Stable, allocation-free, deterministic across\n * runtimes. We use it to assign items to splits rather than depending\n * on a polyfilled crypto.subtle path.\n */\nfunction fnv1a32(input: string): number {\n let h = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i) & 0xff\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0\n }\n return h >>> 0\n}\n\n/** Split-assignment seed shared across all benchmarks. Bumping this\n * value reshuffles every split — do NOT do that lightly. */\nexport const BENCHMARK_SPLIT_SEED = 'agent-eval-v1'\n\n/**\n * Assign an item id to one of `'search' | 'dev' | 'holdout'` using a\n * stable 32-bit hash of `${seed}::${id}`. Default proportions:\n *\n * search: 60% (optimization-readable)\n * dev: 20% (held-out for tuning, leak-on-purpose during dev)\n * holdout:20% (paper-grade held-out, gated reads)\n */\nexport function deterministicSplit(\n itemId: string,\n seed: string = BENCHMARK_SPLIT_SEED,\n): RunSplitTag {\n const h = fnv1a32(`${seed}::${itemId}`)\n const pos = h / 0x100000000\n if (pos < 0.6) return 'search'\n if (pos < 0.8) return 'dev'\n return 'holdout'\n}\n","/**\n * Synthetic routing dataset. 16 tasks across 4 categories. Used as a\n * deterministic, dependency-free benchmark for any router that maps a\n * natural-language request to one of a fixed set of route labels.\n *\n * Format (see `routing/README.md` for prose):\n *\n * {\n * id: stable per-task ID (matches across processes).\n * category: one of the four route labels.\n * prompt: the user-facing request the router must classify.\n * route: the ground-truth route the router should pick.\n * synonyms: other strings that count as a correct answer.\n * hardNegatives:close-but-wrong route labels — used to detect the\n * \"always picks the popular route\" failure mode.\n * }\n *\n * The four categories are intentionally cross-domain (file ops,\n * math, search, conversation) so a router that collapses to one\n * category is easy to spot.\n */\n\nexport interface RoutingItem {\n id: string\n category: 'file' | 'math' | 'search' | 'chat'\n prompt: string\n /** Canonical correct route label. */\n route: string\n /** Alternate route labels that also count as correct. */\n synonyms: string[]\n /** Wrong-but-tempting route labels (for analysis, not grading). */\n hardNegatives: string[]\n}\n\nexport const ROUTING_DATASET: RoutingItem[] = [\n {\n id: 'file_001',\n category: 'file',\n prompt: 'Save the meeting notes to /tmp/notes-2025-04.md as markdown.',\n route: 'fs.write',\n synonyms: ['filesystem.write', 'write_file'],\n hardNegatives: ['fs.read', 'chat.reply'],\n },\n {\n id: 'file_002',\n category: 'file',\n prompt: 'Read the contents of /etc/hosts and summarize the entries.',\n route: 'fs.read',\n synonyms: ['filesystem.read', 'read_file'],\n hardNegatives: ['fs.write', 'search.web'],\n },\n {\n id: 'file_003',\n category: 'file',\n prompt: 'List every Python file under src/ recursively.',\n route: 'fs.list',\n synonyms: ['filesystem.list', 'list_files'],\n hardNegatives: ['fs.read', 'search.code'],\n },\n {\n id: 'file_004',\n category: 'file',\n prompt: 'Delete the cached build at .turbo/cache.',\n route: 'fs.delete',\n synonyms: ['filesystem.delete', 'remove_file'],\n hardNegatives: ['fs.write', 'fs.list'],\n },\n {\n id: 'math_001',\n category: 'math',\n prompt: 'What is the integral of 3x^2 + 2x from 0 to 5?',\n route: 'math.integral',\n synonyms: ['calculator.integral', 'math.solve'],\n hardNegatives: ['math.derivative', 'chat.reply'],\n },\n {\n id: 'math_002',\n category: 'math',\n prompt: 'Compute the derivative of sin(x) * cos(x).',\n route: 'math.derivative',\n synonyms: ['calculator.derivative', 'math.solve'],\n hardNegatives: ['math.integral', 'math.algebra'],\n },\n {\n id: 'math_003',\n category: 'math',\n prompt: 'Solve 2x + 7 = 19 for x.',\n route: 'math.algebra',\n synonyms: ['calculator.algebra', 'math.solve'],\n hardNegatives: ['math.derivative', 'math.integral'],\n },\n {\n id: 'math_004',\n category: 'math',\n prompt: 'What is the prime factorization of 360?',\n route: 'math.numbertheory',\n synonyms: ['calculator.factor', 'math.solve'],\n hardNegatives: ['math.algebra', 'search.web'],\n },\n {\n id: 'search_001',\n category: 'search',\n prompt: 'Find recent papers on agent prompt optimization with held-out promotion gates.',\n route: 'search.web',\n synonyms: ['web.search', 'search.papers'],\n hardNegatives: ['search.code', 'chat.reply'],\n },\n {\n id: 'search_002',\n category: 'search',\n prompt: 'Search the codebase for every call site of `runProposeReview`.',\n route: 'search.code',\n synonyms: ['code.search', 'grep'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'search_003',\n category: 'search',\n prompt: 'What is the latest release of the Tangle network on GitHub?',\n route: 'search.web',\n synonyms: ['web.search', 'github.releases'],\n hardNegatives: ['search.code', 'chat.reply'],\n },\n {\n id: 'search_004',\n category: 'search',\n prompt: 'Find all TODO comments in the agent-eval src tree.',\n route: 'search.code',\n synonyms: ['code.search', 'grep'],\n hardNegatives: ['search.web', 'fs.list'],\n },\n {\n id: 'chat_001',\n category: 'chat',\n prompt: 'Hi there, how are you doing today?',\n route: 'chat.reply',\n synonyms: ['conversation.reply'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'chat_002',\n category: 'chat',\n prompt: 'Please explain the difference between an LLM and a foundation model.',\n route: 'chat.reply',\n synonyms: ['conversation.reply', 'qa.answer'],\n hardNegatives: ['search.web', 'math.algebra'],\n },\n {\n id: 'chat_003',\n category: 'chat',\n prompt: 'Tell me a short joke about distributed systems.',\n route: 'chat.reply',\n synonyms: ['conversation.reply'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'chat_004',\n category: 'chat',\n prompt: 'Acknowledge my last message with a thumbs up.',\n route: 'chat.reply',\n synonyms: ['conversation.reply', 'react'],\n hardNegatives: ['fs.write', 'search.web'],\n },\n]\n","/**\n * Routing benchmark — synthetic, dependency-free, ships in the\n * package. 16 cross-category items in `dataset.ts`. See\n * `routing/README.md` for the format.\n *\n * `evaluate` does case-insensitive exact match against the canonical\n * route plus declared synonyms. The first valid route token in the\n * response wins; everything else is ignored. Wrong answers also\n * report whether they hit a hard negative — useful when triaging\n * \"always picks the popular route\" failure modes.\n */\n\nimport type { RunSplitTag } from '../../run-record'\nimport type { BenchmarkAdapter, BenchmarkDatasetItem, BenchmarkEvaluation } from '../types'\nimport { deterministicSplit } from '../types'\nimport { ROUTING_DATASET, type RoutingItem } from './dataset'\n\nexport type { RoutingItem }\nexport type RoutingPayload = RoutingItem\nexport type RoutingDatasetItem = BenchmarkDatasetItem<RoutingPayload>\n\nclass RoutingAdapter implements BenchmarkAdapter<RoutingDatasetItem, RoutingPayload> {\n readonly id = 'first-party/routing'\n readonly family = 'first-party'\n readonly taskKind = 'routing'\n readonly description = 'Synthetic fixed-route classification smoke benchmark'\n readonly defaultMetric = 'route_exact_match'\n\n async loadDataset(split: RunSplitTag): Promise<RoutingDatasetItem[]> {\n return ROUTING_DATASET.map((item) => ({ id: item.id, payload: item })).filter(\n (it) => assignSplitImpl(it.id) === split,\n )\n }\n\n async evaluate(item: RoutingDatasetItem, response: string): Promise<BenchmarkEvaluation> {\n const tokens = extractRouteTokens(response)\n const correct = new Set<string>(\n [item.payload.route, ...item.payload.synonyms].map((s) => s.toLowerCase()),\n )\n const hardNeg = new Set<string>(item.payload.hardNegatives.map((s) => s.toLowerCase()))\n const firstMatch = tokens.find((t) => correct.has(t.toLowerCase())) ?? null\n const firstHardNeg = tokens.find((t) => hardNeg.has(t.toLowerCase())) ?? null\n const score = firstMatch ? 1 : 0\n return {\n score,\n raw: {\n firstToken: tokens[0] ?? null,\n matchedRoute: firstMatch,\n hitHardNegative: Boolean(firstHardNeg),\n hardNegativeRoute: firstHardNeg,\n category: item.payload.category,\n },\n }\n }\n\n assignSplit(itemId: string): RunSplitTag {\n return assignSplitImpl(itemId)\n }\n}\n\nfunction assignSplitImpl(itemId: string): RunSplitTag {\n return deterministicSplit(`routing::${itemId}`)\n}\n\n/**\n * Pull route-shaped tokens out of a model response. Routes look like\n * `category.action` (`fs.write`, `chat.reply`). Bare alphanumerics\n * are not routes, but `category.action` patterns are robust to most\n * model wrappers (JSON output, prose explanations, code fences).\n */\nexport function extractRouteTokens(response: string): string[] {\n const matches = response.match(/[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*/gi)\n return matches ?? []\n}\n\nconst adapter = new RoutingAdapter()\n\nexport const loadDataset = adapter.loadDataset.bind(adapter)\nexport const evaluate = adapter.evaluate.bind(adapter)\nexport const assignSplit = adapter.assignSplit.bind(adapter)\nexport { ROUTING_DATASET, RoutingAdapter }\n","import { join } from 'node:path'\nimport {\n type CampaignResult,\n type DispatchFn,\n type JudgeConfig,\n type JudgeScore,\n runCampaign,\n type Scenario,\n} from '../campaign'\nimport { type CampaignStorage, fsCampaignStorage } from '../campaign/storage'\nimport type { RunSplitTag } from '../run-record'\nimport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkEvaluation,\n BenchmarkFamily,\n BenchmarkResponder,\n BenchmarkScenario,\n BenchmarkTaskKind,\n} from './types'\n\nexport interface BenchmarkRunOptions<TPayload = unknown, TArtifact = string> {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n respond: BenchmarkResponder<TPayload, TArtifact>\n splits?: readonly RunSplitTag[]\n runDir: string\n repo?: string\n seed?: number\n reps?: number\n resumable?: boolean\n costCeiling?: number\n maxConcurrency?: number\n dispatchTimeoutMs?: number\n expectUsage?: 'assert' | 'warn' | 'off'\n storage?: CampaignStorage\n now?: () => Date\n}\n\nexport interface BenchmarkReport {\n benchmarkId: string\n family: BenchmarkFamily | string\n taskKind: BenchmarkTaskKind | string\n source?: BenchmarkAdapter['source']\n runDir: string\n manifestHash: string\n seed: number\n startedAt: string\n endedAt: string\n durationMs: number\n totalItems: number\n totalCells: number\n cellsFailed: number\n cellsCached: number\n totalCostUsd: number\n splits: Record<string, BenchmarkSliceSummary>\n tags: Record<string, BenchmarkSliceSummary>\n dimensions: Record<string, BenchmarkDistribution>\n score: BenchmarkDistribution\n costUsd: BenchmarkDistribution\n latencyMs: BenchmarkDistribution\n}\n\nexport interface BenchmarkSliceSummary {\n n: number\n meanScore: number\n passRate: number\n score: BenchmarkDistribution\n costUsd: BenchmarkDistribution\n latencyMs: BenchmarkDistribution\n}\n\nexport interface BenchmarkDistribution {\n n: number\n min: number\n mean: number\n median: number\n p90: number\n max: number\n}\n\nexport interface BenchmarkRunResult<TPayload = unknown, TArtifact = string> {\n scenarios: Array<BenchmarkScenario<TPayload>>\n campaign: CampaignResult<TArtifact, BenchmarkScenario<TPayload>>\n report: BenchmarkReport\n reportJsonPath: string\n reportMarkdownPath: string\n}\n\nexport async function runBenchmarkAdapter<TPayload = unknown, TArtifact = string>(\n options: BenchmarkRunOptions<TPayload, TArtifact>,\n): Promise<BenchmarkRunResult<TPayload, TArtifact>> {\n const storage = options.storage ?? fsCampaignStorage()\n const benchmarkId = benchmarkIdFor(options.adapter)\n const scenarios = await loadBenchmarkScenarios(options.adapter, options.splits)\n const judge = benchmarkAdapterJudge(options.adapter)\n const dispatch: DispatchFn<BenchmarkScenario<TPayload>, TArtifact> = async (\n scenario,\n context,\n ) => {\n return options.respond({ scenario, item: scenario.item, context })\n }\n\n const campaign = await runCampaign<BenchmarkScenario<TPayload>, TArtifact>({\n scenarios,\n dispatch,\n dispatchRef: `benchmark:${benchmarkId}`,\n judges: [judge],\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling: options.costCeiling,\n maxConcurrency: options.maxConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: options.expectUsage ?? 'off',\n runDir: options.runDir,\n repo: options.repo,\n storage,\n now: options.now,\n })\n const report = summarizeBenchmarkCampaign({\n adapter: options.adapter,\n scenarios,\n campaign,\n })\n storage.ensureDir(campaign.runDir)\n const reportJsonPath = join(campaign.runDir, 'benchmark-report.json')\n const reportMarkdownPath = join(campaign.runDir, 'benchmark-report.md')\n storage.write(reportJsonPath, `${JSON.stringify(report, null, 2)}\\n`)\n storage.write(reportMarkdownPath, renderBenchmarkReportMarkdown(report))\n return { scenarios, campaign, report, reportJsonPath, reportMarkdownPath }\n}\n\nexport async function loadBenchmarkScenarios<TPayload>(\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, unknown>,\n splits: readonly RunSplitTag[] = ['search', 'dev', 'holdout'],\n): Promise<Array<BenchmarkScenario<TPayload>>> {\n const benchmarkId = benchmarkIdFor(adapter)\n const family = adapter.family ?? 'custom'\n const taskKind = adapter.taskKind ?? 'custom'\n const out: Array<BenchmarkScenario<TPayload>> = []\n const seen = new Set<string>()\n for (const split of splits) {\n const items = await adapter.loadDataset(split)\n for (const item of items) {\n const splitTag = item.split ?? adapter.assignSplit(item.id)\n if (splitTag !== split) continue\n const key = `${benchmarkId}:${item.id}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push({\n id: key,\n kind: 'benchmark',\n benchmarkId,\n family: item.family ?? family,\n taskKind: item.taskKind ?? taskKind,\n splitTag,\n tags: [...new Set([splitTag, ...(item.tags ?? [])])],\n item,\n })\n }\n }\n return out\n}\n\nexport function benchmarkAdapterJudge<TPayload, TArtifact>(\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>,\n): JudgeConfig<TArtifact, BenchmarkScenario<TPayload>> {\n const benchmarkId = benchmarkIdFor(adapter)\n return {\n name: `${benchmarkId}:score`,\n dimensions: [\n { key: 'score', description: `Primary ${benchmarkId} benchmark score` },\n { key: 'passed', description: 'Binary pass projection for aggregate reporting' },\n ],\n appliesTo: (scenario: Scenario): scenario is BenchmarkScenario<TPayload> => {\n return scenario.kind === 'benchmark' && scenario.id.startsWith(`${benchmarkId}:`)\n },\n async score({ artifact, scenario }) {\n const evaluation = await adapter.evaluate(scenario.item, artifact)\n const dimensions = normalizeEvaluationDimensions(evaluation)\n return {\n dimensions,\n composite: clamp01(evaluation.score),\n notes: evaluation.notes ?? '',\n }\n },\n }\n}\n\nexport function summarizeBenchmarkCampaign<TPayload, TArtifact>(input: {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n scenarios: Array<BenchmarkScenario<TPayload>>\n campaign: CampaignResult<TArtifact, BenchmarkScenario<TPayload>>\n}): BenchmarkReport {\n const scenarioById = new Map(input.scenarios.map((scenario) => [scenario.id, scenario]))\n const rows = input.campaign.cells.map((cell) => {\n const scenario = scenarioById.get(cell.scenarioId)\n const judge = firstJudgeScore(cell.judgeScores)\n const score = judge?.composite ?? 0\n return {\n cell,\n scenario,\n score,\n passed: (judge?.dimensions.passed ?? (score > 0 ? 1 : 0)) >= 1,\n dimensions: judge?.dimensions ?? {},\n }\n })\n const successful = rows.filter((row) => !row.cell.error)\n const scoreValues = successful.map((row) => row.score)\n return {\n benchmarkId: benchmarkIdFor(input.adapter),\n family: input.adapter.family ?? 'custom',\n taskKind: input.adapter.taskKind ?? 'custom',\n ...(input.adapter.source ? { source: input.adapter.source } : {}),\n runDir: input.campaign.runDir,\n manifestHash: input.campaign.manifestHash,\n seed: input.campaign.seed,\n startedAt: input.campaign.startedAt,\n endedAt: input.campaign.endedAt,\n durationMs: input.campaign.durationMs,\n totalItems: input.scenarios.length,\n totalCells: input.campaign.cells.length,\n cellsFailed: input.campaign.aggregates.cellsFailed,\n cellsCached: input.campaign.aggregates.cellsCached,\n totalCostUsd: input.campaign.aggregates.cost.totalCostUsd,\n splits: summarizeSlices(successful, (row) => row.scenario?.splitTag ?? 'unknown', [\n 'search',\n 'dev',\n 'holdout',\n ]),\n tags: summarizeSlices(successful, (row) => row.scenario?.tags ?? []),\n dimensions: summarizeDimensions(successful.map((row) => row.dimensions)),\n score: distribution(scoreValues),\n costUsd: distribution(successful.map((row) => row.cell.costUsd)),\n latencyMs: distribution(successful.map((row) => row.cell.durationMs)),\n }\n}\n\nexport function renderBenchmarkReportMarkdown(report: BenchmarkReport): string {\n const splitRows = Object.entries(report.splits)\n .map(([split, summary]) => {\n return `| ${split} | ${summary.n} | ${fmt(summary.meanScore)} | ${fmt(summary.passRate)} | ${fmt(summary.score.p90)} | ${fmt(summary.costUsd.mean)} | ${fmt(summary.latencyMs.p90)} |`\n })\n .join('\\n')\n const dimRows = Object.entries(report.dimensions)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, dist]) => `| ${key} | ${dist.n} | ${fmt(dist.mean)} | ${fmt(dist.p90)} |`)\n .join('\\n')\n return [\n `# Benchmark Report: ${report.benchmarkId}`,\n '',\n `- family: ${report.family}`,\n `- task kind: ${report.taskKind}`,\n `- run dir: ${report.runDir}`,\n `- manifest: ${report.manifestHash}`,\n `- cells: ${report.totalCells} total, ${report.cellsFailed} failed, ${report.cellsCached} cached`,\n `- cost: $${fmt(report.totalCostUsd)}`,\n `- score: mean ${fmt(report.score.mean)}, median ${fmt(report.score.median)}, p90 ${fmt(report.score.p90)}, n=${report.score.n}`,\n '',\n '## Splits',\n '',\n '| split | n | mean score | pass rate | score p90 | mean cost | latency p90 ms |',\n '| --- | ---: | ---: | ---: | ---: | ---: | ---: |',\n splitRows || '| none | 0 | 0 | 0 | 0 | 0 | 0 |',\n '',\n '## Dimensions',\n '',\n '| dimension | n | mean | p90 |',\n '| --- | ---: | ---: | ---: |',\n dimRows || '| none | 0 | 0 | 0 |',\n '',\n ].join('\\n')\n}\n\nfunction benchmarkIdFor(adapter: Pick<BenchmarkAdapter, 'id' | 'family' | 'taskKind'>): string {\n return adapter.id ?? `${adapter.family ?? 'custom'}/${adapter.taskKind ?? 'custom'}`\n}\n\nfunction normalizeEvaluationDimensions(evaluation: BenchmarkEvaluation): Record<string, number> {\n const dimensions: Record<string, number> = { score: clamp01(evaluation.score) }\n for (const [key, value] of Object.entries(evaluation.dimensions ?? {})) {\n if (Number.isFinite(value)) dimensions[key] = value\n }\n dimensions.passed = (evaluation.passed ?? evaluation.score > 0) ? 1 : 0\n return dimensions\n}\n\nfunction summarizeDimensions(\n rows: Array<Record<string, number>>,\n): Record<string, BenchmarkDistribution> {\n const values = new Map<string, number[]>()\n for (const row of rows) {\n for (const [key, value] of Object.entries(row)) {\n if (!Number.isFinite(value)) continue\n const list = values.get(key) ?? []\n list.push(value)\n values.set(key, list)\n }\n }\n return Object.fromEntries([...values.entries()].map(([key, vals]) => [key, distribution(vals)]))\n}\n\nfunction summarizeSlices<T>(\n rows: T[],\n keyOf: (row: T) => string | string[],\n knownKeys: readonly string[] = [],\n): Record<string, BenchmarkSliceSummary> {\n const grouped = new Map<string, T[]>()\n for (const key of knownKeys) grouped.set(key, [])\n for (const row of rows) {\n const keys = keyOf(row)\n for (const key of Array.isArray(keys) ? keys : [keys]) {\n const list = grouped.get(key) ?? []\n list.push(row)\n grouped.set(key, list)\n }\n }\n const out: Record<string, BenchmarkSliceSummary> = {}\n for (const [key, list] of grouped) {\n const withShape = list as Array<{\n score: number\n passed: boolean\n cell: { costUsd: number; durationMs: number }\n }>\n out[key] = {\n n: list.length,\n meanScore: mean(withShape.map((row) => row.score)),\n passRate: mean(withShape.map((row) => (row.passed ? 1 : 0))),\n score: distribution(withShape.map((row) => row.score)),\n costUsd: distribution(withShape.map((row) => row.cell.costUsd)),\n latencyMs: distribution(withShape.map((row) => row.cell.durationMs)),\n }\n }\n return out\n}\n\nfunction firstJudgeScore(\n judgeScores: CampaignResult<unknown>['cells'][number]['judgeScores'],\n): JudgeScore | undefined {\n return Object.values(judgeScores)[0]\n}\n\nfunction distribution(values: readonly number[]): BenchmarkDistribution {\n const finite = [...values].filter(Number.isFinite).sort((a, b) => a - b)\n if (finite.length === 0) return { n: 0, min: 0, mean: 0, median: 0, p90: 0, max: 0 }\n return {\n n: finite.length,\n min: finite[0]!,\n mean: mean(finite),\n median: percentile(finite, 0.5),\n p90: percentile(finite, 0.9),\n max: finite[finite.length - 1]!,\n }\n}\n\nfunction percentile(sortedValues: readonly number[], p: number): number {\n if (sortedValues.length === 0) return 0\n const index = Math.min(\n sortedValues.length - 1,\n Math.max(0, Math.ceil(p * sortedValues.length) - 1),\n )\n return sortedValues[index]!\n}\n\nfunction mean(values: readonly number[]): number {\n const finite = values.filter(Number.isFinite)\n if (finite.length === 0) return 0\n return finite.reduce((sum, value) => sum + value, 0) / finite.length\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\nfunction fmt(value: number): string {\n if (!Number.isFinite(value)) return '0'\n return value.toFixed(value === 0 || Math.abs(value) >= 10 ? 0 : 3)\n}\n","import type { RunSplitTag } from '../run-record'\nimport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkFamily,\n BenchmarkSource,\n BenchmarkTaskKind,\n} from './types'\nimport { deterministicSplit } from './types'\n\nexport interface StandardRetrievalDocument {\n id: string\n title?: string\n text: string\n metadata?: Record<string, unknown>\n}\n\nexport interface StandardRetrievalQuery {\n id: string\n text: string\n metadata?: Record<string, unknown>\n}\n\nexport interface StandardRetrievalQrel {\n queryId: string\n documentId: string\n score: number\n}\n\nexport interface StandardRetrievalPayload {\n queryId: string\n query: string\n expectedDocumentIds: string[]\n expectedScores: Record<string, number>\n corpus?: Record<string, StandardRetrievalDocument>\n metadata?: Record<string, unknown>\n}\n\nexport interface BuildStandardRetrievalItemsOptions {\n benchmarkId: string\n family: BenchmarkFamily | string\n queries: readonly StandardRetrievalQuery[]\n qrels: readonly StandardRetrievalQrel[]\n corpus?: readonly StandardRetrievalDocument[]\n includeCorpusInPayload?: boolean\n source?: BenchmarkSource\n tags?: readonly string[]\n splitOf?: (queryId: string) => RunSplitTag\n}\n\nexport interface RetrievalIdAdapterOptions extends BuildStandardRetrievalItemsOptions {\n responseIdPattern?: RegExp\n cutoffs?: readonly number[]\n primaryMetric?: string\n passMetric?: string\n passThreshold?: number\n}\n\nexport interface StandardRetrievalResult {\n id?: string\n documentId?: string\n docId?: string\n score?: number\n}\n\nexport type StandardRetrievalArtifact =\n | string\n | readonly string[]\n | readonly StandardRetrievalResult[]\n | {\n ids?: readonly string[]\n documentIds?: readonly string[]\n results?: readonly StandardRetrievalResult[]\n }\n\nexport interface StandardRetrievalEvaluationOptions {\n responseIdPattern?: RegExp\n cutoffs?: readonly number[]\n primaryMetric?: string\n passMetric?: string\n passThreshold?: number\n}\n\nexport function parseJsonlRows<T = unknown>(text: string): T[] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n return JSON.parse(line) as T\n } catch (error) {\n throw new Error(`invalid JSONL row ${index + 1}: ${(error as Error).message}`)\n }\n })\n}\n\nexport function parseTsvRows(text: string): string[][] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((line) => !line.startsWith('#'))\n .map((line) => line.split(/\\t|\\s+/))\n}\n\nexport function parseQrels(text: string): StandardRetrievalQrel[] {\n return parseTsvRows(text).flatMap((parts, index) => {\n if (parts.length < 3) return []\n const [queryId, maybeZeroOrDocId, maybeDocIdOrScore, maybeScore] = parts\n if (!queryId || !maybeZeroOrDocId || !maybeDocIdOrScore) return []\n if (queryId.toLowerCase() === 'query-id' || queryId.toLowerCase() === 'qid') return []\n const documentId = maybeScore === undefined ? maybeZeroOrDocId : maybeDocIdOrScore\n const scoreText = maybeScore === undefined ? maybeDocIdOrScore : maybeScore\n const score = Number(scoreText)\n if (!documentId || !Number.isFinite(score)) {\n throw new Error(`invalid qrels row ${index + 1}: expected query id, doc id, score`)\n }\n return [{ queryId, documentId, score }]\n })\n}\n\nexport function parseBeirCorpusJsonl(text: string): StandardRetrievalDocument[] {\n return parseJsonlRows<Record<string, unknown>>(text).map((row, index) => {\n const id = stringField(row, '_id') ?? stringField(row, 'id')\n const body = stringField(row, 'text') ?? stringField(row, 'contents')\n if (!id || body === undefined) {\n throw new Error(`invalid BEIR corpus row ${index + 1}: expected _id/id and text/contents`)\n }\n return {\n id,\n title: stringField(row, 'title'),\n text: body,\n metadata: stripKnown(row, ['_id', 'id', 'title', 'text', 'contents']),\n }\n })\n}\n\nexport function parseBeirQueriesJsonl(text: string): StandardRetrievalQuery[] {\n return parseJsonlRows<Record<string, unknown>>(text).map((row, index) => {\n const id = stringField(row, '_id') ?? stringField(row, 'id') ?? stringField(row, 'query_id')\n const query = stringField(row, 'text') ?? stringField(row, 'query')\n if (!id || !query) {\n throw new Error(`invalid BEIR query row ${index + 1}: expected _id/id and text/query`)\n }\n return {\n id,\n text: query,\n metadata: stripKnown(row, ['_id', 'id', 'query_id', 'text', 'query']),\n }\n })\n}\n\nexport function buildStandardRetrievalItems(\n options: BuildStandardRetrievalItemsOptions,\n): Array<BenchmarkDatasetItem<StandardRetrievalPayload>> {\n const qrelsByQuery = new Map<string, StandardRetrievalQrel[]>()\n for (const qrel of options.qrels) {\n if (qrel.score <= 0) continue\n const list = qrelsByQuery.get(qrel.queryId) ?? []\n list.push(qrel)\n qrelsByQuery.set(qrel.queryId, list)\n }\n const corpus =\n options.includeCorpusInPayload && options.corpus\n ? Object.fromEntries(options.corpus.map((document) => [document.id, document]))\n : undefined\n return options.queries.flatMap((query) => {\n const qrels = qrelsByQuery.get(query.id) ?? []\n if (qrels.length === 0) return []\n const split =\n options.splitOf?.(query.id) ?? deterministicSplit(`${options.benchmarkId}:${query.id}`)\n return [\n {\n id: query.id,\n split,\n family: options.family,\n taskKind: 'retrieval',\n tags: [...new Set([...(options.tags ?? []), split])],\n ...(options.source ? { source: options.source } : {}),\n ...(query.metadata ? { metadata: query.metadata } : {}),\n payload: {\n queryId: query.id,\n query: query.text,\n expectedDocumentIds: qrels.map((qrel) => qrel.documentId),\n expectedScores: Object.fromEntries(qrels.map((qrel) => [qrel.documentId, qrel.score])),\n ...(corpus ? { corpus } : {}),\n ...(query.metadata ? { metadata: query.metadata } : {}),\n },\n },\n ]\n })\n}\n\nexport function createRetrievalIdBenchmarkAdapter(\n options: RetrievalIdAdapterOptions,\n): BenchmarkAdapter<\n BenchmarkDatasetItem<StandardRetrievalPayload>,\n StandardRetrievalPayload,\n StandardRetrievalArtifact\n> {\n const items = buildStandardRetrievalItems(options)\n return {\n id: options.benchmarkId,\n family: options.family,\n taskKind: 'retrieval' satisfies BenchmarkTaskKind,\n source: options.source,\n defaultMetric: options.primaryMetric ?? 'ndcg@10',\n async loadDataset(split) {\n return items.filter((item) => item.split === split)\n },\n async evaluate(item, artifact) {\n return evaluateStandardRetrieval(item.payload, artifact, options)\n },\n assignSplit(itemId) {\n return options.splitOf?.(itemId) ?? deterministicSplit(`${options.benchmarkId}:${itemId}`)\n },\n }\n}\n\nexport function evaluateStandardRetrieval(\n payload: StandardRetrievalPayload,\n artifact: StandardRetrievalArtifact,\n options: StandardRetrievalEvaluationOptions = {},\n) {\n const rankedDocumentIds = normalizeRetrievedDocumentIds(\n artifact,\n options.responseIdPattern ?? /[A-Za-z0-9_.:/-]+/g,\n )\n const cutoffs = normalizeCutoffs(options.cutoffs ?? [1, 3, 5, 10])\n const dimensions: Record<string, number> = {\n expected_count: payload.expectedDocumentIds.length,\n returned_count: rankedDocumentIds.length,\n }\n for (const cutoff of cutoffs) {\n Object.assign(\n dimensions,\n retrievalMetricsAtCutoff({\n rankedDocumentIds,\n expectedScores: payload.expectedScores,\n cutoff,\n }),\n )\n }\n const primaryMetric = options.primaryMetric ?? 'ndcg@10'\n const passMetric = options.passMetric ?? 'hit@10'\n const score = dimensions[primaryMetric] ?? dimensions[`ndcg@${cutoffs[cutoffs.length - 1]}`] ?? 0\n const passScore =\n dimensions[passMetric] ?? dimensions[`hit@${cutoffs[cutoffs.length - 1]}`] ?? score\n return {\n score,\n passed: passScore >= (options.passThreshold ?? 1),\n dimensions,\n raw: {\n rankedDocumentIds,\n expectedDocumentIds: payload.expectedDocumentIds,\n expectedScores: payload.expectedScores,\n },\n }\n}\n\nexport function normalizeRetrievedDocumentIds(\n artifact: StandardRetrievalArtifact,\n responseIdPattern: RegExp = /[A-Za-z0-9_.:/-]+/g,\n): string[] {\n if (typeof artifact === 'string') {\n return uniqueOrdered((artifact.match(responseIdPattern) ?? []).map((value) => value.trim()))\n }\n if (Array.isArray(artifact)) {\n const entries = artifact as readonly (string | StandardRetrievalResult)[]\n return uniqueOrdered(\n entries.flatMap((entry) => {\n if (typeof entry === 'string') return [entry]\n return [entry.documentId ?? entry.docId ?? entry.id ?? '']\n }),\n )\n }\n const objectArtifact = artifact as Exclude<StandardRetrievalArtifact, string | readonly unknown[]>\n return uniqueOrdered(\n [\n ...(objectArtifact.documentIds ?? []),\n ...(objectArtifact.ids ?? []),\n ...(objectArtifact.results ?? []).map(\n (entry) => entry.documentId ?? entry.docId ?? entry.id ?? '',\n ),\n ].map((value) => value.trim()),\n )\n}\n\nexport function retrievalMetricsAtCutoff(input: {\n rankedDocumentIds: readonly string[]\n expectedScores: Record<string, number>\n cutoff: number\n}): Record<string, number> {\n const top = input.rankedDocumentIds.slice(0, input.cutoff)\n const relevantIds = Object.keys(input.expectedScores).filter(\n (id) => input.expectedScores[id]! > 0,\n )\n const relevant = new Set(relevantIds)\n const hits = top.filter((id) => relevant.has(id)).length\n const firstRelevantRank = top.findIndex((id) => relevant.has(id))\n const prefix = `@${input.cutoff}`\n return {\n [`hit${prefix}`]: hits > 0 ? 1 : 0,\n [`recall${prefix}`]: relevant.size === 0 ? 1 : hits / relevant.size,\n [`precision${prefix}`]: hits / input.cutoff,\n [`mrr${prefix}`]: firstRelevantRank === -1 ? 0 : 1 / (firstRelevantRank + 1),\n [`ndcg${prefix}`]: ndcgAt(input.rankedDocumentIds, input.expectedScores, input.cutoff),\n }\n}\n\nfunction stringField(row: Record<string, unknown>, key: string): string | undefined {\n const value = row[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction stripKnown(\n row: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const known = new Set(keys)\n return Object.fromEntries(Object.entries(row).filter(([key]) => !known.has(key)))\n}\n\nfunction normalizeCutoffs(cutoffs: readonly number[]): number[] {\n return [\n ...new Set(cutoffs.map((cutoff) => Math.trunc(cutoff)).filter((cutoff) => cutoff > 0)),\n ].sort((a, b) => a - b)\n}\n\nfunction uniqueOrdered(values: readonly string[]): string[] {\n const seen = new Set<string>()\n const out: string[] = []\n for (const value of values) {\n const trimmed = value.trim()\n if (!trimmed || seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out\n}\n\nfunction ndcgAt(\n rankedDocumentIds: readonly string[],\n expectedScores: Record<string, number>,\n cutoff: number,\n): number {\n const dcg = rankedDocumentIds\n .slice(0, cutoff)\n .reduce(\n (sum, documentId, index) => sum + discountedGain(expectedScores[documentId] ?? 0, index),\n 0,\n )\n const ideal = Object.values(expectedScores)\n .filter((score) => score > 0)\n .sort((a, b) => b - a)\n .slice(0, cutoff)\n .reduce((sum, score, index) => sum + discountedGain(score, index), 0)\n return ideal === 0 ? 1 : dcg / ideal\n}\n\nfunction discountedGain(relevance: number, zeroBasedRank: number): number {\n if (relevance <= 0) return 0\n return (2 ** relevance - 1) / Math.log2(zeroBasedRank + 2)\n}\n","/**\n * Reference benchmark wrappers — entry point.\n *\n * Core surface (exported here):\n * - The `BenchmarkAdapter` contract.\n * - `runBenchmarkAdapter` for campaign-backed benchmark execution.\n * - `calibrateBenchmarkMetric` for weak/strong metric checks.\n * - Standard retrieval parsers for BEIR/MTEB/MS MARCO/TREC/MIRACL-style files.\n * - `deterministicSplit` + `BENCHMARK_SPLIT_SEED` for split assignment.\n * - `routing` — synthetic 16-task router benchmark. The only novel\n * benchmark we built; ships in the package.\n *\n * Example wrappers (under `examples/benchmarks/`, NOT in the bundle):\n * - `gsm8k` — exact-match math reasoning (HF mirror, dataset\n * not bundled).\n * - `swebench-lite` — 30-instance SWE-Bench subset via an external\n * grader command.\n *\n * The example wrappers are reference implementations of `BenchmarkAdapter`.\n * Read them, copy them, adapt them. They're intentionally not in the main\n * entry — every team will configure them differently.\n */\n\nexport {\n type BenchmarkMetricCalibrationOptions,\n type BenchmarkMetricCalibrationResult,\n calibrateBenchmarkMetric,\n} from './calibration'\nexport * as routing from './routing/index'\nexport {\n type BenchmarkDistribution,\n type BenchmarkReport,\n type BenchmarkRunOptions,\n type BenchmarkRunResult,\n type BenchmarkSliceSummary,\n renderBenchmarkReportMarkdown,\n runBenchmarkAdapter,\n summarizeBenchmarkCampaign,\n} from './runner'\nexport {\n type BuildStandardRetrievalItemsOptions,\n buildStandardRetrievalItems,\n createRetrievalIdBenchmarkAdapter,\n evaluateStandardRetrieval,\n normalizeRetrievedDocumentIds,\n parseBeirCorpusJsonl,\n parseBeirQueriesJsonl,\n parseJsonlRows,\n parseQrels,\n parseTsvRows,\n type RetrievalIdAdapterOptions,\n retrievalMetricsAtCutoff,\n type StandardRetrievalArtifact,\n type StandardRetrievalDocument,\n type StandardRetrievalEvaluationOptions,\n type StandardRetrievalPayload,\n type StandardRetrievalQrel,\n type StandardRetrievalQuery,\n type StandardRetrievalResult,\n} from './standard-formats'\nexport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkEvaluation,\n BenchmarkFamily,\n BenchmarkResponder,\n BenchmarkScenario,\n BenchmarkSource,\n BenchmarkTaskKind,\n} from './types'\nexport { BENCHMARK_SPLIT_SEED, deterministicSplit } from './types'\n"],"mappings":"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"}
1
+ {"version":3,"file":"benchmarks-Dfgm9ts5.js","names":["clamp01","entries"],"sources":["../src/benchmarks/calibration.ts","../src/benchmarks/types.ts","../src/benchmarks/routing/dataset.ts","../src/benchmarks/routing/index.ts","../src/benchmarks/runner.ts","../src/benchmarks/standard-formats.ts","../src/benchmarks/index.ts"],"sourcesContent":["import type { BenchmarkAdapter, BenchmarkDatasetItem, BenchmarkEvaluation } from './types'\n\nexport interface BenchmarkMetricCalibrationOptions<TPayload = unknown, TArtifact = string> {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n item: BenchmarkDatasetItem<TPayload>\n weakArtifact: TArtifact\n strongArtifact: TArtifact\n maxWeakScore?: number\n minStrongScore?: number\n minGap?: number\n}\n\nexport interface BenchmarkMetricCalibrationResult {\n passed: boolean\n weak: BenchmarkEvaluation\n strong: BenchmarkEvaluation\n weakScore: number\n strongScore: number\n gap: number\n reasons: string[]\n}\n\nexport async function calibrateBenchmarkMetric<TPayload = unknown, TArtifact = string>(\n options: BenchmarkMetricCalibrationOptions<TPayload, TArtifact>,\n): Promise<BenchmarkMetricCalibrationResult> {\n const weak = await options.adapter.evaluate(options.item, options.weakArtifact)\n const strong = await options.adapter.evaluate(options.item, options.strongArtifact)\n const weakScore = clamp01(weak.score)\n const strongScore = clamp01(strong.score)\n const maxWeakScore = options.maxWeakScore ?? 0.3\n const minStrongScore = options.minStrongScore ?? 0.7\n const minGap = options.minGap ?? 0.4\n const gap = strongScore - weakScore\n const reasons = [\n weakScore <= maxWeakScore\n ? undefined\n : `weak score ${weakScore.toFixed(3)} exceeds max ${maxWeakScore.toFixed(3)}`,\n strongScore >= minStrongScore\n ? undefined\n : `strong score ${strongScore.toFixed(3)} below min ${minStrongScore.toFixed(3)}`,\n gap >= minGap ? undefined : `gap ${gap.toFixed(3)} below min ${minGap.toFixed(3)}`,\n ].filter((reason): reason is string => Boolean(reason))\n\n return {\n passed: reasons.length === 0,\n weak,\n strong,\n weakScore,\n strongScore,\n gap,\n reasons,\n }\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n","/**\n * Shared types for the reference benchmark wrappers under\n * `src/benchmarks/`. Each wrapper exports the three functions in\n * `BenchmarkAdapter` plus its own typed `DatasetItem` shape.\n */\n\nimport type { DispatchContext, Scenario } from '../campaign/types'\nimport type { RunSplitTag } from '../run-record'\n\nexport type BenchmarkTaskKind =\n | 'retrieval'\n | 'rag-answer'\n | 'hallucination'\n | 'kb-improvement'\n | 'routing'\n | 'custom'\n\nexport type BenchmarkFamily =\n | 'beir'\n | 'mteb-retrieval'\n | 'msmarco'\n | 'trec-dl'\n | 'miracl'\n | 'lotte'\n | 'bright'\n | 'crag'\n | 'hotpotqa'\n | 'kilt'\n | 'ragtruth'\n | 'faithbench'\n | 'first-party'\n | 'custom'\n\nexport interface BenchmarkDatasetItem<TPayload = unknown> {\n /** Stable dataset-local item id (used for split assignment + paper\n * references). Unique within a benchmark. */\n id: string\n /** Free-form payload. Each benchmark defines its own shape. */\n payload: TPayload\n /** Optional precomputed split. When absent, adapters use assignSplit(id). */\n split?: RunSplitTag\n /** Benchmark family this row came from, e.g. `beir` or `crag`. */\n family?: BenchmarkFamily | string\n /** Benchmark-local task kind, e.g. retrieval vs answer quality. */\n taskKind?: BenchmarkTaskKind | string\n /** Slice labels such as language, domain, freshness, multihop, long-tail. */\n tags?: string[]\n /** Dataset provenance, version, URL, or license notes. */\n source?: BenchmarkSource\n metadata?: Record<string, unknown>\n}\n\nexport interface BenchmarkEvaluation {\n /** [0, 1] score for the response on this item. Exact-match\n * benchmarks use 0/1; partial-credit benchmarks may return\n * fractional values. */\n score: number\n /** Optional pass/fail projection. Defaults to `score > 0` when absent. */\n passed?: boolean\n /** Numeric sub-metrics. These become report dimensions. */\n dimensions?: Record<string, number>\n /** Optional bag of raw scoring signals — e.g. parsed numeric\n * answer, regex match, judge sub-scores. */\n raw: Record<string, unknown>\n notes?: string\n}\n\nexport interface BenchmarkSource {\n name?: string\n url?: string\n version?: string\n license?: string\n citation?: string\n}\n\n/** Common signature implemented by every adapter under `src/benchmarks/*`. */\n// `TPayload` is the per-item payload type; `_TItem` is preserved for\n// downstream type-narrowing extensions (a richer `BenchmarkDatasetItem`\n// subclass that adds e.g. provenance metadata) but is intentionally\n// unused here. `noUnusedLocals` requires the leading underscore.\nexport interface BenchmarkAdapter<_TItem = unknown, TPayload = unknown, TArtifact = string> {\n /** Stable benchmark id such as `beir/nfcorpus` or `crag/smoke`. */\n id?: string\n family?: BenchmarkFamily | string\n taskKind?: BenchmarkTaskKind | string\n description?: string\n source?: BenchmarkSource\n defaultMetric?: string\n /** Load the dataset for the given split. May hit the network on\n * first call but should be cache-friendly. Adapters that don't\n * ship the dataset itself MUST throw a clearly-marked error\n * pointing the caller at the loader script. */\n loadDataset(split: RunSplitTag): Promise<BenchmarkDatasetItem<TPayload>[]>\n /** Score a single response. Pure with respect to the inputs. */\n evaluate(item: BenchmarkDatasetItem<TPayload>, artifact: TArtifact): Promise<BenchmarkEvaluation>\n /** Deterministic split assignment via item id hashing. The\n * fraction of items in each split is implementation-defined but\n * MUST be stable across processes and platforms. */\n assignSplit(itemId: string): RunSplitTag\n}\n\nexport interface BenchmarkScenario<TPayload = unknown> extends Scenario {\n kind: 'benchmark'\n benchmarkId: string\n family: BenchmarkFamily | string\n taskKind: BenchmarkTaskKind | string\n splitTag: RunSplitTag\n item: BenchmarkDatasetItem<TPayload>\n}\n\nexport type BenchmarkResponder<TPayload = unknown, TArtifact = string> = (input: {\n scenario: BenchmarkScenario<TPayload>\n item: BenchmarkDatasetItem<TPayload>\n context: DispatchContext\n}) => Promise<TArtifact> | TArtifact\n\n// ── Deterministic split assignment ───────────────────────────────────\n\n/**\n * 32-bit FNV-1a hash. Stable, allocation-free, deterministic across\n * runtimes. We use it to assign items to splits rather than depending\n * on a polyfilled crypto.subtle path.\n */\nfunction fnv1a32(input: string): number {\n let h = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i) & 0xff\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0\n }\n return h >>> 0\n}\n\n/** Split-assignment seed shared across all benchmarks. Bumping this\n * value reshuffles every split — do NOT do that lightly. */\nexport const BENCHMARK_SPLIT_SEED = 'agent-eval-v1'\n\n/**\n * Assign an item id to one of `'search' | 'dev' | 'holdout'` using a\n * stable 32-bit hash of `${seed}::${id}`. Default proportions:\n *\n * search: 60% (optimization-readable)\n * dev: 20% (held-out for tuning, leak-on-purpose during dev)\n * holdout:20% (paper-grade held-out, gated reads)\n */\nexport function deterministicSplit(\n itemId: string,\n seed: string = BENCHMARK_SPLIT_SEED,\n): RunSplitTag {\n const h = fnv1a32(`${seed}::${itemId}`)\n const pos = h / 0x100000000\n if (pos < 0.6) return 'search'\n if (pos < 0.8) return 'dev'\n return 'holdout'\n}\n","/**\n * Synthetic routing dataset. 16 tasks across 4 categories. Used as a\n * deterministic, dependency-free benchmark for any router that maps a\n * natural-language request to one of a fixed set of route labels.\n *\n * Format (see `routing/README.md` for prose):\n *\n * {\n * id: stable per-task ID (matches across processes).\n * category: one of the four route labels.\n * prompt: the user-facing request the router must classify.\n * route: the ground-truth route the router should pick.\n * synonyms: other strings that count as a correct answer.\n * hardNegatives:close-but-wrong route labels — used to detect the\n * \"always picks the popular route\" failure mode.\n * }\n *\n * The four categories are intentionally cross-domain (file ops,\n * math, search, conversation) so a router that collapses to one\n * category is easy to spot.\n */\n\nexport interface RoutingItem {\n id: string\n category: 'file' | 'math' | 'search' | 'chat'\n prompt: string\n /** Canonical correct route label. */\n route: string\n /** Alternate route labels that also count as correct. */\n synonyms: string[]\n /** Wrong-but-tempting route labels (for analysis, not grading). */\n hardNegatives: string[]\n}\n\nexport const ROUTING_DATASET: RoutingItem[] = [\n {\n id: 'file_001',\n category: 'file',\n prompt: 'Save the meeting notes to /tmp/notes-2025-04.md as markdown.',\n route: 'fs.write',\n synonyms: ['filesystem.write', 'write_file'],\n hardNegatives: ['fs.read', 'chat.reply'],\n },\n {\n id: 'file_002',\n category: 'file',\n prompt: 'Read the contents of /etc/hosts and summarize the entries.',\n route: 'fs.read',\n synonyms: ['filesystem.read', 'read_file'],\n hardNegatives: ['fs.write', 'search.web'],\n },\n {\n id: 'file_003',\n category: 'file',\n prompt: 'List every Python file under src/ recursively.',\n route: 'fs.list',\n synonyms: ['filesystem.list', 'list_files'],\n hardNegatives: ['fs.read', 'search.code'],\n },\n {\n id: 'file_004',\n category: 'file',\n prompt: 'Delete the cached build at .turbo/cache.',\n route: 'fs.delete',\n synonyms: ['filesystem.delete', 'remove_file'],\n hardNegatives: ['fs.write', 'fs.list'],\n },\n {\n id: 'math_001',\n category: 'math',\n prompt: 'What is the integral of 3x^2 + 2x from 0 to 5?',\n route: 'math.integral',\n synonyms: ['calculator.integral', 'math.solve'],\n hardNegatives: ['math.derivative', 'chat.reply'],\n },\n {\n id: 'math_002',\n category: 'math',\n prompt: 'Compute the derivative of sin(x) * cos(x).',\n route: 'math.derivative',\n synonyms: ['calculator.derivative', 'math.solve'],\n hardNegatives: ['math.integral', 'math.algebra'],\n },\n {\n id: 'math_003',\n category: 'math',\n prompt: 'Solve 2x + 7 = 19 for x.',\n route: 'math.algebra',\n synonyms: ['calculator.algebra', 'math.solve'],\n hardNegatives: ['math.derivative', 'math.integral'],\n },\n {\n id: 'math_004',\n category: 'math',\n prompt: 'What is the prime factorization of 360?',\n route: 'math.numbertheory',\n synonyms: ['calculator.factor', 'math.solve'],\n hardNegatives: ['math.algebra', 'search.web'],\n },\n {\n id: 'search_001',\n category: 'search',\n prompt: 'Find recent papers on agent prompt optimization with held-out promotion gates.',\n route: 'search.web',\n synonyms: ['web.search', 'search.papers'],\n hardNegatives: ['search.code', 'chat.reply'],\n },\n {\n id: 'search_002',\n category: 'search',\n prompt: 'Search the codebase for every call site of `runProposeReview`.',\n route: 'search.code',\n synonyms: ['code.search', 'grep'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'search_003',\n category: 'search',\n prompt: 'What is the latest release of the Tangle network on GitHub?',\n route: 'search.web',\n synonyms: ['web.search', 'github.releases'],\n hardNegatives: ['search.code', 'chat.reply'],\n },\n {\n id: 'search_004',\n category: 'search',\n prompt: 'Find all TODO comments in the agent-eval src tree.',\n route: 'search.code',\n synonyms: ['code.search', 'grep'],\n hardNegatives: ['search.web', 'fs.list'],\n },\n {\n id: 'chat_001',\n category: 'chat',\n prompt: 'Hi there, how are you doing today?',\n route: 'chat.reply',\n synonyms: ['conversation.reply'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'chat_002',\n category: 'chat',\n prompt: 'Please explain the difference between an LLM and a foundation model.',\n route: 'chat.reply',\n synonyms: ['conversation.reply', 'qa.answer'],\n hardNegatives: ['search.web', 'math.algebra'],\n },\n {\n id: 'chat_003',\n category: 'chat',\n prompt: 'Tell me a short joke about distributed systems.',\n route: 'chat.reply',\n synonyms: ['conversation.reply'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'chat_004',\n category: 'chat',\n prompt: 'Acknowledge my last message with a thumbs up.',\n route: 'chat.reply',\n synonyms: ['conversation.reply', 'react'],\n hardNegatives: ['fs.write', 'search.web'],\n },\n]\n","/**\n * Routing benchmark — synthetic, dependency-free, ships in the\n * package. 16 cross-category items in `dataset.ts`. See\n * `routing/README.md` for the format.\n *\n * `evaluate` does case-insensitive exact match against the canonical\n * route plus declared synonyms. The first valid route token in the\n * response wins; everything else is ignored. Wrong answers also\n * report whether they hit a hard negative — useful when triaging\n * \"always picks the popular route\" failure modes.\n */\n\nimport type { RunSplitTag } from '../../run-record'\nimport type { BenchmarkAdapter, BenchmarkDatasetItem, BenchmarkEvaluation } from '../types'\nimport { deterministicSplit } from '../types'\nimport { ROUTING_DATASET, type RoutingItem } from './dataset'\n\nexport type { RoutingItem }\nexport type RoutingPayload = RoutingItem\nexport type RoutingDatasetItem = BenchmarkDatasetItem<RoutingPayload>\n\nclass RoutingAdapter implements BenchmarkAdapter<RoutingDatasetItem, RoutingPayload> {\n readonly id = 'first-party/routing'\n readonly family = 'first-party'\n readonly taskKind = 'routing'\n readonly description = 'Synthetic fixed-route classification smoke benchmark'\n readonly defaultMetric = 'route_exact_match'\n\n async loadDataset(split: RunSplitTag): Promise<RoutingDatasetItem[]> {\n return ROUTING_DATASET.map((item) => ({ id: item.id, payload: item })).filter(\n (it) => assignSplitImpl(it.id) === split,\n )\n }\n\n async evaluate(item: RoutingDatasetItem, response: string): Promise<BenchmarkEvaluation> {\n const tokens = extractRouteTokens(response)\n const correct = new Set<string>(\n [item.payload.route, ...item.payload.synonyms].map((s) => s.toLowerCase()),\n )\n const hardNeg = new Set<string>(item.payload.hardNegatives.map((s) => s.toLowerCase()))\n const firstMatch = tokens.find((t) => correct.has(t.toLowerCase())) ?? null\n const firstHardNeg = tokens.find((t) => hardNeg.has(t.toLowerCase())) ?? null\n const score = firstMatch ? 1 : 0\n return {\n score,\n raw: {\n firstToken: tokens[0] ?? null,\n matchedRoute: firstMatch,\n hitHardNegative: Boolean(firstHardNeg),\n hardNegativeRoute: firstHardNeg,\n category: item.payload.category,\n },\n }\n }\n\n assignSplit(itemId: string): RunSplitTag {\n return assignSplitImpl(itemId)\n }\n}\n\nfunction assignSplitImpl(itemId: string): RunSplitTag {\n return deterministicSplit(`routing::${itemId}`)\n}\n\n/**\n * Pull route-shaped tokens out of a model response. Routes look like\n * `category.action` (`fs.write`, `chat.reply`). Bare alphanumerics\n * are not routes, but `category.action` patterns are robust to most\n * model wrappers (JSON output, prose explanations, code fences).\n */\nexport function extractRouteTokens(response: string): string[] {\n const matches = response.match(/[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*/gi)\n return matches ?? []\n}\n\nconst adapter = new RoutingAdapter()\n\nexport const loadDataset = adapter.loadDataset.bind(adapter)\nexport const evaluate = adapter.evaluate.bind(adapter)\nexport const assignSplit = adapter.assignSplit.bind(adapter)\nexport { ROUTING_DATASET, RoutingAdapter }\n","import { join } from 'node:path'\nimport {\n type CampaignResult,\n type DispatchFn,\n type JudgeConfig,\n type JudgeScore,\n runCampaign,\n type Scenario,\n} from '../campaign'\nimport { type CampaignStorage, fsCampaignStorage } from '../campaign/storage'\nimport type { RunSplitTag } from '../run-record'\nimport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkEvaluation,\n BenchmarkFamily,\n BenchmarkResponder,\n BenchmarkScenario,\n BenchmarkTaskKind,\n} from './types'\n\nexport interface BenchmarkRunOptions<TPayload = unknown, TArtifact = string> {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n respond: BenchmarkResponder<TPayload, TArtifact>\n splits?: readonly RunSplitTag[]\n runDir: string\n repo?: string\n seed?: number\n reps?: number\n resumable?: boolean\n costCeiling?: number\n maxConcurrency?: number\n dispatchTimeoutMs?: number\n expectUsage?: 'assert' | 'warn' | 'off'\n storage?: CampaignStorage\n now?: () => Date\n}\n\nexport interface BenchmarkReport {\n benchmarkId: string\n family: BenchmarkFamily | string\n taskKind: BenchmarkTaskKind | string\n source?: BenchmarkAdapter['source']\n runDir: string\n manifestHash: string\n seed: number\n startedAt: string\n endedAt: string\n durationMs: number\n totalItems: number\n totalCells: number\n cellsFailed: number\n cellsCached: number\n totalCostUsd: number\n splits: Record<string, BenchmarkSliceSummary>\n tags: Record<string, BenchmarkSliceSummary>\n dimensions: Record<string, BenchmarkDistribution>\n score: BenchmarkDistribution\n costUsd: BenchmarkDistribution\n latencyMs: BenchmarkDistribution\n}\n\nexport interface BenchmarkSliceSummary {\n n: number\n meanScore: number\n passRate: number\n score: BenchmarkDistribution\n costUsd: BenchmarkDistribution\n latencyMs: BenchmarkDistribution\n}\n\nexport interface BenchmarkDistribution {\n n: number\n min: number\n mean: number\n median: number\n p90: number\n max: number\n}\n\nexport interface BenchmarkRunResult<TPayload = unknown, TArtifact = string> {\n scenarios: Array<BenchmarkScenario<TPayload>>\n campaign: CampaignResult<TArtifact, BenchmarkScenario<TPayload>>\n report: BenchmarkReport\n reportJsonPath: string\n reportMarkdownPath: string\n}\n\nexport async function runBenchmarkAdapter<TPayload = unknown, TArtifact = string>(\n options: BenchmarkRunOptions<TPayload, TArtifact>,\n): Promise<BenchmarkRunResult<TPayload, TArtifact>> {\n const storage = options.storage ?? fsCampaignStorage()\n const benchmarkId = benchmarkIdFor(options.adapter)\n const scenarios = await loadBenchmarkScenarios(options.adapter, options.splits)\n const judge = benchmarkAdapterJudge(options.adapter)\n const dispatch: DispatchFn<BenchmarkScenario<TPayload>, TArtifact> = async (\n scenario,\n context,\n ) => {\n return options.respond({ scenario, item: scenario.item, context })\n }\n\n const campaign = await runCampaign<BenchmarkScenario<TPayload>, TArtifact>({\n scenarios,\n dispatch,\n dispatchRef: `benchmark:${benchmarkId}`,\n judges: [judge],\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling: options.costCeiling,\n maxConcurrency: options.maxConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: options.expectUsage ?? 'off',\n runDir: options.runDir,\n repo: options.repo,\n storage,\n now: options.now,\n })\n const report = summarizeBenchmarkCampaign({\n adapter: options.adapter,\n scenarios,\n campaign,\n })\n storage.ensureDir(campaign.runDir)\n const reportJsonPath = join(campaign.runDir, 'benchmark-report.json')\n const reportMarkdownPath = join(campaign.runDir, 'benchmark-report.md')\n storage.write(reportJsonPath, `${JSON.stringify(report, null, 2)}\\n`)\n storage.write(reportMarkdownPath, renderBenchmarkReportMarkdown(report))\n return { scenarios, campaign, report, reportJsonPath, reportMarkdownPath }\n}\n\nexport async function loadBenchmarkScenarios<TPayload>(\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, unknown>,\n splits: readonly RunSplitTag[] = ['search', 'dev', 'holdout'],\n): Promise<Array<BenchmarkScenario<TPayload>>> {\n const benchmarkId = benchmarkIdFor(adapter)\n const family = adapter.family ?? 'custom'\n const taskKind = adapter.taskKind ?? 'custom'\n const out: Array<BenchmarkScenario<TPayload>> = []\n const seen = new Set<string>()\n for (const split of splits) {\n const items = await adapter.loadDataset(split)\n for (const item of items) {\n const splitTag = item.split ?? adapter.assignSplit(item.id)\n if (splitTag !== split) continue\n const key = `${benchmarkId}:${item.id}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push({\n id: key,\n kind: 'benchmark',\n benchmarkId,\n family: item.family ?? family,\n taskKind: item.taskKind ?? taskKind,\n splitTag,\n tags: [...new Set([splitTag, ...(item.tags ?? [])])],\n item,\n })\n }\n }\n return out\n}\n\nexport function benchmarkAdapterJudge<TPayload, TArtifact>(\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>,\n): JudgeConfig<TArtifact, BenchmarkScenario<TPayload>> {\n const benchmarkId = benchmarkIdFor(adapter)\n return {\n name: `${benchmarkId}:score`,\n dimensions: [\n { key: 'score', description: `Primary ${benchmarkId} benchmark score` },\n { key: 'passed', description: 'Binary pass projection for aggregate reporting' },\n ],\n appliesTo: (scenario: Scenario): scenario is BenchmarkScenario<TPayload> => {\n return scenario.kind === 'benchmark' && scenario.id.startsWith(`${benchmarkId}:`)\n },\n async score({ artifact, scenario }) {\n const evaluation = await adapter.evaluate(scenario.item, artifact)\n const dimensions = normalizeEvaluationDimensions(evaluation)\n return {\n dimensions,\n composite: clamp01(evaluation.score),\n notes: evaluation.notes ?? '',\n }\n },\n }\n}\n\nexport function summarizeBenchmarkCampaign<TPayload, TArtifact>(input: {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n scenarios: Array<BenchmarkScenario<TPayload>>\n campaign: CampaignResult<TArtifact, BenchmarkScenario<TPayload>>\n}): BenchmarkReport {\n const scenarioById = new Map(input.scenarios.map((scenario) => [scenario.id, scenario]))\n const rows = input.campaign.cells.map((cell) => {\n const scenario = scenarioById.get(cell.scenarioId)\n const judge = firstJudgeScore(cell.judgeScores)\n const score = judge?.composite ?? 0\n return {\n cell,\n scenario,\n score,\n passed: (judge?.dimensions.passed ?? (score > 0 ? 1 : 0)) >= 1,\n dimensions: judge?.dimensions ?? {},\n }\n })\n const successful = rows.filter((row) => !row.cell.error)\n const scoreValues = successful.map((row) => row.score)\n return {\n benchmarkId: benchmarkIdFor(input.adapter),\n family: input.adapter.family ?? 'custom',\n taskKind: input.adapter.taskKind ?? 'custom',\n ...(input.adapter.source ? { source: input.adapter.source } : {}),\n runDir: input.campaign.runDir,\n manifestHash: input.campaign.manifestHash,\n seed: input.campaign.seed,\n startedAt: input.campaign.startedAt,\n endedAt: input.campaign.endedAt,\n durationMs: input.campaign.durationMs,\n totalItems: input.scenarios.length,\n totalCells: input.campaign.cells.length,\n cellsFailed: input.campaign.aggregates.cellsFailed,\n cellsCached: input.campaign.aggregates.cellsCached,\n totalCostUsd: input.campaign.aggregates.cost.totalCostUsd,\n splits: summarizeSlices(successful, (row) => row.scenario?.splitTag ?? 'unknown', [\n 'search',\n 'dev',\n 'holdout',\n ]),\n tags: summarizeSlices(successful, (row) => row.scenario?.tags ?? []),\n dimensions: summarizeDimensions(successful.map((row) => row.dimensions)),\n score: distribution(scoreValues),\n costUsd: distribution(successful.map((row) => row.cell.costUsd)),\n latencyMs: distribution(successful.map((row) => row.cell.durationMs)),\n }\n}\n\nexport function renderBenchmarkReportMarkdown(report: BenchmarkReport): string {\n const splitRows = Object.entries(report.splits)\n .map(([split, summary]) => {\n return `| ${split} | ${summary.n} | ${fmt(summary.meanScore)} | ${fmt(summary.passRate)} | ${fmt(summary.score.p90)} | ${fmt(summary.costUsd.mean)} | ${fmt(summary.latencyMs.p90)} |`\n })\n .join('\\n')\n const dimRows = Object.entries(report.dimensions)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, dist]) => `| ${key} | ${dist.n} | ${fmt(dist.mean)} | ${fmt(dist.p90)} |`)\n .join('\\n')\n return [\n `# Benchmark Report: ${report.benchmarkId}`,\n '',\n `- family: ${report.family}`,\n `- task kind: ${report.taskKind}`,\n `- run dir: ${report.runDir}`,\n `- manifest: ${report.manifestHash}`,\n `- cells: ${report.totalCells} total, ${report.cellsFailed} failed, ${report.cellsCached} cached`,\n `- cost: $${fmt(report.totalCostUsd)}`,\n `- score: mean ${fmt(report.score.mean)}, median ${fmt(report.score.median)}, p90 ${fmt(report.score.p90)}, n=${report.score.n}`,\n '',\n '## Splits',\n '',\n '| split | n | mean score | pass rate | score p90 | mean cost | latency p90 ms |',\n '| --- | ---: | ---: | ---: | ---: | ---: | ---: |',\n splitRows || '| none | 0 | 0 | 0 | 0 | 0 | 0 |',\n '',\n '## Dimensions',\n '',\n '| dimension | n | mean | p90 |',\n '| --- | ---: | ---: | ---: |',\n dimRows || '| none | 0 | 0 | 0 |',\n '',\n ].join('\\n')\n}\n\nfunction benchmarkIdFor(adapter: Pick<BenchmarkAdapter, 'id' | 'family' | 'taskKind'>): string {\n return adapter.id ?? `${adapter.family ?? 'custom'}/${adapter.taskKind ?? 'custom'}`\n}\n\nfunction normalizeEvaluationDimensions(evaluation: BenchmarkEvaluation): Record<string, number> {\n const dimensions: Record<string, number> = { score: clamp01(evaluation.score) }\n for (const [key, value] of Object.entries(evaluation.dimensions ?? {})) {\n if (Number.isFinite(value)) dimensions[key] = value\n }\n dimensions.passed = (evaluation.passed ?? evaluation.score > 0) ? 1 : 0\n return dimensions\n}\n\nfunction summarizeDimensions(\n rows: Array<Record<string, number>>,\n): Record<string, BenchmarkDistribution> {\n const values = new Map<string, number[]>()\n for (const row of rows) {\n for (const [key, value] of Object.entries(row)) {\n if (!Number.isFinite(value)) continue\n const list = values.get(key) ?? []\n list.push(value)\n values.set(key, list)\n }\n }\n return Object.fromEntries([...values.entries()].map(([key, vals]) => [key, distribution(vals)]))\n}\n\nfunction summarizeSlices<T>(\n rows: T[],\n keyOf: (row: T) => string | string[],\n knownKeys: readonly string[] = [],\n): Record<string, BenchmarkSliceSummary> {\n const grouped = new Map<string, T[]>()\n for (const key of knownKeys) grouped.set(key, [])\n for (const row of rows) {\n const keys = keyOf(row)\n for (const key of Array.isArray(keys) ? keys : [keys]) {\n const list = grouped.get(key) ?? []\n list.push(row)\n grouped.set(key, list)\n }\n }\n const out: Record<string, BenchmarkSliceSummary> = {}\n for (const [key, list] of grouped) {\n const withShape = list as Array<{\n score: number\n passed: boolean\n cell: { costUsd: number; durationMs: number }\n }>\n out[key] = {\n n: list.length,\n meanScore: mean(withShape.map((row) => row.score)),\n passRate: mean(withShape.map((row) => (row.passed ? 1 : 0))),\n score: distribution(withShape.map((row) => row.score)),\n costUsd: distribution(withShape.map((row) => row.cell.costUsd)),\n latencyMs: distribution(withShape.map((row) => row.cell.durationMs)),\n }\n }\n return out\n}\n\nfunction firstJudgeScore(\n judgeScores: CampaignResult<unknown>['cells'][number]['judgeScores'],\n): JudgeScore | undefined {\n return Object.values(judgeScores)[0]\n}\n\nfunction distribution(values: readonly number[]): BenchmarkDistribution {\n const finite = [...values].filter(Number.isFinite).sort((a, b) => a - b)\n if (finite.length === 0) return { n: 0, min: 0, mean: 0, median: 0, p90: 0, max: 0 }\n return {\n n: finite.length,\n min: finite[0]!,\n mean: mean(finite),\n median: percentile(finite, 0.5),\n p90: percentile(finite, 0.9),\n max: finite[finite.length - 1]!,\n }\n}\n\nfunction percentile(sortedValues: readonly number[], p: number): number {\n if (sortedValues.length === 0) return 0\n const index = Math.min(\n sortedValues.length - 1,\n Math.max(0, Math.ceil(p * sortedValues.length) - 1),\n )\n return sortedValues[index]!\n}\n\nfunction mean(values: readonly number[]): number {\n const finite = values.filter(Number.isFinite)\n if (finite.length === 0) return 0\n return finite.reduce((sum, value) => sum + value, 0) / finite.length\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\nfunction fmt(value: number): string {\n if (!Number.isFinite(value)) return '0'\n return value.toFixed(value === 0 || Math.abs(value) >= 10 ? 0 : 3)\n}\n","import type { RunSplitTag } from '../run-record'\nimport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkFamily,\n BenchmarkSource,\n BenchmarkTaskKind,\n} from './types'\nimport { deterministicSplit } from './types'\n\nexport interface StandardRetrievalDocument {\n id: string\n title?: string\n text: string\n metadata?: Record<string, unknown>\n}\n\nexport interface StandardRetrievalQuery {\n id: string\n text: string\n metadata?: Record<string, unknown>\n}\n\nexport interface StandardRetrievalQrel {\n queryId: string\n documentId: string\n score: number\n}\n\nexport interface StandardRetrievalPayload {\n queryId: string\n query: string\n expectedDocumentIds: string[]\n expectedScores: Record<string, number>\n corpus?: Record<string, StandardRetrievalDocument>\n metadata?: Record<string, unknown>\n}\n\nexport interface BuildStandardRetrievalItemsOptions {\n benchmarkId: string\n family: BenchmarkFamily | string\n queries: readonly StandardRetrievalQuery[]\n qrels: readonly StandardRetrievalQrel[]\n corpus?: readonly StandardRetrievalDocument[]\n includeCorpusInPayload?: boolean\n source?: BenchmarkSource\n tags?: readonly string[]\n splitOf?: (queryId: string) => RunSplitTag\n}\n\nexport interface RetrievalIdAdapterOptions extends BuildStandardRetrievalItemsOptions {\n responseIdPattern?: RegExp\n cutoffs?: readonly number[]\n primaryMetric?: string\n passMetric?: string\n passThreshold?: number\n}\n\nexport interface StandardRetrievalResult {\n id?: string\n documentId?: string\n docId?: string\n score?: number\n}\n\nexport type StandardRetrievalArtifact =\n | string\n | readonly string[]\n | readonly StandardRetrievalResult[]\n | {\n ids?: readonly string[]\n documentIds?: readonly string[]\n results?: readonly StandardRetrievalResult[]\n }\n\nexport interface StandardRetrievalEvaluationOptions {\n responseIdPattern?: RegExp\n cutoffs?: readonly number[]\n primaryMetric?: string\n passMetric?: string\n passThreshold?: number\n}\n\nexport function parseJsonlRows<T = unknown>(text: string): T[] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n return JSON.parse(line) as T\n } catch (error) {\n throw new Error(`invalid JSONL row ${index + 1}: ${(error as Error).message}`)\n }\n })\n}\n\nexport function parseTsvRows(text: string): string[][] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((line) => !line.startsWith('#'))\n .map((line) => line.split(/\\t|\\s+/))\n}\n\nexport function parseQrels(text: string): StandardRetrievalQrel[] {\n return parseTsvRows(text).flatMap((parts, index) => {\n if (parts.length < 3) return []\n const [queryId, maybeZeroOrDocId, maybeDocIdOrScore, maybeScore] = parts\n if (!queryId || !maybeZeroOrDocId || !maybeDocIdOrScore) return []\n if (queryId.toLowerCase() === 'query-id' || queryId.toLowerCase() === 'qid') return []\n const documentId = maybeScore === undefined ? maybeZeroOrDocId : maybeDocIdOrScore\n const scoreText = maybeScore === undefined ? maybeDocIdOrScore : maybeScore\n const score = Number(scoreText)\n if (!documentId || !Number.isFinite(score)) {\n throw new Error(`invalid qrels row ${index + 1}: expected query id, doc id, score`)\n }\n return [{ queryId, documentId, score }]\n })\n}\n\nexport function parseBeirCorpusJsonl(text: string): StandardRetrievalDocument[] {\n return parseJsonlRows<Record<string, unknown>>(text).map((row, index) => {\n const id = stringField(row, '_id') ?? stringField(row, 'id')\n const body = stringField(row, 'text') ?? stringField(row, 'contents')\n if (!id || body === undefined) {\n throw new Error(`invalid BEIR corpus row ${index + 1}: expected _id/id and text/contents`)\n }\n return {\n id,\n title: stringField(row, 'title'),\n text: body,\n metadata: stripKnown(row, ['_id', 'id', 'title', 'text', 'contents']),\n }\n })\n}\n\nexport function parseBeirQueriesJsonl(text: string): StandardRetrievalQuery[] {\n return parseJsonlRows<Record<string, unknown>>(text).map((row, index) => {\n const id = stringField(row, '_id') ?? stringField(row, 'id') ?? stringField(row, 'query_id')\n const query = stringField(row, 'text') ?? stringField(row, 'query')\n if (!id || !query) {\n throw new Error(`invalid BEIR query row ${index + 1}: expected _id/id and text/query`)\n }\n return {\n id,\n text: query,\n metadata: stripKnown(row, ['_id', 'id', 'query_id', 'text', 'query']),\n }\n })\n}\n\nexport function buildStandardRetrievalItems(\n options: BuildStandardRetrievalItemsOptions,\n): Array<BenchmarkDatasetItem<StandardRetrievalPayload>> {\n const qrelsByQuery = new Map<string, StandardRetrievalQrel[]>()\n for (const qrel of options.qrels) {\n if (qrel.score <= 0) continue\n const list = qrelsByQuery.get(qrel.queryId) ?? []\n list.push(qrel)\n qrelsByQuery.set(qrel.queryId, list)\n }\n const corpus =\n options.includeCorpusInPayload && options.corpus\n ? Object.fromEntries(options.corpus.map((document) => [document.id, document]))\n : undefined\n return options.queries.flatMap((query) => {\n const qrels = qrelsByQuery.get(query.id) ?? []\n if (qrels.length === 0) return []\n const split =\n options.splitOf?.(query.id) ?? deterministicSplit(`${options.benchmarkId}:${query.id}`)\n return [\n {\n id: query.id,\n split,\n family: options.family,\n taskKind: 'retrieval',\n tags: [...new Set([...(options.tags ?? []), split])],\n ...(options.source ? { source: options.source } : {}),\n ...(query.metadata ? { metadata: query.metadata } : {}),\n payload: {\n queryId: query.id,\n query: query.text,\n expectedDocumentIds: qrels.map((qrel) => qrel.documentId),\n expectedScores: Object.fromEntries(qrels.map((qrel) => [qrel.documentId, qrel.score])),\n ...(corpus ? { corpus } : {}),\n ...(query.metadata ? { metadata: query.metadata } : {}),\n },\n },\n ]\n })\n}\n\nexport function createRetrievalIdBenchmarkAdapter(\n options: RetrievalIdAdapterOptions,\n): BenchmarkAdapter<\n BenchmarkDatasetItem<StandardRetrievalPayload>,\n StandardRetrievalPayload,\n StandardRetrievalArtifact\n> {\n const items = buildStandardRetrievalItems(options)\n return {\n id: options.benchmarkId,\n family: options.family,\n taskKind: 'retrieval' satisfies BenchmarkTaskKind,\n source: options.source,\n defaultMetric: options.primaryMetric ?? 'ndcg@10',\n async loadDataset(split) {\n return items.filter((item) => item.split === split)\n },\n async evaluate(item, artifact) {\n return evaluateStandardRetrieval(item.payload, artifact, options)\n },\n assignSplit(itemId) {\n return options.splitOf?.(itemId) ?? deterministicSplit(`${options.benchmarkId}:${itemId}`)\n },\n }\n}\n\nexport function evaluateStandardRetrieval(\n payload: StandardRetrievalPayload,\n artifact: StandardRetrievalArtifact,\n options: StandardRetrievalEvaluationOptions = {},\n) {\n const rankedDocumentIds = normalizeRetrievedDocumentIds(\n artifact,\n options.responseIdPattern ?? /[A-Za-z0-9_.:/-]+/g,\n )\n const cutoffs = normalizeCutoffs(options.cutoffs ?? [1, 3, 5, 10])\n const dimensions: Record<string, number> = {\n expected_count: payload.expectedDocumentIds.length,\n returned_count: rankedDocumentIds.length,\n }\n for (const cutoff of cutoffs) {\n Object.assign(\n dimensions,\n retrievalMetricsAtCutoff({\n rankedDocumentIds,\n expectedScores: payload.expectedScores,\n cutoff,\n }),\n )\n }\n const primaryMetric = options.primaryMetric ?? 'ndcg@10'\n const passMetric = options.passMetric ?? 'hit@10'\n const score = dimensions[primaryMetric] ?? dimensions[`ndcg@${cutoffs[cutoffs.length - 1]}`] ?? 0\n const passScore =\n dimensions[passMetric] ?? dimensions[`hit@${cutoffs[cutoffs.length - 1]}`] ?? score\n return {\n score,\n passed: passScore >= (options.passThreshold ?? 1),\n dimensions,\n raw: {\n rankedDocumentIds,\n expectedDocumentIds: payload.expectedDocumentIds,\n expectedScores: payload.expectedScores,\n },\n }\n}\n\nexport function normalizeRetrievedDocumentIds(\n artifact: StandardRetrievalArtifact,\n responseIdPattern: RegExp = /[A-Za-z0-9_.:/-]+/g,\n): string[] {\n if (typeof artifact === 'string') {\n return uniqueOrdered((artifact.match(responseIdPattern) ?? []).map((value) => value.trim()))\n }\n if (Array.isArray(artifact)) {\n const entries = artifact as readonly (string | StandardRetrievalResult)[]\n return uniqueOrdered(\n entries.flatMap((entry) => {\n if (typeof entry === 'string') return [entry]\n return [entry.documentId ?? entry.docId ?? entry.id ?? '']\n }),\n )\n }\n const objectArtifact = artifact as Exclude<StandardRetrievalArtifact, string | readonly unknown[]>\n return uniqueOrdered(\n [\n ...(objectArtifact.documentIds ?? []),\n ...(objectArtifact.ids ?? []),\n ...(objectArtifact.results ?? []).map(\n (entry) => entry.documentId ?? entry.docId ?? entry.id ?? '',\n ),\n ].map((value) => value.trim()),\n )\n}\n\nexport function retrievalMetricsAtCutoff(input: {\n rankedDocumentIds: readonly string[]\n expectedScores: Record<string, number>\n cutoff: number\n}): Record<string, number> {\n const top = input.rankedDocumentIds.slice(0, input.cutoff)\n const relevantIds = Object.keys(input.expectedScores).filter(\n (id) => input.expectedScores[id]! > 0,\n )\n const relevant = new Set(relevantIds)\n const hits = top.filter((id) => relevant.has(id)).length\n const firstRelevantRank = top.findIndex((id) => relevant.has(id))\n const prefix = `@${input.cutoff}`\n return {\n [`hit${prefix}`]: hits > 0 ? 1 : 0,\n [`recall${prefix}`]: relevant.size === 0 ? 1 : hits / relevant.size,\n [`precision${prefix}`]: hits / input.cutoff,\n [`mrr${prefix}`]: firstRelevantRank === -1 ? 0 : 1 / (firstRelevantRank + 1),\n [`ndcg${prefix}`]: ndcgAt(input.rankedDocumentIds, input.expectedScores, input.cutoff),\n }\n}\n\nfunction stringField(row: Record<string, unknown>, key: string): string | undefined {\n const value = row[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction stripKnown(\n row: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const known = new Set(keys)\n return Object.fromEntries(Object.entries(row).filter(([key]) => !known.has(key)))\n}\n\nfunction normalizeCutoffs(cutoffs: readonly number[]): number[] {\n return [\n ...new Set(cutoffs.map((cutoff) => Math.trunc(cutoff)).filter((cutoff) => cutoff > 0)),\n ].sort((a, b) => a - b)\n}\n\nfunction uniqueOrdered(values: readonly string[]): string[] {\n const seen = new Set<string>()\n const out: string[] = []\n for (const value of values) {\n const trimmed = value.trim()\n if (!trimmed || seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out\n}\n\nfunction ndcgAt(\n rankedDocumentIds: readonly string[],\n expectedScores: Record<string, number>,\n cutoff: number,\n): number {\n const dcg = rankedDocumentIds\n .slice(0, cutoff)\n .reduce(\n (sum, documentId, index) => sum + discountedGain(expectedScores[documentId] ?? 0, index),\n 0,\n )\n const ideal = Object.values(expectedScores)\n .filter((score) => score > 0)\n .sort((a, b) => b - a)\n .slice(0, cutoff)\n .reduce((sum, score, index) => sum + discountedGain(score, index), 0)\n return ideal === 0 ? 1 : dcg / ideal\n}\n\nfunction discountedGain(relevance: number, zeroBasedRank: number): number {\n if (relevance <= 0) return 0\n return (2 ** relevance - 1) / Math.log2(zeroBasedRank + 2)\n}\n","/**\n * Reference benchmark wrappers — entry point.\n *\n * Core surface (exported here):\n * - The `BenchmarkAdapter` contract.\n * - `runBenchmarkAdapter` for campaign-backed benchmark execution.\n * - `calibrateBenchmarkMetric` for weak/strong metric checks.\n * - Standard retrieval parsers for BEIR/MTEB/MS MARCO/TREC/MIRACL-style files.\n * - `deterministicSplit` + `BENCHMARK_SPLIT_SEED` for split assignment.\n * - `routing` — synthetic 16-task router benchmark. The only novel\n * benchmark we built; ships in the package.\n *\n * Example wrappers (under `examples/benchmarks/`, NOT in the bundle):\n * - `gsm8k` — exact-match math reasoning (HF mirror, dataset\n * not bundled).\n * - `swebench-lite` — 30-instance SWE-Bench subset via an external\n * grader command.\n *\n * The example wrappers are reference implementations of `BenchmarkAdapter`.\n * Read them, copy them, adapt them. They're intentionally not in the main\n * entry — every team will configure them differently.\n */\n\nexport {\n type BenchmarkMetricCalibrationOptions,\n type BenchmarkMetricCalibrationResult,\n calibrateBenchmarkMetric,\n} from './calibration'\nexport * as routing from './routing/index'\nexport {\n type BenchmarkDistribution,\n type BenchmarkReport,\n type BenchmarkRunOptions,\n type BenchmarkRunResult,\n type BenchmarkSliceSummary,\n renderBenchmarkReportMarkdown,\n runBenchmarkAdapter,\n summarizeBenchmarkCampaign,\n} from './runner'\nexport {\n type BuildStandardRetrievalItemsOptions,\n buildStandardRetrievalItems,\n createRetrievalIdBenchmarkAdapter,\n evaluateStandardRetrieval,\n normalizeRetrievedDocumentIds,\n parseBeirCorpusJsonl,\n parseBeirQueriesJsonl,\n parseJsonlRows,\n parseQrels,\n parseTsvRows,\n type RetrievalIdAdapterOptions,\n retrievalMetricsAtCutoff,\n type StandardRetrievalArtifact,\n type StandardRetrievalDocument,\n type StandardRetrievalEvaluationOptions,\n type StandardRetrievalPayload,\n type StandardRetrievalQrel,\n type StandardRetrievalQuery,\n type StandardRetrievalResult,\n} from './standard-formats'\nexport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkEvaluation,\n BenchmarkFamily,\n BenchmarkResponder,\n BenchmarkScenario,\n BenchmarkSource,\n BenchmarkTaskKind,\n} from './types'\nexport { BENCHMARK_SPLIT_SEED, deterministicSplit } from './types'\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import { l as makeProposalFinding } from "../proposal-findings-DCawte-y.js";
2
2
  import { A as acquireSingleRunLock, B as surfaceContentHash, C as detectScale, Ct as llmJudge, E as pairHoldout, F as assertCodeSurfaceIdentity, H as campaignBreakdown, I as assertComponentSurface, J as planCampaignRun, L as codeSurfaceIdentityMaterial, M as compareOptimizationMethods, N as costFromLedgerSummary, O as composeGate, P as optimizationTokenUsageFromSummary, Q as inMemoryCampaignStorage, R as componentSurfaceIdentityMaterial, S as defaultProductionGate, T as heldoutSignificance, U as campaignMeanComposite, V as surfaceHash, W as compareRankKeys, X as createRunCostLedger, Y as runCampaign, Z as fsCampaignStorage, _ as buildEvidenceVector, a as emitLoopProvenance, at as assertCampaignDesign, b as powerPreflight, c as provenanceRecordPath, ct as campaignSplitDigest, d as runImprovementLoop, et as SearchLedgerConflictError, f as runOptimization, g as gepaOptimizationMethod, h as labelTrustRank, i as canonicalDigest, it as tangleTracesRoot, k as externalTextOptimizationMethod, l as provenanceSpansPath, lt as campaignSplitDigestFromIdentities, m as isProposedCandidate, n as buildLoopProvenanceRecord, nt as SearchLedgerIntegrityError, o as loopProvenanceArgsFromResult, ot as assertCampaignSplitIdentity, p as runEval, pt as createReferenceEquivalenceJudge, r as campaignMeasurementDigest, rt as resolveRunDir, s as loopProvenanceSpans, st as campaignScenarioIdentity, t as skillOptOptimizationMethod, tt as SearchLedgerError, u as verifyLoopProvenanceRecord, ut as openAutoPr, v as paretoPolicy, w as dimensionRegressions, x as heldOutGate, y as paretoSignificanceGate, z as renderSurfaceDiff } from "../skillopt-optimization-method-0UmPD6aP.js";
3
- import { A as planEvalFixtureRun, C as rolloutArgumentDiff, D as discoverEvalFixtures, E as neutralizationGate, M as buildAnalystSurfaceDispatch, N as failureModeRecallJudge, O as loadEvalFixture, S as classifyUngroundedLiterals, T as sequentialPairedGate, _ as scoreboardSummary, a as isTransientTransportFailure, b as FsLabeledScenarioStore, c as openSearchLedger, d as selectDiscriminative, f as ProfileMatrixError, g as scoreUserStory, h as renderScoreboardMarkdown, i as verifyCodeSurface, j as analyzeCrossSurfaceInteractions, k as loadEvalFixtureScenarios, l as validateSearchLedgerEvent, m as makePlaybackDispatch, n as gitWorktreeAdapter, o as FileSearchLedger, p as runProfileMatrix, r as resolveWorktreePath, s as SEARCH_LEDGER_SCHEMA, t as WorktreeAdapterError, u as scoreDiscrimination, v as userStoryScoreboard, w as sequentialDecide, x as LabeledScenarioStoreError, y as neutralizeText } from "../campaign-RVIqtJh0.js";
3
+ import { A as planEvalFixtureRun, C as rolloutArgumentDiff, D as discoverEvalFixtures, E as neutralizationGate, M as buildAnalystSurfaceDispatch, N as failureModeRecallJudge, O as loadEvalFixture, S as classifyUngroundedLiterals, T as sequentialPairedGate, _ as scoreboardSummary, a as isTransientTransportFailure, b as FsLabeledScenarioStore, c as openSearchLedger, d as selectDiscriminative, f as ProfileMatrixError, g as scoreUserStory, h as renderScoreboardMarkdown, i as verifyCodeSurface, j as analyzeCrossSurfaceInteractions, k as loadEvalFixtureScenarios, l as validateSearchLedgerEvent, m as makePlaybackDispatch, n as gitWorktreeAdapter, o as FileSearchLedger, p as runProfileMatrix, r as resolveWorktreePath, s as SEARCH_LEDGER_SCHEMA, t as WorktreeAdapterError, u as scoreDiscrimination, v as userStoryScoreboard, w as sequentialDecide, x as LabeledScenarioStoreError, y as neutralizeText } from "../campaign-Dz8uQnhC.js";
4
4
  export { FileSearchLedger, FsLabeledScenarioStore, LabeledScenarioStoreError, ProfileMatrixError, SEARCH_LEDGER_SCHEMA, SearchLedgerConflictError, SearchLedgerError, SearchLedgerIntegrityError, WorktreeAdapterError, acquireSingleRunLock, analyzeCrossSurfaceInteractions, assertCampaignDesign, assertCampaignSplitIdentity, assertCodeSurfaceIdentity, assertComponentSurface, buildAnalystSurfaceDispatch, buildEvidenceVector, buildLoopProvenanceRecord, campaignBreakdown, campaignMeanComposite, campaignMeasurementDigest, campaignScenarioIdentity, campaignSplitDigest, campaignSplitDigestFromIdentities, canonicalDigest, classifyUngroundedLiterals, codeSurfaceIdentityMaterial, compareOptimizationMethods, compareRankKeys, componentSurfaceIdentityMaterial, composeGate, costFromLedgerSummary, createReferenceEquivalenceJudge, createRunCostLedger, defaultProductionGate, detectScale, dimensionRegressions, discoverEvalFixtures, emitLoopProvenance, externalTextOptimizationMethod, failureModeRecallJudge, fsCampaignStorage, gepaOptimizationMethod, gitWorktreeAdapter, heldOutGate, heldoutSignificance, inMemoryCampaignStorage, isProposedCandidate, isTransientTransportFailure, labelTrustRank, llmJudge, loadEvalFixture, loadEvalFixtureScenarios, loopProvenanceArgsFromResult, loopProvenanceSpans, makePlaybackDispatch, makeProposalFinding, neutralizationGate, neutralizeText, openAutoPr, openSearchLedger, optimizationTokenUsageFromSummary, pairHoldout, paretoPolicy, paretoSignificanceGate, planCampaignRun, planEvalFixtureRun, powerPreflight, provenanceRecordPath, provenanceSpansPath, renderScoreboardMarkdown, renderSurfaceDiff, resolveRunDir, resolveWorktreePath, rolloutArgumentDiff, runCampaign, runEval, runImprovementLoop, runOptimization, runProfileMatrix, scoreDiscrimination, scoreUserStory, scoreboardSummary, selectDiscriminative, sequentialDecide, sequentialPairedGate, skillOptOptimizationMethod, surfaceContentHash, surfaceHash, tangleTracesRoot, userStoryScoreboard, validateSearchLedgerEvent, verifyCodeSurface, verifyLoopProvenanceRecord };
@@ -6,7 +6,7 @@ import { $ as SEARCH_LEDGER_FILE_CONTEXT, B as surfaceContentHash, E as pairHold
6
6
  import { C as mulberry32, E as pairedBootstrap, m as eProcess } from "./statistics-CnGCLLqc.js";
7
7
  import { t as comparePairedArms } from "./paired-arms-BbFKrAU-.js";
8
8
  import { o as runTaskScore, r as modelHasSnapshot, s as validateRunRecord } from "./run-record-BIwU2wdV.js";
9
- import { t as analyzeTraces } from "./analyst-LsnNpSkm.js";
9
+ import { t as analyzeTraces } from "./analyst-j5je5J7c.js";
10
10
  import { c as campaignCellToRunRecord } from "./reward-hacking-a-kYs0-i.js";
11
11
  import { d as canonicalString, t as FileLedgerJournal } from "./ledger-core-DAKFKRzi.js";
12
12
  import { z } from "zod";
@@ -3896,4 +3896,4 @@ function resolveWorktreePath(surface, worktreeDir) {
3896
3896
  //#endregion
3897
3897
  export { planEvalFixtureRun as A, harnessAxisOf as B, rolloutArgumentDiff as C, discoverEvalFixtures as D, neutralizationGate as E, HARNESS_NATIVE_MODEL as F, parseCorrectnessResponse as G, completionVerdict as H, agentProfileHash as I, verifyCompletion as K, agentProfileId as L, buildAnalystSurfaceDispatch as M, failureModeRecallJudge as N, loadEvalFixture as O, CODING_HARNESSES as P, agentProfileModelId as R, classifyUngroundedLiterals as S, sequentialPairedGate as T, createLlmCorrectnessChecker as U, extractProducedState as V, createTokenRecallChecker as W, scoreboardSummary as _, isTransientTransportFailure as a, FsLabeledScenarioStore as b, openSearchLedger as c, selectDiscriminative as d, ProfileMatrixError as f, scoreUserStory as g, renderScoreboardMarkdown as h, verifyCodeSurface as i, analyzeCrossSurfaceInteractions as j, loadEvalFixtureScenarios as k, validateSearchLedgerEvent as l, makePlaybackDispatch as m, gitWorktreeAdapter as n, FileSearchLedger as o, runProfileMatrix as p, resolveWorktreePath as r, SEARCH_LEDGER_SCHEMA as s, WorktreeAdapterError as t, scoreDiscrimination as u, userStoryScoreboard as v, sequentialDecide as w, LabeledScenarioStoreError as x, neutralizeText as y, expandProfileAxes as z };
3898
3898
 
3899
- //# sourceMappingURL=campaign-RVIqtJh0.js.map
3899
+ //# sourceMappingURL=campaign-Dz8uQnhC.js.map