@tangle-network/agent-eval 0.71.0 → 0.72.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.
- package/CHANGELOG.md +63 -0
- package/dist/adapters/http.d.ts +1 -1
- package/dist/adapters/langchain.d.ts +1 -1
- package/dist/adapters/otel.d.ts +3 -2
- package/dist/agent-profile-DYRboYWu.d.ts +364 -0
- package/dist/analyst/index.d.ts +221 -0
- package/dist/analyst/index.js +371 -0
- package/dist/analyst/index.js.map +1 -0
- package/dist/analyst-t7zZS3TV.d.ts +88 -0
- package/dist/campaign/index.d.ts +485 -9
- package/dist/campaign/index.js +618 -30
- package/dist/campaign/index.js.map +1 -1
- package/dist/chunk-7W4SM7FD.js +1075 -0
- package/dist/chunk-7W4SM7FD.js.map +1 -0
- package/dist/{chunk-AIWHLG7J.js → chunk-GJJNJVIR.js} +11 -11
- package/dist/chunk-JHA3ZGSO.js +1496 -0
- package/dist/chunk-JHA3ZGSO.js.map +1 -0
- package/dist/{chunk-VMAYE3LM.js → chunk-JYE3WOTE.js} +57 -9
- package/dist/{chunk-VMAYE3LM.js.map → chunk-JYE3WOTE.js.map} +1 -1
- package/dist/chunk-LB2UOI5F.js +412 -0
- package/dist/chunk-LB2UOI5F.js.map +1 -0
- package/dist/{chunk-ODGETRTM.js → chunk-VUINJM5M.js} +234 -1415
- package/dist/chunk-VUINJM5M.js.map +1 -0
- package/dist/chunk-WYIHD6EB.js +1044 -0
- package/dist/chunk-WYIHD6EB.js.map +1 -0
- package/dist/{chunk-6QZUCFKM.js → chunk-XPILG2CA.js} +120 -3
- package/dist/chunk-XPILG2CA.js.map +1 -0
- package/dist/{chunk-6XQIEUQ2.js → chunk-ZPSKPT3V.js} +5 -3
- package/dist/{chunk-6XQIEUQ2.js.map → chunk-ZPSKPT3V.js.map} +1 -1
- package/dist/contract/index.d.ts +17 -13
- package/dist/contract/index.js +14 -8
- package/dist/contract/index.js.map +1 -1
- package/dist/{control-DxvZeV5X.d.ts → control-BgA6BYTm.d.ts} +1 -1
- package/dist/control.d.ts +2 -2
- package/dist/{feedback-trajectory-8hKC5EOb.d.ts → feedback-trajectory-B3rErRsh.d.ts} +1 -1
- package/dist/harness-optimizer-EnEnQPsr.d.ts +106 -0
- package/dist/hosted/index.d.ts +223 -2
- package/dist/index.d.ts +49 -1323
- package/dist/index.js +339 -2627
- package/dist/index.js.map +1 -1
- package/dist/{index-BGBrVS24.d.ts → insight-report-Df3lxYXM.d.ts} +1 -221
- package/dist/kind-factory-DW9XWPvM.d.ts +172 -0
- package/dist/multi-layer-verifier-DlWCXuxL.d.ts +141 -0
- package/dist/openapi.json +1 -1
- package/dist/pareto-E-pembql.d.ts +81 -0
- package/dist/{provenance-C69gLUXH.d.ts → provenance-B-TFszPW.d.ts} +131 -4
- package/dist/redact-B40YG2M_.d.ts +45 -0
- package/dist/registry-DuVYiTvw.d.ts +128 -0
- package/dist/{researcher-WJvIpX3L.d.ts → researcher-C_KJyIGg.d.ts} +1 -141
- package/dist/rl.d.ts +4 -3
- package/dist/rl.js +4 -4
- package/dist/{run-campaign-BVY3RGAZ.js → run-campaign-OVEZF24D.js} +2 -2
- package/dist/run-critic-BAIjX99r.d.ts +56 -0
- package/dist/{run-improvement-loop-Bzamo6GB.d.ts → run-improvement-loop-BqYH2vCR.d.ts} +25 -1
- package/dist/semantic-concept-judge-CV9Wlx4t.d.ts +650 -0
- package/dist/{store-jzKpMl16.d.ts → store-GmBE2pZZ.d.ts} +1 -1
- package/dist/traces.d.ts +371 -308
- package/dist/traces.js +43 -18
- package/dist/{types-CnmZ2bkP.d.ts → types-Bba0vl1V.d.ts} +1 -1
- package/dist/{registry-BGKyX6bw.d.ts → types-CRD68aH7.d.ts} +3 -128
- package/dist/wire/index.d.ts +1 -1
- package/dist/workflow/index.d.ts +494 -0
- package/dist/workflow/index.js +2177 -0
- package/dist/workflow/index.js.map +1 -0
- package/docs/design/self-improvement-roadmap.md +106 -0
- package/package.json +36 -12
- package/dist/agent-profile-DzcPHR1Z.d.ts +0 -114
- package/dist/chunk-6QZUCFKM.js.map +0 -1
- package/dist/chunk-ODGETRTM.js.map +0 -1
- package/dist/chunk-PQV2TKC3.js +0 -27
- package/dist/chunk-PQV2TKC3.js.map +0 -1
- /package/dist/{chunk-AIWHLG7J.js.map → chunk-GJJNJVIR.js.map} +0 -0
- /package/dist/{run-campaign-BVY3RGAZ.js.map → run-campaign-OVEZF24D.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/workflow/event-schema.ts","../../src/workflow/schema.ts","../../src/workflow/feedback-pack.ts","../../src/workflow/sanitize.ts","../../src/workflow/trace-event-fields.ts","../../src/workflow/phase-graph.ts","../../src/workflow/summary.ts","../../src/workflow/intelligence-export.ts","../../src/workflow/run-record.ts","../../src/workflow/trajectory.ts","../../src/workflow/partner-report.ts","../../src/workflow/promotion-gate.ts","../../src/workflow/runtime-adapter.ts"],"sourcesContent":["import { ValidationError } from '../errors'\nimport type { WorkflowTraceEventKind } from './types'\n\nconst WORKFLOW_EVENT_KINDS = [\n 'workflow.started',\n 'workflow.phase',\n 'workflow.log',\n 'workflow.parallel.started',\n 'workflow.parallel.ended',\n 'workflow.pipeline.started',\n 'workflow.pipeline.ended',\n 'workflow.branch.started',\n 'workflow.branch.ended',\n 'workflow.branch.failed',\n 'workflow.agent.started',\n 'workflow.agent.ended',\n 'workflow.agent.failed',\n 'workflow.loop.started',\n 'workflow.loop.ended',\n 'workflow.loop.failed',\n 'workflow.verifier.started',\n 'workflow.verifier.ended',\n 'workflow.verifier.failed',\n 'workflow.analyst.started',\n 'workflow.analyst.ended',\n 'workflow.analyst.failed',\n 'workflow.reviewer.started',\n 'workflow.reviewer.ended',\n 'workflow.reviewer.failed',\n 'workflow.failed',\n 'workflow.ended',\n] as const satisfies readonly WorkflowTraceEventKind[]\n\nexport const WORKFLOW_TRACE_EVENT_KINDS: readonly WorkflowTraceEventKind[] = WORKFLOW_EVENT_KINDS\n\nconst WORKFLOW_EVENT_KIND_SET = new Set<string>(WORKFLOW_EVENT_KINDS)\nconst BRANCH_OPERATIONS = new Set(['parallel', 'pipeline'])\n\nexport function validateWorkflowTraceEventKind(kind: string): WorkflowTraceEventKind {\n if (!WORKFLOW_EVENT_KIND_SET.has(kind)) {\n throw new ValidationError(`unknown workflow trace event kind: ${kind}`)\n }\n return kind as WorkflowTraceEventKind\n}\n\nexport function validateWorkflowTraceEventPayload(\n kind: WorkflowTraceEventKind,\n payload: Record<string, unknown>,\n): Record<string, unknown> {\n switch (kind) {\n case 'workflow.started':\n requireRecord(payload.meta, `${kind}.payload.meta`)\n requireInteger(payload.depth, `${kind}.payload.depth`, { min: 0 })\n requireRecord(payload.caps, `${kind}.payload.caps`)\n return payload\n case 'workflow.phase':\n requireString(payload.title, `${kind}.payload.title`)\n return payload\n case 'workflow.log':\n requireString(payload.message, `${kind}.payload.message`)\n optionalString(payload.phase, `${kind}.payload.phase`)\n return payload\n case 'workflow.parallel.started':\n requireInteger(payload.branchCount, `${kind}.payload.branchCount`, { min: 0 })\n optionalString(payload.phase, `${kind}.payload.phase`)\n return payload\n case 'workflow.parallel.ended':\n requireInteger(payload.branchCount, `${kind}.payload.branchCount`, { min: 0 })\n requireNonNegativeNumber(payload.durationMs, `${kind}.payload.durationMs`)\n optionalString(payload.phase, `${kind}.payload.phase`)\n return payload\n case 'workflow.pipeline.started':\n requireInteger(payload.itemCount, `${kind}.payload.itemCount`, { min: 0 })\n requireInteger(payload.stageCount, `${kind}.payload.stageCount`, { min: 1 })\n optionalString(payload.phase, `${kind}.payload.phase`)\n return payload\n case 'workflow.pipeline.ended':\n requireInteger(payload.itemCount, `${kind}.payload.itemCount`, { min: 0 })\n requireInteger(payload.stageCount, `${kind}.payload.stageCount`, { min: 1 })\n requireNonNegativeNumber(payload.durationMs, `${kind}.payload.durationMs`)\n optionalString(payload.phase, `${kind}.payload.phase`)\n return payload\n case 'workflow.branch.started':\n validateBranchPayload(kind, payload, { terminal: false })\n return payload\n case 'workflow.branch.ended':\n validateBranchPayload(kind, payload, { terminal: true })\n return payload\n case 'workflow.branch.failed':\n validateBranchPayload(kind, payload, { terminal: true })\n requireString(payload.message, `${kind}.payload.message`)\n optionalString(payload.code, `${kind}.payload.code`)\n if (payload.stageIndex !== undefined) {\n requireInteger(payload.stageIndex, `${kind}.payload.stageIndex`, { min: 0 })\n }\n return payload\n case 'workflow.agent.started':\n validateIndexedPayload(kind, payload)\n requireInteger(payload.promptChars, `${kind}.payload.promptChars`, { min: 0 })\n optionalRecord(payload.metadata, `${kind}.payload.metadata`)\n return payload\n case 'workflow.agent.ended':\n validateDelegateEndedPayload(kind, payload)\n return payload\n case 'workflow.agent.failed':\n validateDelegateFailedPayload(kind, payload)\n return payload\n case 'workflow.loop.started':\n case 'workflow.verifier.started':\n case 'workflow.analyst.started':\n case 'workflow.reviewer.started':\n validateIndexedPayload(kind, payload)\n optionalRecord(payload.metadata, `${kind}.payload.metadata`)\n return payload\n case 'workflow.loop.ended':\n case 'workflow.verifier.ended':\n case 'workflow.analyst.ended':\n case 'workflow.reviewer.ended':\n validateDelegateEndedPayload(kind, payload)\n return payload\n case 'workflow.loop.failed':\n case 'workflow.verifier.failed':\n case 'workflow.analyst.failed':\n case 'workflow.reviewer.failed':\n validateDelegateFailedPayload(kind, payload)\n return payload\n case 'workflow.failed':\n requireString(payload.message, `${kind}.payload.message`)\n optionalString(payload.code, `${kind}.payload.code`)\n optionalString(payload.phase, `${kind}.payload.phase`)\n return payload\n case 'workflow.ended':\n requireNonNegativeNumber(payload.durationMs, `${kind}.payload.durationMs`)\n requireNonNegativeNumber(payload.costUsd, `${kind}.payload.costUsd`)\n validateTokenUsage(payload.tokenUsage, `${kind}.payload.tokenUsage`)\n requireInteger(payload.agentCalls, `${kind}.payload.agentCalls`, { min: 0 })\n requireInteger(payload.loopCalls, `${kind}.payload.loopCalls`, { min: 0 })\n return payload\n }\n}\n\nfunction validateBranchPayload(\n kind: WorkflowTraceEventKind,\n payload: Record<string, unknown>,\n options: { terminal: boolean },\n): void {\n const operation = requireString(payload.operation, `${kind}.payload.operation`)\n if (!BRANCH_OPERATIONS.has(operation)) {\n throw new ValidationError(`${kind}.payload.operation: expected parallel or pipeline`)\n }\n requireInteger(payload.branchIndex, `${kind}.payload.branchIndex`, { min: 0 })\n optionalString(payload.phase, `${kind}.payload.phase`)\n if (payload.stageCount !== undefined) {\n requireInteger(payload.stageCount, `${kind}.payload.stageCount`, { min: 1 })\n }\n if (options.terminal) {\n requireNonNegativeNumber(payload.durationMs, `${kind}.payload.durationMs`)\n }\n}\n\nfunction validateIndexedPayload(\n kind: WorkflowTraceEventKind,\n payload: Record<string, unknown>,\n): void {\n requireInteger(payload.index, `${kind}.payload.index`, { min: 0 })\n optionalString(payload.label, `${kind}.payload.label`)\n optionalString(payload.phase, `${kind}.payload.phase`)\n}\n\nfunction validateDelegateEndedPayload(\n kind: WorkflowTraceEventKind,\n payload: Record<string, unknown>,\n): void {\n validateIndexedPayload(kind, payload)\n requireNonNegativeNumber(payload.durationMs, `${kind}.payload.durationMs`)\n requireNonNegativeNumber(payload.costUsd, `${kind}.payload.costUsd`)\n validateTokenUsage(payload.tokenUsage, `${kind}.payload.tokenUsage`)\n}\n\nfunction validateDelegateFailedPayload(\n kind: WorkflowTraceEventKind,\n payload: Record<string, unknown>,\n): void {\n validateIndexedPayload(kind, payload)\n requireNonNegativeNumber(payload.durationMs, `${kind}.payload.durationMs`)\n requireString(payload.message, `${kind}.payload.message`)\n optionalString(payload.code, `${kind}.payload.code`)\n}\n\nfunction validateTokenUsage(value: unknown, path: string): void {\n const tokenUsage = requireRecord(value, path)\n requireNonNegativeNumber(tokenUsage.input, `${path}.input`)\n requireNonNegativeNumber(tokenUsage.output, `${path}.output`)\n if (tokenUsage.cached !== undefined) {\n requireNonNegativeNumber(tokenUsage.cached, `${path}.cached`)\n }\n}\n\nfunction requireRecord(value: unknown, path: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError(`${path}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction optionalRecord(value: unknown, path: string): void {\n if (value !== undefined) requireRecord(value, path)\n}\n\nfunction requireString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`${path}: expected non-empty string`)\n }\n return value\n}\n\nfunction optionalString(value: unknown, path: string): void {\n if (value !== undefined) requireString(value, path)\n}\n\nfunction requireNonNegativeNumber(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new ValidationError(`${path}: expected finite non-negative number`)\n }\n return value\n}\n\nfunction requireInteger(value: unknown, path: string, options: { min?: number } = {}): number {\n if (typeof value !== 'number' || !Number.isInteger(value)) {\n throw new ValidationError(`${path}: expected integer`)\n }\n if (options.min !== undefined && value < options.min) {\n throw new ValidationError(`${path}: expected integer >= ${options.min}`)\n }\n return value\n}\n","import { ValidationError } from '../errors'\nimport { validateWorkflowTraceEventKind, validateWorkflowTraceEventPayload } from './event-schema'\nimport type {\n WorkflowTraceEnvelope,\n WorkflowTraceEvent,\n WorkflowTraceSummary,\n WorkflowTraceVersion,\n} from './types'\n\nconst TRACE_VERSION: WorkflowTraceVersion = 'workflow-trace-v1'\n\nexport function validateWorkflowTraceEvent(input: unknown): WorkflowTraceEvent {\n const obj = expectRecord(input, 'event')\n const kind = validateWorkflowTraceEventKind(expectString(obj.kind, 'event.kind'))\n const runId = expectString(obj.runId, 'event.runId')\n const timestamp = expectFinite(obj.timestamp, 'event.timestamp')\n const payload = validateWorkflowTraceEventPayload(\n kind,\n expectRecord(obj.payload, 'event.payload'),\n )\n return { kind, runId, timestamp, payload }\n}\n\nexport function validateWorkflowTraceEnvelope(input: unknown): WorkflowTraceEnvelope {\n const obj = expectRecord(input, 'workflow trace envelope')\n if (obj.traceVersion !== TRACE_VERSION) {\n throw new ValidationError(`workflow traceVersion must be ${TRACE_VERSION}`)\n }\n const runId = expectString(obj.runId, 'workflow trace runId')\n if (!Array.isArray(obj.events) || obj.events.length === 0) {\n throw new ValidationError('workflow trace envelope must include at least one event')\n }\n const events = obj.events.map(validateWorkflowTraceEvent)\n for (const event of events) {\n if (event.runId !== runId) {\n throw new ValidationError(`workflow trace event runId ${event.runId} does not match ${runId}`)\n }\n }\n validateWorkflowTraceLifecycle(events)\n return {\n traceVersion: TRACE_VERSION,\n runId,\n ...(obj.topology !== undefined ? { topology: obj.topology as never } : {}),\n events,\n ...(obj.artifacts !== undefined ? { artifacts: validateArtifacts(obj.artifacts) } : {}),\n ...(obj.metadata !== undefined ? { metadata: expectRecord(obj.metadata, 'metadata') } : {}),\n }\n}\n\nfunction validateWorkflowTraceLifecycle(events: readonly WorkflowTraceEvent[]): void {\n const first = events[0]\n if (first?.kind !== 'workflow.started') {\n throw new ValidationError('workflow trace first event must be workflow.started')\n }\n for (let index = 1; index < events.length; index += 1) {\n if (events[index]!.timestamp < events[index - 1]!.timestamp) {\n throw new ValidationError(`workflow trace timestamps must be nondecreasing at event ${index}`)\n }\n }\n const terminalEvents = events.filter(\n (event) => event.kind === 'workflow.ended' || event.kind === 'workflow.failed',\n )\n if (terminalEvents.length !== 1) {\n throw new ValidationError(\n `workflow trace must include exactly one terminal event, got ${terminalEvents.length}`,\n )\n }\n const last = events.at(-1)\n if (last?.kind !== terminalEvents[0]?.kind) {\n throw new ValidationError('workflow trace terminal event must be last')\n }\n}\n\nexport function summarizeWorkflowTrace(\n input: WorkflowTraceEnvelope | unknown,\n): WorkflowTraceSummary {\n const envelope = validateWorkflowTraceEnvelope(input)\n const started = envelope.events.find((e) => e.kind === 'workflow.started')\n const ended = envelope.events.find((e) => e.kind === 'workflow.ended')\n const failed = envelope.events.find((e) => e.kind === 'workflow.failed')\n const endedPayload = ended?.payload ?? {}\n const tokenUsage = tokenUsageOf(endedPayload.tokenUsage)\n return {\n runId: envelope.runId,\n startedAt: started?.timestamp,\n endedAt: ended?.timestamp,\n durationMs: finiteOr(endedPayload.durationMs, durationFromEvents(envelope.events)),\n costUsd: finiteOr(endedPayload.costUsd, 0),\n tokenUsage,\n phaseCount: envelope.events.filter((e) => e.kind === 'workflow.phase').length,\n branchCount: envelope.events.filter((e) => e.kind === 'workflow.branch.ended').length,\n failedBranchCount: envelope.events.filter((e) => e.kind === 'workflow.branch.failed').length,\n agentCalls: finiteOr(\n endedPayload.agentCalls,\n countEvents(envelope.events, 'workflow.agent.ended', 'workflow.agent.failed'),\n ),\n loopCalls: finiteOr(\n endedPayload.loopCalls,\n countEvents(envelope.events, 'workflow.loop.ended', 'workflow.loop.failed'),\n ),\n verifierCalls: countEvents(\n envelope.events,\n 'workflow.verifier.ended',\n 'workflow.verifier.failed',\n ),\n analystCalls: countEvents(envelope.events, 'workflow.analyst.ended', 'workflow.analyst.failed'),\n reviewerCalls: countEvents(\n envelope.events,\n 'workflow.reviewer.ended',\n 'workflow.reviewer.failed',\n ),\n agentFailures: countEvents(envelope.events, 'workflow.agent.failed'),\n loopFailures: countEvents(envelope.events, 'workflow.loop.failed'),\n verifierFailures: countEvents(envelope.events, 'workflow.verifier.failed'),\n analystFailures: countEvents(envelope.events, 'workflow.analyst.failed'),\n reviewerFailures: countEvents(envelope.events, 'workflow.reviewer.failed'),\n eventCount: envelope.events.length,\n failed: failed !== undefined,\n failureMessage:\n typeof failed?.payload.message === 'string' ? failed.payload.message : undefined,\n }\n}\n\nfunction countEvents(\n events: readonly WorkflowTraceEvent[],\n ...kinds: readonly WorkflowTraceEvent['kind'][]\n): number {\n const allowed = new Set(kinds)\n return events.filter((event) => allowed.has(event.kind)).length\n}\n\nfunction validateArtifacts(value: unknown): WorkflowTraceEnvelope['artifacts'] {\n if (!Array.isArray(value)) throw new ValidationError('workflow artifacts must be an array')\n return value.map((artifact, index) => {\n const obj = expectRecord(artifact, `artifacts[${index}]`)\n return {\n kind: expectString(obj.kind, `artifacts[${index}].kind`),\n uri: expectString(obj.uri, `artifacts[${index}].uri`),\n ...(obj.contentType !== undefined\n ? { contentType: expectString(obj.contentType, `artifacts[${index}].contentType`) }\n : {}),\n ...(obj.sha256 !== undefined\n ? { sha256: expectString(obj.sha256, `artifacts[${index}].sha256`) }\n : {}),\n ...(obj.metadata !== undefined\n ? { metadata: expectRecord(obj.metadata, `artifacts[${index}].metadata`) }\n : {}),\n }\n })\n}\n\nfunction durationFromEvents(events: readonly WorkflowTraceEvent[]): number {\n const first = events[0]?.timestamp\n const last = events.at(-1)?.timestamp\n if (!Number.isFinite(first) || !Number.isFinite(last)) return 0\n return Math.max(0, (last as number) - (first as number))\n}\n\nfunction tokenUsageOf(value: unknown): { input: number; output: number; cached?: number } {\n const obj = value && typeof value === 'object' ? (value as Record<string, unknown>) : {}\n const cached = finiteOrUndefined(obj.cached)\n return {\n input: finiteOr(obj.input, 0),\n output: finiteOr(obj.output, 0),\n ...(cached !== undefined ? { cached } : {}),\n }\n}\n\nfunction finiteOr(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback\n}\n\nfunction finiteOrUndefined(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction expectRecord(value: unknown, path: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError(`${path}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`${path}: expected non-empty string`)\n }\n return value\n}\n\nfunction expectFinite(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new ValidationError(`${path}: expected finite number`)\n }\n return value\n}\n","import type { AnalystFinding, AnalystSeverity, EvidenceRef } from '../analyst/types'\nimport type { FailureClusterInsight } from '../contract/insight-report'\nimport type { LayerResult, VerificationReport } from '../multi-layer-verifier'\nimport type { FailureClusterReport } from '../pipelines/failure-cluster'\nimport { summarizeWorkflowTrace, validateWorkflowTraceEnvelope } from './schema'\nimport type { WorkflowTraceEnvelope, WorkflowTraceSummary } from './types'\n\nexport type WorkflowFeedbackPackVersion = 'workflow-feedback-pack-v1'\n\nexport type WorkflowFeedbackSeverity = AnalystSeverity\n\nexport interface WorkflowToolUsageSummary {\n totalCalls: number\n erroredCalls: number\n byTool: Record<string, { calls: number; errors: number }>\n}\n\nexport interface WorkflowVerifierFindingSummary {\n severity: WorkflowFeedbackSeverity\n message: string\n evidence?: string\n detail?: Record<string, unknown>\n}\n\nexport interface WorkflowVerifierLayerSummary {\n layer: string\n status: LayerResult['status']\n score?: number\n durationMs: number\n reason?: string\n findings: WorkflowVerifierFindingSummary[]\n diagnostics?: Record<string, number | null>\n}\n\nexport interface WorkflowVerifierSummary {\n allPass: boolean\n blendedScore: number\n durationMs: number\n failedLayers: string[]\n layers: WorkflowVerifierLayerSummary[]\n}\n\nexport interface WorkflowFailureClusterInput {\n id: string\n name: string\n share?: number\n runCount?: number\n exemplars?: readonly string[]\n suggestedFix?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowFailureClusterSummary {\n id: string\n name: string\n share: number\n runCount?: number\n exemplars: string[]\n suggestedFix?: string\n source: 'failure-cluster-view' | 'insight-report' | 'custom'\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowAnalystFindingSummary {\n findingId: string\n analystId: string\n severity: WorkflowFeedbackSeverity\n area: string\n claim: string\n confidence: number\n subject?: string\n recommendedAction?: string\n evidenceRefs: EvidenceRef[]\n}\n\nexport interface WorkflowAnalystFeedbackPack {\n schemaVersion: WorkflowFeedbackPackVersion\n runId: string\n generatedAt: string\n summary: WorkflowTraceSummary\n verifier?: WorkflowVerifierSummary\n toolUsage: WorkflowToolUsageSummary\n failureClusters: WorkflowFailureClusterSummary[]\n findings: WorkflowAnalystFindingSummary[]\n recommendations: string[]\n driverContextLines: string[]\n}\n\nexport interface WorkflowFeedbackPackLimits {\n findings?: number\n clusters?: number\n layerFindings?: number\n recommendations?: number\n contextLines?: number\n}\n\nexport interface BuildWorkflowAnalystFeedbackPackOptions {\n envelope: WorkflowTraceEnvelope | unknown\n verifier?: VerificationReport\n analystFindings?: readonly AnalystFinding[]\n failureClusters?:\n | FailureClusterReport\n | FailureClusterInsight\n | readonly WorkflowFailureClusterInput[]\n generatedAt?: string\n limits?: WorkflowFeedbackPackLimits\n}\n\nconst PACK_VERSION: WorkflowFeedbackPackVersion = 'workflow-feedback-pack-v1'\n\nconst DEFAULT_LIMITS: Required<WorkflowFeedbackPackLimits> = {\n findings: 12,\n clusters: 8,\n layerFindings: 5,\n recommendations: 10,\n contextLines: 24,\n}\n\nexport function buildWorkflowAnalystFeedbackPack(\n options: BuildWorkflowAnalystFeedbackPackOptions,\n): WorkflowAnalystFeedbackPack {\n const limits = { ...DEFAULT_LIMITS, ...(options.limits ?? {}) }\n const envelope = validateWorkflowTraceEnvelope(options.envelope)\n const summary = summarizeWorkflowTrace(envelope)\n const verifier = options.verifier ? summarizeVerifier(options.verifier, limits) : undefined\n const toolUsage = summarizeToolUsage(envelope)\n const failureClusters = normalizeFailureClusters(options.failureClusters)\n .sort((a, b) => b.share - a.share)\n .slice(0, limits.clusters)\n const findings = summarizeFindings(options.analystFindings ?? [])\n .sort(compareFindings)\n .slice(0, limits.findings)\n const recommendations = uniqueStrings([\n ...recommendFromVerifier(verifier),\n ...failureClusters.flatMap((cluster) => (cluster.suggestedFix ? [cluster.suggestedFix] : [])),\n ...findings.flatMap((finding) =>\n finding.recommendedAction ? [finding.recommendedAction] : [],\n ),\n ...(summary.failed && summary.failureMessage\n ? [`Inspect workflow failure: ${summary.failureMessage}`]\n : []),\n ]).slice(0, limits.recommendations)\n\n const pack: WorkflowAnalystFeedbackPack = {\n schemaVersion: PACK_VERSION,\n runId: envelope.runId,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n summary,\n ...(verifier ? { verifier } : {}),\n toolUsage,\n failureClusters,\n findings,\n recommendations,\n driverContextLines: [],\n }\n return {\n ...pack,\n driverContextLines: renderDriverContextLines(pack).slice(0, limits.contextLines),\n }\n}\n\nexport function renderWorkflowFeedbackPack(\n pack: WorkflowAnalystFeedbackPack,\n options: { maxChars?: number } = {},\n): string {\n const lines = [\n `Workflow feedback pack for ${pack.runId}`,\n `status=${pack.summary.failed ? 'failed' : 'completed'} durationMs=${pack.summary.durationMs} costUsd=${pack.summary.costUsd.toFixed(6)} tokens=${pack.summary.tokenUsage.input}/${pack.summary.tokenUsage.output} events=${pack.summary.eventCount}`,\n renderDelegateFailureCounts(pack.summary),\n pack.verifier\n ? `verifier=${pack.verifier.allPass ? 'pass' : 'fail'} blendedScore=${pack.verifier.blendedScore.toFixed(3)} failedLayers=${pack.verifier.failedLayers.join(',') || 'none'}`\n : undefined,\n pack.toolUsage.totalCalls > 0\n ? `tools=${pack.toolUsage.totalCalls} errors=${pack.toolUsage.erroredCalls} byTool=${formatToolUsage(pack.toolUsage)}`\n : undefined,\n pack.failureClusters.length > 0 ? 'Failure clusters:' : undefined,\n ...pack.failureClusters.map(\n (cluster) =>\n `- ${cluster.name} share=${cluster.share.toFixed(3)} exemplars=${cluster.exemplars.join(',') || 'none'}${cluster.suggestedFix ? ` fix=${cluster.suggestedFix}` : ''}`,\n ),\n pack.findings.length > 0 ? 'Analyst findings:' : undefined,\n ...pack.findings.map(\n (finding) =>\n `- ${finding.severity} ${finding.area}: ${finding.claim}${finding.recommendedAction ? ` action=${finding.recommendedAction}` : ''}`,\n ),\n pack.recommendations.length > 0 ? 'Recommended next moves:' : undefined,\n ...pack.recommendations.map((recommendation) => `- ${recommendation}`),\n ].filter((line): line is string => Boolean(line))\n const rendered = lines.join('\\n')\n const maxChars = options.maxChars\n if (maxChars === undefined || rendered.length <= maxChars) return rendered\n if (maxChars <= 1) return rendered.slice(0, Math.max(0, maxChars))\n return `${rendered.slice(0, maxChars - 1)}…`\n}\n\nfunction renderDelegateFailureCounts(summary: WorkflowTraceSummary): string | undefined {\n const entries: Array<[string, number]> = [\n ['agent', summary.agentFailures],\n ['loop', summary.loopFailures],\n ['verifier', summary.verifierFailures],\n ['analyst', summary.analystFailures],\n ['reviewer', summary.reviewerFailures],\n ]\n const failures = entries.filter((entry) => entry[1] > 0)\n if (failures.length === 0) return undefined\n return `delegateFailures=${failures.map(([kind, count]) => `${kind}:${count}`).join(',')}`\n}\n\nfunction summarizeVerifier(\n verifier: VerificationReport,\n limits: Required<WorkflowFeedbackPackLimits>,\n): WorkflowVerifierSummary {\n const layers = verifier.layers.map((layer) => ({\n layer: layer.layer,\n status: layer.status,\n ...(layer.score !== undefined ? { score: layer.score } : {}),\n durationMs: layer.durationMs,\n ...(layer.reason ? { reason: layer.reason } : {}),\n findings: layer.findings\n .map((finding) => ({\n severity: verifierSeverity(finding.severity),\n message: finding.message,\n ...(finding.evidence ? { evidence: finding.evidence } : {}),\n ...(finding.detail ? { detail: finding.detail } : {}),\n }))\n .slice(0, limits.layerFindings),\n ...(layer.diagnostics ? { diagnostics: layer.diagnostics } : {}),\n }))\n return {\n allPass: verifier.allPass,\n blendedScore: verifier.blendedScore,\n durationMs: verifier.durationMs,\n failedLayers: verifier.layers\n .filter(\n (layer) =>\n layer.status === 'fail' || layer.status === 'error' || layer.status === 'timeout',\n )\n .map((layer) => layer.layer),\n layers,\n }\n}\n\nfunction summarizeToolUsage(envelope: WorkflowTraceEnvelope): WorkflowToolUsageSummary {\n const summary: WorkflowToolUsageSummary = { totalCalls: 0, erroredCalls: 0, byTool: {} }\n for (const event of envelope.events) {\n collectToolUsagePayload(summary, event.payload.toolUsage)\n collectToolCalls(summary, event.payload.toolCalls)\n collectSingleTool(summary, event.payload)\n }\n return summary\n}\n\nfunction collectToolUsagePayload(summary: WorkflowToolUsageSummary, value: unknown): void {\n if (!isRecord(value)) return\n if (!isRecord(value.byTool)) {\n summary.totalCalls += finiteNumber(value.totalCalls)\n summary.erroredCalls += finiteNumber(value.erroredCalls)\n return\n }\n let addedByTool = false\n for (const [tool, raw] of Object.entries(value.byTool)) {\n if (!isRecord(raw)) continue\n const calls = finiteNumber(raw.calls)\n const errors = finiteNumber(raw.errors)\n addTool(summary, tool, calls, errors)\n addedByTool ||= calls > 0 || errors > 0\n }\n if (!addedByTool) {\n summary.totalCalls += finiteNumber(value.totalCalls)\n summary.erroredCalls += finiteNumber(value.erroredCalls)\n }\n}\n\nfunction collectToolCalls(summary: WorkflowToolUsageSummary, value: unknown): void {\n if (!Array.isArray(value)) return\n for (const call of value) {\n if (!isRecord(call)) continue\n const name = stringValue(call.toolName) ?? stringValue(call.name)\n if (!name) continue\n const errored =\n call.status === 'error' ||\n call.error !== undefined ||\n call.ok === false ||\n call.success === false\n addTool(summary, name, 1, errored ? 1 : 0)\n }\n}\n\nfunction collectSingleTool(\n summary: WorkflowToolUsageSummary,\n payload: Record<string, unknown>,\n): void {\n const name = stringValue(payload.toolName)\n if (!name) return\n const errored =\n payload.status === 'error' ||\n payload.error !== undefined ||\n payload.ok === false ||\n payload.success === false\n addTool(summary, name, 1, errored ? 1 : 0)\n}\n\nfunction addTool(\n summary: WorkflowToolUsageSummary,\n name: string,\n calls: number,\n errors: number,\n): void {\n if (calls === 0 && errors === 0) return\n const current = summary.byTool[name] ?? { calls: 0, errors: 0 }\n current.calls += calls\n current.errors += errors\n summary.byTool[name] = current\n summary.totalCalls += calls\n summary.erroredCalls += errors\n}\n\nfunction normalizeFailureClusters(\n input:\n | FailureClusterReport\n | FailureClusterInsight\n | readonly WorkflowFailureClusterInput[]\n | undefined,\n): WorkflowFailureClusterSummary[] {\n if (!input) return []\n if (Array.isArray(input)) {\n return input.map((cluster) => ({\n id: cluster.id,\n name: cluster.name,\n share: clamp01(cluster.share ?? 0),\n ...(cluster.runCount !== undefined ? { runCount: cluster.runCount } : {}),\n exemplars: [...(cluster.exemplars ?? [])],\n ...(cluster.suggestedFix ? { suggestedFix: cluster.suggestedFix } : {}),\n source: 'custom',\n ...(cluster.metadata ? { metadata: cluster.metadata } : {}),\n }))\n }\n const report = input as FailureClusterReport | FailureClusterInsight\n const clusters = report.clusters ?? []\n const first = clusters[0] as unknown\n if (isRecord(first) && typeof first.failureClass === 'string') {\n const failureReport = report as FailureClusterReport\n return failureReport.clusters.map((cluster) => ({\n id: [\n cluster.failureClass,\n cluster.toolName ?? '',\n cluster.argPrefix ?? '',\n cluster.dimension ?? '',\n ].join('|'),\n name: [\n cluster.failureClass,\n cluster.toolName ? `tool:${cluster.toolName}` : undefined,\n cluster.dimension ? `dimension:${cluster.dimension}` : undefined,\n ]\n .filter(Boolean)\n .join(' '),\n share: failureReport.totalFailures > 0 ? cluster.runCount / failureReport.totalFailures : 0,\n runCount: cluster.runCount,\n exemplars: [cluster.exampleRunId],\n source: 'failure-cluster-view',\n metadata: {\n scenarioIds: cluster.scenarioIds,\n exampleError: cluster.exampleError,\n argPrefix: cluster.argPrefix,\n },\n }))\n }\n const insight = report as FailureClusterInsight\n return insight.clusters.map((cluster) => ({\n id: cluster.id,\n name: cluster.name,\n share: clamp01(cluster.share),\n exemplars: [...cluster.exemplars],\n ...(cluster.suggestedFix ? { suggestedFix: cluster.suggestedFix } : {}),\n source: 'insight-report',\n }))\n}\n\nfunction summarizeFindings(findings: readonly AnalystFinding[]): WorkflowAnalystFindingSummary[] {\n return findings.map((finding) => ({\n findingId: finding.finding_id,\n analystId: finding.analyst_id,\n severity: finding.severity,\n area: finding.area,\n claim: finding.claim,\n confidence: clamp01(finding.confidence),\n ...(finding.subject ? { subject: finding.subject } : {}),\n ...(finding.recommended_action ? { recommendedAction: finding.recommended_action } : {}),\n evidenceRefs: finding.evidence_refs,\n }))\n}\n\nfunction recommendFromVerifier(verifier: WorkflowVerifierSummary | undefined): string[] {\n if (!verifier || verifier.allPass) return []\n return verifier.layers\n .filter((layer) => verifier.failedLayers.includes(layer.layer))\n .map((layer) => {\n const firstFinding = layer.findings[0]?.message\n const detail = layer.reason ?? firstFinding ?? layer.status\n return `Fix verifier layer \"${layer.layer}\": ${detail}`\n })\n}\n\nfunction renderDriverContextLines(pack: WorkflowAnalystFeedbackPack): string[] {\n return renderWorkflowFeedbackPack(pack)\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n}\n\nfunction compareFindings(\n left: WorkflowAnalystFindingSummary,\n right: WorkflowAnalystFindingSummary,\n): number {\n const severityDelta = severityRank(right.severity) - severityRank(left.severity)\n if (severityDelta !== 0) return severityDelta\n return right.confidence - left.confidence\n}\n\nfunction verifierSeverity(severity: string): WorkflowFeedbackSeverity {\n switch (severity) {\n case 'critical':\n return 'critical'\n case 'major':\n return 'high'\n case 'minor':\n return 'low'\n case 'info':\n return 'info'\n default:\n return 'medium'\n }\n}\n\nfunction severityRank(severity: WorkflowFeedbackSeverity): number {\n switch (severity) {\n case 'critical':\n return 5\n case 'high':\n return 4\n case 'medium':\n return 3\n case 'low':\n return 2\n case 'info':\n return 1\n }\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const value of values) {\n const trimmed = value.trim()\n if (trimmed.length === 0 || seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out\n}\n\nfunction formatToolUsage(summary: WorkflowToolUsageSummary): string {\n return Object.entries(summary.byTool)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([tool, usage]) => `${tool}:${usage.calls}/${usage.errors}`)\n .join(',')\n}\n\nfunction finiteNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.min(1, value))\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n","import { createHash } from 'node:crypto'\n\nimport {\n DEFAULT_REDACTION_RULES,\n type RedactionReport,\n type RedactionRule,\n redactString,\n} from '../trace/redact'\nimport { validateWorkflowTraceEnvelope } from './schema'\nimport type { WorkflowTraceArtifact, WorkflowTraceEnvelope, WorkflowTraceEvent } from './types'\n\nexport interface WorkflowTraceSanitizationReport extends RedactionReport {\n hashedArgs: number\n truncatedStrings: number\n droppedPayloadKeys: Record<string, number>\n droppedArtifactContents: number\n}\n\nexport interface SanitizeWorkflowTraceEnvelopeOptions {\n rules?: readonly RedactionRule[]\n maxStringLength?: number\n hashSalt?: string\n approvedArtifactUris?: readonly string[]\n approvedArtifactKinds?: readonly string[]\n}\n\nexport interface SanitizedWorkflowTraceEnvelopeResult {\n envelope: WorkflowTraceEnvelope\n report: WorkflowTraceSanitizationReport\n}\n\nconst DEFAULT_MAX_STRING_LENGTH = 600\n\nconst SECRET_KEY_RE =\n /^(authorization|cookie|set-cookie|x-api-key|api[-_]?key|token|access[-_]?token|refresh[-_]?token|secret|password|passwd|session|credential|credentials)$/i\nconst ARG_KEY_RE = /^(args|arguments|rawargs|raw_args|toolargs|tool_args|inputargs|input_args)$/i\nconst FILE_CONTENT_KEY_RE = /^(filecontent|filecontents|file_content|file_contents|contents)$/i\nconst FILE_HINT_KEY_RE = /^(path|filepath|file_path|filename|file|uri)$/i\n\nexport function sanitizeWorkflowTraceEnvelope(\n input: WorkflowTraceEnvelope | unknown,\n options: SanitizeWorkflowTraceEnvelopeOptions = {},\n): SanitizedWorkflowTraceEnvelopeResult {\n const envelope = validateWorkflowTraceEnvelope(input)\n const report = emptyReport()\n const ctx: SanitizeContext = {\n rules: [...(options.rules ?? DEFAULT_REDACTION_RULES)],\n maxStringLength: options.maxStringLength ?? DEFAULT_MAX_STRING_LENGTH,\n hashSalt: options.hashSalt ?? '',\n approvedArtifactUris: new Set(options.approvedArtifactUris ?? []),\n approvedArtifactKinds: new Set(options.approvedArtifactKinds ?? []),\n report,\n }\n\n return {\n envelope: {\n traceVersion: envelope.traceVersion,\n runId: envelope.runId,\n ...(envelope.topology ? { topology: sanitizeValue(envelope.topology, ctx) as never } : {}),\n events: envelope.events.map((event) => sanitizeWorkflowTraceEvent(event, ctx)),\n ...(envelope.artifacts ? { artifacts: sanitizeArtifacts(envelope.artifacts, ctx) } : {}),\n ...(envelope.metadata\n ? { metadata: sanitizeRecord(envelope.metadata, ctx) as Record<string, unknown> }\n : {}),\n },\n report,\n }\n}\n\nfunction sanitizeWorkflowTraceEvent(\n event: WorkflowTraceEvent,\n ctx: SanitizeContext,\n): WorkflowTraceEvent {\n return {\n kind: event.kind,\n runId: event.runId,\n timestamp: event.timestamp,\n payload: sanitizeRecord(event.payload, ctx) as Record<string, unknown>,\n }\n}\n\nfunction sanitizeArtifacts(\n artifacts: readonly WorkflowTraceArtifact[],\n ctx: SanitizeContext,\n): WorkflowTraceArtifact[] {\n return artifacts.map((artifact) => {\n const approved =\n ctx.approvedArtifactUris.has(artifact.uri) || ctx.approvedArtifactKinds.has(artifact.kind)\n const metadata = artifact.metadata\n ? sanitizeRecord(artifact.metadata, ctx, { artifactApproved: approved })\n : undefined\n return {\n kind: artifact.kind,\n uri: sanitizeString(artifact.uri, ctx),\n ...(artifact.contentType ? { contentType: sanitizeString(artifact.contentType, ctx) } : {}),\n ...(artifact.sha256 ? { sha256: artifact.sha256 } : {}),\n ...(metadata ? { metadata: metadata as Record<string, unknown> } : {}),\n }\n })\n}\n\nfunction sanitizeRecord(\n record: Record<string, unknown>,\n ctx: SanitizeContext,\n options: { artifactApproved?: boolean } = {},\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n const hasFileHint = Object.keys(record).some((key) => FILE_HINT_KEY_RE.test(key))\n for (const [key, value] of Object.entries(record)) {\n if (SECRET_KEY_RE.test(key)) {\n out[key] = `[redacted:${key}]`\n increment(ctx.report.droppedPayloadKeys, key)\n continue\n }\n if (ARG_KEY_RE.test(key)) {\n out[key] = hashedValue(value, ctx)\n ctx.report.hashedArgs += 1\n continue\n }\n if (!options.artifactApproved && isFileContentKey(key, hasFileHint)) {\n out[key] = hashedValue(value, ctx)\n ctx.report.droppedArtifactContents += 1\n continue\n }\n out[key] = sanitizeValue(value, ctx)\n }\n return out\n}\n\nfunction sanitizeValue(value: unknown, ctx: SanitizeContext): unknown {\n if (typeof value === 'string') return sanitizeString(value, ctx)\n if (Array.isArray(value)) return value.map((item) => sanitizeValue(item, ctx))\n if (isRecord(value)) return sanitizeRecord(value, ctx)\n return value\n}\n\nfunction sanitizeString(value: string, ctx: SanitizeContext): string {\n const redacted = redactString(value, ctx.rules)\n ctx.report.redactionCount += redacted.report.redactionCount\n for (const [rule, count] of Object.entries(redacted.report.byRule)) {\n ctx.report.byRule[rule] = (ctx.report.byRule[rule] ?? 0) + count\n }\n if (redacted.output.length <= ctx.maxStringLength) return redacted.output\n ctx.report.truncatedStrings += 1\n return `${redacted.output.slice(0, Math.max(0, ctx.maxStringLength - 1))}…`\n}\n\nfunction hashedValue(value: unknown, ctx: SanitizeContext): Record<string, unknown> {\n return {\n redacted: true,\n sha256: sha256Stable(value, ctx.hashSalt),\n shape: valueShape(value),\n }\n}\n\nfunction sha256Stable(value: unknown, salt: string): string {\n return createHash('sha256').update(salt).update(stableStringify(value)).digest('hex')\n}\n\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`\n if (isRecord(value)) {\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)\n .join(',')}}`\n }\n return JSON.stringify(value)\n}\n\nfunction valueShape(value: unknown): unknown {\n if (Array.isArray(value)) return { type: 'array', length: value.length }\n if (isRecord(value)) {\n return {\n type: 'object',\n keys: Object.keys(value).sort(),\n }\n }\n return { type: typeof value }\n}\n\nfunction isFileContentKey(key: string, hasFileHint: boolean): boolean {\n if (FILE_CONTENT_KEY_RE.test(key)) return true\n return hasFileHint && /^(content|source|diff)$/i.test(key)\n}\n\nfunction emptyReport(): WorkflowTraceSanitizationReport {\n return {\n redactionCount: 0,\n byRule: {},\n hashedArgs: 0,\n truncatedStrings: 0,\n droppedPayloadKeys: {},\n droppedArtifactContents: 0,\n }\n}\n\nfunction increment(record: Record<string, number>, key: string): void {\n record[key] = (record[key] ?? 0) + 1\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\ninterface SanitizeContext {\n rules: RedactionRule[]\n maxStringLength: number\n hashSalt: string\n approvedArtifactUris: Set<string>\n approvedArtifactKinds: Set<string>\n report: WorkflowTraceSanitizationReport\n}\n","import type { RunTokenUsage } from '../run-record'\n\nexport function objectRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nexport function stringField(record: Record<string, unknown>, key: string): string | null {\n const value = record[key]\n return typeof value === 'string' ? value : null\n}\n\nexport function numberField(record: Record<string, unknown>, key: string): number | null {\n const value = record[key]\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\nexport function tokenUsageField(value: unknown): RunTokenUsage | null {\n const record = objectRecord(value)\n if (!record) return null\n const input = numberField(record, 'input')\n const output = numberField(record, 'output')\n if (input === null || output === null) return null\n const cached = numberField(record, 'cached')\n return {\n input,\n output,\n ...(cached !== null ? { cached } : {}),\n }\n}\n","import type { RunTokenUsage } from '../run-record'\nimport { numberField, stringField, tokenUsageField } from './trace-event-fields'\nimport type { WorkflowTraceEvent } from './types'\n\nexport interface WorkflowPhaseGraphNode {\n id: string\n title: string\n startedAt?: number\n endedAt?: number\n eventCount: number\n branchCount: number\n failedBranchCount: number\n agentCalls: number\n loopCalls: number\n verifierCalls: number\n analystCalls: number\n reviewerCalls: number\n agentFailures: number\n loopFailures: number\n verifierFailures: number\n analystFailures: number\n reviewerFailures: number\n costUsd: number\n tokenUsage: RunTokenUsage\n}\n\nexport interface WorkflowPhaseGraphBranch {\n id: string\n operation: string\n branchIndex: number\n phase: string | null\n status: 'started' | 'ended' | 'failed'\n startedAt?: number\n endedAt?: number\n durationMs?: number\n stageCount?: number\n stageIndex?: number\n message?: string\n code?: string\n}\n\nexport interface WorkflowPhaseGraph {\n nodes: WorkflowPhaseGraphNode[]\n branches: WorkflowPhaseGraphBranch[]\n}\n\ntype MutableWorkflowPhaseGraphNode = WorkflowPhaseGraphNode\ntype MutableWorkflowPhaseGraphBranch = WorkflowPhaseGraphBranch\n\nexport function workflowPhaseGraph(events: readonly WorkflowTraceEvent[]): WorkflowPhaseGraph {\n const nodes = new Map<string, MutableWorkflowPhaseGraphNode>()\n const branches: MutableWorkflowPhaseGraphBranch[] = []\n\n for (const event of events) {\n const phaseTitle = phaseTitleForEvent(event)\n if (phaseTitle) observePhaseEvent(phaseNode(nodes, phaseTitle), event)\n\n if (event.kind === 'workflow.branch.started') {\n branches.push(branchStarted(event, branches.length))\n continue\n }\n\n if (event.kind === 'workflow.branch.ended' || event.kind === 'workflow.branch.failed') {\n const branch = openBranchFor(branches, event) ?? branchStarted(event, branches.length)\n if (!branches.includes(branch)) branches.push(branch)\n observeBranchTerminal(branch, event)\n }\n }\n\n return {\n nodes: Array.from(nodes.values()).map(readonlyPhaseNode),\n branches: branches.map(readonlyBranch),\n }\n}\n\nfunction phaseNode(\n nodes: Map<string, MutableWorkflowPhaseGraphNode>,\n title: string,\n): MutableWorkflowPhaseGraphNode {\n const existing = nodes.get(title)\n if (existing) return existing\n const node: MutableWorkflowPhaseGraphNode = {\n id: `phase-${nodes.size}`,\n title,\n eventCount: 0,\n branchCount: 0,\n failedBranchCount: 0,\n agentCalls: 0,\n loopCalls: 0,\n verifierCalls: 0,\n analystCalls: 0,\n reviewerCalls: 0,\n agentFailures: 0,\n loopFailures: 0,\n verifierFailures: 0,\n analystFailures: 0,\n reviewerFailures: 0,\n costUsd: 0,\n tokenUsage: { input: 0, output: 0 },\n }\n nodes.set(title, node)\n return node\n}\n\nfunction observePhaseEvent(node: MutableWorkflowPhaseGraphNode, event: WorkflowTraceEvent): void {\n node.eventCount += 1\n node.startedAt = minDefined(node.startedAt, event.timestamp)\n node.endedAt = maxDefined(node.endedAt, event.timestamp)\n\n switch (event.kind) {\n case 'workflow.branch.ended':\n node.branchCount += 1\n break\n case 'workflow.branch.failed':\n node.failedBranchCount += 1\n break\n case 'workflow.agent.ended':\n node.agentCalls += 1\n break\n case 'workflow.agent.failed':\n node.agentCalls += 1\n node.agentFailures += 1\n break\n case 'workflow.loop.ended':\n node.loopCalls += 1\n break\n case 'workflow.loop.failed':\n node.loopCalls += 1\n node.loopFailures += 1\n break\n case 'workflow.verifier.ended':\n node.verifierCalls += 1\n break\n case 'workflow.verifier.failed':\n node.verifierCalls += 1\n node.verifierFailures += 1\n break\n case 'workflow.analyst.ended':\n node.analystCalls += 1\n break\n case 'workflow.analyst.failed':\n node.analystCalls += 1\n node.analystFailures += 1\n break\n case 'workflow.reviewer.ended':\n node.reviewerCalls += 1\n break\n case 'workflow.reviewer.failed':\n node.reviewerCalls += 1\n node.reviewerFailures += 1\n break\n }\n\n const costUsd = numberField(event.payload, 'costUsd')\n if (costUsd !== null) node.costUsd += costUsd\n const tokenUsage = tokenUsageField(event.payload.tokenUsage)\n if (tokenUsage) addTokenUsage(node.tokenUsage, tokenUsage)\n}\n\nfunction phaseTitleForEvent(event: WorkflowTraceEvent): string | null {\n return event.kind === 'workflow.phase'\n ? stringField(event.payload, 'title')\n : stringField(event.payload, 'phase')\n}\n\nfunction branchStarted(event: WorkflowTraceEvent, index: number): MutableWorkflowPhaseGraphBranch {\n const branch: MutableWorkflowPhaseGraphBranch = {\n id: `branch-${index}`,\n operation: stringField(event.payload, 'operation') ?? 'unknown',\n branchIndex: numberField(event.payload, 'branchIndex') ?? -1,\n phase: stringField(event.payload, 'phase'),\n status: 'started',\n }\n const stageCount = numberField(event.payload, 'stageCount')\n if (stageCount !== null) branch.stageCount = stageCount\n branch.startedAt = event.timestamp\n return branch\n}\n\nfunction openBranchFor(\n branches: readonly MutableWorkflowPhaseGraphBranch[],\n event: WorkflowTraceEvent,\n): MutableWorkflowPhaseGraphBranch | null {\n const operation = stringField(event.payload, 'operation') ?? 'unknown'\n const branchIndex = numberField(event.payload, 'branchIndex') ?? -1\n const phase = stringField(event.payload, 'phase')\n\n for (let i = branches.length - 1; i >= 0; i -= 1) {\n const branch = branches[i]\n if (\n branch?.status === 'started' &&\n branch.operation === operation &&\n branch.branchIndex === branchIndex &&\n branch.phase === phase\n ) {\n return branch\n }\n }\n return null\n}\n\nfunction observeBranchTerminal(\n branch: MutableWorkflowPhaseGraphBranch,\n event: WorkflowTraceEvent,\n): void {\n branch.status = event.kind === 'workflow.branch.failed' ? 'failed' : 'ended'\n branch.endedAt = event.timestamp\n\n const durationMs = numberField(event.payload, 'durationMs')\n if (durationMs !== null) {\n branch.durationMs = durationMs\n } else if (branch.startedAt !== undefined) {\n branch.durationMs = Math.max(0, event.timestamp - branch.startedAt)\n }\n\n const stageCount = numberField(event.payload, 'stageCount')\n if (stageCount !== null) branch.stageCount = stageCount\n const stageIndex = numberField(event.payload, 'stageIndex')\n if (stageIndex !== null) branch.stageIndex = stageIndex\n const message = stringField(event.payload, 'message')\n if (message) branch.message = message\n const code = stringField(event.payload, 'code')\n if (code) branch.code = code\n}\n\nfunction readonlyPhaseNode(node: MutableWorkflowPhaseGraphNode): WorkflowPhaseGraphNode {\n const result: WorkflowPhaseGraphNode = {\n id: node.id,\n title: node.title,\n eventCount: node.eventCount,\n branchCount: node.branchCount,\n failedBranchCount: node.failedBranchCount,\n agentCalls: node.agentCalls,\n loopCalls: node.loopCalls,\n verifierCalls: node.verifierCalls,\n analystCalls: node.analystCalls,\n reviewerCalls: node.reviewerCalls,\n agentFailures: node.agentFailures,\n loopFailures: node.loopFailures,\n verifierFailures: node.verifierFailures,\n analystFailures: node.analystFailures,\n reviewerFailures: node.reviewerFailures,\n costUsd: node.costUsd,\n tokenUsage: node.tokenUsage,\n }\n if (node.startedAt !== undefined) result.startedAt = node.startedAt\n if (node.endedAt !== undefined) result.endedAt = node.endedAt\n return result\n}\n\nfunction readonlyBranch(branch: MutableWorkflowPhaseGraphBranch): WorkflowPhaseGraphBranch {\n const result: WorkflowPhaseGraphBranch = {\n id: branch.id,\n operation: branch.operation,\n branchIndex: branch.branchIndex,\n phase: branch.phase,\n status: branch.status,\n }\n if (branch.startedAt !== undefined) result.startedAt = branch.startedAt\n if (branch.endedAt !== undefined) result.endedAt = branch.endedAt\n if (branch.durationMs !== undefined) result.durationMs = branch.durationMs\n if (branch.stageCount !== undefined) result.stageCount = branch.stageCount\n if (branch.stageIndex !== undefined) result.stageIndex = branch.stageIndex\n if (branch.message !== undefined) result.message = branch.message\n if (branch.code !== undefined) result.code = branch.code\n return result\n}\n\nfunction minDefined(current: number | undefined, next: number): number {\n return current === undefined ? next : Math.min(current, next)\n}\n\nfunction maxDefined(current: number | undefined, next: number): number {\n return current === undefined ? next : Math.max(current, next)\n}\n\nfunction addTokenUsage(target: RunTokenUsage, value: RunTokenUsage): void {\n target.input += value.input\n target.output += value.output\n if (value.cached !== undefined) target.cached = (target.cached ?? 0) + value.cached\n}\n","import type { RunTokenUsage } from '../run-record'\nimport { type WorkflowPhaseGraph, workflowPhaseGraph } from './phase-graph'\nimport { summarizeWorkflowTrace, validateWorkflowTraceEnvelope } from './schema'\nimport { numberField, objectRecord, stringField, tokenUsageField } from './trace-event-fields'\nimport type { WorkflowTraceEnvelope, WorkflowTraceEvent, WorkflowTraceSummary } from './types'\n\nexport interface WorkflowDelegateTraceSummary {\n index: number | null\n label: string | null\n phase: string | null\n costUsd: number | null\n tokenUsage: RunTokenUsage | null\n trace: unknown\n}\n\nexport interface WorkflowDelegateFailureSummary {\n index: number | null\n label: string | null\n phase: string | null\n durationMs: number | null\n message: string | null\n code: string | null\n}\n\nexport interface WorkflowCheckpointTraceSummary extends WorkflowDelegateTraceSummary {\n output: unknown\n}\n\nexport interface WorkflowExecutionSummary extends WorkflowTraceSummary {\n source?: string\n eventKinds: Record<string, number>\n phases: string[]\n phaseGraph: WorkflowPhaseGraph\n agentRuns: WorkflowDelegateTraceSummary[]\n loopRuns: WorkflowDelegateTraceSummary[]\n verifierOutputs: WorkflowCheckpointTraceSummary[]\n analystOutputs: WorkflowCheckpointTraceSummary[]\n reviewerOutputs: WorkflowCheckpointTraceSummary[]\n agentFailureDetails: WorkflowDelegateFailureSummary[]\n loopFailureDetails: WorkflowDelegateFailureSummary[]\n verifierFailureDetails: WorkflowDelegateFailureSummary[]\n analystFailureDetails: WorkflowDelegateFailureSummary[]\n reviewerFailureDetails: WorkflowDelegateFailureSummary[]\n}\n\nexport interface SummarizeWorkflowExecutionOptions {\n source?: string\n}\n\nexport function summarizeWorkflowExecution(\n input: WorkflowTraceEnvelope | unknown,\n options: SummarizeWorkflowExecutionOptions = {},\n): WorkflowExecutionSummary {\n const envelope = validateWorkflowTraceEnvelope(input)\n const base = summarizeWorkflowTrace(envelope)\n return {\n ...base,\n ...(options.source !== undefined ? { source: options.source } : {}),\n eventKinds: workflowEventKinds(envelope.events),\n phases: workflowPhaseTitles(envelope.events),\n phaseGraph: workflowPhaseGraph(envelope.events),\n agentRuns: workflowDelegateTraceSummaries(envelope.events, 'workflow.agent.ended'),\n loopRuns: workflowDelegateTraceSummaries(envelope.events, 'workflow.loop.ended'),\n verifierOutputs: workflowCheckpointTraceSummaries(envelope.events, 'workflow.verifier.ended'),\n analystOutputs: workflowCheckpointTraceSummaries(envelope.events, 'workflow.analyst.ended'),\n reviewerOutputs: workflowCheckpointTraceSummaries(envelope.events, 'workflow.reviewer.ended'),\n agentFailureDetails: workflowDelegateFailureSummaries(envelope.events, 'workflow.agent.failed'),\n loopFailureDetails: workflowDelegateFailureSummaries(envelope.events, 'workflow.loop.failed'),\n verifierFailureDetails: workflowDelegateFailureSummaries(\n envelope.events,\n 'workflow.verifier.failed',\n ),\n analystFailureDetails: workflowDelegateFailureSummaries(\n envelope.events,\n 'workflow.analyst.failed',\n ),\n reviewerFailureDetails: workflowDelegateFailureSummaries(\n envelope.events,\n 'workflow.reviewer.failed',\n ),\n }\n}\n\nfunction workflowEventKinds(events: readonly WorkflowTraceEvent[]): Record<string, number> {\n return events.reduce<Record<string, number>>((acc, event) => {\n acc[event.kind] = (acc[event.kind] ?? 0) + 1\n return acc\n }, {})\n}\n\nfunction workflowPhaseTitles(events: readonly WorkflowTraceEvent[]): string[] {\n const titles: string[] = []\n const seen = new Set<string>()\n for (const event of events) {\n const title =\n event.kind === 'workflow.phase'\n ? stringField(event.payload, 'title')\n : stringField(event.payload, 'phase')\n if (!title || seen.has(title)) continue\n seen.add(title)\n titles.push(title)\n }\n return titles\n}\n\nfunction workflowDelegateTraceSummaries(\n events: readonly WorkflowTraceEvent[],\n endedKind: WorkflowTraceEvent['kind'],\n): WorkflowDelegateTraceSummary[] {\n return events\n .filter((event) => event.kind === endedKind)\n .map((event) => ({\n index: numberField(event.payload, 'index'),\n label: stringField(event.payload, 'label'),\n phase: stringField(event.payload, 'phase'),\n costUsd: numberField(event.payload, 'costUsd'),\n tokenUsage: tokenUsageField(event.payload.tokenUsage),\n trace: event.payload.trace ?? null,\n }))\n}\n\nfunction workflowCheckpointTraceSummaries(\n events: readonly WorkflowTraceEvent[],\n endedKind: WorkflowTraceEvent['kind'],\n): WorkflowCheckpointTraceSummary[] {\n return workflowDelegateTraceSummaries(events, endedKind).map((summary) => ({\n ...summary,\n output: checkpointOutput(summary.trace),\n }))\n}\n\nfunction workflowDelegateFailureSummaries(\n events: readonly WorkflowTraceEvent[],\n failedKind: WorkflowTraceEvent['kind'],\n): WorkflowDelegateFailureSummary[] {\n return events\n .filter((event) => event.kind === failedKind)\n .map((event) => ({\n index: numberField(event.payload, 'index'),\n label: stringField(event.payload, 'label'),\n phase: stringField(event.payload, 'phase'),\n durationMs: numberField(event.payload, 'durationMs'),\n message: stringField(event.payload, 'message'),\n code: stringField(event.payload, 'code'),\n }))\n}\n\nfunction checkpointOutput(trace: unknown): unknown {\n const record = objectRecord(trace)\n if (record && Object.hasOwn(record, 'checkpointOutput')) {\n return record.checkpointOutput\n }\n if (record && Object.hasOwn(record, 'output')) return record.output\n return trace\n}\n","import { ValidationError } from '../errors'\nimport {\n type SanitizedWorkflowTraceEnvelopeResult,\n type SanitizeWorkflowTraceEnvelopeOptions,\n sanitizeWorkflowTraceEnvelope,\n type WorkflowTraceSanitizationReport,\n} from './sanitize'\nimport { validateWorkflowTraceEnvelope } from './schema'\nimport { summarizeWorkflowExecution, type WorkflowExecutionSummary } from './summary'\nimport type { WorkflowTraceEnvelope, WorkflowTraceEvent, WorkflowTraceExportLinks } from './types'\n\nexport type WorkflowTraceIntelligenceEnvelopeVersion = 'workflow-trace-intelligence-envelope-v1'\nexport type WorkflowTraceExportGrantScope = 'workflow-trace:export' | 'workflow-trace:read' | '*'\nexport type WorkflowTraceExportGrantSubject = 'product' | 'partner' | 'tenant'\n\nexport interface WorkflowTraceExportGrant {\n grantId: string\n subject: WorkflowTraceExportGrantSubject\n subjectId: string\n scopes: readonly WorkflowTraceExportGrantScope[]\n grantedAt?: string\n expiresAt?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowTraceHashEvidence {\n path: string\n sha256: string\n shape?: unknown\n}\n\nexport interface WorkflowTraceArtifactEvidence {\n kind: string\n uri: string\n contentType?: string\n sha256?: string\n}\n\nexport interface WorkflowTraceCompactEvidence {\n eventKinds: Record<string, number>\n phases: string[]\n toolNames: string[]\n redactedHashes: WorkflowTraceHashEvidence[]\n artifacts: WorkflowTraceArtifactEvidence[]\n failureMessage?: string\n}\n\nexport interface WorkflowTraceIntelligenceEnvelope {\n schemaVersion: WorkflowTraceIntelligenceEnvelopeVersion\n destination: string\n generatedAt: string\n productId: string\n partnerId?: string\n runId: string\n grantIds: string[]\n traceEnvelope: WorkflowTraceEnvelope\n summary: WorkflowExecutionSummary\n compactEvidence: WorkflowTraceCompactEvidence\n sanitization: SanitizedWorkflowTraceEnvelopeResult['report']\n links?: WorkflowTraceExportLinks\n}\n\nexport interface BuildWorkflowTraceIntelligenceEnvelopeOptions {\n envelope: WorkflowTraceEnvelope | unknown\n productId: string\n partnerId?: string\n grants: readonly WorkflowTraceExportGrant[]\n generatedAt?: string\n destination?: string\n sanitize?: SanitizeWorkflowTraceEnvelopeOptions\n links?: WorkflowTraceExportLinks\n metadata?: Record<string, unknown>\n}\n\nconst ENVELOPE_VERSION: WorkflowTraceIntelligenceEnvelopeVersion =\n 'workflow-trace-intelligence-envelope-v1'\nconst DEFAULT_DESTINATION = 'intelligence.tangle.tools'\n\nexport function buildWorkflowTraceIntelligenceEnvelope(\n options: BuildWorkflowTraceIntelligenceEnvelopeOptions,\n): WorkflowTraceIntelligenceEnvelope {\n const productId = requireNonEmpty(options.productId, 'productId')\n const partnerId =\n options.partnerId !== undefined ? requireNonEmpty(options.partnerId, 'partnerId') : undefined\n const generatedAt = options.generatedAt ?? new Date().toISOString()\n const grantIds = activeExportGrantIds({\n grants: options.grants,\n productId,\n partnerId,\n nowMs: Date.parse(generatedAt),\n })\n const base = validateWorkflowTraceEnvelope(options.envelope)\n const sourceEnvelope: WorkflowTraceEnvelope =\n options.metadata === undefined\n ? base\n : {\n ...base,\n metadata: {\n ...(base.metadata ?? {}),\n intelligenceExport: options.metadata,\n },\n }\n const sanitized = sanitizeWorkflowTraceEnvelope(sourceEnvelope, options.sanitize)\n const summary = summarizeWorkflowExecution(sanitized.envelope)\n return {\n schemaVersion: ENVELOPE_VERSION,\n destination: options.destination ?? DEFAULT_DESTINATION,\n generatedAt,\n productId,\n ...(partnerId ? { partnerId } : {}),\n runId: sanitized.envelope.runId,\n grantIds,\n traceEnvelope: sanitized.envelope,\n summary,\n compactEvidence: compactEvidence(sanitized.envelope, summary),\n sanitization: sanitized.report,\n ...(options.links ? { links: options.links } : {}),\n }\n}\n\nexport function validateWorkflowTraceIntelligenceEnvelope(\n input: unknown,\n): WorkflowTraceIntelligenceEnvelope {\n const obj = expectRecord(input, 'workflow intelligence envelope')\n if (obj.schemaVersion !== ENVELOPE_VERSION) {\n throw new ValidationError(`workflow intelligence schemaVersion must be ${ENVELOPE_VERSION}`)\n }\n const destination = expectString(obj.destination, 'destination')\n const generatedAt = expectString(obj.generatedAt, 'generatedAt')\n const productId = expectString(obj.productId, 'productId')\n const partnerId =\n obj.partnerId !== undefined ? expectString(obj.partnerId, 'partnerId') : undefined\n const runId = expectString(obj.runId, 'runId')\n const grantIds = expectStringArray(obj.grantIds, 'grantIds')\n const traceEnvelope = validateWorkflowTraceEnvelope(obj.traceEnvelope)\n if (traceEnvelope.runId !== runId) {\n throw new ValidationError(`workflow intelligence runId ${runId} does not match trace envelope`)\n }\n const summary = summarizeWorkflowExecution(traceEnvelope)\n const compact = validateCompactEvidence(obj.compactEvidence)\n const expectedCompact = compactEvidence(traceEnvelope, summary)\n assertCompactEvidenceEqual(compact, expectedCompact)\n const sanitization = validateSanitizationReport(obj.sanitization)\n return {\n schemaVersion: ENVELOPE_VERSION,\n destination,\n generatedAt,\n productId,\n ...(partnerId ? { partnerId } : {}),\n runId,\n grantIds,\n traceEnvelope,\n summary,\n compactEvidence: expectedCompact,\n sanitization,\n ...(obj.links !== undefined ? { links: validateLinks(obj.links) } : {}),\n }\n}\n\nfunction activeExportGrantIds(args: {\n grants: readonly WorkflowTraceExportGrant[]\n productId: string\n partnerId?: string\n nowMs: number\n}): string[] {\n if (!Array.isArray(args.grants) || args.grants.length === 0) {\n throw new ValidationError('workflow intelligence export requires at least one opt-in grant')\n }\n const nowMs = Number.isFinite(args.nowMs) ? args.nowMs : Date.now()\n const ids = args.grants\n .filter((grant) => grantMatchesSubject(grant, args.productId, args.partnerId))\n .filter((grant) => grant.scopes.includes('workflow-trace:export') || grant.scopes.includes('*'))\n .filter((grant) => !grantExpired(grant, nowMs))\n .map((grant) => grant.grantId)\n .filter((id) => id.length > 0)\n if (ids.length === 0) {\n throw new ValidationError(\n 'workflow intelligence export requires an active workflow-trace:export grant for the product or partner',\n )\n }\n return ids\n}\n\nfunction grantMatchesSubject(\n grant: WorkflowTraceExportGrant,\n productId: string,\n partnerId: string | undefined,\n): boolean {\n if (grant.subject === 'product') return grant.subjectId === productId\n if (grant.subject === 'partner') return partnerId !== undefined && grant.subjectId === partnerId\n return grant.subjectId === productId || grant.subjectId === partnerId\n}\n\nfunction grantExpired(grant: WorkflowTraceExportGrant, nowMs: number): boolean {\n if (!grant.expiresAt) return false\n const expiresAt = Date.parse(grant.expiresAt)\n return Number.isFinite(expiresAt) && expiresAt <= nowMs\n}\n\nfunction compactEvidence(\n envelope: WorkflowTraceEnvelope,\n summary: WorkflowExecutionSummary,\n): WorkflowTraceCompactEvidence {\n return {\n eventKinds: summary.eventKinds,\n phases: summary.phases,\n toolNames: toolNames(envelope.events),\n redactedHashes: redactedHashes(envelope),\n artifacts: (envelope.artifacts ?? []).map((artifact) => ({\n kind: artifact.kind,\n uri: artifact.uri,\n ...(artifact.contentType ? { contentType: artifact.contentType } : {}),\n ...(artifact.sha256 ? { sha256: artifact.sha256 } : {}),\n })),\n ...(summary.failureMessage ? { failureMessage: summary.failureMessage } : {}),\n }\n}\n\nfunction toolNames(events: readonly WorkflowTraceEvent[]): string[] {\n const names = new Set<string>()\n for (const event of events) collectToolNames(event.payload, names)\n return [...names].sort()\n}\n\nfunction collectToolNames(value: unknown, names: Set<string>): void {\n if (Array.isArray(value)) {\n value.forEach((item) => {\n collectToolNames(item, names)\n })\n return\n }\n if (!isRecord(value)) return\n const direct = stringValue(value.toolName) ?? stringValue(value.name)\n if (direct && looksLikeToolRecord(value)) names.add(direct)\n if (isRecord(value.byTool)) {\n for (const key of Object.keys(value.byTool)) names.add(key)\n }\n for (const child of Object.values(value)) collectToolNames(child, names)\n}\n\nfunction looksLikeToolRecord(value: Record<string, unknown>): boolean {\n return (\n 'toolName' in value ||\n 'toolArgs' in value ||\n 'args' in value ||\n 'status' in value ||\n 'error' in value ||\n 'success' in value\n )\n}\n\nfunction redactedHashes(envelope: WorkflowTraceEnvelope): WorkflowTraceHashEvidence[] {\n const out: WorkflowTraceHashEvidence[] = []\n envelope.events.forEach((event, index) => {\n collectHashEvidence(event.payload, `events[${index}].payload`, out)\n })\n const artifacts = envelope.artifacts ?? []\n artifacts.forEach((artifact, index) => {\n collectHashEvidence(artifact.metadata, `artifacts[${index}].metadata`, out)\n })\n collectHashEvidence(envelope.metadata, 'metadata', out)\n return out\n}\n\nfunction collectHashEvidence(value: unknown, path: string, out: WorkflowTraceHashEvidence[]): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n collectHashEvidence(item, `${path}[${index}]`, out)\n })\n return\n }\n if (!isRecord(value)) return\n if (value.redacted === true && typeof value.sha256 === 'string') {\n out.push({\n path,\n sha256: value.sha256,\n ...(value.shape !== undefined ? { shape: value.shape } : {}),\n })\n return\n }\n for (const [key, child] of Object.entries(value)) {\n collectHashEvidence(child, `${path}.${key}`, out)\n }\n}\n\nfunction validateCompactEvidence(value: unknown): WorkflowTraceCompactEvidence {\n const obj = expectRecord(value, 'compactEvidence')\n return {\n eventKinds: expectNumberRecord(obj.eventKinds, 'compactEvidence.eventKinds'),\n phases: expectStringArray(obj.phases, 'compactEvidence.phases'),\n toolNames: expectStringArray(obj.toolNames, 'compactEvidence.toolNames'),\n redactedHashes: expectArray(obj.redactedHashes, 'compactEvidence.redactedHashes').map(\n (item, index) => {\n const record = expectRecord(item, `compactEvidence.redactedHashes[${index}]`)\n return {\n path: expectString(record.path, `compactEvidence.redactedHashes[${index}].path`),\n sha256: expectString(record.sha256, `compactEvidence.redactedHashes[${index}].sha256`),\n ...(record.shape !== undefined ? { shape: record.shape } : {}),\n }\n },\n ),\n artifacts: expectArray(obj.artifacts, 'compactEvidence.artifacts').map((item, index) => {\n const record = expectRecord(item, `compactEvidence.artifacts[${index}]`)\n return {\n kind: expectString(record.kind, `compactEvidence.artifacts[${index}].kind`),\n uri: expectString(record.uri, `compactEvidence.artifacts[${index}].uri`),\n ...(record.contentType !== undefined\n ? {\n contentType: expectString(\n record.contentType,\n `compactEvidence.artifacts[${index}].contentType`,\n ),\n }\n : {}),\n ...(record.sha256 !== undefined\n ? {\n sha256: expectString(record.sha256, `compactEvidence.artifacts[${index}].sha256`),\n }\n : {}),\n }\n }),\n ...(obj.failureMessage !== undefined\n ? { failureMessage: expectString(obj.failureMessage, 'compactEvidence.failureMessage') }\n : {}),\n }\n}\n\nfunction assertCompactEvidenceEqual(\n actual: WorkflowTraceCompactEvidence,\n expected: WorkflowTraceCompactEvidence,\n): void {\n assertNumberRecordEqual(actual.eventKinds, expected.eventKinds, 'compactEvidence.eventKinds')\n assertStringArrayEqual(actual.phases, expected.phases, 'compactEvidence.phases')\n assertStringArrayEqual(actual.toolNames, expected.toolNames, 'compactEvidence.toolNames')\n assertJsonArrayEqual(\n actual.redactedHashes,\n expected.redactedHashes,\n 'compactEvidence.redactedHashes',\n )\n assertJsonArrayEqual(actual.artifacts, expected.artifacts, 'compactEvidence.artifacts')\n if (actual.failureMessage !== expected.failureMessage) {\n throw new ValidationError('compactEvidence.failureMessage does not match trace envelope')\n }\n}\n\nfunction validateSanitizationReport(value: unknown): WorkflowTraceSanitizationReport {\n const obj = expectRecord(value, 'sanitization')\n return {\n redactionCount: expectNonNegativeNumber(obj.redactionCount, 'sanitization.redactionCount'),\n byRule: expectNumberRecord(obj.byRule, 'sanitization.byRule'),\n hashedArgs: expectNonNegativeNumber(obj.hashedArgs, 'sanitization.hashedArgs'),\n truncatedStrings: expectNonNegativeNumber(\n obj.truncatedStrings,\n 'sanitization.truncatedStrings',\n ),\n droppedPayloadKeys: expectNumberRecord(\n obj.droppedPayloadKeys,\n 'sanitization.droppedPayloadKeys',\n ),\n droppedArtifactContents: expectNonNegativeNumber(\n obj.droppedArtifactContents,\n 'sanitization.droppedArtifactContents',\n ),\n }\n}\n\nfunction validateLinks(value: unknown): WorkflowTraceExportLinks {\n const obj = expectRecord(value, 'links')\n return {\n ...(obj.traceArtifactUri !== undefined\n ? { traceArtifactUri: expectString(obj.traceArtifactUri, 'links.traceArtifactUri') }\n : {}),\n ...(obj.exportBundleUri !== undefined\n ? { exportBundleUri: expectString(obj.exportBundleUri, 'links.exportBundleUri') }\n : {}),\n ...(obj.partnerReportUri !== undefined\n ? { partnerReportUri: expectString(obj.partnerReportUri, 'links.partnerReportUri') }\n : {}),\n ...(obj.intelligenceRunUri !== undefined\n ? { intelligenceRunUri: expectString(obj.intelligenceRunUri, 'links.intelligenceRunUri') }\n : {}),\n }\n}\n\nfunction requireNonEmpty(value: string, field: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`workflow intelligence ${field} must be a non-empty string`)\n }\n return value\n}\n\nfunction expectRecord(value: unknown, path: string): Record<string, unknown> {\n if (!isRecord(value)) throw new ValidationError(`${path}: expected object`)\n return value\n}\n\nfunction expectArray(value: unknown, path: string): unknown[] {\n if (!Array.isArray(value)) throw new ValidationError(`${path}: expected array`)\n return value\n}\n\nfunction expectStringArray(value: unknown, path: string): string[] {\n return expectArray(value, path).map((item, index) => expectString(item, `${path}[${index}]`))\n}\n\nfunction expectNumberRecord(value: unknown, path: string): Record<string, number> {\n const record = expectRecord(value, path)\n const out: Record<string, number> = {}\n for (const [key, item] of Object.entries(record)) {\n out[key] = expectNonNegativeNumber(item, `${path}.${key}`)\n }\n return out\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`${path}: expected non-empty string`)\n }\n return value\n}\n\nfunction expectNonNegativeNumber(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new ValidationError(`${path}: expected non-negative number`)\n }\n return value\n}\n\nfunction assertNumberRecordEqual(\n actual: Record<string, number>,\n expected: Record<string, number>,\n path: string,\n): void {\n const actualKeys = Object.keys(actual).sort()\n const expectedKeys = Object.keys(expected).sort()\n assertStringArrayEqual(actualKeys, expectedKeys, path)\n for (const key of expectedKeys) {\n if (actual[key] !== expected[key]) {\n throw new ValidationError(`${path}.${key} does not match trace envelope`)\n }\n }\n}\n\nfunction assertStringArrayEqual(\n actual: readonly string[],\n expected: readonly string[],\n path: string,\n): void {\n if (actual.length !== expected.length || actual.some((item, index) => item !== expected[index])) {\n throw new ValidationError(`${path} does not match trace envelope`)\n }\n}\n\nfunction assertJsonArrayEqual(\n actual: readonly unknown[],\n expected: readonly unknown[],\n path: string,\n): void {\n if (\n actual.length !== expected.length ||\n actual.some((item, index) => JSON.stringify(item) !== JSON.stringify(expected[index]))\n ) {\n throw new ValidationError(`${path} does not match trace envelope`)\n }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n","import { type RunRecord, validateRunRecord } from '../run-record'\nimport { summarizeWorkflowTrace, validateWorkflowTraceEnvelope } from './schema'\nimport type { WorkflowTraceEnvelope, WorkflowTraceProjectionMetadata } from './types'\n\nexport interface WorkflowTraceRunRecordOptions extends WorkflowTraceProjectionMetadata {\n runId?: string\n score?: number\n raw?: Record<string, number>\n failureMode?: string\n judgeMetadata?: RunRecord['judgeMetadata']\n agentProfile?: RunRecord['agentProfile']\n}\n\nexport function workflowTraceToRunRecord(\n input: WorkflowTraceEnvelope | unknown,\n options: WorkflowTraceRunRecordOptions,\n): RunRecord {\n const envelope = validateWorkflowTraceEnvelope(input)\n const summary = summarizeWorkflowTrace(envelope)\n const score = clampScore(options.score ?? (summary.failed ? 0 : 1))\n const raw = {\n ...finiteOnly(options.raw ?? {}),\n score,\n workflow_failed: summary.failed ? 1 : 0,\n workflow_events: summary.eventCount,\n workflow_phases: summary.phaseCount,\n workflow_branches: summary.branchCount,\n workflow_branch_failures: summary.failedBranchCount,\n workflow_agent_calls: summary.agentCalls,\n workflow_loop_calls: summary.loopCalls,\n workflow_verifier_calls: summary.verifierCalls,\n workflow_analyst_calls: summary.analystCalls,\n workflow_reviewer_calls: summary.reviewerCalls,\n workflow_agent_failures: summary.agentFailures,\n workflow_loop_failures: summary.loopFailures,\n workflow_verifier_failures: summary.verifierFailures,\n workflow_analyst_failures: summary.analystFailures,\n workflow_reviewer_failures: summary.reviewerFailures,\n }\n const outcome =\n options.splitTag === 'holdout' ? { holdoutScore: score, raw } : { searchScore: score, raw }\n\n return validateRunRecord({\n runId: options.runId ?? envelope.runId,\n experimentId: options.experimentId,\n candidateId: options.candidateId,\n seed: options.seed,\n model: options.model,\n promptHash: options.promptHash,\n configHash: options.configHash,\n commitSha: options.commitSha,\n wallMs: summary.durationMs,\n costUsd: summary.costUsd,\n tokenUsage: summary.tokenUsage,\n ...(options.judgeMetadata ? { judgeMetadata: options.judgeMetadata } : {}),\n outcome,\n failureMode: options.failureMode ?? (summary.failed ? 'workflow_failed' : undefined),\n splitTag: options.splitTag,\n ...(options.scenarioId ? { scenarioId: options.scenarioId } : {}),\n ...(options.agentProfile ? { agentProfile: options.agentProfile } : {}),\n })\n}\n\nfunction finiteOnly(values: Record<string, number>): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [key, value] of Object.entries(values)) {\n if (Number.isFinite(value)) out[key] = value\n }\n return out\n}\n\nfunction clampScore(value: number): number {\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.min(1, value))\n}\n","import type { DatasetSplit } from '../dataset'\nimport type { FeedbackAttempt, FeedbackTrajectory } from '../feedback-trajectory'\nimport { summarizeWorkflowTrace, validateWorkflowTraceEnvelope } from './schema'\nimport type { WorkflowTraceEnvelope, WorkflowTraceEvent } from './types'\n\nexport interface WorkflowTraceTrajectoryOptions {\n projectId?: string\n scenarioId?: string\n task: string\n split?: DatasetSplit\n tags?: Record<string, string>\n score?: number\n success?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport function workflowTraceToFeedbackTrajectory(\n input: WorkflowTraceEnvelope | unknown,\n options: WorkflowTraceTrajectoryOptions,\n): FeedbackTrajectory {\n const envelope = validateWorkflowTraceEnvelope(input)\n const summary = summarizeWorkflowTrace(envelope)\n const createdAt = iso(envelope.events[0]?.timestamp)\n const updatedAt = iso(envelope.events.at(-1)?.timestamp)\n return {\n id: envelope.runId,\n projectId: options.projectId,\n scenarioId: options.scenarioId,\n task: {\n intent: options.task,\n context: {\n topology: envelope.topology,\n metadata: envelope.metadata,\n },\n },\n attempts: workflowEventsToAttempts(envelope.events),\n labels: [],\n outcome: {\n success: options.success ?? !summary.failed,\n score: options.score,\n costUsd: summary.costUsd,\n observedAt: updatedAt,\n detail: summary.failureMessage,\n metrics: {\n workflow_events: summary.eventCount,\n workflow_phases: summary.phaseCount,\n workflow_branches: summary.branchCount,\n workflow_branch_failures: summary.failedBranchCount,\n workflow_agent_calls: summary.agentCalls,\n workflow_loop_calls: summary.loopCalls,\n workflow_verifier_calls: summary.verifierCalls,\n workflow_analyst_calls: summary.analystCalls,\n workflow_reviewer_calls: summary.reviewerCalls,\n workflow_agent_failures: summary.agentFailures,\n workflow_loop_failures: summary.loopFailures,\n workflow_verifier_failures: summary.verifierFailures,\n workflow_analyst_failures: summary.analystFailures,\n workflow_reviewer_failures: summary.reviewerFailures,\n workflow_tokens_input: summary.tokenUsage.input,\n workflow_tokens_output: summary.tokenUsage.output,\n },\n metadata: {\n durationMs: summary.durationMs,\n ...(options.metadata ?? {}),\n },\n },\n split: options.split,\n tags: options.tags,\n createdAt,\n updatedAt,\n metadata: {\n traceVersion: envelope.traceVersion,\n artifacts: envelope.artifacts,\n },\n }\n}\n\nfunction workflowEventsToAttempts(events: readonly WorkflowTraceEvent[]): FeedbackAttempt[] {\n const attempts: FeedbackAttempt[] = []\n for (const event of events) {\n const artifactType = artifactTypeForWorkflowEvent(event.kind)\n if (!artifactType) continue\n const stepIndex = attempts.length\n attempts.push({\n id: `${event.runId}:${stepIndex}`,\n stepIndex,\n artifactType,\n artifact: event.payload.trace ?? event.payload,\n createdAt: iso(event.timestamp),\n metadata: {\n eventKind: event.kind,\n label: event.payload.label,\n phase: event.payload.phase,\n costUsd: event.payload.costUsd,\n tokenUsage: event.payload.tokenUsage,\n ...(event.kind.endsWith('.failed')\n ? { failed: true, message: event.payload.message, code: event.payload.code }\n : {}),\n },\n })\n }\n return attempts\n}\n\nfunction artifactTypeForWorkflowEvent(\n kind: WorkflowTraceEvent['kind'],\n): FeedbackAttempt['artifactType'] | null {\n switch (kind) {\n case 'workflow.agent.ended':\n case 'workflow.agent.failed':\n return 'action'\n case 'workflow.analyst.ended':\n case 'workflow.analyst.failed':\n return 'data'\n case 'workflow.loop.ended':\n case 'workflow.verifier.ended':\n case 'workflow.reviewer.ended':\n case 'workflow.loop.failed':\n case 'workflow.verifier.failed':\n case 'workflow.reviewer.failed':\n return 'decision'\n default:\n return null\n }\n}\n\nfunction iso(timestamp: number | undefined): string {\n return new Date(Number.isFinite(timestamp) ? timestamp! : 0).toISOString()\n}\n","import type { AnalystSeverity, EvidenceRef } from '../analyst/types'\nimport { ValidationError } from '../errors'\nimport { type RunRecord, validateRunRecord } from '../run-record'\nimport {\n type BuildWorkflowAnalystFeedbackPackOptions,\n buildWorkflowAnalystFeedbackPack,\n} from './feedback-pack'\nimport { type WorkflowTraceRunRecordOptions, workflowTraceToRunRecord } from './run-record'\nimport {\n type SanitizedWorkflowTraceEnvelopeResult,\n type SanitizeWorkflowTraceEnvelopeOptions,\n sanitizeWorkflowTraceEnvelope,\n} from './sanitize'\nimport { summarizeWorkflowTrace, validateWorkflowTraceEnvelope } from './schema'\nimport {\n type WorkflowTraceTrajectoryOptions,\n workflowTraceToFeedbackTrajectory,\n} from './trajectory'\nimport type { WorkflowTraceEnvelope, WorkflowTraceExportLinks, WorkflowTraceSummary } from './types'\n\nexport type WorkflowPartnerReportVersion = 'workflow-partner-report-v1'\n\nexport interface WorkflowPartnerFinding {\n source: 'analyst' | 'verifier' | 'failure-cluster'\n severity: AnalystSeverity\n area: string\n claim: string\n evidence: EvidenceRef[]\n recommendedAction?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowPartnerReport {\n schemaVersion: WorkflowPartnerReportVersion\n runId: string\n generatedAt: string\n summary: WorkflowTraceSummary\n docsApiGaps: WorkflowPartnerFinding[]\n prReadyFindings: WorkflowPartnerFinding[]\n failureClusters: ReturnType<typeof buildWorkflowAnalystFeedbackPack>['failureClusters']\n recommendations: string[]\n traceArtifacts: WorkflowTraceEnvelope['artifacts']\n links?: WorkflowTraceExportLinks\n exportBundle: {\n traceEnvelope: WorkflowTraceEnvelope\n sanitization: SanitizedWorkflowTraceEnvelopeResult['report']\n feedbackPack: ReturnType<typeof buildWorkflowAnalystFeedbackPack>\n trajectory: ReturnType<typeof workflowTraceToFeedbackTrajectory>\n runRecord?: RunRecord\n }\n}\n\nexport interface BuildWorkflowPartnerReportOptions\n extends Omit<BuildWorkflowAnalystFeedbackPackOptions, 'envelope'> {\n envelope: WorkflowTraceEnvelope | unknown\n sanitize?: SanitizeWorkflowTraceEnvelopeOptions\n trajectory: WorkflowTraceTrajectoryOptions\n runRecord?: WorkflowTraceRunRecordOptions\n links?: WorkflowTraceExportLinks\n}\n\nconst REPORT_VERSION: WorkflowPartnerReportVersion = 'workflow-partner-report-v1'\n\nexport function buildWorkflowPartnerReport(\n options: BuildWorkflowPartnerReportOptions,\n): WorkflowPartnerReport {\n const sanitized = sanitizeWorkflowTraceEnvelope(options.envelope, options.sanitize)\n const feedbackPack = buildWorkflowAnalystFeedbackPack({\n ...options,\n envelope: sanitized.envelope,\n })\n const trajectory = workflowTraceToFeedbackTrajectory(sanitized.envelope, options.trajectory)\n const runRecord = options.runRecord\n ? workflowTraceToRunRecord(sanitized.envelope, {\n ...options.runRecord,\n runId: sanitized.envelope.runId,\n })\n : undefined\n const analystFindings: WorkflowPartnerFinding[] = feedbackPack.findings.map((finding) => ({\n source: 'analyst' as const,\n severity: finding.severity,\n area: finding.area,\n claim: finding.claim,\n evidence: finding.evidenceRefs,\n ...(finding.recommendedAction ? { recommendedAction: finding.recommendedAction } : {}),\n metadata: {\n findingId: finding.findingId,\n analystId: finding.analystId,\n confidence: finding.confidence,\n ...(finding.subject ? { subject: finding.subject } : {}),\n },\n }))\n const verifierFindings: WorkflowPartnerFinding[] = (feedbackPack.verifier?.layers ?? []).flatMap(\n (layer) =>\n layer.findings.map((finding) => ({\n source: 'verifier' as const,\n severity: finding.severity,\n area: layer.layer,\n claim: finding.message,\n evidence: finding.evidence\n ? ([{ kind: 'artifact', uri: finding.evidence }] satisfies EvidenceRef[])\n : [],\n ...(layer.reason\n ? { recommendedAction: `Fix verifier layer \"${layer.layer}\": ${layer.reason}` }\n : {}),\n metadata: {\n status: layer.status,\n score: layer.score,\n },\n })),\n )\n const clusterFindings: WorkflowPartnerFinding[] = feedbackPack.failureClusters.map((cluster) => ({\n source: 'failure-cluster' as const,\n severity: 'medium' as const,\n area: 'failure-cluster',\n claim: `${cluster.name} affects ${(cluster.share * 100).toFixed(1)}% of failed workflow runs`,\n evidence: cluster.exemplars.map((runId) => ({\n kind: 'artifact' as const,\n uri: `run://${runId}`,\n })),\n ...(cluster.suggestedFix ? { recommendedAction: cluster.suggestedFix } : {}),\n metadata: {\n clusterId: cluster.id,\n runCount: cluster.runCount,\n source: cluster.source,\n },\n }))\n const allFindings = [...analystFindings, ...verifierFindings, ...clusterFindings].sort(\n comparePartnerFindings,\n )\n\n return {\n schemaVersion: REPORT_VERSION,\n runId: sanitized.envelope.runId,\n generatedAt: options.generatedAt ?? feedbackPack.generatedAt,\n summary: feedbackPack.summary,\n docsApiGaps: allFindings.filter(isDocsApiGap),\n prReadyFindings: allFindings.filter(isPrReadyFinding),\n failureClusters: feedbackPack.failureClusters,\n recommendations: feedbackPack.recommendations,\n traceArtifacts: sanitized.envelope.artifacts,\n ...(options.links ? { links: options.links } : {}),\n exportBundle: {\n traceEnvelope: sanitized.envelope,\n sanitization: sanitized.report,\n feedbackPack,\n trajectory,\n ...(runRecord ? { runRecord } : {}),\n },\n }\n}\n\nexport function validateWorkflowPartnerReport(input: unknown): WorkflowPartnerReport {\n const obj = expectRecord(input, 'workflow partner report')\n if (obj.schemaVersion !== REPORT_VERSION) {\n throw new ValidationError(`workflow partner report schemaVersion must be ${REPORT_VERSION}`)\n }\n\n const runId = expectString(obj.runId, 'runId')\n const generatedAt = expectString(obj.generatedAt, 'generatedAt')\n const exportBundle = validateExportBundle(obj.exportBundle, runId)\n const expectedSummary = summarizeWorkflowTrace(exportBundle.traceEnvelope)\n assertJsonEqual(expectRecord(obj.summary, 'summary'), expectedSummary, 'summary')\n assertJsonEqual(\n exportBundle.feedbackPack.summary,\n expectedSummary,\n 'exportBundle.feedbackPack.summary',\n )\n\n const traceArtifacts = validateOptionalArtifacts(obj.traceArtifacts, 'traceArtifacts')\n assertJsonEqual(\n traceArtifacts ?? [],\n exportBundle.traceEnvelope.artifacts ?? [],\n 'traceArtifacts',\n )\n\n return {\n schemaVersion: REPORT_VERSION,\n runId,\n generatedAt,\n summary: expectedSummary,\n docsApiGaps: expectArray(obj.docsApiGaps, 'docsApiGaps') as WorkflowPartnerFinding[],\n prReadyFindings: expectArray(\n obj.prReadyFindings,\n 'prReadyFindings',\n ) as WorkflowPartnerFinding[],\n failureClusters: expectArray(\n obj.failureClusters,\n 'failureClusters',\n ) as WorkflowPartnerReport['failureClusters'],\n recommendations: expectStringArray(obj.recommendations, 'recommendations'),\n traceArtifacts,\n ...(obj.links !== undefined ? { links: validateLinks(obj.links) } : {}),\n exportBundle,\n }\n}\n\nexport function renderWorkflowPartnerReport(\n report: WorkflowPartnerReport,\n options: { maxFindings?: number } = {},\n): string {\n const maxFindings = options.maxFindings ?? 8\n const lines = [\n `Workflow partner report for ${report.runId}`,\n `status=${report.summary.failed ? 'failed' : 'completed'} scoreEvidence events=${report.summary.eventCount} agents=${report.summary.agentCalls} verifier=${report.summary.verifierCalls} analyst=${report.summary.analystCalls} reviewer=${report.summary.reviewerCalls} costUsd=${report.summary.costUsd.toFixed(6)}`,\n report.failureClusters.length > 0 ? 'Failure clusters:' : undefined,\n ...report.failureClusters\n .slice(0, maxFindings)\n .map(\n (cluster) =>\n `- ${cluster.name} share=${cluster.share.toFixed(3)} exemplars=${cluster.exemplars.join(',')}`,\n ),\n report.docsApiGaps.length > 0 ? 'Docs/API gaps:' : undefined,\n ...report.docsApiGaps\n .slice(0, maxFindings)\n .map((finding) => `- ${finding.severity} ${finding.area}: ${finding.claim}`),\n report.prReadyFindings.length > 0 ? 'PR-ready findings:' : undefined,\n ...report.prReadyFindings\n .slice(0, maxFindings)\n .map((finding) => `- ${finding.severity} ${finding.area}: ${finding.claim}`),\n report.recommendations.length > 0 ? 'Recommendations:' : undefined,\n ...report.recommendations.slice(0, maxFindings).map((recommendation) => `- ${recommendation}`),\n ].filter((line): line is string => Boolean(line))\n return lines.join('\\n')\n}\n\nfunction validateExportBundle(\n value: unknown,\n runId: string,\n): WorkflowPartnerReport['exportBundle'] {\n const obj = expectRecord(value, 'exportBundle')\n const traceEnvelope = validateWorkflowTraceEnvelope(obj.traceEnvelope)\n if (traceEnvelope.runId !== runId) {\n throw new ValidationError('exportBundle.traceEnvelope.runId must match report runId')\n }\n\n const feedbackPack = expectRecord(obj.feedbackPack, 'exportBundle.feedbackPack')\n if (feedbackPack.schemaVersion !== 'workflow-feedback-pack-v1') {\n throw new ValidationError(\n 'exportBundle.feedbackPack.schemaVersion must be workflow-feedback-pack-v1',\n )\n }\n if (feedbackPack.runId !== runId) {\n throw new ValidationError('exportBundle.feedbackPack.runId must match report runId')\n }\n expectRecord(feedbackPack.toolUsage, 'exportBundle.feedbackPack.toolUsage')\n expectArray(feedbackPack.failureClusters, 'exportBundle.feedbackPack.failureClusters')\n expectArray(feedbackPack.findings, 'exportBundle.feedbackPack.findings')\n expectStringArray(feedbackPack.recommendations, 'exportBundle.feedbackPack.recommendations')\n expectStringArray(feedbackPack.driverContextLines, 'exportBundle.feedbackPack.driverContextLines')\n\n const trajectory = expectRecord(obj.trajectory, 'exportBundle.trajectory')\n if (trajectory.id !== runId) {\n throw new ValidationError('exportBundle.trajectory.id must match report runId')\n }\n expectArray(trajectory.attempts, 'exportBundle.trajectory.attempts')\n expectArray(trajectory.labels, 'exportBundle.trajectory.labels')\n\n const runRecord =\n obj.runRecord === undefined\n ? undefined\n : validateWorkflowRunRecord(obj.runRecord, traceEnvelope)\n expectRecord(obj.sanitization, 'exportBundle.sanitization')\n\n return {\n traceEnvelope,\n sanitization: obj.sanitization as WorkflowPartnerReport['exportBundle']['sanitization'],\n feedbackPack: obj.feedbackPack as WorkflowPartnerReport['exportBundle']['feedbackPack'],\n trajectory: obj.trajectory as WorkflowPartnerReport['exportBundle']['trajectory'],\n ...(runRecord ? { runRecord } : {}),\n }\n}\n\nfunction validateWorkflowRunRecord(value: unknown, envelope: WorkflowTraceEnvelope): RunRecord {\n const record = validateRunRecord(value)\n const summary = summarizeWorkflowTrace(envelope)\n if (record.runId !== envelope.runId) {\n throw new ValidationError('exportBundle.runRecord.runId must match trace envelope runId')\n }\n if (record.outcome.raw.workflow_events !== summary.eventCount) {\n throw new ValidationError('exportBundle.runRecord outcome does not match trace event count')\n }\n return record\n}\n\nfunction validateLinks(value: unknown): WorkflowTraceExportLinks {\n const obj = expectRecord(value, 'links')\n return {\n ...(obj.traceArtifactUri !== undefined\n ? { traceArtifactUri: expectString(obj.traceArtifactUri, 'links.traceArtifactUri') }\n : {}),\n ...(obj.exportBundleUri !== undefined\n ? { exportBundleUri: expectString(obj.exportBundleUri, 'links.exportBundleUri') }\n : {}),\n ...(obj.partnerReportUri !== undefined\n ? { partnerReportUri: expectString(obj.partnerReportUri, 'links.partnerReportUri') }\n : {}),\n ...(obj.intelligenceRunUri !== undefined\n ? { intelligenceRunUri: expectString(obj.intelligenceRunUri, 'links.intelligenceRunUri') }\n : {}),\n }\n}\n\nfunction validateOptionalArtifacts(\n value: unknown,\n path: string,\n): WorkflowTraceEnvelope['artifacts'] {\n if (value === undefined) return undefined\n return expectArray(value, path).map((item, index) => {\n const itemPath = `${path}[${index}]`\n const obj = expectRecord(item, itemPath)\n return {\n kind: expectString(obj.kind, `${itemPath}.kind`),\n uri: expectString(obj.uri, `${itemPath}.uri`),\n ...(obj.contentType !== undefined\n ? { contentType: expectString(obj.contentType, `${itemPath}.contentType`) }\n : {}),\n ...(obj.sha256 !== undefined\n ? { sha256: expectString(obj.sha256, `${itemPath}.sha256`) }\n : {}),\n ...(obj.metadata !== undefined\n ? { metadata: expectRecord(obj.metadata, `${itemPath}.metadata`) }\n : {}),\n }\n })\n}\n\nfunction expectRecord(value: unknown, path: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError(`${path}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction expectArray(value: unknown, path: string): unknown[] {\n if (!Array.isArray(value)) throw new ValidationError(`${path}: expected array`)\n return value\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`${path}: expected non-empty string`)\n }\n return value\n}\n\nfunction expectStringArray(value: unknown, path: string): string[] {\n return expectArray(value, path).map((item, index) => expectString(item, `${path}[${index}]`))\n}\n\nfunction assertJsonEqual(actual: unknown, expected: unknown, path: string): void {\n if (JSON.stringify(stableJson(actual)) !== JSON.stringify(stableJson(expected))) {\n throw new ValidationError(`${path} does not match trace envelope`)\n }\n}\n\nfunction stableJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stableJson)\n if (!value || typeof value !== 'object') return value\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, child]) => [key, stableJson(child)]),\n )\n}\n\nfunction isDocsApiGap(finding: WorkflowPartnerFinding): boolean {\n const haystack = [\n finding.area,\n finding.claim,\n finding.recommendedAction,\n typeof finding.metadata?.subject === 'string' ? finding.metadata.subject : undefined,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase()\n return /\\b(api|sdk|docs?|documentation|reference|integration|example|quickstart)\\b/.test(haystack)\n}\n\nfunction isPrReadyFinding(finding: WorkflowPartnerFinding): boolean {\n return (\n finding.recommendedAction !== undefined ||\n finding.severity === 'critical' ||\n finding.severity === 'high'\n )\n}\n\nfunction comparePartnerFindings(\n left: WorkflowPartnerFinding,\n right: WorkflowPartnerFinding,\n): number {\n const severityDelta = severityRank(right.severity) - severityRank(left.severity)\n if (severityDelta !== 0) return severityDelta\n return left.area.localeCompare(right.area)\n}\n\nfunction severityRank(severity: AnalystSeverity): number {\n switch (severity) {\n case 'critical':\n return 5\n case 'high':\n return 4\n case 'medium':\n return 3\n case 'low':\n return 2\n case 'info':\n return 1\n }\n}\n","import { ValidationError } from '../errors'\nimport { type RunRecord, validateRunRecord } from '../run-record'\nimport { type PairedBootstrapResult, pairedBootstrap } from '../statistics'\n\nexport type WorkflowDriverPromotionDecisionVersion = 'workflow-driver-promotion-v1'\n\nexport type WorkflowDriverPromotionRejectionCode =\n | 'missing_baseline_records'\n | 'missing_candidate_records'\n | 'missing_holdout_pairs'\n | 'few_pairs'\n | 'insufficient_lift'\n | 'cost_ceiling'\n\nexport interface WorkflowDriverPromotionPair {\n key: string\n scenarioId: string\n seed: number\n baselineRunId: string\n candidateRunId: string\n baselineScore: number\n candidateScore: number\n delta: number\n}\n\nexport interface WorkflowDriverPromotionEvidence {\n pairedRuns: number\n expectedScenarioIds: string[]\n pairedScenarioIds: string[]\n missingScenarioIds: string[]\n baselineMean: number\n candidateMean: number\n lift: number\n liftCi: { low: number; high: number }\n bootstrap: PairedBootstrapResult\n confidence: number\n resamples: number\n statistic: 'mean' | 'median'\n deltaThreshold: number\n baselineMedianCostUsd: number\n candidateMedianCostUsd: number\n pairs: WorkflowDriverPromotionPair[]\n}\n\nexport interface WorkflowDriverPromotionDecision {\n schemaVersion: WorkflowDriverPromotionDecisionVersion\n generatedAt: string\n baselineStrategyId: string\n candidateStrategyId: string\n promote: boolean\n rejectionCode: WorkflowDriverPromotionRejectionCode | null\n reason: string\n evidence: WorkflowDriverPromotionEvidence\n}\n\nexport interface DecideWorkflowDriverPromotionOptions {\n records: readonly RunRecord[] | readonly unknown[]\n baselineStrategyId?: string\n candidateStrategyId?: string\n expectedScenarioIds?: readonly string[]\n minPairedHoldoutRuns?: number\n deltaThreshold?: number\n confidence?: number\n resamples?: number\n seed?: number\n statistic?: 'mean' | 'median'\n costPerRunCeiling?: number\n generatedAt?: string\n}\n\nconst DECISION_VERSION: WorkflowDriverPromotionDecisionVersion = 'workflow-driver-promotion-v1'\nconst DEFAULT_BASELINE_STRATEGY = 'reviewer-loop-v1'\nconst DEFAULT_CANDIDATE_STRATEGY = 'workflow-driver-v1'\n\nexport function decideWorkflowDriverPromotion(\n options: DecideWorkflowDriverPromotionOptions,\n): WorkflowDriverPromotionDecision {\n const records = options.records.map(validateRunRecord)\n const baselineStrategyId = options.baselineStrategyId ?? DEFAULT_BASELINE_STRATEGY\n const candidateStrategyId = options.candidateStrategyId ?? DEFAULT_CANDIDATE_STRATEGY\n const confidence = options.confidence ?? 0.95\n const resamples = options.resamples ?? 2000\n const statistic = options.statistic ?? 'mean'\n const deltaThreshold = options.deltaThreshold ?? 0\n const minPairedHoldoutRuns = options.minPairedHoldoutRuns ?? 3\n validateOptions({ confidence, resamples, deltaThreshold, minPairedHoldoutRuns }, options)\n\n const baseline = records.filter((record) => record.candidateId === baselineStrategyId)\n const candidate = records.filter((record) => record.candidateId === candidateStrategyId)\n const baselineHoldout = baseline.filter(isScoredHoldout)\n const candidateHoldout = candidate.filter(isScoredHoldout)\n const expectedScenarioIds = expectedScenarios(options.expectedScenarioIds, [\n ...baselineHoldout,\n ...candidateHoldout,\n ])\n const expectedScenarioIdSet = new Set(expectedScenarioIds)\n const pairs = pairHoldoutRuns(baselineHoldout, candidateHoldout).filter(\n (pair) => expectedScenarioIdSet.size === 0 || expectedScenarioIdSet.has(pair.scenarioId),\n )\n const pairedScenarioIds = [...new Set(pairs.map((pair) => pair.scenarioId))].sort()\n const missingScenarioIds = expectedScenarioIds.filter((id) => !pairedScenarioIds.includes(id))\n const evidence = buildEvidence({\n pairs,\n expectedScenarioIds,\n pairedScenarioIds,\n missingScenarioIds,\n baseline,\n candidate,\n confidence,\n resamples,\n statistic,\n deltaThreshold,\n seed: options.seed,\n })\n\n if (baselineHoldout.length === 0) {\n return decision({\n options,\n baselineStrategyId,\n candidateStrategyId,\n evidence,\n promote: false,\n rejectionCode: 'missing_baseline_records',\n reason: `missing_baseline_records: no holdout RunRecords for baseline \"${baselineStrategyId}\"`,\n })\n }\n if (candidateHoldout.length === 0) {\n return decision({\n options,\n baselineStrategyId,\n candidateStrategyId,\n evidence,\n promote: false,\n rejectionCode: 'missing_candidate_records',\n reason: `missing_candidate_records: no holdout RunRecords for candidate \"${candidateStrategyId}\"`,\n })\n }\n if (missingScenarioIds.length > 0) {\n return decision({\n options,\n baselineStrategyId,\n candidateStrategyId,\n evidence,\n promote: false,\n rejectionCode: 'missing_holdout_pairs',\n reason: `missing_holdout_pairs: no paired baseline/candidate holdout record for scenario(s) [${missingScenarioIds.join(', ')}]`,\n })\n }\n if (pairs.length < minPairedHoldoutRuns) {\n return decision({\n options,\n baselineStrategyId,\n candidateStrategyId,\n evidence,\n promote: false,\n rejectionCode: 'few_pairs',\n reason: `few_pairs: ${pairs.length} paired holdout run(s) < min ${minPairedHoldoutRuns}`,\n })\n }\n if (!(evidence.liftCi.low > deltaThreshold)) {\n return decision({\n options,\n baselineStrategyId,\n candidateStrategyId,\n evidence,\n promote: false,\n rejectionCode: 'insufficient_lift',\n reason:\n `insufficient_lift: heldout ${statistic} lift=${fmt(evidence.lift)} ` +\n `CI=[${fmt(evidence.liftCi.low)}, ${fmt(evidence.liftCi.high)}] does not clear threshold ${fmt(deltaThreshold)}`,\n })\n }\n if (\n options.costPerRunCeiling !== undefined &&\n Number.isFinite(evidence.candidateMedianCostUsd) &&\n evidence.candidateMedianCostUsd > options.costPerRunCeiling\n ) {\n return decision({\n options,\n baselineStrategyId,\n candidateStrategyId,\n evidence,\n promote: false,\n rejectionCode: 'cost_ceiling',\n reason:\n `cost_ceiling: candidate median cost $${fmt(evidence.candidateMedianCostUsd)} ` +\n `exceeds ceiling $${fmt(options.costPerRunCeiling)}`,\n })\n }\n\n return decision({\n options,\n baselineStrategyId,\n candidateStrategyId,\n evidence,\n promote: true,\n rejectionCode: null,\n reason:\n `promote: ${candidateStrategyId} beats ${baselineStrategyId} on paired heldout workflows ` +\n `lift=${fmt(evidence.lift)} CI=[${fmt(evidence.liftCi.low)}, ${fmt(evidence.liftCi.high)}] ` +\n `over ${pairs.length} pair(s)`,\n })\n}\n\nfunction validateOptions(\n normalized: {\n confidence: number\n resamples: number\n deltaThreshold: number\n minPairedHoldoutRuns: number\n },\n options: DecideWorkflowDriverPromotionOptions,\n): void {\n if (options.records.length === 0) {\n throw new ValidationError('workflow promotion gate requires at least one RunRecord')\n }\n if (normalized.confidence <= 0 || normalized.confidence >= 1) {\n throw new ValidationError('workflow promotion gate confidence must be in (0,1)')\n }\n if (!Number.isInteger(normalized.resamples) || normalized.resamples <= 0) {\n throw new ValidationError('workflow promotion gate resamples must be a positive integer')\n }\n if (!Number.isFinite(normalized.deltaThreshold)) {\n throw new ValidationError('workflow promotion gate deltaThreshold must be finite')\n }\n if (!Number.isInteger(normalized.minPairedHoldoutRuns) || normalized.minPairedHoldoutRuns < 1) {\n throw new ValidationError(\n 'workflow promotion gate minPairedHoldoutRuns must be a positive integer',\n )\n }\n if (\n options.costPerRunCeiling !== undefined &&\n (!Number.isFinite(options.costPerRunCeiling) || options.costPerRunCeiling <= 0)\n ) {\n throw new ValidationError('workflow promotion gate costPerRunCeiling must be positive')\n }\n}\n\nfunction isScoredHoldout(record: RunRecord): boolean {\n return record.splitTag === 'holdout' && typeof record.outcome.holdoutScore === 'number'\n}\n\nfunction expectedScenarios(\n requested: readonly string[] | undefined,\n records: readonly RunRecord[],\n): string[] {\n const values = (requested ?? records.map((record) => record.scenarioId)).filter(isString)\n return [...new Set(values)].sort()\n}\n\nfunction pairHoldoutRuns(\n baseline: readonly RunRecord[],\n candidate: readonly RunRecord[],\n): WorkflowDriverPromotionPair[] {\n const baselineByKey = indexByPairKey(baseline, 'baseline')\n const out: WorkflowDriverPromotionPair[] = []\n for (const candidateRun of candidate) {\n const key = holdoutPairKey(candidateRun, 'candidate')\n const baselineRun = baselineByKey.get(key)\n if (!baselineRun) continue\n const baselineScore = baselineRun.outcome.holdoutScore!\n const candidateScore = candidateRun.outcome.holdoutScore!\n out.push({\n key,\n scenarioId: candidateRun.scenarioId!,\n seed: candidateRun.seed,\n baselineRunId: baselineRun.runId,\n candidateRunId: candidateRun.runId,\n baselineScore,\n candidateScore,\n delta: candidateScore - baselineScore,\n })\n }\n return out.sort((a, b) => a.key.localeCompare(b.key))\n}\n\nfunction indexByPairKey(\n records: readonly RunRecord[],\n side: 'baseline' | 'candidate',\n): Map<string, RunRecord> {\n const out = new Map<string, RunRecord>()\n for (const record of records) {\n const key = holdoutPairKey(record, side)\n if (out.has(key)) {\n throw new ValidationError(\n `workflow promotion gate duplicate ${side} holdout pair key: ${key}`,\n )\n }\n out.set(key, record)\n }\n return out\n}\n\nfunction holdoutPairKey(record: RunRecord, side: 'baseline' | 'candidate'): string {\n if (!record.scenarioId) {\n throw new ValidationError(\n `workflow promotion gate ${side} holdout RunRecord ${record.runId} is missing scenarioId`,\n )\n }\n return `${record.scenarioId}::${record.seed}`\n}\n\nfunction buildEvidence(args: {\n pairs: readonly WorkflowDriverPromotionPair[]\n expectedScenarioIds: string[]\n pairedScenarioIds: string[]\n missingScenarioIds: string[]\n baseline: readonly RunRecord[]\n candidate: readonly RunRecord[]\n confidence: number\n resamples: number\n statistic: 'mean' | 'median'\n deltaThreshold: number\n seed?: number\n}): WorkflowDriverPromotionEvidence {\n const before = args.pairs.map((pair) => pair.baselineScore)\n const after = args.pairs.map((pair) => pair.candidateScore)\n const bootstrap = pairedBootstrap(before, after, {\n confidence: args.confidence,\n resamples: args.resamples,\n statistic: args.statistic,\n ...(args.seed !== undefined ? { seed: args.seed } : {}),\n })\n return {\n pairedRuns: args.pairs.length,\n expectedScenarioIds: args.expectedScenarioIds,\n pairedScenarioIds: args.pairedScenarioIds,\n missingScenarioIds: args.missingScenarioIds,\n baselineMean: mean(before),\n candidateMean: mean(after),\n lift: args.statistic === 'mean' ? bootstrap.mean : bootstrap.median,\n liftCi: { low: bootstrap.low, high: bootstrap.high },\n bootstrap,\n confidence: args.confidence,\n resamples: args.resamples,\n statistic: args.statistic,\n deltaThreshold: args.deltaThreshold,\n baselineMedianCostUsd: medianFinite(args.baseline.map((record) => record.costUsd)),\n candidateMedianCostUsd: medianFinite(args.candidate.map((record) => record.costUsd)),\n pairs: [...args.pairs],\n }\n}\n\nfunction decision(args: {\n options: DecideWorkflowDriverPromotionOptions\n baselineStrategyId: string\n candidateStrategyId: string\n evidence: WorkflowDriverPromotionEvidence\n promote: boolean\n rejectionCode: WorkflowDriverPromotionRejectionCode | null\n reason: string\n}): WorkflowDriverPromotionDecision {\n return {\n schemaVersion: DECISION_VERSION,\n generatedAt: args.options.generatedAt ?? new Date().toISOString(),\n baselineStrategyId: args.baselineStrategyId,\n candidateStrategyId: args.candidateStrategyId,\n promote: args.promote,\n rejectionCode: args.rejectionCode,\n reason: args.reason,\n evidence: args.evidence,\n }\n}\n\nfunction mean(values: readonly number[]): number {\n if (values.length === 0) return Number.NaN\n return values.reduce((sum, value) => sum + value, 0) / values.length\n}\n\nfunction medianFinite(values: readonly number[]): number {\n const finite = values.filter(Number.isFinite).sort((a, b) => a - b)\n if (finite.length === 0) return Number.NaN\n const mid = Math.floor(finite.length / 2)\n return finite.length % 2 === 0 ? (finite[mid - 1]! + finite[mid]!) / 2 : finite[mid]!\n}\n\nfunction fmt(value: number): string {\n if (!Number.isFinite(value)) return String(value)\n return value.toFixed(4)\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0\n}\n","import { ValidationError } from '../errors'\nimport { validateWorkflowTraceEnvelope, validateWorkflowTraceEvent } from './schema'\nimport type { WorkflowTopology, WorkflowTraceArtifact, WorkflowTraceEnvelope } from './types'\n\nexport interface WorkflowTraceEnvelopeFromEventsOptions {\n runId?: string\n topology?: WorkflowTopology\n artifacts?: readonly WorkflowTraceArtifact[]\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowRuntimeResultLike {\n runId?: string\n meta?: unknown\n output?: unknown\n events: readonly unknown[]\n}\n\nexport interface WorkflowRuntimeResultToTraceEnvelopeOptions\n extends Omit<WorkflowTraceEnvelopeFromEventsOptions, 'runId'> {\n runId?: string\n includeOutputInMetadata?: boolean\n}\n\nexport function workflowEventsToTraceEnvelope(\n events: readonly unknown[],\n options: WorkflowTraceEnvelopeFromEventsOptions = {},\n): WorkflowTraceEnvelope {\n if (!Array.isArray(events) || events.length === 0) {\n throw new ValidationError('workflow trace events must be a non-empty array')\n }\n const first = validateWorkflowTraceEvent(events[0])\n const runId = options.runId ?? first.runId\n return validateWorkflowTraceEnvelope({\n traceVersion: 'workflow-trace-v1',\n runId,\n ...(options.topology ? { topology: options.topology } : {}),\n events,\n ...(options.artifacts ? { artifacts: options.artifacts } : {}),\n ...(options.metadata ? { metadata: options.metadata } : {}),\n })\n}\n\nexport function workflowRuntimeResultToTraceEnvelope(\n result: WorkflowRuntimeResultLike,\n options: WorkflowRuntimeResultToTraceEnvelopeOptions = {},\n): WorkflowTraceEnvelope {\n if (!result || typeof result !== 'object') {\n throw new ValidationError('workflow runtime result must be an object')\n }\n const metadata = runtimeResultMetadata(result, options)\n return workflowEventsToTraceEnvelope(result.events, {\n runId: options.runId ?? result.runId,\n ...(options.topology ? { topology: options.topology } : {}),\n ...(options.artifacts ? { artifacts: options.artifacts } : {}),\n ...(metadata ? { metadata } : {}),\n })\n}\n\nfunction runtimeResultMetadata(\n result: WorkflowRuntimeResultLike,\n options: WorkflowRuntimeResultToTraceEnvelopeOptions,\n): Record<string, unknown> | undefined {\n const runtimeResult: Record<string, unknown> = {}\n if (result.meta !== undefined) runtimeResult.meta = result.meta\n if (options.includeOutputInMetadata && result.output !== undefined) {\n runtimeResult.output = result.output\n }\n const hasRuntimeMetadata = Object.keys(runtimeResult).length > 0\n if (!hasRuntimeMetadata && !options.metadata) return undefined\n return {\n ...(options.metadata ?? {}),\n ...(hasRuntimeMetadata ? { runtimeResult } : {}),\n }\n}\n"],"mappings":"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","names":["isRecord","expectRecord","expectString","isRecord","stringValue","expectRecord","expectString","expectArray","expectStringArray","validateLinks","severityRank"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Self-Improvement Substrate — Closed-Loop Roadmap
|
|
2
|
+
|
|
3
|
+
Single source of truth for the agent self-improvement program: the architecture decisions, the end-to-end loop, and a completable checklist. Companion to [`self-improvement-engine.md`](./self-improvement-engine.md) (the phase diagram) — this doc is the *execution* plan.
|
|
4
|
+
|
|
5
|
+
## North star
|
|
6
|
+
|
|
7
|
+
One system under test. **Prod chat == eval == benchmark == self-improvement candidate** all run through the same execution path — a trading-desk backtester you also deploy live. Every improvement is *measured* against that path before it ships, on **any model**, with the full evidence vector preserved (never a scalar collapse).
|
|
8
|
+
|
|
9
|
+
## The closed loop (what we are completing)
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
RUN ───────────► OBSERVE ─────────► DIAGNOSE ─────────► PROPOSE ─────────► EVALUATE ─────────► GATE ─────────► PROMOTE ──┐
|
|
13
|
+
(ExecutionEnv: (OTLP traces, (EYES: competing (HANDS: competing (evidence VECTOR: (pluggable, (PR / config) │
|
|
14
|
+
chat=eval= RunRecords) analysts/HALO → drivers → per-dim judges + versioned, │
|
|
15
|
+
benchmark) AnalystFinding[]) candidates) Pareto frontier + benchmarkable │
|
|
16
|
+
▲ counterfactual) POLICIES) │
|
|
17
|
+
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Two architectural invariants, both load-bearing:
|
|
21
|
+
|
|
22
|
+
### Invariant 1 — Unify the *contract*, pluralize the *strategies*. Never collapse the vector.
|
|
23
|
+
|
|
24
|
+
The temptation ("merge the two loops under one gate") is wrong if it means one scalar criterion. The correct design, mirroring a quant desk:
|
|
25
|
+
|
|
26
|
+
- **Evidence Bus** — a typed, high-dimensional record. Every judge dimension, every driver's proposal, every finding, every counterfactual verdict is preserved. Backed by what we already have: per-dimension `JudgeScore`, `computeParetoFrontier` (`pareto.ts`), the per-driver `DriverComparison` rows (`compare-drivers.ts`). **Nothing is averaged away.**
|
|
27
|
+
- **Proposers** — gepa, skill-opt, evolutionary, analyst-findings, HALO, memory-curation, ACE, and *whatever ships next year* — all implement one `ImprovementDriver`/proposer contract and **compete** on the bus, each proposing different changes. `compareDrivers` already runs this head-to-head; make it first-class for findings-driven proposers too.
|
|
28
|
+
- **Promotion Policies** — pluggable, versioned, and themselves benchmarkable. A policy is a function over the evidence *vector* (Pareto-dominance + per-dimension significance + safety gates), **not** a scalar threshold. Different loops may run different policies; policies compete and are A/B-backtested like strategies.
|
|
29
|
+
|
|
30
|
+
The only thing that is truly *shared* is the **interface** (evidence schema + proposer contract + policy contract). New loops plug in forever. The one non-negotiable: a write path (the findings loop's auto-apply) must flow through *a* policy — today it ships on a bare confidence float with none. Plurality of policies, yes; zero policy on a git-write, no.
|
|
31
|
+
|
|
32
|
+
### Invariant 2 — Everything is a versioned, benchmarkable surface. Including the signatures.
|
|
33
|
+
|
|
34
|
+
Prompts are already optimizable surfaces (GEPA via `analyst-surface.ts`). The **signatures/schemas themselves** (Ax I/O contract, the `AnalystFinding` schema, the kind taxonomy) are currently hand-fixed and unsearched. Three layers, staged by cost:
|
|
35
|
+
|
|
36
|
+
- **(a) Fix known-wrong structure now** — empirically caught, not speculative. The `subject` grammar rejected a valid finding; the kind taxonomy had no "successful-but-suboptimal" lens. → Track A.
|
|
37
|
+
- **(b) Make signatures/schemas versioned + A/B-benchmarkable** through `compareDrivers` (e.g. `findings:json[]` vs `report, findings:json[]` becomes a measured choice). → Track A.
|
|
38
|
+
- **(c) Search signature *structure* + let the analyst critique its own schema** (run the trace-analyst on its own runs; a "schema-fit" finding like "I dropped a row because subject grammar X" — we already have the first such data point). Program/architecture search, expensive, discrete. → **Track B research. Must not block shipping.**
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Track A — Ship (weeks). In-substrate, proven mechanism, properly tested.
|
|
43
|
+
|
|
44
|
+
### A0. Analyst → model-agnostic, HALO-parity *(the live problem; ~2–3 wks to a measured result)*
|
|
45
|
+
|
|
46
|
+
Root cause (probe-verified): our Ax-RLM **fuses** reasoning + JS-sandbox + a strict typed-array emission into every turn; a weak model resolves the fused contract by emitting nothing. HALO **decouples** exploration (free-form + native tool-calls, no schema) from structuring (a deferred sub-call). Fix = decouple + recover-don't-drop + deterministic reducers (the real any-model guarantee) + the right lens.
|
|
47
|
+
|
|
48
|
+
- [x] **A0.1 — Recover the dropped finding (0→1, deterministic).** Widen cluster regex to admit `.`/`_` (exclude `:` — no prefix collision); fix `deriveQuestion` to pass a task directive, not the bare kind id. *Done — `finding-subject.ts:173`, `kind-factory.ts:224`; regression tests in `finding-subject.test.ts` (dotted-subject accepted + prefixed-subjects still route); 93 analyst tests green.*
|
|
49
|
+
- [x] **A0.2 — Forgiving pre-parser** — `src/analyst/parse-tolerant.ts` (`stripCodeFences`/`coerceJson`/`coerceToFindingRows`), wired into `parseRawFinding` (coerce-then-retry before dropping). *Done — 3 tests incl. the arXiv:2605.02363 fence case.*
|
|
50
|
+
- [x] **A0.3 — Deterministic behavioral reducers + analyst** (the any-model keystone). `src/trace-analyst/behavioral-metrics.ts` (`computeTraceMetrics` + signal detectors) + `src/analyst/behavioral-analyst.ts` (`behavioralAnalyst`, `cost.kind:'deterministic'`, + `deriveEfficiencyFindings`). *Done — went past "reducers feeding a prompt": the behavioral class is emitted DIRECTLY by a zero-LLM analyst, so it's any-model by construction (not per-model-measured). E2E on the real `530b157_1`: **4 findings exactly matching HALO's four** (13.1× input growth, 157→75 output decay, 7× single-tool, no self-verify), `status:ok`, deterministic cost. 7 unit tests + 94 suite green.*
|
|
51
|
+
- [x] **A0.4 — Two-phase: free-form `report` + structuring pass.** Ax signature → `report:string, findings:json[]`; `structureFindings` wired into `kind-factory` as opt-in recovery on an empty harvest. **Round-trip live-validated on deepseek** (the `report` populates through Ax's responder; no regression — failure-mode still emits its finding; full suite 1720 green).
|
|
52
|
+
- [ ] **A0.5 — New `efficiency` kind + broaden `failure-mode`.** Non-error-scoped, seeded with the `behavioral` block (HALO's 4 diagnoses); add the `span.attributes['llm.input_tokens']` projection hint. ~2d.
|
|
53
|
+
- [x] **A0.6 — Fail-loud on empty harvest.** `kind-factory` surfaces a visible `info` finding (`outcome: extraction_failed`) carrying the actor's report when the harvest is empty + the report is substantive (≥200 chars); a short/no-report empty stays empty (no false-fire). **Live-validated on deepseek:** `improvement` went from a *silent 0* to a visible report-bearing finding.
|
|
54
|
+
|
|
55
|
+
**Gen-2 also shipped (not in the original A0 list):** `buildDefaultAnalystRegistry` (`src/analyst/default-registry.ts`) — the missing "default suite" primitive: always registers the deterministic `behavioralAnalyst`, adds the agentic kinds when an `ai` is supplied. Carries the **any-model CI regression gate** (≥4 behavioral findings, no LLM). Consumers stop hand-wiring `new AnalystRegistry()`.
|
|
56
|
+
- [ ] **A0.7 — Reflexion retry** in agent-runtime `runAnalystLoop` (the one piece that belongs in runtime, not substrate): Evaluator checks the harvest, on `extraction_failed` appends a critique and retries once. Add a **per-analysis call-count budget** (critique: the pipeline adds ≤4 model calls vs HALO's 1). ~1–2d.
|
|
57
|
+
- [ ] **A0.8 — Terminal gate (reframed, honest).** Re-run the probe on `530b157_1` with deepseek-chat **and** moonshot-v1-128k via the `efficiency` kind; assert ≥4 findings, ≥3 overlapping HALO's four. **Prove with the structurer disabled** (reducer-seeded prose alone) so "any model" is *measured*, not assumed. Wire as a `compareDrivers`/`runProfileMatrix` CI invariant; GEPA-optimize the structurer + efficiency prompts vs goldens for the compounding lift number. ~2–3d.
|
|
58
|
+
|
|
59
|
+
> Honest scorecard: A0.1 is a proven 0→**1** *correctness* finding (zero overlap with HALO's 4 behavioral findings). HALO-parity (≥4) rests on A0.3+A0.5 and is a **hypothesis to measure**, not yet a result.
|
|
60
|
+
|
|
61
|
+
### A1. Evidence Bus + competing pluggable policies *(Invariant 1; ~2–3 wks)*
|
|
62
|
+
|
|
63
|
+
- [x] **A1.1 — Light the dead EYES→HANDS wire.** SHIPPED (PR #161): `renderAnalystEvidence(findings, report)` (severity-ranked, capped, duck-typed) wired into both `gepaDriver` (reflection prompt) and `skillOptDriver` (`findingsNote` → `buildPatchPrompt`); a mutation now targets a NAMED diagnosed root cause, not just low-scoring trials. Loop closure: `runOptimization` gained `analyzeGeneration` — after each generation's candidates score, the producer re-diagnoses and the fresh findings REPLACE `ctx.findings` for the next generation's `propose()` (generic — no analyst import; consumer plugs its registry/HALO). 6 deterministic tests (each driver injects findings+report; producer feeds gen N→N+1; no-producer path stays static). *Remaining (live):* the `compareDrivers` findings-fed vs findings-blind lift CI — an LLM run, not deterministic-shippable.
|
|
64
|
+
- [x] **A1.2 — Promotion-policy contract.** SHIPPED (PR #161): `buildEvidenceVector` (the bus) + `PromotionPolicy = (ev) => GateResult` + `paretoPolicy` (symmetric multi-objective — every axis is gain-source AND floor; ship iff candidate weakly dominates baseline at the confidence level; floor breach → hold, insufficient evidence → need_more_work, no-op → hold) + `paretoSignificanceGate` (bus + policy as a `Gate`, composes via `composeGate`, default loop unchanged). One `contributingGate` per axis — no scalar collapse. `policy?` override runs competing strategies over one bus. Reuses `pairHoldout`/`pairedBootstrap`/`detectScale`. 9 deterministic tests. Policy *registry* + auto-A/B-backtest deferred (needs a labeled promote/rollback corpus).
|
|
65
|
+
- [ ] **A1.3 — Route the findings-loop write path through a policy.** agent-runtime `run-analyst-loop.ts` auto-apply flows through a substrate-exported policy instead of the bare confidence float. (Runtime calls down — no upward dep.)
|
|
66
|
+
- [ ] **A1.4 — MAST-typed findings.** `analyst/types.ts` `area:string` → a MAST-aligned enum reconciled with `FailureClass` (drop multi-agent-only modes). Counterfactual verification (extend `counterfactual.ts` → `verifyFindingCausally`) on a *sampled/triaged* subset, not every finding (frontier LLMs attribute <10% zero-shot — budget it).
|
|
67
|
+
|
|
68
|
+
### A2. More drivers *(fast wins; days each)*
|
|
69
|
+
|
|
70
|
+
- [x] **A2.1 — ACE driver** SHIPPED (PR #161, `src/campaign/drivers/ace.ts`): delta-structured append-mostly playbook — appends provenance-tagged `- [gN] <lesson>` deltas, preserves existing verbatim (anti context-collapse, arXiv:2510.04618), idempotent on recurring findings, FIFO-evicts oldest on overflow (never merges), deterministic, fail-loud. Reuses the shared finding→text helpers (`_findings-text.ts`; memory.ts refactored onto them). 7 deterministic tests. *Remaining (live, same plateau as A1.1):* the `compareDrivers`-on-AppWorld CI'd head-to-head vs gepa/memory — needs the AppWorld env + an open model. Deferred the formal `playbook` MutableSurface kind (string surface suffices for the append-only mechanism).
|
|
71
|
+
- [ ] **A2.2 — `majorityVoteReward`** (`rl/verifiable-reward.ts`): TTRL consensus pseudo-labels over best-of-N fanout, **verifiable subset only** (tax by-line, AppWorld — out of scope for rubric domains), through `heldoutSignificance` + the reward-hacking guard. ~2–3d.
|
|
72
|
+
|
|
73
|
+
### A3. Execution-Environment seam *(the keystone; ~3–4 wks, staged, highest blast radius)*
|
|
74
|
+
|
|
75
|
+
The one-SUT precondition. Specced at `agent-spine.md:58`, never built (zero code refs). `src/loops` and `src/conversation` share zero code today (loop kernel lacks the journal/idempotency/circuit-breaker the conversation kernel has).
|
|
76
|
+
|
|
77
|
+
- [ ] **A3.1 — Define `ExecutionEnvironment`** (`agent-runtime/src/loops/execution-environment.ts`): `{ tools(), invoke(call), workspace, artifacts() }` with `WorkerEnv`/`SandboxEnv`/`DispatchEnv` impls. Additive; `runLoop` accepts an env, default preserves current path.
|
|
78
|
+
- [ ] **A3.2 — Route eval + benchmark + self-improve through it** (lowest-risk paths first). *Gate:* one AppWorld run and one self-improve campaign through the **same** `DispatchEnv` → identical `RunRecord` shape + trace correlation.
|
|
79
|
+
- [ ] **A3.3 — Lift the conversation kernel's distributed primitives** (`journal-sql.ts`/`turn-id.ts`/`call-policy.ts`) into the shared layer; migrate the conversation kernel **last**, behind a deletable shim once parity is proven.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Track B — Research (months, uncertain). Flagship bets; must NOT block Track A.
|
|
84
|
+
|
|
85
|
+
- [ ] **B1 — Logprob-free causal step credit-assignment** (`rl/belief-delta.ts`): ΔP(success) via ablate-and-replay through the opaque `DispatchFn` (no logprobs — the regime everyone ships on; `process-reward.ts:29-33` concedes the gap). Publish a labeled attribution benchmark + leaderboard. *Risk:* replay non-determinism vs N; tool side-effects break replay. SOTA: AgenTracer (2509.03312).
|
|
86
|
+
- [ ] **B2 — Self-distilled small models** (offline): an RLM trace-analyst + a causal-attribution model trained on our corpus exhaust (traces + outcome truth + causally-verified MAST-typed findings). Removes the frontier-root-LM dependency → kills 0-findings brittleness at the root. *Gated on:* B1 producing enough labels + a data-governance/redaction story. SOTA: AgenTracer-8B beats Gemini-2.5-Pro +18%.
|
|
87
|
+
- [ ] **B3 — AZR self-play curriculum with a published anti-reward-hacking guarantee** (`drivers/proposer.ts`): a driver that *emits* scenarios, scored by learnability variance, gated by the reward-hacking detector + bootstrap-CI. The *guarantee* (non-collapse over cycles) is the research deliverable, not a mitigated risk. SOTA: Absolute Zero (2505.03335), TTRL.
|
|
88
|
+
- [ ] **B4 — Signature-structure search + analyst-self-schema-critique** (Invariant 2, layer c): a meta-driver that proposes signature/schema variants and benchmarks them; a "schema-fit" analyst kind that critiques the finding schema. Architecture search — expensive, discrete.
|
|
89
|
+
- [ ] **B5 — Trainable rubric reward models as product** (`rl/rubric-reward-export.ts`) + a Vertical Reward-Model leaderboard. Hypothesis: production-grounded GenRMs beat synthetic OOD. SOTA: GenRM (2410.12832).
|
|
90
|
+
- [ ] **B6 — Verified Vertical RL-Environment Exchange** (`exportVerifiersEnvironment`): wrap `MultiLayerVerifier` as a PrimeIntellect-verifiers Environment so every product agent auto-publishes a verified vertical RL env. *Blocked on legal/compliance for regulated traces (see Out of Scope).*
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Out of scope (now) — not an engineering sprint
|
|
95
|
+
|
|
96
|
+
- Reselling/open-weighting on regulated tax/legal traces: PII/privilege/consent/membership-inference. Legal + compliance gated. B2/B6 must train only on a redacted, consented, gold-ladder-admitted slice; the de-identification pipeline for financial/legal artifacts is itself unsolved.
|
|
97
|
+
|
|
98
|
+
## Research difficulty index
|
|
99
|
+
|
|
100
|
+
| Easy (days) | Medium (1–4 wks) | Hard / research (months) |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| A0.1✓ A0.2 A0.3 A0.5 A0.6 A2.1 A2.2 | A0.4 A0.7 A0.8 A1.* A3.* B5 | B1 B2 B3 B4 B6(+legal) |
|
|
103
|
+
|
|
104
|
+
## Verification discipline (every box)
|
|
105
|
+
|
|
106
|
+
Real e2e (mock only at process boundaries), name the regression each test catches, extend the existing suite, assert exact shapes/CIs, adversarial inputs, fail-loud. The `530b157_1` probe is the analyst-track instrument throughout; `compareDrivers`/`runProfileMatrix` is the CI forcing-function for every driver and the any-model parity gate.
|