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