@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,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/run/diagnose.ts
|
|
3
|
+
* R2.6 (+D2) — the `/mutagent-diagnostics "<brief>"` single-arg invocation entry.
|
|
4
|
+
* Type A — Pure Script (parse + run-session wiring; clock via session.ts).
|
|
5
|
+
*
|
|
6
|
+
* ⚠️ ZONE 1.5 — CLI SURFACE. This is the operator-facing invocation contract:
|
|
7
|
+
* /mutagent-diagnostics "<natural language brief>" (single positional arg)
|
|
8
|
+
*
|
|
9
|
+
* NO onboarding prompts, NO mid-run AskUserQuestion (design philosophy §2.2 —
|
|
10
|
+
* operator-driven). The brief is parsed (parse-brief.ts), the VERBATIM string is
|
|
11
|
+
* preserved (D2), a run session is created, and both verbatim + parsed shapes are
|
|
12
|
+
* persisted to run-meta.json. When the brief carries a focus, the downstream report
|
|
13
|
+
* leads with the 🎯 Guided tab; otherwise it renders the neutral survey (Overview).
|
|
14
|
+
*
|
|
15
|
+
* This entry does NOT touch onboarding (scripts/cli/init.ts) — it is the RUN path.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { parseBrief, isFocusedInvocation, type ParsedInvocation } from "../invocation/parse-brief.ts";
|
|
19
|
+
import { createRunSession, persistRunMeta } from "./session.ts";
|
|
20
|
+
|
|
21
|
+
export interface DiagnoseInvocation {
|
|
22
|
+
/** The VERBATIM operator brief (D2 — never dropped). */
|
|
23
|
+
operatorInvocation: string;
|
|
24
|
+
/** Best-effort parse of the brief. */
|
|
25
|
+
parsed: ParsedInvocation;
|
|
26
|
+
/** True when the report should lead with the 🎯 Guided tab (focus set). */
|
|
27
|
+
guided: boolean;
|
|
28
|
+
/** Generated run id (from the run session). */
|
|
29
|
+
runId: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* R2.6 — build a diagnose invocation from the single-arg brief. Creates a run
|
|
34
|
+
* session and persists the verbatim + parsed invocation (D2). Pure aside from the
|
|
35
|
+
* run-session file write (which session.ts owns + tests inject configRoot for).
|
|
36
|
+
*
|
|
37
|
+
* `configRoot` defaults to cwd; tests pass a temp dir. The brief is preserved
|
|
38
|
+
* VERBATIM regardless of parse outcome.
|
|
39
|
+
*/
|
|
40
|
+
export function startDiagnoseFromBrief(brief: string, configRoot: string): DiagnoseInvocation {
|
|
41
|
+
const operatorInvocation = (brief ?? "").trim();
|
|
42
|
+
const parsed = parseBrief(operatorInvocation);
|
|
43
|
+
const guided = isFocusedInvocation(parsed);
|
|
44
|
+
|
|
45
|
+
const session = createRunSession({ configRoot });
|
|
46
|
+
// D2: persist BOTH the verbatim brief and (implicitly) the run record. The parsed
|
|
47
|
+
// shape rides in-memory to the renderer (runMeta.parsedInvocation); the verbatim
|
|
48
|
+
// is the durable persisted field (run-meta.json.operatorInvocation).
|
|
49
|
+
persistRunMeta(session, { operatorInvocation });
|
|
50
|
+
|
|
51
|
+
return { operatorInvocation, parsed, guided, runId: session.runId };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// CLI entrypoint: `/mutagent-diagnostics "<brief>"` → single positional arg.
|
|
55
|
+
if (import.meta.main) {
|
|
56
|
+
const brief = process.argv[2] ?? "";
|
|
57
|
+
if (brief.trim().length === 0) {
|
|
58
|
+
process.stderr.write('Usage: /mutagent-diagnostics "<natural language brief>"\n');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const invocation = startDiagnoseFromBrief(brief, process.cwd());
|
|
62
|
+
process.stdout.write(JSON.stringify(invocation, null, 2) + "\n");
|
|
63
|
+
process.exit(0);
|
|
64
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/run/session.ts
|
|
3
|
+
* v0.3 run-tagging: generate + persist run metadata per diagnostic session.
|
|
4
|
+
*
|
|
5
|
+
* Every diagnostic run gets a unique runId + a set of tags for
|
|
6
|
+
* tracking/filtering in diagnostics-history. Self-diagnostics runs
|
|
7
|
+
* auto-tag with ["self-diagnostics", "internal"].
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { createRunSession, persistRunMeta, finalizeRunSession } from "./session.ts";
|
|
11
|
+
*
|
|
12
|
+
* const session = createRunSession({ configRoot, extraTags: ["my-run"] });
|
|
13
|
+
* // ... run diagnostics ...
|
|
14
|
+
* await finalizeRunSession(session, { traceCount: 12, source: "langfuse", target: "local-claude" });
|
|
15
|
+
*
|
|
16
|
+
* Type A — Pure Script (file I/O only, no LLM calls)
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
|
|
20
|
+
import { dirname, resolve } from "path";
|
|
21
|
+
import type { RunMeta } from "../config/schema.ts";
|
|
22
|
+
|
|
23
|
+
export interface RunSessionInit {
|
|
24
|
+
/** Root of the host project (where .mutagent/diagnostics/ lives) */
|
|
25
|
+
configRoot: string;
|
|
26
|
+
/** Additional tags from --tag CLI args or caller context */
|
|
27
|
+
extraTags?: string[];
|
|
28
|
+
/** Tags from config.yaml run_tags (applied to every run) */
|
|
29
|
+
configTags?: string[];
|
|
30
|
+
/** Override runId — useful for testing or replay */
|
|
31
|
+
runIdOverride?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface RunSession {
|
|
35
|
+
runId: string;
|
|
36
|
+
tags: string[];
|
|
37
|
+
startedAt: string;
|
|
38
|
+
sessionDir: string;
|
|
39
|
+
metaPath: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the run-meta.json path for a given run under a host project root.
|
|
44
|
+
* Single source of truth for the per-run session-dir layout
|
|
45
|
+
* (`<configRoot>/.mutagent/diagnostics/diagnostics-history/<runId>/run-meta.json`)
|
|
46
|
+
* so both the writer (createRunSession) and later readers (a `--run-id` cascade
|
|
47
|
+
* recovering the original run's awarenessSampleSize) agree on ONE convention.
|
|
48
|
+
*/
|
|
49
|
+
export function runMetaPath(configRoot: string, runId: string): string {
|
|
50
|
+
return resolve(configRoot, ".mutagent/diagnostics", "diagnostics-history", runId, "run-meta.json");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Generate a short random hex suffix to distinguish parallel runs in the same second.
|
|
55
|
+
*/
|
|
56
|
+
function shortHex(n = 6): string {
|
|
57
|
+
const arr = new Uint8Array(n);
|
|
58
|
+
// Use Math.random as a portable fallback (no crypto in all environments)
|
|
59
|
+
for (let i = 0; i < n; i++) arr[i] = Math.floor(Math.random() * 256);
|
|
60
|
+
return Array.from(arr).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Create a new run session — generates runId, resolves tags, creates session dir.
|
|
65
|
+
*/
|
|
66
|
+
export function createRunSession(init: RunSessionInit): RunSession {
|
|
67
|
+
const { configRoot, extraTags = [], configTags = [], runIdOverride } = init;
|
|
68
|
+
|
|
69
|
+
const ts = Date.now();
|
|
70
|
+
const runId = runIdOverride ?? `run-${ts}-${shortHex(4)}`;
|
|
71
|
+
const startedAt = new Date(ts).toISOString();
|
|
72
|
+
|
|
73
|
+
// Merge tags, dedup, preserve order (configTags first, then extraTags)
|
|
74
|
+
const seen = new Set<string>();
|
|
75
|
+
const tags: string[] = [];
|
|
76
|
+
for (const t of [...configTags, ...extraTags]) {
|
|
77
|
+
const normalized = t.trim().toLowerCase();
|
|
78
|
+
if (normalized && !seen.has(normalized)) {
|
|
79
|
+
seen.add(normalized);
|
|
80
|
+
tags.push(normalized);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const metaPath = runMetaPath(configRoot, runId);
|
|
85
|
+
const sessionDir = dirname(metaPath);
|
|
86
|
+
|
|
87
|
+
if (!existsSync(sessionDir)) {
|
|
88
|
+
mkdirSync(sessionDir, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return { runId, tags, startedAt, sessionDir, metaPath };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Persist run-meta.json to the session directory.
|
|
96
|
+
* Call this immediately after createRunSession (partial write — no endedAt yet).
|
|
97
|
+
*/
|
|
98
|
+
export function persistRunMeta(
|
|
99
|
+
session: RunSession,
|
|
100
|
+
partial: Partial<
|
|
101
|
+
Pick<RunMeta, "source" | "target" | "traceCount" | "operatorInvocation" | "awarenessSampleSize">
|
|
102
|
+
> = {}
|
|
103
|
+
): RunMeta {
|
|
104
|
+
const meta: RunMeta = {
|
|
105
|
+
runId: session.runId,
|
|
106
|
+
tags: session.tags,
|
|
107
|
+
startedAt: session.startedAt,
|
|
108
|
+
...partial,
|
|
109
|
+
};
|
|
110
|
+
writeFileSync(session.metaPath, JSON.stringify(meta, null, 2) + "\n", "utf8");
|
|
111
|
+
return meta;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Finalize the run session — writes endedAt + final traceCount to run-meta.json.
|
|
116
|
+
*/
|
|
117
|
+
export function finalizeRunSession(
|
|
118
|
+
session: RunSession,
|
|
119
|
+
final: Partial<
|
|
120
|
+
Pick<RunMeta, "source" | "target" | "traceCount" | "operatorInvocation" | "awarenessSampleSize">
|
|
121
|
+
> = {}
|
|
122
|
+
): RunMeta {
|
|
123
|
+
// Read existing meta if present (preserves fields written at start)
|
|
124
|
+
let existing: RunMeta = {
|
|
125
|
+
runId: session.runId,
|
|
126
|
+
tags: session.tags,
|
|
127
|
+
startedAt: session.startedAt,
|
|
128
|
+
};
|
|
129
|
+
if (existsSync(session.metaPath)) {
|
|
130
|
+
try {
|
|
131
|
+
existing = JSON.parse(readFileSync(session.metaPath, "utf8")) as RunMeta;
|
|
132
|
+
} catch {
|
|
133
|
+
// ignore parse errors — overwrite with current state
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const meta: RunMeta = {
|
|
137
|
+
...existing,
|
|
138
|
+
...final,
|
|
139
|
+
endedAt: new Date().toISOString(),
|
|
140
|
+
};
|
|
141
|
+
writeFileSync(session.metaPath, JSON.stringify(meta, null, 2) + "\n", "utf8");
|
|
142
|
+
return meta;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Compute run tags for a self-diagnostics invocation.
|
|
147
|
+
* Self-diag runs always carry ["self-diagnostics", "internal"].
|
|
148
|
+
*/
|
|
149
|
+
export function selfDiagTags(extraTags: string[] = []): string[] {
|
|
150
|
+
return ["self-diagnostics", "internal", ...extraTags];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// CLI entrypoint: create + print a new run session (useful for scripting)
|
|
154
|
+
if (import.meta.main) {
|
|
155
|
+
const args = process.argv.slice(2);
|
|
156
|
+
const configRoot = args.find((a) => !a.startsWith("--")) ?? process.cwd();
|
|
157
|
+
const tagArgs = args
|
|
158
|
+
.filter((a) => a.startsWith("--tag="))
|
|
159
|
+
.map((a) => a.slice("--tag=".length));
|
|
160
|
+
const isSelfDiag = args.includes("--self-diagnostics");
|
|
161
|
+
const extraTags = isSelfDiag ? selfDiagTags(tagArgs) : tagArgs;
|
|
162
|
+
|
|
163
|
+
const session = createRunSession({ configRoot, extraTags });
|
|
164
|
+
const meta = persistRunMeta(session);
|
|
165
|
+
process.stdout.write(JSON.stringify({ session, meta }, null, 2) + "\n");
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/sample/caps.ts
|
|
3
|
+
* R2.1 + W9-09 — multi-cap enforcement for the mandatory LLM deep-read.
|
|
4
|
+
* Type A — Pure Script (deterministic; NO random; clock is INJECTABLE).
|
|
5
|
+
*
|
|
6
|
+
* Three caps bound a deep-read run. Each cap is `{ active, value }` so it can be
|
|
7
|
+
* toggled independently of its threshold (D1):
|
|
8
|
+
* - max_trace_count — DIP→RAMP escalation rungs [50,100,250,500,1000]; default
|
|
9
|
+
* ceiling = min(N,1000). The 50 rung is the cheap DIP first probe
|
|
10
|
+
* (sip 50, ramp only if evidence is still thin); it is NOT a hard
|
|
11
|
+
* ceiling (the W6 single-50-cap that PR-035 originally described is
|
|
12
|
+
* superseded — see PR-048). The "value" field in the Cap shape holds
|
|
13
|
+
* the CURRENT tier ceiling (set by the escalation loop); DEFAULT_CAPS
|
|
14
|
+
* uses 1000 as the initial hard ceiling. active:true.
|
|
15
|
+
* OPERATOR OVERRIDE: computeCeiling(N, override) raises the ceiling
|
|
16
|
+
* ABOVE 1000 ON COMMAND (operator-explicit only, never auto) — pass
|
|
17
|
+
* --max-trace <N> on the CLI to thread it into the cap value too.
|
|
18
|
+
* - time_budget_sec — per-tier lookup {50:300, 100:600, 250:900, 500:1200, 1000:1800};
|
|
19
|
+
* hard ceiling 1800 s. active:true.
|
|
20
|
+
* - cost_budget_usd — INACTIVE BY DEFAULT (D1, PR-041 — trace-hungry, not cost-shy).
|
|
21
|
+
*
|
|
22
|
+
* D1 rationale (Wave-6 plan §5 D1): skill-side cost tracking is unreliable today
|
|
23
|
+
* (false +/−/security). Max-trace + time bound the run reliably; the $10 is the
|
|
24
|
+
* "if-activated" value, NOT auto-applied. enforceCaps SKIPS inactive caps entirely
|
|
25
|
+
* — an inactive cap can never trip, regardless of its value.
|
|
26
|
+
*
|
|
27
|
+
* Enforcement semantics: caps trip FIRST-TO-TRIP. When any active cap is exceeded
|
|
28
|
+
* the run STOPS, emits whatever findings it has, and raises a banner (the caller
|
|
29
|
+
* renders runMeta.capBanner). The cap NEVER silently truncates without the banner.
|
|
30
|
+
*
|
|
31
|
+
* W9-09 additions (drift-fix 2026-06: dip rung + operator override):
|
|
32
|
+
* - ESCALATION_RUNGS : DIP→RAMP read targets [50, 100, 250, 500, 1000]
|
|
33
|
+
* - TIME_BUDGET_BY_TIER : per-tier time budgets (seconds), incl. 50→300
|
|
34
|
+
* - computeCeiling(N, override?) : min(N, override ?? 1000) — override raises >1000 on command
|
|
35
|
+
* - timeBudgetForTier() : lookup with hard ceiling 1800 s
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
// ── Cap schema ────────────────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
export interface Cap {
|
|
41
|
+
/** When false, this cap is never evaluated (D1). */
|
|
42
|
+
active: boolean;
|
|
43
|
+
/** Threshold value (interpreted per cap kind). */
|
|
44
|
+
value: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type CapKind = "max_trace_count" | "time_budget_sec" | "cost_budget_usd";
|
|
48
|
+
|
|
49
|
+
export interface CapsConfig {
|
|
50
|
+
max_trace_count: Cap;
|
|
51
|
+
time_budget_sec: Cap;
|
|
52
|
+
cost_budget_usd: Cap;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* W9-09 + drift-fix: DIP→RAMP escalation rungs (operator-locked per PR-048).
|
|
57
|
+
* The escalation loop iterates through these in order up to the run ceiling.
|
|
58
|
+
* The leading 50 is the cheap DIP first probe (sip 50 traces, then ramp only if
|
|
59
|
+
* evidence is still thin) — it is NOT a hard ceiling. The W6 single-50-cap that
|
|
60
|
+
* PR-035 originally described is superseded by this dip→ramp+override policy.
|
|
61
|
+
*/
|
|
62
|
+
export const ESCALATION_RUNGS: ReadonlyArray<50 | 100 | 250 | 500 | 1000> = [50, 100, 250, 500, 1000];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* W9-09 + drift-fix: Per-tier time budget in seconds (simple lookup table, hard
|
|
66
|
+
* ceiling 1800 s). Keys are the rung values; any tier not in the table uses the
|
|
67
|
+
* hard ceiling. The 50-dip rung gets a 300 s budget (short — it's a quick probe).
|
|
68
|
+
*/
|
|
69
|
+
export const TIME_BUDGET_BY_TIER: Readonly<Record<number, number>> = {
|
|
70
|
+
50: 300,
|
|
71
|
+
100: 600,
|
|
72
|
+
250: 900,
|
|
73
|
+
500: 1200,
|
|
74
|
+
1000: 1800,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/** W9-09: Absolute hard ceiling for time budget regardless of tier (seconds). */
|
|
78
|
+
export const TIME_BUDGET_HARD_CEILING_SEC = 1800;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* W9-09 + drift-fix: DEFAULT max-trace ceiling when the operator gives no override.
|
|
82
|
+
* The deep-read NEVER auto-exceeds this; only an explicit operator override raises it.
|
|
83
|
+
*/
|
|
84
|
+
export const DEFAULT_MAX_TRACE_CEILING = 1000;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* W9-09 + drift-fix: Compute the effective run ceiling.
|
|
88
|
+
*
|
|
89
|
+
* - NO override (default): `min(population, DEFAULT_MAX_TRACE_CEILING)` = min(N, 1000).
|
|
90
|
+
* Small stacks (N < first rung) skip forced escalation; the ceiling is still N.
|
|
91
|
+
* - OPERATOR OVERRIDE: `min(population, override)` — the operator can RAISE the ceiling
|
|
92
|
+
* ABOVE 1000 ON COMMAND (e.g. override 5000 → min(N, 5000)). The override is
|
|
93
|
+
* operator-explicit only (threaded from `--max-trace <N>`), NEVER applied automatically.
|
|
94
|
+
*
|
|
95
|
+
* The override is honored only when it is a positive, finite number; a non-positive or
|
|
96
|
+
* non-finite override is ignored and the 1000 default applies (fail-safe). Fractional
|
|
97
|
+
* overrides are floored for determinism. Pure, deterministic.
|
|
98
|
+
*/
|
|
99
|
+
export function computeCeiling(population: number, maxTraceOverride?: number): number {
|
|
100
|
+
const overrideValid =
|
|
101
|
+
typeof maxTraceOverride === "number" &&
|
|
102
|
+
Number.isFinite(maxTraceOverride) &&
|
|
103
|
+
maxTraceOverride > 0;
|
|
104
|
+
const ceiling = overrideValid ? Math.floor(maxTraceOverride) : DEFAULT_MAX_TRACE_CEILING;
|
|
105
|
+
return Math.min(population, ceiling);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* W9-09: Look up the time budget for a given tier rung.
|
|
110
|
+
* Returns the entry from TIME_BUDGET_BY_TIER, or TIME_BUDGET_HARD_CEILING_SEC if
|
|
111
|
+
* the tier is not in the table. Caps at TIME_BUDGET_HARD_CEILING_SEC.
|
|
112
|
+
*/
|
|
113
|
+
export function timeBudgetForTier(tier: number): number {
|
|
114
|
+
const budget = TIME_BUDGET_BY_TIER[tier] ?? TIME_BUDGET_HARD_CEILING_SEC;
|
|
115
|
+
return Math.min(budget, TIME_BUDGET_HARD_CEILING_SEC);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* D1-locked defaults. max-trace + time ACTIVE; cost INACTIVE (value is the
|
|
120
|
+
* if-activated figure, never auto-applied).
|
|
121
|
+
*
|
|
122
|
+
* W9-09: max_trace_count.value is the hard run ceiling (1000 = max rung).
|
|
123
|
+
* time_budget_sec.value is the hard time ceiling (1800 s = max rung budget).
|
|
124
|
+
* The escalation loop uses timeBudgetForTier() to set per-tier budgets.
|
|
125
|
+
*/
|
|
126
|
+
export const DEFAULT_CAPS: CapsConfig = {
|
|
127
|
+
max_trace_count: { active: true, value: 1000 },
|
|
128
|
+
time_budget_sec: { active: true, value: TIME_BUDGET_HARD_CEILING_SEC },
|
|
129
|
+
cost_budget_usd: { active: false, value: 10.0 },
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// ── Run accounting ────────────────────────────────────────────────────────────
|
|
133
|
+
|
|
134
|
+
export interface CapUsage {
|
|
135
|
+
/** Traces read by the LLM so far (counts awareness-layer traces too — no double-count). */
|
|
136
|
+
tracesRead: number;
|
|
137
|
+
/** Elapsed wall-clock seconds since run start. */
|
|
138
|
+
elapsedSec: number;
|
|
139
|
+
/** Estimated spend so far (only consulted when cost cap is active). */
|
|
140
|
+
estimatedCostUsd: number;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface CapTrip {
|
|
144
|
+
kind: CapKind;
|
|
145
|
+
/** The cap's threshold value. */
|
|
146
|
+
limit: number;
|
|
147
|
+
/** The observed value that exceeded the limit. */
|
|
148
|
+
observed: number;
|
|
149
|
+
/** Human-readable banner line (rendered as runMeta.capBanner). */
|
|
150
|
+
banner: string;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface EnforceResult {
|
|
154
|
+
/** True when the run must STOP (an active cap tripped). */
|
|
155
|
+
stop: boolean;
|
|
156
|
+
/** The FIRST cap that tripped (first-to-trip), or null when none did. */
|
|
157
|
+
trip: CapTrip | null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Evaluate caps against current usage. Inactive caps are SKIPPED (D1) — they
|
|
162
|
+
* never appear in a trip. The check order is fixed (max_trace → time → cost) so
|
|
163
|
+
* "first-to-trip" is deterministic. Pure: no clock read here — the caller passes
|
|
164
|
+
* `usage.elapsedSec` computed from an injectable start time.
|
|
165
|
+
*/
|
|
166
|
+
export function enforceCaps(caps: CapsConfig, usage: CapUsage): EnforceResult {
|
|
167
|
+
// Fixed evaluation order → deterministic first-to-trip.
|
|
168
|
+
const order: Array<{ kind: CapKind; cap: Cap; observed: number; unit: string }> = [
|
|
169
|
+
{ kind: "max_trace_count", cap: caps.max_trace_count, observed: usage.tracesRead, unit: "traces" },
|
|
170
|
+
{ kind: "time_budget_sec", cap: caps.time_budget_sec, observed: usage.elapsedSec, unit: "s" },
|
|
171
|
+
{ kind: "cost_budget_usd", cap: caps.cost_budget_usd, observed: usage.estimatedCostUsd, unit: "USD" },
|
|
172
|
+
];
|
|
173
|
+
|
|
174
|
+
for (const { kind, cap, observed, unit } of order) {
|
|
175
|
+
if (!cap.active) continue; // D1 — inactive caps never trip.
|
|
176
|
+
if (observed > cap.value) {
|
|
177
|
+
return {
|
|
178
|
+
stop: true,
|
|
179
|
+
trip: {
|
|
180
|
+
kind,
|
|
181
|
+
limit: cap.value,
|
|
182
|
+
observed,
|
|
183
|
+
banner:
|
|
184
|
+
`⛔ Deep-read STOPPED — ${kind} cap exceeded ` +
|
|
185
|
+
`(${observed} ${unit} > ${cap.value} ${unit}). ` +
|
|
186
|
+
`Emitting findings gathered so far. (R2.1${kind === "cost_budget_usd" ? "" : "/D1"})`,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return { stop: false, trip: null };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Compute elapsed seconds from an injectable start + now. Keeping the clock OUT
|
|
197
|
+
* of enforceCaps preserves determinism in tests (pass both timestamps).
|
|
198
|
+
*/
|
|
199
|
+
export function elapsedSeconds(startMs: number, nowMs: number): number {
|
|
200
|
+
return Math.max(0, (nowMs - startMs) / 1000);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ── Wave-17 Block B: expanded-first-pass cap reconciliation ──────────────────
|
|
204
|
+
//
|
|
205
|
+
// The awareness rework (llm-sample.ts) expands the discovery first-pass from 5 to
|
|
206
|
+
// ~12-15 traces for statistical power. Those traces are LLM-read, so per R2.1 cap
|
|
207
|
+
// accounting they COUNT against max_trace_count exactly like any deep-read trace
|
|
208
|
+
// (CapUsage.tracesRead doc-comment: "counts awareness-layer traces too — no
|
|
209
|
+
// double-count"). A naive expanded sample could therefore blow the deep-read
|
|
210
|
+
// budget on a small remaining headroom. reconcileFirstPass() clamps the requested
|
|
211
|
+
// first-pass size to the headroom left under the active max_trace_count cap, BEFORE
|
|
212
|
+
// the sample is drawn — so the expanded pass never overshoots the budget.
|
|
213
|
+
|
|
214
|
+
export interface FirstPassReconcileInput {
|
|
215
|
+
/** The size the sampler WANTS for the expanded discovery first-pass (e.g. 12). */
|
|
216
|
+
requested: number;
|
|
217
|
+
/** Traces already LLM-read this run (awareness + deep-read), per CapUsage.tracesRead. */
|
|
218
|
+
alreadyRead: number;
|
|
219
|
+
/** Marginal candidate count after ledger-subtraction — the true upper bound. */
|
|
220
|
+
availableCandidates: number;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export interface FirstPassReconcileResult {
|
|
224
|
+
/** The reconciled first-pass size to actually draw (>= 0). */
|
|
225
|
+
granted: number;
|
|
226
|
+
/** True when `granted < requested` because a bound (cap or candidates) clamped it. */
|
|
227
|
+
clamped: boolean;
|
|
228
|
+
/** Why the value was clamped (or "ok" when granted === requested). */
|
|
229
|
+
reason: string;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Wave-17 Block B (R2.1 accounting): reconcile the expanded first-pass size against
|
|
234
|
+
* the deep-read max_trace_count cap and the marginal-candidate ceiling.
|
|
235
|
+
*
|
|
236
|
+
* The granted size is the minimum of three bounds:
|
|
237
|
+
* 1. `requested` — what the sampler asked for.
|
|
238
|
+
* 2. `availableCandidates` — can't sample more than exist (post-ledger).
|
|
239
|
+
* 3. headroom = cap.value - alreadyRead — remaining budget under the active cap.
|
|
240
|
+
*
|
|
241
|
+
* When max_trace_count is INACTIVE (D1 toggle), only bounds 1 + 2 apply (the cap
|
|
242
|
+
* imposes no headroom limit). Headroom is floored at 0 — an already-exhausted
|
|
243
|
+
* budget grants nothing. Pure + deterministic: no clock, no random, no I/O.
|
|
244
|
+
*/
|
|
245
|
+
export function reconcileFirstPass(
|
|
246
|
+
caps: CapsConfig,
|
|
247
|
+
input: FirstPassReconcileInput
|
|
248
|
+
): FirstPassReconcileResult {
|
|
249
|
+
const requested = Math.max(0, Math.floor(input.requested));
|
|
250
|
+
const candidates = Math.max(0, Math.floor(input.availableCandidates));
|
|
251
|
+
|
|
252
|
+
// Bound by marginal candidates first (always applies).
|
|
253
|
+
let granted = Math.min(requested, candidates);
|
|
254
|
+
let reason = granted < requested ? "clamped to available marginal candidates (post-ledger)" : "ok";
|
|
255
|
+
|
|
256
|
+
// Bound by remaining cap headroom — only when the max-trace cap is ACTIVE (D1).
|
|
257
|
+
const cap = caps.max_trace_count;
|
|
258
|
+
if (cap.active) {
|
|
259
|
+
const headroom = Math.max(0, Math.floor(cap.value) - Math.max(0, Math.floor(input.alreadyRead)));
|
|
260
|
+
if (headroom < granted) {
|
|
261
|
+
granted = headroom;
|
|
262
|
+
reason = "clamped to remaining max_trace_count headroom (R2.1 cap accounting)";
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
granted,
|
|
268
|
+
clamped: granted < requested,
|
|
269
|
+
reason: granted === requested ? "ok" : reason,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Merge a partial caps override (e.g. from config.yaml) onto DEFAULT_CAPS. Each
|
|
275
|
+
* cap field is overridden wholesale when present. Pure.
|
|
276
|
+
*/
|
|
277
|
+
export function resolveCaps(override?: Partial<CapsConfig>): CapsConfig {
|
|
278
|
+
return {
|
|
279
|
+
max_trace_count: override?.max_trace_count ?? DEFAULT_CAPS.max_trace_count,
|
|
280
|
+
time_budget_sec: override?.time_budget_sec ?? DEFAULT_CAPS.time_budget_sec,
|
|
281
|
+
cost_budget_usd: override?.cost_budget_usd ?? DEFAULT_CAPS.cost_budget_usd,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// ── CLI entrypoint (PRD-SO-05) ────────────────────────────────────────────────
|
|
286
|
+
//
|
|
287
|
+
// Usage:
|
|
288
|
+
// bun scripts/cli/run.sh scripts/sample/caps.ts --output <file>
|
|
289
|
+
//
|
|
290
|
+
// Reads usage from --tracesRead, --elapsedSec, --estimatedCostUsd and evaluates
|
|
291
|
+
// the caps. Writes a JSON result { stop, trip, capsConfig } to --output.
|
|
292
|
+
// When --output is omitted, result is printed to stdout.
|
|
293
|
+
//
|
|
294
|
+
// OPERATOR OVERRIDE: --max-trace <N> raises (or lowers) the active max_trace_count
|
|
295
|
+
// ceiling ON COMMAND — e.g. `--max-trace 5000` lets a fresh run read up to 5000 traces
|
|
296
|
+
// instead of the 1000 default. Operator-explicit only; with no flag the 1000 default holds.
|
|
297
|
+
|
|
298
|
+
if (import.meta.main) {
|
|
299
|
+
const { writeFileSync } = await import("node:fs");
|
|
300
|
+
const { resolve } = await import("node:path");
|
|
301
|
+
|
|
302
|
+
const args = process.argv.slice(2);
|
|
303
|
+
|
|
304
|
+
function argNum(flag: string, fallback: number): number {
|
|
305
|
+
const idx = args.indexOf(flag);
|
|
306
|
+
if (idx >= 0 && args[idx + 1] !== undefined) {
|
|
307
|
+
const v = Number(args[idx + 1]);
|
|
308
|
+
return isNaN(v) ? fallback : v;
|
|
309
|
+
}
|
|
310
|
+
return fallback;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const tracesRead = argNum("--tracesRead", 0);
|
|
314
|
+
const elapsedSec = argNum("--elapsedSec", 0);
|
|
315
|
+
const estimatedCostUsd = argNum("--estimatedCostUsd", 0);
|
|
316
|
+
|
|
317
|
+
const outputIdx = args.indexOf("--output");
|
|
318
|
+
const outputPath = outputIdx >= 0 ? args[outputIdx + 1] : null;
|
|
319
|
+
|
|
320
|
+
// Operator-explicit max-trace override (raises the ceiling above the 1000 default ON COMMAND).
|
|
321
|
+
const maxTraceOverride = argNum("--max-trace", 0);
|
|
322
|
+
const overrideActive = Number.isFinite(maxTraceOverride) && maxTraceOverride > 0;
|
|
323
|
+
const caps: CapsConfig = overrideActive
|
|
324
|
+
? resolveCaps({ max_trace_count: { active: true, value: Math.floor(maxTraceOverride) } })
|
|
325
|
+
: DEFAULT_CAPS;
|
|
326
|
+
|
|
327
|
+
const usage: CapUsage = { tracesRead, elapsedSec, estimatedCostUsd };
|
|
328
|
+
const result = enforceCaps(caps, usage);
|
|
329
|
+
|
|
330
|
+
const out = {
|
|
331
|
+
stop: result.stop,
|
|
332
|
+
trip: result.trip,
|
|
333
|
+
capsConfig: caps,
|
|
334
|
+
usage,
|
|
335
|
+
maxTraceOverride: overrideActive ? Math.floor(maxTraceOverride) : null,
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
const json = JSON.stringify(out, null, 2);
|
|
339
|
+
if (outputPath) {
|
|
340
|
+
writeFileSync(resolve(outputPath), json, "utf-8");
|
|
341
|
+
console.info(`caps-result written to ${outputPath}`);
|
|
342
|
+
} else {
|
|
343
|
+
console.info(json);
|
|
344
|
+
}
|
|
345
|
+
}
|