@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,160 @@
1
+ // ---------------------------------------------------------------------------
2
+ // dogfood/resolve-subagents — DOG-2: resolve the dispatched-subagent session
3
+ // JSONLs for a main Helix session, so `reconstruct-trajectory` (which already
4
+ // accepts `subagentPaths`) can ingest them (today it saw `subagents=0`).
5
+ //
6
+ // LINKAGE (see the DOG-2 ADR in monitoring-system-design.md). Verified against
7
+ // the local Claude-projects store: this Claude Code build persists NO
8
+ // `isSidechain:true` lines and NO `Task` tool_use in the parent transcript, so
9
+ // there is no in-file parent→child pointer to follow TODAY. We therefore resolve
10
+ // by a precedence chain, favouring what the dogfood target actually produces:
11
+ //
12
+ // (1) per-session convention dir <source_dir>/subagents/<sessionId>/*.jsonl
13
+ // (2) flat convention dir <source_dir>/subagents/*.jsonl
14
+ // (3) sidechain siblings <source_dir>/*.jsonl (≠ main) whose entries
15
+ // carry `isSidechain:true` AND a `parentUuid`
16
+ // that roots in the MAIN session's uuids
17
+ // (forward-compatible for a Claude Code build
18
+ // that DOES colocate sidechain files).
19
+ //
20
+ // (3) is best-effort + precise: a sibling is linked ONLY when a parentUuid
21
+ // actually matches a main-session uuid — never by mere co-location (no
22
+ // cross-session bleed). The whole resolver is gated by `include_subagents`
23
+ // (default true). PURITY: `selectSidechainSiblings` is pure; the file wrapper
24
+ // `resolveSubagentPaths` does the ONLY I/O (dir listing + a raw uuid scan).
25
+ // ---------------------------------------------------------------------------
26
+
27
+ import { readFileSync, readdirSync } from "node:fs";
28
+ import { join } from "node:path";
29
+
30
+ /** Raw linkage facts scanned from ONE session JSONL (cheap, adapter-free). */
31
+ export interface SessionLinkage {
32
+ /** Absolute path of the scanned file. */
33
+ path: string;
34
+ /** Every `parentUuid` seen across the file's entries (non-null). */
35
+ parentUuids: string[];
36
+ /** True if ANY entry carried `isSidechain:true`. */
37
+ isSidechain: boolean;
38
+ }
39
+
40
+ /**
41
+ * PURE core: from the MAIN session's uuid set + pre-scanned sibling linkages,
42
+ * select the sibling paths that are dispatched subagents of THIS session — a
43
+ * sidechain file with a `parentUuid` rooting in `mainUuids`. Deterministic
44
+ * (sorted, de-duplicated). Never links by co-location alone.
45
+ */
46
+ export function selectSidechainSiblings(args: {
47
+ mainUuids: Set<string>;
48
+ siblings: SessionLinkage[];
49
+ }): string[] {
50
+ const linked = new Set<string>();
51
+ for (const sib of args.siblings) {
52
+ if (!sib.isSidechain) continue;
53
+ if (sib.parentUuids.some((p) => args.mainUuids.has(p))) linked.add(sib.path);
54
+ }
55
+ return [...linked].sort();
56
+ }
57
+
58
+ /** List `*.jsonl` files (basenames) in a dir; missing/unreadable dir ⇒ []. */
59
+ function listJsonl(dir: string): string[] {
60
+ try {
61
+ return readdirSync(dir)
62
+ .filter((f) => f.endsWith(".jsonl"))
63
+ .sort();
64
+ } catch {
65
+ return [];
66
+ }
67
+ }
68
+
69
+ /** Scan one JSONL file for its linkage facts (uuids we ignore here; parents + sidechain). */
70
+ function scanLinkage(path: string): SessionLinkage {
71
+ const out: SessionLinkage = { path, parentUuids: [], isSidechain: false };
72
+ let raw: string;
73
+ try {
74
+ raw = readFileSync(path, "utf-8");
75
+ } catch {
76
+ return out;
77
+ }
78
+ for (const line of raw.split("\n")) {
79
+ const trimmed = line.trim();
80
+ if (trimmed.length === 0) continue;
81
+ let ev: { parentUuid?: string | null; isSidechain?: boolean };
82
+ try {
83
+ ev = JSON.parse(trimmed) as typeof ev;
84
+ } catch {
85
+ continue;
86
+ }
87
+ if (typeof ev.parentUuid === "string" && ev.parentUuid.length > 0) out.parentUuids.push(ev.parentUuid);
88
+ if (ev.isSidechain === true) out.isSidechain = true;
89
+ }
90
+ return out;
91
+ }
92
+
93
+ /** Collect the set of `uuid`s emitted by one JSONL file (for sidechain rooting). */
94
+ function collectUuids(path: string): Set<string> {
95
+ const uuids = new Set<string>();
96
+ let raw: string;
97
+ try {
98
+ raw = readFileSync(path, "utf-8");
99
+ } catch {
100
+ return uuids;
101
+ }
102
+ for (const line of raw.split("\n")) {
103
+ const trimmed = line.trim();
104
+ if (trimmed.length === 0) continue;
105
+ try {
106
+ const ev = JSON.parse(trimmed) as { uuid?: string };
107
+ if (typeof ev.uuid === "string" && ev.uuid.length > 0) uuids.add(ev.uuid);
108
+ } catch {
109
+ /* tolerant — skip unparseable lines */
110
+ }
111
+ }
112
+ return uuids;
113
+ }
114
+
115
+ /** Inputs for the file-wrapper resolver. */
116
+ export interface ResolveSubagentsInput {
117
+ /** The dogfood target's Claude-projects session dir. */
118
+ sourceDir: string;
119
+ /** The main session id (the `<sessionId>.jsonl` in `sourceDir`). */
120
+ sessionId: string;
121
+ /** config.dogfood.include_subagents (default true). */
122
+ includeSubagents?: boolean;
123
+ }
124
+
125
+ /**
126
+ * Resolve the dispatched-subagent JSONL paths for a main session by the
127
+ * precedence chain above. Best-effort + honest: returns [] (never throws) when
128
+ * disabled or when nothing links. The ONLY I/O in this module.
129
+ */
130
+ export function resolveSubagentPaths(input: ResolveSubagentsInput): string[] {
131
+ if (input.includeSubagents === false) return [];
132
+ const { sourceDir, sessionId } = input;
133
+ const found: string[] = [];
134
+
135
+ // (1) per-session convention dir
136
+ const perSessionDir = join(sourceDir, "subagents", sessionId);
137
+ const perSession = listJsonl(perSessionDir).map((f) => join(perSessionDir, f));
138
+ found.push(...perSession);
139
+
140
+ // (2) flat convention dir (only when the per-session dir yielded nothing)
141
+ if (perSession.length === 0) {
142
+ const flatDir = join(sourceDir, "subagents");
143
+ found.push(...listJsonl(flatDir).map((f) => join(flatDir, f)));
144
+ }
145
+
146
+ // (3) sidechain siblings in the source dir (forward-compatible best-effort)
147
+ const mainFile = join(sourceDir, `${sessionId}.jsonl`);
148
+ const siblingNames = listJsonl(sourceDir).filter((f) => f !== `${sessionId}.jsonl`);
149
+ if (siblingNames.length > 0) {
150
+ const siblings = siblingNames.map((f) => scanLinkage(join(sourceDir, f)));
151
+ // only pay for the main uuid scan if a sibling actually looks like a sidechain
152
+ if (siblings.some((s) => s.isSidechain)) {
153
+ const mainUuids = collectUuids(mainFile);
154
+ found.push(...selectSidechainSiblings({ mainUuids, siblings }));
155
+ }
156
+ }
157
+
158
+ // de-dupe (a path can never satisfy two branches, but stay defensive) + stable order
159
+ return [...new Set(found)].sort();
160
+ }
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * scripts/dogfood/run-report.ts — the *dogfood report runner.
4
+ *
5
+ * Composes the pure dogfood functions (parse → reconstruct → extract → render) into a written
6
+ * HTML "Live Status" report. The `dogfood-monitor` agent shells out to this; `*dogfood` is ALWAYS
7
+ * a live monitor (DOG-0): the watch loop is the DEFAULT (re-render on the session file changing OR
8
+ * every `--interval` seconds — default 180 = 3 min, matching the monitor cadence). Pass `--once`
9
+ * for a single render + exit (internal/test only, NOT the operator path).
10
+ *
11
+ * When `config.dogfood.slack.enabled` (DOG-3), each render also drives a LIVE Slack THREAD: a root
12
+ * message on start + typed threaded replies derived by diffing successive trajectories. Slack is a
13
+ * strictly-optional sink — unconfigured/disabled ⇒ HTML report only, never an error.
14
+ *
15
+ * Usage:
16
+ * run-report.ts --session <id> --source-dir <dir> [--out <path>]
17
+ * [--refresh <sec=180>] [--include-subagents] [--interval <sec=180>] [--once]
18
+ */
19
+ import { reconstructTrajectory, parseSessionFile } from "./reconstruct-trajectory.ts";
20
+ import { extractFeedback } from "./extract-feedback.ts";
21
+ import { renderDogfoodReport } from "./render-dogfood-report.ts";
22
+ import { resolveSubagentPaths } from "./resolve-subagents.ts";
23
+ import { dogfoodThreadMessages } from "./slack-thread.ts";
24
+ import type { DogfoodEvent, DogfoodThreadMeta } from "./slack-thread.ts";
25
+ import type { FeedbackItem, Trajectory } from "./types.ts";
26
+ import { postMessage, postReply } from "../slack/post.ts";
27
+ import { writeFileSync, mkdirSync, statSync, watch } from "node:fs";
28
+ import { join, dirname } from "node:path";
29
+ import { setInterval } from "node:timers";
30
+
31
+ /** Options for a single report build. I/O reads happen here; `now` is INJECTED (testable). */
32
+ export interface BuildReportOpts {
33
+ /** The main session JSONL path (explicit — the CLI derives it from session+source-dir). */
34
+ mainPath: string;
35
+ sessionId: string;
36
+ sourceDir?: string;
37
+ /** Dispatched subagent session JSONL paths (empty ⇒ none). */
38
+ subagentPaths?: string[];
39
+ /** Injected wall-clock (epoch ms) — the report's "as of" time. */
40
+ now: number;
41
+ /** Browser auto-reload cadence in seconds (0/undefined ⇒ static, no auto-reload). */
42
+ refreshSeconds?: number;
43
+ title?: string;
44
+ }
45
+
46
+ export interface BuildReportResult {
47
+ html: string;
48
+ stats: { commands: number; feedback: number; subagents: number };
49
+ /** The reconstructed trajectory (exposed so the watch loop can diff for DOG-3). */
50
+ trajectory: Trajectory;
51
+ /** The extracted feedback items (exposed for the same diff). */
52
+ feedback: FeedbackItem[];
53
+ }
54
+
55
+ /** Compose the pure pipeline into an HTML string + counts + structured outputs. Reads the session file(s). */
56
+ export async function buildReport(opts: BuildReportOpts): Promise<BuildReportResult> {
57
+ const main = await parseSessionFile(opts.mainPath);
58
+ if (main === null) {
59
+ throw new Error(`run-report: no recognizable events in ${opts.mainPath}`);
60
+ }
61
+ const subagentPaths = opts.subagentPaths ?? [];
62
+ const trajectory = await reconstructTrajectory({ mainPath: opts.mainPath, subagentPaths, now: opts.now });
63
+ const feedback = extractFeedback(main);
64
+ const html = renderDogfoodReport({
65
+ trajectory,
66
+ feedback,
67
+ meta: {
68
+ runId: `dogfood-${opts.now}`,
69
+ sessionId: opts.sessionId,
70
+ sourceDir: opts.sourceDir,
71
+ generatedAt: new Date(opts.now).toISOString(),
72
+ title: opts.title ?? "Helix Dogfood — Live Status",
73
+ subagentCount: subagentPaths.length,
74
+ refreshSeconds: opts.refreshSeconds && opts.refreshSeconds > 0 ? opts.refreshSeconds : undefined,
75
+ },
76
+ });
77
+ return {
78
+ html,
79
+ stats: { commands: trajectory.commands.length, feedback: feedback.length, subagents: subagentPaths.length },
80
+ trajectory,
81
+ feedback,
82
+ };
83
+ }
84
+
85
+ // ── DOG-0: watch decision (pure, unit-testable — no loop spawned) ─────────────
86
+
87
+ /**
88
+ * `*dogfood` is ALWAYS a live monitor. Watch is the DEFAULT; the ONLY opt-out is
89
+ * an explicit `--once` (a single render + exit — internal/test use only, never
90
+ * the operator path). Pure over argv so it is testable WITHOUT arming the loop.
91
+ */
92
+ export function shouldWatch(argv: string[]): boolean {
93
+ return !argv.includes("--once");
94
+ }
95
+
96
+ // ── DOG-3: successive-trajectory diff → live-thread events (pure) ─────────────
97
+
98
+ /** A render snapshot the watch loop diffs between ticks. */
99
+ export interface DogfoodSnapshot {
100
+ trajectory: Trajectory;
101
+ feedback: FeedbackItem[];
102
+ }
103
+
104
+ /** Stable identity for a feedback item (order-independent diffing). */
105
+ function feedbackKey(f: FeedbackItem): string {
106
+ return `${f.kind}:${f.evidencePointer.spanId}:${f.evidencePointer.turnIndex}`;
107
+ }
108
+
109
+ /**
110
+ * Derive the NEW live-thread events between two render snapshots. PURE +
111
+ * deterministic. Emits: stage-change (new timeline segment with a stage flip),
112
+ * agent-dispatch (a subagent unseen in `prev`), feedback (a new `feedback-block`),
113
+ * and signal (a new implicit signal). `prev` undefined ⇒ the first render (no
114
+ * replies — the ROOT is posted separately from meta).
115
+ */
116
+ export function diffDogfoodEvents(prev: DogfoodSnapshot | undefined, next: DogfoodSnapshot): DogfoodEvent[] {
117
+ if (prev === undefined) return [];
118
+ const events: DogfoodEvent[] = [];
119
+
120
+ // stage-change — new timeline segments (append-only) with an actual stage flip
121
+ const tl = next.trajectory.timeline;
122
+ for (let i = prev.trajectory.timeline.length; i < tl.length; i++) {
123
+ const to = tl[i].stage;
124
+ const from = i > 0 ? tl[i - 1].stage : undefined;
125
+ if (from !== to) events.push(from ? { type: "stage-change", to, from } : { type: "stage-change", to });
126
+ }
127
+
128
+ // agent-dispatch — subagents unseen in prev (by sessionId)
129
+ const prevSubs = new Set(prev.trajectory.subagents.map((s) => s.sessionId));
130
+ for (const s of next.trajectory.subagents) {
131
+ if (!prevSubs.has(s.sessionId)) events.push({ type: "agent-dispatch", agent: s.agentName });
132
+ }
133
+
134
+ // feedback / signal — items whose identity is new
135
+ const prevKeys = new Set(prev.feedback.map(feedbackKey));
136
+ for (const f of next.feedback) {
137
+ if (prevKeys.has(feedbackKey(f))) continue;
138
+ if (f.kind === "feedback-block") events.push({ type: "feedback", text: f.observation, severity: f.severity });
139
+ else events.push({ type: "signal", kind: f.kind, count: 1 });
140
+ }
141
+
142
+ return events;
143
+ }
144
+
145
+ // ── CLI (impure boundary: argv · clock · fs · watch · Slack post) ─────────────
146
+ function arg(name: string, def?: string): string | undefined {
147
+ const i = process.argv.indexOf(`--${name}`);
148
+ return i >= 0 ? process.argv[i + 1] : def;
149
+ }
150
+ function flag(name: string): boolean {
151
+ return process.argv.includes(`--${name}`);
152
+ }
153
+
154
+ /** The resolved dogfood Slack sink (config-gated). null ⇒ no Slack this run. */
155
+ interface SlackSink {
156
+ channel: string;
157
+ token: string;
158
+ cadenceLabel: string;
159
+ }
160
+
161
+ /**
162
+ * Resolve the Slack sink from `config.dogfood.slack` (DOG-3). Active ONLY when
163
+ * enabled AND the `token_ref` env var is set. Guarded (never throws): any miss ⇒
164
+ * null ⇒ HTML report only. The config module is imported LAZILY so the render
165
+ * path never hard-depends on it (a consumer install without deps still renders;
166
+ * Slack simply no-ops).
167
+ */
168
+ async function resolveSlackSink(): Promise<SlackSink | null> {
169
+ try {
170
+ const { loadConfig } = await import("../config-schema.ts");
171
+ const { resolveConfigPath } = await import("../resolve-paths.ts");
172
+ const res = loadConfig(resolveConfigPath());
173
+ if (!res.ok) return null;
174
+ const slack = res.config.dogfood?.slack;
175
+ if (slack === undefined || slack.enabled !== true) return null;
176
+ const token = process.env[slack.token_ref];
177
+ if (token === undefined || token.length === 0) return null;
178
+ const cadence = res.config.dogfood?.cadence_seconds ?? 180;
179
+ return { channel: slack.channel, token, cadenceLabel: `${Math.max(1, Math.round(cadence / 60))}m` };
180
+ } catch {
181
+ return null;
182
+ }
183
+ }
184
+
185
+ async function main(): Promise<void> {
186
+ const sessionId = arg("session");
187
+ const sourceDir = arg("source-dir");
188
+ if (sessionId === undefined || sourceDir === undefined) {
189
+ console.error("run-report: --session <id> and --source-dir <dir> are required");
190
+ process.exit(2);
191
+ }
192
+ const mainPath = join(sourceDir, `${sessionId}.jsonl`);
193
+ const outPath = arg("out", join(process.cwd(), ".mutagent", "dogfood", `${sessionId}.html`))!;
194
+ const refreshSeconds = Number(arg("refresh", "180"));
195
+ const intervalMs = Number(arg("interval", "180")) * 1000;
196
+
197
+ // DOG-2: resolve dispatched subagent JSONLs by parent→child linkage (gated by
198
+ // --include-subagents, which the monitor passes when config.include_subagents).
199
+ const resolveSubs = (): string[] =>
200
+ flag("include-subagents") ? resolveSubagentPaths({ sourceDir, sessionId, includeSubagents: true }) : [];
201
+
202
+ // DOG-3: Slack live-thread state (config-gated; null ⇒ no Slack).
203
+ const slack = await resolveSlackSink();
204
+ let threadTs: string | null = null;
205
+ let prevSnap: DogfoodSnapshot | undefined;
206
+
207
+ const postThread = async (result: BuildReportResult): Promise<void> => {
208
+ if (slack === null) return;
209
+ const nextSnap: DogfoodSnapshot = { trajectory: result.trajectory, feedback: result.feedback };
210
+ if (threadTs === null) {
211
+ // First render: open the thread with the ROOT (from meta); baseline the diff.
212
+ const meta: DogfoodThreadMeta = { sessionId, project: sourceDir, cadenceLabel: slack.cadenceLabel };
213
+ const root = dogfoodThreadMessages([], meta)[0];
214
+ const res = await postMessage({ channel: slack.channel, text: root.text, token: slack.token });
215
+ threadTs = res?.ts ?? null;
216
+ } else {
217
+ // Subsequent renders: post one threaded reply per NEW event.
218
+ const events = diffDogfoodEvents(prevSnap, nextSnap);
219
+ for (const msg of dogfoodThreadMessages(events, { sessionId }).filter((m) => m.kind === "reply")) {
220
+ await postReply({ channel: slack.channel, thread_ts: threadTs, text: msg.text, token: slack.token });
221
+ }
222
+ }
223
+ prevSnap = nextSnap;
224
+ };
225
+
226
+ const renderOnce = async (reason: string): Promise<void> => {
227
+ try {
228
+ const result = await buildReport({
229
+ mainPath, sessionId, sourceDir, subagentPaths: resolveSubs(), now: Date.now(), refreshSeconds,
230
+ });
231
+ mkdirSync(dirname(outPath), { recursive: true });
232
+ writeFileSync(outPath, result.html);
233
+ const { commands, feedback, subagents } = result.stats;
234
+ console.info(`[dogfood] rendered (${reason}) → ${outPath} · commands=${commands} feedback=${feedback} subagents=${subagents}`);
235
+ await postThread(result);
236
+ } catch (e) {
237
+ console.error(`[dogfood] render error (${reason}): ${(e as Error).message}`);
238
+ }
239
+ };
240
+
241
+ await renderOnce("initial");
242
+
243
+ // DOG-0: *dogfood is ALWAYS live — watch is the default; --once opts out.
244
+ if (shouldWatch(process.argv)) {
245
+ console.info(`[dogfood] watch ARMED — re-render on drift OR every ${intervalMs / 1000}s`);
246
+ setInterval(() => void renderOnce("heartbeat"), intervalMs);
247
+ let lastMtime = 0;
248
+ try {
249
+ watch(mainPath, { persistent: true }, () => {
250
+ const m = statSync(mainPath).mtimeMs;
251
+ if (m !== lastMtime) {
252
+ lastMtime = m;
253
+ void renderOnce("drift");
254
+ }
255
+ });
256
+ } catch (e) {
257
+ console.error(`[dogfood] cannot watch ${mainPath} for drift: ${(e as Error).message}`);
258
+ }
259
+ }
260
+ }
261
+
262
+ if (import.meta.main) {
263
+ await main();
264
+ }
@@ -0,0 +1,106 @@
1
+ // ---------------------------------------------------------------------------
2
+ // dogfood/slack-thread — the DOGFOOD-ONLY Slack emitter (DOG-3): a LIVE THREAD.
3
+ //
4
+ // One dogfood session ⇒ one Slack thread: a ROOT message on start + typed
5
+ // THREADED replies as the session moves (stage-change · agent-dispatch ·
6
+ // feedback · signal · progress-heartbeat · stop). Human-readable + precise —
7
+ // coworkers follow the pulse in Slack while the HTML report stays the deep view.
8
+ //
9
+ // PURE: `dogfoodThreadMessages(events, meta) → SlackMsg[]` is `input → messages`,
10
+ // no I/O/clock/random. The run-report watch loop diffs successive trajectories
11
+ // into `DogfoodEvent[]`, calls this, and posts via `slack/post` (the only impure
12
+ // seam). SEPARATION (load-bearing): this emitter imports ONLY `../slack/*` — it
13
+ // is the dogfood VOICE and never imports the External Monitor's (`../monitor/*`).
14
+ // ---------------------------------------------------------------------------
15
+
16
+ import { bold, code, italic } from "../slack/format.ts";
17
+ import type { SlackMsg } from "../slack/post.ts";
18
+
19
+ /**
20
+ * A dogfood live-thread event (derived by the watch loop from successive
21
+ * trajectory diffs). The union is closed so the emitter is exhaustive.
22
+ */
23
+ export type DogfoodEvent =
24
+ | { type: "stage-change"; to: string; from?: string }
25
+ | { type: "agent-dispatch"; agent: string; stage?: string; role?: string }
26
+ | { type: "feedback"; text: string; severity?: string }
27
+ | { type: "signal"; kind: string; count?: number }
28
+ | { type: "progress"; minutes: number; commands: number; feedback: number; subagents: number }
29
+ | { type: "stop"; commands: number; feedback: number };
30
+
31
+ /** Metadata for the thread ROOT (posted once on start). */
32
+ export interface DogfoodThreadMeta {
33
+ sessionId: string;
34
+ /** Human project label (the dogfood target), optional. */
35
+ project?: string;
36
+ /** Cadence label for the root ("3m" etc.); default "3m". */
37
+ cadenceLabel?: string;
38
+ }
39
+
40
+ /** ADL-stage → a compact display label with its circled numeral (self-contained). */
41
+ const STAGE_DISPLAY: Readonly<Record<string, string>> = {
42
+ spec: "① SPEC",
43
+ build: "② BUILD",
44
+ discover: "◇ DISCOVER",
45
+ evaluate: "③ EVALUATE",
46
+ diagnose: "④ DIAGNOSE",
47
+ improve: "⑤ IMPROVE",
48
+ meta: "· META",
49
+ };
50
+
51
+ /** Display a stage token; unknown tokens fall back to their upper-case form. */
52
+ function stageLabel(stage: string): string {
53
+ return STAGE_DISPLAY[stage] ?? stage.toUpperCase();
54
+ }
55
+
56
+ /** Short session id for the root header (first 8 chars + ellipsis when longer). */
57
+ function shortId(id: string): string {
58
+ return id.length > 8 ? `${id.slice(0, 8)}…` : id;
59
+ }
60
+
61
+ /** Render the thread ROOT message from the session meta. */
62
+ function rootText(meta: DogfoodThreadMeta): string {
63
+ const project = meta.project ? ` · project ${bold(meta.project)}` : "";
64
+ const cadence = meta.cadenceLabel ?? "3m";
65
+ return `🧬 ${bold("Dogfood live")} — session ${code(shortId(meta.sessionId))}${project} · watching (${cadence} + on-drift)`;
66
+ }
67
+
68
+ /** Render ONE event to its threaded-reply text. */
69
+ function eventText(ev: DogfoodEvent): string {
70
+ switch (ev.type) {
71
+ case "stage-change": {
72
+ const from = ev.from ? ` (from ${stageLabel(ev.from)})` : "";
73
+ return `⏩ Stage → ${bold(stageLabel(ev.to))}${from}`;
74
+ }
75
+ case "agent-dispatch": {
76
+ const parts: string[] = [];
77
+ if (ev.stage) parts.push(stageLabel(ev.stage));
78
+ if (ev.role) parts.push(ev.role);
79
+ const suffix = parts.length > 0 ? ` (${parts.join(" · ")})` : "";
80
+ return `🤖 dispatched ${code(ev.agent)}${suffix}`;
81
+ }
82
+ case "feedback":
83
+ return `💬 feedback — ${italic(`"${ev.text}"`)}`;
84
+ case "signal": {
85
+ const count = ev.count !== undefined ? ` ×${ev.count}` : "";
86
+ return `⚠️ signal — ${ev.kind}${count}`;
87
+ }
88
+ case "progress":
89
+ return `📊 ${ev.minutes}m · ${ev.commands} commands · ${ev.feedback} feedback · ${ev.subagents} subagents`;
90
+ case "stop":
91
+ return `🏁 watch ended · ${ev.commands} commands · ${ev.feedback} feedback · report attached`;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Build the full thread message list for a session: the ROOT (from meta) followed
97
+ * by one threaded REPLY per event, in order. PURE + deterministic — identical
98
+ * (events, meta) ⇒ identical `SlackMsg[]`.
99
+ */
100
+ export function dogfoodThreadMessages(events: DogfoodEvent[], meta: DogfoodThreadMeta): SlackMsg[] {
101
+ const msgs: SlackMsg[] = [{ kind: "root", text: rootText(meta) }];
102
+ for (const ev of events) {
103
+ msgs.push({ kind: "reply", text: eventText(ev) });
104
+ }
105
+ return msgs;
106
+ }