@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,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/evaluate.ts — EV-048 `*evaluate` (GATE verdict + variance view).
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* Runs the built suite vs a subject → per-criterion binary+confidence → a
|
|
5
|
+
* severity-gated GATE verdict (binary) + the agent-variance view (EV-054).
|
|
6
|
+
*
|
|
7
|
+
* GATE — binary, severity-gated: a FAILING criterion whose severity
|
|
8
|
+
* is in the gating set (default {CRIT, HIGH}) fails the gate.
|
|
9
|
+
* MED/LOW failures are reported but do not gate.
|
|
10
|
+
* variance view — eval-SCORE variance across reruns (does the verdict flap?)
|
|
11
|
+
* + TRAJECTORY variance (does the agent take different tool
|
|
12
|
+
* paths across reruns?). A trustworthy eval is consistent
|
|
13
|
+
* BEFORE it is accurate (variance control precedes accuracy).
|
|
14
|
+
*
|
|
15
|
+
* PURE rollup — no clock/random/network; same inputs → identical verdict.
|
|
16
|
+
* Reuses the v1 Severity enum (same package, not sealed-sibling).
|
|
17
|
+
*/
|
|
18
|
+
import {
|
|
19
|
+
OutcomeVerdict,
|
|
20
|
+
RunVerdict,
|
|
21
|
+
type CriterionVerdict,
|
|
22
|
+
type OutcomeVerdictValue,
|
|
23
|
+
type RunVerdictValue,
|
|
24
|
+
} from "./contracts/eval-types.ts";
|
|
25
|
+
import { Severity, type SeverityValue } from "./contracts/types.ts";
|
|
26
|
+
import {
|
|
27
|
+
EMPTY_EXPECTED_FLOW,
|
|
28
|
+
type ExpectedFlow,
|
|
29
|
+
type ExpectedFlowEdge,
|
|
30
|
+
} from "./contracts/flow-graph.ts";
|
|
31
|
+
|
|
32
|
+
/** One criterion's single-run verdict plus its gating severity. */
|
|
33
|
+
export interface GradedCriterion {
|
|
34
|
+
criterionId: string;
|
|
35
|
+
severity: string;
|
|
36
|
+
verdict: CriterionVerdict;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface GateInput {
|
|
40
|
+
criteria: GradedCriterion[];
|
|
41
|
+
/** failing criteria at these severities fail the gate (default CRIT+HIGH). */
|
|
42
|
+
gatingSeverities?: string[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface GateRef {
|
|
46
|
+
criterionId: string;
|
|
47
|
+
severity: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface GateResult {
|
|
51
|
+
/** back-compat: true iff `runVerdict === "pass"` (no CRIT/HIGH fail OR indeterminate). */
|
|
52
|
+
passed: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* GA — the ternary RUN verdict `fail ▸ incomplete ▸ pass`:
|
|
55
|
+
* - fail — ≥1 CRIT/HIGH criterion FAILED.
|
|
56
|
+
* - incomplete — no CRIT/HIGH fail, but ≥1 CRIT/HIGH was INDETERMINATE
|
|
57
|
+
* (`uncertain`). The latent-false-green killer — a run that
|
|
58
|
+
* could not be certified is NOT a pass.
|
|
59
|
+
* - pass — every CRIT/HIGH criterion passed.
|
|
60
|
+
*/
|
|
61
|
+
runVerdict: RunVerdictValue;
|
|
62
|
+
/** every failing criterion (any severity). */
|
|
63
|
+
failedCriteria: GateRef[];
|
|
64
|
+
/** the subset that actually GATED (FAILED + severity in the gating set). */
|
|
65
|
+
gatedBy: GateRef[];
|
|
66
|
+
/** GA — CRIT/HIGH criteria that were INDETERMINATE (drive `incomplete`). */
|
|
67
|
+
indeterminateBy: GateRef[];
|
|
68
|
+
total: number;
|
|
69
|
+
passCount: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const DEFAULT_GATING: readonly SeverityValue[] = [Severity.Crit, Severity.High];
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Severity-gated TERNARY GATE (GA). A CRIT/HIGH FAIL fails the run; a CRIT/HIGH
|
|
76
|
+
* INDETERMINATE (uncertain) — with no CRIT/HIGH fail — makes the run INCOMPLETE
|
|
77
|
+
* (never a silent pass); else pass. `failedCriteria` keeps the legacy "any
|
|
78
|
+
* non-pass at any severity" set for back-compat reporting. PURE.
|
|
79
|
+
*/
|
|
80
|
+
export function evaluateGate(input: GateInput): GateResult {
|
|
81
|
+
const gating = new Set<string>(input.gatingSeverities ?? DEFAULT_GATING);
|
|
82
|
+
const failedCriteria: GateRef[] = [];
|
|
83
|
+
const gatedBy: GateRef[] = [];
|
|
84
|
+
const indeterminateBy: GateRef[] = [];
|
|
85
|
+
let passCount = 0;
|
|
86
|
+
|
|
87
|
+
for (const c of input.criteria) {
|
|
88
|
+
const result = c.verdict.result;
|
|
89
|
+
if (result === OutcomeVerdict.Pass) {
|
|
90
|
+
passCount += 1;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const ref: GateRef = { criterionId: c.criterionId, severity: c.severity };
|
|
94
|
+
if (result === OutcomeVerdict.Fail) {
|
|
95
|
+
// a hard fail (legacy failedCriteria + the real gate).
|
|
96
|
+
failedCriteria.push(ref);
|
|
97
|
+
if (gating.has(c.severity)) gatedBy.push(ref);
|
|
98
|
+
} else {
|
|
99
|
+
// uncertain / indeterminate — counted in legacy failedCriteria, but it
|
|
100
|
+
// drives INCOMPLETE (not fail) at gating severity.
|
|
101
|
+
failedCriteria.push(ref);
|
|
102
|
+
if (gating.has(c.severity)) indeterminateBy.push(ref);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const runVerdict: RunVerdictValue =
|
|
107
|
+
gatedBy.length > 0
|
|
108
|
+
? RunVerdict.Fail
|
|
109
|
+
: indeterminateBy.length > 0
|
|
110
|
+
? RunVerdict.Incomplete
|
|
111
|
+
: RunVerdict.Pass;
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
passed: runVerdict === RunVerdict.Pass,
|
|
115
|
+
runVerdict,
|
|
116
|
+
failedCriteria,
|
|
117
|
+
gatedBy,
|
|
118
|
+
indeterminateBy,
|
|
119
|
+
total: input.criteria.length,
|
|
120
|
+
passCount,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ── Variance view (EV-054) ──────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
/** Map a verdict to a numeric score: pass=1, fail=0, uncertain=0.5. */
|
|
127
|
+
function scoreOf(v: OutcomeVerdictValue): number {
|
|
128
|
+
if (v === OutcomeVerdict.Pass) return 1;
|
|
129
|
+
if (v === OutcomeVerdict.Fail) return 0;
|
|
130
|
+
return 0.5;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface ScoreVariance {
|
|
134
|
+
mean: number;
|
|
135
|
+
variance: number;
|
|
136
|
+
/** consistent iff variance is exactly 0 (every rerun agreed). */
|
|
137
|
+
consistent: boolean;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Population variance of the eval scores across reruns of one criterion. PURE. */
|
|
141
|
+
export function evalScoreVariance(results: OutcomeVerdictValue[]): ScoreVariance {
|
|
142
|
+
if (results.length === 0) return { mean: 0, variance: 0, consistent: true };
|
|
143
|
+
const scores = results.map(scoreOf);
|
|
144
|
+
const mean = scores.reduce((a, b) => a + b, 0) / scores.length;
|
|
145
|
+
const variance = scores.reduce((a, s) => a + (s - mean) * (s - mean), 0) / scores.length;
|
|
146
|
+
return { mean, variance, consistent: variance === 0 };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export interface TrajectoryVariance {
|
|
150
|
+
distinct: number;
|
|
151
|
+
total: number;
|
|
152
|
+
/** stable iff every rerun took the identical tool trajectory. */
|
|
153
|
+
stable: boolean;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Distinct-trajectory count across reruns (a trajectory = ordered tool names). PURE. */
|
|
157
|
+
export function trajectoryVariance(trajectories: string[][]): TrajectoryVariance {
|
|
158
|
+
const keys = trajectories.map((t) => t.join("␟")); // unit-separator join
|
|
159
|
+
const distinct = new Set(keys).size;
|
|
160
|
+
return {
|
|
161
|
+
distinct,
|
|
162
|
+
total: trajectories.length,
|
|
163
|
+
stable: distinct <= 1,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ── rollupScorecard — the *evaluate output ──────────────────────────────────
|
|
168
|
+
|
|
169
|
+
export interface CriterionReruns {
|
|
170
|
+
scores: OutcomeVerdictValue[];
|
|
171
|
+
trajectories: string[][];
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export interface ScorecardInput {
|
|
175
|
+
criteria: GradedCriterion[];
|
|
176
|
+
gatingSeverities?: string[];
|
|
177
|
+
/** criterionId -> rerun observations (for the variance view). */
|
|
178
|
+
reruns?: Record<string, CriterionReruns>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface CriterionVarianceView {
|
|
182
|
+
score: ScoreVariance;
|
|
183
|
+
trajectory: TrajectoryVariance;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface Scorecard {
|
|
187
|
+
gate: GateResult;
|
|
188
|
+
variance: Record<string, CriterionVarianceView>;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Combine the severity-gated GATE with the per-criterion variance view. PURE. */
|
|
192
|
+
export function rollupScorecard(input: ScorecardInput): Scorecard {
|
|
193
|
+
const gate = evaluateGate({
|
|
194
|
+
criteria: input.criteria,
|
|
195
|
+
...(input.gatingSeverities !== undefined ? { gatingSeverities: input.gatingSeverities } : {}),
|
|
196
|
+
});
|
|
197
|
+
const variance: Record<string, CriterionVarianceView> = {};
|
|
198
|
+
const reruns = input.reruns ?? {};
|
|
199
|
+
for (const [criterionId, obs] of Object.entries(reruns)) {
|
|
200
|
+
variance[criterionId] = {
|
|
201
|
+
score: evalScoreVariance(obs.scores),
|
|
202
|
+
trajectory: trajectoryVariance(obs.trajectories),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return { gate, variance };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// ── EV-054 deepened: agent-appropriate variance (supersedes blind 15-dim) ─────
|
|
209
|
+
//
|
|
210
|
+
// For an AGENT, "variance" is not a fixed 15-dimension determinism scorecard — it
|
|
211
|
+
// is (a) does the eval VERDICT flap across reruns, (b) does the agent's
|
|
212
|
+
// TRAJECTORY flap in shape (tool path / turn count / sub-agent count), and
|
|
213
|
+
// (c) does the trajectory CONFORM to the subject's expected information-flow
|
|
214
|
+
// (EV-037). A trustworthy agent eval is consistent in all three BEFORE it is
|
|
215
|
+
// accurate. All PURE — no clock/random/network.
|
|
216
|
+
|
|
217
|
+
/** Spread of a list of integers (min/max/distinct) — turn/sub-agent counts. */
|
|
218
|
+
export interface IntSpread {
|
|
219
|
+
min: number;
|
|
220
|
+
max: number;
|
|
221
|
+
distinct: number;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function intSpread(values: number[]): IntSpread {
|
|
225
|
+
if (values.length === 0) return { min: 0, max: 0, distinct: 0 };
|
|
226
|
+
return {
|
|
227
|
+
min: Math.min(...values),
|
|
228
|
+
max: Math.max(...values),
|
|
229
|
+
distinct: new Set(values).size,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** Deepened trajectory variance: tool-sequence + turn-count + sub-agent-count. PURE. */
|
|
234
|
+
export interface TrajectoryShapeVariance {
|
|
235
|
+
/** distinct ordered tool sequences across reruns. */
|
|
236
|
+
distinctToolSeqs: number;
|
|
237
|
+
/** spread of turn counts (trajectory lengths). */
|
|
238
|
+
turnCounts: IntSpread;
|
|
239
|
+
/** spread of sub-agent dispatch counts (tools ∈ dispatchToolNames). */
|
|
240
|
+
subAgentCounts: IntSpread;
|
|
241
|
+
/** stable iff every rerun took the identical tool trajectory. */
|
|
242
|
+
stable: boolean;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Trajectory shape variance across reruns. `dispatchToolNames` (subject-supplied,
|
|
247
|
+
* EV-037) lets the sub-agent-count dimension be subject-agnostic — when omitted,
|
|
248
|
+
* sub-agent counts are all 0. PURE.
|
|
249
|
+
*/
|
|
250
|
+
export function trajectoryShapeVariance(
|
|
251
|
+
trajectories: string[][],
|
|
252
|
+
dispatchToolNames: string[] = [],
|
|
253
|
+
): TrajectoryShapeVariance {
|
|
254
|
+
const dispatch = new Set(dispatchToolNames);
|
|
255
|
+
const distinctToolSeqs = new Set(trajectories.map((t) => t.join("␟"))).size;
|
|
256
|
+
const turnCounts = intSpread(trajectories.map((t) => t.length));
|
|
257
|
+
const subAgentCounts = intSpread(
|
|
258
|
+
trajectories.map((t) => t.filter((name) => dispatch.has(name)).length),
|
|
259
|
+
);
|
|
260
|
+
return {
|
|
261
|
+
distinctToolSeqs,
|
|
262
|
+
turnCounts,
|
|
263
|
+
subAgentCounts,
|
|
264
|
+
stable: distinctToolSeqs <= 1,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/** Trajectory-vs-expected-flow divergence (EV-054 · EV-037). */
|
|
269
|
+
export interface FlowDivergence {
|
|
270
|
+
expected: number;
|
|
271
|
+
covered: number;
|
|
272
|
+
/** expected edges whose `fromTool → toTool` order is NOT respected in the path. */
|
|
273
|
+
uncovered: ExpectedFlowEdge[];
|
|
274
|
+
/** conformant iff every expected edge is covered (fromTool precedes toTool). */
|
|
275
|
+
conformant: boolean;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Does one observed trajectory (ordered tool names) respect the subject's
|
|
280
|
+
* expected information-flow? An expected edge `fromTool → toTool` is COVERED when
|
|
281
|
+
* `fromTool` occurs in the path and `toTool` occurs AFTER its first occurrence.
|
|
282
|
+
* Uncovered edges = the agent skipped/reordered an expected handoff. PURE +
|
|
283
|
+
* deterministic; SUBJECT-AGNOSTIC (the expected-flow is supplied).
|
|
284
|
+
*/
|
|
285
|
+
export function trajectoryFlowDivergence(
|
|
286
|
+
trajectory: string[],
|
|
287
|
+
expected: ExpectedFlow = EMPTY_EXPECTED_FLOW,
|
|
288
|
+
): FlowDivergence {
|
|
289
|
+
const uncovered: ExpectedFlowEdge[] = [];
|
|
290
|
+
let covered = 0;
|
|
291
|
+
for (const edge of expected.edges) {
|
|
292
|
+
const fromIdx = trajectory.indexOf(edge.fromTool);
|
|
293
|
+
const toIdx = trajectory.indexOf(edge.toTool, fromIdx + 1);
|
|
294
|
+
if (fromIdx !== -1 && toIdx !== -1) covered += 1;
|
|
295
|
+
else uncovered.push(edge);
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
expected: expected.edges.length,
|
|
299
|
+
covered,
|
|
300
|
+
uncovered,
|
|
301
|
+
conformant: uncovered.length === 0,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** The agent-appropriate variance view for one criterion across reruns. */
|
|
306
|
+
export interface AgentVarianceView {
|
|
307
|
+
score: ScoreVariance;
|
|
308
|
+
shape: TrajectoryShapeVariance;
|
|
309
|
+
/** per-rerun trajectory conformance to the expected-flow. */
|
|
310
|
+
flow: FlowDivergence[];
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export interface AgentVarianceInput {
|
|
314
|
+
scores: OutcomeVerdictValue[];
|
|
315
|
+
trajectories: string[][];
|
|
316
|
+
expectedFlow?: ExpectedFlow;
|
|
317
|
+
dispatchToolNames?: string[];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* The deepened EV-054 view: score variance + trajectory-shape variance + per-rerun
|
|
322
|
+
* expected-flow conformance. This is the agent-appropriate replacement for the
|
|
323
|
+
* blind 15-dim determinism scorecard. PURE.
|
|
324
|
+
*/
|
|
325
|
+
export function agentVarianceView(input: AgentVarianceInput): AgentVarianceView {
|
|
326
|
+
const expectedFlow = input.expectedFlow ?? EMPTY_EXPECTED_FLOW;
|
|
327
|
+
const dispatch = input.dispatchToolNames ?? expectedFlow.dispatchToolNames;
|
|
328
|
+
return {
|
|
329
|
+
score: evalScoreVariance(input.scores),
|
|
330
|
+
shape: trajectoryShapeVariance(input.trajectories, dispatch),
|
|
331
|
+
flow: input.trajectories.map((t) => trajectoryFlowDivergence(t, expectedFlow)),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/flow-graph.ts — EV-032 trace → information-flow graph (THE FOUNDATION).
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* Deterministic adapter: an `EvalTrace` (events + TOOL observations + sub-agent
|
|
5
|
+
* dispatches) → a subject-agnostic information-flow graph. Nodes are the trace's
|
|
6
|
+
* observations viewed as producers/consumers of named data slots; edges are the
|
|
7
|
+
* data handoffs (a producer's output value that reaches a later consumer's input).
|
|
8
|
+
*
|
|
9
|
+
* This is what "lets the evaluator SEE an agent's context-flow": the context-flow
|
|
10
|
+
* audit (EV-028 tool-result threading · EV-029 sub-agent handoff completeness)
|
|
11
|
+
* reasons over THIS structured graph instead of the raw trace, and the
|
|
12
|
+
* deterministic `diffExpectedFlow` flags which expected threadings are missing
|
|
13
|
+
* (the Code-only half of the Hybrid; the judge interprets severity).
|
|
14
|
+
*
|
|
15
|
+
* SUBJECT-AGNOSTIC: producers/consumers are named by the trace's OWN observation
|
|
16
|
+
* names; the only subject vocabulary (which tool names are sub-agent dispatches)
|
|
17
|
+
* is SUPPLIED via opts (auto-gen EV-049 / authored EV-037), never a constant.
|
|
18
|
+
*
|
|
19
|
+
* PURE + deterministic: no clock / random / network; same trace → same graph.
|
|
20
|
+
* Threading is a deterministic CONTENT-OVERLAP signal (a producer's emitted
|
|
21
|
+
* value string appears verbatim in a later consumer's serialized input).
|
|
22
|
+
*/
|
|
23
|
+
import type { EvalTrace, TraceObservation } from "./contracts/eval-types.ts";
|
|
24
|
+
import {
|
|
25
|
+
EMPTY_EXPECTED_FLOW,
|
|
26
|
+
FlowEdgeKind,
|
|
27
|
+
TEXT_SLOT,
|
|
28
|
+
VALUE_SLOT,
|
|
29
|
+
type ExpectedFlow,
|
|
30
|
+
type ExpectedFlowDiff,
|
|
31
|
+
type ExpectedFlowEdge,
|
|
32
|
+
type FlowEdge,
|
|
33
|
+
type FlowGraph,
|
|
34
|
+
type FlowNode,
|
|
35
|
+
type UnthreadedOutput,
|
|
36
|
+
} from "./contracts/flow-graph.ts";
|
|
37
|
+
|
|
38
|
+
/** Options for `buildFlowGraph`. All optional → standalone-pure default. */
|
|
39
|
+
export interface FlowGraphOptions {
|
|
40
|
+
/**
|
|
41
|
+
* Tool/step names that are sub-agent DISPATCHES (EV-029). A node with one of
|
|
42
|
+
* these names produces a context HANDOFF rather than a plain tool result.
|
|
43
|
+
* SUPPLIED by the subject profile — never a module constant.
|
|
44
|
+
*/
|
|
45
|
+
dispatchToolNames?: string[];
|
|
46
|
+
/**
|
|
47
|
+
* Minimum length of a producer slot's value string for it to count as a
|
|
48
|
+
* threadable token (avoids trivial `true`/`1`/`""` matches). Default 12.
|
|
49
|
+
*/
|
|
50
|
+
minThreadLen?: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const DEFAULT_MIN_THREAD_LEN = 12;
|
|
54
|
+
|
|
55
|
+
/** Stable node id by position. */
|
|
56
|
+
function nodeId(index: number): string {
|
|
57
|
+
return `n${index}`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Top-level slot keys of a payload. Primitive → a single sentinel slot. */
|
|
61
|
+
function slotKeysOf(payload: unknown, primitiveSlot: string): string[] {
|
|
62
|
+
if (payload === undefined || payload === null) return [];
|
|
63
|
+
if (typeof payload === "object" && !Array.isArray(payload)) {
|
|
64
|
+
return Object.keys(payload as Record<string, unknown>).sort();
|
|
65
|
+
}
|
|
66
|
+
// primitive or array → one opaque value slot
|
|
67
|
+
return [primitiveSlot];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The string value of a producer slot (for content-overlap threading). */
|
|
71
|
+
function slotValueString(payload: unknown, slot: string): string {
|
|
72
|
+
if (slot === VALUE_SLOT || slot === TEXT_SLOT) {
|
|
73
|
+
return typeof payload === "string" ? payload : safeJson(payload);
|
|
74
|
+
}
|
|
75
|
+
if (payload !== null && typeof payload === "object") {
|
|
76
|
+
const v = (payload as Record<string, unknown>)[slot];
|
|
77
|
+
return typeof v === "string" ? v : safeJson(v);
|
|
78
|
+
}
|
|
79
|
+
return "";
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Deterministic JSON serialization (sorted keys), tolerant of cycles. */
|
|
83
|
+
function safeJson(value: unknown): string {
|
|
84
|
+
try {
|
|
85
|
+
return JSON.stringify(value, (_k, v) =>
|
|
86
|
+
v !== null && typeof v === "object" && !Array.isArray(v)
|
|
87
|
+
? sortObject(v as Record<string, unknown>)
|
|
88
|
+
: v,
|
|
89
|
+
);
|
|
90
|
+
} catch {
|
|
91
|
+
return "";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function sortObject(o: Record<string, unknown>): Record<string, unknown> {
|
|
96
|
+
const out: Record<string, unknown> = {};
|
|
97
|
+
for (const k of Object.keys(o).sort()) out[k] = o[k];
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The serialized consumer-input string for a node (what later context carries). */
|
|
102
|
+
function consumerText(o: TraceObservation): string {
|
|
103
|
+
if (o.input === undefined) return "";
|
|
104
|
+
return typeof o.input === "string" ? o.input : safeJson(o.input);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Build one node from an observation. */
|
|
108
|
+
function toNode(o: TraceObservation, index: number, dispatch: Set<string>): FlowNode {
|
|
109
|
+
const name = typeof o.name === "string" ? o.name : "";
|
|
110
|
+
return {
|
|
111
|
+
id: nodeId(index),
|
|
112
|
+
index,
|
|
113
|
+
type: typeof o.type === "string" ? o.type : "UNKNOWN",
|
|
114
|
+
name,
|
|
115
|
+
produces: slotKeysOf(o.output, VALUE_SLOT),
|
|
116
|
+
consumes: slotKeysOf(o.input, TEXT_SLOT),
|
|
117
|
+
isHandoff: name.length > 0 && dispatch.has(name),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Build the information-flow graph for a trace. PURE + deterministic.
|
|
123
|
+
*
|
|
124
|
+
* Edges are emitted when a producer slot's value string (length ≥ minThreadLen)
|
|
125
|
+
* appears verbatim in a LATER node's serialized input — the deterministic
|
|
126
|
+
* "this output was threaded into that context" signal. A producer slot that
|
|
127
|
+
* matched NO downstream consumer is recorded in `unthreadedOutputs` (the EV-028
|
|
128
|
+
* candidate the judge then adjudicates).
|
|
129
|
+
*/
|
|
130
|
+
export function buildFlowGraph(
|
|
131
|
+
trace: EvalTrace,
|
|
132
|
+
opts: FlowGraphOptions = {},
|
|
133
|
+
): FlowGraph {
|
|
134
|
+
const dispatch = new Set(opts.dispatchToolNames ?? []);
|
|
135
|
+
const minLen = opts.minThreadLen ?? DEFAULT_MIN_THREAD_LEN;
|
|
136
|
+
const obs = trace.observations ?? [];
|
|
137
|
+
const nodes = obs.map((o, i) => toNode(o, i, dispatch));
|
|
138
|
+
|
|
139
|
+
// Pre-serialize every node's consumer-input once (O(n) not O(n²·serialize)).
|
|
140
|
+
const consumerTexts = obs.map((o) => consumerText(o));
|
|
141
|
+
|
|
142
|
+
const edges: FlowEdge[] = [];
|
|
143
|
+
const unthreaded: UnthreadedOutput[] = [];
|
|
144
|
+
|
|
145
|
+
for (let p = 0; p < nodes.length; p += 1) {
|
|
146
|
+
const producer = nodes[p];
|
|
147
|
+
for (const slot of producer.produces) {
|
|
148
|
+
const value = slotValueString(obs[p].output, slot).trim();
|
|
149
|
+
if (value.length < minLen) continue; // trivial value → not a threadable token
|
|
150
|
+
let threaded = false;
|
|
151
|
+
for (let c = p + 1; c < nodes.length; c += 1) {
|
|
152
|
+
if (consumerTexts[c].includes(value)) {
|
|
153
|
+
edges.push({
|
|
154
|
+
from: producer.id,
|
|
155
|
+
to: nodes[c].id,
|
|
156
|
+
slot,
|
|
157
|
+
kind: producer.isHandoff ? FlowEdgeKind.Handoff : FlowEdgeKind.Threaded,
|
|
158
|
+
});
|
|
159
|
+
threaded = true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!threaded) {
|
|
163
|
+
unthreaded.push({ node: producer.id, name: producer.name, slot });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
traceId: trace.id,
|
|
170
|
+
nodes,
|
|
171
|
+
edges,
|
|
172
|
+
unthreadedOutputs: unthreaded,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Diff an actual flow-graph against an expected-flow (EV-037). DETERMINISTIC: an
|
|
178
|
+
* expected edge `fromTool → toTool [slot]` is SATISFIED iff the graph has an edge
|
|
179
|
+
* from a node named `fromTool` to a node named `toTool` (matching `slot` when the
|
|
180
|
+
* expected edge pins one). Missing edges are the lossy-handoff / dropped-thread
|
|
181
|
+
* candidates the context-flow judge then adjudicates (EV-028/029). This is the
|
|
182
|
+
* Code-only half of the Hybrid — it decides nothing about severity.
|
|
183
|
+
*/
|
|
184
|
+
export function diffExpectedFlow(
|
|
185
|
+
graph: FlowGraph,
|
|
186
|
+
expected: ExpectedFlow = EMPTY_EXPECTED_FLOW,
|
|
187
|
+
): ExpectedFlowDiff {
|
|
188
|
+
const nameById = new Map(graph.nodes.map((n) => [n.id, n.name]));
|
|
189
|
+
const satisfied: ExpectedFlowEdge[] = [];
|
|
190
|
+
const missing: ExpectedFlowEdge[] = [];
|
|
191
|
+
|
|
192
|
+
for (const exp of expected.edges) {
|
|
193
|
+
const hit = graph.edges.some((e) => {
|
|
194
|
+
const fromName = nameById.get(e.from);
|
|
195
|
+
const toName = nameById.get(e.to);
|
|
196
|
+
if (fromName !== exp.fromTool || toName !== exp.toTool) return false;
|
|
197
|
+
return exp.slot === undefined || e.slot === exp.slot;
|
|
198
|
+
});
|
|
199
|
+
if (hit) satisfied.push(exp);
|
|
200
|
+
else missing.push(exp);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return { satisfied, missing };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* The deterministic context-flow CANDIDATE leaks the EV-028/029 judge then
|
|
208
|
+
* adjudicates (Code-only PREP, the deterministic half of the Hybrid):
|
|
209
|
+
* - `unthreadedOutputs` — producer slots whose value never reached a consumer
|
|
210
|
+
* (EV-028 tool-result-threading candidates).
|
|
211
|
+
* - `lossyHandoffs` — expected-flow edges ABSENT from the actual graph
|
|
212
|
+
* (EV-029 sub-agent-handoff-completeness candidates: the dispatch brief did
|
|
213
|
+
* not carry the context the expected-flow says the child needs).
|
|
214
|
+
* This DECIDES NOTHING about severity or whether a candidate is a true leak —
|
|
215
|
+
* that is the context-flow lens' judgment over this structured bundle.
|
|
216
|
+
*/
|
|
217
|
+
export interface ContextFlowCandidates {
|
|
218
|
+
unthreadedOutputs: UnthreadedOutput[];
|
|
219
|
+
lossyHandoffs: ExpectedFlowEdge[];
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function contextFlowCandidates(
|
|
223
|
+
graph: FlowGraph,
|
|
224
|
+
expected: ExpectedFlow = EMPTY_EXPECTED_FLOW,
|
|
225
|
+
): ContextFlowCandidates {
|
|
226
|
+
return {
|
|
227
|
+
unthreadedOutputs: graph.unthreadedOutputs,
|
|
228
|
+
lossyHandoffs: diffExpectedFlow(graph, expected).missing,
|
|
229
|
+
};
|
|
230
|
+
}
|