@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,417 @@
1
+ /**
2
+ * scripts/validate/finalize-gate.ts
3
+ * W14 (F2) — OUTPUT-side finalization gate.
4
+ *
5
+ * The completeness-check (W9-08) gates the INPUT (`RenderInput` JSON) — the fields
6
+ * `render.ts` will dereference. THIS gate is the complement: it parses the RENDERED
7
+ * `report.html` and asserts, per section, that the data actually LANDED in the
8
+ * document. It catches the output-only bug class the input gate cannot see:
9
+ * - a soft render fallback shipped (`RANK n/a`, `cost:n/a`, `correct:n/a`);
10
+ * - a literal `undefined` / `null` / `NaN` reached the body;
11
+ * - a raw-JSON entity prompt (`{"prompt":`) instead of humanized prose;
12
+ * - a `class="internal"` node survived on an `audience=client` render (leak);
13
+ * - a `loud-missing-widget` marker (a forgotten-data tell) on an internal report.
14
+ *
15
+ * DETERMINISTIC ONLY (operator decision 2): DOM-free string/regex assertions. No LLM,
16
+ * no spend, runs every render. Pure function `runFinalizeGate` + CLI entrypoint.
17
+ *
18
+ * The checklist lives in `report-checklist.yaml` (F1) — one row per section, each
19
+ * carrying the `source` producer + `heal` action used by the orchestrator's bounded
20
+ * self-heal loop (Step 9.9). See references/script-index.md for the backtrace table.
21
+ *
22
+ * Type A — Pure Script (deterministic + no I/O except CLI file read).
23
+ */
24
+
25
+ import { parse as parseYaml } from "yaml";
26
+
27
+ // ── Public types ─────────────────────────────────────────────────────────────
28
+
29
+ /** Audience the report was rendered for. */
30
+ export type ReportAudience = "client" | "internal";
31
+
32
+ /** One section row of the declarative checklist (F1 schema). */
33
+ export interface ChecklistRow {
34
+ section: string;
35
+ require: string[];
36
+ forbid: string[];
37
+ tier: "CRIT" | "WARN";
38
+ /** When absence is LEGITIMATE — a human-readable condition string. */
39
+ okEmpty: string;
40
+ /** The producer/step to backtrace to (matches script-index.md). */
41
+ source: string;
42
+ /** The self-heal action to run when this row's data is missing. */
43
+ heal: string;
44
+ }
45
+
46
+ /** One gap found by the gate. */
47
+ export interface FinalizeGap {
48
+ section: string;
49
+ tier: "CRIT" | "WARN";
50
+ /** What is wrong (missing-require or forbidden-token, with the offending token). */
51
+ what: string;
52
+ /** The producer/step to backtrace to (from the row's `source`). */
53
+ sourceStep: string;
54
+ /** The self-heal action (from the row's `heal`). */
55
+ healAction: string;
56
+ }
57
+
58
+ /** Structured gate result. */
59
+ export interface FinalizeResult {
60
+ /** False when ≥1 CRIT gap. WARN gaps do NOT set pass=false. */
61
+ pass: boolean;
62
+ gaps: FinalizeGap[];
63
+ }
64
+
65
+ // ── Section region anchors ───────────────────────────────────────────────────
66
+ //
67
+ // Each per-section row is scoped to a region of the HTML, identified by an opening
68
+ // marker and (where helpful) a closing marker. Global rows scan the whole stripped
69
+ // body. Anchors are stable render.ts markers (verified against the renderers).
70
+
71
+ interface RegionAnchor {
72
+ /** Opening marker that begins the section's HTML. */
73
+ open: string;
74
+ /**
75
+ * Window length (chars) to scan from the open marker. Sections have nested
76
+ * <div>s, so a naive first-</div> close under-reads; a generous bounded window
77
+ * captures the whole block deterministically without an HTML parser. The window
78
+ * is capped so a require/forbid scan stays scoped to the section, not the whole doc.
79
+ */
80
+ window: number;
81
+ }
82
+
83
+ const SECTION_REGIONS: Readonly<Record<string, RegionAnchor>> = {
84
+ "entity-card": { open: '<div class="entity">', window: 4000 },
85
+ "big-stat": { open: '<div class="big-stat">', window: 2000 },
86
+ "deep-read-tile": { open: '<div class="deep-read-tile">', window: 2500 },
87
+ "signal-census": { open: "Signal / failure-mode", window: 2000 },
88
+ heatmap: { open: "timeline heatmap", window: 4000 },
89
+ funnel: { open: '<div class="funnel">', window: 2000 },
90
+ "finding-panel": { open: '<div class="taxonomy">', window: 1500 },
91
+ "remedy-card": { open: '<div class="remedy', window: 6000 },
92
+ "decisions-copyback": { open: '<section class="panel" id="tdecisions">', window: 4000 },
93
+ // Methodology sub-section rows are whole-tab scans: the loud-missing-widget
94
+ // marker carries its own data-widget attribute, so a body-wide scan is correct.
95
+ "methodology-tier-pie": { open: "<body", window: Number.MAX_SAFE_INTEGER },
96
+ "methodology-selection": { open: "<body", window: Number.MAX_SAFE_INTEGER },
97
+ "methodology-awareness": { open: "<body", window: Number.MAX_SAFE_INTEGER },
98
+ "methodology-blind-spots": { open: "<body", window: Number.MAX_SAFE_INTEGER },
99
+ };
100
+
101
+ /** Section ids that are whole-body global invariants (no region scoping). */
102
+ const GLOBAL_SECTIONS: ReadonlySet<string> = new Set([
103
+ "global-no-undefined",
104
+ "global-client-no-internal",
105
+ "global-remedy-triad",
106
+ ]);
107
+
108
+ // ── okEmpty evaluation ───────────────────────────────────────────────────────
109
+ //
110
+ // `okEmpty` is a human-readable condition string. The gate evaluates a small set of
111
+ // recognized predicates deterministically. The recognized predicates cover the
112
+ // legitimate-absence cases the operator enumerated; an unrecognized okEmpty string
113
+ // is treated as "never exempt" (fail-closed — we never silently skip a CRIT row).
114
+
115
+ interface GateContext {
116
+ /** Stripped body (code/pre/diff removed) — what require/forbid scan by default. */
117
+ strippedBody: string;
118
+ /** Raw HTML — used for structural presence checks (e.g. region existence). */
119
+ rawHtml: string;
120
+ audience: ReportAudience;
121
+ /** True when the report has zero finding panels (clean / zero-finding run). */
122
+ hasNoFindings: boolean;
123
+ /** True when this is a methodologyAudit / meta report (no runtime traces). */
124
+ methodologyAudit: boolean;
125
+ }
126
+
127
+ /**
128
+ * Decide whether a section's absence is legitimate (exempt from its checks).
129
+ * Fail-closed: only the explicitly-recognized conditions exempt; anything else
130
+ * (incl. `okEmpty: never`) means NOT exempt.
131
+ */
132
+ function isLegitimatelyEmpty(row: ChecklistRow, ctx: GateContext): boolean {
133
+ const cond = row.okEmpty.toLowerCase();
134
+ if (cond.startsWith("never")) return false;
135
+
136
+ // "no findings" / "0 findings" / "clean run" — exempt when there are no findings.
137
+ if ((cond.includes("no findings") || cond.includes("0 findings") || cond.includes("zero-finding") || cond.includes("clean run")) && ctx.hasNoFindings) {
138
+ return true;
139
+ }
140
+
141
+ // "audience=client" — the whole internal tab is stripped on a client render.
142
+ if (cond.includes("audience=client") && ctx.audience === "client") {
143
+ return true;
144
+ }
145
+
146
+ // "audience=internal" — internal reports legitimately carry internal nodes.
147
+ if (cond.includes("audience=internal") && ctx.audience === "internal") {
148
+ return true;
149
+ }
150
+
151
+ // "methodologyAudit" — meta/variance audits have no runtime traces.
152
+ if (cond.includes("methodologyaudit") && ctx.methodologyAudit) {
153
+ return true;
154
+ }
155
+
156
+ // "threaded" / "rendered" / "skipped" / "priors" / "absent" — these conditions
157
+ // describe a state that is self-evident from the absence of the loud marker the
158
+ // row forbids. For forbid-only rows (no `require`), the row passes naturally when
159
+ // the forbidden marker is absent; we do NOT pre-exempt them here so the forbid
160
+ // scan still runs (it is the actual check). Return false so the scan proceeds.
161
+ return false;
162
+ }
163
+
164
+ // ── HTML helpers (deterministic, DOM-free) ───────────────────────────────────
165
+
166
+ /**
167
+ * Strip the spans where a literal `undefined` / `null` / `NaN` / `{"prompt"` is
168
+ * LEGITIMATE content rather than a render bug, BEFORE the forbid scan runs:
169
+ * - <script>…</script> — ALL inline JS (the live-preview IIFE legitimately uses
170
+ * `null`, `undefined` checks; its syntax is gated separately by render-js-syntax.ts);
171
+ * - <pre>…</pre> + <code>…</code> — quoted evidence / diff / command samples;
172
+ * - the Before/After diff grid (.r-diff-grid).
173
+ * This is the "visible-body data" surface — what the operator reads, not machine slots.
174
+ */
175
+ function stripQuotedRegions(html: string): string {
176
+ return html
177
+ .replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, " ")
178
+ .replace(/<pre\b[^>]*>[\s\S]*?<\/pre>/gi, " ")
179
+ .replace(/<code\b[^>]*>[\s\S]*?<\/code>/gi, " ")
180
+ .replace(/<div class="r-diff-grid">[\s\S]*?<\/div>\s*<\/div>/gi, " ");
181
+ }
182
+
183
+ /**
184
+ * Extract a section region from the raw HTML by anchor: a bounded window starting at
185
+ * the open marker. Returns "" when the open marker is absent (= the whole section is
186
+ * missing). Bounded-window slicing is deterministic and needs no HTML parser; the
187
+ * window is sized per section to cover the block without bleeding into the next.
188
+ */
189
+ function extractRegion(rawHtml: string, anchor: RegionAnchor): string {
190
+ const start = rawHtml.indexOf(anchor.open);
191
+ if (start === -1) return "";
192
+ const end =
193
+ anchor.window === Number.MAX_SAFE_INTEGER
194
+ ? rawHtml.length
195
+ : Math.min(rawHtml.length, start + anchor.window);
196
+ return rawHtml.slice(start, end);
197
+ }
198
+
199
+ /** Count finding panels (taxonomy strips) — the zero-finding signal. */
200
+ function countFindingPanels(rawHtml: string): number {
201
+ const matches = rawHtml.match(/<div class="taxonomy">/g);
202
+ return matches ? matches.length : 0;
203
+ }
204
+
205
+ // ── Core evaluation ──────────────────────────────────────────────────────────
206
+
207
+ /**
208
+ * Run the finalize gate over a rendered HTML string.
209
+ *
210
+ * @param html the rendered report.html contents
211
+ * @param audience the audience the report was rendered for
212
+ * @param checklist the parsed F1 checklist rows
213
+ */
214
+ export function runFinalizeGate(
215
+ html: string,
216
+ audience: ReportAudience,
217
+ checklist: ChecklistRow[]
218
+ ): FinalizeResult {
219
+ const hasNoFindings = countFindingPanels(html) === 0;
220
+ // methodologyAudit reports carry the forced self-diagnosis banner (PR-022).
221
+ const methodologyAudit = html.includes("SELF-DIAGNOSIS — analyzing the diagnostics skill itself");
222
+
223
+ const ctx: GateContext = {
224
+ strippedBody: stripQuotedRegions(html),
225
+ rawHtml: html,
226
+ audience,
227
+ hasNoFindings,
228
+ methodologyAudit,
229
+ };
230
+
231
+ const gaps: FinalizeGap[] = [];
232
+
233
+ for (const row of checklist) {
234
+ if (isLegitimatelyEmpty(row, ctx)) continue;
235
+
236
+ // Choose the scan surface for this row.
237
+ const isGlobal = GLOBAL_SECTIONS.has(row.section);
238
+ const region = isGlobal ? "" : SECTION_REGIONS[row.section] ? extractRegion(html, SECTION_REGIONS[row.section]!) : "";
239
+
240
+ // require[]: each token must be PRESENT in the section region.
241
+ // (Global rows have no require tokens — their work is the forbid scan.)
242
+ if (!isGlobal && row.require.length > 0) {
243
+ // If the region is entirely absent AND not legitimately empty → the whole
244
+ // section is missing. Report ONE gap for the section (not one per token).
245
+ if (region === "") {
246
+ gaps.push({
247
+ section: row.section,
248
+ tier: row.tier,
249
+ what: `section absent — none of its render markers were emitted (${row.require.join(", ")})`,
250
+ sourceStep: row.source,
251
+ healAction: row.heal,
252
+ });
253
+ } else {
254
+ for (const token of row.require) {
255
+ if (!region.includes(token)) {
256
+ gaps.push({
257
+ section: row.section,
258
+ tier: row.tier,
259
+ what: `required marker missing: ${JSON.stringify(token)}`,
260
+ sourceStep: row.source,
261
+ healAction: row.heal,
262
+ });
263
+ }
264
+ }
265
+ }
266
+ }
267
+
268
+ // forbid[]: each token must be ABSENT from the scan surface.
269
+ if (row.forbid.length > 0) {
270
+ // Global rows scan the stripped whole body; per-section rows scan their region.
271
+ // The internal-leak row is structural (class attributes), so it scans the RAW
272
+ // body — stripping would not hide an internal node, and we must catch it intact.
273
+ const surface = isGlobal
274
+ ? row.section === "global-client-no-internal"
275
+ ? html
276
+ : ctx.strippedBody
277
+ : stripQuotedRegions(region === "" ? html : region);
278
+
279
+ for (const token of row.forbid) {
280
+ if (surface.includes(token)) {
281
+ gaps.push({
282
+ section: row.section,
283
+ tier: row.tier,
284
+ what: `forbidden token present: ${JSON.stringify(token)}`,
285
+ sourceStep: row.source,
286
+ healAction: row.heal,
287
+ });
288
+ }
289
+ }
290
+ }
291
+ }
292
+
293
+ const pass = !gaps.some((g) => g.tier === "CRIT");
294
+ return { pass, gaps };
295
+ }
296
+
297
+ // ── Checklist loading ────────────────────────────────────────────────────────
298
+
299
+ /** Parse + lightly validate the F1 checklist YAML into typed rows. */
300
+ export function parseChecklist(yamlText: string): ChecklistRow[] {
301
+ const parsed = parseYaml(yamlText) as unknown;
302
+ if (!Array.isArray(parsed)) {
303
+ throw new Error("report-checklist.yaml: expected a top-level list of section rows.");
304
+ }
305
+ return parsed.map((raw, i): ChecklistRow => {
306
+ const r = (raw ?? {}) as Record<string, unknown>;
307
+ const section = r.section;
308
+ if (typeof section !== "string" || section.trim() === "") {
309
+ throw new Error(`report-checklist.yaml[${i}]: missing/empty 'section' id.`);
310
+ }
311
+ const tier = r.tier;
312
+ if (tier !== "CRIT" && tier !== "WARN") {
313
+ throw new Error(`report-checklist.yaml[${i}] (${section}): 'tier' must be CRIT or WARN.`);
314
+ }
315
+ const asStringArray = (v: unknown): string[] =>
316
+ Array.isArray(v) ? v.map((x) => String(x)) : [];
317
+ return {
318
+ section,
319
+ require: asStringArray(r.require),
320
+ forbid: asStringArray(r.forbid),
321
+ tier,
322
+ okEmpty: typeof r.okEmpty === "string" ? r.okEmpty : "never",
323
+ source: typeof r.source === "string" ? r.source : "(unspecified)",
324
+ heal: typeof r.heal === "string" ? r.heal : "(unspecified)",
325
+ };
326
+ });
327
+ }
328
+
329
+ // ── CLI entrypoint ───────────────────────────────────────────────────────────
330
+
331
+ if (import.meta.main) {
332
+ const { readFileSync } = await import("fs");
333
+ const { resolve, dirname, join } = await import("path");
334
+ const { fileURLToPath } = await import("url");
335
+
336
+ const argv = process.argv.slice(2);
337
+
338
+ function readFlag(name: string): string | undefined {
339
+ const i = argv.indexOf(name);
340
+ return i !== -1 && i + 1 < argv.length ? argv[i + 1] : undefined;
341
+ }
342
+
343
+ const reportPath = readFlag("--report");
344
+ const audienceArg = (readFlag("--audience") ?? "client") as ReportAudience;
345
+ const checklistPath =
346
+ readFlag("--checklist") ??
347
+ join(dirname(fileURLToPath(import.meta.url)), "report-checklist.yaml");
348
+
349
+ if (!reportPath) {
350
+ process.stderr.write(
351
+ "Usage: bun scripts/validate/finalize-gate.ts --report <report.html> --audience <client|internal> [--checklist <path>]\n" +
352
+ "\n" +
353
+ "OUTPUT-side finalization gate: parses the rendered report.html and asserts every\n" +
354
+ "section's data landed (no RANK n/a, no undefined, no internal-leak on client).\n" +
355
+ "Exit 0 = CRIT-clean (may carry WARN gaps), Exit 1 = ≥1 CRIT gap.\n"
356
+ );
357
+ process.exit(1);
358
+ }
359
+
360
+ if (audienceArg !== "client" && audienceArg !== "internal") {
361
+ process.stderr.write(`[finalize-gate] invalid --audience '${audienceArg}' (expected client|internal)\n`);
362
+ process.exit(1);
363
+ }
364
+
365
+ let html: string;
366
+ let checklistText: string;
367
+ try {
368
+ html = readFileSync(resolve(reportPath), "utf8");
369
+ } catch (err) {
370
+ process.stderr.write(`[finalize-gate] cannot read report ${reportPath}: ${err}\n`);
371
+ process.exit(1);
372
+ }
373
+ try {
374
+ checklistText = readFileSync(resolve(checklistPath), "utf8");
375
+ } catch (err) {
376
+ process.stderr.write(`[finalize-gate] cannot read checklist ${checklistPath}: ${err}\n`);
377
+ process.exit(1);
378
+ }
379
+
380
+ const checklist = parseChecklist(checklistText);
381
+ const result = runFinalizeGate(html, audienceArg, checklist);
382
+
383
+ const crit = result.gaps.filter((g) => g.tier === "CRIT");
384
+ const warn = result.gaps.filter((g) => g.tier === "WARN");
385
+
386
+ if (result.pass && warn.length === 0) {
387
+ process.stdout.write(`[finalize-gate] PASS — report is CRIT-clean with no WARN gaps. Audience: ${audienceArg}.\n`);
388
+ process.exit(0);
389
+ }
390
+
391
+ // Emit a machine-grep-able structured block so the orchestrator's Step 9.9 loop
392
+ // can backtrace each gap by its sourceStep.
393
+ process.stdout.write(`[finalize-gate] result: pass=${result.pass} crit=${crit.length} warn=${warn.length} audience=${audienceArg}\n`);
394
+ const emit = (g: FinalizeGap): void => {
395
+ process.stdout.write(
396
+ ` [${g.tier}] section=${g.section}\n` +
397
+ ` what: ${g.what}\n` +
398
+ ` source: ${g.sourceStep}\n` +
399
+ ` heal: ${g.healAction}\n`
400
+ );
401
+ };
402
+ crit.forEach(emit);
403
+ warn.forEach(emit);
404
+
405
+ if (!result.pass) {
406
+ process.stderr.write(
407
+ `[finalize-gate] FAIL — ${crit.length} CRIT gap(s) block "report done". Backtrace each via its source (script-index.md) and self-heal (Step 9.9).\n`
408
+ );
409
+ process.exit(1);
410
+ }
411
+
412
+ // CRIT-clean but WARN gaps present: emit with the incomplete banner note, exit 0.
413
+ process.stdout.write(
414
+ `[finalize-gate] PASS-WITH-WARN — CRIT-clean; ${warn.length} WARN gap(s). Stamp "⚠ incomplete: ${warn.map((g) => g.section).join(", ")}" and report as "rendered with ${warn.length} gaps".\n`
415
+ );
416
+ process.exit(0);
417
+ }