@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,162 @@
1
+ // ---------------------------------------------------------------------------
2
+ // monitor/triggers — the External Monitor's PURE rule engine (EXT-1).
3
+ //
4
+ // `evaluateTriggers(config, event, now)` reads the DORMANT `config.triggers`
5
+ // block (the evaluate/diagnose trigger rules) and returns every rule that FIRES
6
+ // for an incoming `MonitorEvent`. This is the OUTWARD monitor's condition source
7
+ // — distinct from the INWARD dogfood monitor (which observes a live session).
8
+ //
9
+ // SHIPS DISABLED (load-bearing): a stage block whose `enabled !== true` yields
10
+ // ZERO matches. The onboarding default is `enabled:false` with empty rules, so a
11
+ // freshly-installed monitor never fires until the operator opts in
12
+ // (triggers.<stage>.enabled:true). No cron, no auto-fire wired here — this is the
13
+ // pure predicate; arming the watch is the `monitor` agent's job.
14
+ //
15
+ // PURE + DETERMINISTIC: no clock, no random, no network, no fs. The wall-clock is
16
+ // INJECTED as `now` (epoch ms) and stamped onto each match as `firedAt` — same
17
+ // (config, event, now) ⇒ deep-equal `TriggerMatch[]`, so the engine is unit-
18
+ // testable against inline literals (mirrors scripts/dispatch.ts + config-schema.ts).
19
+ //
20
+ // SEPARATION: this is the CONDITION half of the External Monitor. The NOTIFICATION
21
+ // half is monitor/slack-notify.ts (its OWN Slack voice). Neither imports the
22
+ // dogfood monitor's engine — shared transport, separate semantics (ADR-6/ADR-11).
23
+ // ---------------------------------------------------------------------------
24
+
25
+ import { AdlStage } from "../handover-contract.ts";
26
+ import type { AdlStageValue } from "../handover-contract.ts";
27
+ import type { MutagentConfig, TriggerRule, TriggerStageBlock } from "../config-schema.ts";
28
+
29
+ /** The event kinds the External Monitor understands. Closed → exhaustive. */
30
+ export type MonitorEventKind = "trace-count" | "schedule" | "ci" | "manual";
31
+
32
+ /**
33
+ * An incoming monitor event. Discriminated on `kind`. The scheduler / trace
34
+ * collector / CI hook constructs one of these and hands it to `evaluateTriggers`.
35
+ */
36
+ export type MonitorEvent =
37
+ | { kind: "trace-count"; count: number }
38
+ | { kind: "schedule"; at?: string }
39
+ | { kind: "ci"; status?: string }
40
+ | { kind: "manual"; command?: string };
41
+
42
+ /**
43
+ * One fired trigger — names the rule, the target ADL stage (the `config.triggers`
44
+ * block key, e.g. evaluate/diagnose), a human-readable reason, and the injected
45
+ * `firedAt` stamp (for the notification; NO self-read clock).
46
+ */
47
+ export interface TriggerMatch {
48
+ /** The target ADL stage — the `config.triggers` block this rule lives under. */
49
+ stage: AdlStageValue;
50
+ /** The rule that fired (its `on` condition + optional `run` target). */
51
+ rule: TriggerRule;
52
+ /** Convenience mirror of `rule.run` (the stage/command to run) when present. */
53
+ run?: string;
54
+ /** Human-readable WHY the rule fired (precise: the matched condition). */
55
+ reason: string;
56
+ /** The injected wall-clock (epoch ms) — the "fired at" stamp, never self-read. */
57
+ firedAt: number;
58
+ }
59
+
60
+ /**
61
+ * The `config.triggers` keys are the routing AdlStage set MINUS `spec` (there is
62
+ * no spec monitor). A fixed iteration order keeps the output deterministic.
63
+ */
64
+ type TriggerStageKey = Exclude<AdlStageValue, typeof AdlStage.Spec>;
65
+ const STAGE_ORDER: readonly TriggerStageKey[] = [
66
+ AdlStage.Build,
67
+ AdlStage.Evaluate,
68
+ AdlStage.Diagnose,
69
+ AdlStage.Improve,
70
+ AdlStage.Audit,
71
+ ];
72
+
73
+ /** Parsed `on` grammar: an event kind + an OPTIONAL numeric threshold (trace-count). */
74
+ interface ParsedOn {
75
+ kind: MonitorEventKind | null;
76
+ op: ">=" | ">" | null;
77
+ threshold: number | null;
78
+ }
79
+
80
+ /**
81
+ * Parse a rule's `on` string. Grammar (deterministic, minimal — ADR-10):
82
+ * - `trace-count` → fires on ANY trace-count event
83
+ * - `trace-count>=100` → fires when count ≥ 100
84
+ * - `trace-count>100` → fires when count > 100
85
+ * - `schedule` · `ci` · `manual` → fires on the matching event kind
86
+ * Anything else ⇒ `kind:null` (an unparseable rule never fires).
87
+ */
88
+ function parseOn(on: string): ParsedOn {
89
+ const m = on
90
+ .trim()
91
+ .toLowerCase()
92
+ .match(/^(trace-count|schedule|ci|manual)\s*(>=|>)?\s*(\d+)?$/);
93
+ if (m === null) return { kind: null, op: null, threshold: null };
94
+ return {
95
+ kind: m[1] as MonitorEventKind,
96
+ op: (m[2] as ">=" | ">" | undefined) ?? null,
97
+ threshold: m[3] !== undefined ? Number(m[3]) : null,
98
+ };
99
+ }
100
+
101
+ /**
102
+ * Does `rule` fire for `event`? Returns a human-readable reason string when it
103
+ * does, else null. Pure. The `on` kind must equal the event kind; a `trace-count`
104
+ * rule with a threshold additionally requires the count to satisfy the comparator.
105
+ */
106
+ function ruleReason(rule: TriggerRule, event: MonitorEvent): string | null {
107
+ const p = parseOn(rule.on);
108
+ if (p.kind === null || p.kind !== event.kind) return null;
109
+
110
+ switch (event.kind) {
111
+ case "trace-count": {
112
+ if (p.threshold !== null) {
113
+ const op = p.op ?? ">=";
114
+ const ok = op === ">" ? event.count > p.threshold : event.count >= p.threshold;
115
+ if (!ok) return null;
116
+ return `trace-count ${event.count} ${op} ${p.threshold}`;
117
+ }
118
+ return `trace-count ${event.count}`;
119
+ }
120
+ case "schedule":
121
+ return event.at !== undefined ? `schedule fired @ ${event.at}` : "schedule fired";
122
+ case "ci":
123
+ return event.status !== undefined ? `ci ${event.status}` : "ci event";
124
+ case "manual":
125
+ return event.command !== undefined ? `manual trigger (${event.command})` : "manual trigger";
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Evaluate the DORMANT `config.triggers` against an incoming event → every fired
131
+ * rule as a `TriggerMatch`. DISABLED-by-default: a stage block with
132
+ * `enabled !== true` (the shipped default) contributes NOTHING, so a fresh
133
+ * monitor never fires until explicitly enabled. Deterministic: stages iterate in
134
+ * a fixed order, `now` is injected (no self-read clock).
135
+ */
136
+ export function evaluateTriggers(
137
+ config: MutagentConfig,
138
+ event: MonitorEvent,
139
+ now: number,
140
+ ): TriggerMatch[] {
141
+ const triggers = config.triggers;
142
+ if (triggers === undefined) return [];
143
+
144
+ const matches: TriggerMatch[] = [];
145
+ for (const stage of STAGE_ORDER) {
146
+ const block = triggers[stage] as TriggerStageBlock | undefined;
147
+ // SHIPS DISABLED — only an explicitly-enabled block can fire.
148
+ if (block === undefined || block.enabled !== true) continue;
149
+ for (const rule of block.rules) {
150
+ const reason = ruleReason(rule, event);
151
+ if (reason === null) continue;
152
+ matches.push({
153
+ stage,
154
+ rule,
155
+ ...(rule.run !== undefined ? { run: rule.run } : {}),
156
+ reason,
157
+ firedAt: now,
158
+ });
159
+ }
160
+ }
161
+ return matches;
162
+ }
@@ -0,0 +1,369 @@
1
+ import { AdlStage, type AdlStageValue } from "./handover-contract.ts";
2
+ import type { MutagentConfig, Source, Target } from "./config-schema.ts";
3
+ import { ApplyKind } from "./config-schema.ts";
4
+
5
+ // ---------------------------------------------------------------------------
6
+ // C2 — the per-command / per-role onboarding completion-check (v0.2.0).
7
+ //
8
+ // v0.2.0 collapses the false `stages` axis: the config is keyed by SKILL under
9
+ // `lifecycle`, and the "where traces come from" / "where fixes go" live in a
10
+ // GLOBAL catalog (`global.sources[]` / `global.targets[]`) bound BY ROLE, not by
11
+ // ref. So onboarding is no longer a single monolithic floor — it is SCOPED to
12
+ // what the invoked stage actually needs, only when the config doesn't already
13
+ // specify it, and it STOPS only when a genuinely-required thing is missing.
14
+ //
15
+ // Binding by role (NOT by ref — there is no source_ref/target_ref) under the
16
+ // SELECTION contract (an entry marked `default: true` is auto-selected):
17
+ // - source-consumers (evaluate / diagnose) bind `global.sources`.
18
+ // - target-writers (build / improve / diagnose-apply) bind `global.targets`.
19
+ // Exactly ONE entry ⇒ auto-bind (`resolved-single`). MULTIPLE entries: exactly one
20
+ // `default: true` ⇒ `resolved-default` (binds; run-time confirms); >1 `default: true`
21
+ // ⇒ `multiple-defaults` (a CONFIG ERROR — the selector is ambiguous, surfaces
22
+ // `source/target-config-error`);
23
+ // 0 defaults ⇒ `needs-selection` (the operator picks at RUN time). ZERO ⇒ the
24
+ // relevant floor is unmet. `needs-selection` is NOT a hard-fail: a source/target
25
+ // EXISTS, the operator just picks — the floor is satisfied for gating purposes.
26
+ // `multiple-defaults` IS a hard-fail (a config error to fix).
27
+ //
28
+ // The floors (scoped, run-ctx-aware):
29
+ // - BASE floor: `global.models.judge_model` (renamed from pinned_judge) +
30
+ // `global.models.default` where needed;
31
+ // `global.workspace.repo` for TARGET-WRITING stages.
32
+ // - SOURCE floor: evaluate (ONLY when ctx.mode is DISCOVER) + diagnose (always)
33
+ // need a resolvable global source → else `source-required`.
34
+ // - TARGET floor: build + improve(at apply) + diagnose(at apply, UNLESS
35
+ // lifecycle.diagnostics.apply === "report-only") need a
36
+ // resolvable global target → else `target-required`.
37
+ // - PROVIDER floor: evaluate with judge_runtime === "in-house" needs a provider
38
+ // with credentials_ref → else `provider-required`.
39
+ //
40
+ // PURE + deterministic: no I/O, no clock, no random. Defensive against partial /
41
+ // undefined sub-objects so it can run on a fresh, mostly-empty config.
42
+ // ---------------------------------------------------------------------------
43
+
44
+ /** The run-context the onboarding check reads (all optional; defaults are conservative). */
45
+ export interface OnboardingRunContext {
46
+ /**
47
+ * The evaluate mode. `discover` (mine criteria from traces) NEEDS a source;
48
+ * a code/dataset run does NOT (it warns + streams to stdout instead). Only
49
+ * meaningful for the evaluate stage.
50
+ */
51
+ mode?: "discover" | "code" | "dataset" | string;
52
+ /**
53
+ * The evaluator judge runtime (renamed from `substrate`). `in-house` (provider
54
+ * SDK) NEEDS a provider credential; `agent-dispatch` / `code-based` /
55
+ * `user-framework` do not.
56
+ */
57
+ substrate?: "agent-dispatch" | "in-house" | "code-based" | "user-framework" | string;
58
+ /**
59
+ * True when the operator has requested APPLY (build/improve/diagnose write a
60
+ * fix). Absent/false ⇒ a draft-only run that does NOT demand a target.
61
+ */
62
+ apply?: boolean;
63
+ }
64
+
65
+ /**
66
+ * The stages that CONSUME an observability source (where traces come from).
67
+ * Evaluator + diagnostics care; spec / build / improve / audit do not.
68
+ *
69
+ * Typed `readonly AdlStageValue[]` so `gate.ts`'s `SOURCE_STAGES.includes(stage)`
70
+ * accepts any AdlStageValue. NOTE: evaluate is source-consuming ONLY in DISCOVER
71
+ * mode — that nuance lives in the floor logic (checkOnboardingComplete), not in
72
+ * this coarse membership set. `gate.ts` uses this only to decide whether to
73
+ * evaluate the source-aware floor at all.
74
+ */
75
+ export const SOURCE_STAGES: readonly AdlStageValue[] = [
76
+ AdlStage.Evaluate,
77
+ AdlStage.Diagnose,
78
+ ];
79
+
80
+ /** The stages that WRITE to a target (need a resolvable global target at apply). */
81
+ export const TARGET_STAGES: readonly AdlStageValue[] = [
82
+ AdlStage.Build,
83
+ AdlStage.Improve,
84
+ AdlStage.Diagnose,
85
+ ];
86
+
87
+ /** A single unmet onboarding requirement: the config key + why it's needed. */
88
+ export interface MissingKey {
89
+ key: string;
90
+ reason: string;
91
+ }
92
+
93
+ export interface OnboardingStatus {
94
+ complete: boolean;
95
+ /** The exact keys still required for onboarding to be complete (empty when complete). */
96
+ missing: MissingKey[];
97
+ }
98
+
99
+ /** True iff `s` is a non-empty trimmed string. */
100
+ function hasText(s: unknown): s is string {
101
+ return typeof s === "string" && s.trim() !== "";
102
+ }
103
+
104
+ // ── Role-based catalog resolution ─────────────────────────────────────────────
105
+
106
+ /**
107
+ * The outcome of resolving a role's catalog (source or target) under the SELECTION
108
+ * contract (a catalog entry marked `default: true` is auto-selected when multiple
109
+ * exist). The two BOUND outcomes are split (F2) so the run-time layer can tell an
110
+ * unambiguous single from a pre-picked default and prompt accordingly:
111
+ * - `resolved-single` — exactly ONE entry in the catalog: it auto-binds with NO
112
+ * prompt (there is nothing to disambiguate).
113
+ * - `resolved-default` — MULTIPLE entries, exactly one marked `default: true`: the
114
+ * default binds, but the run-time layer CONFIRMS it (the
115
+ * default is preselected; the operator may override). Both
116
+ * `resolved-single` + `resolved-default` are BINDABLE — the
117
+ * split is purely about the run-time prompt, not the floor.
118
+ * - `needs-selection` — multiple entries, none marked default; the operator
119
+ * picks at RUN time (NOT a hard-fail — a source/target
120
+ * EXISTS, so the floor is satisfied; do not block the gate).
121
+ * - `multiple-defaults` — multiple entries with >1 marked `default: true`; a
122
+ * CONFIG ERROR (the selector is ambiguous). NOT bindable —
123
+ * surfaces a distinct config-error floor.
124
+ * - `none` — zero entries; the relevant floor is UNMET.
125
+ *
126
+ * NOTE: the CONFIRM prompt (on `resolved-default`) and the PICK prompt (on
127
+ * `needs-selection`) are a RUN-TIME skill concern — NOT this pure gate's job. This
128
+ * module only classifies; the gate treats both bound outcomes as floor-satisfying.
129
+ */
130
+ export type RoleResolution<T> =
131
+ | { status: "resolved-single"; entry: T }
132
+ | { status: "resolved-default"; entry: T }
133
+ | { status: "needs-selection"; entries: T[] }
134
+ | { status: "multiple-defaults"; entries: T[] }
135
+ | { status: "none" };
136
+
137
+ /** A catalog entry participates in the SELECTION contract via an optional `default` flag. */
138
+ interface Selectable {
139
+ default?: boolean;
140
+ }
141
+
142
+ /**
143
+ * Shared SELECTION-contract precedence over a role catalog (source or target):
144
+ * 1. length 0 ⇒ none
145
+ * 2. length 1 ⇒ resolved-single (the single entry auto-binds, no prompt)
146
+ * 3. multiple:
147
+ * - exactly one `default: true` ⇒ resolved-default (binds; run-time CONFIRMS)
148
+ * - >1 `default: true` ⇒ multiple-defaults (config error)
149
+ * - 0 defaults ⇒ needs-selection (operator picks at run time)
150
+ * The `resolved-single` vs `resolved-default` split (F2) is a run-time-prompt
151
+ * distinction only — BOTH are bindable + both satisfy the onboarding floor.
152
+ * Pure + deterministic — no I/O, no clock; tolerant of an undefined catalog.
153
+ */
154
+ function resolveByRole<T extends Selectable>(catalog: readonly T[]): RoleResolution<T> {
155
+ if (catalog.length === 0) return { status: "none" };
156
+ if (catalog.length === 1) return { status: "resolved-single", entry: catalog[0]! };
157
+ const defaults = catalog.filter((e) => e.default === true);
158
+ if (defaults.length === 1) return { status: "resolved-default", entry: defaults[0]! };
159
+ if (defaults.length > 1) return { status: "multiple-defaults", entries: defaults };
160
+ return { status: "needs-selection", entries: [...catalog] };
161
+ }
162
+
163
+ /**
164
+ * Resolve the SOURCE bound by role from `global.sources` under the SELECTION
165
+ * contract. One ⇒ resolved-single (auto-bind); many+one-default ⇒ resolved-default
166
+ * (bind + run-time confirm); many+no-default ⇒ needs-selection (pick at run);
167
+ * many+multi-default ⇒ multiple-defaults (config error); none ⇒ none. Pure.
168
+ * Source-consumers (evaluate/diagnose) call this;
169
+ * there is NO source_ref — binding is by role + catalog cardinality + `default`.
170
+ */
171
+ export function resolveSourceByRole(config: MutagentConfig): RoleResolution<Source> {
172
+ return resolveByRole(config?.global?.sources ?? []);
173
+ }
174
+
175
+ /**
176
+ * Resolve the TARGET bound by role from `global.targets` under the SELECTION
177
+ * contract. One ⇒ resolved-single (auto-bind); many+one-default ⇒ resolved-default
178
+ * (bind + run-time confirm); many+no-default ⇒ needs-selection (pick at run);
179
+ * many+multi-default ⇒ multiple-defaults (config error); none ⇒ none. Pure.
180
+ * Target-writers (build/improve/diagnose-apply) call
181
+ * this; there is NO target_ref — binding is by role + cardinality + `default`.
182
+ */
183
+ export function resolveTargetByRole(config: MutagentConfig): RoleResolution<Target> {
184
+ return resolveByRole(config?.global?.targets ?? []);
185
+ }
186
+
187
+ /**
188
+ * True iff a role resolution yields a usable binding for the onboarding gate:
189
+ * `resolved-single` (unambiguous bind) OR `resolved-default` (default binds; the
190
+ * run-time layer confirms) OR `needs-selection` (a source/target EXISTS — the
191
+ * operator picks at run time; do NOT block the gate). `multiple-defaults` is a
192
+ * CONFIG ERROR (NOT bindable — the ambiguous selector must be fixed) and `none` is
193
+ * unmet. So `resolved-default` satisfies the floor exactly like `resolved-single`
194
+ * (it adds NO new blocker — the confirm is a run-time step, not a gate).
195
+ */
196
+ function isBindable<T>(r: RoleResolution<T>): boolean {
197
+ return (
198
+ r.status === "resolved-single" ||
199
+ r.status === "resolved-default" ||
200
+ r.status === "needs-selection"
201
+ );
202
+ }
203
+
204
+ /** True iff a role resolution is the `multiple-defaults` config error (>1 default). */
205
+ function isMultipleDefaults<T>(r: RoleResolution<T>): boolean {
206
+ return r.status === "multiple-defaults";
207
+ }
208
+
209
+ // ── Floor helpers ─────────────────────────────────────────────────────────────
210
+
211
+ /** True iff the stage WRITES to a target (needs workspace.repo + a target at apply). */
212
+ function isTargetStage(stage: AdlStageValue): boolean {
213
+ return TARGET_STAGES.includes(stage);
214
+ }
215
+
216
+ /**
217
+ * Does the evaluate stage need a source? Only in DISCOVER mode. A code/dataset
218
+ * run warns + streams to stdout instead of demanding a source.
219
+ */
220
+ function evaluateNeedsSource(ctx: OnboardingRunContext): boolean {
221
+ return ctx.mode === "discover";
222
+ }
223
+
224
+ /** True iff diagnostics is configured report-only (⇒ no target needed at apply). */
225
+ function diagnosticsIsReportOnly(config: MutagentConfig): boolean {
226
+ return config?.lifecycle?.diagnostics?.apply === ApplyKind.ReportOnly;
227
+ }
228
+
229
+ /**
230
+ * Does a TARGET-writing stage demand a target for THIS run?
231
+ * - build — at apply (build IS a write; a draft does not).
232
+ * - improve — at apply (draft remedies need no target).
233
+ * - diagnose — at apply, UNLESS lifecycle.diagnostics.apply === "report-only".
234
+ */
235
+ function stageNeedsTarget(
236
+ stage: AdlStageValue,
237
+ config: MutagentConfig,
238
+ ctx: OnboardingRunContext,
239
+ ): boolean {
240
+ if (!isTargetStage(stage)) return false;
241
+ if (ctx.apply !== true) return false;
242
+ if (stage === AdlStage.Diagnose && diagnosticsIsReportOnly(config)) return false;
243
+ return true;
244
+ }
245
+
246
+ /** True iff ≥1 provider carries a usable credentials_ref (env-var name OR {env,path}). */
247
+ function hasUsableProvider(config: MutagentConfig): boolean {
248
+ const providers = config?.global?.providers ?? [];
249
+ return providers.some((p) => {
250
+ const ref = p?.credentials_ref;
251
+ if (typeof ref === "string") return hasText(ref);
252
+ return typeof ref === "object" && ref !== null && hasText((ref as { env?: unknown }).env);
253
+ });
254
+ }
255
+
256
+ /**
257
+ * Check whether onboarding is complete for the given config + the ONE stage being
258
+ * invoked + the run context.
259
+ *
260
+ * @param config the parsed (possibly partial) MutagentConfig (v0.2.0).
261
+ * @param activeStages the ADL stage(s) the operator is invoking. Scoped floors
262
+ * apply per stage; de-duped so a stage listed twice can't
263
+ * push duplicate keys.
264
+ * @param ctx run context: { mode, substrate, apply } — drives the
265
+ * source(discover-only)/target(at-apply)/provider(in-house) floors.
266
+ * @returns { complete, missing } — `missing` lists the exact keys still needed,
267
+ * keyed by the v0.2.0 reason strings (`judge-model-required`,
268
+ * `source-required`, `target-required`, `provider-required`, the
269
+ * SELECTION config-error keys `source-config-error` /
270
+ * `target-config-error` (>1 `default: true`), plus the base
271
+ * workspace/models keys). NOTE: `needs-selection` (multi source/target,
272
+ * no default) does NOT appear here — it satisfies the floor (pick at run).
273
+ *
274
+ * Pure + deterministic: same inputs ⇒ deep-equal result. No I/O, no clock.
275
+ */
276
+ export function checkOnboardingComplete(
277
+ config: MutagentConfig,
278
+ activeStages: AdlStageValue[],
279
+ ctx: OnboardingRunContext = {},
280
+ ): OnboardingStatus {
281
+ const missing: MissingKey[] = [];
282
+ const stages = Array.from(new Set(activeStages));
283
+
284
+ const needsJudgeModel = stages.some(
285
+ (s) => s === AdlStage.Evaluate || s === AdlStage.Audit,
286
+ );
287
+ const anyTargetStage = stages.some((s) => isTargetStage(s));
288
+
289
+ // ── BASE floor ──────────────────────────────────────────────────────────────
290
+ // judge_model — required by the judging stages (evaluate / audit).
291
+ if (needsJudgeModel && !hasText(config?.global?.models?.judge_model)) {
292
+ missing.push({
293
+ key: "global.models.judge_model",
294
+ reason: "a pinned judge model (global.models.judge_model) is required for the judging stage",
295
+ });
296
+ }
297
+ // default model — needed where a run executes a model (evaluate / build).
298
+ const needsDefaultModel =
299
+ stages.some((s) => s === AdlStage.Evaluate) || anyTargetStage;
300
+ if (needsDefaultModel && !hasText(config?.global?.models?.default)) {
301
+ missing.push({
302
+ key: "global.models.default",
303
+ reason: "a default model (global.models.default) is required",
304
+ });
305
+ }
306
+ // workspace.repo — needed by target-WRITING stages.
307
+ if (anyTargetStage && !hasText(config?.global?.workspace?.repo)) {
308
+ missing.push({
309
+ key: "global.workspace.repo",
310
+ reason: "the target repo/workspace (global.workspace.repo) is required for a target-writing stage",
311
+ });
312
+ }
313
+
314
+ // ── SOURCE floor ──────────────────────────────────────────────────────────────
315
+ // diagnose ALWAYS needs a source; evaluate needs one ONLY in DISCOVER mode.
316
+ // `needs-selection` (multi, no default) SATISFIES the floor (operator picks at
317
+ // run time). `multiple-defaults` (>1 default) is a distinct CONFIG ERROR.
318
+ const needsSource =
319
+ stages.some((s) => s === AdlStage.Diagnose) ||
320
+ (stages.some((s) => s === AdlStage.Evaluate) && evaluateNeedsSource(ctx));
321
+ if (needsSource) {
322
+ const srcRes = resolveSourceByRole(config);
323
+ if (isMultipleDefaults(srcRes)) {
324
+ missing.push({
325
+ key: "source-config-error",
326
+ reason:
327
+ "more than one global source (global.sources[]) is marked `default: true` — exactly one default may be set (or none, to pick at run time)",
328
+ });
329
+ } else if (!isBindable(srcRes)) {
330
+ missing.push({
331
+ key: "source-required",
332
+ reason: "a resolvable global source (global.sources[]) is required — none configured",
333
+ });
334
+ }
335
+ }
336
+
337
+ // ── TARGET floor ──────────────────────────────────────────────────────────────
338
+ // `needs-selection` (multi, no default) SATISFIES the floor. `multiple-defaults`
339
+ // (>1 default) is a distinct CONFIG ERROR.
340
+ const needsTarget = stages.some((s) => stageNeedsTarget(s, config, ctx));
341
+ if (needsTarget) {
342
+ const tgtRes = resolveTargetByRole(config);
343
+ if (isMultipleDefaults(tgtRes)) {
344
+ missing.push({
345
+ key: "target-config-error",
346
+ reason:
347
+ "more than one global target (global.targets[]) is marked `default: true` — exactly one default may be set (or none, to pick at run time)",
348
+ });
349
+ } else if (!isBindable(tgtRes)) {
350
+ missing.push({
351
+ key: "target-required",
352
+ reason: "a resolvable global target (global.targets[]) is required at apply — none configured",
353
+ });
354
+ }
355
+ }
356
+
357
+ // ── PROVIDER floor ──────────────────────────────────────────────────────────
358
+ // evaluate with an in-house judge runtime needs a provider credential.
359
+ const needsProvider =
360
+ stages.some((s) => s === AdlStage.Evaluate) && ctx.substrate === "in-house";
361
+ if (needsProvider && !hasUsableProvider(config)) {
362
+ missing.push({
363
+ key: "provider-required",
364
+ reason: "an in-house judge runtime needs a provider with a credentials_ref (global.providers[]) — none usable",
365
+ });
366
+ }
367
+
368
+ return { complete: missing.length === 0, missing };
369
+ }