@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,584 @@
1
+ /**
2
+ * scripts/sample/representative.ts
3
+ * R2.5 + W9-09 — Sampling representativeness proof + tiered batch escalation.
4
+ * Type A — Pure Script (deterministic — NO clock, NO random, NO LLM, NO I/O).
5
+ *
6
+ * This module is the SHARED sampler used by both:
7
+ * - R2.1 mandatory LLM deep-read (which traces get read by the LLM), and
8
+ * - R2.5 representativeness proof (does the chosen sample cover the population?).
9
+ *
10
+ * Determinism contract: given the same TraceMetadata[] in the same order, the
11
+ * sampler returns byte-identical buckets and the coverage proof returns identical
12
+ * numbers. Ties break by stable index order (never Math.random, never Date.now).
13
+ *
14
+ * 4-BUCKET MODEL (R2.1): worst · median · best · random.
15
+ * - worst: highest "badness" score (low normalizedScore, high latency, error/feedback).
16
+ * - best: lowest badness.
17
+ * - median: closest to the median badness.
18
+ * - random: deterministic stride pick across the remaining population (no RNG).
19
+ * The worst bucket is over-weighted (worst-weighted floor — see buildBucketSample).
20
+ *
21
+ * 4-DIM COVERAGE (R2.5): latency · score · temporal · tool-trajectory.
22
+ * Each dimension's coverage = (distinct buckets of the population that the sample
23
+ * touches) / (distinct buckets present in the population). coverageConfidence is the
24
+ * mean across the 4 dims, mapped to high/med/low via 90/70 thresholds.
25
+ *
26
+ * W9-09 additions:
27
+ * - buildBatchSample() : produce a deterministic batch up to `tier` using
28
+ * the 4-bucket worst-weighted sampler (no clock/random).
29
+ * - isSufficient() : stop predicate — coverageConfidence==='high' AND
30
+ * newFailureCategoriesInLastBatch===0.
31
+ */
32
+
33
+ import type { TraceMetadata, FindingCoverageProof } from "../normalize/trace.ts";
34
+
35
+ // ── Bucket model (R2.1) ──────────────────────────────────────────────────────
36
+
37
+ export type SampleBucket = "worst" | "median" | "best" | "random";
38
+
39
+ export interface BucketAssignment {
40
+ traceId: string;
41
+ bucket: SampleBucket;
42
+ /** Computed badness score (higher = worse) — surfaced for audit + determinism proof. */
43
+ badness: number;
44
+ }
45
+
46
+ export interface BucketSample {
47
+ /** Trace IDs selected for LLM deep-read, in deterministic order. */
48
+ selected: BucketAssignment[];
49
+ /** Count selected per bucket (audit). */
50
+ perBucketCount: Record<SampleBucket, number>;
51
+ /** Total population size the sample was drawn from. */
52
+ populationSize: number;
53
+ /** True when the sample exceeds 30% of the population (R-6 small-pop warning). */
54
+ oversampledSmallPopulation: boolean;
55
+ }
56
+
57
+ /**
58
+ * The minimum number of traces an LLM deep-read sample must contain on a fresh
59
+ * run (R2.1 15-trace floor). Tunable by the caller. Worst-weighted: the floor is
60
+ * filled by pulling additional worst-bucket traces first.
61
+ */
62
+ export const DEFAULT_SAMPLE_FLOOR = 15;
63
+
64
+ /**
65
+ * D-9 (W13-D): worst-bucket weight. Of the discretionary budget (the slots left
66
+ * after the 3 anchors), at least this FRACTION is reserved for the worst-ranked
67
+ * tail and labelled `worst` — BEFORE the random stride runs. This is what makes
68
+ * the sampler "worst-weighted" in fact, not just in name.
69
+ *
70
+ * Why 0.4: a representativeness sampler for a latency/cost diagnosis must guarantee
71
+ * meaningful tail coverage. Before this floor, the random stride (walking from
72
+ * rank 0 = the worst) consumed the whole budget and mislabelled the worst traces
73
+ * as `random` (the audit's "worst:1/median:1/best:1/random:137" — the tail was
74
+ * present but the bucket census lied, and on partial samples the tail was not
75
+ * over-represented at all). Reserving 40% of the discretionary budget for the
76
+ * worst tail over-weights the tail honestly while leaving 60% for the random
77
+ * stride's spread across the rest of the population.
78
+ *
79
+ * Deterministic: a pure ratio applied via integer floor — no clock, no random.
80
+ */
81
+ export const WORST_BUCKET_WEIGHT = 0.4;
82
+
83
+ /**
84
+ * Deterministic "badness" score for a trace. Higher = worse. Pure function of
85
+ * the trace metadata — NO clock, NO random. Combines (in priority order):
86
+ * - error presence (+0.40)
87
+ * - feedback presence (+0.20)
88
+ * - low normalized score (+ (1 - normalizedScore) * 0.30) when present
89
+ * - high latency (+ min(latencyMs / 60000, 1) * 0.10) when present
90
+ * Missing fields contribute 0 — they never inflate badness.
91
+ */
92
+ export function computeBadness(t: TraceMetadata): number {
93
+ let b = 0;
94
+ if (t.hasError) b += 0.4;
95
+ if (t.hasFeedback) b += 0.2;
96
+ if (typeof t.normalizedScore === "number") {
97
+ b += (1 - clamp01(t.normalizedScore)) * 0.3;
98
+ }
99
+ if (typeof t.latencyMs === "number") {
100
+ b += Math.min(t.latencyMs / 60_000, 1) * 0.1;
101
+ }
102
+ return b;
103
+ }
104
+
105
+ function clamp01(n: number): number {
106
+ if (n < 0) return 0;
107
+ if (n > 1) return 1;
108
+ return n;
109
+ }
110
+
111
+ /**
112
+ * R2.1 4-bucket sampler. Assigns every trace a badness score, sorts deterministically
113
+ * (badness desc, then original index asc for stable ties), then selects:
114
+ * - the single worst, median, and best traces (the bucket "anchors"), and
115
+ * - a deterministic stride of "random"-bucket traces,
116
+ * filling up to `floor` total by pulling additional worst-ranked traces first
117
+ * (worst-weighted). When the population is smaller than the floor, the whole
118
+ * population is selected.
119
+ *
120
+ * Determinism: stride uses integer arithmetic over the sorted index — no RNG.
121
+ */
122
+ export function buildBucketSample(
123
+ traces: TraceMetadata[],
124
+ floor: number = DEFAULT_SAMPLE_FLOOR
125
+ ): BucketSample {
126
+ const populationSize = traces.length;
127
+ const perBucketCount: Record<SampleBucket, number> = {
128
+ worst: 0,
129
+ median: 0,
130
+ best: 0,
131
+ random: 0,
132
+ };
133
+
134
+ if (populationSize === 0) {
135
+ return { selected: [], perBucketCount, populationSize: 0, oversampledSmallPopulation: false };
136
+ }
137
+
138
+ // Stable-sorted by badness desc, original index asc on ties.
139
+ const ranked = traces
140
+ .map((t, idx) => ({ t, idx, badness: computeBadness(t) }))
141
+ .sort((a, b) => (b.badness - a.badness) || (a.idx - b.idx));
142
+
143
+ const selectedIdx = new Set<number>();
144
+ const assignments: BucketAssignment[] = [];
145
+
146
+ const assign = (rankPos: number, bucket: SampleBucket): void => {
147
+ if (rankPos < 0 || rankPos >= ranked.length) return;
148
+ if (selectedIdx.has(rankPos)) return;
149
+ selectedIdx.add(rankPos);
150
+ assignments.push({ traceId: ranked[rankPos].t.traceId, bucket, badness: ranked[rankPos].badness });
151
+ perBucketCount[bucket] += 1;
152
+ };
153
+
154
+ // Anchors: worst (rank 0), best (last rank), median (middle rank).
155
+ assign(0, "worst");
156
+ assign(ranked.length - 1, "best");
157
+ assign(Math.floor((ranked.length - 1) / 2), "median");
158
+
159
+ const target = Math.min(floor, ranked.length);
160
+
161
+ // D-9: worst-bucket FLOOR — reserve a fraction of the discretionary budget for
162
+ // the worst-ranked tail BEFORE the random stride, so the sampler is genuinely
163
+ // worst-weighted (not just in name). Run only when the population is larger than
164
+ // the sample target (i.e. the sample is a true subset that must be representative);
165
+ // when target === population every trace is selected anyway, so over-weighting is
166
+ // a no-op there. Pulls the next-worst ranked traces (rank 1, 2, … — rank 0 is the
167
+ // worst anchor) and labels them `worst`. Deterministic: integer floor, no random.
168
+ if (ranked.length > target) {
169
+ const discretionary = Math.max(0, target - assignments.length);
170
+ const worstFloor = Math.floor(discretionary * WORST_BUCKET_WEIGHT);
171
+ for (let pos = 0; pos < ranked.length && perBucketCount.worst < worstFloor + 1; pos++) {
172
+ // +1 because the rank-0 worst anchor already counts toward perBucketCount.worst.
173
+ assign(pos, "worst");
174
+ }
175
+ }
176
+
177
+ // Random bucket: deterministic stride across the remaining population. After the
178
+ // worst floor reserved the tail, the stride spreads the remaining budget across
179
+ // the whole ranked range so non-tail bands stay covered (coverage stays honest).
180
+ if (ranked.length > assignments.length) {
181
+ const remainingNeededForStride = Math.max(0, target - assignments.length);
182
+ if (remainingNeededForStride > 0) {
183
+ const stride = Math.max(1, Math.floor(ranked.length / remainingNeededForStride));
184
+ for (let pos = 0; pos < ranked.length && countUnseen(selectedIdx, target); pos += stride) {
185
+ assign(pos, "random");
186
+ }
187
+ }
188
+ }
189
+
190
+ // Worst-weighted floor fill: top up to target by pulling the next-worst ranked
191
+ // traces (e.g. when the stride could not reach target due to collisions).
192
+ for (let pos = 0; pos < ranked.length && assignments.length < target; pos++) {
193
+ assign(pos, "worst");
194
+ }
195
+
196
+ const oversampledSmallPopulation = populationSize > 0 && assignments.length / populationSize > 0.3;
197
+
198
+ return {
199
+ selected: assignments,
200
+ perBucketCount,
201
+ populationSize,
202
+ oversampledSmallPopulation,
203
+ };
204
+ }
205
+
206
+ function countUnseen(seen: Set<number>, target: number): boolean {
207
+ return seen.size < target;
208
+ }
209
+
210
+ // ── 4-dimensional coverage proof (R2.5) ──────────────────────────────────────
211
+
212
+ export type CoverageDimension = "latency" | "score" | "temporal" | "tool-trajectory";
213
+
214
+ export interface DimensionCoverage {
215
+ dimension: CoverageDimension;
216
+ /** Distinct population buckets present in this dimension. */
217
+ populationBuckets: number;
218
+ /** Of those, how many the sample touches. */
219
+ coveredBuckets: number;
220
+ /** coveredBuckets / populationBuckets * 100, or 100 when the dimension is absent. */
221
+ coveragePct: number;
222
+ }
223
+
224
+ export interface PopulationStats {
225
+ populationSize: number;
226
+ sampleSize: number;
227
+ /** Fraction of the population that was sampled (0..1). */
228
+ sampleFraction: number;
229
+ /** Mean badness of the WHOLE population (bias proof — compare to sample mean). */
230
+ populationMeanBadness: number;
231
+ /** Mean badness of the SAMPLE (bias proof — should track the population). */
232
+ sampleMeanBadness: number;
233
+ }
234
+
235
+ export type ConfidenceLevel = "high" | "medium" | "low";
236
+
237
+ export interface CoverageProof {
238
+ /** Per-finding confidence value 0..100 (mean of the 4 dimension coveragePcts). */
239
+ coverageConfidence: number;
240
+ /** high (≥90) · medium (≥70) · low (else). */
241
+ level: ConfidenceLevel;
242
+ dimensions: DimensionCoverage[];
243
+ population: PopulationStats;
244
+ /** True when level === "low" (drives the WARN-only banner). */
245
+ isLow: boolean;
246
+ }
247
+
248
+ /** R2.5 thresholds (operator-locked): ≥90 high · ≥70 medium · else low. */
249
+ export const COVERAGE_THRESHOLD_HIGH = 90;
250
+ export const COVERAGE_THRESHOLD_MED = 70;
251
+
252
+ export function confidenceLevel(pct: number): ConfidenceLevel {
253
+ if (pct >= COVERAGE_THRESHOLD_HIGH) return "high";
254
+ if (pct >= COVERAGE_THRESHOLD_MED) return "medium";
255
+ return "low";
256
+ }
257
+
258
+ /**
259
+ * Bucket a latency (ms) into a coarse band for coverage comparison. Deterministic.
260
+ * Bands: <1s · 1-5s · 5-15s · 15-60s · >60s.
261
+ */
262
+ function latencyBand(latencyMs: number): string {
263
+ if (latencyMs < 1_000) return "l<1s";
264
+ if (latencyMs < 5_000) return "l1-5s";
265
+ if (latencyMs < 15_000) return "l5-15s";
266
+ if (latencyMs < 60_000) return "l15-60s";
267
+ return "l>60s";
268
+ }
269
+
270
+ /** Bucket a normalized score [0,1] into quintiles. Deterministic. */
271
+ function scoreBand(normalizedScore: number): string {
272
+ const s = clamp01(normalizedScore);
273
+ const q = Math.min(4, Math.floor(s * 5));
274
+ return `s-q${q}`;
275
+ }
276
+
277
+ /** Bucket a start time (ISO8601) into its UTC hour-of-day [0..23]. Deterministic. */
278
+ function temporalBand(startTime: string): string | null {
279
+ const d = new Date(startTime);
280
+ const h = d.getUTCHours();
281
+ if (Number.isNaN(h)) return null;
282
+ return `h${h}`;
283
+ }
284
+
285
+ /**
286
+ * Tool-trajectory band: a stable signature of the trace's tool-usage shape.
287
+ * Uses tags as a deterministic proxy (sorted, joined) since the canonical
288
+ * TraceMetadata does not carry the full message list. Absent → null.
289
+ */
290
+ function toolTrajectoryBand(t: TraceMetadata): string | null {
291
+ if (!t.tags || t.tags.length === 0) return null;
292
+ return "tt:" + [...t.tags].sort().join(",");
293
+ }
294
+
295
+ function bandsFor(dim: CoverageDimension, t: TraceMetadata): string | null {
296
+ switch (dim) {
297
+ case "latency":
298
+ return typeof t.latencyMs === "number" ? latencyBand(t.latencyMs) : null;
299
+ case "score":
300
+ return typeof t.normalizedScore === "number" ? scoreBand(t.normalizedScore) : null;
301
+ case "temporal":
302
+ return t.startTime ? temporalBand(t.startTime) : null;
303
+ case "tool-trajectory":
304
+ return toolTrajectoryBand(t);
305
+ }
306
+ }
307
+
308
+ const ALL_DIMENSIONS: CoverageDimension[] = ["latency", "score", "temporal", "tool-trajectory"];
309
+
310
+ function dimensionCoverage(
311
+ dim: CoverageDimension,
312
+ population: TraceMetadata[],
313
+ sampleIds: Set<string>
314
+ ): DimensionCoverage {
315
+ const populationBands = new Set<string>();
316
+ const coveredBands = new Set<string>();
317
+ for (const t of population) {
318
+ const band = bandsFor(dim, t);
319
+ if (band === null) continue;
320
+ populationBands.add(band);
321
+ if (sampleIds.has(t.traceId)) coveredBands.add(band);
322
+ }
323
+ const populationBuckets = populationBands.size;
324
+ const coveredBuckets = coveredBands.size;
325
+ // Absent dimension (no bands in population) → vacuously fully covered (100%).
326
+ const coveragePct = populationBuckets === 0 ? 100 : (coveredBuckets / populationBuckets) * 100;
327
+ return { dimension: dim, populationBuckets, coveredBuckets, coveragePct };
328
+ }
329
+
330
+ /**
331
+ * R2.5 main entry: prove the sample's representativeness over the population
332
+ * across all 4 dimensions, compute population vs sample badness means (bias proof),
333
+ * and derive a single coverageConfidence + level for the finding.
334
+ *
335
+ * Pure + deterministic: re-running on the same inputs returns identical numbers.
336
+ */
337
+ export function buildCoverageProof(
338
+ population: TraceMetadata[],
339
+ sample: BucketSample
340
+ ): CoverageProof {
341
+ const sampleIds = new Set(sample.selected.map((s) => s.traceId));
342
+
343
+ const dimensions = ALL_DIMENSIONS.map((d) => dimensionCoverage(d, population, sampleIds));
344
+ const coverageConfidence = dimensions.length === 0
345
+ ? 100
346
+ : round2(dimensions.reduce((sum, d) => sum + d.coveragePct, 0) / dimensions.length);
347
+ const level = confidenceLevel(coverageConfidence);
348
+
349
+ const populationMeanBadness = population.length === 0
350
+ ? 0
351
+ : round4(population.reduce((sum, t) => sum + computeBadness(t), 0) / population.length);
352
+ const sampledTraces = population.filter((t) => sampleIds.has(t.traceId));
353
+ const sampleMeanBadness = sampledTraces.length === 0
354
+ ? 0
355
+ : round4(sampledTraces.reduce((sum, t) => sum + computeBadness(t), 0) / sampledTraces.length);
356
+
357
+ const populationStats: PopulationStats = {
358
+ populationSize: population.length,
359
+ sampleSize: sampleIds.size,
360
+ sampleFraction: population.length === 0 ? 0 : round4(sampleIds.size / population.length),
361
+ populationMeanBadness,
362
+ sampleMeanBadness,
363
+ };
364
+
365
+ return {
366
+ coverageConfidence,
367
+ level,
368
+ dimensions,
369
+ population: populationStats,
370
+ isLow: level === "low",
371
+ };
372
+ }
373
+
374
+ // ── W12-13 (OP-4): per-finding coverage proof ─────────────────────────────────
375
+
376
+ /**
377
+ * W12-13: Map the sampler's population-level `CoverageProof` onto the
378
+ * render-facing `FindingCoverageProof` shape (defined in trace.ts so the renderer
379
+ * stays dependency-light). The renderer's `renderCoverageProof(finding)` reads
380
+ * `finding.coverageProof` — until now the sampler computed a population proof but
381
+ * never attached a per-finding proof, so the "Sampling coverage" slot rendered
382
+ * blank. This mapper is the missing bridge.
383
+ *
384
+ * Pure + deterministic (drops only the `isLow` boolean, which the render shape
385
+ * derives from `level` itself).
386
+ */
387
+ export function toFindingCoverageProof(proof: CoverageProof): FindingCoverageProof {
388
+ return {
389
+ coverageConfidence: proof.coverageConfidence,
390
+ level: proof.level,
391
+ dimensions: proof.dimensions.map((d) => ({
392
+ dimension: d.dimension,
393
+ populationBuckets: d.populationBuckets,
394
+ coveredBuckets: d.coveredBuckets,
395
+ coveragePct: d.coveragePct,
396
+ })),
397
+ population: {
398
+ populationSize: proof.population.populationSize,
399
+ sampleSize: proof.population.sampleSize,
400
+ sampleFraction: proof.population.sampleFraction,
401
+ populationMeanBadness: proof.population.populationMeanBadness,
402
+ sampleMeanBadness: proof.population.sampleMeanBadness,
403
+ },
404
+ };
405
+ }
406
+
407
+ /**
408
+ * W12-13: Convenience entry for the orchestrator — compute a `FindingCoverageProof`
409
+ * for ONE finding directly from the population and the finding's evidence sample.
410
+ * The `findingSample` is the BucketSample whose `selected[]` are the trace IDs that
411
+ * back THIS finding's evidence (a subset of the population). When a finding's
412
+ * evidence is not separately sampled, callers may reuse the run-level sample —
413
+ * the proof then reflects the run-level representativeness for that finding.
414
+ *
415
+ * When no per-finding proof can be computed, the orchestrator should leave
416
+ * `finding.coverageProof` undefined; the renderer emits an explicit
417
+ * "representativeness not computed" marker in that case (W12-13 render slot).
418
+ */
419
+ export function buildFindingCoverageProof(
420
+ population: TraceMetadata[],
421
+ findingSample: BucketSample,
422
+ ): FindingCoverageProof {
423
+ return toFindingCoverageProof(buildCoverageProof(population, findingSample));
424
+ }
425
+
426
+ function round2(n: number): number {
427
+ return Math.round(n * 100) / 100;
428
+ }
429
+ function round4(n: number): number {
430
+ return Math.round(n * 10_000) / 10_000;
431
+ }
432
+
433
+ // ── WARN-only gate (R2.5) ─────────────────────────────────────────────────────
434
+
435
+ export interface CoverageWarning {
436
+ /** Human-readable warning line for the run log / banner. */
437
+ message: string;
438
+ /** The confidence value that tripped the warning. */
439
+ coverageConfidence: number;
440
+ }
441
+
442
+ /**
443
+ * R2.5 WARN-only gate. A "low" coverage proof NEVER blocks — it emits a warning
444
+ * UNLESS the operator passed `--accept-low-confidence` (acceptLowConfidence=true),
445
+ * in which case the warning is suppressed. This is the only behaviour difference
446
+ * the flag controls; the report still renders the coverage widget either way.
447
+ *
448
+ * Returns null when no warning is warranted (level !== "low", or flag set).
449
+ */
450
+ export function coverageWarning(
451
+ proof: CoverageProof,
452
+ acceptLowConfidence: boolean
453
+ ): CoverageWarning | null {
454
+ if (!proof.isLow) return null;
455
+ if (acceptLowConfidence) return null;
456
+ return {
457
+ message:
458
+ `WARN: low sampling coverage (${proof.coverageConfidence.toFixed(1)}%). ` +
459
+ `Evidence may under-represent the population. Non-blocking. ` +
460
+ `Pass --accept-low-confidence to suppress.`,
461
+ coverageConfidence: proof.coverageConfidence,
462
+ };
463
+ }
464
+
465
+ /**
466
+ * Parse the `--accept-low-confidence` flag from a CLI argv slice. Deterministic.
467
+ */
468
+ export function parseAcceptLowConfidence(argv: string[]): boolean {
469
+ return argv.includes("--accept-low-confidence");
470
+ }
471
+
472
+ // ── W9-09: Batch escalation helper + sufficiency predicate ───────────────────
473
+
474
+ /**
475
+ * W9-09: Result of a single escalation batch.
476
+ * The orchestrator stores these as RunMeta.deepRead.batches[].
477
+ */
478
+ export interface BatchResult {
479
+ /** The tier/rung up to which this batch was sampled. */
480
+ tier: number;
481
+ /** The sample produced for this tier. */
482
+ sample: BucketSample;
483
+ /** Coverage proof for this batch's sample. */
484
+ coverageProof: CoverageProof;
485
+ /**
486
+ * Number of NEW distinct failureOrigin.what categories surfaced in this batch
487
+ * (compared to all previously seen categories). The orchestrator tracks the
488
+ * running set and passes the count here.
489
+ */
490
+ newFailureCategories: number;
491
+ }
492
+
493
+ /**
494
+ * W9-09: Produce a deterministic batch sample up to `tier` traces using the
495
+ * existing 4-bucket worst-weighted sampler. Reuses buildBucketSample() with
496
+ * `floor = tier` so the returned sample is always up to `tier` traces.
497
+ *
498
+ * Determinism: NO clock, NO random. Same population + tier → same output.
499
+ * Small populations (size < tier) return the whole population.
500
+ *
501
+ * @param population All trace metadata in scope (not yet filtered).
502
+ * @param tier The escalation rung (e.g. 50, 100, 250, 500, 1000).
503
+ */
504
+ export function buildBatchSample(
505
+ population: TraceMetadata[],
506
+ tier: number,
507
+ ): BatchResult {
508
+ const sample = buildBucketSample(population, tier);
509
+ const coverageProof = buildCoverageProof(population, sample);
510
+ // newFailureCategories is 0 by default — caller updates the running set
511
+ // before recording the batch and passes the count; this default is safe for
512
+ // the first call when no prior batches exist.
513
+ return { tier, sample, coverageProof, newFailureCategories: 0 };
514
+ }
515
+
516
+ /**
517
+ * W9-09: Sufficiency predicate — returns true when the escalation loop can stop
518
+ * because evidence is convincing:
519
+ * coverageConfidence === 'high' AND newFailureCategoriesInLastBatch === 0
520
+ *
521
+ * Pure, deterministic. The loop calls this after each batch to decide whether
522
+ * to escalate to the next rung.
523
+ *
524
+ * @param proof Coverage proof from the latest batch.
525
+ * @param newFailureCategoriesInLastBatch Count of NEW what-categories in the last batch.
526
+ */
527
+ export function isSufficient(
528
+ proof: CoverageProof,
529
+ newFailureCategoriesInLastBatch: number,
530
+ ): boolean {
531
+ return proof.level === "high" && newFailureCategoriesInLastBatch === 0;
532
+ }
533
+
534
+ // ── CLI entrypoint (PRD-SO-05) ────────────────────────────────────────────────
535
+ //
536
+ // Usage:
537
+ // bun scripts/cli/run.sh scripts/sample/representative.ts \
538
+ // --metadata <traces-metadata.json> --output <out.json> \
539
+ // [--n <floor>] [--accept-low-confidence]
540
+ //
541
+ // Reads TraceMetadata[] from --metadata, runs buildBucketSample + buildCoverageProof,
542
+ // writes { sample, coverageProof, warning } JSON to --output (stdout when omitted).
543
+
544
+ if (import.meta.main) {
545
+ const { readFileSync, writeFileSync } = await import("node:fs");
546
+ const { resolve } = await import("node:path");
547
+
548
+ const args = process.argv.slice(2);
549
+
550
+ function argVal(flag: string): string | undefined {
551
+ const idx = args.indexOf(flag);
552
+ return idx >= 0 ? args[idx + 1] : undefined;
553
+ }
554
+
555
+ const metadataPath = argVal("--metadata");
556
+ if (!metadataPath) {
557
+ console.error("Usage: representative.ts --metadata <file> --output <file> [--n N] [--accept-low-confidence]");
558
+ process.exit(2);
559
+ }
560
+
561
+ const outputPath = argVal("--output");
562
+ const floorRaw = argVal("--n");
563
+ const floor = floorRaw !== undefined && !isNaN(Number(floorRaw)) ? Number(floorRaw) : DEFAULT_SAMPLE_FLOOR;
564
+ const acceptLow = parseAcceptLowConfidence(args);
565
+
566
+ const traces = JSON.parse(readFileSync(resolve(metadataPath), "utf-8")) as Parameters<typeof buildBucketSample>[0];
567
+ const sample = buildBucketSample(traces, floor);
568
+ const proof = buildCoverageProof(traces, sample);
569
+ const warning = coverageWarning(proof, acceptLow);
570
+
571
+ const out = { sample, coverageProof: proof, warning };
572
+ const json = JSON.stringify(out, null, 2);
573
+
574
+ if (outputPath) {
575
+ writeFileSync(resolve(outputPath), json, "utf-8");
576
+ console.info(`representative sample written to ${outputPath}`);
577
+ } else {
578
+ console.info(json);
579
+ }
580
+
581
+ if (warning) {
582
+ console.warn(warning.message);
583
+ }
584
+ }