@mutagent/helix 0.1.0-alpha.14
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/.claude/skills/mutagent-helix/SKILL.md +113 -0
- package/.claude/skills/mutagent-helix/scripts/cli/codex-transcode.ts +143 -0
- package/.claude/skills/mutagent-helix/scripts/cli/doctor.ts +111 -0
- package/.claude/skills/mutagent-helix/scripts/cli/init.ts +382 -0
- package/.claude/skills/mutagent-helix/scripts/cli/run.sh +61 -0
- package/CLAUDE.md +193 -0
- package/LICENSE +201 -0
- package/NOTICE +22 -0
- package/README.md +209 -0
- package/assets/adl-loop.svg +162 -0
- package/assets/system-status.svg +422 -0
- package/bin/mutagent-cli.mjs +9950 -0
- package/bin/mutagent-helix.mjs +78 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/CLAUDE.md +28 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/SKILL.md +138 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/assets/templates/agentspec.yaml.tpl +247 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/frameworks/doc-pins.md +53 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/principles.md +91 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/requirements.yaml +295 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/workflows/orchestrator-protocol.md +302 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/doctor.ts +116 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/init.ts +230 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/run.sh +60 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/config/resolve-spec-dir.ts +199 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/contract/agentspec.schema.ts +455 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/setup/detect.ts +67 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/validate/validate-spec.ts +93 -0
- package/mutagent-agentspec/LICENSE +201 -0
- package/mutagent-agentspec/NOTICE +19 -0
- package/mutagent-agentspec/README.md +44 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/SKILL.md +100 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-architect.md +312 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-engineer.md +357 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/assets/templates/build-report.md.tpl +39 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/references/principles.md +31 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/build-protocol.md +61 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/improve-handoff.md +23 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/cli/run.sh +60 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/handoff/validate-build-input.ts +72 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/sync-spec/check-sync-spec.ts +499 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/verify/spec-impl-coverage.ts +182 -0
- package/mutagent-builder/CLAUDE.md +25 -0
- package/mutagent-builder/README.md +26 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/README.md +192 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/SKILL.md +352 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-architect.md +256 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-engineer.md +344 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/diagnostics-analyzer.md +576 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/discovery.md +425 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.json.tpl +24 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.md.tpl +49 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/config.yaml.tpl +100 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/pr-body.md.tpl +56 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/report.html.tpl +327 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/README.md +27 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/iter-N-handover.md.tpl +125 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/self-diagnosis-contract.v0.1.0.yaml.tpl +234 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/spec.yaml.tpl +152 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/team.yaml.tpl +127 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/wave-N-dashboard.html.tpl +1712 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.1-nl-query.md +59 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.2-tier0-progress.md +58 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.3-analysis-progress.md +44 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.4-html-report.md +61 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.5-rca-detail.md +69 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.6-stale-warning.md +53 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.1-welcome.md +60 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.2-source-platform-picker.md +41 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.3-source-auth.md +75 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.4-target-picker.md +48 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.5-ask-tool.md +43 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.6-config-review.md +57 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.7-filter-defaults.md +52 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.8-first-run.md +59 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-findings.json +92 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-meta.json +47 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/adapter-strategy.md +75 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config-migration.md +84 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config.md +159 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/filter-search-matrix.md +66 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/harness-knowledge.md +22 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/memory-format.md +78 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/onboarding-decisions.yaml +187 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/operation-inventory.md +59 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/overview.md +167 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/reference.md +119 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/script-index.md +101 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-adapter-contract.md +93 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/claude-code-transcripts.md +66 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex-transcripts.md +78 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex.md +145 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/install-paths.md +57 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/langfuse.md +178 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/local-jsonl.md +55 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/openobserve.md +102 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/otel.md +63 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/cloud-rest.md +84 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-claude.md +65 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cloud-agent-sdk.md +92 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-codex.md +72 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cursor.md +108 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-mastra.md +77 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-opencode.md +70 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/apply-pr-comment-format.md +82 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/diagnostics.md +35 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/handover-contract.md +247 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/onboarding.md +300 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/orchestrator-protocol.md +1861 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rca.md +331 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rendering-anatomy.md +314 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/schedule-prep.md +100 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/scope-model.md +128 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/verification-methodology.md +174 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/aggregate/sort-findings.ts +0 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/blind-spots.ts +167 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/llm-sample.ts +681 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/doctor.ts +215 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/init.ts +1013 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/install-agents.ts +350 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/run.sh +61 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/shared-templates.ts +79 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/load.ts +392 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/resolve-credential.ts +120 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/schema.ts +641 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/validate.ts +134 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/build-diagnosis-context.ts +417 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/load-context.ts +105 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/contract/types.ts +166 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/build-render-input.ts +1964 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/corpus-severity.ts +172 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/dismissal-match.ts +270 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/rank-remedies.ts +75 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/install-hooks.sh +46 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/pre-push.sh +78 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/invocation/parse-brief.ts +188 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/match.ts +114 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/paths.ts +95 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/store.ts +535 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/types.ts +181 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/lint/template-inline-js.ts +267 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/append.ts +188 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/read.ts +218 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/platforms/entity-context.ts +686 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/read-unitf.ts +267 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/trace.ts +1078 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-adapter.ts +0 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-types.ts +213 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/persist-selections.ts +174 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/render.ts +3254 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/diagnose.ts +64 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/session.ts +167 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/caps.ts +345 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/deep-read-gate.ts +424 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/representative.ts +584 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/objection.ts +224 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/trajectory.ts +489 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/dispatch.ts +135 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/probe.ts +170 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/detect.ts +307 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/ensure-cli.ts +315 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/reconfigure.ts +77 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/verify-agents.ts +207 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/slicer.ts +166 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/claude-code.ts +17 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/codex.ts +11 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/langfuse.ts +17 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/local-jsonl.ts +12 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/otel.ts +12 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/index.ts +54 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/registry.ts +45 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/types.ts +86 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/stale-detector.ts +74 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/test/render-playwright.cli.ts +477 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/claude-code.ts +133 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/langfuse.ts +143 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0-scan.ts +423 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/completeness-check.ts +436 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/doc-refs.ts +190 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/finalize-gate.ts +417 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/findings-contract.ts +628 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/render-js-syntax.ts +188 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/report-checklist.yaml +217 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/trace-shape.ts +262 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/wave6-checklist.ts +326 -0
- package/mutagent-diagnostics/CLAUDE.md +41 -0
- package/mutagent-diagnostics/LICENSE +201 -0
- package/mutagent-diagnostics/NOTICE +18 -0
- package/mutagent-diagnostics/README.md +343 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/SKILL.md +548 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/audit-executor.md +169 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/dataset-builder.md +160 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/discovery.md +425 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/evaluator.md +1108 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/theme.css +213 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/wordmark.html +9 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/context-flow-lens.md +85 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/data-lens.md +47 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/decision-lens.md +48 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/methodology-critic-lens.md +53 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/trajectory-lens.md +44 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/build-review-interface.md +83 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/edd-loop.md +134 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/error-analysis.md +113 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-audit.md +154 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-stage.md +168 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/generate-synthetic-data.md +81 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/grounded-adjudication.md +221 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/memory-format.md +65 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/methodology.md +201 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/operation-inventory.md +197 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/validate-evaluator.md +125 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/workflows/orchestrator-protocol.md +300 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/write-judge-prompt.md +123 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/behavior-tree.schema.yaml +73 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/dataset.schema.yaml +66 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/edd-change-request.schema.yaml +114 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/eval-matrix.schema.yaml +74 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-graph.schema.yaml +69 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-profile.schema.yaml +49 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/methodology-review.schema.yaml +40 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/scorecard.schema.yaml +85 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/agent-dispatch.ts +0 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/aggregate-discover.ts +543 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/artifact-paths.ts +115 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/assemble-scorecard.ts +172 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-dataset.ts +186 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-evals.ts +93 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-review-ui.ts +393 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/check-method-router.ts +170 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/aggregate.ts +112 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/audit-run.ts +182 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/doctor.ts +211 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/dogfood.ts +133 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/init.ts +601 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/methodology-review.ts +122 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/prep.ts +295 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/profile-subject.ts +165 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/run.sh +56 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/variance-check.ts +105 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-eval.ts +248 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-quality-verdict.ts +285 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/codegen-evals.ts +173 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-project.ts +151 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-sampler.ts +267 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/load.ts +343 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/schema.ts +380 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/agentspec-evals.ts +85 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/dataset.ts +149 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-engine.ts +118 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-matrix.ts +577 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-types.ts +1074 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/flow-graph.ts +194 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/types.ts +303 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/validation.ts +193 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/derive-dataset.ts +152 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/determine-outcome.ts +219 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/diff-discriminate.ts +160 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/discover-criteria.ts +348 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/change-request.ts +232 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/edd-types.ts +210 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/variance-gate.ts +186 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/emit-completeness.ts +111 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/eval-engine.ts +160 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/evaluate.ts +333 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/flow-graph.ts +230 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-prompt-template.ts +253 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-provider.ts +135 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-grounding.ts +229 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-uniformity.ts +168 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/living-suite.ts +109 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-bundle.ts +203 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile-vocab.ts +64 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile.ts +106 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/mask.ts +138 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/materialize-dataset.ts +113 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/matrix-judge.ts +750 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/append.ts +215 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/read.ts +168 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/persist-eval-criteria.ts +232 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/prep-tasks.ts +125 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/profile-subject.ts +310 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/publish-report.ts +131 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/read-unitf-traces.ts +81 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-build-cards.ts +195 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-discover-report.ts +1640 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-eval-report.ts +3838 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-report.ts +212 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-credential.ts +110 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-ref.ts +98 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/result-verify.ts +129 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/route-failures.ts +330 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-deterministic.ts +367 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-evaluate.ts +719 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-judge.ts +155 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-pipeline.ts +175 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sample-traces.ts +210 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/self-audit.ts +387 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/source-map.ts +106 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/subject-profile.ts +134 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/substrate.ts +162 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sync-eval-criteria.ts +244 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/ui-slots.ts +119 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/unitf-to-evaltrace.ts +284 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/validate-judge.ts +358 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/variance-compare.ts +177 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/behavior-tree.yaml +140 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/eval-matrix.yaml +1270 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/methodology-review.yaml +105 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/audit.workflow.js +82 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/data-leak.workflow.js +236 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/variance.workflow.js +163 -0
- package/mutagent-evaluator/CLAUDE.md +45 -0
- package/mutagent-evaluator/LICENSE +201 -0
- package/mutagent-evaluator/NOTICE +23 -0
- package/mutagent-evaluator/README.md +88 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/SKILL.md +287 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/contracts/amend-request.ts +503 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/improve-loop-run.ts +304 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state-cli.ts +300 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state.ts +440 -0
- package/mutagent-optimize/CLAUDE.md +49 -0
- package/mutagent-optimize/README.md +26 -0
- package/mutagent-orchestrator/CLAUDE.md +102 -0
- package/mutagent-orchestrator/README.md +20 -0
- package/mutagent-orchestrator/assets/agents/discovery.md +425 -0
- package/mutagent-orchestrator/assets/agents/dogfood-monitor.md +266 -0
- package/mutagent-orchestrator/assets/agents/monitor.md +258 -0
- package/mutagent-orchestrator/orchestrator.md +782 -0
- package/mutagent-orchestrator/references/MONITORING.md +209 -0
- package/mutagent-orchestrator/references/config-fields.md +132 -0
- package/mutagent-orchestrator/references/config-migration.md +132 -0
- package/mutagent-orchestrator/references/index-registry.md +92 -0
- package/mutagent-orchestrator/routing.yaml +391 -0
- package/mutagent-orchestrator/scripts/config-schema.ts +1010 -0
- package/mutagent-orchestrator/scripts/dispatch.ts +439 -0
- package/mutagent-orchestrator/scripts/dogfood/extract-feedback.ts +203 -0
- package/mutagent-orchestrator/scripts/dogfood/reconstruct-trajectory.ts +327 -0
- package/mutagent-orchestrator/scripts/dogfood/render-dogfood-report.ts +347 -0
- package/mutagent-orchestrator/scripts/dogfood/resolve-subagents.ts +160 -0
- package/mutagent-orchestrator/scripts/dogfood/run-report.ts +264 -0
- package/mutagent-orchestrator/scripts/dogfood/slack-thread.ts +106 -0
- package/mutagent-orchestrator/scripts/dogfood/types.ts +257 -0
- package/mutagent-orchestrator/scripts/eval-routing.ts +753 -0
- package/mutagent-orchestrator/scripts/gate.ts +219 -0
- package/mutagent-orchestrator/scripts/handover-contract.ts +362 -0
- package/mutagent-orchestrator/scripts/index/build-index.ts +351 -0
- package/mutagent-orchestrator/scripts/index/render-index.ts +110 -0
- package/mutagent-orchestrator/scripts/monitor/slack-notify.ts +111 -0
- package/mutagent-orchestrator/scripts/monitor/triggers.ts +162 -0
- package/mutagent-orchestrator/scripts/onboarding-check.ts +369 -0
- package/mutagent-orchestrator/scripts/render-roster.ts +308 -0
- package/mutagent-orchestrator/scripts/resolve-credential.ts +185 -0
- package/mutagent-orchestrator/scripts/resolve-paths.ts +114 -0
- package/mutagent-orchestrator/scripts/slack/format.ts +63 -0
- package/mutagent-orchestrator/scripts/slack/post.ts +115 -0
- package/mutagent-orchestrator/scripts/sync-index.ts +311 -0
- package/package.json +64 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/artifact-paths.ts — P8 (EV-REQ-058): the localized artifact hierarchy resolver.
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* The EVALUATOR reference implementation of the operator's NO-SPILLOVER goal:
|
|
5
|
+
* every durable artifact the engine writes resolves under ONE namespaced root
|
|
6
|
+
* — `<workspace>/.mutagent/evaluator/` — the evaluator's stage sub-dir of the
|
|
7
|
+
* unified LOCAL `.mutagent/` (sibling to the diagnostics `.mutagent/diagnostics/`
|
|
8
|
+
* precedent; pattern, not import). A published skill
|
|
9
|
+
* running in a CONSUMER's repo therefore never litters their tracked source tree:
|
|
10
|
+
* the root is auto-gitignored (parity with `.mutagent/`).
|
|
11
|
+
*
|
|
12
|
+
* Hierarchy (deterministic):
|
|
13
|
+
* .mutagent/evaluator/
|
|
14
|
+
* runs/<runId>/{ingest,tasks,verdicts,packets,source-map,scorecard}/
|
|
15
|
+
* reports/<runId>/
|
|
16
|
+
* living-suite/
|
|
17
|
+
* datasets/
|
|
18
|
+
*
|
|
19
|
+
* PURE + deterministic: `runId` + `cwd` are PASSED IN — there is NO clock/random in
|
|
20
|
+
* path construction (a runId is never `Date.now()` here), so the same inputs always
|
|
21
|
+
* yield the same paths (C-PIN-safe: P8 changes WHERE artifacts land, never WHAT).
|
|
22
|
+
*
|
|
23
|
+
* NO-SPILLOVER guard: every resolver output flows through `assertUnderRoot`, which
|
|
24
|
+
* THROWS if a path escapes the root (a `..` traversal or an absolute path outside)
|
|
25
|
+
* — so even a malicious path-traversal `runId` fails loud instead of writing
|
|
26
|
+
* outside the namespace.
|
|
27
|
+
*/
|
|
28
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The single namespaced root every durable artifact lives under — the evaluator's
|
|
32
|
+
* stage sub-dir of the unified LOCAL `.mutagent/` (operator decision 2026-06-29;
|
|
33
|
+
* relocated from the former per-stage dot-root).
|
|
34
|
+
*/
|
|
35
|
+
export const ARTIFACT_ROOT_NAME = ".mutagent/evaluator";
|
|
36
|
+
|
|
37
|
+
/** Resolve the artifact root: `<cwd>/.mutagent/evaluator`. `cwd` passed in (pure). */
|
|
38
|
+
export function artifactRoot(cwd: string = process.cwd()): string {
|
|
39
|
+
return resolve(cwd, ARTIFACT_ROOT_NAME);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* NO-SPILLOVER guard. Resolve `path` and assert it is INSIDE `artifactRoot(cwd)`;
|
|
44
|
+
* THROW otherwise (a `..` escape or an absolute path outside the root). Returns the
|
|
45
|
+
* input path unchanged on success (so resolvers can `return assertUnderRoot(...)`).
|
|
46
|
+
*/
|
|
47
|
+
export function assertUnderRoot(path: string, cwd?: string): string {
|
|
48
|
+
const root = artifactRoot(cwd);
|
|
49
|
+
const rel = relative(root, resolve(path));
|
|
50
|
+
if (rel === ".." || rel.startsWith(".." + "/") || rel.startsWith("..\\") || isAbsolute(rel)) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
`assertUnderRoot: path '${path}' ESCAPES the artifact root '${root}' — ` +
|
|
53
|
+
"no-spillover invariant (EV-REQ-058): the engine writes ONLY under its " +
|
|
54
|
+
"namespaced dot-root, never the consumer's tracked source tree.",
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return path;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Internal: join under the root + assert no escape (catches a traversal runId). */
|
|
61
|
+
function underRoot(cwd: string | undefined, ...segments: string[]): string {
|
|
62
|
+
return assertUnderRoot(join(artifactRoot(cwd), ...segments), cwd);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── per-run hierarchy ───────────────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
export function runDir(runId: string, cwd?: string): string {
|
|
68
|
+
return underRoot(cwd, "runs", runId);
|
|
69
|
+
}
|
|
70
|
+
export function ingestDir(runId: string, cwd?: string): string {
|
|
71
|
+
return underRoot(cwd, "runs", runId, "ingest");
|
|
72
|
+
}
|
|
73
|
+
export function tasksDir(runId: string, cwd?: string): string {
|
|
74
|
+
return underRoot(cwd, "runs", runId, "tasks");
|
|
75
|
+
}
|
|
76
|
+
export function verdictsDir(runId: string, cwd?: string): string {
|
|
77
|
+
return underRoot(cwd, "runs", runId, "verdicts");
|
|
78
|
+
}
|
|
79
|
+
export function packetsDir(runId: string, cwd?: string): string {
|
|
80
|
+
return underRoot(cwd, "runs", runId, "packets");
|
|
81
|
+
}
|
|
82
|
+
export function sourceMapDir(runId: string, cwd?: string): string {
|
|
83
|
+
return underRoot(cwd, "runs", runId, "source-map");
|
|
84
|
+
}
|
|
85
|
+
export function scorecardDir(runId: string, cwd?: string): string {
|
|
86
|
+
return underRoot(cwd, "runs", runId, "scorecard");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ── cross-run hierarchy ─────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
export function reportDir(runId: string, cwd?: string): string {
|
|
92
|
+
return underRoot(cwd, "reports", runId);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ── the three named report artifacts (evaluator-reports PRD R-1/R-3) ──────────
|
|
96
|
+
// Distinct names under ONE run folder — no `report.html` collision, and *audit no longer
|
|
97
|
+
// writes under `.mutagent/diagnostics/`. Single resolver = single source of truth.
|
|
98
|
+
/** `*evaluate` → the 5-tab judge report. */
|
|
99
|
+
export function evaluationReportPath(runId: string, cwd?: string): string {
|
|
100
|
+
return underRoot(cwd, "reports", runId, "evaluation-report.html");
|
|
101
|
+
}
|
|
102
|
+
/** `*discover-evals` → the mined-criteria report. */
|
|
103
|
+
export function discoveryReportPath(runId: string, cwd?: string): string {
|
|
104
|
+
return underRoot(cwd, "reports", runId, "discovery-report.html");
|
|
105
|
+
}
|
|
106
|
+
/** `*audit` → the 4-tab master-audit (now under the evaluator root, not diagnostics). */
|
|
107
|
+
export function masterAuditPath(runId: string, cwd?: string): string {
|
|
108
|
+
return underRoot(cwd, "reports", runId, "master-audit.html");
|
|
109
|
+
}
|
|
110
|
+
export function livingSuiteDir(cwd?: string): string {
|
|
111
|
+
return underRoot(cwd, "living-suite");
|
|
112
|
+
}
|
|
113
|
+
export function datasetsDir(cwd?: string): string {
|
|
114
|
+
return underRoot(cwd, "datasets");
|
|
115
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/assemble-scorecard.ts
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* The two-track rollup (decision #5). GATE and TREND are assembled SEPARATELY
|
|
5
|
+
* and NEVER merged.
|
|
6
|
+
*
|
|
7
|
+
* Track-1 GATE — binary, severity-gated. Component PASS iff 0 CRIT/HIGH rows
|
|
8
|
+
* FAIL. Run PASS iff every component passes. (skip != fail.)
|
|
9
|
+
* Track-2 TREND — the manual's 15-dim variance score, carried verbatim from
|
|
10
|
+
* the variance comparator (or an empty/zeroed frame on a
|
|
11
|
+
* single-run audit).
|
|
12
|
+
*
|
|
13
|
+
* Pure + deterministic: rows are grouped in stable order; no clock/random. The
|
|
14
|
+
* generatedAt is injected by the caller so byte-identity masking is satisfiable.
|
|
15
|
+
*/
|
|
16
|
+
import {
|
|
17
|
+
type CoverageOptions,
|
|
18
|
+
type DeterministicRowResult,
|
|
19
|
+
computeCoverage,
|
|
20
|
+
} from "./run-deterministic.ts";
|
|
21
|
+
import {
|
|
22
|
+
type GateComponent,
|
|
23
|
+
type RunVerdictValue,
|
|
24
|
+
type Scorecard,
|
|
25
|
+
type ScorecardCriterion,
|
|
26
|
+
type TrendDimension,
|
|
27
|
+
RowResult,
|
|
28
|
+
RunVerdict,
|
|
29
|
+
Severity,
|
|
30
|
+
} from "./contracts/types.ts";
|
|
31
|
+
|
|
32
|
+
const GATING_SEVERITIES: ReadonlySet<string> = new Set([
|
|
33
|
+
Severity.Crit,
|
|
34
|
+
Severity.High,
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
export interface AssembleInput {
|
|
38
|
+
subject: string;
|
|
39
|
+
runId: string;
|
|
40
|
+
generatedAt: string;
|
|
41
|
+
rows: DeterministicRowResult[];
|
|
42
|
+
/** Track-2 trend dimensions (from variance-compare). Empty on single-run. */
|
|
43
|
+
trendDimensions?: TrendDimension[];
|
|
44
|
+
trendRunPair?: { a: string; b: string };
|
|
45
|
+
/**
|
|
46
|
+
* Coverage-honesty options (EV-OUT-002). Controls the skip-rate WARNING
|
|
47
|
+
* threshold only — never alters gate pass/fail. Defaults preserve behavior.
|
|
48
|
+
*/
|
|
49
|
+
coverageOptions?: CoverageOptions;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Group rows by componentId, preserving first-seen order. */
|
|
53
|
+
function groupByComponent(
|
|
54
|
+
rows: DeterministicRowResult[],
|
|
55
|
+
): { componentId: string; criteria: ScorecardCriterion[] }[] {
|
|
56
|
+
const order: string[] = [];
|
|
57
|
+
const map = new Map<string, ScorecardCriterion[]>();
|
|
58
|
+
for (const r of rows) {
|
|
59
|
+
if (!map.has(r.componentId)) {
|
|
60
|
+
map.set(r.componentId, []);
|
|
61
|
+
order.push(r.componentId);
|
|
62
|
+
}
|
|
63
|
+
map.get(r.componentId)!.push(r.criterion);
|
|
64
|
+
}
|
|
65
|
+
return order.map((componentId) => ({
|
|
66
|
+
componentId,
|
|
67
|
+
criteria: map.get(componentId)!,
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Track-1: a component passes iff no CRIT/HIGH criterion FAILED (skip != fail). */
|
|
72
|
+
function componentPass(criteria: ScorecardCriterion[]): boolean {
|
|
73
|
+
return !criteria.some(
|
|
74
|
+
(c) => c.result === RowResult.Fail && GATING_SEVERITIES.has(c.severity),
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* GA — the component TERNARY verdict `fail ▸ incomplete ▸ pass`:
|
|
80
|
+
* fail iff a CRIT/HIGH criterion FAILED.
|
|
81
|
+
* incomplete iff (no CRIT/HIGH fail) AND a CRIT/HIGH criterion was INDETERMINATE.
|
|
82
|
+
* pass otherwise.
|
|
83
|
+
* The v1 audit path never emits `incomplete` rows ⇒ this returns pass/fail only
|
|
84
|
+
* there (byte-compatible with `componentPass`).
|
|
85
|
+
*/
|
|
86
|
+
function componentVerdict(criteria: ScorecardCriterion[]): RunVerdictValue {
|
|
87
|
+
const gatingFail = criteria.some(
|
|
88
|
+
(c) => c.result === RowResult.Fail && GATING_SEVERITIES.has(c.severity),
|
|
89
|
+
);
|
|
90
|
+
if (gatingFail) return RunVerdict.Fail;
|
|
91
|
+
const gatingIndeterminate = criteria.some(
|
|
92
|
+
(c) => c.result === RowResult.Incomplete && GATING_SEVERITIES.has(c.severity),
|
|
93
|
+
);
|
|
94
|
+
return gatingIndeterminate ? RunVerdict.Incomplete : RunVerdict.Pass;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function assembleScorecard(input: AssembleInput): Scorecard {
|
|
98
|
+
const grouped = groupByComponent(input.rows);
|
|
99
|
+
|
|
100
|
+
const gateComponents: GateComponent[] = grouped.map((g) => ({
|
|
101
|
+
componentId: g.componentId,
|
|
102
|
+
pass: componentPass(g.criteria),
|
|
103
|
+
verdict: componentVerdict(g.criteria),
|
|
104
|
+
criteria: g.criteria,
|
|
105
|
+
}));
|
|
106
|
+
|
|
107
|
+
// Totals across ALL criteria (both tracks).
|
|
108
|
+
let pass = 0;
|
|
109
|
+
let fail = 0;
|
|
110
|
+
let skip = 0;
|
|
111
|
+
let critFail = 0;
|
|
112
|
+
let highFail = 0;
|
|
113
|
+
let incomplete = 0;
|
|
114
|
+
for (const g of gateComponents) {
|
|
115
|
+
for (const c of g.criteria) {
|
|
116
|
+
if (c.result === RowResult.Pass) pass += 1;
|
|
117
|
+
else if (c.result === RowResult.Fail) {
|
|
118
|
+
fail += 1;
|
|
119
|
+
if (c.severity === Severity.Crit) critFail += 1;
|
|
120
|
+
else if (c.severity === Severity.High) highFail += 1;
|
|
121
|
+
} else if (c.result === RowResult.Incomplete) incomplete += 1;
|
|
122
|
+
else skip += 1;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// GA — the ternary run verdict: fail ▸ incomplete ▸ pass.
|
|
127
|
+
const runVerdict: RunVerdictValue = gateComponents.some(
|
|
128
|
+
(g) => g.verdict === RunVerdict.Fail,
|
|
129
|
+
)
|
|
130
|
+
? RunVerdict.Fail
|
|
131
|
+
: gateComponents.some((g) => g.verdict === RunVerdict.Incomplete)
|
|
132
|
+
? RunVerdict.Incomplete
|
|
133
|
+
: RunVerdict.Pass;
|
|
134
|
+
// back-compat: runPass is now exactly `runVerdict === "pass"`. For the v1 audit
|
|
135
|
+
// path (which never emits `incomplete` rows) this is byte-identical to the old
|
|
136
|
+
// `every(component.pass)`; GA's only behavior delta is incomplete ⇒ runPass=false.
|
|
137
|
+
const runPass = runVerdict === RunVerdict.Pass;
|
|
138
|
+
|
|
139
|
+
// Coverage honesty (EV-OUT-002): graded-vs-total + skip-rate warning, derived
|
|
140
|
+
// from the SAME totals the gate uses. Warning-only — `runPass` above is the
|
|
141
|
+
// sole pass/fail authority; coverage NEVER mutates it.
|
|
142
|
+
const coverage = computeCoverage(
|
|
143
|
+
{ pass, fail, skip },
|
|
144
|
+
input.coverageOptions,
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// Track-2 TREND: assembled SEPARATELY. varianceScore = count of dimensions
|
|
148
|
+
// that diverged beyond target.
|
|
149
|
+
const dimensions = input.trendDimensions ?? [];
|
|
150
|
+
const varianceScore = dimensions.filter(
|
|
151
|
+
(d) => d.divergence === "diverged",
|
|
152
|
+
).length;
|
|
153
|
+
|
|
154
|
+
const scorecard: Scorecard = {
|
|
155
|
+
subject: input.subject,
|
|
156
|
+
runId: input.runId,
|
|
157
|
+
generatedAt: input.generatedAt,
|
|
158
|
+
coverage,
|
|
159
|
+
gate: {
|
|
160
|
+
runPass,
|
|
161
|
+
runVerdict,
|
|
162
|
+
components: gateComponents,
|
|
163
|
+
totals: { pass, fail, skip, critFail, highFail, incomplete },
|
|
164
|
+
},
|
|
165
|
+
trend: {
|
|
166
|
+
...(input.trendRunPair ? { runPair: input.trendRunPair } : {}),
|
|
167
|
+
dimensions,
|
|
168
|
+
varianceScore,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
return scorecard;
|
|
172
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/build-dataset.ts — EV-046 `*build-dataset` deterministic half (Type A — DATA only).
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* The Code-only piece of the 3-way `*build-dataset` Hybrid (operation-inventory):
|
|
5
|
+
* - HITL seed interview (~10 tuples) → AskUserQuestion / chat gate
|
|
6
|
+
* - tuple gen · NL query · quality judgment → `assets/agents/dataset-builder.md`
|
|
7
|
+
* - cartesian expand · dedup · near-dup · id · append → THIS FILE
|
|
8
|
+
*
|
|
9
|
+
* Holds NO prompt prose and makes NO realism judgment (that is the agent's). It
|
|
10
|
+
* only does the deterministic shape: enumerate the dimension cartesian product,
|
|
11
|
+
* drop exact + near-duplicate cases, assign a content-derived id, and merge into
|
|
12
|
+
* the growing dataset MONOTONICALLY (existing cases are never dropped). The
|
|
13
|
+
* near-duplicate REMOVAL is deterministic token-Jaccard — the agent PROPOSES
|
|
14
|
+
* realism, the script ENFORCES non-redundancy.
|
|
15
|
+
*
|
|
16
|
+
* PURE — no clock / random / network. Same (input) → same output (reproducible
|
|
17
|
+
* datasets, C-PIN-adjacent). Subject-agnostic (dimensions are DATA).
|
|
18
|
+
*/
|
|
19
|
+
import {
|
|
20
|
+
type Dataset,
|
|
21
|
+
type DatasetCase,
|
|
22
|
+
type DatasetTuple,
|
|
23
|
+
type Dimension,
|
|
24
|
+
type CaseSourceValue,
|
|
25
|
+
tupleKey,
|
|
26
|
+
} from "./contracts/dataset.ts";
|
|
27
|
+
import { appendOnly, assertMonotonicGrowth } from "./living-suite.ts";
|
|
28
|
+
|
|
29
|
+
// ── cartesian tuples (generate-synthetic-data Step 2 mechanics) ──────────────
|
|
30
|
+
|
|
31
|
+
/** Guard so a pathological dimension set can't blow up memory. */
|
|
32
|
+
const DEFAULT_MAX_TUPLES = 5000;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The full cartesian product of the dimensions' values, in a DETERMINISTIC
|
|
36
|
+
* order (dimensions in given order, values in given order). THROWS if the
|
|
37
|
+
* product would exceed `maxTuples` (fail-loud, not silent truncation). PURE.
|
|
38
|
+
*/
|
|
39
|
+
export function cartesianTuples(
|
|
40
|
+
dimensions: Dimension[],
|
|
41
|
+
maxTuples = DEFAULT_MAX_TUPLES,
|
|
42
|
+
): DatasetTuple[] {
|
|
43
|
+
if (dimensions.length === 0) return [];
|
|
44
|
+
const total = dimensions.reduce((n, d) => n * d.values.length, 1);
|
|
45
|
+
if (total > maxTuples) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`cartesianTuples: ${total} combinations exceeds maxTuples=${maxTuples}. ` +
|
|
48
|
+
"Reduce dimensions/values or raise the cap explicitly (no silent truncation).",
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
let acc: DatasetTuple[] = [{}];
|
|
52
|
+
for (const dim of dimensions) {
|
|
53
|
+
const next: DatasetTuple[] = [];
|
|
54
|
+
for (const partial of acc) {
|
|
55
|
+
for (const v of dim.values) next.push({ ...partial, [dim.name]: v });
|
|
56
|
+
}
|
|
57
|
+
acc = next;
|
|
58
|
+
}
|
|
59
|
+
return acc;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Remove exact-duplicate tuples by canonical key, preserving first-seen order. PURE. */
|
|
63
|
+
export function dedupTuples(tuples: DatasetTuple[]): DatasetTuple[] {
|
|
64
|
+
const seen = new Set<string>();
|
|
65
|
+
const out: DatasetTuple[] = [];
|
|
66
|
+
for (const t of tuples) {
|
|
67
|
+
const k = tupleKey(t);
|
|
68
|
+
if (!seen.has(k)) {
|
|
69
|
+
seen.add(k);
|
|
70
|
+
out.push(t);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ── near-duplicate query filter (generate-synthetic-data Step 5) ─────────────
|
|
77
|
+
|
|
78
|
+
/** Normalize a query to a token set (lowercase word tokens). PURE. */
|
|
79
|
+
export function queryTokens(q: string): Set<string> {
|
|
80
|
+
return new Set(
|
|
81
|
+
q
|
|
82
|
+
.toLowerCase()
|
|
83
|
+
.split(/[^a-z0-9]+/)
|
|
84
|
+
.filter((t) => t.length > 0),
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Token-set Jaccard similarity in [0,1]. Two empty sets → 1 (identical). PURE. */
|
|
89
|
+
export function jaccard(a: Set<string>, b: Set<string>): number {
|
|
90
|
+
if (a.size === 0 && b.size === 0) return 1;
|
|
91
|
+
let inter = 0;
|
|
92
|
+
for (const t of a) if (b.has(t)) inter++;
|
|
93
|
+
const union = a.size + b.size - inter;
|
|
94
|
+
return union === 0 ? 0 : inter / union;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Drop cases whose query is ≥ `threshold` Jaccard-similar to an already-kept
|
|
99
|
+
* case (the "queries too similar to each other" filter). DETERMINISTIC — first
|
|
100
|
+
* occurrence in input order is kept. PURE.
|
|
101
|
+
*/
|
|
102
|
+
export function dedupNearQueries(cases: DatasetCase[], threshold = 0.8): DatasetCase[] {
|
|
103
|
+
const keptTokens: Set<string>[] = [];
|
|
104
|
+
const out: DatasetCase[] = [];
|
|
105
|
+
for (const c of cases) {
|
|
106
|
+
const toks = queryTokens(c.query);
|
|
107
|
+
const dup = keptTokens.some((k) => jaccard(toks, k) >= threshold);
|
|
108
|
+
if (!dup) {
|
|
109
|
+
keptTokens.push(toks);
|
|
110
|
+
out.push(c);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ── deterministic content-derived case id (no clock/random) ──────────────────
|
|
117
|
+
|
|
118
|
+
/** FNV-1a 32-bit hex of a string — a stable, dependency-free content hash. PURE. */
|
|
119
|
+
export function fnv1aHex(s: string): string {
|
|
120
|
+
let h = 0x811c9dc5;
|
|
121
|
+
for (let i = 0; i < s.length; i++) {
|
|
122
|
+
h ^= s.charCodeAt(i);
|
|
123
|
+
h = Math.imul(h, 0x01000193);
|
|
124
|
+
}
|
|
125
|
+
return (h >>> 0).toString(16).padStart(8, "0");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** A stable id derived from the tuple + query (so re-builds collide → dedup). PURE. */
|
|
129
|
+
export function caseId(tuple: DatasetTuple, query: string): string {
|
|
130
|
+
return `case-${fnv1aHex(`${tupleKey(tuple)}::${query}`)}`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Assemble a DatasetCase with a content-derived id. PURE. */
|
|
134
|
+
export function buildCase(
|
|
135
|
+
tuple: DatasetTuple,
|
|
136
|
+
query: string,
|
|
137
|
+
source: CaseSourceValue,
|
|
138
|
+
originTraceId?: string,
|
|
139
|
+
extra?: { selectedBy?: string; rationale?: string },
|
|
140
|
+
): DatasetCase {
|
|
141
|
+
const c: DatasetCase = { id: caseId(tuple, query), tuple, query, source };
|
|
142
|
+
if (originTraceId !== undefined) c.originTraceId = originTraceId;
|
|
143
|
+
if (extra?.selectedBy !== undefined) c.selectedBy = extra.selectedBy;
|
|
144
|
+
if (extra?.rationale !== undefined) c.rationale = extra.rationale;
|
|
145
|
+
return c;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ── monotonic merge into the growing dataset (EV-053 co-develop) ─────────────
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Merge incoming cases into existing, deduped by id AND near-duplicate query,
|
|
152
|
+
* MONOTONICALLY — every existing case is retained (the suite never shrinks); only
|
|
153
|
+
* genuinely-novel, non-near-duplicate incoming cases are added. DETERMINISTIC.
|
|
154
|
+
* Routes the append through `living-suite.ts` (`appendOnly` for the id-dedup +
|
|
155
|
+
* `assertMonotonicGrowth` for the EV-053 invariant); the near-duplicate-query
|
|
156
|
+
* filter is the dataset-specific specialization layered on top.
|
|
157
|
+
*/
|
|
158
|
+
export function mergeCases(
|
|
159
|
+
existing: DatasetCase[],
|
|
160
|
+
incoming: DatasetCase[],
|
|
161
|
+
threshold = 0.8,
|
|
162
|
+
): DatasetCase[] {
|
|
163
|
+
const byId = new Set(existing.map((c) => c.id));
|
|
164
|
+
// near-dup filter the novel cases against the existing queries first, then each other.
|
|
165
|
+
const keptTokens: Set<string>[] = existing.map((c) => queryTokens(c.query));
|
|
166
|
+
const novel: DatasetCase[] = [];
|
|
167
|
+
for (const c of incoming) {
|
|
168
|
+
if (byId.has(c.id)) continue;
|
|
169
|
+
const toks = queryTokens(c.query);
|
|
170
|
+
if (keptTokens.some((k) => jaccard(toks, k) >= threshold)) continue;
|
|
171
|
+
keptTokens.push(toks);
|
|
172
|
+
novel.push(c);
|
|
173
|
+
}
|
|
174
|
+
const out = appendOnly(existing, novel, (c) => c.id); // monotonic append via living-suite
|
|
175
|
+
assertMonotonicGrowth(existing, out, (c) => c.id); // EV-053 invariant (fail-loud)
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Append cases into a Dataset, bumping the version. MONOTONIC: `cases` only
|
|
181
|
+
* grows. Returns a NEW Dataset (no mutation). DETERMINISTIC.
|
|
182
|
+
*/
|
|
183
|
+
export function appendToDataset(dataset: Dataset, incoming: DatasetCase[], threshold = 0.8): Dataset {
|
|
184
|
+
const cases = mergeCases(dataset.cases, incoming, threshold);
|
|
185
|
+
return { ...dataset, cases, version: dataset.version + 1 };
|
|
186
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/build-evals.ts — EV-043 `*build-evals` judge-SPEC builder (Type A — DATA only).
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* Assembles the DATA a per-criterion judge needs (the 4-component judge SPEC) +
|
|
5
|
+
* the held-out TRAIN/EVAL split + the data-leakage guard. The judging itself —
|
|
6
|
+
* rendering the prompt + producing the verdict — is NOT here:
|
|
7
|
+
* - under the DEFAULT agent-dispatch substrate the verdict comes from a
|
|
8
|
+
* dispatched `eval-judge` subagent (the rubric is in `eval-judge.md`);
|
|
9
|
+
* - the OPTIONAL in-house/export prompt rendering + run-wrapper (`runJudge`)
|
|
10
|
+
* live in `judge-prompt-template.ts` (the EV-050 exception).
|
|
11
|
+
*
|
|
12
|
+
* Script austerity (operator directive): this script holds NO judge prompt and
|
|
13
|
+
* NO LLM-reasoning logic. It keeps only the Type-A pieces:
|
|
14
|
+
* 1. the held-out split (`splitTrainEval`) — deterministic, reproducible;
|
|
15
|
+
* 2. the data-leakage guard (`assertExemplarsFromTrain`) — few-shot from TRAIN
|
|
16
|
+
* only, or THROW;
|
|
17
|
+
* 3. the 4-component judge SPEC (`buildJudgeSpec`) — DATA (criterion statement,
|
|
18
|
+
* binary Pass/Fail definitions, few-shot), NO Likert.
|
|
19
|
+
* PURE — no clock/random/network.
|
|
20
|
+
*/
|
|
21
|
+
import type { LabeledTrace } from "./sample-traces.ts";
|
|
22
|
+
import {
|
|
23
|
+
type DiscoveredCriterion,
|
|
24
|
+
type JudgeExemplar,
|
|
25
|
+
type JudgeSpec,
|
|
26
|
+
} from "./contracts/eval-types.ts";
|
|
27
|
+
|
|
28
|
+
/** A pinned judge declaration. Pinned iff modelId present AND temperature===0. */
|
|
29
|
+
export interface JudgePin {
|
|
30
|
+
modelId: string;
|
|
31
|
+
temperature: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface TrainEvalSplit {
|
|
35
|
+
/** the small TRAIN split — few-shot exemplars are drawn ONLY from here. */
|
|
36
|
+
train: LabeledTrace[];
|
|
37
|
+
/** the held-out EVAL split — judges are validated/run against this. */
|
|
38
|
+
evalSet: LabeledTrace[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Set aside a TRAIN split (default 15%, the 10-20% band) for few-shot, holding
|
|
43
|
+
* out the rest for eval. Deterministic: orders by traceId, takes the first
|
|
44
|
+
* fraction as train (no random, no clock) so splits are reproducible.
|
|
45
|
+
*/
|
|
46
|
+
export function splitTrainEval(
|
|
47
|
+
labeled: LabeledTrace[],
|
|
48
|
+
trainFraction = 0.15,
|
|
49
|
+
): TrainEvalSplit {
|
|
50
|
+
const ordered = [...labeled].sort((a, b) => a.trace.id.localeCompare(b.trace.id));
|
|
51
|
+
const n = Math.max(0, Math.min(ordered.length, Math.round(ordered.length * trainFraction)));
|
|
52
|
+
return { train: ordered.slice(0, n), evalSet: ordered.slice(n) };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Guard against data leakage: every few-shot exemplar MUST come from the train
|
|
57
|
+
* split. A dev/test exemplar used as few-shot is leakage — THROW.
|
|
58
|
+
*/
|
|
59
|
+
export function assertExemplarsFromTrain(
|
|
60
|
+
exemplars: JudgeExemplar[],
|
|
61
|
+
trainIds: ReadonlySet<string>,
|
|
62
|
+
): void {
|
|
63
|
+
for (const ex of exemplars) {
|
|
64
|
+
if (!trainIds.has(ex.traceId)) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`assertExemplarsFromTrain: exemplar '${ex.traceId}' is NOT in the train ` +
|
|
67
|
+
"split — using a dev/test trace as a few-shot example is DATA LEAKAGE. " +
|
|
68
|
+
"Draw few-shot only from splitTrainEval().train.",
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Build the judge spec (4 components) for one criterion. Pass def = the
|
|
76
|
+
* criterion statement; fail def = its negation. Few-shot is validated against
|
|
77
|
+
* the train split (leakage guard). PURE.
|
|
78
|
+
*/
|
|
79
|
+
export function buildJudgeSpec(
|
|
80
|
+
criterion: DiscoveredCriterion,
|
|
81
|
+
fewShot: JudgeExemplar[],
|
|
82
|
+
trainIds: ReadonlySet<string>,
|
|
83
|
+
): JudgeSpec {
|
|
84
|
+
assertExemplarsFromTrain(fewShot, trainIds);
|
|
85
|
+
return {
|
|
86
|
+
criterionId: criterion.id,
|
|
87
|
+
statement: criterion.statement,
|
|
88
|
+
passDefinition: `Pass = ${criterion.statement}.`,
|
|
89
|
+
failDefinition: `Fail = the agent fails to satisfy: ${criterion.statement}.`,
|
|
90
|
+
fewShot,
|
|
91
|
+
judgeKind: criterion.judgeKind,
|
|
92
|
+
};
|
|
93
|
+
}
|