@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,436 @@
1
+ /**
2
+ * scripts/validate/completeness-check.ts
3
+ * W9-08 (R-CP-1..4): Simple deterministic report-completeness gate.
4
+ *
5
+ * Asserts:
6
+ * 1. RunMeta required fields present (totalTraces, tier0ScannedCount, llmReadCount,
7
+ * scopeFilter, samplingStrategy, decisions, deepRead).
8
+ * 2. Every expected report section non-empty:
9
+ * entity card (diagnosedEntity)
10
+ * bigStat (≥1 tile)
11
+ * heatmap (≥1 cell with count > 0)
12
+ * signal census (≥1 row)
13
+ * ≥1 finding panel (findings.length ≥ 1)
14
+ * Methodology section (runMeta present)
15
+ * Decisions section (always present — no content gating needed)
16
+ * 3. W13-C (D-6): the renderer's EXACT dereference contract — the fields render.ts
17
+ * interpolates without a guard, so a gate-pass GUARANTEES a render-success:
18
+ * - top-level `sessionId` (render does `sessionId.toUpperCase()`)
19
+ * - per-finding `actionable` is a string (render does `actionable.slice()`)
20
+ * - per-finding `failureOrigin.evidence` + `failureOrigin.confidence`
21
+ * - per-remedy `rank` / `cost` / `correctness` (the D-1 header-badge triad)
22
+ * This closes the "gate passes but render crashes/garbles" gap.
23
+ *
24
+ * Export: `checkCompleteness(input): CompletenessResult` (pure function — no I/O)
25
+ * CLI: `if (import.meta.main)` entrypoint — exit 0 on pass, exit 1 with missing list on fail.
26
+ *
27
+ * Type A — Pure Script (deterministic + no I/O except CLI file read)
28
+ */
29
+
30
+ import { parse as parseYaml } from "yaml";
31
+ import type { RenderInput, RunMeta } from "../report/render.ts";
32
+
33
+ // ── Result shape ──────────────────────────────────────────────────────────────
34
+
35
+ export interface CompletenessResult {
36
+ /** True when all required fields and sections are present. */
37
+ pass: boolean;
38
+ /** List of missing / empty fields / sections (empty when pass). */
39
+ missing: string[];
40
+ }
41
+
42
+ // ════════════════════════════════════════════════════════════════════════════
43
+ // S4-orch (Wave-15 Block B): PRE-ENRICHER runMeta gate
44
+ // ════════════════════════════════════════════════════════════════════════════
45
+ //
46
+ // WHY: the orchestrator's Step-8.5 runMeta assembly is hand-threaded with no gate.
47
+ // The F4 methodology widgets (orchestrator-COMPUTED — the enricher cannot recompute
48
+ // them) can silently fail to thread. A real regression was observed in run 210635:
49
+ // NOTHING threaded → generic-fallback Methodology, 0 <svg>. The pre-render
50
+ // completeness-check (above) runs AFTER the enricher; by then a never-threaded
51
+ // widget is indistinguishable from one the enricher legitimately omits.
52
+ //
53
+ // FIX (operator option B): a PRE-ENRICHER gate that HARD-FAILS (naming the missing
54
+ // field) if any runMeta field required by the report-checklist's F4 table is absent
55
+ // BEFORE the enricher runs. The report-checklist (scripts/validate/report-checklist.yaml)
56
+ // is the SOURCE OF TRUTH for the required-field list — the F4 methodology rows.
57
+ //
58
+ // SCOPE — only the ORCHESTRATOR-THREADED F4 widgets are pre-enricher-required.
59
+ // `selectionRules` + `signalSelectionTrace` are ENRICHER-DERIVED (F1, deterministic);
60
+ // they are legitimately ABSENT before the enricher runs, so they are NOT gated here
61
+ // (gating them would hard-fail every correct run). See orchestrator-protocol.md §F4
62
+ // "Who computes" column.
63
+
64
+ /**
65
+ * The orchestrator-threaded F4 methodology widgets, each cross-referenced to the
66
+ * report-checklist section that requires it. This map is asserted against the
67
+ * checklist at gate time (checklist drift → loud failure), keeping the checklist
68
+ * the single source of truth for WHICH sections require these widgets.
69
+ *
70
+ * tierBreakdown → methodology-tier-pie (orchestrator assigns from the wave6 stamp)
71
+ * blindSpots → methodology-blind-spots (orchestrator assigns; present in BOTH the
72
+ * fresh-run and the prior-skip path — protocol §F2)
73
+ * awarenessSample → methodology-awareness (orchestrator assigns on a FRESH run; legitimately
74
+ * ABSENT under a documented awareness-skip exemption — see okEmpty)
75
+ */
76
+ const PRE_ENRICHER_F4_WIDGETS: ReadonlyArray<{
77
+ field: keyof RunMeta;
78
+ checklistSection: string;
79
+ /** True when this field may be legitimately absent under a documented exemption. */
80
+ exemptable: boolean;
81
+ }> = [
82
+ { field: "tierBreakdown", checklistSection: "methodology-tier-pie", exemptable: false },
83
+ { field: "blindSpots", checklistSection: "methodology-blind-spots", exemptable: false },
84
+ { field: "awarenessSample", checklistSection: "methodology-awareness", exemptable: true },
85
+ ] as const;
86
+
87
+ /** Minimal shape of the report-checklist rows this gate reads (section id only). */
88
+ interface ChecklistSectionRow {
89
+ section: string;
90
+ }
91
+
92
+ export interface PreEnricherRunMetaResult {
93
+ /** True when every required orchestrator-threaded F4 widget is threaded. */
94
+ pass: boolean;
95
+ /** Missing widget fields (with the checklist section that requires each). */
96
+ missing: string[];
97
+ }
98
+
99
+ /**
100
+ * True when a documented awareness-skip exemption is recorded in runMeta. The
101
+ * orchestrator records exemptions per protocol §Step-8.9 as
102
+ * `runMeta.exemptions: [{ stepId, reason, declaredBy }]`. A prior-based awareness
103
+ * SKIP (Step 4.5 library match) leaves `awarenessSample` undefined on purpose; the
104
+ * exemption entry is what makes that absence LEGITIMATE (mirrors the checklist
105
+ * `methodology-awareness` okEmpty: "awareness SKIPPED under documented exemption").
106
+ */
107
+ function hasAwarenessSkipExemption(runMeta: RunMeta): boolean {
108
+ const exemptions = (runMeta as Record<string, unknown>).exemptions;
109
+ if (!Array.isArray(exemptions)) return false;
110
+ return exemptions.some((e) => {
111
+ const stepId = (e as Record<string, unknown>)?.stepId;
112
+ return stepId === "awareness-sample" || stepId === "awareness";
113
+ });
114
+ }
115
+
116
+ /**
117
+ * Assert the F4 widget→section map against the loaded checklist. The checklist is
118
+ * the source of truth: if a section this gate relies on has been renamed/removed
119
+ * in report-checklist.yaml, FAIL LOUD rather than silently under-gate.
120
+ */
121
+ function assertChecklistCoversWidgets(checklist: ChecklistSectionRow[]): void {
122
+ const sections = new Set(checklist.map((r) => r.section));
123
+ const orphaned = PRE_ENRICHER_F4_WIDGETS.filter(
124
+ (w) => !sections.has(w.checklistSection)
125
+ );
126
+ if (orphaned.length > 0) {
127
+ throw new Error(
128
+ `pre-enricher-runMeta gate: report-checklist.yaml drift — the F4 section(s) ` +
129
+ `[${orphaned.map((w) => w.checklistSection).join(", ")}] referenced by this gate ` +
130
+ `are absent from the checklist. The checklist is the source of truth; reconcile ` +
131
+ `PRE_ENRICHER_F4_WIDGETS with report-checklist.yaml. Fail-loud (S4-orch).`
132
+ );
133
+ }
134
+ }
135
+
136
+ /**
137
+ * S4-orch: PRE-ENRICHER runMeta completeness gate. Runs over `findings.runMeta`
138
+ * BEFORE the Step-8.5 enricher. HARD-FAILS naming any orchestrator-threaded F4
139
+ * widget that was not threaded (the run-210635 regression class).
140
+ *
141
+ * @param runMeta - findings.runMeta as assembled by the orchestrator (pre-enrich)
142
+ * @param checklist - parsed report-checklist rows (source of truth for required sections)
143
+ *
144
+ * Pure function — same input, same output. No I/O (the CLI entrypoint reads files).
145
+ */
146
+ export function checkPreEnricherRunMeta(
147
+ runMeta: RunMeta | undefined,
148
+ checklist: ChecklistSectionRow[]
149
+ ): PreEnricherRunMetaResult {
150
+ assertChecklistCoversWidgets(checklist);
151
+
152
+ const missing: string[] = [];
153
+
154
+ // A wholly-absent runMeta means NOTHING threaded — the exact run-210635 failure.
155
+ if (!runMeta) {
156
+ for (const w of PRE_ENRICHER_F4_WIDGETS) {
157
+ // No runMeta ⇒ no exemption record either ⇒ even the exemptable field is missing.
158
+ missing.push(`runMeta.${String(w.field)} (required by checklist '${w.checklistSection}')`);
159
+ }
160
+ return { pass: false, missing };
161
+ }
162
+
163
+ const exemptAwareness = hasAwarenessSkipExemption(runMeta);
164
+
165
+ for (const w of PRE_ENRICHER_F4_WIDGETS) {
166
+ const value = (runMeta as Record<string, unknown>)[w.field as string];
167
+ const present = value !== undefined && value !== null;
168
+ if (present) continue;
169
+ if (w.exemptable && exemptAwareness) continue; // documented awareness-skip exemption
170
+ missing.push(
171
+ `runMeta.${String(w.field)} (required by checklist '${w.checklistSection}'` +
172
+ (w.exemptable ? " — no documented awareness-skip exemption found" : "") +
173
+ ")"
174
+ );
175
+ }
176
+
177
+ return { pass: missing.length === 0, missing };
178
+ }
179
+
180
+ /** Parse the report-checklist YAML into the minimal section rows this gate needs. */
181
+ export function parseChecklistSections(yamlText: string): ChecklistSectionRow[] {
182
+ const parsed = parseYaml(yamlText) as unknown;
183
+ if (!Array.isArray(parsed)) {
184
+ throw new Error("report-checklist.yaml: expected a top-level list of section rows.");
185
+ }
186
+ return parsed.map((raw, i): ChecklistSectionRow => {
187
+ const section = (raw as Record<string, unknown>)?.section;
188
+ if (typeof section !== "string" || section.trim() === "") {
189
+ throw new Error(`report-checklist.yaml[${i}]: missing/empty 'section' id.`);
190
+ }
191
+ return { section };
192
+ });
193
+ }
194
+
195
+ // ── Required RunMeta fields ───────────────────────────────────────────────────
196
+
197
+ /**
198
+ * The RunMeta fields required by W9-08. All are optional on the TypeScript type
199
+ * for backward-compat; the completeness check asserts them as required at runtime.
200
+ */
201
+ const REQUIRED_RUN_META_FIELDS: ReadonlyArray<keyof RunMeta> = [
202
+ "totalTraces",
203
+ "tier0ScannedCount",
204
+ "llmReadCount",
205
+ "scopeFilter",
206
+ "samplingStrategy",
207
+ "decisions",
208
+ "deepRead",
209
+ ] as const;
210
+
211
+ // ── W13-C (D-6): render-contract helpers ────────────────────────────────────────
212
+
213
+ /** The low|medium|high categorical scale shared by remedy cost/correctness. */
214
+ const COST_CORRECTNESS_VALUES: ReadonlySet<string> = new Set(["low", "medium", "high"]);
215
+
216
+ function isNonEmptyString(v: unknown): boolean {
217
+ return typeof v === "string" && v.trim() !== "";
218
+ }
219
+
220
+ /**
221
+ * W13-C (D-6): assert the renderer's exact per-finding + per-remedy dereference
222
+ * contract. Pushes one entry per gap so the gate fails-loud with ALL gaps at once.
223
+ */
224
+ function checkRenderContract(input: RenderInput, missing: string[]): void {
225
+ // Top-level: render does `input.sessionId.toUpperCase()` — must be a non-empty string.
226
+ if (!isNonEmptyString(input.sessionId)) {
227
+ missing.push("sessionId (render does sessionId.toUpperCase() — must be a non-empty string)");
228
+ }
229
+
230
+ input.findings.forEach((f, i) => {
231
+ const at = `findings[${i}]`;
232
+ // render does `f.actionable.slice(...)` in several panels — must be a string.
233
+ if (typeof f.actionable !== "string") {
234
+ missing.push(`${at}.actionable (render does actionable.slice() — must be a string)`);
235
+ }
236
+ // render dereferences both failureOrigin fields (severity badge + entity card).
237
+ const fo = (f.failureOrigin ?? {}) as unknown as Record<string, unknown>;
238
+ if (!isNonEmptyString(fo.evidence)) missing.push(`${at}.failureOrigin.evidence`);
239
+ if (!isNonEmptyString(fo.confidence)) missing.push(`${at}.failureOrigin.confidence`);
240
+
241
+ // Per-remedy D-1 header-badge triad: render interpolates rank/cost/correctness raw.
242
+ const remedies = Array.isArray(f.remedies) ? f.remedies : [];
243
+ remedies.forEach((r, j) => {
244
+ const rat = `${at}.remedies[${j}]`;
245
+ const rr = (r ?? {}) as unknown as Record<string, unknown>;
246
+ if (typeof rr.rank !== "number") {
247
+ missing.push(`${rat}.rank (render does RANK \${rank} — must be a number; enricher-derived)`);
248
+ }
249
+ if (!COST_CORRECTNESS_VALUES.has(rr.cost as string)) {
250
+ missing.push(`${rat}.cost (render does cost:\${cost} — must be low|medium|high)`);
251
+ }
252
+ if (!COST_CORRECTNESS_VALUES.has(rr.correctness as string)) {
253
+ missing.push(`${rat}.correctness (render does correct:\${correctness} — must be low|medium|high)`);
254
+ }
255
+ });
256
+ });
257
+ }
258
+
259
+ // ── checkCompleteness ─────────────────────────────────────────────────────────
260
+
261
+ /**
262
+ * W9-08 (R-CP-1..4): Deterministic completeness gate.
263
+ * Pure function — same input, same output every time.
264
+ *
265
+ * Empty-findings runs (findings.length === 0) are exempt from the finding-panel
266
+ * and section checks — a legitimate zero-finding run is always complete.
267
+ */
268
+ export function checkCompleteness(input: RenderInput): CompletenessResult {
269
+ const missing: string[] = [];
270
+
271
+ // ── RunMeta field presence ────────────────────────────────────────────────
272
+ // When runMeta is absent entirely: record all required fields as missing.
273
+ const runMeta = input.runMeta;
274
+ if (!runMeta) {
275
+ // Only flag as missing when there ARE findings — pre-W9 empty runs are exempt.
276
+ if (input.findings.length > 0) {
277
+ missing.push("runMeta (absent — required for runs with findings)");
278
+ REQUIRED_RUN_META_FIELDS.forEach((f) => missing.push(`runMeta.${f}`));
279
+ }
280
+ } else {
281
+ for (const field of REQUIRED_RUN_META_FIELDS) {
282
+ if ((runMeta as Record<string, unknown>)[field] === undefined) {
283
+ missing.push(`runMeta.${field}`);
284
+ }
285
+ }
286
+ }
287
+
288
+ // ── Section presence — only checked when there are findings ───────────────
289
+ if (input.findings.length > 0) {
290
+ // Entity card
291
+ if (!input.diagnosedEntity) {
292
+ missing.push("diagnosedEntity (entity card absent)");
293
+ }
294
+
295
+ // BigStat row (≥1 tile)
296
+ if (!input.bigStat || input.bigStat.length === 0) {
297
+ missing.push("bigStat (no tiles — Overview big-stat row empty)");
298
+ }
299
+
300
+ // Heatmap (at least 1 cell with count > 0 — an all-zero heatmap is a starved signal)
301
+ if (!input.hourlyHeatmap || input.hourlyHeatmap.cells.length === 0) {
302
+ missing.push("hourlyHeatmap.cells (heatmap absent)");
303
+ } else if (input.hourlyHeatmap.cells.every((c) => c.count === 0)) {
304
+ missing.push("hourlyHeatmap (all cells are zero — starved heatmap input)");
305
+ }
306
+
307
+ // Signal census (≥1 row)
308
+ if (!input.signalCensus || input.signalCensus.length === 0) {
309
+ missing.push("signalCensus (signal census absent)");
310
+ }
311
+
312
+ // ≥1 finding panel
313
+ if (input.findings.length < 1) {
314
+ // Redundant guard — kept explicit for clarity.
315
+ missing.push("findings (no findings present — expected ≥1 finding panel)");
316
+ }
317
+
318
+ // Methodology section (runMeta required for Methodology tab content)
319
+ if (!input.runMeta) {
320
+ missing.push("runMeta (Methodology tab requires runMeta)");
321
+ }
322
+
323
+ // Decisions section is always emitted by renderDecisionsTab — no content guard needed.
324
+
325
+ // W13-C (D-6): the renderer's exact dereference contract (sessionId + per-finding
326
+ // + per-remedy fields). Runs on findings-bearing runs — the render path that
327
+ // previously passed the gate yet crashed/garbled (the D-1 undefined badges).
328
+ checkRenderContract(input, missing);
329
+ }
330
+
331
+ return {
332
+ pass: missing.length === 0,
333
+ missing,
334
+ };
335
+ }
336
+
337
+ // ── CLI entrypoint ─────────────────────────────────────────────────────────────
338
+
339
+ if (import.meta.main) {
340
+ const { readFileSync } = await import("fs");
341
+ const { resolve, dirname, join } = await import("path");
342
+ const { fileURLToPath } = await import("url");
343
+
344
+ const argv = process.argv.slice(2);
345
+
346
+ // ── S4-orch: --pre-enricher mode (runs over findings.runMeta BEFORE the enricher) ──
347
+ if (argv[0] === "--pre-enricher") {
348
+ const flagIdx = (name: string): number => argv.indexOf(name);
349
+ const flagVal = (name: string): string | undefined => {
350
+ const i = flagIdx(name);
351
+ return i >= 0 ? argv[i + 1] : undefined;
352
+ };
353
+ const findingsPath = flagVal("--findings");
354
+ if (!findingsPath) {
355
+ process.stderr.write(
356
+ "Usage: bun scripts/validate/completeness-check.ts --pre-enricher --findings <findings.json> [--checklist <report-checklist.yaml>]\n" +
357
+ "\n" +
358
+ "S4-orch: PRE-ENRICHER runMeta gate. HARD-FAILS if any orchestrator-threaded\n" +
359
+ "F4 methodology widget (tierBreakdown / blindSpots / awarenessSample) is absent\n" +
360
+ "from findings.runMeta before the Step-8.5 enricher runs. Exit 0 = threaded,\n" +
361
+ "Exit 1 = missing widget(s) listed.\n"
362
+ );
363
+ process.exit(1);
364
+ }
365
+ const checklistPath =
366
+ flagVal("--checklist") ??
367
+ join(dirname(fileURLToPath(import.meta.url)), "report-checklist.yaml");
368
+
369
+ let runMeta: RunMeta | undefined;
370
+ let checklist: ChecklistSectionRow[];
371
+ try {
372
+ const findingsDoc = JSON.parse(readFileSync(resolve(findingsPath), "utf8")) as {
373
+ runMeta?: RunMeta;
374
+ };
375
+ runMeta = findingsDoc.runMeta;
376
+ checklist = parseChecklistSections(readFileSync(resolve(checklistPath), "utf8"));
377
+ } catch (err) {
378
+ process.stderr.write(`Error reading inputs: ${err}\n`);
379
+ process.exit(1);
380
+ }
381
+
382
+ const preResult = checkPreEnricherRunMeta(runMeta, checklist);
383
+ if (preResult.pass) {
384
+ process.stdout.write(
385
+ `[pre-enricher-runMeta] PASS — all orchestrator-threaded F4 widgets present.\n`
386
+ );
387
+ process.exit(0);
388
+ }
389
+ process.stderr.write(
390
+ `[pre-enricher-runMeta] FAIL — ${preResult.missing.length} unthreaded widget(s) ` +
391
+ `(orchestrator Step-8.5 threading regression — see protocol §F4):\n`
392
+ );
393
+ preResult.missing.forEach((m, i) => {
394
+ process.stderr.write(` ${i + 1}. ${m}\n`);
395
+ });
396
+ process.exit(1);
397
+ }
398
+
399
+ const inputPath = argv[0];
400
+
401
+ if (!inputPath) {
402
+ process.stderr.write(
403
+ "Usage: bun scripts/validate/completeness-check.ts <render-input.json>\n" +
404
+ " bun scripts/validate/completeness-check.ts --pre-enricher --findings <findings.json>\n" +
405
+ "\n" +
406
+ "Validates that a RenderInput has all required RunMeta fields and report\n" +
407
+ "sections populated. Exit 0 = complete, Exit 1 = missing fields listed.\n"
408
+ );
409
+ process.exit(1);
410
+ }
411
+
412
+ let input: RenderInput;
413
+ try {
414
+ input = JSON.parse(readFileSync(resolve(inputPath), "utf8")) as RenderInput;
415
+ } catch (err) {
416
+ process.stderr.write(`Error reading ${inputPath}: ${err}\n`);
417
+ process.exit(1);
418
+ }
419
+
420
+ const result = checkCompleteness(input);
421
+
422
+ if (result.pass) {
423
+ process.stdout.write(
424
+ `[completeness-check] PASS — all required fields and sections present.\n`
425
+ );
426
+ process.exit(0);
427
+ } else {
428
+ process.stderr.write(
429
+ `[completeness-check] FAIL — ${result.missing.length} missing field(s) / section(s):\n`
430
+ );
431
+ result.missing.forEach((m, i) => {
432
+ process.stderr.write(` ${i + 1}. ${m}\n`);
433
+ });
434
+ process.exit(1);
435
+ }
436
+ }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * scripts/validate/doc-refs.ts
3
+ * PRD-SO-02 — Doc-reference validator.
4
+ * Type A — Pure Script (file-system reads only; deterministic; no LLM).
5
+ *
6
+ * Greps SKILL.md and references/reference.md for `references/...` paths,
7
+ * then verifies each path exists as a real file under the skill root.
8
+ * Exits non-zero (fail-loud) if any cross-ref is broken.
9
+ *
10
+ * Usage (CLI):
11
+ * bun scripts/cli/run.sh scripts/validate/doc-refs.ts [--skill-root <path>]
12
+ *
13
+ * Exported function:
14
+ * validateDocRefs(skillRoot: string): DocRefsResult
15
+ */
16
+
17
+ import { existsSync, readFileSync } from "node:fs";
18
+ import { join, resolve, dirname } from "node:path";
19
+ import { fileURLToPath } from "node:url";
20
+
21
+ // ── Types ────────────────────────────────────────────────────────────────────
22
+
23
+ export interface BrokenRef {
24
+ /** The source file containing the reference (relative to skillRoot). */
25
+ sourceFile: string;
26
+ /** The referenced path as it appears in the source file. */
27
+ ref: string;
28
+ /** Absolute path that was checked (does not exist). */
29
+ resolvedPath: string;
30
+ }
31
+
32
+ export interface DocRefsResult {
33
+ ok: boolean;
34
+ scanned: string[];
35
+ checked: number;
36
+ broken: BrokenRef[];
37
+ }
38
+
39
+ // ── Regex patterns ────────────────────────────────────────────────────────────
40
+
41
+ /**
42
+ * The doc-subdir prefixes a cross-ref can be anchored on. `references/` is the
43
+ * skill-root-relative form; the others (`workflows/`, `agents/`, …) are the BARE
44
+ * forms reference.md's own mermaid DAG + tables use (relative to references/ or
45
+ * assets/). Matching only `references/` was a BLIND SPOT: a bare `workflows/foo.md`
46
+ * whose target was DELETED silently passed (the M9 drift). Glob tokens like
47
+ * `source-platforms/*.md` are naturally skipped — `*` is not in the path class.
48
+ */
49
+ const REF_PREFIXES = [
50
+ "references",
51
+ "workflows",
52
+ "agents",
53
+ "assets",
54
+ "source-platforms",
55
+ "target-platforms",
56
+ ] as const;
57
+
58
+ const REF_RE = new RegExp(
59
+ `((?:${REF_PREFIXES.join("|")})\\/[A-Za-z0-9_./-]+\\.md)`,
60
+ "g",
61
+ );
62
+
63
+ /** Candidate base dirs a captured ref may be relative to (checked in order). */
64
+ function candidateBases(skillRoot: string): string[] {
65
+ return [skillRoot, join(skillRoot, "references"), join(skillRoot, "assets")];
66
+ }
67
+
68
+ /**
69
+ * Resolve a captured ref to an EXISTING file under one of the candidate bases,
70
+ * or null if it resolves nowhere (a dangling link — the drift we must catch).
71
+ */
72
+ export function resolveRef(skillRoot: string, ref: string): string | null {
73
+ for (const base of candidateBases(skillRoot)) {
74
+ const p = join(base, ref);
75
+ if (existsSync(p)) return p;
76
+ }
77
+ return null;
78
+ }
79
+
80
+ // ── Core implementation ───────────────────────────────────────────────────────
81
+
82
+ /**
83
+ * Extract all doc cross-ref paths (any REF_PREFIXES-anchored `*.md`) from the
84
+ * given source text. Deduplicates results.
85
+ */
86
+ export function extractRefs(content: string): string[] {
87
+ const found = new Set<string>();
88
+ let m: RegExpExecArray | null;
89
+ const re = new RegExp(REF_RE.source, "g");
90
+ while ((m = re.exec(content)) !== null) {
91
+ found.add(m[1]);
92
+ }
93
+ return Array.from(found).sort();
94
+ }
95
+
96
+ /**
97
+ * PRD-SO-02 — validate every `references/...` cross-ref found in the source
98
+ * files against the skill root's actual filesystem.
99
+ *
100
+ * @param skillRoot Absolute path to the skill root (the dir containing SKILL.md).
101
+ */
102
+ export function validateDocRefs(skillRoot: string): DocRefsResult {
103
+ const abs = resolve(skillRoot);
104
+
105
+ // Source files to scan for cross-refs.
106
+ const sourceFiles = [
107
+ join(abs, "SKILL.md"),
108
+ join(abs, "references", "reference.md"),
109
+ ];
110
+
111
+ const scanned: string[] = [];
112
+ const broken: BrokenRef[] = [];
113
+ const allRefs: { sourceFile: string; ref: string }[] = [];
114
+
115
+ for (const srcPath of sourceFiles) {
116
+ const rel = srcPath.slice(abs.length + 1);
117
+ if (!existsSync(srcPath)) {
118
+ // Source file itself missing — that's a hard error.
119
+ broken.push({
120
+ sourceFile: rel,
121
+ ref: "<source file missing>",
122
+ resolvedPath: srcPath,
123
+ });
124
+ continue;
125
+ }
126
+ scanned.push(rel);
127
+ const content = readFileSync(srcPath, "utf-8");
128
+ const refs = extractRefs(content);
129
+ for (const ref of refs) {
130
+ allRefs.push({ sourceFile: rel, ref });
131
+ }
132
+ }
133
+
134
+ // Check each unique ref once (a ref may resolve under any candidate base:
135
+ // skillRoot, references/, or assets/ — a bare `workflows/foo.md` lives under
136
+ // references/, `agents/foo.md` under assets/). A ref that resolves NOWHERE is
137
+ // a dangling link (fail-loud).
138
+ const checkedRefs = new Set<string>();
139
+ for (const { sourceFile, ref } of allRefs) {
140
+ if (checkedRefs.has(ref)) continue;
141
+ checkedRefs.add(ref);
142
+ if (resolveRef(abs, ref) === null) {
143
+ broken.push({ sourceFile, ref, resolvedPath: join(abs, ref) });
144
+ }
145
+ }
146
+
147
+ return {
148
+ ok: broken.length === 0,
149
+ scanned,
150
+ checked: checkedRefs.size,
151
+ broken,
152
+ };
153
+ }
154
+
155
+ // ── CLI entrypoint ────────────────────────────────────────────────────────────
156
+
157
+ if (import.meta.main) {
158
+ // Resolve skill root from args or default to 2 levels up from this file's dir.
159
+ // This file lives at scripts/validate/doc-refs.ts; skill root is ../../
160
+ const args = process.argv.slice(2);
161
+ let skillRoot: string;
162
+
163
+ const rootArgIdx = args.indexOf("--skill-root");
164
+ if (rootArgIdx >= 0 && args[rootArgIdx + 1]) {
165
+ skillRoot = resolve(args[rootArgIdx + 1]);
166
+ } else {
167
+ // Default: climb up from scripts/validate/ to skill root.
168
+ const here = dirname(fileURLToPath(import.meta.url));
169
+ skillRoot = resolve(here, "..", "..");
170
+ }
171
+
172
+ const result = validateDocRefs(skillRoot);
173
+
174
+ console.info(`\ndoc-refs validator — skill root: ${skillRoot}`);
175
+ console.info(`Scanned: ${result.scanned.join(", ")}`);
176
+ console.info(`Refs checked: ${result.checked}`);
177
+
178
+ if (result.ok) {
179
+ console.info(`\nOK — all ${result.checked} cross-refs resolve.`);
180
+ process.exit(0);
181
+ } else {
182
+ console.error(`\nFAIL — ${result.broken.length} broken cross-ref(s):\n`);
183
+ for (const b of result.broken) {
184
+ console.error(` [${b.sourceFile}] ${b.ref}`);
185
+ console.error(` -> resolved: ${b.resolvedPath}`);
186
+ }
187
+ console.error(`\nFix: create the missing files or update the references in SKILL.md / references/reference.md.`);
188
+ process.exit(1);
189
+ }
190
+ }