@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
package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/llm-sample.ts
ADDED
|
@@ -0,0 +1,681 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/awareness/llm-sample.ts
|
|
3
|
+
* R2.2 — awareness-layer LLM mini-sample (REPIVOT; NO severity weights).
|
|
4
|
+
* Type A — Pure Script (deterministic SELECTION + result structuring; clock injected).
|
|
5
|
+
*
|
|
6
|
+
* THE R2.2 INSIGHT (Wave-6 plan §4 R2.2): latency auto-wins as the "primary signal"
|
|
7
|
+
* because Tier-0 can only MEASURE cheap signals — that is a MEASUREMENT problem,
|
|
8
|
+
* not a scoring one. Re-weighting signals by severity (the abandoned scoring-bias
|
|
9
|
+
* thread) treats the symptom. The fix is at the MEASUREMENT layer: fire a tiny 5-trace LLM
|
|
10
|
+
* mini-sample BEFORE primary-signal selection to DISCOVER signals Tier-0 cannot see
|
|
11
|
+
* (hallucination, handoff-loss, prompt-underspec…), then feed those into selection.
|
|
12
|
+
*
|
|
13
|
+
* THIS MODULE is the deterministic plumbing: it SELECTS which 5 traces the LLM
|
|
14
|
+
* mini-sample reads (a spread across the population), and STRUCTURES the awareness
|
|
15
|
+
* result into runMeta.awarenessSample. The LLM reasoning itself is performed by the
|
|
16
|
+
* diagnostics-analyzer agent (host-native) — this module never calls an LLM.
|
|
17
|
+
*
|
|
18
|
+
* FIRE POLICY: the awareness sample fires on FRESH runs ONLY. When the class-memory
|
|
19
|
+
* library already has priors for the entity (R2.3), the awareness layer is SKIPPED
|
|
20
|
+
* (the priors already encode the discovered signals) and the Methodology renders a
|
|
21
|
+
* placeholder. shouldFireAwareness() encodes this.
|
|
22
|
+
*
|
|
23
|
+
* CAP ACCOUNTING (R2.1): the 5 awareness traces COUNT against the deep-read caps —
|
|
24
|
+
* they are not double-counted. The caller adds AWARENESS_SAMPLE_SIZE to tracesRead.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { existsSync, readFileSync } from "fs";
|
|
28
|
+
import type { TraceMetadata } from "../normalize/trace.ts";
|
|
29
|
+
import { runMetaPath } from "../run/session.ts";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* R2.2 — the ORIGINAL minimal awareness mini-sample floor (~$0.50/run). Retained as an
|
|
33
|
+
* explicit knob value for LOUD-ONLY runs where Tier-0 already caught the fault and a thin
|
|
34
|
+
* deep read is enough. NO LONGER the default effective sample size — see
|
|
35
|
+
* AWARENESS_SAMPLE_DEFAULT below.
|
|
36
|
+
*/
|
|
37
|
+
export const AWARENESS_SAMPLE_SIZE = 5;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* V3-1 (SL-5-grounded) — the NEW default effective awareness deep-read sample size.
|
|
41
|
+
*
|
|
42
|
+
* OPERATOR RATIONALE (load-bearing design intent — do not silently revert):
|
|
43
|
+
* Tier-0 is a cheap mechanical census that catches LOUD faults — if Tier-0 flags it,
|
|
44
|
+
* a deep read often isn't needed for THAT fault. The awareness deep-read exists to
|
|
45
|
+
* surface the signals Tier-0 CANNOT see, so the diagnostician can COMBINE
|
|
46
|
+
* Tier-0 ∪ deep-read signals to pick the primary signal correctly. N=5 leaves the deep
|
|
47
|
+
* read too thin to surface those other signals → the run is stuck on Tier-0 alone →
|
|
48
|
+
* risk of a bad primary-signal bet. Default 50 makes the deep read substantive; the
|
|
49
|
+
* knob (--awareness-sample <N> / --size <N>) still allows a small N for loud-only runs.
|
|
50
|
+
*
|
|
51
|
+
* Overridable via the CLI (--awareness-sample / --size); callers that pass no size get 50.
|
|
52
|
+
*/
|
|
53
|
+
export const AWARENESS_SAMPLE_DEFAULT = 50;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Wave-17 Block B — expanded discovery first-pass size. The original 5-trace
|
|
57
|
+
* mini-sample (AWARENESS_SAMPLE_SIZE) is too small to give the awareness layer
|
|
58
|
+
* statistical power: with only 5 reads, a failure mode present in (say) 15% of
|
|
59
|
+
* traces has a real chance of never appearing in the sample. A ~12-trace
|
|
60
|
+
* first-pass meaningfully raises the odds of surfacing Tier-0-invisible signals
|
|
61
|
+
* while staying cheap (~$1.20/run) and inside the deep-read cap (reconciled via
|
|
62
|
+
* caps.ts:reconcileFirstPass). Callers can override the size param to tune this.
|
|
63
|
+
*/
|
|
64
|
+
export const AWARENESS_DISCOVERY_SIZE = 12;
|
|
65
|
+
|
|
66
|
+
// ── V3-2: cascade first-pass seed = min(originalSampleN, AWARENESS_SAMPLE_DEFAULT) ──
|
|
67
|
+
//
|
|
68
|
+
// OPERATOR RATIONALE (load-bearing — do not silently revert to a fixed 12):
|
|
69
|
+
// On a fresh run the awareness deep-read defaults to AWARENESS_SAMPLE_DEFAULT (50,
|
|
70
|
+
// the SL-5-validated floor). On a `--run-id` cascade the FIRST-PASS previously used
|
|
71
|
+
// a FIXED AWARENESS_DISCOVERY_SIZE (12) regardless of how deep the ORIGINAL run
|
|
72
|
+
// actually read — a shallow cascade over a deep original. The seed should instead
|
|
73
|
+
// SCALE with the original run's depth: first-pass N = min(originalSampleN, 50).
|
|
74
|
+
// So an original that read 50 → 50, 30 → 30, 12 → 12, 80 → 50 (capped at the floor).
|
|
75
|
+
//
|
|
76
|
+
// The ORIGINAL run's effective depth is persisted as runMeta.awarenessSampleSize in
|
|
77
|
+
// its per-run run-meta.json (see config/schema.ts + run/session.ts). When it genuinely
|
|
78
|
+
// cannot be recovered (legacy run, absent file, unset field), we fall back to
|
|
79
|
+
// AWARENESS_SAMPLE_DEFAULT (50) — NEVER silently to the legacy 12 — and the CLI logs why.
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* PURE — compute the cascade first-pass sample size from the ORIGINAL run's recorded
|
|
83
|
+
* awareness depth. `min(originalSampleN, AWARENESS_SAMPLE_DEFAULT)` when recovered as a
|
|
84
|
+
* positive finite number; otherwise the fallback = AWARENESS_SAMPLE_DEFAULT (50, NOT the
|
|
85
|
+
* legacy AWARENESS_DISCOVERY_SIZE of 12). No I/O, no clock — trivially testable.
|
|
86
|
+
*/
|
|
87
|
+
export function cascadeFirstPassSize(originalSampleN?: number): number {
|
|
88
|
+
if (typeof originalSampleN === "number" && Number.isFinite(originalSampleN) && originalSampleN > 0) {
|
|
89
|
+
return Math.min(originalSampleN, AWARENESS_SAMPLE_DEFAULT);
|
|
90
|
+
}
|
|
91
|
+
return AWARENESS_SAMPLE_DEFAULT;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* PURE — parse a run-meta.json STRING and extract the recorded awareness sample size.
|
|
96
|
+
* Returns the number only when it is a positive finite value; otherwise undefined
|
|
97
|
+
* (absent field, wrong type, non-positive, malformed JSON, or undefined input). The
|
|
98
|
+
* fs read is done by recoverOriginalSampleN so this stays a pure, dependency-free unit.
|
|
99
|
+
*/
|
|
100
|
+
export function parseRecordedSampleN(runMetaJson?: string): number | undefined {
|
|
101
|
+
if (!runMetaJson || runMetaJson.trim().length === 0) return undefined;
|
|
102
|
+
let parsed: unknown;
|
|
103
|
+
try {
|
|
104
|
+
parsed = JSON.parse(runMetaJson);
|
|
105
|
+
} catch {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
if (typeof parsed !== "object" || parsed === null) return undefined;
|
|
109
|
+
const n = (parsed as Record<string, unknown>).awarenessSampleSize;
|
|
110
|
+
return typeof n === "number" && Number.isFinite(n) && n > 0 ? n : undefined;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Recover the ORIGINAL run's recorded awareness sample size from its persisted
|
|
115
|
+
* run-meta.json (`<configRoot>/.mutagent/diagnostics/diagnostics-history/<runId>/run-meta.json`).
|
|
116
|
+
* Returns the recorded size, or undefined when the file is absent / unreadable / the
|
|
117
|
+
* field is unset — the caller then falls back to AWARENESS_SAMPLE_DEFAULT.
|
|
118
|
+
*
|
|
119
|
+
* Type A — Pure Script (read-only file I/O; base dir INJECTED via configRoot, mirroring
|
|
120
|
+
* library/store.ts). Never throws — a recovery miss is a fallback, not an error.
|
|
121
|
+
*/
|
|
122
|
+
export function recoverOriginalSampleN(runId: string, configRoot: string = process.cwd()): number | undefined {
|
|
123
|
+
const path = runMetaPath(configRoot, runId);
|
|
124
|
+
if (!existsSync(path)) return undefined;
|
|
125
|
+
try {
|
|
126
|
+
return parseRecordedSampleN(readFileSync(path, "utf8"));
|
|
127
|
+
} catch {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ── Wave-17 Block B: deterministic seeded PRNG for the random reserve ─────────
|
|
133
|
+
//
|
|
134
|
+
// The cascade ranking (below) ALWAYS reserves a random portion so that failures
|
|
135
|
+
// Tier-0 / objection-scan / feedback can't see still surface. "Random" here must
|
|
136
|
+
// be DETERMINISTIC: same corpus + same runId ⇒ same reserve, every run (no
|
|
137
|
+
// Date.now, no Math.random — those would make the sample non-reproducible and
|
|
138
|
+
// break byte-stable report tests). We derive the reserve from a seeded PRNG whose
|
|
139
|
+
// seed is hash(corpus + runId): the corpus key is the stable join of the sorted
|
|
140
|
+
// trace IDs (so it depends only on WHICH traces are in scope, not their order),
|
|
141
|
+
// and runId distinguishes successive runs over the same corpus so the reserve
|
|
142
|
+
// rotates across runs rather than re-picking the identical traces forever.
|
|
143
|
+
|
|
144
|
+
/** 32-bit FNV-1a hash of a string → unsigned int seed. Deterministic, no I/O. */
|
|
145
|
+
function fnv1a32(input: string): number {
|
|
146
|
+
let hash = 0x811c9dc5; // FNV offset basis.
|
|
147
|
+
for (let i = 0; i < input.length; i++) {
|
|
148
|
+
hash ^= input.charCodeAt(i);
|
|
149
|
+
// FNV prime 16777619, kept in 32-bit range via Math.imul.
|
|
150
|
+
hash = Math.imul(hash, 0x01000193);
|
|
151
|
+
}
|
|
152
|
+
return hash >>> 0; // force unsigned 32-bit.
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* mulberry32 — a tiny, well-distributed seeded PRNG. Given a 32-bit seed it yields
|
|
157
|
+
* a deterministic stream of floats in [0, 1). Same seed ⇒ identical stream. Pure.
|
|
158
|
+
*/
|
|
159
|
+
function mulberry32(seed: number): () => number {
|
|
160
|
+
let a = seed >>> 0;
|
|
161
|
+
return function next(): number {
|
|
162
|
+
a |= 0;
|
|
163
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
164
|
+
let t = Math.imul(a ^ (a >>> 15), 1 | a);
|
|
165
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
166
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Build the stable corpus key for a population: the sorted, joined trace IDs.
|
|
172
|
+
* Depends only on the SET of traces in scope (order-independent). Exported so the
|
|
173
|
+
* seed derivation is testable + reusable by callers that pre-compute it.
|
|
174
|
+
*/
|
|
175
|
+
export function corpusKey(traces: TraceMetadata[]): string {
|
|
176
|
+
return traces
|
|
177
|
+
.map((t) => t.traceId)
|
|
178
|
+
.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
|
|
179
|
+
.join(""); // SOH separator — can't appear inside a normal trace ID.
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Derive the deterministic reserve seed from the corpus + runId. Exported so a
|
|
184
|
+
* caller (or test) can reproduce the exact seed used for a given run.
|
|
185
|
+
*/
|
|
186
|
+
export function reserveSeed(traces: TraceMetadata[], runId: string): number {
|
|
187
|
+
return fnv1a32(`${corpusKey(traces)}${runId}`); // STX separates corpus from runId.
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Deterministically shuffle `ids` using a mulberry32 stream seeded from
|
|
192
|
+
* hash(corpus + runId). Same (corpus, runId) ⇒ same order. This is the engine
|
|
193
|
+
* behind the cascade's random reserve: we shuffle the non-prioritized remainder
|
|
194
|
+
* and take from the front. Fisher-Yates with the seeded PRNG. Pure.
|
|
195
|
+
*/
|
|
196
|
+
function seededShuffle(ids: string[], seed: number): string[] {
|
|
197
|
+
const out = [...ids];
|
|
198
|
+
const rand = mulberry32(seed);
|
|
199
|
+
for (let i = out.length - 1; i > 0; i--) {
|
|
200
|
+
const j = Math.floor(rand() * (i + 1));
|
|
201
|
+
const tmp = out[i];
|
|
202
|
+
out[i] = out[j];
|
|
203
|
+
out[j] = tmp;
|
|
204
|
+
}
|
|
205
|
+
return out;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export interface AwarenessFirePolicyInput {
|
|
209
|
+
/** R2.3 — reference into the class-memory library, when priors exist. */
|
|
210
|
+
priorSignalsRef?: string;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export interface AwarenessFireDecision {
|
|
214
|
+
/** True → fire the 5-trace LLM mini-sample. False → SKIP (priors exist). */
|
|
215
|
+
fire: boolean;
|
|
216
|
+
/** Why the decision was made (rendered in the placeholder when skipped). */
|
|
217
|
+
reason: string;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* R2.2 fire policy: fire on FRESH runs only; SKIP when library priors exist.
|
|
222
|
+
* Pure boolean logic.
|
|
223
|
+
*/
|
|
224
|
+
export function shouldFireAwareness(input: AwarenessFirePolicyInput): AwarenessFireDecision {
|
|
225
|
+
if (input.priorSignalsRef && input.priorSignalsRef.trim().length > 0) {
|
|
226
|
+
return {
|
|
227
|
+
fire: false,
|
|
228
|
+
reason: `Library priors exist (${input.priorSignalsRef}); awareness layer skipped (R2.2).`,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return { fire: true, reason: "Fresh run — firing the 5-trace awareness mini-sample (R2.2)." };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Deterministically SELECT the traces the awareness mini-sample reads. Uses an
|
|
236
|
+
* even stride across the population (sorted by traceId for stability) so the
|
|
237
|
+
* sampled traces SPREAD across the run rather than clustering on the worst tail
|
|
238
|
+
* (the point is to DISCOVER, not to confirm the already-loud signal). Returns up
|
|
239
|
+
* to `size` trace IDs; `size` defaults to AWARENESS_SAMPLE_DEFAULT (V3-1) so a
|
|
240
|
+
* caller that passes no value gets a substantive deep read (50), not the old thin
|
|
241
|
+
* floor of 5.
|
|
242
|
+
*
|
|
243
|
+
* Pure + deterministic — NO random, NO clock.
|
|
244
|
+
*/
|
|
245
|
+
export function selectAwarenessTraces(
|
|
246
|
+
traces: TraceMetadata[],
|
|
247
|
+
size: number = AWARENESS_SAMPLE_DEFAULT
|
|
248
|
+
): string[] {
|
|
249
|
+
if (traces.length === 0) return [];
|
|
250
|
+
// Stable order by traceId so selection is deterministic regardless of input order.
|
|
251
|
+
const sorted = [...traces].sort((a, b) => (a.traceId < b.traceId ? -1 : a.traceId > b.traceId ? 1 : 0));
|
|
252
|
+
const n = sorted.length;
|
|
253
|
+
const take = Math.min(size, n);
|
|
254
|
+
if (take === n) return sorted.map((t) => t.traceId);
|
|
255
|
+
const selected: string[] = [];
|
|
256
|
+
// Even stride across [0, n): pick at fractional positions, floor to index.
|
|
257
|
+
for (let i = 0; i < take; i++) {
|
|
258
|
+
const idx = Math.floor((i * n) / take);
|
|
259
|
+
selected.push(sorted[idx].traceId);
|
|
260
|
+
}
|
|
261
|
+
return selected;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ── Wave-17 Block B: CASCADE selection (priority bands + random reserve) ──────
|
|
265
|
+
//
|
|
266
|
+
// selectAwarenessTraces (above) spreads evenly to DISCOVER. The cascade adds
|
|
267
|
+
// targeting: when we have cheap priority signals (operator feedback, objection
|
|
268
|
+
// cues, Tier-0 flags) we should LOOK THERE FIRST — but we must NOT let the loud
|
|
269
|
+
// signals consume the whole budget, or we only ever confirm what we can already
|
|
270
|
+
// see. So the cascade fills the sample from ranked bands in order, then ALWAYS
|
|
271
|
+
// reserves a deterministic-random portion so Tier-0-INVISIBLE failures surface:
|
|
272
|
+
//
|
|
273
|
+
// Band 1 feedback/low-score (operator-stated reality + low normalizedScore)
|
|
274
|
+
// Band 2 objection-scan hit (user objection cues — sampling priority)
|
|
275
|
+
// Band 3 Tier-0-flagged (hasError / hasFeedback — cheap measurable signal)
|
|
276
|
+
// Band 4 random reserve (seeded shuffle of the remainder — ALWAYS ≥ reserve)
|
|
277
|
+
//
|
|
278
|
+
// Two further invariants compose in:
|
|
279
|
+
// - LEDGER SUBTRACTION: traces already deep-read in a prior run (injected
|
|
280
|
+
// `isLedgered` predicate) are removed FIRST → the sample is MARGINAL reads only.
|
|
281
|
+
// - DETERMINISM: the reserve is a seeded shuffle (hash(corpus+runId)); the whole
|
|
282
|
+
// function has no clock + no Math.random → byte-stable across re-runs.
|
|
283
|
+
|
|
284
|
+
/** A low normalizedScore at/below this counts as a Band-1 "low-score" candidate. */
|
|
285
|
+
export const LOW_SCORE_THRESHOLD = 0.5;
|
|
286
|
+
|
|
287
|
+
export interface CascadeSelectionInput {
|
|
288
|
+
/** The full population in scope (post-fetch, pre-ledger). */
|
|
289
|
+
traces: TraceMetadata[];
|
|
290
|
+
/** Stable run identifier — seeds the random reserve so it rotates across runs. */
|
|
291
|
+
runId: string;
|
|
292
|
+
/**
|
|
293
|
+
* Trace IDs the objection scan flagged (scan/objection.ts → byTrace where hit).
|
|
294
|
+
* Band 2 priority. Pass [] when the scan did not run.
|
|
295
|
+
*/
|
|
296
|
+
objectionHitTraceIds?: string[];
|
|
297
|
+
/**
|
|
298
|
+
* LEDGER predicate (R2 clean boundary): returns true when a trace was already
|
|
299
|
+
* deep-read in a prior run and must be EXCLUDED (marginal reads only). Injected
|
|
300
|
+
* so this module stays pure/IO-free — the caller wires library/store.ts:
|
|
301
|
+
* `(id) => isLedgered(entityName, id)`. Omit → nothing is subtracted.
|
|
302
|
+
*/
|
|
303
|
+
isLedgered?: (traceId: string) => boolean; // eslint-disable-line no-unused-vars
|
|
304
|
+
/** Total sample size to fill (default = expanded discovery size). */
|
|
305
|
+
size?: number;
|
|
306
|
+
/**
|
|
307
|
+
* Minimum random-reserve slots that MUST come from Band 4 even when priority
|
|
308
|
+
* bands could fill the whole sample. Guarantees Tier-0-invisible coverage.
|
|
309
|
+
* Defaults to ~⅓ of `size` (floored, ≥1 when size ≥ 1).
|
|
310
|
+
*/
|
|
311
|
+
minReserve?: number;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export interface CascadeSelectionResult {
|
|
315
|
+
/** Final selected trace IDs (≤ size), in band order then reserve order. */
|
|
316
|
+
selected: string[];
|
|
317
|
+
/** Per-band attribution for the Methodology tab + tests (deterministic). */
|
|
318
|
+
bands: {
|
|
319
|
+
feedbackLowScore: string[];
|
|
320
|
+
objection: string[];
|
|
321
|
+
tier0: string[];
|
|
322
|
+
randomReserve: string[];
|
|
323
|
+
};
|
|
324
|
+
/** Count removed by ledger subtraction (marginal-reads accounting). */
|
|
325
|
+
ledgeredExcluded: number;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/** True when a trace carries a Band-1 feedback/low-score signal. */
|
|
329
|
+
function isFeedbackLowScore(t: TraceMetadata): boolean {
|
|
330
|
+
if (t.hasFeedback) return true;
|
|
331
|
+
return typeof t.normalizedScore === "number" && t.normalizedScore <= LOW_SCORE_THRESHOLD;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/** True when a trace carries a Band-3 Tier-0-measurable signal (cheap). */
|
|
335
|
+
function isTier0Flagged(t: TraceMetadata): boolean {
|
|
336
|
+
if (t.hasError) return true;
|
|
337
|
+
if ((t.skillBehaviorDeviationCount ?? 0) > 0) return true;
|
|
338
|
+
if (Array.isArray(t.apiErrors) && t.apiErrors.length > 0) return true;
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Wave-17 Block B — CASCADE awareness selection. Ledger-subtracts, ranks candidates
|
|
344
|
+
* into priority bands, and ALWAYS includes a deterministic-random reserve so
|
|
345
|
+
* Tier-0-invisible failures surface. Pure + deterministic (seed = hash(corpus+runId);
|
|
346
|
+
* no clock, no Math.random). Returns the selection plus per-band attribution.
|
|
347
|
+
*/
|
|
348
|
+
export function selectAwarenessTracesCascade(input: CascadeSelectionInput): CascadeSelectionResult {
|
|
349
|
+
const size = input.size ?? AWARENESS_DISCOVERY_SIZE;
|
|
350
|
+
const emptyBands = { feedbackLowScore: [], objection: [], tier0: [], randomReserve: [] };
|
|
351
|
+
if (size <= 0 || input.traces.length === 0) {
|
|
352
|
+
return { selected: [], bands: { ...emptyBands }, ledgeredExcluded: 0 };
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// 1. LEDGER SUBTRACTION (marginal reads only). Stable order by traceId so all
|
|
356
|
+
// downstream banding is deterministic regardless of input order.
|
|
357
|
+
const sorted = [...input.traces].sort((a, b) =>
|
|
358
|
+
a.traceId < b.traceId ? -1 : a.traceId > b.traceId ? 1 : 0
|
|
359
|
+
);
|
|
360
|
+
const isLedgered = input.isLedgered ?? (() => false);
|
|
361
|
+
const marginal = sorted.filter((t) => !isLedgered(t.traceId));
|
|
362
|
+
const ledgeredExcluded = sorted.length - marginal.length;
|
|
363
|
+
if (marginal.length === 0) {
|
|
364
|
+
return { selected: [], bands: { ...emptyBands }, ledgeredExcluded };
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// 2. RESERVE accounting: how many slots are GUARANTEED to Band 4.
|
|
368
|
+
const reserveDefault = Math.max(size >= 1 ? 1 : 0, Math.floor(size / 3));
|
|
369
|
+
const minReserve = Math.min(
|
|
370
|
+
size,
|
|
371
|
+
Math.max(0, input.minReserve ?? reserveDefault)
|
|
372
|
+
);
|
|
373
|
+
const prioritySlots = size - minReserve;
|
|
374
|
+
|
|
375
|
+
const objectionHits = new Set(input.objectionHitTraceIds ?? []);
|
|
376
|
+
const selected = new Set<string>();
|
|
377
|
+
const bands = {
|
|
378
|
+
feedbackLowScore: [] as string[],
|
|
379
|
+
objection: [] as string[],
|
|
380
|
+
tier0: [] as string[],
|
|
381
|
+
randomReserve: [] as string[],
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
// 3. Fill PRIORITY bands in cascade order, never exceeding prioritySlots. Each
|
|
385
|
+
// trace lands in the FIRST band it qualifies for (no double-count).
|
|
386
|
+
const tryAddPriority = (id: string, band: keyof typeof bands): void => {
|
|
387
|
+
if (selected.size >= prioritySlots) return;
|
|
388
|
+
if (selected.has(id)) return;
|
|
389
|
+
selected.add(id);
|
|
390
|
+
bands[band].push(id);
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
for (const t of marginal) {
|
|
394
|
+
if (selected.size >= prioritySlots) break;
|
|
395
|
+
if (isFeedbackLowScore(t)) tryAddPriority(t.traceId, "feedbackLowScore");
|
|
396
|
+
}
|
|
397
|
+
for (const t of marginal) {
|
|
398
|
+
if (selected.size >= prioritySlots) break;
|
|
399
|
+
if (objectionHits.has(t.traceId)) tryAddPriority(t.traceId, "objection");
|
|
400
|
+
}
|
|
401
|
+
for (const t of marginal) {
|
|
402
|
+
if (selected.size >= prioritySlots) break;
|
|
403
|
+
if (isTier0Flagged(t)) tryAddPriority(t.traceId, "tier0");
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// 4. RANDOM RESERVE: seeded-shuffle the not-yet-selected marginal remainder and
|
|
407
|
+
// take from the front until the sample is full. Seed = hash(corpus + runId)
|
|
408
|
+
// over the FULL marginal set so the reserve is stable + reproducible.
|
|
409
|
+
const seed = reserveSeed(marginal, input.runId);
|
|
410
|
+
const remainder = marginal.map((t) => t.traceId).filter((id) => !selected.has(id));
|
|
411
|
+
const shuffled = seededShuffle(remainder, seed);
|
|
412
|
+
for (const id of shuffled) {
|
|
413
|
+
if (selected.size >= size) break;
|
|
414
|
+
selected.add(id);
|
|
415
|
+
bands.randomReserve.push(id);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return { selected: Array.from(selected), bands, ledgeredExcluded };
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
export interface AwarenessSample {
|
|
422
|
+
/** Trace IDs the LLM mini-sample read. */
|
|
423
|
+
traces: string[];
|
|
424
|
+
/** Signal/finding labels the LLM surfaced (free-form, agent-supplied). */
|
|
425
|
+
findings: string[];
|
|
426
|
+
/** ISO8601 timestamp the sample fired (INJECTED — deterministic in tests). */
|
|
427
|
+
firedAt: string;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Structure an awareness result into runMeta.awarenessSample. The `findings` come
|
|
432
|
+
* from the analyzer agent's LLM pass; this function just packages them with the
|
|
433
|
+
* selected traces + an INJECTED timestamp. Pure.
|
|
434
|
+
*/
|
|
435
|
+
export function buildAwarenessSample(
|
|
436
|
+
selectedTraces: string[],
|
|
437
|
+
discoveredSignals: string[],
|
|
438
|
+
firedAtIso: string
|
|
439
|
+
): AwarenessSample {
|
|
440
|
+
return {
|
|
441
|
+
traces: selectedTraces,
|
|
442
|
+
findings: discoveredSignals,
|
|
443
|
+
firedAt: firedAtIso,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// ── PRD-MP-08: feedback-source-aware trace selection ─────────────────────────
|
|
448
|
+
|
|
449
|
+
import type { FeedbackSource } from "../normalize/trace.ts";
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* PRD-MP-08 (R2.2): When Finding.feedbackSources[] is populated, the awareness
|
|
453
|
+
* mini-sample PRIORITIZES traces referenced by feedback content — grounding the
|
|
454
|
+
* awareness layer in operator-stated reality rather than purely random worst-sampling.
|
|
455
|
+
*
|
|
456
|
+
* Extraction strategy:
|
|
457
|
+
* - trace-score sources: prefer traces whose traceId matches a score's traceId
|
|
458
|
+
* - chat sources: prefer traces whose agentId/tags match keywords in chat body
|
|
459
|
+
* - Falls back to current selectAwarenessTraces() when no traces match feedback
|
|
460
|
+
*
|
|
461
|
+
* Returns up to `size` trace IDs: feedback-referenced traces first, then gap-filled
|
|
462
|
+
* from the even-stride fallback. Deterministic (no clock, no random).
|
|
463
|
+
*/
|
|
464
|
+
export function selectAwarenessTracesWithFeedback(
|
|
465
|
+
traces: TraceMetadata[],
|
|
466
|
+
feedbackSources: FeedbackSource[],
|
|
467
|
+
size: number = AWARENESS_SAMPLE_DEFAULT
|
|
468
|
+
): string[] {
|
|
469
|
+
if (feedbackSources.length === 0) {
|
|
470
|
+
// No feedback sources → use existing deterministic selection
|
|
471
|
+
return selectAwarenessTraces(traces, size);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// 1+2. Feedback-referenced traces first (trace-score IDs, then chat keyword hits).
|
|
475
|
+
const selected = new Set<string>(feedbackReferencedTraceIds(traces, feedbackSources, size));
|
|
476
|
+
|
|
477
|
+
// 3. Gap-fill from even-stride selection to reach `size`
|
|
478
|
+
if (selected.size < size) {
|
|
479
|
+
const fallback = selectAwarenessTraces(traces, size);
|
|
480
|
+
for (const id of fallback) {
|
|
481
|
+
if (selected.size >= size) break;
|
|
482
|
+
selected.add(id);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
return Array.from(selected).slice(0, size);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Resolve the trace IDs a feedback set EXPLICITLY references, in priority order:
|
|
491
|
+
* trace-score `traceId` matches first, then chat-body keyword hits against each
|
|
492
|
+
* trace's agentId + tags. Returns at most `cap` IDs (deduped, first-seen order).
|
|
493
|
+
* Pure + deterministic — extracted so both the legacy gap-fill path and the
|
|
494
|
+
* Block-B cascade share one feedback-resolution definition (DRY).
|
|
495
|
+
*/
|
|
496
|
+
export function feedbackReferencedTraceIds(
|
|
497
|
+
traces: TraceMetadata[],
|
|
498
|
+
feedbackSources: FeedbackSource[],
|
|
499
|
+
cap: number = AWARENESS_DISCOVERY_SIZE
|
|
500
|
+
): string[] {
|
|
501
|
+
const out = new Set<string>();
|
|
502
|
+
|
|
503
|
+
// trace-score sources: direct traceId references.
|
|
504
|
+
for (const src of feedbackSources) {
|
|
505
|
+
if (out.size >= cap) break;
|
|
506
|
+
if (src.sourceType !== "trace-score" || !src.traceId) continue;
|
|
507
|
+
const match = traces.find((t) => t.traceId === src.traceId);
|
|
508
|
+
if (match) out.add(match.traceId);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// chat sources: keyword-match agentId + tags against the feedback body.
|
|
512
|
+
for (const src of feedbackSources) {
|
|
513
|
+
if (out.size >= cap) break;
|
|
514
|
+
if (src.sourceType !== "chat") continue;
|
|
515
|
+
const keywords = src.body
|
|
516
|
+
.toLowerCase()
|
|
517
|
+
.split(/\s+/)
|
|
518
|
+
.filter((w) => w.length > 4)
|
|
519
|
+
.slice(0, 10);
|
|
520
|
+
for (const t of traces) {
|
|
521
|
+
if (out.size >= cap) break;
|
|
522
|
+
const surface = [t.agentId ?? "", ...(t.tags ?? [])].join(" ").toLowerCase();
|
|
523
|
+
if (keywords.some((kw) => surface.includes(kw))) out.add(t.traceId);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
return Array.from(out).slice(0, cap);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Wave-17 Block B — feedback-aware CASCADE selection. Composes the cascade
|
|
532
|
+
* (ledger-subtract → priority bands → seeded random reserve) with PRD-MP-08
|
|
533
|
+
* feedback grounding: traces the feedback set explicitly references are forced
|
|
534
|
+
* to the TOP of Band 1 (feedback/low-score) before the rest of the cascade runs,
|
|
535
|
+
* so operator-stated reality outranks every cheaper heuristic — while the random
|
|
536
|
+
* reserve still guarantees Tier-0-invisible coverage. Pure + deterministic.
|
|
537
|
+
*
|
|
538
|
+
* Mechanism: feedback-referenced IDs are pre-marked; the underlying cascade then
|
|
539
|
+
* banding/reserve-fills the remainder. Because ledger subtraction runs inside the
|
|
540
|
+
* cascade, a feedback-referenced trace that was ALREADY deep-read is dropped too
|
|
541
|
+
* (marginal reads only) — feedback does not override the ledger.
|
|
542
|
+
*/
|
|
543
|
+
export function selectAwarenessTracesWithFeedbackCascade(
|
|
544
|
+
input: CascadeSelectionInput & { feedbackSources: FeedbackSource[] }
|
|
545
|
+
): CascadeSelectionResult {
|
|
546
|
+
const size = input.size ?? AWARENESS_DISCOVERY_SIZE;
|
|
547
|
+
const referenced = new Set(
|
|
548
|
+
feedbackReferencedTraceIds(input.traces, input.feedbackSources, size)
|
|
549
|
+
);
|
|
550
|
+
|
|
551
|
+
// Synthesize hasFeedback on referenced traces so the cascade's Band 1 picks them
|
|
552
|
+
// up FIRST (and reorders them to the front of the marginal scan). We do NOT mutate
|
|
553
|
+
// the caller's objects — shallow-copy only the referenced ones.
|
|
554
|
+
const traces = input.traces.map((t) =>
|
|
555
|
+
referenced.has(t.traceId) && !t.hasFeedback ? { ...t, hasFeedback: true } : t
|
|
556
|
+
);
|
|
557
|
+
|
|
558
|
+
return selectAwarenessTracesCascade({ ...input, traces, size });
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// ── SO-05 CLI entrypoint ──────────────────────────────────────────────────────
|
|
562
|
+
|
|
563
|
+
if (import.meta.main) {
|
|
564
|
+
const args = process.argv.slice(2);
|
|
565
|
+
const get = (flag: string): string | undefined => {
|
|
566
|
+
const idx = args.indexOf(flag);
|
|
567
|
+
return idx !== -1 ? args[idx + 1] : undefined;
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
const metadataPath = get("--metadata");
|
|
571
|
+
if (!metadataPath) {
|
|
572
|
+
process.stderr.write(
|
|
573
|
+
"Usage: bun scripts/awareness/llm-sample.ts --metadata <traces-metadata.json> [--output <file>] " +
|
|
574
|
+
"[--priors-ref <ref>] [--run-id <id>] [--entity <name>] [--config-root <path>] " +
|
|
575
|
+
"[--awareness-sample <n> | --size <n>]\n" +
|
|
576
|
+
" --awareness-sample (alias --size) sets the deep-read sample size; defaults to " +
|
|
577
|
+
`${AWARENESS_SAMPLE_DEFAULT} (V3-1). Pass a small N (e.g. ${AWARENESS_SAMPLE_SIZE}) for loud-only runs.\n` +
|
|
578
|
+
" --run-id enables the Block-B cascade (expanded discovery + seeded random reserve). When no\n" +
|
|
579
|
+
" explicit size is pinned, the cascade first-pass N scales with the ORIGINAL run's depth:\n" +
|
|
580
|
+
` min(originalSampleN, ${AWARENESS_SAMPLE_DEFAULT}), recovered from that run's run-meta.json ` +
|
|
581
|
+
`(fallback ${AWARENESS_SAMPLE_DEFAULT}, V3-2).\n` +
|
|
582
|
+
" --config-root sets the host project root (where .mutagent/diagnostics/ lives) used to\n" +
|
|
583
|
+
" recover the original run's recorded awareness sample size; defaults to cwd.\n" +
|
|
584
|
+
" --entity additionally ledger-subtracts already-deep-read traces (marginal reads only).\n"
|
|
585
|
+
);
|
|
586
|
+
process.exit(1);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
const { writeFileSync } = await import("fs");
|
|
590
|
+
|
|
591
|
+
let traces: TraceMetadata[];
|
|
592
|
+
try {
|
|
593
|
+
traces = JSON.parse(readFileSync(metadataPath, "utf8")) as TraceMetadata[];
|
|
594
|
+
} catch (err) {
|
|
595
|
+
process.stderr.write(`Failed to read metadata: ${err}\n`);
|
|
596
|
+
process.exit(1);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
const priorsRef = get("--priors-ref");
|
|
600
|
+
const decision = shouldFireAwareness({ priorSignalsRef: priorsRef });
|
|
601
|
+
const firedAt = new Date().toISOString();
|
|
602
|
+
|
|
603
|
+
const runId = get("--run-id");
|
|
604
|
+
const entity = get("--entity");
|
|
605
|
+
// V3-2: host project root (where .mutagent/diagnostics/ lives) — used to recover the
|
|
606
|
+
// ORIGINAL run's recorded awareness sample size on the cascade path. Defaults to cwd.
|
|
607
|
+
const configRoot = get("--config-root") ?? process.cwd();
|
|
608
|
+
// V3-1: operator-facing knob is --awareness-sample; --size kept as a back-compat alias.
|
|
609
|
+
const sizeArg = get("--awareness-sample") ?? get("--size");
|
|
610
|
+
const size = sizeArg !== undefined && !Number.isNaN(Number(sizeArg)) ? Number(sizeArg) : undefined;
|
|
611
|
+
|
|
612
|
+
let selectedTraces: string[] = [];
|
|
613
|
+
let cascadeResult: CascadeSelectionResult | undefined;
|
|
614
|
+
// Effective sample size actually used (for the reported sampleSize below). On the
|
|
615
|
+
// cascade path this becomes the computed first-pass seed; on the legacy path it stays
|
|
616
|
+
// the passed size (undefined → the selector's AWARENESS_SAMPLE_DEFAULT).
|
|
617
|
+
let effectiveSize = size;
|
|
618
|
+
if (decision.fire) {
|
|
619
|
+
if (runId) {
|
|
620
|
+
// Block-B cascade path. V3-2: when the caller did NOT pin an explicit size, the
|
|
621
|
+
// first-pass seed SCALES with the ORIGINAL run's depth —
|
|
622
|
+
// min(originalSampleN, AWARENESS_SAMPLE_DEFAULT) — instead of the fixed
|
|
623
|
+
// AWARENESS_DISCOVERY_SIZE (12). Falls back to AWARENESS_SAMPLE_DEFAULT (NOT 12)
|
|
624
|
+
// when the original size can't be recovered, and logs why. Explicit --size wins.
|
|
625
|
+
if (effectiveSize === undefined) {
|
|
626
|
+
const originalSampleN = recoverOriginalSampleN(runId, configRoot);
|
|
627
|
+
effectiveSize = cascadeFirstPassSize(originalSampleN);
|
|
628
|
+
if (originalSampleN === undefined) {
|
|
629
|
+
process.stderr.write(
|
|
630
|
+
`[awareness] cascade first-pass: could not recover original run '${runId}' awareness ` +
|
|
631
|
+
`sample size from ${runMetaPath(configRoot, runId)} (run-meta absent or ` +
|
|
632
|
+
`awarenessSampleSize unset) — falling back to ${AWARENESS_SAMPLE_DEFAULT} ` +
|
|
633
|
+
`(NOT the legacy ${AWARENESS_DISCOVERY_SIZE}).\n`
|
|
634
|
+
);
|
|
635
|
+
} else {
|
|
636
|
+
process.stderr.write(
|
|
637
|
+
`[awareness] cascade first-pass: recovered original run '${runId}' awareness sample ` +
|
|
638
|
+
`size ${originalSampleN} → first-pass N = min(${originalSampleN}, ` +
|
|
639
|
+
`${AWARENESS_SAMPLE_DEFAULT}) = ${effectiveSize}.\n`
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
// Ledger-subtract when an entity is named (wires library/store.ts:isLedgered →
|
|
644
|
+
// marginal reads only).
|
|
645
|
+
const { isLedgered } = await import("../library/store.ts");
|
|
646
|
+
cascadeResult = selectAwarenessTracesCascade({
|
|
647
|
+
traces,
|
|
648
|
+
runId,
|
|
649
|
+
size: effectiveSize,
|
|
650
|
+
isLedgered: entity ? (id: string) => isLedgered(entity, id) : undefined,
|
|
651
|
+
});
|
|
652
|
+
selectedTraces = cascadeResult.selected;
|
|
653
|
+
} else {
|
|
654
|
+
// Legacy even-stride path (backward-compatible default).
|
|
655
|
+
selectedTraces = selectAwarenessTraces(traces, size);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
const result = {
|
|
660
|
+
decision,
|
|
661
|
+
selectedTraces,
|
|
662
|
+
firedAt,
|
|
663
|
+
// V3-1/V3-2: non-cascade legacy path reports the effective 50-default. The cascade
|
|
664
|
+
// path reports its computed first-pass seed (effectiveSize) — the scaled/recovered
|
|
665
|
+
// value, no longer the fixed AWARENESS_DISCOVERY_SIZE.
|
|
666
|
+
sampleSize: runId ? (effectiveSize ?? AWARENESS_DISCOVERY_SIZE) : (size ?? AWARENESS_SAMPLE_DEFAULT),
|
|
667
|
+
cascade: cascadeResult
|
|
668
|
+
? { bands: cascadeResult.bands, ledgeredExcluded: cascadeResult.ledgeredExcluded }
|
|
669
|
+
: undefined,
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
const out = JSON.stringify(result, null, 2);
|
|
673
|
+
const outputPath = get("--output");
|
|
674
|
+
if (outputPath) {
|
|
675
|
+
writeFileSync(outputPath, out, "utf8");
|
|
676
|
+
process.stderr.write(`Awareness sample written to ${outputPath}\n`);
|
|
677
|
+
} else {
|
|
678
|
+
process.stdout.write(out + "\n");
|
|
679
|
+
}
|
|
680
|
+
process.exit(0);
|
|
681
|
+
}
|