@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,1712 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ ╔══════════════════════════════════════════════════════════════════════════╗
4
+ ║ wave-dashboard-template.html ║
5
+ ║ INTERNAL DEV TEMPLATE — Design tier 1 — NOT SHIPPED TO END USERS ║
6
+ ╠══════════════════════════════════════════════════════════════════════════╣
7
+ ║ THREE-TIER MODEL ║
8
+ ║ ║
9
+ ║ Tier 1 · Design (internal dev) — THIS FILE ║
10
+ ║ tracks skill development + design + docs across waves ║
11
+ ║ stripped on publish via .npmignore / internal/ exclusion ║
12
+ ║ ║
13
+ ║ Tier 2 · Runtime (ships with skill) ║
14
+ ║ what the skill produces per diagnostic run ║
15
+ ║ lives at: assets/templates/report.html.tpl (+ sister .tpl files) ║
16
+ ║ UNTOUCHED by this template — DO NOT modify via this file ║
17
+ ║ ║
18
+ ║ Tier 3 · Meta-diag (skill-on-itself) ║
19
+ ║ skill reports its own issues / health / coverage ║
20
+ ║ DEFERRED — operator is building a standalone version; ║
21
+ ║ requirements TBD after dogfood completes ║
22
+ ║ DO NOT add "Meta-Diag" tab/section to this template ║
23
+ ╠══════════════════════════════════════════════════════════════════════════╣
24
+ ║ PURPOSE ║
25
+ ║ Unified per-wave artifact. Replaces the need to maintain three ║
26
+ ║ separate internal templates (iteration + status + skill-overview) ║
27
+ ║ for a single wave's context. All four views live in one file: ║
28
+ ║ ║
29
+ ║ Tab ① Kanban — WIP board + phase cards + drift + OQs + lockins ║
30
+ ║ Tab ② Skill Ovw. — §0–§9 walkthrough + §8 Design Principles ║
31
+ ║ Tab ③ Audit Mx. — criteria matrix + context map + timeline + princ ║
32
+ ║ Tab ④ Doc Map — Mermaid dep graph + change-propagation table ║
33
+ ╠══════════════════════════════════════════════════════════════════════════╣
34
+ ║ HOW TO USE ║
35
+ ║ 1. Replace {{WAVE_N}} with the wave number (e.g. "3", "4", "5") ║
36
+ ║ 2. Replace {{wave_subtitle}} with the wave state line ║
37
+ ║ (e.g. "Wave-3 Phase A LANDED · awaits dogfood-3") ║
38
+ ║ 3. Fill metric cards above the tabs with wave-level counts ║
39
+ ║ 4. Populate sub-panels from SKILL.md + engineering docs ║
40
+ ║ 5. Open in browser to verify; use "Copy Decisions" to export lockins ║
41
+ ║ 6. Delete this comment block once filled for a real wave ║
42
+ ╠══════════════════════════════════════════════════════════════════════════╣
43
+ ║ RELATIONSHIP TO LEGACY TEMPLATES ║
44
+ ║ iteration-template.html — legacy · kept for ad-hoc standalone fork ║
45
+ ║ status-template.html — legacy · kept for ad-hoc standalone fork ║
46
+ ║ skill-overview-template.html — legacy · kept for ad-hoc standalone ║
47
+ ║ This file (wave-dashboard-template.html) is RECOMMENDED for new waves ║
48
+ ╚══════════════════════════════════════════════════════════════════════════╝
49
+ -->
50
+ <html lang="en" data-theme="dark">
51
+ <head>
52
+ <meta charset="UTF-8">
53
+ <title>MUTAGENT — {{SKILL_DISPLAY_NAME}} · Wave-{{WAVE_N}} Dashboard</title>
54
+ <link rel="preconnect" href="https://fonts.googleapis.com">
55
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
56
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
57
+ <style>
58
+ /* ╔══════════════════════════════════════════════════════════════════════╗
59
+ ║ MUTAGENT brand tokens — keep this :root block intact across reuses ║
60
+ ╚══════════════════════════════════════════════════════════════════════╝ */
61
+ :root {
62
+ /* surfaces */
63
+ --bg: #0a0a10; --bg2: #14141e; --bg3: #181824;
64
+ --surf: #1c1c2a; --surf-e: #252535; --surf-h: #2f2f42;
65
+ /* text */
66
+ --text: #f5f5f9; --muted: #b0b0c4; --dim: #707088;
67
+ /* lines */
68
+ --border: rgba(255,255,255,0.08); --bstr: rgba(255,255,255,0.15);
69
+ /* accents — purple primary, cyan secondary (MUTAGENT gradient) */
70
+ --p: #a78bfa; --c: #06b6d4;
71
+ /* status accents */
72
+ --g: #10b981; --y: #f59e0b; --r: #ef4444; --m: #f0abfc;
73
+ /* effects */
74
+ --glow: rgba(167,139,250,0.25);
75
+ /* type */
76
+ --fs: 'Space Grotesk', system-ui, -apple-system, sans-serif;
77
+ --fm: 'IBM Plex Mono', ui-monospace, 'SF Mono', Menlo, monospace;
78
+ }
79
+
80
+ *{box-sizing:border-box;}
81
+ body{margin:0;font-family:var(--fs);color:var(--text);background:var(--bg);font-size:14px;line-height:1.55;}
82
+
83
+ /* ─── Internal badge strip ──────────────────────────────────────────── */
84
+ .internal-strip{background:rgba(245,158,11,0.08);border-bottom:2px solid rgba(245,158,11,0.3);padding:6px 32px;font-family:var(--fm);font-size:11px;color:var(--y);letter-spacing:0.04em;}
85
+
86
+ /* ─── Header banner with MUTAGENT logotype (purple→cyan gradient) ──── */
87
+ header.banner{background:linear-gradient(135deg,#0a0a14 0%,#1a1a2e 50%,#16213e 100%);border-bottom:1px solid var(--bstr);padding:20px 32px;position:relative;}
88
+ header.banner::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,var(--p),var(--c),transparent);}
89
+ .brand{display:flex;align-items:baseline;gap:14px;margin-bottom:6px;}
90
+ .logo{font-family:var(--fs);font-weight:700;font-size:22px;letter-spacing:0.18em;background:linear-gradient(135deg,var(--p) 0%,var(--c) 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;text-shadow:0 0 30px var(--glow);}
91
+ .product{font-size:14px;font-weight:500;color:var(--muted);letter-spacing:0.04em;}
92
+ .meta{font-size:11px;opacity:0.7;font-family:var(--fm);color:var(--dim);}
93
+
94
+ /* ─── Top-level tab nav (sticky) ──────────────────────────────────── */
95
+ nav.tabs{background:var(--bg2);border-bottom:1px solid var(--border);padding:0 12px;position:sticky;top:0;z-index:100;box-shadow:0 2px 12px rgba(0,0,0,0.4);overflow-x:auto;white-space:nowrap;}
96
+ nav.tabs button{background:none;border:none;padding:12px 14px;font-size:12px;font-weight:500;color:var(--muted);cursor:pointer;border-bottom:3px solid transparent;font-family:inherit;letter-spacing:0.01em;}
97
+ nav.tabs button:hover{color:var(--text);background:var(--surf-h);}
98
+ nav.tabs button.active{color:var(--p);border-bottom-color:var(--p);font-weight:600;}
99
+
100
+ /* ─── Sub-tab nav (inside each panel) ──────────────────────────────── */
101
+ nav.subtabs{background:var(--bg3);border-bottom:1px solid var(--border);padding:0 8px;margin-bottom:20px;overflow-x:auto;white-space:nowrap;border-radius:8px 8px 0 0;}
102
+ nav.subtabs button{background:none;border:none;padding:8px 11px;font-size:11px;font-weight:500;color:var(--dim);cursor:pointer;border-bottom:2px solid transparent;font-family:inherit;letter-spacing:0.01em;}
103
+ nav.subtabs button:hover{color:var(--text);background:var(--surf-h);}
104
+ nav.subtabs button.active{color:var(--c);border-bottom-color:var(--c);font-weight:600;}
105
+
106
+ main{max-width:1280px;margin:0 auto;padding:28px 32px 80px 32px;}
107
+
108
+ /* ─── Top-level panels ──────────────────────────────────────────────── */
109
+ .panel{display:none;}.panel.active{display:block;animation:fade 0.2s ease-out;}
110
+ @keyframes fade{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:translateY(0);}}
111
+
112
+ /* ─── Sub-panels ─────────────────────────────────────────────────────── */
113
+ .subpanel{display:none;}.subpanel.active{display:block;animation:fade 0.15s ease-out;}
114
+
115
+ /* ─── Typography ──────────────────────────────────────────────────── */
116
+ h2{font-size:22px;font-weight:600;margin:0 0 8px 0;padding-bottom:10px;border-bottom:1px solid var(--bstr);}
117
+ h3{font-size:16px;font-weight:600;margin-top:24px;color:var(--p);}
118
+ h4{font-size:14px;font-weight:600;margin-top:16px;color:var(--text);}
119
+ p{color:var(--muted);}strong{color:var(--text);}
120
+ .sub{color:var(--muted);font-size:13px;margin-bottom:24px;}
121
+
122
+ /* ─── Code ─────────────────────────────────────────────────────────── */
123
+ code{background:#0a0a14;color:var(--m);padding:2px 6px;border-radius:4px;font-size:0.88em;font-family:var(--fm);border:1px solid var(--border);}
124
+ pre{background:#0a0a14;color:#c4c4d4;padding:14px 16px;border-radius:8px;overflow-x:auto;font-size:12px;font-family:var(--fm);white-space:pre;margin:12px 0;border:1px solid var(--border);}
125
+ pre code{background:none;color:inherit;padding:0;border:none;}
126
+
127
+ /* ─── Tables ──────────────────────────────────────────────────────── */
128
+ table{border-collapse:collapse;margin:12px 0;font-size:12px;width:100%;border:1px solid var(--border);border-radius:8px;overflow:hidden;}
129
+ th,td{border:1px solid var(--border);padding:8px 12px;text-align:left;color:var(--muted);vertical-align:top;}
130
+ th{background:var(--surf-e);color:var(--text);font-weight:600;}
131
+ tr:nth-child(even) td{background:var(--bg3);}
132
+
133
+ /* ─── Section containers ──────────────────────────────────────────── */
134
+ .section{background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:20px 24px;margin-bottom:18px;}
135
+
136
+ /* ─── Callouts (rationale / delta / resolved / warn) ──────────────── */
137
+ .rationale{background:linear-gradient(135deg,rgba(167,139,250,0.08) 0%,rgba(99,102,241,0.04) 100%);border-left:3px solid var(--p);padding:10px 14px;margin:14px 0;font-size:12px;border-radius:0 8px 8px 0;color:var(--muted);}
138
+ .rationale strong{color:var(--p);}
139
+ .delta{background:linear-gradient(135deg,rgba(245,158,11,0.08) 0%,rgba(217,119,6,0.04) 100%);border-left:3px solid var(--y);padding:10px 14px;margin:14px 0;font-size:12px;border-radius:0 8px 8px 0;color:var(--muted);}
140
+ .delta strong{color:var(--y);}
141
+ .resolved{background:linear-gradient(135deg,rgba(16,185,129,0.08) 0%,rgba(5,150,105,0.04) 100%);border-left:3px solid var(--g);padding:10px 14px;margin:12px 0;font-size:12px;border-radius:0 8px 8px 0;color:var(--muted);}
142
+ .resolved strong{color:var(--g);}
143
+
144
+ /* ─── Mermaid container ──────────────────────────────────────────── */
145
+ div.mermaid{background:var(--surf);padding:20px;margin:18px 0;border:1px solid var(--bstr);border-radius:8px;text-align:center;overflow-x:auto;}
146
+
147
+ /* ─── Lock-in widget (per-section approval) ──────────────────────── */
148
+ .lockin{background:var(--surf-e);border:1px solid var(--bstr);border-radius:8px;padding:14px 18px;margin:24px 0 0 0;box-shadow:0 8px 24px rgba(0,0,0,0.4);}
149
+ .lockin-title{font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:0.08em;color:var(--p);margin-bottom:10px;font-family:var(--fm);}
150
+ .lockin-radios{display:flex;gap:22px;flex-wrap:wrap;margin-bottom:10px;font-size:13px;}
151
+ .lockin-radios label{cursor:pointer;display:flex;align-items:center;gap:6px;color:var(--muted);}
152
+ .lockin-radios label:hover{color:var(--text);}
153
+ .lockin-radios input[type="radio"]{accent-color:var(--p);cursor:pointer;}
154
+ .lockin textarea{width:100%;min-height:60px;padding:8px 12px;border:1px solid var(--bstr);border-radius:6px;font-family:var(--fm);font-size:12px;resize:vertical;background:#0a0a14;color:var(--text);}
155
+
156
+ /* ─── Per-item approval row ──────────────────────────────────────── */
157
+ .remedy{background:var(--bg2);border:1px solid var(--border);border-radius:6px;padding:10px 14px;margin:8px 0;display:flex;align-items:center;gap:12px;}
158
+ .remedy-id{font-family:var(--fm);font-weight:700;color:var(--c);font-size:11px;min-width:110px;}
159
+ .remedy-cb{accent-color:var(--p);cursor:pointer;flex-shrink:0;}
160
+ .remedy-body{flex:1;}
161
+ .remedy-what{font-weight:500;color:var(--text);font-size:13px;}
162
+
163
+ /* ─── Principle / Evidence cards ─────────────────────────────────── */
164
+ .principle{background:var(--surf);border:1px solid var(--border);border-left:4px solid var(--m);border-radius:8px;padding:14px 18px;margin:10px 0;}
165
+ .principle .pid{font-family:var(--fm);font-weight:700;color:var(--m);font-size:11px;letter-spacing:0.05em;}
166
+ .principle .pt{font-weight:600;color:var(--text);font-size:14px;margin:6px 0 4px 0;}
167
+ .principle .pb{font-size:13px;color:var(--muted);line-height:1.55;}
168
+ .principle.proposed{border-left-color:var(--c);opacity:0.75;}
169
+ .principle.proposed .pid{color:var(--c);}
170
+ .evidence{background:var(--surf);border:1px solid var(--border);border-left:3px solid var(--c);border-radius:6px;padding:10px 14px;margin:8px 0;}
171
+ .evidence .e-title{font-weight:600;color:var(--c);font-size:13px;margin-bottom:4px;font-family:var(--fm);}
172
+ .evidence .e-ask{font-size:12px;color:var(--muted);margin:3px 0;}
173
+ .evidence .e-ask::before{content:'→ ';color:var(--c);font-weight:600;}
174
+ .evidence .e-pass{font-size:11px;color:var(--g);margin-top:5px;font-family:var(--fm);}
175
+ .evidence .e-pass::before{content:'✓ pass: ';color:var(--g);}
176
+
177
+ /* ─── Metric cards row (grid of 4) ───────────────────────────────── */
178
+ .grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:22px;}
179
+ @media(max-width:800px){.grid{grid-template-columns:repeat(2,1fr);}}
180
+ .card{background:var(--bg2);border:1px solid var(--border);border-radius:8px;padding:13px 16px;}
181
+ .card .l{font-family:var(--fm);font-size:10px;text-transform:uppercase;letter-spacing:0.1em;color:var(--dim);}
182
+ .card .v{font-size:22px;font-weight:600;color:var(--p);margin:5px 0 3px 0;}
183
+ .card .d{font-size:11px;color:var(--muted);}
184
+
185
+ /* ─── Kanban (5 columns) ─────────────────────────────────────────── */
186
+ .kanban{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;}
187
+ @media(max-width:1000px){.kanban{grid-template-columns:repeat(2,1fr);}}
188
+ .col{background:var(--surf);border:1px solid var(--border);border-radius:8px;padding:10px 11px;min-height:240px;}
189
+ .col-h{font-family:var(--fm);font-size:10px;text-transform:uppercase;letter-spacing:0.08em;font-weight:700;margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid var(--border);display:flex;align-items:baseline;gap:8px;}
190
+ .col-h .ct{margin-left:auto;background:var(--bg);color:var(--dim);padding:1px 6px;border-radius:3px;font-size:9px;}
191
+ .col.backlog{border-top:3px solid var(--dim);}.col.backlog .col-h{color:var(--dim);}
192
+ .col.inflight{border-top:3px solid var(--y);}.col.inflight .col-h{color:var(--y);}
193
+ .col.dogfood{border-top:3px solid var(--c);}.col.dogfood .col-h{color:var(--c);}
194
+ .col.verified{border-top:3px solid var(--p);}.col.verified .col-h{color:var(--p);}
195
+ .col.shipped{border-top:3px solid var(--g);}.col.shipped .col-h{color:var(--g);}
196
+ .kcard{background:var(--bg2);border:1px solid var(--border);border-radius:6px;padding:7px 10px;margin:6px 0;font-size:11px;line-height:1.4;}
197
+ .kcard .kt{font-weight:600;color:var(--text);font-size:11px;margin-bottom:2px;}
198
+ .kcard .km{font-family:var(--fm);color:var(--dim);font-size:10px;}
199
+ .kcard.now{box-shadow:0 0 0 1px var(--y);animation:pulse 2s infinite;}
200
+ .kcard.v01{border-left:2px solid var(--g);}.kcard.v02{border-left:2px solid var(--c);}.kcard.v03{border-left:2px solid var(--y);}.kcard.v04{border-left:2px solid var(--m);}.kcard.v05{border-left:2px solid var(--p);}
201
+ @keyframes pulse{0%,100%{box-shadow:0 0 0 1px var(--y),0 0 0 0 rgba(245,158,11,0.4);}50%{box-shadow:0 0 0 1px var(--y),0 0 0 6px rgba(245,158,11,0);}}
202
+
203
+ /* ─── Tree changelog ─────────────────────────────────────────────── */
204
+ .tree{background:#0a0a14;border:1px solid var(--border);border-radius:8px;padding:14px 18px;font-family:var(--fm);font-size:12px;line-height:1.7;white-space:pre;color:var(--muted);overflow-x:auto;}
205
+ .tree b{color:var(--p);font-weight:600;}
206
+ .tree i{color:var(--c);font-style:normal;}
207
+ .tree em{color:var(--dim);font-style:italic;}
208
+
209
+ /* ─── Vertical timeline ──────────────────────────────────────────── */
210
+ .timeline{position:relative;padding-left:24px;border-left:2px solid var(--border);}
211
+ .ev{position:relative;padding:8px 0;}
212
+ .ev::before{content:'';position:absolute;left:-30px;top:14px;width:10px;height:10px;border-radius:50%;background:var(--p);border:2px solid var(--bg2);}
213
+ .ev.done::before{background:var(--g);}.ev.current::before{background:var(--y);box-shadow:0 0 0 4px rgba(245,158,11,0.2);}
214
+ .ev .date{font-family:var(--fm);font-size:10px;color:var(--dim);}
215
+ .ev .title{font-weight:600;font-size:13px;color:var(--text);margin:2px 0;}
216
+ .ev .desc{font-size:12px;color:var(--muted);}
217
+
218
+ /* ─── Badges ─────────────────────────────────────────────────────── */
219
+ .badge{display:inline-block;padding:2px 7px;font-size:10px;border-radius:4px;font-weight:600;letter-spacing:0.04em;font-family:var(--fm);margin-right:4px;}
220
+ .b-new{background:rgba(16,185,129,0.18);color:var(--g);border:1px solid rgba(16,185,129,0.35);}
221
+ .b-changed{background:rgba(245,158,11,0.18);color:var(--y);border:1px solid rgba(245,158,11,0.35);}
222
+ .b-locked{background:rgba(6,182,212,0.18);color:var(--c);border:1px solid rgba(6,182,212,0.35);}
223
+ .b-dropped{background:rgba(239,68,68,0.18);color:var(--r);border:1px solid rgba(239,68,68,0.35);}
224
+
225
+ /* ─── Success Criteria Matrix pills ───────────────────────────────── */
226
+ .matrix th{background:var(--surf-e);color:var(--text);font-weight:600;font-size:11px;}
227
+ .matrix td{font-size:11px;line-height:1.5;}
228
+ .matrix em{color:var(--dim);font-style:italic;}
229
+ .pill{display:inline-block;padding:2px 8px;font-size:10px;border-radius:12px;font-weight:600;font-family:var(--fm);letter-spacing:0.04em;white-space:nowrap;}
230
+ .pill.p-green{background:rgba(16,185,129,0.18);color:var(--g);border:1px solid rgba(16,185,129,0.4);}
231
+ .pill.p-blue{background:rgba(6,182,212,0.18);color:var(--c);border:1px solid rgba(6,182,212,0.4);}
232
+ .pill.p-yellow{background:rgba(245,158,11,0.18);color:var(--y);border:1px solid rgba(245,158,11,0.4);}
233
+ .pill.p-white{background:rgba(176,176,196,0.15);color:var(--muted);border:1px solid rgba(176,176,196,0.3);}
234
+ .pill.p-red{background:rgba(239,68,68,0.18);color:var(--r);border:1px solid rgba(239,68,68,0.4);}
235
+ .pill.p-purple{background:rgba(240,171,252,0.18);color:var(--m);border:1px solid rgba(240,171,252,0.4);}
236
+
237
+ /* ─── Phase card (feature/issue-style description block) ─────────── */
238
+ .phase-card{background:var(--bg2);border:1px solid var(--border);border-left:5px solid var(--p);border-radius:10px;padding:18px 22px;margin:18px 0;}
239
+ .phase-card.phase-safe{border-left-color:var(--g);}
240
+ .phase-card.phase-arch{border-left-color:var(--y);border-left-width:6px;background:linear-gradient(135deg,rgba(245,158,11,0.05) 0%,var(--bg2) 100%);}
241
+ .phase-card.phase-medium{border-left-color:var(--c);}
242
+ .phase-head{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--border);}
243
+ .phase-id{font-family:var(--fm);font-weight:700;color:var(--p);font-size:13px;letter-spacing:0.06em;text-transform:uppercase;}
244
+ .phase-card.phase-safe .phase-id{color:var(--g);}
245
+ .phase-card.phase-arch .phase-id{color:var(--y);}
246
+ .phase-card.phase-medium .phase-id{color:var(--c);}
247
+ .phase-title{flex:1;font-weight:600;color:var(--text);font-size:15px;}
248
+ .phase-tags{display:flex;gap:6px;flex-wrap:wrap;}
249
+ .phase-sub{margin:14px 0;}
250
+ .phase-sub h4{margin:0 0 8px 0;font-size:13px;color:var(--c);}
251
+ .phase-sub p,.phase-sub li{font-size:13px;color:var(--muted);line-height:1.6;}
252
+ .phase-sub ol,.phase-sub ul{margin:8px 0 8px 22px;padding:0;}
253
+ .phase-sub ol li,.phase-sub ul li{margin:6px 0;}
254
+ .phase-sub ol li strong,.phase-sub ul li strong{color:var(--text);}
255
+ .phase-sub pre{font-size:11px;margin:8px 0;padding:10px 12px;}
256
+ .phase-sub table{margin:8px 0;font-size:11px;}
257
+ .vstamp{background:linear-gradient(135deg,rgba(240,171,252,0.08) 0%,rgba(167,139,250,0.04) 100%);border-left:3px solid var(--m);padding:8px 12px;border-radius:0 6px 6px 0;margin:8px 0;font-size:12px;color:var(--muted);}
258
+ .vstamp strong{color:var(--m);}
259
+ .note{background:linear-gradient(135deg,rgba(6,182,212,0.08) 0%,rgba(6,182,212,0.02) 100%);border-left:3px solid var(--c);padding:8px 12px;border-radius:0 6px 6px 0;margin:8px 0;font-size:12px;color:var(--muted);}
260
+ .note strong{color:var(--c);}
261
+ .phase-meta-row{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:14px 0;padding:10px 0;border-top:1px dashed var(--border);border-bottom:1px dashed var(--border);}
262
+ @media(max-width:800px){.phase-meta-row{grid-template-columns:repeat(2,1fr);}}
263
+ .phase-meta-block{font-size:11px;color:var(--dim);}
264
+ .phase-meta-block strong{color:var(--text);font-size:11px;display:block;margin-bottom:3px;font-family:var(--fm);text-transform:uppercase;letter-spacing:0.06em;}
265
+ .phase-meta-block .meta-val{color:var(--muted);}
266
+
267
+ /* ─── Open Questions / Drift items ──────────────────────────────── */
268
+ .oq{background:var(--surf);border:1px solid var(--border);border-left:3px solid var(--y);border-radius:6px;padding:10px 14px;margin:8px 0;}
269
+ .oq .oq-id{font-family:var(--fm);font-size:10px;font-weight:700;color:var(--y);text-transform:uppercase;letter-spacing:0.06em;}
270
+ .oq .oq-body{font-size:13px;color:var(--muted);margin-top:4px;}
271
+ .oq.resolved-oq{border-left-color:var(--g);opacity:0.7;}
272
+ .oq.resolved-oq .oq-id{color:var(--g);}
273
+
274
+ /* ─── Drift item ─────────────────────────────────────────────────── */
275
+ .drift{background:var(--surf);border:1px solid var(--border);border-left:3px solid var(--r);border-radius:6px;padding:10px 14px;margin:8px 0;}
276
+ .drift .drift-id{font-family:var(--fm);font-size:10px;font-weight:700;color:var(--r);}
277
+ .drift .drift-body{font-size:13px;color:var(--muted);margin-top:4px;}
278
+ .drift .drift-fix{font-size:12px;color:var(--g);margin-top:4px;}
279
+ .drift .drift-fix::before{content:'Fix: ';font-weight:700;}
280
+
281
+ /* ─── Three-column grid ──────────────────────────────────────────── */
282
+ .three-col{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:14px 0;}
283
+ @media(max-width:900px){.three-col{grid-template-columns:1fr;}}
284
+ .tax-card{background:var(--surf);border:1px solid var(--border);border-radius:8px;padding:14px 16px;}
285
+ .tax-card h4{margin-top:0;color:var(--c);font-family:var(--fm);text-transform:uppercase;letter-spacing:0.08em;font-size:12px;}
286
+ .tax-card ul{margin:8px 0 0 18px;padding:0;}
287
+ .tax-card li{font-size:12px;color:var(--muted);margin:4px 0;}
288
+
289
+ /* ─── Action bar (floating bottom-right) ─────────────────────────── */
290
+ .action-bar{position:fixed;bottom:24px;right:24px;display:flex;gap:10px;z-index:1000;}
291
+ .action-bar button{padding:11px 18px;border:none;border-radius:8px;cursor:pointer;font-size:13px;font-weight:600;box-shadow:0 8px 24px rgba(0,0,0,0.4);font-family:var(--fs);letter-spacing:0.02em;}
292
+ .action-bar button.primary{background:linear-gradient(135deg,var(--p) 0%,var(--c) 100%);color:#fff;box-shadow:0 4px 14px var(--glow);}
293
+ .action-bar button.ghost{background:var(--surf-e);color:var(--muted);border:1px solid var(--bstr);}
294
+
295
+ /* ─── Responsive ──────────────────────────────────────────────────── */
296
+ @media(max-width:700px){main{padding:16px 12px 80px 12px;}.grid{grid-template-columns:1fr 1fr;}}
297
+ </style>
298
+ </head>
299
+ <body>
300
+
301
+ <!-- INTERNAL BADGE — visible reminder this file is dev-only -->
302
+ <div class="internal-strip">
303
+ [INTERNAL DEV TEMPLATE — Design Tier 1] — NOT SHIPPED TO END USERS &nbsp;·&nbsp; internal/templates/review/wave-dashboard-template.html
304
+ </div>
305
+
306
+ <!-- ───────────────────────────────────────────────────────────────────
307
+ HEADER — replace {{WAVE_N}} and {{wave_subtitle}}
308
+ Example subtitle: "Wave-3 Phase A LANDED · awaits dogfood-3"
309
+ ─────────────────────────────────────────────────────────────────── -->
310
+ <header class="banner">
311
+ <div class="brand">
312
+ <div class="logo">MUTAGENT</div>
313
+ <div class="product">— DIAGNOSTICS &middot; Wave-{{WAVE_N}}</div>
314
+ </div>
315
+ <div class="meta">{{wave_subtitle}} &nbsp;·&nbsp; internal/templates/review/wave-dashboard-template.html</div>
316
+ </header>
317
+
318
+ <!-- ───────────────────────────────────────────────────────────────────
319
+ TOP-LEVEL TAB NAV
320
+ 4 tabs: Kanban · Skill Overview · Audit Matrix · Document Map
321
+ ─────────────────────────────────────────────────────────────────── -->
322
+ <nav class="tabs" id="tabnav">
323
+ <button data-tab="t1" class="active">&#9312; Kanban</button>
324
+ <button data-tab="t2">&#9313; Skill Overview</button>
325
+ <button data-tab="t3">&#9314; Audit Matrix</button>
326
+ <button data-tab="t4">&#9315; Document Map</button>
327
+ </nav>
328
+
329
+ <main>
330
+
331
+ <!-- ─── METRIC CARDS — always visible above content ─────────────────── -->
332
+ <!-- Fill these with wave-level top-line numbers. Examples below. -->
333
+ <div class="grid">
334
+ <div class="card">
335
+ <div class="l">Wave</div>
336
+ <div class="v">W{{WAVE_N}}</div>
337
+ <div class="d"><!-- e.g. "4 phases · 2 PRs" --></div>
338
+ </div>
339
+ <div class="card">
340
+ <div class="l"><!-- e.g. "Phases Done" --></div>
341
+ <div class="v" style="color:var(--c);"><!-- e.g. "2/5" --></div>
342
+ <div class="d"><!-- e.g. "A + B landed" --></div>
343
+ </div>
344
+ <div class="card">
345
+ <div class="l"><!-- e.g. "Criteria Met" --></div>
346
+ <div class="v" style="color:var(--m);"><!-- e.g. "14/23" --></div>
347
+ <div class="d"><!-- e.g. "success matrix" --></div>
348
+ </div>
349
+ <div class="card">
350
+ <div class="l"><!-- e.g. "Open Items" --></div>
351
+ <div class="v" style="color:var(--y);"><!-- e.g. "3 OQs" --></div>
352
+ <div class="d"><!-- e.g. "unresolved questions" --></div>
353
+ </div>
354
+ </div>
355
+
356
+
357
+ <!-- ══════════════════════════════════════════════════════════════════
358
+ TAB ① — KANBAN
359
+ Sub-tabs: Overview · Tree Changelog · Phase A-E · Drift · OQs · Lockin/Decisions
360
+ ══════════════════════════════════════════════════════════════════ -->
361
+ <section class="panel active" id="t1">
362
+
363
+ <nav class="subtabs" id="subtabs-t1">
364
+ <button data-subtab="t1-overview" class="active">Overview</button>
365
+ <button data-subtab="t1-tree">Tree Changelog</button>
366
+ <button data-subtab="t1-pA">Phase A</button>
367
+ <button data-subtab="t1-pB">Phase B</button>
368
+ <button data-subtab="t1-pC">Phase C</button>
369
+ <button data-subtab="t1-pD">Phase D</button>
370
+ <button data-subtab="t1-pE">Phase E</button>
371
+ <button data-subtab="t1-drift">Drift Audit</button>
372
+ <button data-subtab="t1-oq">Open Questions</button>
373
+ <button data-subtab="t1-lockin">Lockin / Decisions</button>
374
+ </nav>
375
+
376
+ <!-- ── t1-overview ── -->
377
+ <div class="subpanel active" id="t1-overview">
378
+ <div class="section">
379
+ <h3>Wave-{{WAVE_N}} — WIP Board</h3>
380
+ <p class="sub">Drag (mentally) cards as work moves between columns. Add <code>.kcard.now</code> to highlight the active card.</p>
381
+
382
+ <div class="kanban">
383
+ <div class="col backlog">
384
+ <div class="col-h">&#128230; Backlog <span class="ct">0</span></div>
385
+ <!-- example:
386
+ <div class="kcard"><div class="kt">Feature name</div><div class="km">Phase C · issue #NNN</div></div>
387
+ -->
388
+ </div>
389
+ <div class="col inflight">
390
+ <div class="col-h">&#9881; In-Flight <span class="ct">0</span></div>
391
+ <!-- mark active with .now for the pulsing ring:
392
+ <div class="kcard now"><div class="kt">Active feature</div><div class="km">Phase A · PR #NNN</div></div>
393
+ -->
394
+ </div>
395
+ <div class="col dogfood">
396
+ <div class="col-h">&#128021; Dogfood-Pending <span class="ct">0</span></div>
397
+ </div>
398
+ <div class="col verified">
399
+ <div class="col-h">&#10003; Verified <span class="ct">0</span></div>
400
+ </div>
401
+ <div class="col shipped">
402
+ <div class="col-h">&#128640; Shipped <span class="ct">0</span></div>
403
+ </div>
404
+ </div>
405
+
406
+ <div class="rationale"><strong>Status key:</strong> Backlog (not started) &rarr; In-Flight (dev) &rarr; Dogfood-Pending (shipped, awaits real-world trigger) &rarr; Verified (evidence collected) &rarr; Shipped (merged/closed).</div>
407
+ </div>
408
+
409
+ <!-- Wave summary section -->
410
+ <div class="section">
411
+ <h3>Wave Summary</h3>
412
+ <!--
413
+ Fill with wave-level context:
414
+ - What this wave delivers (user-visible outcome)
415
+ - Key PRs and their status
416
+ - Dependencies from prior waves
417
+ - Handoff to next wave
418
+ -->
419
+ <p><!-- {{wave_summary}} — replace with 2-4 sentence wave description --></p>
420
+ <table>
421
+ <thead><tr><th>Phase</th><th>PR</th><th>Status</th><th>Landed</th><th>Notes</th></tr></thead>
422
+ <tbody>
423
+ <tr><td>Phase A</td><td><code><!-- PR #NNN --></code></td><td><span class="pill p-white">&#9898; backlog</span></td><td>—</td><td><!-- brief --></td></tr>
424
+ <tr><td>Phase B</td><td><code><!-- PR #NNN --></code></td><td><span class="pill p-white">&#9898; backlog</span></td><td>—</td><td><!-- brief --></td></tr>
425
+ <tr><td>Phase C</td><td><code><!-- PR #NNN --></code></td><td><span class="pill p-white">&#9898; backlog</span></td><td>—</td><td><!-- brief --></td></tr>
426
+ <tr><td>Phase D</td><td><code><!-- PR #NNN --></code></td><td><span class="pill p-white">&#9898; backlog</span></td><td>—</td><td><!-- brief --></td></tr>
427
+ <tr><td>Phase E</td><td><code><!-- PR #NNN --></code></td><td><span class="pill p-white">&#9898; backlog</span></td><td>—</td><td><!-- brief --></td></tr>
428
+ </tbody>
429
+ </table>
430
+ </div>
431
+ </div>
432
+
433
+ <!-- ── t1-tree ── -->
434
+ <div class="subpanel" id="t1-tree">
435
+ <div class="section">
436
+ <h3>Tree Changelog — what moves between iterations</h3>
437
+ <p class="sub">Fill from <code>git diff --stat origin/main...HEAD</code> + per-phase file list. Use <code>&lt;b&gt;</code> for key files, <code>&lt;i&gt;</code> for dirs, <code>&lt;em&gt;</code> for comments.</p>
438
+
439
+ <!--
440
+ Example tree block — replace with actual changed file tree:
441
+
442
+ <div class="tree"><b>mutagent-system/{{SKILL_NAME}}/.claude/skills/{{SKILL_NAME}}/</b>
443
+ ├─ <i>scripts/</i>
444
+ │ ├─ <b>slicer.ts</b> <em>EDIT — added NL→filter adapter</em>
445
+ │ └─ <i>report/</i>
446
+ │ └─ <b>render.ts</b> <em>EDIT — new renderFindingPanel()</em>
447
+ ├─ <i>assets/templates/</i>
448
+ │ └─ <b>report.html.tpl</b> <em>EDIT — badge classes PR-024 portability</em>
449
+ └─ <i>references/</i>
450
+ └─ <b>principles.md</b> <em>EDIT — added PR-024 through PR-026</em></div>
451
+ -->
452
+ <div class="tree"><!-- {{tree_changelog}} — paste git diff --stat tree here --></div>
453
+
454
+ <div class="delta"><strong>How to fill:</strong> Run <code>git diff --stat origin/main...HEAD</code> in the worktree. Copy the output here. Use <code>&lt;b&gt;</code> on the most-changed files. Add <code>&lt;em&gt;</code> inline comments explaining WHY each file was touched.</div>
455
+ </div>
456
+ </div>
457
+
458
+ <!-- ── t1-pA ── -->
459
+ <div class="subpanel" id="t1-pA">
460
+ <!--
461
+ PHASE A — full feature-card structure.
462
+ Fill in order: phase-head → goal → voice-stamps → scope → files → acceptance → meta-row → lockin.
463
+ Risk modifier on .phase-card root:
464
+ .phase-safe green left-border (low risk)
465
+ .phase-medium cyan left-border (typical)
466
+ .phase-arch thick yellow (architectural, extra approval)
467
+ -->
468
+ <div class="phase-card phase-medium">
469
+ <div class="phase-head">
470
+ <div class="phase-id">Phase A</div>
471
+ <div class="phase-title"><!-- concise title --></div>
472
+ <div class="phase-tags">
473
+ <span class="pill p-white">&#9898; backlog</span>
474
+ <span class="pill p-blue"><!-- ~Xh --></span>
475
+ <span class="pill p-white"><!-- ~Y LOC --></span>
476
+ </div>
477
+ </div>
478
+
479
+ <div class="phase-sub">
480
+ <h4>&#127919; Goal</h4>
481
+ <p><!-- One paragraph: user-visible outcome. WHY this exists. --></p>
482
+ </div>
483
+
484
+ <div class="vstamp"><strong>Voice-stamp T?</strong>: <em>"<!-- verbatim operator quote -->"</em></div>
485
+
486
+ <div class="phase-sub">
487
+ <h4>&#128203; Scope of work</h4>
488
+ <ol>
489
+ <li><strong><!-- Task name --></strong>: <!-- concrete action, file paths, CLI --></li>
490
+ <li><strong><!-- Task name --></strong>: <!-- ... --></li>
491
+ </ol>
492
+ <div class="note"><strong>Constraint</strong>: <!-- invariants, don't-touch callouts --></div>
493
+ </div>
494
+
495
+ <div class="phase-sub">
496
+ <h4>&#128194; Files touched</h4>
497
+ <table>
498
+ <thead><tr><th width="55%">File</th><th width="15%">Action</th><th width="30%">Notes</th></tr></thead>
499
+ <tbody>
500
+ <tr><td><code><!-- path/to/file --></code></td><td>NEW · EDIT · DELETE</td><td><!-- LOC or sub-edits --></td></tr>
501
+ </tbody>
502
+ </table>
503
+ </div>
504
+
505
+ <div class="phase-sub">
506
+ <h4>&#9989; Acceptance criteria</h4>
507
+ <ul>
508
+ <li><!-- runnable command + expected exit/output --></li>
509
+ <li><!-- behavioral observation --></li>
510
+ </ul>
511
+ </div>
512
+
513
+ <div class="phase-meta-row">
514
+ <div class="phase-meta-block"><strong>Dependencies</strong><br/><span class="meta-val"><!-- none / P-X / parallel-safe --></span></div>
515
+ <div class="phase-meta-block"><strong>Risks</strong><br/><span class="meta-val"><!-- RISK-XX (severity) or none --></span></div>
516
+ <div class="phase-meta-block"><strong>Voice-stamps</strong><br/><span class="meta-val"><!-- TN endorse --></span></div>
517
+ <div class="phase-meta-block"><strong>PR scope</strong><br/><span class="meta-val"><!-- 1 PR · separate commit --></span></div>
518
+ </div>
519
+
520
+ <div class="lockin">
521
+ <div class="lockin-title">Phase A — approve to dispatch</div>
522
+ <div class="lockin-radios">
523
+ <label><input type="radio" name="pA" value="lock"> LOCK + dispatch</label>
524
+ <label><input type="radio" name="pA" value="revise"> REVISE</label>
525
+ <label><input type="radio" name="pA" value="hold"> HOLD</label>
526
+ <label><input type="radio" name="pA" value="drop"> DROP</label>
527
+ </div>
528
+ <textarea placeholder="Concerns, alternative proposals, peer-review asks"></textarea>
529
+ </div>
530
+ </div>
531
+ </div>
532
+
533
+ <!-- ── t1-pB ── -->
534
+ <div class="subpanel" id="t1-pB">
535
+ <div class="phase-card phase-medium">
536
+ <div class="phase-head">
537
+ <div class="phase-id">Phase B</div>
538
+ <div class="phase-title"><!-- concise title --></div>
539
+ <div class="phase-tags">
540
+ <span class="pill p-white">&#9898; backlog</span>
541
+ <span class="pill p-blue"><!-- ~Xh --></span>
542
+ </div>
543
+ </div>
544
+ <div class="phase-sub"><h4>&#127919; Goal</h4><p><!-- goal --></p></div>
545
+ <div class="vstamp"><strong>Voice-stamp T?</strong>: <em>"<!-- quote -->"</em></div>
546
+ <div class="phase-sub">
547
+ <h4>&#128203; Scope</h4>
548
+ <ol><li><strong><!-- task --></strong>: <!-- detail --></li></ol>
549
+ </div>
550
+ <div class="phase-sub">
551
+ <h4>&#128194; Files</h4>
552
+ <table><thead><tr><th>File</th><th>Action</th><th>Notes</th></tr></thead><tbody>
553
+ <tr><td><code><!-- path --></code></td><td>EDIT</td><td><!-- notes --></td></tr>
554
+ </tbody></table>
555
+ </div>
556
+ <div class="phase-sub"><h4>&#9989; Acceptance</h4><ul><li><!-- criterion --></li></ul></div>
557
+ <div class="phase-meta-row">
558
+ <div class="phase-meta-block"><strong>Dependencies</strong><br/><span class="meta-val">Phase A</span></div>
559
+ <div class="phase-meta-block"><strong>Risks</strong><br/><span class="meta-val"><!-- none --></span></div>
560
+ <div class="phase-meta-block"><strong>Voice-stamps</strong><br/><span class="meta-val"><!-- TN --></span></div>
561
+ <div class="phase-meta-block"><strong>PR scope</strong><br/><span class="meta-val">1 PR</span></div>
562
+ </div>
563
+ <div class="lockin">
564
+ <div class="lockin-title">Phase B — approve to dispatch</div>
565
+ <div class="lockin-radios">
566
+ <label><input type="radio" name="pB" value="lock"> LOCK + dispatch</label>
567
+ <label><input type="radio" name="pB" value="revise"> REVISE</label>
568
+ <label><input type="radio" name="pB" value="hold"> HOLD</label>
569
+ <label><input type="radio" name="pB" value="drop"> DROP</label>
570
+ </div>
571
+ <textarea placeholder="Notes"></textarea>
572
+ </div>
573
+ </div>
574
+ </div>
575
+
576
+ <!-- ── t1-pC ── -->
577
+ <div class="subpanel" id="t1-pC">
578
+ <div class="phase-card phase-medium">
579
+ <div class="phase-head">
580
+ <div class="phase-id">Phase C</div>
581
+ <div class="phase-title"><!-- title --></div>
582
+ <div class="phase-tags"><span class="pill p-white">&#9898; backlog</span></div>
583
+ </div>
584
+ <div class="phase-sub"><h4>&#127919; Goal</h4><p><!-- goal --></p></div>
585
+ <div class="phase-sub">
586
+ <h4>&#128203; Scope</h4>
587
+ <ol><li><strong><!-- task --></strong>: <!-- detail --></li></ol>
588
+ </div>
589
+ <div class="phase-sub"><h4>&#9989; Acceptance</h4><ul><li><!-- criterion --></li></ul></div>
590
+ <div class="lockin">
591
+ <div class="lockin-title">Phase C — approve to dispatch</div>
592
+ <div class="lockin-radios">
593
+ <label><input type="radio" name="pC" value="lock"> LOCK + dispatch</label>
594
+ <label><input type="radio" name="pC" value="revise"> REVISE</label>
595
+ <label><input type="radio" name="pC" value="hold"> HOLD</label>
596
+ <label><input type="radio" name="pC" value="drop"> DROP</label>
597
+ </div>
598
+ <textarea placeholder="Notes"></textarea>
599
+ </div>
600
+ </div>
601
+ </div>
602
+
603
+ <!-- ── t1-pD ── -->
604
+ <div class="subpanel" id="t1-pD">
605
+ <div class="phase-card phase-medium">
606
+ <div class="phase-head">
607
+ <div class="phase-id">Phase D</div>
608
+ <div class="phase-title"><!-- title --></div>
609
+ <div class="phase-tags"><span class="pill p-white">&#9898; backlog</span></div>
610
+ </div>
611
+ <div class="phase-sub"><h4>&#127919; Goal</h4><p><!-- goal --></p></div>
612
+ <div class="phase-sub">
613
+ <h4>&#128203; Scope</h4>
614
+ <ol><li><strong><!-- task --></strong>: <!-- detail --></li></ol>
615
+ </div>
616
+ <div class="phase-sub"><h4>&#9989; Acceptance</h4><ul><li><!-- criterion --></li></ul></div>
617
+ <div class="lockin">
618
+ <div class="lockin-title">Phase D — approve to dispatch</div>
619
+ <div class="lockin-radios">
620
+ <label><input type="radio" name="pD" value="lock"> LOCK + dispatch</label>
621
+ <label><input type="radio" name="pD" value="revise"> REVISE</label>
622
+ <label><input type="radio" name="pD" value="hold"> HOLD</label>
623
+ <label><input type="radio" name="pD" value="drop"> DROP</label>
624
+ </div>
625
+ <textarea placeholder="Notes"></textarea>
626
+ </div>
627
+ </div>
628
+ </div>
629
+
630
+ <!-- ── t1-pE ── -->
631
+ <div class="subpanel" id="t1-pE">
632
+ <div class="phase-card phase-arch">
633
+ <div class="phase-head">
634
+ <div class="phase-id">Phase E</div>
635
+ <div class="phase-title"><!-- title — typically final merge / squash --></div>
636
+ <div class="phase-tags">
637
+ <span class="pill p-white">&#9898; backlog</span>
638
+ <span class="pill p-yellow">arch</span>
639
+ </div>
640
+ </div>
641
+ <div class="phase-sub"><h4>&#127919; Goal</h4><p><!-- final merge / integration goal --></p></div>
642
+ <div class="phase-sub">
643
+ <h4>&#128203; Scope</h4>
644
+ <ol><li><strong><!-- task --></strong>: <!-- detail --></li></ol>
645
+ </div>
646
+ <div class="phase-sub"><h4>&#9989; Acceptance</h4><ul><li><!-- criterion --></li></ul></div>
647
+ <div class="lockin" style="border-left:4px solid var(--m);background:linear-gradient(135deg,rgba(240,171,252,0.08) 0%,var(--surf-e) 100%);">
648
+ <div class="lockin-title" style="color:var(--m);">Phase E / Final — squash-merge trigger</div>
649
+ <div class="lockin-radios">
650
+ <label><input type="radio" name="pE" value="defer"> DEFER (await dogfood)</label>
651
+ <label><input type="radio" name="pE" value="squash"> SQUASH NOW</label>
652
+ <label><input type="radio" name="pE" value="another-wave"> NEXT WAVE first</label>
653
+ </div>
654
+ <textarea placeholder="Final notes"></textarea>
655
+ </div>
656
+ </div>
657
+ </div>
658
+
659
+ <!-- ── t1-drift ── -->
660
+ <div class="subpanel" id="t1-drift">
661
+ <div class="section">
662
+ <h3>Drift Audit — spec vs implementation gaps</h3>
663
+ <p class="sub">List findings where implementation drifted from the design. Each item has an ID, body, and resolution plan.</p>
664
+
665
+ <!--
666
+ Fill with drift items found during code review / dogfood.
667
+ Example:
668
+ <div class="drift">
669
+ <div class="drift-id">DRIFT-01 · HIGH</div>
670
+ <div class="drift-body">SKILL.md §4 BoM lists assemble-meta.ts but scripts/ still has the old inline Python heredoc in fetch.sh.</div>
671
+ <div class="drift-fix">Remove heredoc from fetch.sh. Wire assemble-meta.ts invocation per BoM spec.</div>
672
+ </div>
673
+ -->
674
+ <div class="drift">
675
+ <div class="drift-id">DRIFT-01 · <!-- severity --></div>
676
+ <div class="drift-body"><!-- description --></div>
677
+ <div class="drift-fix"><!-- resolution --></div>
678
+ </div>
679
+
680
+ <div class="rationale"><strong>How to fill:</strong> After each phase PR lands, do a diff-to-spec pass (compare files-touched vs SKILL.md §4 BoM + §5 agents + §3 architecture). Log every mismatch here. Resolved items get <code>.oq.resolved-oq</code> treatment when fixed.</div>
681
+ </div>
682
+ </div>
683
+
684
+ <!-- ── t1-oq ── -->
685
+ <div class="subpanel" id="t1-oq">
686
+ <div class="section">
687
+ <h3>Open Questions</h3>
688
+ <p class="sub">Decisions pending operator input or additional evidence. Resolved items get a green border; leave the OQ for audit trail.</p>
689
+
690
+ <!--
691
+ Unresolved OQ:
692
+ <div class="oq">
693
+ <div class="oq-id">OQ-01 · open</div>
694
+ <div class="oq-body">Should PR-024 (portability principle) apply retroactively to existing scripts or only new code?</div>
695
+ </div>
696
+
697
+ Resolved OQ:
698
+ <div class="oq resolved-oq">
699
+ <div class="oq-id">OQ-01 · RESOLVED</div>
700
+ <div class="oq-body">Applies to new code only. Existing scripts addressed in next refactor wave.</div>
701
+ </div>
702
+ -->
703
+ <div class="oq">
704
+ <div class="oq-id">OQ-01 · open</div>
705
+ <div class="oq-body"><!-- question body --></div>
706
+ </div>
707
+
708
+ <div class="delta"><strong>How to fill:</strong> Add an OQ whenever a decision fork comes up during implementation. Reference by ID in phase cards. Once resolved, flip class to <code>resolved-oq</code> and fill in resolution body.</div>
709
+ </div>
710
+ </div>
711
+
712
+ <!-- ── t1-lockin ── -->
713
+ <div class="subpanel" id="t1-lockin">
714
+ <div class="section">
715
+ <h3>Lockin / Wave Decisions</h3>
716
+ <p class="sub">Summary of all wave-level decisions locked in so far. Use the "Copy Decisions" button to export as markdown for the orchestrator.</p>
717
+
718
+ <table>
719
+ <thead><tr><th width="15%">ID</th><th width="30%">Decision</th><th width="20%">Choice</th><th width="35%">Rationale</th></tr></thead>
720
+ <tbody>
721
+ <tr><td><code>DEC-01</code></td><td><!-- what was decided --></td><td><span class="pill p-green"><!-- locked --></span></td><td><!-- why --></td></tr>
722
+ <tr><td><code>DEC-02</code></td><td><!-- decision --></td><td><span class="pill p-yellow"><!-- pending --></span></td><td><!-- rationale --></td></tr>
723
+ </tbody>
724
+ </table>
725
+
726
+ <!-- Wave final lock-in -->
727
+ <div class="lockin" style="margin-top:32px;">
728
+ <div class="lockin-title">Wave {{WAVE_N}} — final wave-level decision</div>
729
+ <div class="lockin-radios">
730
+ <label><input type="radio" name="wave-final" value="proceed"> PROCEED to next wave</label>
731
+ <label><input type="radio" name="wave-final" value="rework"> REWORK (see OQs)</label>
732
+ <label><input type="radio" name="wave-final" value="hold"> HOLD (awaiting dogfood)</label>
733
+ </div>
734
+ <textarea placeholder="Wave-level notes for orchestrator"></textarea>
735
+ </div>
736
+ </div>
737
+ </div>
738
+
739
+ </section><!-- end t1 -->
740
+
741
+
742
+ <!-- ══════════════════════════════════════════════════════════════════
743
+ TAB ② — SKILL OVERVIEW
744
+ Sub-tabs: §0 Setup · §1 Triggers · §3 Architecture · §4 BoM · §5 Agents
745
+ §6 References · §7 Config · §8 Design Principles · §9 Failure Taxonomy
746
+ ══════════════════════════════════════════════════════════════════ -->
747
+ <section class="panel" id="t2">
748
+
749
+ <nav class="subtabs" id="subtabs-t2">
750
+ <button data-subtab="t2-s0" class="active">§0 Setup</button>
751
+ <button data-subtab="t2-s1">§1 Triggers</button>
752
+ <button data-subtab="t2-s3">§3 Architecture</button>
753
+ <button data-subtab="t2-s4">§4 Bill of Materials</button>
754
+ <button data-subtab="t2-s5">§5 Agents</button>
755
+ <button data-subtab="t2-s6">§6 References</button>
756
+ <button data-subtab="t2-s7">§7 Config</button>
757
+ <button data-subtab="t2-s8">§8 Design Principles &#11088;</button>
758
+ <button data-subtab="t2-s9">§9 Failure Taxonomy</button>
759
+ </nav>
760
+
761
+ <!-- ── §0 Setup ── -->
762
+ <div class="subpanel active" id="t2-s0">
763
+ <div class="section">
764
+ <h2>&#9312; Setup Detection (§0)</h2>
765
+ <p class="sub">
766
+ <!--
767
+ Fill: 1-2 sentences describing what §0 does.
768
+ Source: SKILL.md §0 + references/workflows/onboarding.md
769
+ Content to include:
770
+ - Branch decision flowchart (div.mermaid with config present vs missing paths)
771
+ - Onboarding outputs table
772
+ - Key design decision rationale
773
+ -->
774
+ <!-- {{section_0_subtitle}} — e.g. "Detects whether {{SKILL_NAME}} is configured; auto-generates config if missing." -->
775
+ </p>
776
+
777
+ <!-- {{section_0_content}} — replace this comment with actual §0 content -->
778
+
779
+ <!-- Example flowchart placeholder:
780
+ <div class="mermaid">
781
+ flowchart TD
782
+ START([Skill invoked]) - ->|check| CONFIG{.mutagentrc exists?}
783
+ CONFIG - ->|yes| LOAD[Load config]
784
+ CONFIG - ->|no| ONBOARD[Run onboarding workflow]
785
+ LOAD - -> RUN[Run diagnostics]
786
+ ONBOARD - -> RUN
787
+ </div>
788
+ -->
789
+
790
+ <div class="rationale"><strong>Fill from:</strong> SKILL.md §0 + <code>references/workflows/onboarding.md</code>. Replace this rationale block with actual design decision context.</div>
791
+ </div>
792
+ </div>
793
+
794
+ <!-- ── §1 Triggers ── -->
795
+ <div class="subpanel" id="t2-s1">
796
+ <div class="section">
797
+ <h2>&#9313; Triggers (§1)</h2>
798
+ <p class="sub"><!-- {{section_1_subtitle}} — source: SKILL.md §1 --></p>
799
+ <!--
800
+ Content:
801
+ - Natural-language trigger phrases table (phrase → maps-to)
802
+ - Bootstrap / install command (pre block)
803
+ - Rationale for multiple phrasings (.rationale)
804
+ -->
805
+ <table>
806
+ <thead><tr><th width="40%">Trigger phrase</th><th width="30%">Maps to</th><th width="30%">Notes</th></tr></thead>
807
+ <tbody>
808
+ <tr><td><!-- "run diagnostics" --></td><td><!-- skill invocation --></td><td><!-- --></td></tr>
809
+ <tr><td><!-- "diagnose skill" --></td><td><!-- skill invocation --></td><td><!-- --></td></tr>
810
+ </tbody>
811
+ </table>
812
+ <div class="rationale"><strong>Fill from:</strong> SKILL.md §1. Add every trigger phrase with its canonical invocation form.</div>
813
+ </div>
814
+ </div>
815
+
816
+ <!-- ── §3 Architecture ── -->
817
+ <div class="subpanel" id="t2-s3">
818
+ <div class="section">
819
+ <h2>&#9314; Architecture Overview (§3)</h2>
820
+ <p class="sub"><!-- {{section_3_subtitle}} — source: SKILL.md §3 + references/reference.md --></p>
821
+ <!--
822
+ Content:
823
+ - Top-level flowchart (div.mermaid)
824
+ - Where-each-stage-runs table (Stage | Runs in | Owner)
825
+ - Token cost / design notes (.delta)
826
+ -->
827
+
828
+ <!-- Example architecture flowchart placeholder:
829
+ <div class="mermaid">
830
+ flowchart LR
831
+ CLI[CLI invocation] - -> SETUP[§0 Setup]
832
+ SETUP - -> SLICER[slicer.ts]
833
+ SLICER - -> TIER0[tier0-scan.ts]
834
+ TIER0 - -> ANALYZER[diagnostics-analyzer agent]
835
+ ANALYZER - -> RENDER[render.ts]
836
+ RENDER - -> REPORT[report.html]
837
+ </div>
838
+ -->
839
+
840
+ <table>
841
+ <thead><tr><th width="25%">Stage</th><th width="30%">Runs in</th><th width="25%">Owner</th><th width="20%">Notes</th></tr></thead>
842
+ <tbody>
843
+ <tr><td><!-- Stage --></td><td><!-- context --></td><td><!-- owner --></td><td><!-- notes --></td></tr>
844
+ </tbody>
845
+ </table>
846
+ <div class="rationale"><strong>Fill from:</strong> SKILL.md §3 + <code>references/reference.md</code>.</div>
847
+ </div>
848
+ </div>
849
+
850
+ <!-- ── §4 Bill of Materials ── -->
851
+ <div class="subpanel" id="t2-s4">
852
+ <div class="section">
853
+ <h2>&#9315; Bill of Materials — scripts/ (§4)</h2>
854
+ <p class="sub"><!-- {{section_4_subtitle}} — source: SKILL.md §4 + scripts/ directory --></p>
855
+ <!--
856
+ Content:
857
+ - Scripts inventory table (Script | Purpose | Invoked by)
858
+ - Dispatch contract (pre block: how scripts are invoked by run.sh)
859
+ - .rationale on design choice for the dispatch pattern
860
+ -->
861
+ <table>
862
+ <thead><tr><th width="35%">Script</th><th width="40%">Purpose</th><th width="25%">Invoked by</th></tr></thead>
863
+ <tbody>
864
+ <tr><td><code>scripts/cli/run.sh</code></td><td><!-- entry point --></td><td><!-- skill caller --></td></tr>
865
+ <tr><td><code>scripts/slicer.ts</code></td><td><!-- purpose --></td><td><code>run.sh</code></td></tr>
866
+ <tr><td><code>scripts/tier0/tier0-scan.ts</code></td><td><!-- purpose --></td><td><code>run.sh</code></td></tr>
867
+ <tr><td><code>scripts/report/render.ts</code></td><td><!-- purpose --></td><td><code>run.sh</code></td></tr>
868
+ </tbody>
869
+ </table>
870
+ <div class="rationale"><strong>Fill from:</strong> SKILL.md §4. List every entry-point script + sub-scripts. Include the <code>run.sh</code> dispatch contract as a <code>&lt;pre&gt;</code> block.</div>
871
+ </div>
872
+ </div>
873
+
874
+ <!-- ── §5 Agents ── -->
875
+ <div class="subpanel" id="t2-s5">
876
+ <div class="section">
877
+ <h2>&#9316; Agents — assets/agents/ (§5)</h2>
878
+ <p class="sub"><!-- {{section_5_subtitle}} — source: SKILL.md §5 + assets/agents/ --></p>
879
+ <!--
880
+ Content:
881
+ - Agent roster table (Agent | Class | Dispatched by | Purpose)
882
+ - Capability constraints (.rationale)
883
+ - Retired agents and why (.delta or .resolved)
884
+ -->
885
+ <table>
886
+ <thead><tr><th width="30%">Agent</th><th width="15%">Class</th><th width="20%">Dispatched by</th><th width="35%">Purpose</th></tr></thead>
887
+ <tbody>
888
+ <tr><td><code>diagnostics-analyzer.md</code></td><td><!-- actor --></td><td><code>run.sh</code></td><td><!-- purpose --></td></tr>
889
+ <tr><td><code>diagnostics-apply-worker.md</code></td><td><!-- actor --></td><td><code>run.sh</code></td><td><!-- purpose --></td></tr>
890
+ </tbody>
891
+ </table>
892
+ <div class="rationale"><strong>Fill from:</strong> SKILL.md §5 + <code>assets/agents/</code> directory. Document capability constraints (what agents can/cannot do) and rationale.</div>
893
+ </div>
894
+ </div>
895
+
896
+ <!-- ── §6 References ── -->
897
+ <div class="subpanel" id="t2-s6">
898
+ <div class="section">
899
+ <h2>&#9317; References — references/ (§6)</h2>
900
+ <p class="sub"><!-- {{section_6_subtitle}} — source: SKILL.md §6 + references/ directory --></p>
901
+ <!--
902
+ Content:
903
+ - .tree block showing the references/ directory structure
904
+ - Progressive disclosure rationale (.rationale)
905
+ - Note about internal/ being stripped on publish
906
+ -->
907
+ <div class="tree"><!-- {{references_tree}} — paste tree output of references/ directory here
908
+ references/
909
+ ├─ <b>reference.md</b> <em>master index + architecture overview</em>
910
+ ├─ <b>principles.md</b> <em>design principles PR-001..PR-0NN (source of truth)</em>
911
+ ├─ <b>config.md</b> <em>configuration reference</em>
912
+ ├─ <i>workflows/</i>
913
+ │ ├─ <b>onboarding.md</b>
914
+ │ ├─ <b>diagnostics.md</b>
915
+ │ ├─ <b>orchestrator-protocol.md</b>
916
+ │ ├─ <b>apply-dispatch.md</b>
917
+ │ ├─ <b>apply-pr-comment-format.md</b>
918
+ │ └─ <b>rca.md</b>
919
+ └─ <i>internal/</i> <em>NOT SHIPPED — stripped on publish</em></div>
920
+
921
+ <div class="rationale"><strong>Progressive disclosure:</strong> Agents load only what they need. SKILL.md §6 lists which references are loaded at which stage. Do not flatten into a single doc.</div>
922
+ </div>
923
+ </div>
924
+
925
+ <!-- ── §7 Config ── -->
926
+ <div class="subpanel" id="t2-s7">
927
+ <div class="section">
928
+ <h2>&#9318; Config (§7)</h2>
929
+ <p class="sub"><!-- {{section_7_subtitle}} — source: SKILL.md §7 + references/config.md + scripts/config/schema.ts --></p>
930
+ <!--
931
+ Content:
932
+ - Key config fields table (Field | Type | Default | Purpose)
933
+ - Example .mutagentrc snippet (pre block)
934
+ - Schema source-of-truth callout (.rationale)
935
+ -->
936
+ <table>
937
+ <thead><tr><th width="25%">Field</th><th width="15%">Type</th><th width="20%">Default</th><th width="40%">Purpose</th></tr></thead>
938
+ <tbody>
939
+ <tr><td><code><!-- field --></code></td><td><!-- type --></td><td><code><!-- default --></code></td><td><!-- purpose --></td></tr>
940
+ </tbody>
941
+ </table>
942
+ <div class="rationale"><strong>Source of truth:</strong> <code>scripts/config/schema.ts</code>. The config reference doc (<code>references/config.md</code>) must match the schema. The template (<code>assets/templates/config.yaml.tpl</code>) must match both.</div>
943
+ </div>
944
+ </div>
945
+
946
+ <!-- ── §8 Design Principles ── -->
947
+ <div class="subpanel" id="t2-s8">
948
+ <div class="section">
949
+ <h2>&#9319; Design Principles (§8) &#11088;</h2>
950
+ <p class="sub">PR-001 through PR-023 are current (source of truth: <code>references/principles.md</code>). PR-024+ are proposed additions from iter-12 review — pending formal write-up + adoption.</p>
951
+
952
+ <div class="delta"><strong>Proposed for iter-12:</strong> PR-024 (portability) · PR-025 (renderer-smoke-test) · PR-026 (cross-platform install). See the <code>principle.proposed</code> cards below. These are NOT yet in <code>references/principles.md</code>.</div>
953
+
954
+ <!-- PR-001 through PR-023 — current, locked -->
955
+ <!--
956
+ Fill each .principle card from references/principles.md.
957
+ Structure:
958
+ .pid PR-NNN
959
+ .pt Title
960
+ .pb Body / enforcement guidance (1-3 sentences)
961
+ -->
962
+
963
+ <h4>Current Principles — PR-001 through PR-023</h4>
964
+
965
+ <div class="principle">
966
+ <div class="pid">PR-001</div>
967
+ <div class="pt"><!-- title --></div>
968
+ <div class="pb"><!-- body — fill from references/principles.md --></div>
969
+ </div>
970
+
971
+ <div class="principle">
972
+ <div class="pid">PR-002</div>
973
+ <div class="pt"><!-- title --></div>
974
+ <div class="pb"><!-- body --></div>
975
+ </div>
976
+
977
+ <div class="principle">
978
+ <div class="pid">PR-003</div>
979
+ <div class="pt"><!-- title --></div>
980
+ <div class="pb"><!-- body --></div>
981
+ </div>
982
+
983
+ <div class="principle">
984
+ <div class="pid">PR-004</div>
985
+ <div class="pt"><!-- title --></div>
986
+ <div class="pb"><!-- body --></div>
987
+ </div>
988
+
989
+ <div class="principle">
990
+ <div class="pid">PR-005</div>
991
+ <div class="pt"><!-- title --></div>
992
+ <div class="pb"><!-- body --></div>
993
+ </div>
994
+
995
+ <div class="principle">
996
+ <div class="pid">PR-006</div>
997
+ <div class="pt"><!-- title --></div>
998
+ <div class="pb"><!-- body --></div>
999
+ </div>
1000
+
1001
+ <div class="principle">
1002
+ <div class="pid">PR-007</div>
1003
+ <div class="pt"><!-- title --></div>
1004
+ <div class="pb"><!-- body --></div>
1005
+ </div>
1006
+
1007
+ <div class="principle">
1008
+ <div class="pid">PR-008</div>
1009
+ <div class="pt"><!-- title --></div>
1010
+ <div class="pb"><!-- body --></div>
1011
+ </div>
1012
+
1013
+ <div class="principle">
1014
+ <div class="pid">PR-009</div>
1015
+ <div class="pt"><!-- title --></div>
1016
+ <div class="pb"><!-- body --></div>
1017
+ </div>
1018
+
1019
+ <div class="principle">
1020
+ <div class="pid">PR-010</div>
1021
+ <div class="pt"><!-- title --></div>
1022
+ <div class="pb"><!-- body --></div>
1023
+ </div>
1024
+
1025
+ <div class="principle">
1026
+ <div class="pid">PR-011</div>
1027
+ <div class="pt"><!-- title --></div>
1028
+ <div class="pb"><!-- body --></div>
1029
+ </div>
1030
+
1031
+ <div class="principle">
1032
+ <div class="pid">PR-012</div>
1033
+ <div class="pt"><!-- title --></div>
1034
+ <div class="pb"><!-- body --></div>
1035
+ </div>
1036
+
1037
+ <div class="principle">
1038
+ <div class="pid">PR-013</div>
1039
+ <div class="pt"><!-- title --></div>
1040
+ <div class="pb"><!-- body --></div>
1041
+ </div>
1042
+
1043
+ <div class="principle">
1044
+ <div class="pid">PR-014</div>
1045
+ <div class="pt"><!-- title --></div>
1046
+ <div class="pb"><!-- body --></div>
1047
+ </div>
1048
+
1049
+ <div class="principle">
1050
+ <div class="pid">PR-015</div>
1051
+ <div class="pt"><!-- title --></div>
1052
+ <div class="pb"><!-- body --></div>
1053
+ </div>
1054
+
1055
+ <div class="principle">
1056
+ <div class="pid">PR-016</div>
1057
+ <div class="pt"><!-- title --></div>
1058
+ <div class="pb"><!-- body --></div>
1059
+ </div>
1060
+
1061
+ <div class="principle">
1062
+ <div class="pid">PR-017</div>
1063
+ <div class="pt"><!-- title --></div>
1064
+ <div class="pb"><!-- body --></div>
1065
+ </div>
1066
+
1067
+ <div class="principle">
1068
+ <div class="pid">PR-018</div>
1069
+ <div class="pt"><!-- title --></div>
1070
+ <div class="pb"><!-- body --></div>
1071
+ </div>
1072
+
1073
+ <div class="principle">
1074
+ <div class="pid">PR-019</div>
1075
+ <div class="pt">No inline Python heredocs</div>
1076
+ <div class="pb">Shell scripts MUST NOT embed Python via heredoc. Extract to <code>scripts/*.ts</code> and invoke via <code>bun run</code>. Violations caught by PR-019 lint gate.</div>
1077
+ </div>
1078
+
1079
+ <div class="principle">
1080
+ <div class="pid">PR-020</div>
1081
+ <div class="pt"><!-- title --></div>
1082
+ <div class="pb"><!-- body --></div>
1083
+ </div>
1084
+
1085
+ <div class="principle">
1086
+ <div class="pid">PR-021</div>
1087
+ <div class="pt"><!-- title --></div>
1088
+ <div class="pb"><!-- body --></div>
1089
+ </div>
1090
+
1091
+ <div class="principle">
1092
+ <div class="pid">PR-022</div>
1093
+ <div class="pt"><!-- title --></div>
1094
+ <div class="pb"><!-- body --></div>
1095
+ </div>
1096
+
1097
+ <div class="principle">
1098
+ <div class="pid">PR-023</div>
1099
+ <div class="pt"><!-- title --></div>
1100
+ <div class="pb"><!-- body --></div>
1101
+ </div>
1102
+
1103
+ <!-- Proposed PR-024+ — proposed from iter-12, NOT yet in principles.md -->
1104
+ <h4 style="margin-top:32px;color:var(--c);">Proposed Principles — PR-024+ (iter-12 proposal, not yet adopted)</h4>
1105
+ <div class="resolved"><strong>Note:</strong> These are hypotheses surfaced during Wave-{{WAVE_N}} review. They need a formal write-up + operator approval before being written to <code>references/principles.md</code>. Audit Matrix tab §8 cross-links here.</div>
1106
+
1107
+ <div class="principle proposed">
1108
+ <div class="pid">PR-024 · proposed</div>
1109
+ <div class="pt">Portability — no hard-coded absolute paths in scripts</div>
1110
+ <div class="pb">Scripts MUST NOT hard-code absolute paths. All paths are derived from runtime variables (<code>$SKILL_ROOT</code>, <code>$CWD</code>, etc.) or config entries. Enables moving skill between machines and clones without edits.</div>
1111
+ </div>
1112
+
1113
+ <div class="principle proposed">
1114
+ <div class="pid">PR-025 · proposed</div>
1115
+ <div class="pt">Renderer smoke-test — <code>report.html.tpl</code> must have a companion smoke test</div>
1116
+ <div class="pb">Any change to <code>assets/templates/report.html.tpl</code> requires a companion smoke test that renders the template with minimal fixture data and asserts no JS errors + expected heading text. Prevents silent template regressions.</div>
1117
+ </div>
1118
+
1119
+ <div class="principle proposed">
1120
+ <div class="pid">PR-026 · proposed</div>
1121
+ <div class="pt">Cross-platform install — macOS + Linux parity</div>
1122
+ <div class="pb">All setup scripts MUST test on both macOS (bash 3.2) and Linux (bash 5.x). Bash 3.2 compatibility gates: no <code>declare -A</code>, no <code>[[</code> regex with ERE, no <code>EPOCHSECONDS</code>. CI matrix MUST include both targets.</div>
1123
+ </div>
1124
+
1125
+ <div class="rationale"><strong>How to promote a proposed principle:</strong> (1) draft formal write-up with concrete enforcement rule + CI gate, (2) operator approves via lockin widget, (3) write to <code>references/principles.md</code>, (4) flip card class from <code>.proposed</code> to current.</div>
1126
+ </div>
1127
+ </div>
1128
+
1129
+ <!-- ── §9 Failure Taxonomy ── -->
1130
+ <div class="subpanel" id="t2-s9">
1131
+ <div class="section">
1132
+ <h2>&#9320; Failure Taxonomy (§9)</h2>
1133
+ <p class="sub"><!-- {{section_9_subtitle}} — source: SKILL.md §9 + references/workflows/rca.md --></p>
1134
+ <!--
1135
+ Content:
1136
+ - 3-axis taxonomy description
1137
+ - Tax-card grid (one card per axis: Surface · Layer · Severity)
1138
+ - Cross-link to rca.md
1139
+ -->
1140
+ <div class="three-col">
1141
+ <div class="tax-card">
1142
+ <h4>Axis 1 — Surface</h4>
1143
+ <ul>
1144
+ <li><!-- surface-1 --></li>
1145
+ <li><!-- surface-2 --></li>
1146
+ <li><!-- surface-3 --></li>
1147
+ </ul>
1148
+ </div>
1149
+ <div class="tax-card">
1150
+ <h4>Axis 2 — Layer</h4>
1151
+ <ul>
1152
+ <li><!-- layer-1 --></li>
1153
+ <li><!-- layer-2 --></li>
1154
+ <li><!-- layer-3 --></li>
1155
+ </ul>
1156
+ </div>
1157
+ <div class="tax-card">
1158
+ <h4>Axis 3 — Severity</h4>
1159
+ <ul>
1160
+ <li><!-- severity-1 --></li>
1161
+ <li><!-- severity-2 --></li>
1162
+ <li><!-- severity-3 --></li>
1163
+ </ul>
1164
+ </div>
1165
+ </div>
1166
+ <div class="rationale"><strong>Fill from:</strong> SKILL.md §9 + <code>references/workflows/rca.md</code>. The 3-axis taxonomy is the source of truth for failure categorization. All report.html.tpl badges derive from this taxonomy.</div>
1167
+ </div>
1168
+ </div>
1169
+
1170
+ </section><!-- end t2 -->
1171
+
1172
+
1173
+ <!-- ══════════════════════════════════════════════════════════════════
1174
+ TAB ③ — AUDIT MATRIX
1175
+ Sub-tabs: Success Criteria Matrix · Skill Context Map · Audit Timeline · Design Principles Audit
1176
+ ══════════════════════════════════════════════════════════════════ -->
1177
+ <section class="panel" id="t3">
1178
+
1179
+ <nav class="subtabs" id="subtabs-t3">
1180
+ <button data-subtab="t3-matrix" class="active">Success Criteria Matrix</button>
1181
+ <button data-subtab="t3-context">Skill Context Map</button>
1182
+ <button data-subtab="t3-timeline">Audit Timeline</button>
1183
+ <button data-subtab="t3-principles">Design Principles Audit</button>
1184
+ </nav>
1185
+
1186
+ <!-- ── Success Criteria Matrix ── -->
1187
+ <div class="subpanel active" id="t3-matrix">
1188
+ <div class="section">
1189
+ <h3>&#128202; Success Criteria Matrix</h3>
1190
+ <p class="sub">Fill the <strong>Evidence</strong> column as transcripts arrive. Update the pill class to flip status. Group rows by functional area.</p>
1191
+
1192
+ <div class="resolved"><strong>Pill flow:</strong> &#9898; <code>p-white</code> awaits-evidence &rarr; &#127761; <code>p-yellow</code> awaits-dogfood &rarr; &#128309; <code>p-blue</code> unit-tested &rarr; &#128994; <code>p-green</code> verified &rarr; &#128308; <code>p-red</code> failed</div>
1193
+
1194
+ <h4>&#128682; Area — Core Functionality</h4>
1195
+ <table class="matrix">
1196
+ <thead><tr>
1197
+ <th width="22%">Feature</th>
1198
+ <th width="20%">Verification method</th>
1199
+ <th width="11%">Status</th>
1200
+ <th width="30%">Evidence</th>
1201
+ <th width="17%">Where</th>
1202
+ </tr></thead>
1203
+ <tbody>
1204
+ <tr>
1205
+ <td><strong><!-- Feature name --></strong></td>
1206
+ <td><!-- how verified --></td>
1207
+ <td><span class="pill p-white">&#9898; evidence</span></td>
1208
+ <td><em>awaits transcript</em></td>
1209
+ <td><code><!-- path --></code></td>
1210
+ </tr>
1211
+ <tr>
1212
+ <td><strong><!-- Feature name --></strong></td>
1213
+ <td><!-- how verified --></td>
1214
+ <td><span class="pill p-yellow">&#127761; dogfood</span></td>
1215
+ <td><em>awaits dogfood run</em></td>
1216
+ <td><code><!-- path --></code></td>
1217
+ </tr>
1218
+ </tbody>
1219
+ </table>
1220
+
1221
+ <h4>&#128269; Area — Agents</h4>
1222
+ <table class="matrix">
1223
+ <thead><tr>
1224
+ <th width="22%">Feature</th>
1225
+ <th width="20%">Verification</th>
1226
+ <th width="11%">Status</th>
1227
+ <th width="30%">Evidence</th>
1228
+ <th width="17%">Where</th>
1229
+ </tr></thead>
1230
+ <tbody>
1231
+ <tr>
1232
+ <td><strong><!-- Feature --></strong></td>
1233
+ <td><!-- method --></td>
1234
+ <td><span class="pill p-white">&#9898; evidence</span></td>
1235
+ <td><em>requires real-world trigger</em></td>
1236
+ <td><code><!-- path --></code></td>
1237
+ </tr>
1238
+ </tbody>
1239
+ </table>
1240
+
1241
+ <h4>&#127981; Area — Configuration</h4>
1242
+ <table class="matrix">
1243
+ <thead><tr>
1244
+ <th width="22%">Feature</th>
1245
+ <th width="20%">Verification</th>
1246
+ <th width="11%">Status</th>
1247
+ <th width="30%">Evidence</th>
1248
+ <th width="17%">Where</th>
1249
+ </tr></thead>
1250
+ <tbody>
1251
+ <tr>
1252
+ <td><strong><!-- Feature --></strong></td>
1253
+ <td><!-- method --></td>
1254
+ <td><span class="pill p-white">&#9898; evidence</span></td>
1255
+ <td><em>awaits config test</em></td>
1256
+ <td><code><!-- path --></code></td>
1257
+ </tr>
1258
+ </tbody>
1259
+ </table>
1260
+
1261
+ <div class="rationale"><strong>How to update:</strong> when evidence arrives, (a) replace <code>&lt;em&gt;awaits...&lt;/em&gt;</code> with actual evidence (transcript in <code>&lt;details&gt;</code>, PR link, screenshot ref), (b) swap pill class. Add a new <code>&lt;h4&gt;</code> + <code>&lt;table&gt;</code> per functional area.</div>
1262
+ </div>
1263
+ </div>
1264
+
1265
+ <!-- ── Skill Context Map ── -->
1266
+ <div class="subpanel" id="t3-context">
1267
+ <div class="section">
1268
+ <h3>&#127760; Skill Context Map</h3>
1269
+ <p class="sub">Mermaid diagram showing how agents, scripts, templates, and references connect at runtime.</p>
1270
+
1271
+ <!--
1272
+ Fill with a Mermaid flowchart or sequenceDiagram showing the skill's
1273
+ runtime information flow. Example (replace with actual skill graph):
1274
+ -->
1275
+ <div class="mermaid">
1276
+ %%{init: {'theme':'dark'}}%%
1277
+ flowchart LR
1278
+ CLI([CLI invocation]) --> SETUP[Setup §0\ndetect.ts]
1279
+ SETUP -->|config ok| SLICER[slicer.ts\nslice findings]
1280
+ SLICER --> TIER0[tier0-scan.ts\nquick surface scan]
1281
+ TIER0 --> DISPATCH[run.sh\ndispatch analyzer]
1282
+ DISPATCH --> ANALYZER[diagnostics-analyzer\nsub-agent]
1283
+ ANALYZER --> RENDER[render.ts\nbuild report]
1284
+ RENDER --> REPORT[report.html\ndelivered to user]
1285
+
1286
+ DISPATCH --> APPLYWORKER[apply-worker\nsub-agent]
1287
+ APPLYWORKER -->|PRs| GH[GitHub PRs]
1288
+
1289
+ classDef script fill:#1c1c2a,stroke:#06b6d4,color:#f5f5f9;
1290
+ classDef agent fill:#1c1c2a,stroke:#a78bfa,color:#f5f5f9;
1291
+ classDef output fill:#1c1c2a,stroke:#10b981,color:#f5f5f9;
1292
+ class SLICER,TIER0,RENDER script;
1293
+ class ANALYZER,APPLYWORKER agent;
1294
+ class REPORT,GH output;
1295
+ </div>
1296
+
1297
+ <div class="rationale"><strong>How to fill:</strong> Replace the placeholder flowchart above with the actual runtime context map for Wave-{{WAVE_N}}. Colour classes: <code>script</code> (cyan), <code>agent</code> (purple), <code>output</code> (green).</div>
1298
+ </div>
1299
+ </div>
1300
+
1301
+ <!-- ── Audit Timeline ── -->
1302
+ <div class="subpanel" id="t3-timeline">
1303
+ <div class="section">
1304
+ <h3>&#9203; Audit Timeline</h3>
1305
+ <p class="sub">Ordered record of significant design decisions, PR landings, and dogfood events for Wave-{{WAVE_N}}.</p>
1306
+
1307
+ <!--
1308
+ Fill events in reverse-chronological order (newest at top).
1309
+ Classes: .ev.done (green dot) · .ev.current (yellow pulsing dot) · .ev (purple dot)
1310
+ -->
1311
+ <div class="timeline">
1312
+ <div class="ev current">
1313
+ <div class="date"><!-- YYYY-MM-DD --></div>
1314
+ <div class="title"><!-- current event --></div>
1315
+ <div class="desc"><!-- details --></div>
1316
+ </div>
1317
+ <div class="ev done">
1318
+ <div class="date"><!-- YYYY-MM-DD --></div>
1319
+ <div class="title"><!-- completed event --></div>
1320
+ <div class="desc"><!-- details --></div>
1321
+ </div>
1322
+ <div class="ev done">
1323
+ <div class="date"><!-- YYYY-MM-DD --></div>
1324
+ <div class="title">Wave-{{WAVE_N}} kickoff</div>
1325
+ <div class="desc"><!-- wave start context --></div>
1326
+ </div>
1327
+ </div>
1328
+ </div>
1329
+ </div>
1330
+
1331
+ <!-- ── Design Principles Audit ── -->
1332
+ <div class="subpanel" id="t3-principles">
1333
+ <div class="section">
1334
+ <h3>&#128202; Design Principles Audit</h3>
1335
+ <p class="sub">Cross-reference each principle against Wave-{{WAVE_N}} changes. Mark pass / skip / fail per principle. Links to §8 in the Skill Overview tab for full principle text.</p>
1336
+
1337
+ <table class="matrix">
1338
+ <thead><tr>
1339
+ <th width="10%">Principle</th>
1340
+ <th width="25%">Title</th>
1341
+ <th width="12%">Status</th>
1342
+ <th width="30%">Evidence / Notes</th>
1343
+ <th width="23%">Wave touch</th>
1344
+ </tr></thead>
1345
+ <tbody>
1346
+ <tr>
1347
+ <td><code>PR-001</code></td>
1348
+ <td><!-- title from §8 --></td>
1349
+ <td><span class="pill p-white">&#9898; not-checked</span></td>
1350
+ <td><em>wave changes don't touch this surface</em></td>
1351
+ <td><!-- file(s) if any --></td>
1352
+ </tr>
1353
+ <tr>
1354
+ <td><code>PR-019</code></td>
1355
+ <td>No inline Python heredocs</td>
1356
+ <td><span class="pill p-green">&#128994; pass</span></td>
1357
+ <td>fetch.sh: no python3 heredocs found (grep clean)</td>
1358
+ <td><code>scripts/cli/run.sh</code></td>
1359
+ </tr>
1360
+ <tr>
1361
+ <td><code>PR-024</code> <span class="badge b-new">proposed</span></td>
1362
+ <td>Portability — no hard-coded paths</td>
1363
+ <td><span class="pill p-yellow">&#127761; pending</span></td>
1364
+ <td><em>audit not yet run for this wave</em></td>
1365
+ <td><code>scripts/**</code></td>
1366
+ </tr>
1367
+ <tr>
1368
+ <td><code>PR-025</code> <span class="badge b-new">proposed</span></td>
1369
+ <td>Renderer smoke-test</td>
1370
+ <td><span class="pill p-yellow">&#127761; pending</span></td>
1371
+ <td><em>smoke test not yet written</em></td>
1372
+ <td><code>assets/templates/report.html.tpl</code></td>
1373
+ </tr>
1374
+ <tr>
1375
+ <td><code>PR-026</code> <span class="badge b-new">proposed</span></td>
1376
+ <td>Cross-platform install</td>
1377
+ <td><span class="pill p-yellow">&#127761; pending</span></td>
1378
+ <td><em>Linux CI matrix not yet added</em></td>
1379
+ <td><code>scripts/setup/*</code></td>
1380
+ </tr>
1381
+ </tbody>
1382
+ </table>
1383
+
1384
+ <div class="delta"><strong>Proposed principles (PR-024/025/026):</strong> These are hypothesis-stage. The audit row tracks whether this wave's changes are compatible with the proposed enforcement rule. A "pass" here strengthens the case for formal adoption; a "fail" needs a design discussion first.</div>
1385
+ </div>
1386
+ </div>
1387
+
1388
+ </section><!-- end t3 -->
1389
+
1390
+
1391
+ <!-- ══════════════════════════════════════════════════════════════════
1392
+ TAB ④ — DOCUMENT MAP (NEW)
1393
+ Informational dependency graph + change-propagation table
1394
+ ══════════════════════════════════════════════════════════════════ -->
1395
+ <section class="panel" id="t4">
1396
+
1397
+ <div class="section">
1398
+ <h3>&#128209; Document Map — informational dependencies (upstream / downstream)</h3>
1399
+ <p class="sub">When a doc changes, what else needs to follow? This Mermaid graph surfaces the dependency graph so we don't miss any propagation. Update the graph when the skill's reference tree changes.</p>
1400
+
1401
+ <div class="mermaid">
1402
+ %%{init: {'theme':'dark'}}%%
1403
+ flowchart LR
1404
+ SKILL[SKILL.md] -->|"§0 ref"| DETECT[scripts/setup/detect.ts]
1405
+ SKILL -->|"§4 BoM"| RUNSH[scripts/cli/run.sh]
1406
+ SKILL -->|"§4 BoM"| ALL_SCRIPTS[scripts/*.ts]
1407
+ SKILL -->|"§5 agents"| ANALYZER[assets/agents/diagnostics-analyzer.md]
1408
+ SKILL -->|"§5 agents"| APPLYWORKER[assets/agents/diagnostics-apply-worker.md]
1409
+ SKILL -->|"§6 refs"| REF[references/reference.md]
1410
+ SKILL -->|"§6 refs"| PRINC[references/principles.md]
1411
+ SKILL -->|"§6 refs"| WF_ONBOARD[references/workflows/onboarding.md]
1412
+ SKILL -->|"§6 refs"| WF_DIAG[references/workflows/diagnostics.md]
1413
+ SKILL -->|"§6 refs"| WF_ORCH[references/workflows/orchestrator-protocol.md]
1414
+ SKILL -->|"§6 refs"| WF_APPLY[references/workflows/apply-dispatch.md]
1415
+ SKILL -->|"§6 refs"| WF_RCA[references/workflows/rca.md]
1416
+ SKILL -->|"§7 config"| CONFIG[references/config.md]
1417
+ WF_ORCH -->|"loaded by"| SETUP[scripts/setup/*]
1418
+ WF_DIAG -->|"drives"| SLICER[scripts/slicer.ts]
1419
+ WF_DIAG -->|"drives"| TIER0[scripts/tier0-scan.ts]
1420
+ WF_RCA -->|"drives"| RENDER[scripts/report/render.ts]
1421
+ RENDER -->|"uses"| TPL[assets/templates/report.html.tpl]
1422
+ WF_APPLY -->|"drives"| APPLYWORKER
1423
+ WF_APPLY -->|"format"| APPLY_FMT[references/workflows/apply-pr-comment-format.md]
1424
+ APPLY_FMT -->|"template"| PRBODY[assets/templates/pr-body.md.tpl]
1425
+ CONFIG -->|"schema"| SCHEMA[scripts/config/schema.ts]
1426
+ CONFIG -->|"template"| CFGTPL[assets/templates/config.yaml.tpl]
1427
+ PRINC -.->|"enforces"| ALL_SCRIPTS
1428
+ PRINC -.->|"enforces"| TPL
1429
+
1430
+ classDef doc fill:#1c1c2a,stroke:#a78bfa,color:#f5f5f9;
1431
+ classDef code fill:#1c1c2a,stroke:#06b6d4,color:#f5f5f9;
1432
+ classDef tpl fill:#1c1c2a,stroke:#10b981,color:#f5f5f9;
1433
+ class SKILL,REF,PRINC,WF_ONBOARD,WF_DIAG,WF_ORCH,WF_APPLY,WF_RCA,CONFIG,APPLY_FMT doc;
1434
+ class DETECT,RUNSH,ALL_SCRIPTS,SETUP,SLICER,TIER0,RENDER,SCHEMA code;
1435
+ class TPL,PRBODY,CFGTPL tpl;
1436
+ class ANALYZER,APPLYWORKER doc;
1437
+ </div>
1438
+
1439
+ <div class="rationale"><strong>Legend:</strong> Purple nodes = documentation files (.md). Cyan nodes = code / scripts (.ts · .sh). Green nodes = runtime templates (.tpl). Dashed arrows = enforcement relationships (principles constrain code quality, not data flow). Solid arrows = data / configuration flow.</div>
1440
+ </div>
1441
+
1442
+ <div class="section">
1443
+ <h4>Change-propagation table — when X changes, also update Y</h4>
1444
+ <p class="sub">Before merging a PR that touches any file in the left column, verify ALL downstream items are also updated.</p>
1445
+
1446
+ <table class="matrix">
1447
+ <thead><tr>
1448
+ <th width="30%">If you change…</th>
1449
+ <th width="35%">…also update (downstream)</th>
1450
+ <th width="35%">Why</th>
1451
+ </tr></thead>
1452
+ <tbody>
1453
+ <tr>
1454
+ <td><code>SKILL.md §4 BoM</code></td>
1455
+ <td><code>scripts/cli/run.sh</code> comment block + <code>references/reference.md</code> tree</td>
1456
+ <td>Script invocation convention must match the BoM spec. Reference tree must list all scripts.</td>
1457
+ </tr>
1458
+ <tr>
1459
+ <td><code>references/workflows/diagnostics.md</code></td>
1460
+ <td><code>scripts/slicer.ts</code> + <code>scripts/tier0-scan.ts</code> inline comments</td>
1461
+ <td>Workflow document drives script behaviour. Script comments cite the workflow step.</td>
1462
+ </tr>
1463
+ <tr>
1464
+ <td><code>references/workflows/rca.md</code> taxonomy</td>
1465
+ <td><code>SKILL.md §9</code> + <code>scripts/report/render.ts</code> + <code>assets/templates/report.html.tpl</code> badge classes</td>
1466
+ <td>3-axis taxonomy is the source of truth. Report badges + render logic derive from it.</td>
1467
+ </tr>
1468
+ <tr>
1469
+ <td><code>references/principles.md</code> (any PR-N)</td>
1470
+ <td>Wave audit matrix (Audit tab §8) + cross-cutting scripts in scope of that principle</td>
1471
+ <td>Principles enforce skill quality. Each wave's audit verifies compliance.</td>
1472
+ </tr>
1473
+ <tr>
1474
+ <td><code>assets/templates/report.html.tpl</code></td>
1475
+ <td><code>scripts/report/render.ts</code> renderFindingPanel() call-sites</td>
1476
+ <td>Renderer-template contract: render.ts constructs the data the template expects. They must stay in sync.</td>
1477
+ </tr>
1478
+ <tr>
1479
+ <td><code>scripts/config/schema.ts</code></td>
1480
+ <td><code>references/config.md</code> field table + <code>assets/templates/config.yaml.tpl</code></td>
1481
+ <td>Schema is the source of truth for config shape. Docs and template must reflect it.</td>
1482
+ </tr>
1483
+ <tr>
1484
+ <td><code>assets/agents/*.md</code> (agent spec)</td>
1485
+ <td><code>SKILL.md §5</code> agent roster + <code>references/workflows/orchestrator-protocol.md</code> Steps 6 &amp; 11</td>
1486
+ <td>Agent registry in §5 must match actual agent files. Orchestrator protocol lists agent names explicitly.</td>
1487
+ </tr>
1488
+ <tr>
1489
+ <td><code>references/workflows/apply-dispatch.md</code></td>
1490
+ <td><code>assets/agents/diagnostics-apply-worker.md</code> + <code>references/workflows/apply-pr-comment-format.md</code></td>
1491
+ <td>Apply workflow drives the apply-worker agent and the PR comment format used in apply PRs.</td>
1492
+ </tr>
1493
+ <tr>
1494
+ <td><code>references/workflows/onboarding.md</code></td>
1495
+ <td><code>scripts/setup/detect.ts</code> + <code>SKILL.md §0</code></td>
1496
+ <td>Onboarding workflow is the spec for the setup detection script.</td>
1497
+ </tr>
1498
+ </tbody>
1499
+ </table>
1500
+
1501
+ <div class="delta"><strong>How to maintain:</strong> When a PR adds a new cross-file dependency (e.g. a new script that reads from a config key, or a new template field the renderer writes), add a row here BEFORE merging. This table is the propagation contract.</div>
1502
+ </div>
1503
+
1504
+ <!-- Downstream / upstream summary -->
1505
+ <div class="section">
1506
+ <h3>Upstream inputs to this wave</h3>
1507
+ <p class="sub">Dependencies this wave relies on that must be stable (from prior waves, other PRs).</p>
1508
+ <table>
1509
+ <thead><tr><th width="30%">Artifact</th><th width="25%">Source</th><th width="20%">Stability</th><th width="25%">Notes</th></tr></thead>
1510
+ <tbody>
1511
+ <tr>
1512
+ <td><code><!-- artifact --></code></td>
1513
+ <td><!-- wave / PR / branch --></td>
1514
+ <td><span class="pill p-green">&#128994; stable</span></td>
1515
+ <td><!-- notes --></td>
1516
+ </tr>
1517
+ <tr>
1518
+ <td><code><!-- artifact --></code></td>
1519
+ <td><!-- wave / PR / branch --></td>
1520
+ <td><span class="pill p-yellow">&#127761; in-flight</span></td>
1521
+ <td><!-- notes --></td>
1522
+ </tr>
1523
+ </tbody>
1524
+ </table>
1525
+
1526
+ <h3 style="margin-top:24px;">Downstream consumers of this wave</h3>
1527
+ <p class="sub">What breaks or needs updating if this wave's artifacts change shape.</p>
1528
+ <table>
1529
+ <thead><tr><th width="30%">Consumer</th><th width="25%">Depends on</th><th width="25%">Impact if broken</th><th width="20%">Notes</th></tr></thead>
1530
+ <tbody>
1531
+ <tr>
1532
+ <td><code><!-- consumer --></code></td>
1533
+ <td><code><!-- artifact --></code></td>
1534
+ <td><!-- impact --></td>
1535
+ <td><!-- notes --></td>
1536
+ </tr>
1537
+ </tbody>
1538
+ </table>
1539
+ </div>
1540
+
1541
+ </section><!-- end t4 -->
1542
+
1543
+
1544
+ <!-- ─── FLOATING ACTION BAR ──────────────────────────────────────── -->
1545
+ <div class="action-bar">
1546
+ <button class="primary" onclick="copyDecisions()">&#128203; Copy Decisions (all tabs)</button>
1547
+ <button class="ghost" onclick="resetAll()">&#8635; Reset</button>
1548
+ </div>
1549
+
1550
+ </main>
1551
+
1552
+
1553
+ <!-- ─── TAB SWITCHING JS ─────────────────────────────────────────────── -->
1554
+ <script>
1555
+ (function() {
1556
+
1557
+ // ── Top-level tab switching ──────────────────────────────────────────
1558
+ // Each top-level tab button has data-tab="tN".
1559
+ // Sub-tab state is preserved when switching top-level tabs (not reset).
1560
+ document.querySelectorAll('nav.tabs button[data-tab]').forEach(btn => {
1561
+ btn.addEventListener('click', () => {
1562
+ const target = btn.dataset.tab;
1563
+ document.querySelectorAll('nav.tabs button[data-tab]').forEach(b => b.classList.remove('active'));
1564
+ btn.classList.add('active');
1565
+ document.querySelectorAll('main > .panel').forEach(p => p.classList.remove('active'));
1566
+ const panel = document.getElementById(target);
1567
+ if (panel) panel.classList.add('active');
1568
+ window.scrollTo({top: 0, behavior: 'instant'});
1569
+ // Trigger Mermaid lazy render for the newly visible panel
1570
+ setTimeout(() => renderMermaidInPanel(panel), 50);
1571
+ });
1572
+ });
1573
+
1574
+ // ── Sub-tab switching ────────────────────────────────────────────────
1575
+ // Each sub-tab button has data-subtab="tN-xxx".
1576
+ // Sub-tabs are scoped to their parent panel via the nearest nav.subtabs ancestor.
1577
+ // Switching sub-tabs in panel t1 does NOT affect sub-tab state in t2/t3/t4.
1578
+ document.querySelectorAll('nav.subtabs button[data-subtab]').forEach(btn => {
1579
+ btn.addEventListener('click', () => {
1580
+ const targetId = btn.dataset.subtab;
1581
+ // Scope to the parent panel's subtab navigation
1582
+ const parentNav = btn.closest('nav.subtabs');
1583
+ if (!parentNav) return;
1584
+ // Deactivate all buttons in THIS subtab nav
1585
+ parentNav.querySelectorAll('button[data-subtab]').forEach(b => b.classList.remove('active'));
1586
+ btn.classList.add('active');
1587
+ // Find the parent panel that contains this nav
1588
+ const parentPanel = parentNav.closest('.panel');
1589
+ if (!parentPanel) return;
1590
+ // Deactivate all subpanels inside this panel
1591
+ parentPanel.querySelectorAll('.subpanel').forEach(sp => sp.classList.remove('active'));
1592
+ // Activate the target subpanel
1593
+ const subpanel = document.getElementById(targetId);
1594
+ if (subpanel) {
1595
+ subpanel.classList.add('active');
1596
+ // Trigger Mermaid lazy render
1597
+ setTimeout(() => renderMermaidInPanel(subpanel), 50);
1598
+ }
1599
+ });
1600
+ });
1601
+
1602
+ })();
1603
+ </script>
1604
+
1605
+
1606
+ <!-- ─── ACTION BAR — copy decisions / reset ──────────────────────────── -->
1607
+ <script>
1608
+ function copyDecisions() {
1609
+ // Collect all radio group decisions + textarea notes across ALL panels
1610
+ const phases = ['pA', 'pB', 'pC', 'pD', 'pE', 'wave-final'];
1611
+ const labels = {
1612
+ pA: 'Phase A',
1613
+ pB: 'Phase B',
1614
+ pC: 'Phase C',
1615
+ pD: 'Phase D',
1616
+ pE: 'Phase E / Final squash',
1617
+ 'wave-final': 'Wave final decision'
1618
+ };
1619
+ const lines = [
1620
+ '# MUTAGENT-DIAGNOSTICS — Wave-{{WAVE_N}} decisions',
1621
+ '',
1622
+ 'Generated: ' + new Date().toISOString(),
1623
+ ''
1624
+ ];
1625
+ phases.forEach(name => {
1626
+ const radios = document.querySelectorAll('input[name="' + name + '"]');
1627
+ let decision = 'NO SELECTION';
1628
+ radios.forEach(r => { if (r.checked) decision = r.value.toUpperCase(); });
1629
+ const block = radios.length ? radios[0].closest('.lockin') : null;
1630
+ const notes = block ? (block.querySelector('textarea')?.value.trim() || '') : '';
1631
+ lines.push('## ' + (labels[name] || name));
1632
+ lines.push('- **Decision**: ' + decision);
1633
+ lines.push('- **Notes**: ' + (notes || '(none)'));
1634
+ lines.push('');
1635
+ });
1636
+ const out = lines.join('\n');
1637
+ navigator.clipboard.writeText(out).then(() => {
1638
+ const btn = document.querySelector('.action-bar button.primary');
1639
+ if (!btn) return;
1640
+ const orig = btn.textContent;
1641
+ btn.textContent = 'Copied &#10003;';
1642
+ setTimeout(() => { btn.textContent = orig; }, 1500);
1643
+ }).catch(() => { window.prompt('Copy decisions:', out); });
1644
+ }
1645
+
1646
+ function resetAll() {
1647
+ if (!confirm('Reset all phase approvals and wave decisions?')) return;
1648
+ document.querySelectorAll('input[type=radio]').forEach(r => r.checked = false);
1649
+ document.querySelectorAll('textarea').forEach(t => t.value = '');
1650
+ }
1651
+ </script>
1652
+
1653
+
1654
+ <!-- ─── MERMAID with MUTAGENT-themed colors + tab/sub-tab aware rendering ──── -->
1655
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
1656
+ <script>
1657
+ (function() {
1658
+ const themeConfig = {
1659
+ startOnLoad: false, // managed manually for tab-awareness
1660
+ theme: "dark",
1661
+ themeVariables: {
1662
+ primaryColor: "#1f1f2e", primaryTextColor: "#f5f5f9", primaryBorderColor: "#a78bfa",
1663
+ lineColor: "#a78bfa", secondaryColor: "#252535", tertiaryColor: "#1c1c2a",
1664
+ background: "#0a0a10", mainBkg: "#1f1f2e", secondBkg: "#252535", textColor: "#f5f5f9",
1665
+ nodeBorder: "#a78bfa", clusterBkg: "#14141e", clusterBorder: "#a78bfa",
1666
+ labelTextColor: "#f5f5f9", labelBoxBkgColor: "#1f1f2e",
1667
+ cScale0: "#a78bfa", cScale1: "#06b6d4", cScale2: "#10b981", cScale3: "#f59e0b", cScale4: "#f0abfc"
1668
+ },
1669
+ securityLevel: "loose",
1670
+ flowchart: { useMaxWidth: true, curve: "basis" }
1671
+ };
1672
+
1673
+ // Render all unprocessed .mermaid elements that are currently VISIBLE
1674
+ // (i.e., inside an .active .panel > .active .subpanel OR directly in .active .panel)
1675
+ window.renderMermaidInPanel = function(container) {
1676
+ if (!container || typeof mermaid === "undefined") return;
1677
+ mermaid.initialize(themeConfig);
1678
+ const pending = container.querySelectorAll(".mermaid:not([data-processed])");
1679
+ if (pending.length) {
1680
+ mermaid.run({ nodes: Array.from(pending) }).catch(e => console.error("mermaid:", e));
1681
+ }
1682
+ };
1683
+
1684
+ function renderVisibleOnLoad() {
1685
+ if (typeof mermaid === "undefined") return;
1686
+ mermaid.initialize(themeConfig);
1687
+ // Collect all .mermaid elements that are inside active panels/subpanels
1688
+ const all = document.querySelectorAll(".mermaid:not([data-processed])");
1689
+ const visible = Array.from(all).filter(el => {
1690
+ // Must be inside an active panel
1691
+ const panel = el.closest(".panel");
1692
+ if (panel && !panel.classList.contains("active")) return false;
1693
+ // If inside a subpanel, that subpanel must also be active
1694
+ const subpanel = el.closest(".subpanel");
1695
+ if (subpanel && !subpanel.classList.contains("active")) return false;
1696
+ return true;
1697
+ });
1698
+ if (visible.length) {
1699
+ mermaid.run({ nodes: visible }).catch(e => console.error("mermaid:", e));
1700
+ }
1701
+ }
1702
+
1703
+ if (document.readyState === "loading") {
1704
+ document.addEventListener("DOMContentLoaded", renderVisibleOnLoad);
1705
+ } else {
1706
+ renderVisibleOnLoad();
1707
+ }
1708
+ })();
1709
+ </script>
1710
+
1711
+ </body>
1712
+ </html>