@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,85 @@
1
+ # schemas/scorecard.schema.yaml
2
+ # ============================================================================
3
+ # The TWO-TRACK scorecard shape (decision #5). GATE and TREND are SEPARATE and
4
+ # NEVER merged.
5
+ #
6
+ # Track-1 GATE — binary, severity-gated. Component PASS iff 0 CRIT/HIGH fail.
7
+ # Run PASS iff all components pass. Advisory.
8
+ # Track-2 TREND — the manual's 15-dim variance score, separate.
9
+ #
10
+ # scorecard.json (the assembled artifact) conforms to this shape. The executable
11
+ # validator lives in scripts/contracts/scorecard.ts (TypeBox).
12
+ # ============================================================================
13
+ $id: mutagent-evaluator/scorecard
14
+ title: Two-Track Scorecard
15
+ type: object
16
+ required: [subject, runId, generatedAt, gate, trend]
17
+ properties:
18
+ subject: { type: string }
19
+ runId: { type: string, description: masked for byte-identity }
20
+ generatedAt: { type: string, description: injected; masked for byte-identity }
21
+
22
+ gate:
23
+ type: object
24
+ description: Track-1 — binary, severity-gated rollup
25
+ required: [runPass, components, totals]
26
+ properties:
27
+ runPass:
28
+ type: boolean
29
+ description: true iff every component passes (0 CRIT/HIGH fail)
30
+ components:
31
+ type: array
32
+ items:
33
+ type: object
34
+ required: [componentId, pass, criteria]
35
+ properties:
36
+ componentId: { type: string }
37
+ pass: { type: boolean, description: true iff 0 CRIT/HIGH criteria failed }
38
+ criteria:
39
+ type: array
40
+ items:
41
+ type: object
42
+ required: [dimension, severity, checkMethod, track, result]
43
+ properties:
44
+ dimension: { type: string }
45
+ severity: { enum: [CRIT, HIGH, MED, LOW] }
46
+ checkMethod: { type: string }
47
+ track: { enum: [deterministic, judge] }
48
+ result: { enum: [pass, fail, skip] }
49
+ detail: { type: string }
50
+ totals:
51
+ type: object
52
+ required: [pass, fail, skip, critFail, highFail]
53
+ properties:
54
+ pass: { type: integer }
55
+ fail: { type: integer }
56
+ skip: { type: integer }
57
+ critFail: { type: integer }
58
+ highFail: { type: integer }
59
+
60
+ trend:
61
+ type: object
62
+ description: Track-2 — the 15-dim variance score (separate, never merged into GATE)
63
+ required: [dimensions, varianceScore, runPair]
64
+ properties:
65
+ runPair:
66
+ type: object
67
+ description: the two run bundles compared (masked); absent on a single-run audit
68
+ properties:
69
+ a: { type: string }
70
+ b: { type: string }
71
+ dimensions:
72
+ type: array
73
+ description: the fixed 15 determinism dimensions
74
+ items:
75
+ type: object
76
+ required: [name, measure, target, divergence]
77
+ properties:
78
+ name: { type: string }
79
+ measure: { type: string }
80
+ target: { type: string, description: per-Phase target }
81
+ divergence:
82
+ enum: [identical, within-target, diverged, not-evaluated]
83
+ varianceScore:
84
+ type: number
85
+ description: count of dimensions that diverged beyond target (lower is better; 0 = byte-identical)
@@ -0,0 +1,543 @@
1
+ /**
2
+ * scripts/aggregate-discover.ts — P2: the real `*discover-evals` AGGREGATE half.
3
+ * ---------------------------------------------------------------------------
4
+ * Completes the agent-dispatch FSM for `*discover-evals`: PREP (prepDeterminerTasks) →
5
+ * DISPATCH (#mode-discover leaves — PARENT session) → **AGGREGATE (here)**.
6
+ * Sub-agents cannot fan out sub-agents, so the parent runs DISPATCH; this module
7
+ * is the deterministic AGGREGATE the parent calls once the leaves have written
8
+ * their verdict + mining files.
9
+ *
10
+ * It consumes the TWO real leaf artifacts (shapes per evaluator.md
11
+ * `#mode-discover`):
12
+ * - per-trace determiner verdict files `<key>.verdict.json`
13
+ * = { critique, result, confidence } (the canonical ✓/✗ label)
14
+ * - one per-batch mining report `discover/<batch_id>.json`
15
+ * = { batchId, labels[], categories[] } (the emergent clustering)
16
+ * labels[] : { traceId, verdict, firstThingWrong, evidencePointer }
17
+ * categories[] : { name, definition, class, fixOrEval, exampleTraceIds, … }
18
+ *
19
+ * AGGREGATE JOINS them into `TraceAnnotation[]` (NO hand-rolled annotations in
20
+ * the path), then `deriveMinedCriteria` (§5b metadata + §5c DR-2) → `growLivingSuite`
21
+ * (append-only, monotonic). FAIL-LOUD: a missing verdict file (mirrors
22
+ * `missingVerdictKeys`) or a category referencing an undispatched trace THROWS —
23
+ * a dispatch gap is never a silently-fabricated annotation.
24
+ *
25
+ * PURE except for fs reads (the verdict files). No clock / random / network — the
26
+ * mined criteria + suite are byte-identical for the same inputs (C-PIN).
27
+ */
28
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
29
+ import { dirname, join } from "node:path";
30
+ import { type Static, Type } from "@sinclair/typebox";
31
+ import { Value } from "@sinclair/typebox/value";
32
+ import { missingVerdictKeys, type JudgeTaskSpec } from "./agent-dispatch.ts";
33
+ import { parseCritiqueVerdict } from "./determine-outcome.ts";
34
+ import { deriveMinedCriteria, type TraceAnnotation } from "./discover-criteria.ts";
35
+ import { growLivingSuite, type LivingSuite } from "./living-suite.ts";
36
+ import { deriveRegressionCases } from "./derive-dataset.ts";
37
+ import {
38
+ renderDiscoverReport,
39
+ type GroundingCheckSummary,
40
+ type DiscoverReportInput,
41
+ } from "./render-discover-report.ts";
42
+ import type { LabeledTrace } from "./sample-traces.ts";
43
+ import type { DatasetCase } from "./contracts/dataset.ts";
44
+ import type { CandidateItem, MatrixVerdictFile } from "./contracts/eval-matrix.ts";
45
+ import {
46
+ CodeEvalSpecSchema,
47
+ JudgeKind,
48
+ OutcomeVerdict,
49
+ assertGroundingHonest,
50
+ type DiscoveryRef,
51
+ type EvalTrace,
52
+ type JudgeKindValue,
53
+ type MinedCriterion,
54
+ type OutcomeVerdictValue,
55
+ } from "./contracts/eval-types.ts";
56
+ import type { CodeEvalSpec } from "./code-eval.ts";
57
+ import { applyDiffDiscrimination, type CriterionFireSignals } from "./diff-discriminate.ts";
58
+
59
+ // ── The leaf's per-batch mining report (real #mode-discover output shape) ────
60
+
61
+ export const DiscoverLabelSchema = Type.Object(
62
+ {
63
+ traceId: Type.String({ minLength: 1 }),
64
+ verdict: Type.Union([
65
+ Type.Literal(OutcomeVerdict.Pass),
66
+ Type.Literal(OutcomeVerdict.Fail),
67
+ Type.Literal(OutcomeVerdict.Uncertain),
68
+ ]),
69
+ firstThingWrong: Type.String(),
70
+ evidencePointer: Type.String(),
71
+ /** GA-1 — optional STRUCTURED grounding refs `{obs,path,value}` the leaf
72
+ * cited (additive; when absent a ref is synthesized from evidencePointer). */
73
+ refs: Type.Optional(
74
+ Type.Array(
75
+ Type.Object(
76
+ { obs: Type.String({ minLength: 1 }), path: Type.String(), value: Type.String({ minLength: 1 }) },
77
+ { additionalProperties: false },
78
+ ),
79
+ ),
80
+ ),
81
+ },
82
+ { additionalProperties: false },
83
+ );
84
+
85
+ export const DiscoverCategorySchema = Type.Object(
86
+ {
87
+ name: Type.String({ minLength: 1 }),
88
+ /** the binary criterion statement ("Pass = …"). */
89
+ definition: Type.String({ minLength: 1 }),
90
+ /** objective→code · subjective→judge · code-pre-filter+judge→hybrid. */
91
+ class: Type.Union([Type.Literal("code"), Type.Literal("judge"), Type.Literal("hybrid")]),
92
+ fixOrEval: Type.Union([Type.Literal("eval-worthy"), Type.Literal("fixable")]),
93
+ exampleTraceIds: Type.Array(Type.String({ minLength: 1 })),
94
+ // OPTIONAL §5b metadata proposals (additive agent-contract extension).
95
+ dimension: Type.Optional(Type.String({ minLength: 1 })),
96
+ level: Type.Optional(Type.String({ minLength: 1 })),
97
+ generality: Type.Optional(Type.String({ minLength: 1 })),
98
+ severity: Type.Optional(Type.String({ minLength: 1 })),
99
+ judgeInputs: Type.Optional(Type.Array(Type.String({ minLength: 1 }))),
100
+ /** UNIFORM STANDARD — the executable code-check the leaf emits for a
101
+ * deterministically-checkable category (validated against the canonical
102
+ * registry; carried onto `MinedCriterion.codeEval`). Absent for judge rows. */
103
+ codeEval: Type.Optional(CodeEvalSpecSchema),
104
+ },
105
+ { additionalProperties: false },
106
+ );
107
+
108
+ export const DiscoverMiningReportSchema = Type.Object(
109
+ {
110
+ batchId: Type.String({ minLength: 1 }),
111
+ labels: Type.Array(DiscoverLabelSchema),
112
+ categories: Type.Array(DiscoverCategorySchema),
113
+ },
114
+ { additionalProperties: false },
115
+ );
116
+ export type DiscoverMiningReport = Static<typeof DiscoverMiningReportSchema>;
117
+ export type DiscoverCategory = Static<typeof DiscoverCategorySchema>;
118
+
119
+ /** Guarded parse of a leaf mining report. THROWS with the first schema error. */
120
+ export function parseDiscoverMiningReport(value: unknown): DiscoverMiningReport {
121
+ if (!Value.Check(DiscoverMiningReportSchema, value)) {
122
+ const first = [...Value.Errors(DiscoverMiningReportSchema, value)][0];
123
+ const where = first?.path ?? "(root)";
124
+ const msg = first?.message ?? "does not match DiscoverMiningReport";
125
+ throw new Error(`parseDiscoverMiningReport: invalid mining report at ${where}: ${msg}`);
126
+ }
127
+ return value;
128
+ }
129
+
130
+ // ── JOIN: verdict files + mining report → TraceAnnotation[] ──────────────────
131
+
132
+ /** Map a mining-report category `class` → the engine's JudgeKind. */
133
+ function judgeKindForClass(klass: DiscoverCategory["class"]): JudgeKindValue {
134
+ if (klass === "code") return JudgeKind.Code;
135
+ if (klass === "hybrid") return JudgeKind.Hybrid;
136
+ return JudgeKind.Llm;
137
+ }
138
+
139
+ export interface AggregateDiscoverInput {
140
+ /** the Stage-A determiner specs (carry `unit.traceId` + the verdict file name). */
141
+ determinerSpecs: JudgeTaskSpec[];
142
+ /** the dir the dispatched leaves wrote their per-trace verdict files into. */
143
+ verdictDir: string;
144
+ /** the parsed (or raw) per-batch mining report. */
145
+ miningReport: DiscoverMiningReport;
146
+ }
147
+
148
+ /**
149
+ * Parse the leaf artifacts into `TraceAnnotation[]` — NO hand-rolled annotations.
150
+ * FAIL-LOUD: every dispatched determiner unit MUST have a collected verdict file
151
+ * (mirrors `missingVerdictKeys`); every `exampleTraceId` MUST belong to a
152
+ * dispatched + verdict-backed trace (else the leaf referenced a trace it was
153
+ * never given). The canonical ✓/✗ label is read from the verdict file; the
154
+ * category clustering + notes come from the mining report. Deterministic:
155
+ * categories in report order, exampleTraceIds in report order.
156
+ */
157
+ export function parseDiscoverAnnotations(input: AggregateDiscoverInput): TraceAnnotation[] {
158
+ const report = parseDiscoverMiningReport(input.miningReport);
159
+
160
+ // 1. Readiness gate — every dispatched determiner unit has a verdict file.
161
+ const missing = missingVerdictKeys(input.verdictDir, input.determinerSpecs);
162
+ if (missing.length > 0) {
163
+ throw new Error(
164
+ `parseDiscoverAnnotations: ${missing.length} determiner verdict file(s) MISSING ` +
165
+ `(keys: ${missing.join(", ")}). The parent must PREP → dispatch #mode-discover → ` +
166
+ "collect ALL verdict files before AGGREGATE. A missing verdict is a dispatch gap, " +
167
+ "never a fabricated label.",
168
+ );
169
+ }
170
+
171
+ // 2. traceId → canonical label (read from the per-trace verdict file).
172
+ const labelByTrace = new Map<string, OutcomeVerdictValue>();
173
+ for (const spec of input.determinerSpecs) {
174
+ const traceId = spec.unit.traceId;
175
+ if (traceId === undefined) continue; // non-discover unit; skip
176
+ const raw = readFileSync(join(input.verdictDir, spec.verdictFile), "utf8");
177
+ const verdict = parseCritiqueVerdict(raw);
178
+ labelByTrace.set(traceId, verdict.result as OutcomeVerdictValue);
179
+ }
180
+
181
+ // 3. traceId → mining-report label meta (firstThingWrong + evidencePointer + GA-1 refs).
182
+ const metaByTrace = new Map<
183
+ string,
184
+ { firstThingWrong: string; evidencePointer: string; refs?: DiscoveryRef[] }
185
+ >();
186
+ for (const l of report.labels) {
187
+ metaByTrace.set(l.traceId, {
188
+ firstThingWrong: l.firstThingWrong,
189
+ evidencePointer: l.evidencePointer,
190
+ ...(l.refs !== undefined ? { refs: l.refs } : {}),
191
+ });
192
+ }
193
+
194
+ // 4. JOIN per category × exampleTraceId.
195
+ const annotations: TraceAnnotation[] = [];
196
+ for (const cat of report.categories) {
197
+ const judgeKind = judgeKindForClass(cat.class);
198
+ const failureClass = cat.fixOrEval === "fixable" ? "infra" : "behavioral";
199
+ for (const traceId of cat.exampleTraceIds) {
200
+ const label = labelByTrace.get(traceId);
201
+ if (label === undefined) {
202
+ throw new Error(
203
+ `parseDiscoverAnnotations: category '${cat.name}' references trace '${traceId}' ` +
204
+ "which has no dispatched determiner verdict — the leaf may only cluster traces it " +
205
+ "was dispatched for (no verdict ⇒ no annotation).",
206
+ );
207
+ }
208
+ const meta = metaByTrace.get(traceId);
209
+ const ann: TraceAnnotation = {
210
+ traceId,
211
+ label,
212
+ category: cat.name,
213
+ failureClass,
214
+ judgeKind,
215
+ statement: cat.definition,
216
+ };
217
+ if (meta !== undefined && meta.firstThingWrong.length > 0) ann.note = meta.firstThingWrong;
218
+ if (meta !== undefined && meta.evidencePointer.length > 0) ann.evidencePointer = meta.evidencePointer;
219
+ if (meta !== undefined && meta.refs !== undefined && meta.refs.length > 0) ann.refs = meta.refs;
220
+ if (cat.judgeInputs !== undefined) ann.judgeInputs = cat.judgeInputs;
221
+ // UNIFORM STANDARD — carry the leaf's executable code-check through to the
222
+ // annotation so deriveMinedCriteria lands it on MinedCriterion.codeEval.
223
+ if (cat.codeEval !== undefined) ann.codeEval = cat.codeEval as CodeEvalSpec;
224
+ annotations.push(ann);
225
+ }
226
+ }
227
+ return annotations;
228
+ }
229
+
230
+ // ── Full AGGREGATE: annotations → mined criteria → living-suite ──────────────
231
+
232
+ export interface AggregateDiscoverResult {
233
+ annotations: TraceAnnotation[];
234
+ criteria: MinedCriterion[];
235
+ suite: LivingSuite<MinedCriterion>;
236
+ /** T6 — failure/uncertain DATASET CANDIDATES (present iff `traces` supplied). */
237
+ datasetCandidates: DatasetCase[];
238
+ }
239
+
240
+ /**
241
+ * The full `*discover-evals` AGGREGATE: parse leaf artifacts → mined criteria (§5b+§5c)
242
+ * → grow the append-only living-suite (monotonic; `growLivingSuite` enforces it).
243
+ * A re-run over the same batch never shrinks the suite; new rounds only append
244
+ * novel categories (continuous expansion, EV-053). PURE except for the fs reads.
245
+ *
246
+ * GA wiring (both OPTIONAL — grandfather: absent ⇒ legacy behavior unchanged):
247
+ * - `traces` — GA-1 ground-gate: re-resolve each `observed` criterion's
248
+ * refs exact-match against the trace batch; an observed
249
+ * claim whose refs no longer resolve is REJECTED (THROWS).
250
+ * - `fireSignals` — GA-11 diff-discriminate: a criterion is OBSERVED-eligible
251
+ * only if it fires on BROKEN ∧ NOT on HEALTHY; else demote
252
+ * to `inferred` (or route a garbage-in fixable→diagnostics).
253
+ * No healthy companion ⇒ graceful single-trace fallback
254
+ * (kept observed, tagged) — never a hard fail.
255
+ */
256
+ export function aggregateDiscover(
257
+ input: AggregateDiscoverInput & {
258
+ suite: LivingSuite<MinedCriterion>;
259
+ traces?: EvalTrace[];
260
+ fireSignals?: CriterionFireSignals[];
261
+ },
262
+ ): AggregateDiscoverResult {
263
+ const annotations = parseDiscoverAnnotations(input);
264
+ let criteria = deriveMinedCriteria(annotations);
265
+
266
+ // GA-11 — observed-eligibility via broken∧¬healthy diff (deterministic).
267
+ if (input.fireSignals !== undefined) {
268
+ criteria = applyDiffDiscrimination(criteria, input.fireSignals);
269
+ }
270
+
271
+ // GA-1 — hard ground-gate: an `observed` criterion's refs must RE-RESOLVE.
272
+ if (input.traces !== undefined && input.traces.length > 0) {
273
+ for (const c of criteria) assertGroundingHonest(c, input.traces);
274
+ }
275
+
276
+ const suite = growLivingSuite(input.suite, criteria, (c) => c.id);
277
+
278
+ // T6 — surface failure/uncertain DATASET CANDIDATES (reusing the EV-047 selectors)
279
+ // when the trace batch is supplied; consumable by *build-dataset.
280
+ const datasetCandidates =
281
+ input.traces !== undefined && input.traces.length > 0
282
+ ? collectDatasetCandidates({ determinerSpecs: input.determinerSpecs, verdictDir: input.verdictDir, traces: input.traces })
283
+ : [];
284
+
285
+ return { annotations, criteria, suite, datasetCandidates };
286
+ }
287
+
288
+ // ── Report wiring: AGGREGATE result → report.html (mirrors writeRunReport) ───
289
+ //
290
+ // The way `run-evaluate.ts writeRunReport` composes `buildEvalReportInput` +
291
+ // `renderEvalReport` + `writeFileSync`, this composes the discover-card renderer.
292
+ // The parent `*discover-evals` AGGREGATE path calls this AFTER `aggregateDiscover`.
293
+
294
+ export interface WriteDiscoverReportInput {
295
+ /** the mined criteria from `aggregateDiscover().criteria` (FULL MinedCriterion[]). */
296
+ result: Pick<AggregateDiscoverResult, "criteria">;
297
+ /** the dir to write `report.html` into. */
298
+ reportDir: string;
299
+ subjectName?: string;
300
+ batchId?: string;
301
+ /** OPTIONAL GA `grounding-check.json` summary (drives the strip + diff notes). */
302
+ grounding?: GroundingCheckSummary | null;
303
+ subjectSource?: string;
304
+ /**
305
+ * OPTIONAL companion data forwarded to the renderer — the Proof-of-work tab
306
+ * (`verdicts`), the Dataset tab (`dataset`), and the coverage funnel + send
307
+ * distribution (`triage`/`sentDist`) + entity card (`profile`). REGRESSION FIX:
308
+ * without these the renderer degrades those tabs to empty/em-dash — the producer
309
+ * MUST forward them (the from-files entry already does). Absent ⇒ graceful degrade.
310
+ */
311
+ companions?: Pick<DiscoverReportInput, "verdicts" | "dataset" | "triage" | "sentDist" | "profile">;
312
+ /** the ISO timestamp stamped into the header (masked by mask.ts for C-PIN). */
313
+ generatedAt: string;
314
+ }
315
+
316
+ /**
317
+ * Render + write the discover `report.html` for an AGGREGATE result. Returns the
318
+ * out path. The render is DETERMINISTIC (the only varying input is `generatedAt`,
319
+ * masked by mask.ts); the fs side-effects (mkdir + write) live HERE so the
320
+ * renderer stays pure-given-input. PURE except those fs writes + the renderer's
321
+ * brand reads.
322
+ *
323
+ * ⚠️ MINIMAL entry — without `companions` it degrades funnel/Proof-of-work/Dataset to
324
+ * em-dash/empty (the A4 thin-report gap). For a COMPLETE report by default, the *discover-evals
325
+ * flow should call the shipped `writeDiscoverRunReport` composer (render-discover-report.ts),
326
+ * which builds triage-summary.json + wires every companion from the run dir.
327
+ */
328
+ export function writeDiscoverReport(input: WriteDiscoverReportInput): string {
329
+ const html = renderDiscoverReport({
330
+ subject: {
331
+ name: input.subjectName ?? "discover-subject",
332
+ ...(input.subjectSource ? { source: input.subjectSource } : {}),
333
+ },
334
+ criteria: input.result.criteria,
335
+ grounding: input.grounding ?? null,
336
+ generatedAt: input.generatedAt,
337
+ ...(input.batchId !== undefined ? { batchId: input.batchId } : {}),
338
+ ...(input.companions ?? {}),
339
+ });
340
+ mkdirSync(input.reportDir, { recursive: true });
341
+ const outPath = join(input.reportDir, "discovery-report.html");
342
+ writeFileSync(outPath, html);
343
+ return outPath;
344
+ }
345
+
346
+ // ── T6 (B-U5) discover → DATASET CANDIDATES + unmatched-detection handoff ────
347
+ //
348
+ // `*discover-evals` mined CRITERIA only; T6 ALSO surfaces a failure/uncertain DATASET
349
+ // CANDIDATE artifact (reusing the EV-047 `derive-dataset` selectors) + converts the
350
+ // judge's node-2.5 UNMATCHED DETECTIONS (`*evaluate` walk `candidates[]`) into the
351
+ // same handoff — both consumable by `*build-dataset` (its `mergeCases`). PURE.
352
+
353
+ /** Read the per-trace determiner labels (✓/✗ + confidence) from the verdict files. */
354
+ export function readDeterminerLabels(
355
+ determinerSpecs: JudgeTaskSpec[],
356
+ verdictDir: string,
357
+ ): Map<string, { label: OutcomeVerdictValue; confidence: number }> {
358
+ const out = new Map<string, { label: OutcomeVerdictValue; confidence: number }>();
359
+ for (const spec of determinerSpecs) {
360
+ const traceId = spec.unit.traceId;
361
+ if (traceId === undefined) continue;
362
+ const raw = readFileSync(join(verdictDir, spec.verdictFile), "utf8");
363
+ const v = parseCritiqueVerdict(raw);
364
+ out.set(traceId, { label: v.result as OutcomeVerdictValue, confidence: v.confidence });
365
+ }
366
+ return out;
367
+ }
368
+
369
+ export interface DatasetCandidateInput {
370
+ determinerSpecs: JudgeTaskSpec[];
371
+ verdictDir: string;
372
+ /** the actual traces (a candidate needs the replayable input prompt). */
373
+ traces: EvalTrace[];
374
+ /** target candidate count (the derive-dataset selectors cap to this). */
375
+ size?: number;
376
+ }
377
+
378
+ /**
379
+ * Distill FAILURE + UNCERTAIN traces into `DatasetCase` candidates (the cases worth
380
+ * adding to a regression/coverage set). Reuses the EV-047 selectors (failure-driven
381
+ * · outlier · uncertainty) via `deriveRegressionCases` with `excludeIndeterminate:
382
+ * false` (a CANDIDATE set keeps the brittle uncertain boundary — unlike the held-out
383
+ * gate set). PASS traces are dropped (a candidate is a not-yet-covered ✗/?). The
384
+ * output is `mergeCases`-ready for `*build-dataset`. DETERMINISTIC. PURE except the
385
+ * verdict-file reads.
386
+ */
387
+ export function collectDatasetCandidates(input: DatasetCandidateInput): DatasetCase[] {
388
+ const labels = readDeterminerLabels(input.determinerSpecs, input.verdictDir);
389
+ const traceById = new Map(input.traces.map((t) => [t.id, t]));
390
+ const pool: LabeledTrace[] = [];
391
+ for (const [traceId, meta] of labels) {
392
+ if (meta.label === OutcomeVerdict.Pass) continue; // candidates = ✗ / uncertain
393
+ const trace = traceById.get(traceId);
394
+ if (trace === undefined) continue;
395
+ pool.push({ trace, label: meta.label, confidence: meta.confidence });
396
+ }
397
+ const size = input.size ?? pool.length;
398
+ return deriveRegressionCases(pool, size, { excludeIndeterminate: false });
399
+ }
400
+
401
+ /** One unmatched-detection candidate handed off from the `*evaluate` judge walk. */
402
+ export interface UnmatchedDetectionCandidate extends CandidateItem {
403
+ trajectoryId: string;
404
+ }
405
+
406
+ /**
407
+ * Extract the judge's node-2.5 UNMATCHED DETECTIONS (`candidates[]` on the
408
+ * `*evaluate` verdict walks) — real behaviours with NO matching criterion. Each
409
+ * carries the trajectory it was seen on so `*build-dataset` (kind=dataset) /
410
+ * criterion mining (kind=eval) can route it. DETERMINISTIC (file + array order). PURE.
411
+ */
412
+ export function unmatchedDetectionCandidates(files: MatrixVerdictFile[]): UnmatchedDetectionCandidate[] {
413
+ const out: UnmatchedDetectionCandidate[] = [];
414
+ for (const f of files) {
415
+ for (const c of (f as { candidates?: CandidateItem[] }).candidates ?? []) {
416
+ out.push({ ...c, trajectoryId: f.trajectoryId });
417
+ }
418
+ }
419
+ return out;
420
+ }
421
+
422
+ // ── CLI entrypoint (the parent drives this after DISPATCH) ───────────────────
423
+ //
424
+ // Usage: bun scripts/aggregate-discover.ts <determiner-specs.json> <verdictDir>
425
+ // <mining-report.json> [traces.json] [report.html]
426
+ // Reads the PREP determiner specs + the collected verdict dir + the leaf mining
427
+ // report, runs AGGREGATE, and prints the mined criteria + suite provenance.
428
+ //
429
+ // `traces.json` (OPTIONAL 4th arg) — the normalized `EvalTrace[]` batch. When
430
+ // supplied, it is loaded + PASSED into `aggregateDiscover({ traces })` so the
431
+ // GA-1 ground-gate (`assertGroundingHonest`) RE-RESOLVES each `observed`
432
+ // criterion's refs in the CLI path — exactly as the lib path does. Wiring only:
433
+ // the gate's BEHAVIOR is unchanged (absent ⇒ legacy CLI behavior, gate skipped).
434
+ // `report.html` (OPTIONAL 5th arg) — when supplied, the discover-card report is
435
+ // written there (the way run-evaluate writeRunReport renders post-aggregate).
436
+
437
+ declare const Bun: { argv: string[] } | undefined;
438
+
439
+ export interface AggregateDiscoverCliIo {
440
+ readFile: (p: string) => string;
441
+ writeFile: (p: string, s: string) => void;
442
+ mkdir: (p: string) => void;
443
+ }
444
+
445
+ export interface AggregateDiscoverCliResult {
446
+ batchId: string;
447
+ criteria: number;
448
+ suiteVersion: number;
449
+ suiteTotal: number;
450
+ lastAppended: number;
451
+ criterionIds: string[];
452
+ /** present iff a `report.html` out path was supplied (5th arg). */
453
+ reportPath?: string;
454
+ /** whether the GA-1 ground-gate ran in this CLI invocation (traces supplied). */
455
+ groundGateRan: boolean;
456
+ }
457
+
458
+ /**
459
+ * The CLI body, extracted PURE-given-io (no `process.exit`, no top-level fs) so a
460
+ * test can exercise the traces-wiring + report-wiring deterministically. THROWS
461
+ * on a usage error (the `main` wrapper maps that to exit code 2) or when the
462
+ * GA-1 ground-gate rejects an inferred-as-observed criterion (fail-loud — the
463
+ * gate's behavior is UNCHANGED, just now reached from the CLI path).
464
+ */
465
+ export function runAggregateDiscoverCli(
466
+ argv: string[],
467
+ io: AggregateDiscoverCliIo,
468
+ ): AggregateDiscoverCliResult {
469
+ const [specsPath, verdictDir, reportPath, tracesPath, htmlOutPath] = argv;
470
+ if (!specsPath || !verdictDir || !reportPath) {
471
+ throw new Error(
472
+ "usage: aggregate-discover.ts <determiner-specs.json> <verdictDir> " +
473
+ "<mining-report.json> [traces.json] [report.html]",
474
+ );
475
+ }
476
+ const determinerSpecs = JSON.parse(io.readFile(specsPath)) as JudgeTaskSpec[];
477
+ const miningReport = parseDiscoverMiningReport(
478
+ JSON.parse(io.readFile(reportPath)) as unknown,
479
+ );
480
+ // OPTIONAL traces — load + PASS so the GA-1 ground-gate runs in the CLI path.
481
+ const traces =
482
+ tracesPath !== undefined && tracesPath !== ""
483
+ ? (JSON.parse(io.readFile(tracesPath)) as EvalTrace[])
484
+ : undefined;
485
+
486
+ const { criteria, suite } = aggregateDiscover({
487
+ determinerSpecs,
488
+ verdictDir,
489
+ miningReport,
490
+ suite: { entries: [], provenance: { version: 0, total: 0, lastAppended: 0 } },
491
+ ...(traces !== undefined ? { traces } : {}),
492
+ });
493
+
494
+ let writtenReport: string | undefined;
495
+ if (htmlOutPath !== undefined && htmlOutPath !== "") {
496
+ const html = renderDiscoverReport({
497
+ subject: { name: "discover-subject" },
498
+ criteria,
499
+ grounding: null,
500
+ generatedAt: new Date().toISOString(),
501
+ batchId: miningReport.batchId,
502
+ });
503
+ io.mkdir(dirname(htmlOutPath));
504
+ io.writeFile(htmlOutPath, html);
505
+ writtenReport = htmlOutPath;
506
+ }
507
+
508
+ return {
509
+ batchId: miningReport.batchId,
510
+ criteria: criteria.length,
511
+ suiteVersion: suite.provenance.version,
512
+ suiteTotal: suite.provenance.total,
513
+ lastAppended: suite.provenance.lastAppended,
514
+ criterionIds: criteria.map((c) => c.id),
515
+ ...(writtenReport !== undefined ? { reportPath: writtenReport } : {}),
516
+ groundGateRan: traces !== undefined && traces.length > 0,
517
+ };
518
+ }
519
+
520
+ function main(): void {
521
+ const argv = typeof Bun !== "undefined" ? Bun.argv.slice(2) : process.argv.slice(2);
522
+ let result: AggregateDiscoverCliResult;
523
+ try {
524
+ result = runAggregateDiscoverCli(argv, {
525
+ readFile: (p) => readFileSync(p, "utf8"),
526
+ writeFile: (p, s) => writeFileSync(p, s),
527
+ mkdir: (p) => mkdirSync(p, { recursive: true }),
528
+ });
529
+ } catch (err) {
530
+ console.error(err instanceof Error ? err.message : String(err));
531
+ process.exit(2);
532
+ return;
533
+ }
534
+ console.info(JSON.stringify(result, null, 2));
535
+ process.exit(0);
536
+ }
537
+
538
+ const isMain =
539
+ typeof import.meta !== "undefined" &&
540
+ (import.meta as unknown as { main?: boolean }).main === true;
541
+ if (isMain) {
542
+ main();
543
+ }