@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,477 @@
1
+ /**
2
+ * scripts/test/render-playwright.cli.ts
3
+ *
4
+ * ON-DEMAND CLI — NOT a `bun test` file (renamed off the `*.test.ts` glob so it no
5
+ * longer registers as a 0-assertion no-op that reports false coverage on every commit).
6
+ * The per-commit render contract is covered browser-free by:
7
+ * • report/render.test.ts — real report.html.tpl renders copy-decisions + tab
8
+ * wiring + inline-<script> JS-parse gate (new Function).
9
+ * • validate/render-js-syntax.test.ts — the JS-parse gate itself.
10
+ * • validate/finalize-gate.test.ts — per-section completeness over the real template.
11
+ * This CLI adds the OPT-IN real-DOM layer (Playwright: click every tab, assert zero
12
+ * console.error, mermaid SVG dimensions, font-floor) — run it in a gated lane, never bun test.
13
+ *
14
+ * Phase 3-B acceptance test (hardened v2 — I-024/I-041 fix):
15
+ * 1. Structural validation (FU-INT-1 NODE-STRIP, placeholder check)
16
+ * 2. Playwright headless: click every tab, assert zero console.error
17
+ * 3. Mermaid SVG assertion (internal build only):
18
+ * - Wait for CDN to load (networkidle)
19
+ * - Click Methodology + Trajectory tabs
20
+ * - Assert <svg> exists with width>20 && height>20 (catches #333 throw AND 16×16 hidden bug)
21
+ *
22
+ * Usage: bash scripts/cli/run.sh scripts/test/render-playwright.test.ts <client.html> <internal.html>
23
+ *
24
+ * HARDENING NOTE: previously the test used file:// URLs and didn't wait for CDN,
25
+ * so `typeof mermaid !== 'undefined'` was false → mermaid.initialize was skipped →
26
+ * no console.error (false pass) but also no diagrams. Now uses networkidle wait
27
+ * to guarantee CDN load; asserts SVG dimensions > 20×20 to catch both:
28
+ * (a) mermaid#333 init throw (diagrams never render)
29
+ * (b) §8 hidden-panel 16×16 bug (wrong dimensions)
30
+ *
31
+ * §8 note: R-014-A pattern — invoke via run.sh, not node directly.
32
+ * bun test discovery: zero-arg mode is a no-op (no process.exit).
33
+ */
34
+
35
+ import { existsSync, readFileSync } from "fs";
36
+ import { resolve } from "path";
37
+ import { execFileSync, execSync } from "child_process";
38
+
39
+ // ── Module-level: no side-effects (safe for bun test discovery) ──────────────
40
+ // All CLI code is at module bottom — zero args = no-op, bun test sees 0 tests, exits 0.
41
+
42
+ // ── Playwright detection ──────────────────────────────────────────────────────
43
+
44
+ function hasPlaywright(): boolean {
45
+ try {
46
+ execSync("bunx playwright --version", { stdio: "pipe", timeout: 8000 });
47
+ return true;
48
+ } catch {
49
+ return false;
50
+ }
51
+ }
52
+
53
+ // ── Structural validation (fast, no browser) ──────────────────────────────────
54
+
55
+ function structuralValidation(filePath: string, audience: "client" | "internal"): string[] {
56
+ const errors: string[] = [];
57
+ const html = readFileSync(filePath, "utf8");
58
+
59
+ if (!html.includes("<title>")) errors.push("Missing <title>");
60
+ if (!html.includes("MUTAGENT")) errors.push("Missing MUTAGENT logotype");
61
+
62
+ // FU-INT-1: NODE-STRIP check
63
+ if (audience === "client") {
64
+ if (html.includes('class="internal"')) {
65
+ errors.push('class="internal" found in client build — NODE-STRIP violated');
66
+ }
67
+ if (html.includes("internal-banner")) {
68
+ errors.push("internal-banner string found in client build — NODE-STRIP violated");
69
+ }
70
+ } else {
71
+ if (!html.includes('class="internal"')) {
72
+ errors.push('class="internal" NOT found in internal build — expected on tab buttons');
73
+ }
74
+ // Internal build must have mermaid CDN script
75
+ if (!html.includes("cdn.jsdelivr.net/npm/mermaid")) {
76
+ errors.push("Mermaid CDN script missing from internal build");
77
+ }
78
+ // Internal build must use theme:'base' (not theme:'dark' which causes #333 error)
79
+ if (html.includes("theme:'dark'") || html.includes('theme:"dark"')) {
80
+ errors.push("mermaid theme:'dark' found — must use theme:'base' to avoid #333 color parse error");
81
+ }
82
+ }
83
+
84
+ // t0 Overview panel
85
+ if (!html.includes('id="t0"')) errors.push('Missing id="t0" (Overview panel)');
86
+
87
+ // No unreplaced placeholders
88
+ if (html.match(/\{\{[A-Z_]+\}\}/)) {
89
+ errors.push("Unreplaced {{PLACEHOLDER}} found in rendered HTML");
90
+ }
91
+
92
+ // Copy-decisions button
93
+ if (!html.includes('id="copy-decisions"')) errors.push('Missing id="copy-decisions" button');
94
+
95
+ return errors;
96
+ }
97
+
98
+ // ── Font-floor check (E5/E6 status-acuity) ────────────────────────────────────
99
+ // Walks ALL elements that carry their OWN direct text (not just children) and
100
+ // computes the MINIMUM getComputedStyle(el).fontSize over visible text. Asserts
101
+ // min ≥ 11px. Any sub-11px rendered text → a failure string per offending node.
102
+ // Skips display:none / zero-box elements so it only measures what an operator sees.
103
+ const FONT_FLOOR_PX = 11;
104
+
105
+ async function fontFloorCheck(
106
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
+ page: any,
108
+ build: string
109
+ ): Promise<{ min: number; failures: string[] }> {
110
+ // Runs in the browser context — returns the global min + offending nodes.
111
+ const result = (await page.evaluate(`
112
+ (function() {
113
+ var FLOOR = ${FONT_FLOOR_PX};
114
+ var min = Infinity;
115
+ var bad = [];
116
+ var els = document.querySelectorAll('body *');
117
+ for (var i = 0; i < els.length; i++) {
118
+ var el = els[i];
119
+ // Only consider elements with their OWN non-empty direct text.
120
+ var hasOwnText = false;
121
+ for (var n = 0; n < el.childNodes.length; n++) {
122
+ var node = el.childNodes[n];
123
+ if (node.nodeType === 3 && node.textContent && node.textContent.trim().length > 0) {
124
+ hasOwnText = true;
125
+ break;
126
+ }
127
+ }
128
+ if (!hasOwnText) continue;
129
+ var cs = window.getComputedStyle(el);
130
+ if (cs.display === 'none' || cs.visibility === 'hidden') continue;
131
+ var rect = el.getBoundingClientRect();
132
+ if (rect.width <= 0 || rect.height <= 0) continue; // zero-box → not painted
133
+ var fs = parseFloat(cs.fontSize);
134
+ if (!isFinite(fs)) continue;
135
+ if (fs < min) min = fs;
136
+ if (fs < FLOOR) {
137
+ var sel = el.tagName.toLowerCase();
138
+ if (el.className && typeof el.className === 'string') {
139
+ sel += '.' + el.className.trim().split(/\\s+/).join('.');
140
+ }
141
+ bad.push(fs + 'px on ' + sel);
142
+ }
143
+ }
144
+ return { min: (min === Infinity ? -1 : min), bad: bad };
145
+ })();
146
+ `)) as { min: number; bad: string[] };
147
+
148
+ const failures = result.bad.map((b) => `[${build}] sub-11px font: ${b}`);
149
+ return { min: result.min, failures };
150
+ }
151
+
152
+ // ── Playwright headless validation ────────────────────────────────────────────
153
+
154
+ async function playwrightValidation(
155
+ clientFile: string,
156
+ internalFile: string
157
+ ): Promise<{ passed: boolean; log: string[] }> {
158
+ const log: string[] = [];
159
+
160
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
161
+ let playwright: any = null;
162
+ try {
163
+ playwright = await import("playwright");
164
+ } catch {
165
+ try {
166
+ const v = execFileSync("bunx", ["playwright", "--version"], {
167
+ encoding: "utf8", stdio: ["pipe", "pipe", "pipe"], timeout: 8000,
168
+ });
169
+ log.push(`Playwright available via bunx: ${v.trim()} — cannot import directly`);
170
+ } catch {
171
+ log.push("Playwright not importable — structural validation only");
172
+ }
173
+ return { passed: true, log }; // not a hard failure — structural covers the rest
174
+ }
175
+
176
+ const chromium = playwright.chromium;
177
+ const browser = await chromium.launch({ headless: true });
178
+ const allFailures: string[] = [];
179
+
180
+ // ── Client build ────────────────────────────────────────────────────────────
181
+ {
182
+ const page = await browser.newPage();
183
+ const consoleErrors: string[] = [];
184
+ page.on("console", (msg: { type: () => string; text: () => string }) => {
185
+ if (msg.type() === "error") consoleErrors.push(msg.text());
186
+ });
187
+
188
+ await page.goto(`file://${clientFile}`, { waitUntil: "networkidle", timeout: 25000 });
189
+
190
+ const tabs = await page.$$('.tabs button');
191
+ log.push(`[client] Found ${tabs.length} tab button(s)`);
192
+ for (const btn of tabs) {
193
+ try { await btn.click({ timeout: 2000 }); await page.waitForTimeout(100); } catch { /* skip */ }
194
+ }
195
+
196
+ if (consoleErrors.length > 0) {
197
+ consoleErrors.forEach((e) => allFailures.push(`[client] console.error: ${e}`));
198
+ } else {
199
+ log.push("[client] zero console.error ✓");
200
+ }
201
+
202
+ // E5/E6 font-floor: min rendered text ≥ 11px
203
+ const ff = await fontFloorCheck(page, "client");
204
+ log.push(`[client] min computed font: ${ff.min}px`);
205
+ if (ff.failures.length > 0) {
206
+ ff.failures.forEach((f) => allFailures.push(f));
207
+ } else {
208
+ log.push("[client] font-floor ≥11px ✓");
209
+ }
210
+
211
+ await page.close();
212
+ }
213
+
214
+ // ── Internal build ──────────────────────────────────────────────────────────
215
+ {
216
+ const page = await browser.newPage();
217
+ const consoleErrors: string[] = [];
218
+ page.on("console", (msg: { type: () => string; text: () => string }) => {
219
+ if (msg.type() === "error") consoleErrors.push(msg.text());
220
+ });
221
+
222
+ await page.goto(`file://${internalFile}`, { waitUntil: "networkidle", timeout: 30000 });
223
+
224
+ const tabs = await page.$$('.tabs button');
225
+ log.push(`[internal] Found ${tabs.length} tab button(s)`);
226
+ for (const btn of tabs) {
227
+ try { await btn.click({ timeout: 2000 }); await page.waitForTimeout(100); } catch { /* skip */ }
228
+ }
229
+
230
+ if (consoleErrors.length > 0) {
231
+ consoleErrors.forEach((e) => allFailures.push(`[internal] console.error: ${e}`));
232
+ } else {
233
+ log.push("[internal] zero console.error ✓");
234
+ }
235
+
236
+ // E5/E6 font-floor: min rendered text ≥ 11px (measured BEFORE mermaid inject so
237
+ // injected SVG <text> doesn't pollute the report's own-CSS measurement).
238
+ {
239
+ const ff = await fontFloorCheck(page, "internal");
240
+ log.push(`[internal] min computed font: ${ff.min}px`);
241
+ if (ff.failures.length > 0) {
242
+ ff.failures.forEach((f) => allFailures.push(f));
243
+ } else {
244
+ log.push("[internal] font-floor ≥11px ✓");
245
+ }
246
+ }
247
+
248
+ // ── Mermaid SVG assertion (I-024/I-041) ────────────────────────────────
249
+ // Use page.addScriptTag({url}) to force-inject mermaid regardless of file:// CDN restrictions.
250
+ // Initialize with theme:'base' (same config as the renderer) via page.evaluate string
251
+ // form (avoids TypeScript browser-global issues — string evals in browser context).
252
+ let mermaidAvailable = false;
253
+ try {
254
+ await page.addScriptTag({ url: "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js" });
255
+ await page.evaluate(`
256
+ mermaid.initialize({
257
+ startOnLoad: false, theme: 'base',
258
+ themeVariables: {
259
+ primaryColor: '#1c1c2a', primaryBorderColor: '#a78bfa',
260
+ primaryTextColor: '#f5f5f9', secondaryColor: '#12121b',
261
+ tertiaryColor: '#181824', background: '#0a0a10',
262
+ mainBkg: '#1c1c2a', nodeBorder: '#a78bfa',
263
+ lineColor: '#707088', textColor: '#f5f5f9',
264
+ edgeLabelBackground: '#14141e', clusterBkg: '#12121b',
265
+ fontFamily: "'IBM Plex Mono', monospace", fontSize: '13px'
266
+ }
267
+ });
268
+ `);
269
+ mermaidAvailable = true;
270
+ log.push("[internal] mermaid injected + initialized (theme:'base') ✓");
271
+ } catch (injectErr) {
272
+ log.push(`[internal] WARN: mermaid inject failed (CDN blocked?) — SVG assertions SKIPPED`);
273
+ log.push(`[internal] Structural check confirmed theme:'base' present — #333 color parse defect absent`);
274
+ log.push(`[internal] inject error: ${injectErr}`);
275
+ }
276
+
277
+ if (mermaidAvailable) {
278
+ for (const [tabSel, panelId, findingId] of [
279
+ ['button[data-tab="tmeth"]', "tmeth", "I-024 Methodology"],
280
+ ['button[data-tab="ttraj"]', "ttraj", "I-041 Trajectory"],
281
+ ] as const) {
282
+ const tabBtn = page.locator(tabSel);
283
+ if ((await tabBtn.count()) === 0) continue;
284
+
285
+ await tabBtn.click();
286
+ await page.waitForTimeout(200);
287
+
288
+ // Only assert SVG when panel actually has .mermaid elements
289
+ // (panels without mermaid data show "No diagram available" text, not SVG)
290
+ const hasMermaidEl = (await page.locator(`#${panelId} .mermaid`).count()) > 0;
291
+ if (!hasMermaidEl) {
292
+ log.push(`[internal] ${findingId}: no .mermaid elements — fixture has no diagram data, SVG assertion skipped`);
293
+ continue;
294
+ }
295
+
296
+ // Trigger mermaid.run() and AWAIT its promise (mermaid.run returns Promise)
297
+ await page.evaluate(`
298
+ (function() {
299
+ var panel = document.getElementById("${panelId}");
300
+ if (!panel) return Promise.resolve();
301
+ var nodes = Array.from(panel.querySelectorAll(".mermaid"));
302
+ return nodes.length ? mermaid.run({ nodes: nodes }) : Promise.resolve();
303
+ })();
304
+ `);
305
+
306
+ try {
307
+ const svgLocator = page.locator(`section#${panelId} svg`).first();
308
+ await svgLocator.waitFor({ state: "visible", timeout: 6000 });
309
+ const box = await svgLocator.boundingBox();
310
+ const w = box ? Math.round(box.width) : 0;
311
+ const h = box ? Math.round(box.height) : 0;
312
+ log.push(`[internal] ${findingId} SVG: ${w}×${h}`);
313
+ if (!box || w <= 20 || h <= 20) {
314
+ allFailures.push(`[internal] ${findingId} SVG too small (${w}×${h}) — §8 hidden-panel bug (16×16)`);
315
+ } else {
316
+ log.push(`[internal] ${findingId} SVG dimensions OK ✓`);
317
+ }
318
+ } catch {
319
+ allFailures.push(`[internal] ${findingId} SVG did not appear within 6s — mermaid.run() may have thrown`);
320
+ }
321
+ }
322
+ }
323
+
324
+ await page.close();
325
+ }
326
+
327
+ await browser.close();
328
+
329
+ if (allFailures.length > 0) {
330
+ log.push("FAIL:");
331
+ allFailures.forEach((f) => log.push(` ${f}`));
332
+ return { passed: false, log };
333
+ }
334
+
335
+ log.push("PASS — zero console.error + mermaid SVG OK");
336
+ return { passed: true, log };
337
+ }
338
+
339
+ // ── Internal-only playwright pass (font-floor) ────────────────────────────────
340
+ // Used by single-file mode: launch headless, load the internal report, assert the
341
+ // E5/E6 font-floor. Mermaid SVG assertion is two-build-only; here we just need the
342
+ // computed-font proof. No-op (passes) if playwright isn't importable.
343
+ async function internalFontFloorPass(
344
+ internalFile: string
345
+ ): Promise<{ passed: boolean; log: string[] }> {
346
+ const log: string[] = [];
347
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
348
+ let playwright: any = null;
349
+ try {
350
+ playwright = await import("playwright");
351
+ } catch {
352
+ log.push("Playwright not importable — font-floor pass skipped (structural only)");
353
+ return { passed: true, log };
354
+ }
355
+ const browser = await playwright.chromium.launch({ headless: true });
356
+ const page = await browser.newPage();
357
+ await page.goto(`file://${internalFile}`, { waitUntil: "networkidle", timeout: 30000 });
358
+ const ff = await fontFloorCheck(page, "internal");
359
+ log.push(`[internal] min computed font: ${ff.min}px`);
360
+ await page.close();
361
+ await browser.close();
362
+ if (ff.failures.length > 0) {
363
+ log.push("FAIL:");
364
+ ff.failures.forEach((f) => log.push(` ${f}`));
365
+ return { passed: false, log };
366
+ }
367
+ log.push("[internal] font-floor ≥11px ✓");
368
+ return { passed: true, log };
369
+ }
370
+
371
+ // ── Main ──────────────────────────────────────────────────────────────────────
372
+
373
+ async function main(clientFile: string, internalFile: string) {
374
+ process.stdout.write(`[render-playwright] Testing:\n client: ${clientFile}\n internal: ${internalFile}\n\n`);
375
+
376
+ const allErrors: string[] = [];
377
+
378
+ // 1. Structural validation
379
+ process.stdout.write("=== Structural validation ===\n");
380
+ const clientErrs = structuralValidation(clientFile, "client");
381
+ const internalErrs = structuralValidation(internalFile, "internal");
382
+
383
+ for (const [label, errs] of [["client", clientErrs], ["internal", internalErrs]] as const) {
384
+ if (errs.length === 0) {
385
+ process.stdout.write(` [${label}] PASS\n`);
386
+ } else {
387
+ errs.forEach((e) => process.stdout.write(` [${label}] FAIL: ${e}\n`));
388
+ allErrors.push(...errs.map((e) => `[${label}] ${e}`));
389
+ }
390
+ }
391
+
392
+ // 2. Playwright headless + mermaid SVG assertion
393
+ if (hasPlaywright()) {
394
+ process.stdout.write("\n=== Playwright headless (tab-click + console.error + mermaid SVG) ===\n");
395
+ const { passed, log } = await playwrightValidation(clientFile, internalFile);
396
+ log.forEach((l) => process.stdout.write(` ${l}\n`));
397
+ if (!passed) {
398
+ allErrors.push("Playwright headless check failed — see log above");
399
+ }
400
+ } else {
401
+ process.stdout.write("\n=== Playwright SKIPPED (not available) — structural covers FU-INT-1 + #333 ===\n");
402
+ }
403
+
404
+ process.stdout.write("\n");
405
+ if (allErrors.length === 0) {
406
+ process.stdout.write("✅ render-playwright.test: PASS\n");
407
+ process.exit(0);
408
+ } else {
409
+ process.stdout.write("❌ render-playwright.test: FAIL\n");
410
+ allErrors.forEach((e) => process.stdout.write(` • ${e}\n`));
411
+ process.exit(1);
412
+ }
413
+ }
414
+
415
+ // ── CLI entrypoint (zero-arg = bun test discovery no-op) ─────────────────────
416
+ const cliArgs = process.argv.slice(2).filter((a) => !a.startsWith("--"));
417
+
418
+ if (cliArgs.length === 0) {
419
+ // bun test discovery mode: no-op, bun sees 0 tests, exits 0.
420
+ } else if (cliArgs.length === 1) {
421
+ // iter-4 single-file mode: internal-only structural + playwright check (skip client checks)
422
+ // Usage: bash scripts/cli/run.sh scripts/test/render-playwright.test.ts <internal.html>
423
+ const cliInternalPath = resolve(cliArgs[0]);
424
+ if (!existsSync(cliInternalPath)) {
425
+ process.stderr.write(`ERROR: file not found: ${cliInternalPath}\n`);
426
+ process.exit(1);
427
+ }
428
+ process.stdout.write(`[render-playwright] Testing (internal-only):\n internal: ${cliInternalPath}\n\n`);
429
+ (async () => {
430
+ const allErrors: string[] = [];
431
+ process.stdout.write("=== Structural validation ===\n");
432
+ const errs = structuralValidation(cliInternalPath, "internal");
433
+ if (errs.length === 0) {
434
+ process.stdout.write(" [internal] PASS\n");
435
+ } else {
436
+ errs.forEach((e) => process.stdout.write(` [internal] FAIL: ${e}\n`));
437
+ allErrors.push(...errs.map((e) => `[internal] ${e}`));
438
+ }
439
+
440
+ // E5/E6 font-floor (playwright-driven; no-op if playwright unavailable)
441
+ if (hasPlaywright()) {
442
+ process.stdout.write("\n=== Font-floor (≥11px computed) ===\n");
443
+ const { passed, log } = await internalFontFloorPass(cliInternalPath);
444
+ log.forEach((l) => process.stdout.write(` ${l}\n`));
445
+ if (!passed) allErrors.push("Font-floor check failed — see log above");
446
+ } else {
447
+ process.stdout.write("\n=== Font-floor SKIPPED (playwright not available) ===\n");
448
+ }
449
+
450
+ if (allErrors.length === 0) {
451
+ process.stdout.write("\n✅ render-playwright.test: PASS (structural + font-floor, internal-only mode)\n");
452
+ process.exit(0);
453
+ } else {
454
+ process.stdout.write("\n❌ render-playwright.test: FAIL\n");
455
+ allErrors.forEach((e) => process.stdout.write(` • ${e}\n`));
456
+ process.exit(1);
457
+ }
458
+ })().catch((err) => {
459
+ process.stderr.write(`Unhandled error: ${err}\n`);
460
+ process.exit(1);
461
+ });
462
+ } else if (cliArgs.length < 2) {
463
+ process.stderr.write(
464
+ "Usage: bash scripts/cli/run.sh scripts/test/render-playwright.test.ts <client.html> <internal.html>\n"
465
+ );
466
+ process.exit(1);
467
+ } else {
468
+ const cliClientPath = resolve(cliArgs[0]);
469
+ const cliInternalPath = resolve(cliArgs[1]);
470
+ for (const p of [cliClientPath, cliInternalPath]) {
471
+ if (!existsSync(p)) { process.stderr.write(`ERROR: file not found: ${p}\n`); process.exit(1); }
472
+ }
473
+ main(cliClientPath, cliInternalPath).catch((err) => {
474
+ process.stderr.write(`Unhandled error: ${err}\n`);
475
+ process.exit(1);
476
+ });
477
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * scripts/tier0/claude-code.ts
3
+ * R-SELF-11-a: Per-platform Tier 0 module for claude-code source.
4
+ *
5
+ * Uses v0.3 TraceMetadata extensions (apiErrors, compactionEvents) to produce
6
+ * a richer Tier 0 report for claude-code transcripts than the generic path.
7
+ *
8
+ * Invoked by tier0-scan.ts when `sourcePlatform === "claude-code"`.
9
+ * Type A — Pure Script (deterministic pattern matching, no LLM calls)
10
+ */
11
+
12
+ import type { TraceMetadata } from "../normalize/trace.ts";
13
+ import type { Tier0Report, PatternMatch } from "../tier0-scan.ts";
14
+
15
+ const HIGH_LATENCY_MS = 10_000;
16
+ const LOW_SCORE_RAW_MAX = 0.4;
17
+ const MAX_ESTIMATED_SLOTS = 5;
18
+
19
+ export function runClaudeCodeTier0(traces: TraceMetadata[]): Tier0Report {
20
+ const withError = traces.filter((t) => t.hasError);
21
+ const withFeedback = traces.filter((t) => t.hasFeedback);
22
+ const withLowScore = traces.filter((t) => {
23
+ if (t.normalizedScore !== undefined) return t.normalizedScore <= LOW_SCORE_RAW_MAX;
24
+ return typeof t.rawScore === "number" && t.rawScore < 3;
25
+ });
26
+ const withHighLatency = traces.filter(
27
+ (t) => t.latencyMs !== undefined && t.latencyMs > HIGH_LATENCY_MS
28
+ );
29
+
30
+ // CC-native: API exhaustion (v0.3 apiErrors extension)
31
+ const withApiExhaustion = traces.filter(
32
+ (t) =>
33
+ Array.isArray(t.apiErrors) &&
34
+ t.apiErrors.some((e) => e.retryAttempt >= e.maxRetries)
35
+ );
36
+ const hasApiExhaustion = withApiExhaustion.length > 0;
37
+
38
+ // CC-native: compaction events indicate context-overflow risk
39
+ const withCompaction = traces.filter(
40
+ (t) => Array.isArray(t.compactionEvents) && t.compactionEvents.length > 0
41
+ );
42
+
43
+ // CC-native: teammate vs lead sessions
44
+ const withTeammateSessions = traces.filter((t) => t.isTeammate === true);
45
+
46
+ const hasPrimarySignal =
47
+ withFeedback.length > 0 || withLowScore.length > 0 || hasApiExhaustion;
48
+
49
+ const patterns: PatternMatch[] = [];
50
+
51
+ // P-001: error spike (>20% error rate)
52
+ const errorRate = withError.length / Math.max(traces.length, 1);
53
+ if (errorRate > 0.2) {
54
+ patterns.push({
55
+ patternId: "P-001",
56
+ name: "error-spike",
57
+ matchCount: withError.length,
58
+ traceIds: withError.map((t) => t.traceId),
59
+ });
60
+ }
61
+
62
+ // P-002: latency spike (>10% high latency)
63
+ const latencyRate = withHighLatency.length / Math.max(traces.length, 1);
64
+ if (latencyRate > 0.1) {
65
+ patterns.push({
66
+ patternId: "P-002",
67
+ name: "latency-spike",
68
+ matchCount: withHighLatency.length,
69
+ traceIds: withHighLatency.map((t) => t.traceId),
70
+ });
71
+ }
72
+
73
+ // P-003: feedback cluster (>5% feedback bearing)
74
+ const feedbackRate = withFeedback.length / Math.max(traces.length, 1);
75
+ if (feedbackRate > 0.05) {
76
+ patterns.push({
77
+ patternId: "P-003",
78
+ name: "feedback-cluster",
79
+ matchCount: withFeedback.length,
80
+ traceIds: withFeedback.map((t) => t.traceId),
81
+ });
82
+ }
83
+
84
+ // P-CC-001: API exhaustion pattern (CC-native)
85
+ if (hasApiExhaustion) {
86
+ patterns.push({
87
+ patternId: "P-CC-001",
88
+ name: "api-exhaustion",
89
+ matchCount: withApiExhaustion.length,
90
+ traceIds: withApiExhaustion.map((t) => t.traceId),
91
+ });
92
+ }
93
+
94
+ // P-CC-002: compaction-heavy sessions (>20% of sessions had compaction)
95
+ const compactionRate = withCompaction.length / Math.max(traces.length, 1);
96
+ if (compactionRate > 0.2) {
97
+ patterns.push({
98
+ patternId: "P-CC-002",
99
+ name: "context-compaction-cluster",
100
+ matchCount: withCompaction.length,
101
+ traceIds: withCompaction.map((t) => t.traceId),
102
+ });
103
+ }
104
+
105
+ // P-CC-003: high teammate ratio (>50%) — may indicate orchestration issue
106
+ const teammateRate = withTeammateSessions.length / Math.max(traces.length, 1);
107
+ if (teammateRate > 0.5 && withTeammateSessions.length > 1) {
108
+ patterns.push({
109
+ patternId: "P-CC-003",
110
+ name: "high-teammate-ratio",
111
+ matchCount: withTeammateSessions.length,
112
+ traceIds: withTeammateSessions.map((t) => t.traceId),
113
+ });
114
+ }
115
+
116
+ const slots = Math.min(
117
+ Math.max(1, patterns.length + (hasPrimarySignal ? 1 : 0)),
118
+ MAX_ESTIMATED_SLOTS
119
+ );
120
+
121
+ return {
122
+ totalTraces: traces.length,
123
+ withError: withError.length,
124
+ withFeedback: withFeedback.length,
125
+ withLowScore: withLowScore.length,
126
+ withHighLatency: withHighLatency.length,
127
+ hasApiExhaustion,
128
+ hasPrimarySignal,
129
+ recommendedSlicing: hasPrimarySignal ? "dynamic-cluster" : "window-based",
130
+ estimatedSlots: slots,
131
+ patterns,
132
+ };
133
+ }