@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,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/build-review-ui.ts — EV-045 `*review` annotation-UI renderer (Type A — DATA/template only).
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* The Code-only half of the `*review` Hybrid (operation-inventory): a
|
|
5
|
+
* DETERMINISTIC HTML template (like `render-report.ts`) that emits a
|
|
6
|
+
* browser-based human-annotation interface + a labels-persistence merge. The
|
|
7
|
+
* HITL half — a human clicking Pass/Fail/Defer in the browser — is the LLM-only
|
|
8
|
+
* piece (`references/build-review-interface.md`).
|
|
9
|
+
*
|
|
10
|
+
* What it produces (build-review-interface.md):
|
|
11
|
+
* - one trace per screen, rendered in human-readable native form (escaped +
|
|
12
|
+
* collapsible), full trace accessible, color-coded by role;
|
|
13
|
+
* - binary Pass/Fail + a Defer button + a free-text notes field;
|
|
14
|
+
* - keyboard shortcuts (arrows · 1/2/D · U · Cmd+S · Cmd+Enter);
|
|
15
|
+
* - auto-save on every action (localStorage) + a labels export;
|
|
16
|
+
* - a trace counter + jump-to-id + labeled/unlabeled counts.
|
|
17
|
+
*
|
|
18
|
+
* Austerity: holds NO judge prompt, makes NO pass/fail decision (the HUMAN
|
|
19
|
+
* decides). DETERMINISTIC: `renderReviewUi(traces, opts)` is byte-identical for
|
|
20
|
+
* the same input — NO clock / random / network in the generator. The browser
|
|
21
|
+
* stamps `labeledAt` at save time; the deterministic `mergeLabels` only
|
|
22
|
+
* round-trips + dedups by traceId. Labels validate against `HumanLabel`
|
|
23
|
+
* (`contracts/validation.ts`) → consumed by `*validate`.
|
|
24
|
+
*
|
|
25
|
+
* Subject-agnostic (EV-002): the subject name + any badges come from the caller
|
|
26
|
+
* (the subject profile), never hard-coded.
|
|
27
|
+
*/
|
|
28
|
+
import type {
|
|
29
|
+
DiscoveryAssumption,
|
|
30
|
+
DiscoveryRef,
|
|
31
|
+
EvalTrace,
|
|
32
|
+
OutcomeVerdictValue,
|
|
33
|
+
TraceObservation,
|
|
34
|
+
VerdictBlock,
|
|
35
|
+
} from "./contracts/eval-types.ts";
|
|
36
|
+
import { type HumanLabel } from "./contracts/validation.ts";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* GA — the judge's adjudication for ONE trace, surfaced on the review screen so
|
|
40
|
+
* the human can see WHY the judge decided/abstained and feed the calibration
|
|
41
|
+
* loop (verify / eliminate the surfaced assumption). A compact projection of the
|
|
42
|
+
* folded `CriterionVerdict` — refs / assumptions / blockedBy carried with NO drop.
|
|
43
|
+
*/
|
|
44
|
+
export interface ReviewAdjudication {
|
|
45
|
+
criterionId: string;
|
|
46
|
+
result: OutcomeVerdictValue;
|
|
47
|
+
critique?: string;
|
|
48
|
+
refs?: DiscoveryRef[];
|
|
49
|
+
assumptions?: DiscoveryAssumption[];
|
|
50
|
+
blockedBy?: VerdictBlock;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ── HTML escape (sanitize rendered content — no raw LLM HTML reaches the DOM) ─
|
|
54
|
+
/** Escape into HTML text. Null-guarded (never throws on undefined). */
|
|
55
|
+
export function esc(s: unknown): string {
|
|
56
|
+
return String(s ?? "")
|
|
57
|
+
.replace(/&/g, "&")
|
|
58
|
+
.replace(/</g, "<")
|
|
59
|
+
.replace(/>/g, ">")
|
|
60
|
+
.replace(/"/g, """)
|
|
61
|
+
.replace(/'/g, "'");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface ReviewUiOptions {
|
|
65
|
+
/** subject display name for the header badge (from the subject profile). */
|
|
66
|
+
subjectName?: string;
|
|
67
|
+
/** page title (defaults to a subject-agnostic label). */
|
|
68
|
+
title?: string;
|
|
69
|
+
/**
|
|
70
|
+
* GA — the judge's adjudication per traceId (refs · assumptions · blockedBy ·
|
|
71
|
+
* result). When present, each trace card surfaces the GA panel + verify/
|
|
72
|
+
* eliminate capture. OPTIONAL — absent ⇒ the legacy label-only review screen.
|
|
73
|
+
*/
|
|
74
|
+
adjudications?: Record<string, ReviewAdjudication>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ── per-trace native-format render (server-side, deterministic) ──────────────
|
|
78
|
+
|
|
79
|
+
/** Pretty-print an observation's payload as escaped, collapsible JSON. */
|
|
80
|
+
function renderObservation(o: TraceObservation, i: number): string {
|
|
81
|
+
const kind = o.type === "TOOL" ? "tool" : esc(o.type);
|
|
82
|
+
const name = esc(o.name ?? o.type);
|
|
83
|
+
const payload = (() => {
|
|
84
|
+
try {
|
|
85
|
+
return esc(JSON.stringify({ input: o.input, output: o.output }, null, 2));
|
|
86
|
+
} catch {
|
|
87
|
+
return esc(String(o.output ?? ""));
|
|
88
|
+
}
|
|
89
|
+
})();
|
|
90
|
+
return (
|
|
91
|
+
`<details class="obs obs-${kind}">` +
|
|
92
|
+
`<summary><span class="obs-idx">#${i + 1}</span> <code>${name}</code></summary>` +
|
|
93
|
+
`<pre class="obs-body">${payload}</pre>` +
|
|
94
|
+
`</details>`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** GA — render the judge's adjudication panel + verify/eliminate calibration
|
|
99
|
+
* capture for one trace. Surfaces refs · assumptions · blockedBy. */
|
|
100
|
+
function renderAdjudicationPanel(adj: ReviewAdjudication): string {
|
|
101
|
+
const resultLabel = adj.result === "uncertain" ? "indeterminate" : adj.result;
|
|
102
|
+
const refs =
|
|
103
|
+
adj.refs && adj.refs.length > 0
|
|
104
|
+
? `<div class="ga-row"><span class="ga-k">refs</span> <code>${esc(
|
|
105
|
+
adj.refs.map((r) => `${r.obs}${r.path ? "/" + r.path : ""}: "${r.value}"`).join(" · "),
|
|
106
|
+
)}</code></div>`
|
|
107
|
+
: "";
|
|
108
|
+
const blockedBy =
|
|
109
|
+
adj.blockedBy !== undefined
|
|
110
|
+
? `<div class="ga-row"><span class="ga-k">blocked by</span> <span class="badge meta">${esc(
|
|
111
|
+
adj.blockedBy.kind,
|
|
112
|
+
)}</span> ${esc(adj.blockedBy.text)}</div>`
|
|
113
|
+
: "";
|
|
114
|
+
// each surfaced assumption gets verify / eliminate calibration buttons.
|
|
115
|
+
const assumptions =
|
|
116
|
+
adj.assumptions && adj.assumptions.length > 0
|
|
117
|
+
? `<div class="ga-row"><span class="ga-k">assumptions</span><ul class="ga-assumptions">` +
|
|
118
|
+
adj.assumptions
|
|
119
|
+
.map(
|
|
120
|
+
(a, ai) =>
|
|
121
|
+
`<li>${esc(a.text)} <span class="badge meta">${esc(a.status)}</span>${
|
|
122
|
+
a.kind !== undefined ? ` <span class="badge meta">${esc(a.kind)}</span>` : ""
|
|
123
|
+
} ` +
|
|
124
|
+
`<button class="calib verify" data-ai="${ai}" data-action="verify">Verify ✓</button> ` +
|
|
125
|
+
`<button class="calib eliminate" data-ai="${ai}" data-action="eliminate">Eliminate ✗</button></li>`,
|
|
126
|
+
)
|
|
127
|
+
.join("") +
|
|
128
|
+
`</ul></div>`
|
|
129
|
+
: "";
|
|
130
|
+
return (
|
|
131
|
+
`<div class="ga-panel" data-criterion="${esc(adj.criterionId)}">` +
|
|
132
|
+
`<div class="ga-head">judge adjudication: <span class="badge verdict-${esc(resultLabel)}">${esc(
|
|
133
|
+
resultLabel,
|
|
134
|
+
)}</span> <code>${esc(adj.criterionId)}</code></div>` +
|
|
135
|
+
(adj.critique ? `<div class="ga-row"><span class="ga-k">critique</span> ${esc(adj.critique)}</div>` : "") +
|
|
136
|
+
refs +
|
|
137
|
+
assumptions +
|
|
138
|
+
blockedBy +
|
|
139
|
+
`</div>`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Render one trace as a card (native format: escaped text, collapsible tool
|
|
145
|
+
* observations, color-coded role borders, full trace accessible). All cards are
|
|
146
|
+
* emitted; the client shows exactly one at a time. When a GA adjudication is
|
|
147
|
+
* supplied for the trace, the judge panel + verify/eliminate capture is surfaced.
|
|
148
|
+
*/
|
|
149
|
+
function renderTraceCard(
|
|
150
|
+
trace: EvalTrace,
|
|
151
|
+
index: number,
|
|
152
|
+
subjectName: string,
|
|
153
|
+
adj?: ReviewAdjudication,
|
|
154
|
+
): string {
|
|
155
|
+
const prompt = esc(trace.input?.prompt ?? "");
|
|
156
|
+
const response = esc(trace.output?.response ?? "");
|
|
157
|
+
const obs = trace.observations.map(renderObservation).join("");
|
|
158
|
+
const toolCount = trace.observations.filter((o) => o.type === "TOOL").length;
|
|
159
|
+
const panel = adj !== undefined ? renderAdjudicationPanel(adj) : "";
|
|
160
|
+
return (
|
|
161
|
+
`<section class="trace-card" data-index="${index}" data-trace-id="${esc(trace.id)}" hidden>` +
|
|
162
|
+
`<div class="card-head">` +
|
|
163
|
+
`<span class="badge subject">${esc(subjectName)}</span>` +
|
|
164
|
+
`<span class="badge tid">${esc(trace.id)}</span>` +
|
|
165
|
+
`<span class="badge meta">${toolCount} tool call(s)</span>` +
|
|
166
|
+
`</div>` +
|
|
167
|
+
`<div class="role role-user"><h4>Input</h4><pre>${prompt}</pre></div>` +
|
|
168
|
+
`<div class="role role-tool"><h4>Trace (${trace.observations.length} step(s))</h4>${obs || "<em>no observations</em>"}</div>` +
|
|
169
|
+
`<div class="role role-assistant"><h4>Output</h4><pre>${response}</pre></div>` +
|
|
170
|
+
panel +
|
|
171
|
+
`</section>`
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ── the deterministic HTML document ──────────────────────────────────────────
|
|
176
|
+
|
|
177
|
+
// Brand: the unified MutagenT design-system — SHARP corners (radius 0), SUBTLE
|
|
178
|
+
// non-black surfaces (purple is an ACCENT only), TONED status, NO glow. Tokens
|
|
179
|
+
// mirror @mutagent/templates/design-system/tokens.css (self-contained inline copy;
|
|
180
|
+
// the review UI is a standalone HTML doc with no bundled brand-asset read).
|
|
181
|
+
const STYLE = `
|
|
182
|
+
:root{--bg:#0a0a12;--surf:#14141d;--surf-2:#1a1a25;--fg:#d6dbe6;--fg-strong:#eef1f6;--mut:#8a8698;--bd:rgba(255,255,255,.09);--bstr:rgba(255,255,255,.16);--pass:#43c39a;--fail:#e06666;--defer:#e8a64d;--user:#45b8cc;--tool:#7E47D7;--asst:#43c39a;--fs:'Space Grotesk',system-ui,-apple-system,sans-serif;--fm:'IBM Plex Mono',ui-monospace,monospace}
|
|
183
|
+
*{box-sizing:border-box;border-radius:0}body{margin:0;background:var(--bg);color:var(--fg);font:14px/1.55 var(--fs)}
|
|
184
|
+
header{position:sticky;top:0;background:var(--surf);border-bottom:1px solid var(--bstr);padding:10px 16px;display:flex;gap:12px;align-items:center;flex-wrap:wrap;z-index:10}
|
|
185
|
+
header strong{color:var(--fg-strong)}
|
|
186
|
+
main{padding:16px;max-width:980px;margin:0 auto}
|
|
187
|
+
.badge{display:inline-block;padding:2px 8px;background:var(--surf-2);border:1px solid var(--bd);font-size:12px;font-family:var(--fm)}
|
|
188
|
+
.badge.subject{background:var(--surf-2);border-color:var(--bstr)}.badge.tid{font-family:var(--fm)}
|
|
189
|
+
.role{border-left:3px solid var(--bd);padding:4px 12px;margin:10px 0}
|
|
190
|
+
.role-user{border-color:var(--user)}.role-tool{border-color:var(--tool)}.role-assistant{border-color:var(--asst)}
|
|
191
|
+
.role h4{margin:4px 0;color:var(--mut);font-weight:600;text-transform:uppercase;font-size:11px;letter-spacing:.04em;font-family:var(--fm)}
|
|
192
|
+
pre{white-space:pre-wrap;word-break:break-word;background:var(--surf);border:1px solid var(--bd);padding:10px;margin:4px 0;font-family:var(--fm)}
|
|
193
|
+
details.obs{margin:4px 0;border:1px solid var(--bd);padding:4px 8px;background:var(--surf-2)}
|
|
194
|
+
details.obs-tool{border-left:3px solid var(--tool)}
|
|
195
|
+
summary{cursor:pointer}.obs-idx{color:var(--mut)}
|
|
196
|
+
.controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
|
|
197
|
+
button{background:var(--surf-2);color:var(--fg);border:1px solid var(--bd);padding:6px 12px;cursor:pointer;font-size:13px;font-family:var(--fs)}
|
|
198
|
+
button:hover{border-color:var(--mut)}
|
|
199
|
+
button.pass{border-color:var(--pass)}button.pass.active{background:var(--pass);color:#0a0a12}
|
|
200
|
+
button.fail{border-color:var(--fail)}button.fail.active{background:var(--fail);color:#0a0a12}
|
|
201
|
+
button.defer{border-color:var(--defer)}button.defer.active{background:var(--defer);color:#0a0a12}
|
|
202
|
+
textarea{width:100%;min-height:54px;background:var(--surf);color:var(--fg);border:1px solid var(--bd);padding:8px;margin-top:8px;font:13px/1.4 var(--fm)}
|
|
203
|
+
.counter{color:var(--mut)}.kbd{font-family:var(--fm);color:var(--mut);font-size:11px}
|
|
204
|
+
input[type=text]{background:var(--surf);color:var(--fg);border:1px solid var(--bd);padding:5px 8px;width:140px;font-family:var(--fm)}
|
|
205
|
+
.ga-panel{border:1px solid var(--bd);border-left:3px solid var(--tool);padding:8px 12px;margin:10px 0;background:var(--surf-2)}
|
|
206
|
+
.ga-head{font-weight:600;margin-bottom:4px}.ga-row{margin:4px 0}.ga-k{color:var(--mut);text-transform:uppercase;font-size:11px;letter-spacing:.04em;margin-right:6px;font-family:var(--fm)}
|
|
207
|
+
.ga-assumptions{margin:4px 0;padding-left:18px}
|
|
208
|
+
.badge.verdict-pass{border-color:var(--pass);color:var(--pass)}.badge.verdict-fail{border-color:var(--fail);color:var(--fail)}.badge.verdict-indeterminate{border-color:var(--defer);color:var(--defer)}
|
|
209
|
+
button.calib{padding:2px 8px;font-size:11px}button.calib.verify.active{background:var(--pass);color:#0a0a12}button.calib.eliminate.active{background:var(--fail);color:#0a0a12}
|
|
210
|
+
`;
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* The client controller: nav, label state (localStorage auto-save), keyboard
|
|
214
|
+
* shortcuts, counter, jump-to-id, labels export. Embedded verbatim — it carries
|
|
215
|
+
* NO trace data (the cards are server-rendered) and NO subject specifics. The
|
|
216
|
+
* `STORAGE_KEY` is parameterized by a stable subject key so multiple subjects'
|
|
217
|
+
* labels don't collide in one browser.
|
|
218
|
+
*/
|
|
219
|
+
function clientScript(storageKey: string): string {
|
|
220
|
+
return `
|
|
221
|
+
const STORAGE_KEY=${JSON.stringify(storageKey)};
|
|
222
|
+
const CALIB_KEY=STORAGE_KEY+':calibration';
|
|
223
|
+
const cards=[...document.querySelectorAll('.trace-card')];
|
|
224
|
+
const ids=cards.map(c=>c.dataset.traceId);
|
|
225
|
+
let cur=0;
|
|
226
|
+
function loadLabels(){try{return JSON.parse(localStorage.getItem(STORAGE_KEY)||'{}')}catch{return {}}}
|
|
227
|
+
function saveLabels(m){localStorage.setItem(STORAGE_KEY,JSON.stringify(m))}
|
|
228
|
+
// GA — calibration capture (verify/eliminate) lives in a SEPARATE store so the
|
|
229
|
+
// human-labels.json export stays HumanLabel-schema-clean (no smuggled fields).
|
|
230
|
+
function loadCalib(){try{return JSON.parse(localStorage.getItem(CALIB_KEY)||'{}')}catch{return {}}}
|
|
231
|
+
function saveCalib(m){localStorage.setItem(CALIB_KEY,JSON.stringify(m))}
|
|
232
|
+
let calib=loadCalib();
|
|
233
|
+
let labels=loadLabels();
|
|
234
|
+
let history=[];
|
|
235
|
+
function show(i){
|
|
236
|
+
if(i<0)i=0;if(i>=cards.length)i=cards.length-1;cur=i;
|
|
237
|
+
cards.forEach((c,k)=>c.hidden=k!==i);
|
|
238
|
+
const id=ids[i];const rec=labels[id]||{};
|
|
239
|
+
document.querySelectorAll('.verdict').forEach(b=>b.classList.toggle('active',b.dataset.v===rec.label));
|
|
240
|
+
document.getElementById('notes').value=rec.notes||'';
|
|
241
|
+
document.getElementById('jump').value=id;
|
|
242
|
+
updateCounter();
|
|
243
|
+
}
|
|
244
|
+
function updateCounter(){
|
|
245
|
+
const done=ids.filter(id=>labels[id]&&labels[id].label).length;
|
|
246
|
+
const remaining=ids.length-done;
|
|
247
|
+
document.getElementById('counter').textContent=(cur+1)+' of '+ids.length+' — '+done+' labeled, '+remaining+' remaining';
|
|
248
|
+
}
|
|
249
|
+
function setLabel(v){
|
|
250
|
+
const id=ids[cur];
|
|
251
|
+
const prev=labels[id]?{...labels[id]}:null;history.push({id,prev});
|
|
252
|
+
labels[id]={traceId:id,label:v,notes:document.getElementById('notes').value,labeledAt:new Date().toISOString()};
|
|
253
|
+
saveLabels(labels);show(cur); // auto-save on every action
|
|
254
|
+
}
|
|
255
|
+
function setNotes(){
|
|
256
|
+
const id=ids[cur];const rec=labels[id]||{traceId:id};
|
|
257
|
+
rec.notes=document.getElementById('notes').value;rec.labeledAt=new Date().toISOString();
|
|
258
|
+
labels[id]=rec;saveLabels(labels); // auto-save notes too
|
|
259
|
+
}
|
|
260
|
+
function undo(){const h=history.pop();if(!h)return;if(h.prev)labels[h.id]=h.prev;else delete labels[h.id];saveLabels(labels);show(cur)}
|
|
261
|
+
function jumpTo(id){const i=ids.indexOf(id.trim());if(i>=0)show(i)}
|
|
262
|
+
function exportLabels(){
|
|
263
|
+
const arr=Object.values(labels);
|
|
264
|
+
const blob=new Blob([JSON.stringify(arr,null,2)],{type:'application/json'});
|
|
265
|
+
const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='human-labels.json';a.click();
|
|
266
|
+
}
|
|
267
|
+
// GA — capture a verify/eliminate calibration decision on a surfaced assumption.
|
|
268
|
+
function setCalib(traceId,criterionId,ai,action){
|
|
269
|
+
const key=traceId+'#'+criterionId+'#'+ai;
|
|
270
|
+
calib[key]={traceId,criterionId,assumptionIndex:Number(ai),action,decidedAt:new Date().toISOString()};
|
|
271
|
+
saveCalib(calib);
|
|
272
|
+
}
|
|
273
|
+
function exportCalib(){
|
|
274
|
+
const arr=Object.values(calib);
|
|
275
|
+
const blob=new Blob([JSON.stringify(arr,null,2)],{type:'application/json'});
|
|
276
|
+
const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='calibration.json';a.click();
|
|
277
|
+
}
|
|
278
|
+
document.querySelectorAll('.calib').forEach(b=>b.addEventListener('click',()=>{
|
|
279
|
+
const card=b.closest('.trace-card');const panel=b.closest('.ga-panel');
|
|
280
|
+
setCalib(card.dataset.traceId,panel?panel.dataset.criterion:'',b.dataset.ai,b.dataset.action);
|
|
281
|
+
b.classList.add('active');
|
|
282
|
+
}));
|
|
283
|
+
document.querySelectorAll('.verdict').forEach(b=>b.addEventListener('click',()=>setLabel(b.dataset.v)));
|
|
284
|
+
document.getElementById('notes').addEventListener('input',setNotes);
|
|
285
|
+
document.getElementById('prev').addEventListener('click',()=>show(cur-1));
|
|
286
|
+
document.getElementById('next').addEventListener('click',()=>show(cur+1));
|
|
287
|
+
document.getElementById('undo').addEventListener('click',undo);
|
|
288
|
+
document.getElementById('export').addEventListener('click',exportLabels);
|
|
289
|
+
{const ce=document.getElementById('export-calib');if(ce)ce.addEventListener('click',exportCalib);}
|
|
290
|
+
document.getElementById('jump').addEventListener('change',e=>jumpTo(e.target.value));
|
|
291
|
+
document.addEventListener('keydown',e=>{
|
|
292
|
+
if(e.target.tagName==='TEXTAREA'||e.target.tagName==='INPUT'){
|
|
293
|
+
if((e.metaKey||e.ctrlKey)&&e.key==='Enter'){setNotes();show(cur+1);e.preventDefault()}
|
|
294
|
+
if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==='s'){saveLabels(labels);e.preventDefault()}
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if(e.key==='ArrowRight')show(cur+1);
|
|
298
|
+
else if(e.key==='ArrowLeft')show(cur-1);
|
|
299
|
+
else if(e.key==='1')setLabel('pass');
|
|
300
|
+
else if(e.key==='2')setLabel('fail');
|
|
301
|
+
else if(e.key.toLowerCase()==='d')setLabel('defer');
|
|
302
|
+
else if(e.key.toLowerCase()==='u')undo();
|
|
303
|
+
else if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==='s'){saveLabels(labels);e.preventDefault()}
|
|
304
|
+
else if((e.metaKey||e.ctrlKey)&&e.key==='Enter'){show(cur+1);e.preventDefault()}
|
|
305
|
+
});
|
|
306
|
+
show(0);
|
|
307
|
+
`;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Render the full annotation HTML document. DETERMINISTIC — byte-identical for
|
|
312
|
+
* the same (traces, opts). The embedded client script carries the controls; the
|
|
313
|
+
* trace cards are server-rendered (native format, escaped). Subject-agnostic.
|
|
314
|
+
*/
|
|
315
|
+
export function renderReviewUi(traces: EvalTrace[], opts: ReviewUiOptions = {}): string {
|
|
316
|
+
const subjectName = opts.subjectName ?? "subject";
|
|
317
|
+
const title = opts.title ?? `Trace review — ${subjectName}`;
|
|
318
|
+
// stable storage key so labels namespace per subject (no clock/random).
|
|
319
|
+
const storageKey = `mutagent-evaluator:review:${subjectName}`;
|
|
320
|
+
const adj = opts.adjudications ?? {};
|
|
321
|
+
const cards = traces
|
|
322
|
+
.map((t, i) => renderTraceCard(t, i, subjectName, adj[t.id]))
|
|
323
|
+
.join("");
|
|
324
|
+
const empty = traces.length === 0 ? `<p><em>No traces to review.</em></p>` : "";
|
|
325
|
+
return (
|
|
326
|
+
`<!doctype html><html lang="en"><head><meta charset="utf-8">` +
|
|
327
|
+
`<meta name="viewport" content="width=device-width,initial-scale=1">` +
|
|
328
|
+
`<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">` +
|
|
329
|
+
`<title>${esc(title)}</title><style>${STYLE}</style></head><body>` +
|
|
330
|
+
`<header><strong>${esc(title)}</strong>` +
|
|
331
|
+
`<span id="counter" class="counter"></span>` +
|
|
332
|
+
`<span class="controls">` +
|
|
333
|
+
`<button id="prev">◀ Prev</button><button id="next">Next ▶</button>` +
|
|
334
|
+
`<button class="verdict pass" data-v="pass">Pass</button>` +
|
|
335
|
+
`<button class="verdict fail" data-v="fail">Fail</button>` +
|
|
336
|
+
`<button class="verdict defer" data-v="defer">Defer</button>` +
|
|
337
|
+
`<button id="undo">Undo</button>` +
|
|
338
|
+
`<input type="text" id="jump" placeholder="jump to trace id" aria-label="jump to trace id">` +
|
|
339
|
+
`<button id="export">Download labels</button>` +
|
|
340
|
+
`<button id="export-calib">Download calibration</button>` +
|
|
341
|
+
`<span class="kbd">← → nav · 1 Pass · 2 Fail · D Defer · U Undo · ⌘S Save · ⌘⏎ Save&Next</span>` +
|
|
342
|
+
`</span></header>` +
|
|
343
|
+
`<main>${empty}${cards}<textarea id="notes" placeholder="notes — what went wrong / right"></textarea></main>` +
|
|
344
|
+
`<script>${clientScript(storageKey)}</script></body></html>`
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// ── labels persistence merge (deterministic — the script's only state op) ────
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Merge incoming labels into existing, deduped by traceId, LAST-WRITE-WINS
|
|
352
|
+
* (incoming overrides existing for the same trace). DETERMINISTIC: result is
|
|
353
|
+
* sorted by traceId so re-merges are byte-identical (no clock/random). This is
|
|
354
|
+
* the persistence the script owns; the browser EXPORTS labels, this folds them
|
|
355
|
+
* into the canonical labels file `*validate` reads.
|
|
356
|
+
*/
|
|
357
|
+
export function mergeLabels(existing: HumanLabel[], incoming: HumanLabel[]): HumanLabel[] {
|
|
358
|
+
const byId = new Map<string, HumanLabel>();
|
|
359
|
+
for (const l of existing) byId.set(l.traceId, l);
|
|
360
|
+
for (const l of incoming) byId.set(l.traceId, l); // incoming wins
|
|
361
|
+
return [...byId.values()].sort((a, b) => a.traceId.localeCompare(b.traceId));
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
export interface LabelStats {
|
|
365
|
+
total: number;
|
|
366
|
+
labeled: number;
|
|
367
|
+
unlabeled: number;
|
|
368
|
+
pass: number;
|
|
369
|
+
fail: number;
|
|
370
|
+
defer: number;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Count labels against a trace universe. `deferred` labels count as "labeled"
|
|
375
|
+
* for progress but are NOT pass/fail ground truth (excluded from TPR/TNR by
|
|
376
|
+
* `*validate`). PURE.
|
|
377
|
+
*/
|
|
378
|
+
export function labelStats(traceIds: string[], labels: HumanLabel[]): LabelStats {
|
|
379
|
+
const byId = new Map(labels.map((l) => [l.traceId, l]));
|
|
380
|
+
let pass = 0;
|
|
381
|
+
let fail = 0;
|
|
382
|
+
let defer = 0;
|
|
383
|
+
let labeled = 0;
|
|
384
|
+
for (const id of traceIds) {
|
|
385
|
+
const l = byId.get(id);
|
|
386
|
+
if (l === undefined) continue;
|
|
387
|
+
labeled++;
|
|
388
|
+
if (l.label === "pass") pass++;
|
|
389
|
+
else if (l.label === "fail") fail++;
|
|
390
|
+
else if (l.label === "defer") defer++;
|
|
391
|
+
}
|
|
392
|
+
return { total: traceIds.length, labeled, unlabeled: traceIds.length - labeled, pass, fail, defer };
|
|
393
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/check-method-router.ts — P3 (EX-2): the load-bearing v2 check_method router.
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* Once `*discover-evals` types a metric (§5b `check_method`), THIS routes each
|
|
5
|
+
* MinedCriterion to its execution path — the router the dogfood (M1/M2) found
|
|
6
|
+
* missing:
|
|
7
|
+
* - `deterministic` → CODE-EXEC: run the extracted code-eval (NO judge, zero
|
|
8
|
+
* tokens, byte-identical reruns — full C-PIN on code rows).
|
|
9
|
+
* - `llm-judge` → JUDGE: the LLM judge seam (agent-dispatch DEFAULT / run-judge).
|
|
10
|
+
* - `hybrid` → CODE pre-filter THEN judge: code runs first; if code FAILS
|
|
11
|
+
* the pre-filter the judge is GATED OFF (the cheap path caught
|
|
12
|
+
* it — zero tokens); if code PASSES, the judge confirms the
|
|
13
|
+
* subjective half. Both results are recorded in provenance.
|
|
14
|
+
* - unknown → THROW (exhaustive, fail-loud — mirrors `resolveJudgeRuntime`).
|
|
15
|
+
*
|
|
16
|
+
* EX-2: "code before judge" lives INSIDE the evaluator agent (it runs the code-eval
|
|
17
|
+
* via Bash for code rows, LLM-judges only judge rows). This module is the pure
|
|
18
|
+
* routing + provenance core the agent's protocol follows. JUDGE-ONLY (EV-051): a
|
|
19
|
+
* code-eval is a DETERMINISTIC JUDGE, never a fix — nothing here edits the subject.
|
|
20
|
+
*
|
|
21
|
+
* The provenance type (`RoutedCriterionVerdict`) lives HERE (a v2-code-track shape),
|
|
22
|
+
* NOT in eval-types — it is a structural SUPERSET of `CriterionVerdict`, so the
|
|
23
|
+
* `evaluate.ts` GATE rollup consumes a routed verdict UNCHANGED (it reads `.result`).
|
|
24
|
+
*
|
|
25
|
+
* PURE except for the injected judge seam (which, under agent-dispatch, only READS
|
|
26
|
+
* a verdict file). The code path is fully deterministic — no clock/random/network.
|
|
27
|
+
*/
|
|
28
|
+
import { runCodeEval, type CodeEvalResult, type CodeEvalSpec } from "./code-eval.ts";
|
|
29
|
+
import {
|
|
30
|
+
CheckMethod,
|
|
31
|
+
OutcomeVerdict,
|
|
32
|
+
type CriterionVerdict,
|
|
33
|
+
type EvalTrace,
|
|
34
|
+
type MinedCriterion,
|
|
35
|
+
} from "./contracts/eval-types.ts";
|
|
36
|
+
|
|
37
|
+
/** Which executor produced a verdict (additive provenance, v2-code-track). */
|
|
38
|
+
export type ProducedBy = "code" | "judge" | "hybrid";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* A routed verdict = a `CriterionVerdict` + the execution provenance. Structural
|
|
42
|
+
* superset → flows into `evaluate.ts` rollup unchanged (rollup reads `.result`).
|
|
43
|
+
*/
|
|
44
|
+
export interface RoutedCriterionVerdict extends CriterionVerdict {
|
|
45
|
+
producedBy: ProducedBy;
|
|
46
|
+
/** the deterministic code result (code/hybrid rows); omitted for pure judge rows. */
|
|
47
|
+
codeResult?: "pass" | "fail";
|
|
48
|
+
/** the code-eval detail (code/hybrid rows). */
|
|
49
|
+
codeDetail?: string;
|
|
50
|
+
/** whether an LLM judge was actually invoked (false on code rows + gated hybrids). */
|
|
51
|
+
judgeReached: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** The LLM judge seam — produces a CriterionVerdict for a judge-class row. Under
|
|
55
|
+
* the agent-dispatch DEFAULT this READS a verdict file (no provider call). */
|
|
56
|
+
export type CriterionJudge = (
|
|
57
|
+
criterion: MinedCriterion,
|
|
58
|
+
trace: EvalTrace,
|
|
59
|
+
) => Promise<CriterionVerdict>;
|
|
60
|
+
|
|
61
|
+
/** The deterministic code seam — runs a criterion's extracted code-eval. */
|
|
62
|
+
export type CriterionCodeRunner = (criterion: MinedCriterion, trace: EvalTrace) => CodeEvalResult;
|
|
63
|
+
|
|
64
|
+
export interface RouteDeps {
|
|
65
|
+
runCode: CriterionCodeRunner;
|
|
66
|
+
judge: CriterionJudge;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Build a CriterionVerdict from a deterministic code result (confidence = 1). */
|
|
70
|
+
function verdictFromCode(
|
|
71
|
+
criterion: MinedCriterion,
|
|
72
|
+
trace: EvalTrace,
|
|
73
|
+
code: CodeEvalResult,
|
|
74
|
+
): CriterionVerdict {
|
|
75
|
+
return {
|
|
76
|
+
criterionId: criterion.id,
|
|
77
|
+
traceId: trace.id,
|
|
78
|
+
result: code.result === "pass" ? OutcomeVerdict.Pass : OutcomeVerdict.Fail,
|
|
79
|
+
confidence: 1, // deterministic certainty
|
|
80
|
+
critique: code.detail,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Route + execute one criterion against one trace. EXHAUSTIVE on check_method;
|
|
86
|
+
* an unknown value THROWS (no silent default — a metric of unknown method must
|
|
87
|
+
* never be silently passed or judged). Returns a routed verdict carrying the
|
|
88
|
+
* execution provenance.
|
|
89
|
+
*/
|
|
90
|
+
export async function evaluateCriterion(
|
|
91
|
+
criterion: MinedCriterion,
|
|
92
|
+
trace: EvalTrace,
|
|
93
|
+
deps: RouteDeps,
|
|
94
|
+
): Promise<RoutedCriterionVerdict> {
|
|
95
|
+
const cm = criterion.metadata.check_method;
|
|
96
|
+
|
|
97
|
+
if (cm === CheckMethod.Deterministic) {
|
|
98
|
+
const code = deps.runCode(criterion, trace);
|
|
99
|
+
return {
|
|
100
|
+
...verdictFromCode(criterion, trace, code),
|
|
101
|
+
producedBy: "code",
|
|
102
|
+
codeResult: code.result,
|
|
103
|
+
codeDetail: code.detail,
|
|
104
|
+
judgeReached: false,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (cm === CheckMethod.LlmJudge) {
|
|
109
|
+
const jv = await deps.judge(criterion, trace);
|
|
110
|
+
return { ...jv, producedBy: "judge", judgeReached: true };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (cm === CheckMethod.Hybrid) {
|
|
114
|
+
const code = deps.runCode(criterion, trace);
|
|
115
|
+
if (code.result === "fail") {
|
|
116
|
+
// code pre-filter caught it → the judge is GATED OFF (zero tokens).
|
|
117
|
+
return {
|
|
118
|
+
...verdictFromCode(criterion, trace, code),
|
|
119
|
+
producedBy: "hybrid",
|
|
120
|
+
codeResult: code.result,
|
|
121
|
+
codeDetail: code.detail,
|
|
122
|
+
judgeReached: false,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// code passed the pre-filter → the judge confirms the subjective half.
|
|
126
|
+
const jv = await deps.judge(criterion, trace);
|
|
127
|
+
return {
|
|
128
|
+
...jv,
|
|
129
|
+
producedBy: "hybrid",
|
|
130
|
+
codeResult: code.result,
|
|
131
|
+
codeDetail: code.detail,
|
|
132
|
+
judgeReached: true,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
throw new Error(
|
|
137
|
+
`evaluateCriterion: unknown check_method '${String(cm)}' for criterion ` +
|
|
138
|
+
`'${criterion.id}'. Known: deterministic | llm-judge | hybrid (no silent default).`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ── Per-subject code-eval extraction ────────────────────────────────────────
|
|
143
|
+
|
|
144
|
+
/** A per-subject registry mapping a code-class criterionId → its extracted spec. */
|
|
145
|
+
export type CodeEvalRegistry = Record<string, CodeEvalSpec>;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Look up a criterion's extracted code-eval spec from the per-subject registry.
|
|
149
|
+
* FAIL-LOUD: a code-class criterion with no registered spec THROWS — code-class
|
|
150
|
+
* rows REQUIRE an extracted script; the harness must never silently fall back to
|
|
151
|
+
* an LLM judge for a metric typed as code (that would waste the deterministic
|
|
152
|
+
* signal + break C-PIN — the M1 defect this phase closes).
|
|
153
|
+
*/
|
|
154
|
+
export function extractCodeEval(criterion: MinedCriterion, registry: CodeEvalRegistry): CodeEvalSpec {
|
|
155
|
+
const spec = registry[criterion.id];
|
|
156
|
+
if (spec === undefined) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
`extractCodeEval: no code-eval spec registered for code-class criterion ` +
|
|
159
|
+
`'${criterion.id}'. Code-class rows require an extracted code-eval script; ` +
|
|
160
|
+
"refusing to silently LLM-judge a metric typed as code (M1).",
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
return spec;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Build a `CriterionCodeRunner` that extracts + runs a criterion's code-eval. */
|
|
167
|
+
export function makeCodeRunner(registry: CodeEvalRegistry): CriterionCodeRunner {
|
|
168
|
+
return (criterion: MinedCriterion, trace: EvalTrace): CodeEvalResult =>
|
|
169
|
+
runCodeEval(extractCodeEval(criterion, registry), trace);
|
|
170
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/cli/aggregate.ts — the AGGREGATE entrypoint for the agent-dispatch engine.
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* Symmetric with `cli/prep.ts`: PREP emits task/packet files → the parent
|
|
5
|
+
* dispatches subagents (they write verdict files) → this reads the verdict files
|
|
6
|
+
* back and rolls them up. Type A — deterministic, NO LLM and NO provider. See
|
|
7
|
+
* `references/workflows/orchestrator-protocol.md`.
|
|
8
|
+
*
|
|
9
|
+
* # DEFAULT *evaluate — eval-matrix × trajectory: fold per-trajectory verdict
|
|
10
|
+
* # files into the severity-gated GATE + variance scorecard.
|
|
11
|
+
* aggregate.ts --stage evaluate --traces <handover.jsonl> --criteria <matrix.json> \
|
|
12
|
+
* --verdict-dir <dir> [--out scorecard.json]
|
|
13
|
+
*
|
|
14
|
+
* # *discover-evals — mine emergent criteria from the dispatched error-analyst
|
|
15
|
+
* # annotation files (one TraceAnnotation[] JSON per batch in --annotations-dir).
|
|
16
|
+
* aggregate.ts --stage discover --annotations-dir <dir> [--out criteria.json]
|
|
17
|
+
*
|
|
18
|
+
* The matrix path keys verdict files by TASK DATA (trajectory id), never a
|
|
19
|
+
* rendered prompt — so AGGREGATE re-derives the key from the trajectory ids in
|
|
20
|
+
* the trace set. No judge prompt is rendered here.
|
|
21
|
+
*/
|
|
22
|
+
import { readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
import { execSync } from "node:child_process";
|
|
25
|
+
import { parseUnitfJsonl } from "../read-unitf-traces.ts";
|
|
26
|
+
import { readMatrixVerdictFiles, aggregateMatrixScorecard } from "../matrix-judge.ts";
|
|
27
|
+
import { deriveCriteria, type TraceAnnotation } from "../discover-criteria.ts";
|
|
28
|
+
import type { MatrixCriterion } from "../contracts/eval-matrix.ts";
|
|
29
|
+
|
|
30
|
+
function flag(argv: string[], name: string): string | undefined {
|
|
31
|
+
const i = argv.indexOf(`--${name}`);
|
|
32
|
+
return i >= 0 && i + 1 < argv.length ? argv[i + 1] : undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Load the handed-over UniTF trace file as text (`mutagent-cli trace fetch
|
|
36
|
+
* --export` output); `.gz` → gunzip | jq -c. `parseUnitfJsonl` projects each
|
|
37
|
+
* UniTF record → EvalTrace. The skill NEVER fetches. */
|
|
38
|
+
function loadNdjson(file: string): string {
|
|
39
|
+
if (file.endsWith(".gz")) {
|
|
40
|
+
return execSync(`gunzip -c ${JSON.stringify(file)} | jq -c '.'`, {
|
|
41
|
+
maxBuffer: 1024 * 1024 * 512,
|
|
42
|
+
encoding: "utf8",
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return readFileSync(file, "utf8");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Read every *.json file in a dir and JSON.parse each → flat array. */
|
|
49
|
+
function readJsonDir<T>(dir: string): T[] {
|
|
50
|
+
const out: T[] = [];
|
|
51
|
+
for (const name of readdirSync(dir).sort()) {
|
|
52
|
+
if (!name.endsWith(".json")) continue;
|
|
53
|
+
const parsed = JSON.parse(readFileSync(join(dir, name), "utf8")) as T | T[];
|
|
54
|
+
if (Array.isArray(parsed)) out.push(...parsed);
|
|
55
|
+
else out.push(parsed);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function main(): void {
|
|
61
|
+
const argv = process.argv.slice(2);
|
|
62
|
+
const stage = flag(argv, "stage");
|
|
63
|
+
const out = flag(argv, "out");
|
|
64
|
+
|
|
65
|
+
if (stage === "evaluate") {
|
|
66
|
+
const tracesFile = flag(argv, "traces");
|
|
67
|
+
const criteriaFile = flag(argv, "criteria");
|
|
68
|
+
const verdictDir = flag(argv, "verdict-dir");
|
|
69
|
+
if (tracesFile === undefined || criteriaFile === undefined || verdictDir === undefined) {
|
|
70
|
+
throw new Error("aggregate --stage evaluate: --traces, --criteria and --verdict-dir are required");
|
|
71
|
+
}
|
|
72
|
+
const { traces } = parseUnitfJsonl(loadNdjson(tracesFile));
|
|
73
|
+
const criteria = JSON.parse(readFileSync(criteriaFile, "utf8")) as MatrixCriterion[];
|
|
74
|
+
const trajectoryIds = traces.map((t) => t.id);
|
|
75
|
+
const verdictFilesRaw = readMatrixVerdictFiles(verdictDir, trajectoryIds);
|
|
76
|
+
const result = aggregateMatrixScorecard({ criteria, verdictFilesRaw });
|
|
77
|
+
const json = JSON.stringify(result, null, 2);
|
|
78
|
+
if (out !== undefined) {
|
|
79
|
+
writeFileSync(out, json);
|
|
80
|
+
process.stdout.write(`aggregate: wrote ${out} (gate.passed=${result.scorecard.gate.passed})\n`);
|
|
81
|
+
} else {
|
|
82
|
+
process.stdout.write(json + "\n");
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (stage === "discover") {
|
|
88
|
+
const annotationsDir = flag(argv, "annotations-dir");
|
|
89
|
+
if (annotationsDir === undefined) {
|
|
90
|
+
throw new Error("aggregate --stage discover: --annotations-dir <dir of TraceAnnotation[] json> is required");
|
|
91
|
+
}
|
|
92
|
+
const annotations = readJsonDir<TraceAnnotation>(annotationsDir);
|
|
93
|
+
const criteria = deriveCriteria(annotations);
|
|
94
|
+
const json = JSON.stringify(criteria, null, 2);
|
|
95
|
+
if (out !== undefined) {
|
|
96
|
+
writeFileSync(out, json);
|
|
97
|
+
process.stdout.write(`aggregate: wrote ${out} (${criteria.length} criteria)\n`);
|
|
98
|
+
} else {
|
|
99
|
+
process.stdout.write(json + "\n");
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
throw new Error("aggregate: --stage must be 'evaluate' (matrix) or 'discover'");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
main();
|
|
109
|
+
} catch (err: unknown) {
|
|
110
|
+
process.stderr.write(`aggregate FAILED: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|