@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.
Files changed (357) hide show
  1. package/.claude/skills/mutagent-helix/SKILL.md +113 -0
  2. package/.claude/skills/mutagent-helix/scripts/cli/codex-transcode.ts +143 -0
  3. package/.claude/skills/mutagent-helix/scripts/cli/doctor.ts +111 -0
  4. package/.claude/skills/mutagent-helix/scripts/cli/init.ts +382 -0
  5. package/.claude/skills/mutagent-helix/scripts/cli/run.sh +61 -0
  6. package/CLAUDE.md +193 -0
  7. package/LICENSE +201 -0
  8. package/NOTICE +22 -0
  9. package/README.md +209 -0
  10. package/assets/adl-loop.svg +162 -0
  11. package/assets/system-status.svg +422 -0
  12. package/bin/mutagent-cli.mjs +9950 -0
  13. package/bin/mutagent-helix.mjs +78 -0
  14. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/CLAUDE.md +28 -0
  15. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/SKILL.md +138 -0
  16. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/assets/templates/agentspec.yaml.tpl +247 -0
  17. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/frameworks/doc-pins.md +53 -0
  18. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/principles.md +91 -0
  19. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/requirements.yaml +295 -0
  20. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/workflows/orchestrator-protocol.md +302 -0
  21. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/doctor.ts +116 -0
  22. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/init.ts +230 -0
  23. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/run.sh +60 -0
  24. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/config/resolve-spec-dir.ts +199 -0
  25. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/contract/agentspec.schema.ts +455 -0
  26. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/setup/detect.ts +67 -0
  27. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/validate/validate-spec.ts +93 -0
  28. package/mutagent-agentspec/LICENSE +201 -0
  29. package/mutagent-agentspec/NOTICE +19 -0
  30. package/mutagent-agentspec/README.md +44 -0
  31. package/mutagent-builder/.claude/skills/mutagent-builder/SKILL.md +100 -0
  32. package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-architect.md +312 -0
  33. package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-engineer.md +357 -0
  34. package/mutagent-builder/.claude/skills/mutagent-builder/assets/templates/build-report.md.tpl +39 -0
  35. package/mutagent-builder/.claude/skills/mutagent-builder/references/principles.md +31 -0
  36. package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/build-protocol.md +61 -0
  37. package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/improve-handoff.md +23 -0
  38. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/cli/run.sh +60 -0
  39. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/handoff/validate-build-input.ts +72 -0
  40. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/sync-spec/check-sync-spec.ts +499 -0
  41. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/verify/spec-impl-coverage.ts +182 -0
  42. package/mutagent-builder/CLAUDE.md +25 -0
  43. package/mutagent-builder/README.md +26 -0
  44. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/README.md +192 -0
  45. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/SKILL.md +352 -0
  46. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-architect.md +256 -0
  47. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-engineer.md +344 -0
  48. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/diagnostics-analyzer.md +576 -0
  49. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/discovery.md +425 -0
  50. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.json.tpl +24 -0
  51. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.md.tpl +49 -0
  52. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/config.yaml.tpl +100 -0
  53. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/pr-body.md.tpl +56 -0
  54. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/report.html.tpl +327 -0
  55. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/README.md +27 -0
  56. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/iter-N-handover.md.tpl +125 -0
  57. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/self-diagnosis-contract.v0.1.0.yaml.tpl +234 -0
  58. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/spec.yaml.tpl +152 -0
  59. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/team.yaml.tpl +127 -0
  60. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/wave-N-dashboard.html.tpl +1712 -0
  61. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.1-nl-query.md +59 -0
  62. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.2-tier0-progress.md +58 -0
  63. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.3-analysis-progress.md +44 -0
  64. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.4-html-report.md +61 -0
  65. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.5-rca-detail.md +69 -0
  66. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.6-stale-warning.md +53 -0
  67. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.1-welcome.md +60 -0
  68. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.2-source-platform-picker.md +41 -0
  69. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.3-source-auth.md +75 -0
  70. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.4-target-picker.md +48 -0
  71. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.5-ask-tool.md +43 -0
  72. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.6-config-review.md +57 -0
  73. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.7-filter-defaults.md +52 -0
  74. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.8-first-run.md +59 -0
  75. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-findings.json +92 -0
  76. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-meta.json +47 -0
  77. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/adapter-strategy.md +75 -0
  78. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config-migration.md +84 -0
  79. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config.md +159 -0
  80. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/filter-search-matrix.md +66 -0
  81. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/harness-knowledge.md +22 -0
  82. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/memory-format.md +78 -0
  83. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/onboarding-decisions.yaml +187 -0
  84. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/operation-inventory.md +59 -0
  85. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/overview.md +167 -0
  86. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/reference.md +119 -0
  87. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/script-index.md +101 -0
  88. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-adapter-contract.md +93 -0
  89. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/claude-code-transcripts.md +66 -0
  90. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex-transcripts.md +78 -0
  91. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex.md +145 -0
  92. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/install-paths.md +57 -0
  93. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/langfuse.md +178 -0
  94. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/local-jsonl.md +55 -0
  95. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/openobserve.md +102 -0
  96. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/otel.md +63 -0
  97. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/cloud-rest.md +84 -0
  98. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-claude.md +65 -0
  99. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cloud-agent-sdk.md +92 -0
  100. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-codex.md +72 -0
  101. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cursor.md +108 -0
  102. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-mastra.md +77 -0
  103. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-opencode.md +70 -0
  104. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/apply-pr-comment-format.md +82 -0
  105. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/diagnostics.md +35 -0
  106. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/handover-contract.md +247 -0
  107. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/onboarding.md +300 -0
  108. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/orchestrator-protocol.md +1861 -0
  109. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rca.md +331 -0
  110. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rendering-anatomy.md +314 -0
  111. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/schedule-prep.md +100 -0
  112. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/scope-model.md +128 -0
  113. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/verification-methodology.md +174 -0
  114. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/aggregate/sort-findings.ts +0 -0
  115. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/blind-spots.ts +167 -0
  116. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/llm-sample.ts +681 -0
  117. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/doctor.ts +215 -0
  118. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/init.ts +1013 -0
  119. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/install-agents.ts +350 -0
  120. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/run.sh +61 -0
  121. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/shared-templates.ts +79 -0
  122. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/load.ts +392 -0
  123. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/resolve-credential.ts +120 -0
  124. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/schema.ts +641 -0
  125. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/validate.ts +134 -0
  126. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/build-diagnosis-context.ts +417 -0
  127. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/load-context.ts +105 -0
  128. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/contract/types.ts +166 -0
  129. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/build-render-input.ts +1964 -0
  130. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/corpus-severity.ts +172 -0
  131. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/dismissal-match.ts +270 -0
  132. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/rank-remedies.ts +75 -0
  133. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/install-hooks.sh +46 -0
  134. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/pre-push.sh +78 -0
  135. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/invocation/parse-brief.ts +188 -0
  136. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/match.ts +114 -0
  137. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/paths.ts +95 -0
  138. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/store.ts +535 -0
  139. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/types.ts +181 -0
  140. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/lint/template-inline-js.ts +267 -0
  141. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/append.ts +188 -0
  142. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/read.ts +218 -0
  143. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/platforms/entity-context.ts +686 -0
  144. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/read-unitf.ts +267 -0
  145. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/trace.ts +1078 -0
  146. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-adapter.ts +0 -0
  147. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-types.ts +213 -0
  148. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/persist-selections.ts +174 -0
  149. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/render.ts +3254 -0
  150. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/diagnose.ts +64 -0
  151. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/session.ts +167 -0
  152. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/caps.ts +345 -0
  153. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/deep-read-gate.ts +424 -0
  154. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/representative.ts +584 -0
  155. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/objection.ts +224 -0
  156. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/trajectory.ts +489 -0
  157. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/dispatch.ts +135 -0
  158. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/probe.ts +170 -0
  159. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/detect.ts +307 -0
  160. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/ensure-cli.ts +315 -0
  161. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/reconfigure.ts +77 -0
  162. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/verify-agents.ts +207 -0
  163. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/slicer.ts +166 -0
  164. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/claude-code.ts +17 -0
  165. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/codex.ts +11 -0
  166. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/langfuse.ts +17 -0
  167. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/local-jsonl.ts +12 -0
  168. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/otel.ts +12 -0
  169. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/index.ts +54 -0
  170. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/registry.ts +45 -0
  171. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/types.ts +86 -0
  172. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/stale-detector.ts +74 -0
  173. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/test/render-playwright.cli.ts +477 -0
  174. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/claude-code.ts +133 -0
  175. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/langfuse.ts +143 -0
  176. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0-scan.ts +423 -0
  177. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/completeness-check.ts +436 -0
  178. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/doc-refs.ts +190 -0
  179. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/finalize-gate.ts +417 -0
  180. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/findings-contract.ts +628 -0
  181. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/render-js-syntax.ts +188 -0
  182. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/report-checklist.yaml +217 -0
  183. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/trace-shape.ts +262 -0
  184. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/wave6-checklist.ts +326 -0
  185. package/mutagent-diagnostics/CLAUDE.md +41 -0
  186. package/mutagent-diagnostics/LICENSE +201 -0
  187. package/mutagent-diagnostics/NOTICE +18 -0
  188. package/mutagent-diagnostics/README.md +343 -0
  189. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/SKILL.md +548 -0
  190. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/audit-executor.md +169 -0
  191. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/dataset-builder.md +160 -0
  192. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/discovery.md +425 -0
  193. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/evaluator.md +1108 -0
  194. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/theme.css +213 -0
  195. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/wordmark.html +9 -0
  196. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/context-flow-lens.md +85 -0
  197. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/data-lens.md +47 -0
  198. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/decision-lens.md +48 -0
  199. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/methodology-critic-lens.md +53 -0
  200. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/trajectory-lens.md +44 -0
  201. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/build-review-interface.md +83 -0
  202. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/edd-loop.md +134 -0
  203. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/error-analysis.md +113 -0
  204. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-audit.md +154 -0
  205. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-stage.md +168 -0
  206. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/generate-synthetic-data.md +81 -0
  207. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/grounded-adjudication.md +221 -0
  208. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/memory-format.md +65 -0
  209. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/methodology.md +201 -0
  210. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/operation-inventory.md +197 -0
  211. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/validate-evaluator.md +125 -0
  212. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/workflows/orchestrator-protocol.md +300 -0
  213. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/write-judge-prompt.md +123 -0
  214. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/behavior-tree.schema.yaml +73 -0
  215. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/dataset.schema.yaml +66 -0
  216. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/edd-change-request.schema.yaml +114 -0
  217. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/eval-matrix.schema.yaml +74 -0
  218. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-graph.schema.yaml +69 -0
  219. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-profile.schema.yaml +49 -0
  220. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/methodology-review.schema.yaml +40 -0
  221. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/scorecard.schema.yaml +85 -0
  222. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/agent-dispatch.ts +0 -0
  223. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/aggregate-discover.ts +543 -0
  224. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/artifact-paths.ts +115 -0
  225. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/assemble-scorecard.ts +172 -0
  226. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-dataset.ts +186 -0
  227. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-evals.ts +93 -0
  228. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-review-ui.ts +393 -0
  229. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/check-method-router.ts +170 -0
  230. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/aggregate.ts +112 -0
  231. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/audit-run.ts +182 -0
  232. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/doctor.ts +211 -0
  233. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/dogfood.ts +133 -0
  234. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/init.ts +601 -0
  235. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/methodology-review.ts +122 -0
  236. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/prep.ts +295 -0
  237. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/profile-subject.ts +165 -0
  238. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/run.sh +56 -0
  239. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/variance-check.ts +105 -0
  240. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-eval.ts +248 -0
  241. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-quality-verdict.ts +285 -0
  242. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/codegen-evals.ts +173 -0
  243. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-project.ts +151 -0
  244. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-sampler.ts +267 -0
  245. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/load.ts +343 -0
  246. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/schema.ts +380 -0
  247. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/agentspec-evals.ts +85 -0
  248. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/dataset.ts +149 -0
  249. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-engine.ts +118 -0
  250. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-matrix.ts +577 -0
  251. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-types.ts +1074 -0
  252. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/flow-graph.ts +194 -0
  253. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/types.ts +303 -0
  254. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/validation.ts +193 -0
  255. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/derive-dataset.ts +152 -0
  256. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/determine-outcome.ts +219 -0
  257. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/diff-discriminate.ts +160 -0
  258. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/discover-criteria.ts +348 -0
  259. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/change-request.ts +232 -0
  260. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/edd-types.ts +210 -0
  261. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/variance-gate.ts +186 -0
  262. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/emit-completeness.ts +111 -0
  263. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/eval-engine.ts +160 -0
  264. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/evaluate.ts +333 -0
  265. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/flow-graph.ts +230 -0
  266. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-prompt-template.ts +253 -0
  267. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-provider.ts +135 -0
  268. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-grounding.ts +229 -0
  269. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-uniformity.ts +168 -0
  270. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/living-suite.ts +109 -0
  271. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-bundle.ts +203 -0
  272. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile-vocab.ts +64 -0
  273. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile.ts +106 -0
  274. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/mask.ts +138 -0
  275. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/materialize-dataset.ts +113 -0
  276. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/matrix-judge.ts +750 -0
  277. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/append.ts +215 -0
  278. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/read.ts +168 -0
  279. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/persist-eval-criteria.ts +232 -0
  280. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/prep-tasks.ts +125 -0
  281. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/profile-subject.ts +310 -0
  282. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/publish-report.ts +131 -0
  283. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/read-unitf-traces.ts +81 -0
  284. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-build-cards.ts +195 -0
  285. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-discover-report.ts +1640 -0
  286. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-eval-report.ts +3838 -0
  287. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-report.ts +212 -0
  288. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-credential.ts +110 -0
  289. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-ref.ts +98 -0
  290. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/result-verify.ts +129 -0
  291. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/route-failures.ts +330 -0
  292. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-deterministic.ts +367 -0
  293. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-evaluate.ts +719 -0
  294. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-judge.ts +155 -0
  295. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-pipeline.ts +175 -0
  296. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sample-traces.ts +210 -0
  297. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/self-audit.ts +387 -0
  298. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/source-map.ts +106 -0
  299. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/subject-profile.ts +134 -0
  300. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/substrate.ts +162 -0
  301. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sync-eval-criteria.ts +244 -0
  302. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/ui-slots.ts +119 -0
  303. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/unitf-to-evaltrace.ts +284 -0
  304. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/validate-judge.ts +358 -0
  305. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/variance-compare.ts +177 -0
  306. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/behavior-tree.yaml +140 -0
  307. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/eval-matrix.yaml +1270 -0
  308. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/methodology-review.yaml +105 -0
  309. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/audit.workflow.js +82 -0
  310. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/data-leak.workflow.js +236 -0
  311. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/variance.workflow.js +163 -0
  312. package/mutagent-evaluator/CLAUDE.md +45 -0
  313. package/mutagent-evaluator/LICENSE +201 -0
  314. package/mutagent-evaluator/NOTICE +23 -0
  315. package/mutagent-evaluator/README.md +88 -0
  316. package/mutagent-optimize/.claude/skills/mutagent-optimize/SKILL.md +287 -0
  317. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/contracts/amend-request.ts +503 -0
  318. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/improve-loop-run.ts +304 -0
  319. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state-cli.ts +300 -0
  320. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state.ts +440 -0
  321. package/mutagent-optimize/CLAUDE.md +49 -0
  322. package/mutagent-optimize/README.md +26 -0
  323. package/mutagent-orchestrator/CLAUDE.md +102 -0
  324. package/mutagent-orchestrator/README.md +20 -0
  325. package/mutagent-orchestrator/assets/agents/discovery.md +425 -0
  326. package/mutagent-orchestrator/assets/agents/dogfood-monitor.md +266 -0
  327. package/mutagent-orchestrator/assets/agents/monitor.md +258 -0
  328. package/mutagent-orchestrator/orchestrator.md +782 -0
  329. package/mutagent-orchestrator/references/MONITORING.md +209 -0
  330. package/mutagent-orchestrator/references/config-fields.md +132 -0
  331. package/mutagent-orchestrator/references/config-migration.md +132 -0
  332. package/mutagent-orchestrator/references/index-registry.md +92 -0
  333. package/mutagent-orchestrator/routing.yaml +391 -0
  334. package/mutagent-orchestrator/scripts/config-schema.ts +1010 -0
  335. package/mutagent-orchestrator/scripts/dispatch.ts +439 -0
  336. package/mutagent-orchestrator/scripts/dogfood/extract-feedback.ts +203 -0
  337. package/mutagent-orchestrator/scripts/dogfood/reconstruct-trajectory.ts +327 -0
  338. package/mutagent-orchestrator/scripts/dogfood/render-dogfood-report.ts +347 -0
  339. package/mutagent-orchestrator/scripts/dogfood/resolve-subagents.ts +160 -0
  340. package/mutagent-orchestrator/scripts/dogfood/run-report.ts +264 -0
  341. package/mutagent-orchestrator/scripts/dogfood/slack-thread.ts +106 -0
  342. package/mutagent-orchestrator/scripts/dogfood/types.ts +257 -0
  343. package/mutagent-orchestrator/scripts/eval-routing.ts +753 -0
  344. package/mutagent-orchestrator/scripts/gate.ts +219 -0
  345. package/mutagent-orchestrator/scripts/handover-contract.ts +362 -0
  346. package/mutagent-orchestrator/scripts/index/build-index.ts +351 -0
  347. package/mutagent-orchestrator/scripts/index/render-index.ts +110 -0
  348. package/mutagent-orchestrator/scripts/monitor/slack-notify.ts +111 -0
  349. package/mutagent-orchestrator/scripts/monitor/triggers.ts +162 -0
  350. package/mutagent-orchestrator/scripts/onboarding-check.ts +369 -0
  351. package/mutagent-orchestrator/scripts/render-roster.ts +308 -0
  352. package/mutagent-orchestrator/scripts/resolve-credential.ts +185 -0
  353. package/mutagent-orchestrator/scripts/resolve-paths.ts +114 -0
  354. package/mutagent-orchestrator/scripts/slack/format.ts +63 -0
  355. package/mutagent-orchestrator/scripts/slack/post.ts +115 -0
  356. package/mutagent-orchestrator/scripts/sync-index.ts +311 -0
  357. 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
+ }