@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,489 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/scan/trajectory.ts
|
|
3
|
+
* BLOCK D1 — Mechanical tool-call TRAJECTORY scan.
|
|
4
|
+
* Type A — Pure Script (deterministic sequence analysis, NO LLM, no I/O).
|
|
5
|
+
*
|
|
6
|
+
* This module is the MECHANICAL corroboration layer that makes the evidence
|
|
7
|
+
* floor real. It reads ONLY a trace's tool-call / tool-result message sequence
|
|
8
|
+
* and detects structural patterns deterministically — no clock, no random, no
|
|
9
|
+
* model reasoning. The same trace in always yields a byte-identical result out.
|
|
10
|
+
*
|
|
11
|
+
* R1 (evidence floor): a signal discovered by the LLM analyzer (Block C) may be
|
|
12
|
+
* promoted to PRIMARY only if it is mechanically corroborated here. The
|
|
13
|
+
* `corroborations[]` array is exactly what Block C's floor consumes — each entry
|
|
14
|
+
* pairs a signal with an `evidenceRef` pointing at the concrete trace span(s).
|
|
15
|
+
*
|
|
16
|
+
* R4 (pattern→signal map, LOCKED — do not reorder/rename without a wave gate):
|
|
17
|
+
* retry-loop → loop/latency (same tool repeated after failure / identical args)
|
|
18
|
+
* tool-error → tool-misuse (a tool-result carrying an error / exception)
|
|
19
|
+
* abandoned-call → handoff-loss (a tool-call with no matching result)
|
|
20
|
+
* oscillation → prompt-underspec (A→B→A→B tool alternation)
|
|
21
|
+
*
|
|
22
|
+
* Input shape: the canonical TraceBody / TraceMessage from
|
|
23
|
+
* scripts/normalize/trace.ts. Tool activity is carried two ways across platforms:
|
|
24
|
+
* (a) INLINE — one message carries toolName + toolArgs + toolResult + isError
|
|
25
|
+
* together (claude-code / local-jsonl normalizers).
|
|
26
|
+
* (b) SPLIT — a tool-call message (role assistant/tool, toolName, toolArgs)
|
|
27
|
+
* is followed by a separate tool-result message (role "tool",
|
|
28
|
+
* toolResult / isError) (langfuse / otel-style normalizers).
|
|
29
|
+
* Both shapes are handled by extracting a flat, ordered list of tool EVENTS,
|
|
30
|
+
* each annotated with whether a result was observed and whether it errored.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import type { TraceBody, TraceMessage } from "../normalize/trace.ts";
|
|
34
|
+
import { canonicalToolName } from "../normalize/platforms/entity-context.ts";
|
|
35
|
+
|
|
36
|
+
// ── Public types ─────────────────────────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The four mechanically-detectable trajectory pattern kinds (R4 keys).
|
|
40
|
+
* `as const` object instead of a string-enum per coding-rules (no magic strings).
|
|
41
|
+
* The const value object and its type alias use distinct names (SCREAMING_SNAKE
|
|
42
|
+
* value, PascalCase type) so the core `no-redeclare` lint rule is satisfied.
|
|
43
|
+
*/
|
|
44
|
+
export const TRAJECTORY_PATTERN_KIND = {
|
|
45
|
+
RetryLoop: "retry-loop",
|
|
46
|
+
ToolError: "tool-error",
|
|
47
|
+
AbandonedCall: "abandoned-call",
|
|
48
|
+
Oscillation: "oscillation",
|
|
49
|
+
} as const;
|
|
50
|
+
|
|
51
|
+
export type TrajectoryPatternKind =
|
|
52
|
+
(typeof TRAJECTORY_PATTERN_KIND)[keyof typeof TRAJECTORY_PATTERN_KIND];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The signal a corroborated pattern maps to (R4 values). These are deliberately
|
|
56
|
+
* coarse signal labels (NOT WhyCategory) — Block C maps them onto its own
|
|
57
|
+
* taxonomy. `retry-loop` corroborates either a loop OR a latency signal, so its
|
|
58
|
+
* value is the compound "loop/latency".
|
|
59
|
+
*/
|
|
60
|
+
export const TRAJECTORY_SIGNAL = {
|
|
61
|
+
LoopLatency: "loop/latency",
|
|
62
|
+
ToolMisuse: "tool-misuse",
|
|
63
|
+
HandoffLoss: "handoff-loss",
|
|
64
|
+
PromptUnderspec: "prompt-underspec",
|
|
65
|
+
} as const;
|
|
66
|
+
|
|
67
|
+
export type TrajectorySignal =
|
|
68
|
+
(typeof TRAJECTORY_SIGNAL)[keyof typeof TRAJECTORY_SIGNAL];
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* R4 LOCKED pattern→signal map. Single source of truth, exported so Block C can
|
|
72
|
+
* wire its evidence floor against the exact same mapping (no drift).
|
|
73
|
+
*/
|
|
74
|
+
export const PATTERN_SIGNAL_MAP: Readonly<
|
|
75
|
+
Record<TrajectoryPatternKind, TrajectorySignal>
|
|
76
|
+
> = {
|
|
77
|
+
[TRAJECTORY_PATTERN_KIND.RetryLoop]: TRAJECTORY_SIGNAL.LoopLatency,
|
|
78
|
+
[TRAJECTORY_PATTERN_KIND.ToolError]: TRAJECTORY_SIGNAL.ToolMisuse,
|
|
79
|
+
[TRAJECTORY_PATTERN_KIND.AbandonedCall]: TRAJECTORY_SIGNAL.HandoffLoss,
|
|
80
|
+
[TRAJECTORY_PATTERN_KIND.Oscillation]: TRAJECTORY_SIGNAL.PromptUnderspec,
|
|
81
|
+
} as const;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* One mechanically-detected trajectory pattern.
|
|
85
|
+
* `spanRefs` are message-index pointers (`msg[i]`) into TraceBody.messages — the
|
|
86
|
+
* concrete spans that evidence this pattern. `evidenceRef` is a single
|
|
87
|
+
* human/grep-friendly string assembled from those spans + the trace id.
|
|
88
|
+
*/
|
|
89
|
+
export interface TrajectoryPattern {
|
|
90
|
+
/** The pattern kind (R4 key). */
|
|
91
|
+
kind: TrajectoryPatternKind;
|
|
92
|
+
/** Canonical tool name(s) involved (deterministic ordering). */
|
|
93
|
+
tools: string[];
|
|
94
|
+
/** Message indices in TraceBody.messages that evidence this pattern. */
|
|
95
|
+
spanRefs: number[];
|
|
96
|
+
/** Pre-assembled evidence reference string pointing at the trace span(s). */
|
|
97
|
+
evidenceRef: string;
|
|
98
|
+
/** Plain-words narration of the mechanical event (deterministic, no LLM). */
|
|
99
|
+
detail: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* A mechanical corroboration: a signal + the concrete trace span(s) that
|
|
104
|
+
* evidence it. This is the R1 floor surface Block C consumes — a discovered
|
|
105
|
+
* signal becomes PRIMARY only if it appears here.
|
|
106
|
+
*/
|
|
107
|
+
export interface TrajectoryCorroboration {
|
|
108
|
+
signal: TrajectorySignal;
|
|
109
|
+
evidenceRef: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface TrajectoryResult {
|
|
113
|
+
patterns: TrajectoryPattern[];
|
|
114
|
+
corroborations: TrajectoryCorroboration[];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ── Internal: flattened tool-event model ─────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* A normalized tool EVENT extracted from one-or-two raw messages. Abstracts over
|
|
121
|
+
* the INLINE vs SPLIT message shapes so the pattern detectors operate on a single
|
|
122
|
+
* uniform sequence.
|
|
123
|
+
*/
|
|
124
|
+
interface ToolEvent {
|
|
125
|
+
/** Canonical (tool.-stripped, camelCased) tool name. */
|
|
126
|
+
tool: string;
|
|
127
|
+
/** Raw tool args string, if any (used for identical-args retry detection). */
|
|
128
|
+
args?: string;
|
|
129
|
+
/** True when a tool-result (inline or split) was observed for this call. */
|
|
130
|
+
hasResult: boolean;
|
|
131
|
+
/** True when the observed result was an error / exception. */
|
|
132
|
+
isError: boolean;
|
|
133
|
+
/** Index of the originating tool-call message in TraceBody.messages. */
|
|
134
|
+
callIndex: number;
|
|
135
|
+
/** Index of the result message (split shape); equals callIndex for inline. */
|
|
136
|
+
resultIndex?: number;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* A message "looks like" a tool-call when it carries a resolvable toolName.
|
|
141
|
+
* Mirrors the entity-context aggregation rule so call-detection is consistent
|
|
142
|
+
* across the skill (tool.send_message / send_message / sendMessage collapse).
|
|
143
|
+
*/
|
|
144
|
+
function isToolCallMessage(m: TraceMessage): boolean {
|
|
145
|
+
return typeof m.toolName === "string" && m.toolName.length > 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* A message is a SPLIT tool-result when it carries result/error payload but no
|
|
150
|
+
* toolName of its own (i.e. it belongs to the preceding tool-call).
|
|
151
|
+
*/
|
|
152
|
+
function isSplitResultMessage(m: TraceMessage): boolean {
|
|
153
|
+
if (isToolCallMessage(m)) return false;
|
|
154
|
+
return (
|
|
155
|
+
m.role === "tool" ||
|
|
156
|
+
m.toolResult !== undefined ||
|
|
157
|
+
m.isError !== undefined
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Flatten TraceBody.messages into an ordered list of ToolEvents.
|
|
163
|
+
*
|
|
164
|
+
* Handles both message shapes:
|
|
165
|
+
* - INLINE: a tool-call message that ALSO carries toolResult/isError is its own
|
|
166
|
+
* result. (claude-code / local-jsonl)
|
|
167
|
+
* - SPLIT: a tool-call message with NO inline result; the immediately-following
|
|
168
|
+
* split-result message (role "tool" / toolResult / isError) supplies the
|
|
169
|
+
* result. (langfuse / otel-style)
|
|
170
|
+
* A tool-call with neither inline nor a following split result = abandoned.
|
|
171
|
+
*/
|
|
172
|
+
function extractToolEvents(messages: TraceMessage[]): ToolEvent[] {
|
|
173
|
+
const events: ToolEvent[] = [];
|
|
174
|
+
for (let i = 0; i < messages.length; i++) {
|
|
175
|
+
const m = messages[i];
|
|
176
|
+
if (!isToolCallMessage(m)) continue;
|
|
177
|
+
|
|
178
|
+
const tool = canonicalToolName(m.toolName as string);
|
|
179
|
+
|
|
180
|
+
// INLINE result: the call message itself carries result/error payload.
|
|
181
|
+
const hasInlineResult = m.toolResult !== undefined || m.isError === true;
|
|
182
|
+
if (hasInlineResult) {
|
|
183
|
+
events.push({
|
|
184
|
+
tool,
|
|
185
|
+
args: m.toolArgs,
|
|
186
|
+
hasResult: true,
|
|
187
|
+
isError: m.isError === true,
|
|
188
|
+
callIndex: m.index,
|
|
189
|
+
resultIndex: m.index,
|
|
190
|
+
});
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// SPLIT result: look at the immediately following message only. A result
|
|
195
|
+
// that belongs to THIS call must directly follow it (deterministic, no
|
|
196
|
+
// searching ahead past intervening calls — that would mis-pair).
|
|
197
|
+
const next = messages[i + 1];
|
|
198
|
+
if (next && isSplitResultMessage(next)) {
|
|
199
|
+
events.push({
|
|
200
|
+
tool,
|
|
201
|
+
args: m.toolArgs,
|
|
202
|
+
hasResult: true,
|
|
203
|
+
isError: next.isError === true,
|
|
204
|
+
callIndex: m.index,
|
|
205
|
+
resultIndex: next.index,
|
|
206
|
+
});
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// No inline result and no following split result → abandoned call.
|
|
211
|
+
events.push({
|
|
212
|
+
tool,
|
|
213
|
+
args: m.toolArgs,
|
|
214
|
+
hasResult: false,
|
|
215
|
+
isError: false,
|
|
216
|
+
callIndex: m.index,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
return events;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// ── Pattern detectors ────────────────────────────────────────────────────────
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* tool-error → tool-misuse.
|
|
226
|
+
* Each tool EVENT whose observed result errored yields one tool-error pattern.
|
|
227
|
+
*/
|
|
228
|
+
function detectToolErrors(
|
|
229
|
+
events: ToolEvent[],
|
|
230
|
+
traceId: string
|
|
231
|
+
): TrajectoryPattern[] {
|
|
232
|
+
const out: TrajectoryPattern[] = [];
|
|
233
|
+
for (const e of events) {
|
|
234
|
+
if (!e.isError) continue;
|
|
235
|
+
const spanRefs =
|
|
236
|
+
e.resultIndex !== undefined && e.resultIndex !== e.callIndex
|
|
237
|
+
? [e.callIndex, e.resultIndex]
|
|
238
|
+
: [e.callIndex];
|
|
239
|
+
out.push({
|
|
240
|
+
kind: TRAJECTORY_PATTERN_KIND.ToolError,
|
|
241
|
+
tools: [e.tool],
|
|
242
|
+
spanRefs,
|
|
243
|
+
evidenceRef: makeEvidenceRef(traceId, spanRefs),
|
|
244
|
+
detail: `tool "${e.tool}" returned an error result`,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return out;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* abandoned-call → handoff-loss.
|
|
252
|
+
* Each tool-call EVENT with no observed result yields one abandoned-call pattern.
|
|
253
|
+
*/
|
|
254
|
+
function detectAbandonedCalls(
|
|
255
|
+
events: ToolEvent[],
|
|
256
|
+
traceId: string
|
|
257
|
+
): TrajectoryPattern[] {
|
|
258
|
+
const out: TrajectoryPattern[] = [];
|
|
259
|
+
for (const e of events) {
|
|
260
|
+
if (e.hasResult) continue;
|
|
261
|
+
const spanRefs = [e.callIndex];
|
|
262
|
+
out.push({
|
|
263
|
+
kind: TRAJECTORY_PATTERN_KIND.AbandonedCall,
|
|
264
|
+
tools: [e.tool],
|
|
265
|
+
spanRefs,
|
|
266
|
+
evidenceRef: makeEvidenceRef(traceId, spanRefs),
|
|
267
|
+
detail: `tool "${e.tool}" was called with no matching result`,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
return out;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* retry-loop → loop/latency.
|
|
275
|
+
* A retry-loop is the SAME canonical tool invoked again where the prior
|
|
276
|
+
* invocation either (a) errored, or (b) was called with identical args. Each
|
|
277
|
+
* maximal run of ≥2 such consecutive same-tool invocations yields ONE pattern
|
|
278
|
+
* spanning every call in the run (deterministic grouping; no double-emit).
|
|
279
|
+
*/
|
|
280
|
+
function detectRetryLoops(
|
|
281
|
+
events: ToolEvent[],
|
|
282
|
+
traceId: string
|
|
283
|
+
): TrajectoryPattern[] {
|
|
284
|
+
const out: TrajectoryPattern[] = [];
|
|
285
|
+
let i = 0;
|
|
286
|
+
while (i < events.length) {
|
|
287
|
+
const run: ToolEvent[] = [events[i]];
|
|
288
|
+
let j = i + 1;
|
|
289
|
+
while (j < events.length && events[j].tool === events[i].tool) {
|
|
290
|
+
const prev = events[j - 1];
|
|
291
|
+
const cur = events[j];
|
|
292
|
+
// A continuation qualifies as a retry when the PREVIOUS same-tool call
|
|
293
|
+
// errored, OR the args are byte-identical (a re-issue of the same call).
|
|
294
|
+
const isRetry =
|
|
295
|
+
prev.isError ||
|
|
296
|
+
(prev.args !== undefined && prev.args === cur.args);
|
|
297
|
+
if (!isRetry) break;
|
|
298
|
+
run.push(cur);
|
|
299
|
+
j++;
|
|
300
|
+
}
|
|
301
|
+
if (run.length >= 2) {
|
|
302
|
+
const spanRefs = run.map((e) => e.callIndex);
|
|
303
|
+
out.push({
|
|
304
|
+
kind: TRAJECTORY_PATTERN_KIND.RetryLoop,
|
|
305
|
+
tools: [events[i].tool],
|
|
306
|
+
spanRefs,
|
|
307
|
+
evidenceRef: makeEvidenceRef(traceId, spanRefs),
|
|
308
|
+
detail: `tool "${events[i].tool}" was retried ${run.length - 1} time(s) after failure or with identical args`,
|
|
309
|
+
});
|
|
310
|
+
i = j; // skip past the consumed run — no overlapping detections
|
|
311
|
+
} else {
|
|
312
|
+
i++;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return out;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* oscillation → prompt-underspec.
|
|
320
|
+
* An A→B→A→B alternation between exactly two distinct tools (no third tool
|
|
321
|
+
* interleaved) of length ≥4. Each maximal alternating run yields ONE pattern.
|
|
322
|
+
* Detected on the call sequence regardless of result/error state.
|
|
323
|
+
*/
|
|
324
|
+
function detectOscillations(
|
|
325
|
+
events: ToolEvent[],
|
|
326
|
+
traceId: string
|
|
327
|
+
): TrajectoryPattern[] {
|
|
328
|
+
const out: TrajectoryPattern[] = [];
|
|
329
|
+
const seq = events.map((e) => e.tool);
|
|
330
|
+
let i = 0;
|
|
331
|
+
while (i < seq.length) {
|
|
332
|
+
// An oscillation needs two distinct tools at positions i, i+1.
|
|
333
|
+
if (i + 1 >= seq.length || seq[i] === seq[i + 1]) {
|
|
334
|
+
i++;
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
const a = seq[i];
|
|
338
|
+
const b = seq[i + 1];
|
|
339
|
+
// Extend while the strict A,B,A,B,… alternation holds.
|
|
340
|
+
let j = i + 2;
|
|
341
|
+
while (j < seq.length && seq[j] === (((j - i) % 2 === 0) ? a : b)) {
|
|
342
|
+
j++;
|
|
343
|
+
}
|
|
344
|
+
const runLen = j - i;
|
|
345
|
+
if (runLen >= 4) {
|
|
346
|
+
const spanRefs = events.slice(i, j).map((e) => e.callIndex);
|
|
347
|
+
out.push({
|
|
348
|
+
kind: TRAJECTORY_PATTERN_KIND.Oscillation,
|
|
349
|
+
tools: [a, b],
|
|
350
|
+
spanRefs,
|
|
351
|
+
evidenceRef: makeEvidenceRef(traceId, spanRefs),
|
|
352
|
+
detail: `tools "${a}" and "${b}" alternated ${runLen} times (A→B→A→B)`,
|
|
353
|
+
});
|
|
354
|
+
i = j; // consume the alternating run
|
|
355
|
+
} else {
|
|
356
|
+
i++;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return out;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// ── Evidence-ref assembly ────────────────────────────────────────────────────
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Build a deterministic, grep-friendly evidence pointer at the form
|
|
366
|
+
* `trace:<traceId>#msg[i,j,...]`
|
|
367
|
+
* into TraceBody.messages. This is the concrete span pointer Block C's floor
|
|
368
|
+
* consumes — no clock, no random, pure function of inputs.
|
|
369
|
+
*/
|
|
370
|
+
function makeEvidenceRef(traceId: string, spanRefs: number[]): string {
|
|
371
|
+
return `trace:${traceId}#msg[${spanRefs.join(",")}]`;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// ── Public entrypoint ────────────────────────────────────────────────────────
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Mechanically analyze a single trace's tool-call trajectory.
|
|
378
|
+
*
|
|
379
|
+
* DETERMINISTIC: pure function of `trace`. No clock, no random, no I/O, no LLM.
|
|
380
|
+
* Patterns are emitted in a stable order: retry-loop, tool-error, abandoned-call,
|
|
381
|
+
* oscillation (R4 map order), each internally ordered by first span index.
|
|
382
|
+
*
|
|
383
|
+
* Every detected pattern produces exactly one corroboration via the LOCKED
|
|
384
|
+
* PATTERN_SIGNAL_MAP — this is the R1 evidence floor Block C wires against.
|
|
385
|
+
*/
|
|
386
|
+
export function analyzeTrajectory(trace: TraceBody): TrajectoryResult {
|
|
387
|
+
const traceId = trace.metadata.traceId;
|
|
388
|
+
const events = extractToolEvents(trace.messages);
|
|
389
|
+
|
|
390
|
+
// R4 map order: retry-loop, tool-error, abandoned-call, oscillation.
|
|
391
|
+
const patterns: TrajectoryPattern[] = [
|
|
392
|
+
...detectRetryLoops(events, traceId),
|
|
393
|
+
...detectToolErrors(events, traceId),
|
|
394
|
+
...detectAbandonedCalls(events, traceId),
|
|
395
|
+
...detectOscillations(events, traceId),
|
|
396
|
+
];
|
|
397
|
+
|
|
398
|
+
const corroborations: TrajectoryCorroboration[] = patterns.map((p) => ({
|
|
399
|
+
signal: PATTERN_SIGNAL_MAP[p.kind],
|
|
400
|
+
evidenceRef: p.evidenceRef,
|
|
401
|
+
}));
|
|
402
|
+
|
|
403
|
+
return { patterns, corroborations };
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* W17-WIRING — analyze MANY traces and return the FLAT, deduped corroboration set.
|
|
408
|
+
*
|
|
409
|
+
* This is the orchestrator-facing aggregator the CLI below stamps to JSON. It runs
|
|
410
|
+
* analyzeTrajectory() over each sampled trace body (deterministic input order) and
|
|
411
|
+
* concatenates the per-trace corroborations. Because each `evidenceRef` encodes the
|
|
412
|
+
* originating `traceId` + span indices (see makeEvidenceRef), corroborations from
|
|
413
|
+
* DIFFERENT traces never collide; the dedupe only collapses byte-identical
|
|
414
|
+
* (signal, evidenceRef) pairs, which can only arise from re-processing the same body.
|
|
415
|
+
*
|
|
416
|
+
* DETERMINISTIC: pure function of `traces`. No clock, no random, no I/O. The same
|
|
417
|
+
* ordered bodies in always yield a byte-identical corroborations array out — exactly
|
|
418
|
+
* what Block C's evidence floor consumes via SignalCensusContext.corroborations.
|
|
419
|
+
*/
|
|
420
|
+
export function corroborationsForTraces(
|
|
421
|
+
traces: ReadonlyArray<TraceBody>
|
|
422
|
+
): TrajectoryCorroboration[] {
|
|
423
|
+
const out: TrajectoryCorroboration[] = [];
|
|
424
|
+
const seen = new Set<string>();
|
|
425
|
+
for (const trace of traces) {
|
|
426
|
+
for (const c of analyzeTrajectory(trace).corroborations) {
|
|
427
|
+
const key = `${c.signal}${c.evidenceRef}`;
|
|
428
|
+
if (seen.has(key)) continue;
|
|
429
|
+
seen.add(key);
|
|
430
|
+
out.push(c);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return out;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// ── CLI entrypoint (W17-WIRING) ──────────────────────────────────────────────
|
|
437
|
+
//
|
|
438
|
+
// INTERNAL transport (run.sh / bun only — NOT the product `mutagent` CLI). The
|
|
439
|
+
// orchestrator runs this at Step 6.5 to make trajectory corroborations COMPUTABLE
|
|
440
|
+
// without hand-rolled inline reasoning: it reads the sampled deep-read trace bodies
|
|
441
|
+
// and emits the flat corroboration set the enricher's SignalCensusContext consumes.
|
|
442
|
+
//
|
|
443
|
+
// bun scripts/scan/trajectory.ts --bodies <traceBodies.json> [--out <corroborations.json>]
|
|
444
|
+
//
|
|
445
|
+
// `--bodies` is a JSON file containing EITHER a single TraceBody or a TraceBody[].
|
|
446
|
+
// Output is a TrajectoryCorroboration[] written to --out (or stdout when --out is
|
|
447
|
+
// absent). Deterministic — no clock, no random, no network, no LLM.
|
|
448
|
+
//
|
|
449
|
+
// Safe-by-default contract: an empty bodies array yields `[]`, which threads through
|
|
450
|
+
// to an empty SignalCensusContext.corroborations → discovered signals stay
|
|
451
|
+
// suspected-unconfirmed (never silently crowned).
|
|
452
|
+
if (import.meta.main) {
|
|
453
|
+
const { readFileSync, writeFileSync } = await import("fs");
|
|
454
|
+
const { resolve } = await import("path");
|
|
455
|
+
|
|
456
|
+
const argv = process.argv.slice(2);
|
|
457
|
+
const get = (flag: string): string | undefined => {
|
|
458
|
+
const i = argv.indexOf(flag);
|
|
459
|
+
return i >= 0 ? argv[i + 1] : undefined;
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
const bodiesPath = get("--bodies");
|
|
463
|
+
const outPath = get("--out");
|
|
464
|
+
|
|
465
|
+
if (!bodiesPath) {
|
|
466
|
+
process.stderr.write(
|
|
467
|
+
"Usage: bun scripts/scan/trajectory.ts --bodies <traceBodies.json> [--out <corroborations.json>]\n"
|
|
468
|
+
);
|
|
469
|
+
process.exit(1);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
try {
|
|
473
|
+
const parsed: unknown = JSON.parse(readFileSync(resolve(bodiesPath), "utf8"));
|
|
474
|
+
// Accept a single TraceBody OR a TraceBody[] (orchestrator may pass either shape).
|
|
475
|
+
const traces = (Array.isArray(parsed) ? parsed : [parsed]) as TraceBody[];
|
|
476
|
+
const corroborations = corroborationsForTraces(traces);
|
|
477
|
+
const json = JSON.stringify(corroborations, null, 2);
|
|
478
|
+
if (outPath) {
|
|
479
|
+
writeFileSync(resolve(outPath), json, "utf8");
|
|
480
|
+
process.stdout.write(`Corroborations written to: ${outPath}\n`);
|
|
481
|
+
} else {
|
|
482
|
+
process.stdout.write(`${json}\n`);
|
|
483
|
+
}
|
|
484
|
+
process.exit(0);
|
|
485
|
+
} catch (err) {
|
|
486
|
+
process.stderr.write(`Error: ${err}\n`);
|
|
487
|
+
process.exit(1);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/self-diagnostics/dispatch.ts
|
|
3
|
+
* [INTERNAL] Invoke orchestrator with own session transcript as source (PR-022)
|
|
4
|
+
* Type A — Pure Script (dispatch setup only; actual orchestration is agent-driven)
|
|
5
|
+
*
|
|
6
|
+
* Self-diagnostics is GATED by config.yaml: self_diagnostics.enabled (default: false)
|
|
7
|
+
* Only runs for skill maintainers + dogfood mode.
|
|
8
|
+
*
|
|
9
|
+
* PRD-SD-01: descriptor now carries a serialized EntityContext (skill-typed) so the
|
|
10
|
+
* enricher can inject it via --entity-context without re-deriving it at render time.
|
|
11
|
+
*
|
|
12
|
+
* PRD-SD-04: all self-diag findings are forced to audience: 'META' (PR-033). The
|
|
13
|
+
* descriptor carries audienceOverride: 'META' so the enricher/orchestrator can apply
|
|
14
|
+
* this without inspecting the finding type.
|
|
15
|
+
*
|
|
16
|
+
* Usage: bun scripts/self-diagnostics/dispatch.ts [project-root]
|
|
17
|
+
* Outputs a dispatch descriptor that the orchestrator reads to run self-diagnostics.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { resolve, join } from "path";
|
|
21
|
+
import { writeFileSync, mkdirSync, readFileSync, existsSync } from "fs";
|
|
22
|
+
import { probeHostRuntime } from "./probe.ts";
|
|
23
|
+
import { buildSkillSelfEntityContext } from "../normalize/platforms/entity-context.ts";
|
|
24
|
+
import type { EntityContext } from "../normalize/trace.ts";
|
|
25
|
+
|
|
26
|
+
export interface SelfDiagnosticsDispatchDescriptor {
|
|
27
|
+
/** [INTERNAL] marker */
|
|
28
|
+
internal: true;
|
|
29
|
+
sessionPath: string;
|
|
30
|
+
sourcePlatform: "claude-code" | "codex" | "local-jsonl";
|
|
31
|
+
/** Branch for self-remedy PRs */
|
|
32
|
+
remedyBranch: string;
|
|
33
|
+
/** [INTERNAL] prefix for PR titles */
|
|
34
|
+
marker: string;
|
|
35
|
+
dispatchedAt: string;
|
|
36
|
+
/** Descriptor file path written to disk */
|
|
37
|
+
descriptorPath: string;
|
|
38
|
+
/**
|
|
39
|
+
* PRD-SD-01: Skill-typed EntityContext to be injected via --entity-context.
|
|
40
|
+
* Fully populated: entityType='skill', codeAccess=true, applyTarget set.
|
|
41
|
+
* Enricher prefers this over findings.entities[0] (Q1: override+warn).
|
|
42
|
+
*/
|
|
43
|
+
entityContext: EntityContext;
|
|
44
|
+
/**
|
|
45
|
+
* PRD-SD-04 (PR-033): Force all self-diag findings to audience='META'.
|
|
46
|
+
* The enricher applies this override unconditionally on self-diagnostics paths.
|
|
47
|
+
* Client diagnoses never carry this field — analyzer determines audience case-by-case.
|
|
48
|
+
*/
|
|
49
|
+
audienceOverride: "META";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Read the skill version from a package.json path (best-effort, returns undefined on failure).
|
|
54
|
+
*/
|
|
55
|
+
function readSkillVersion(packageJsonPath: string): string | undefined {
|
|
56
|
+
try {
|
|
57
|
+
if (!existsSync(packageJsonPath)) return undefined;
|
|
58
|
+
const raw = readFileSync(packageJsonPath, "utf8");
|
|
59
|
+
const pkg = JSON.parse(raw) as Record<string, unknown>;
|
|
60
|
+
return typeof pkg.version === "string" ? pkg.version : undefined;
|
|
61
|
+
} catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function createSelfDiagnosticsDispatch(
|
|
67
|
+
projectRoot: string,
|
|
68
|
+
remedyBranch = "mutagent/self-diagnostics/{date}",
|
|
69
|
+
marker = "[INTERNAL]"
|
|
70
|
+
): SelfDiagnosticsDispatchDescriptor | null {
|
|
71
|
+
const probe = probeHostRuntime(projectRoot);
|
|
72
|
+
|
|
73
|
+
if (!probe.currentSessionPath) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const sourcePlatform =
|
|
78
|
+
probe.runtime === "claude-code"
|
|
79
|
+
? "claude-code"
|
|
80
|
+
: probe.runtime === "codex"
|
|
81
|
+
? "codex"
|
|
82
|
+
: "local-jsonl";
|
|
83
|
+
|
|
84
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
85
|
+
const resolvedBranch = remedyBranch.replace("{date}", date);
|
|
86
|
+
const dispatchedAt = new Date().toISOString();
|
|
87
|
+
|
|
88
|
+
// PRD-SD-01: Build skill-typed entity context. Version from package.json (best-effort).
|
|
89
|
+
const pkgPath = resolve(projectRoot, "package.json");
|
|
90
|
+
const version = readSkillVersion(pkgPath);
|
|
91
|
+
const entityContext = buildSkillSelfEntityContext({
|
|
92
|
+
skillName: "mutagent-diagnostics",
|
|
93
|
+
version,
|
|
94
|
+
source: sourcePlatform,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const descriptor: SelfDiagnosticsDispatchDescriptor = {
|
|
98
|
+
internal: true,
|
|
99
|
+
sessionPath: probe.currentSessionPath,
|
|
100
|
+
sourcePlatform,
|
|
101
|
+
remedyBranch: resolvedBranch,
|
|
102
|
+
marker,
|
|
103
|
+
dispatchedAt,
|
|
104
|
+
descriptorPath: "", // filled below
|
|
105
|
+
// PRD-SD-01: skill-typed EntityContext pre-built for enricher injection
|
|
106
|
+
entityContext,
|
|
107
|
+
// PRD-SD-04: force all self-diag findings to META audience
|
|
108
|
+
audienceOverride: "META",
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// Write descriptor to .mutagent/diagnostics/self-diagnostics/pending.json
|
|
112
|
+
const outputDir = resolve(projectRoot, ".mutagent/diagnostics", "self-diagnostics");
|
|
113
|
+
mkdirSync(outputDir, { recursive: true });
|
|
114
|
+
const descriptorPath = join(outputDir, "pending.json");
|
|
115
|
+
descriptor.descriptorPath = descriptorPath;
|
|
116
|
+
|
|
117
|
+
writeFileSync(descriptorPath, JSON.stringify(descriptor, null, 2), "utf8");
|
|
118
|
+
return descriptor;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// CLI entrypoint
|
|
122
|
+
if (import.meta.main) {
|
|
123
|
+
const projectRoot = process.argv[2] ?? process.cwd();
|
|
124
|
+
const result = createSelfDiagnosticsDispatch(projectRoot);
|
|
125
|
+
|
|
126
|
+
if (!result) {
|
|
127
|
+
process.stderr.write(
|
|
128
|
+
"Could not locate current session transcript. Self-diagnostics skipped.\n"
|
|
129
|
+
);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
134
|
+
process.exit(0);
|
|
135
|
+
}
|