@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,210 @@
1
+ /**
2
+ * scripts/edd/edd-types.ts
3
+ * ---------------------------------------------------------------------------
4
+ * Shared categorical constants + TypeBox contracts for the ADL IMPROVE stage —
5
+ * the Eval-Driven-Development (EDD) loop (F18 closure + F19 variance-first).
6
+ *
7
+ * EDD is the ③ IMPROVE stage of the ADL: after the initial *build, the loop
8
+ * drives spec ↔ impl ↔ eval to full green. Two findings live here:
9
+ *
10
+ * F19 — VARIANCE-FIRST. The FIRST focus after the build is eliminating per-case
11
+ * VARIANCE (run each case ~N times; the verdict must stop flapping) BEFORE
12
+ * measuring accuracy over the full dataset. "Without stabilizing variance
13
+ * first, accuracy over big samples is wasted." (variance-gate.ts gates this.)
14
+ *
15
+ * F18 — EDD CLOSURE. The evaluator (judge-only, EV-051 — it NEVER fixes) REQUESTS
16
+ * an AI-Engineer to amend the Agent / AgentSpec. The request carries the
17
+ * failing cases + the proposed remedy target (agentspec vs impl); the engineer
18
+ * amends; the suite re-runs. (change-request.ts is the structured contract.)
19
+ *
20
+ * This module is PURE — it holds only categorical constants + TypeBox shapes. No
21
+ * clock / Math.random / network (coding-rules · C-PIN). The two consumer modules
22
+ * (variance-gate.ts · change-request.ts) import from here.
23
+ *
24
+ * Kept in lockstep with schemas/edd-change-request.schema.yaml (the human shape).
25
+ */
26
+ import { type Static, Type } from "@sinclair/typebox";
27
+
28
+ // ── EDD phase ordering (F19 — variance precedes accuracy) ───────────────────
29
+ /**
30
+ * The ordered EDD phases. The controller enforces this order: a build is
31
+ * followed by VARIANCE stabilization, and ACCURACY is only measured once
32
+ * variance is stable. DONE is the terminal full-green state; STOPPED is a
33
+ * bounded non-convergence exit (max-swings / wallclock / no-improvement).
34
+ */
35
+ export const EddPhase = {
36
+ /** the initial *build landed; the loop has not stabilized variance yet. */
37
+ Build: "build",
38
+ /** F19 — repeat-N the SAME cases; drive per-case verdict spread below threshold. */
39
+ Variance: "variance",
40
+ /** accuracy over the full dataset — ONLY entered once variance is stable. */
41
+ Accuracy: "accuracy",
42
+ /** terminal — variance-stable AND accuracy-met (full green). */
43
+ Done: "done",
44
+ /** terminal — bounded non-convergence (report the convergence delta). */
45
+ Stopped: "stopped",
46
+ } as const;
47
+ export type EddPhaseValue = (typeof EddPhase)[keyof typeof EddPhase];
48
+
49
+ // ── F18 — remedy target (which artifact the engineer amends) ────────────────
50
+ /**
51
+ * The remedy target the evaluator PROPOSES on a change-request. The evaluator
52
+ * never fixes (EV-051) — it names WHERE the fix belongs and the engineer amends:
53
+ * - agentspec : the DEFINITION (system_prompt / jobs / sop / criteria). The
54
+ * def→impl cascade means the engineer re-runs *build after editing.
55
+ * - impl : the IMPLEMENTATION scaffold only (a build-faithfulness / wiring
56
+ * defect that does NOT change the spec).
57
+ */
58
+ export const RemedyTarget = {
59
+ AgentSpec: "agentspec",
60
+ Impl: "impl",
61
+ } as const;
62
+ export type RemedyTargetValue = (typeof RemedyTarget)[keyof typeof RemedyTarget];
63
+
64
+ // ── F18 — change-request lifecycle status ───────────────────────────────────
65
+ /**
66
+ * The lifecycle of one change-request as it crosses the SendMessage seam. The
67
+ * evaluator emits `requested`; the engineer transitions it to `amended`
68
+ * (re-eval pending) or `rejected` (with a reason — e.g. the remedy target is
69
+ * wrong, or the failing cases are not reproducible against the spec).
70
+ */
71
+ export const ChangeRequestStatus = {
72
+ Requested: "requested",
73
+ Amended: "amended",
74
+ Rejected: "rejected",
75
+ } as const;
76
+ export type ChangeRequestStatusValue =
77
+ (typeof ChangeRequestStatus)[keyof typeof ChangeRequestStatus];
78
+
79
+ // ── F18 — why the EDD loop stopped (the bounded terminator) ─────────────────
80
+ /**
81
+ * The observable, bounded reasons the EDD loop terminates. `full-green` is the
82
+ * SUCCESS terminator (variance-stable AND accuracy-met). The other three are the
83
+ * afkloop-legal bounds that prevent an infinite loop — each reports a convergence
84
+ * delta. There is NO open-ended "keep going" terminator.
85
+ */
86
+ export const EddStopReason = {
87
+ /** SUCCESS — variance-stable AND accuracy ≥ target. */
88
+ FullGreen: "full-green",
89
+ /** bound — hit the max number of evaluator→engineer→re-eval swings. */
90
+ MaxSwings: "max-swings",
91
+ /** bound — hit the wall-clock budget. */
92
+ MaxWallclock: "max-wallclock",
93
+ /** bound — N consecutive swings with no measurable improvement. */
94
+ NoImprovementStreak: "no-improvement-streak",
95
+ } as const;
96
+ export type EddStopReasonValue =
97
+ (typeof EddStopReason)[keyof typeof EddStopReason];
98
+
99
+ // ── F19 — per-case variance observation (one case, repeat-N verdicts) ───────
100
+ /**
101
+ * One eval case run repeat-N times. `verdicts` is the per-rerun OutcomeVerdict
102
+ * string ("pass" | "fail" | "uncertain") so this contract stays decoupled from
103
+ * the evaluate.ts numeric mapping (variance-gate.ts adapts it via evalScoreVariance).
104
+ */
105
+ export const CaseVarianceObservationSchema = Type.Object(
106
+ {
107
+ caseId: Type.String({ minLength: 1 }),
108
+ /** the criterion this spread is measured for (one case may span criteria). */
109
+ criterionId: Type.String({ minLength: 1 }),
110
+ /** the per-rerun verdicts; length === repeat-N. */
111
+ verdicts: Type.Array(Type.String({ minLength: 1 }), { minItems: 1 }),
112
+ /** OPTIONAL per-rerun ordered tool trajectories (drives trajectory spread). */
113
+ trajectories: Type.Optional(Type.Array(Type.Array(Type.String()))),
114
+ },
115
+ { $id: "CaseVarianceObservation", additionalProperties: false },
116
+ );
117
+ export type CaseVarianceObservation = Static<typeof CaseVarianceObservationSchema>;
118
+
119
+ // ── F18 — a failing case bundled into a change-request ──────────────────────
120
+ /**
121
+ * One failing (or chronically-uncertain) case the evaluator hands to the engineer.
122
+ * Carries the criterion, the critique (verbatim from the verdict), and ≥1 structured
123
+ * grounding ref {obs,path,value} — the SAME machine-checkable grounding the judge
124
+ * already emitted (GA-1). A failing case with NO ref is a defect (ungrounded ask).
125
+ */
126
+ export const FailingCaseRefSchema = Type.Object(
127
+ {
128
+ caseId: Type.String({ minLength: 1 }),
129
+ criterionId: Type.String({ minLength: 1 }),
130
+ /** verbatim critique from the verdict that flagged this case. */
131
+ critique: Type.String({ minLength: 1 }),
132
+ /** ≥1 structured grounding ref — the evidence the critique already cites. */
133
+ refs: Type.Array(
134
+ Type.Object(
135
+ {
136
+ obs: Type.String(),
137
+ path: Type.String(),
138
+ value: Type.String(),
139
+ },
140
+ { additionalProperties: false },
141
+ ),
142
+ { minItems: 1 },
143
+ ),
144
+ },
145
+ { $id: "FailingCaseRef", additionalProperties: false },
146
+ );
147
+ export type FailingCaseRef = Static<typeof FailingCaseRefSchema>;
148
+
149
+ // ── F18 — the evaluator → ai-engineer change-request (the SendMessage payload) ─
150
+ /**
151
+ * The structured request the evaluator emits to the AI-Engineer over SendMessage.
152
+ * It is a REQUEST, never a patch — the evaluator stays judge-only (EV-051). The
153
+ * engineer consumes it, amends the named `remedyTarget`, and replies with a
154
+ * ChangeRequestResponse. `swing` is the 1-based loop iteration (drives the bound).
155
+ */
156
+ export const EddChangeRequestSchema = Type.Object(
157
+ {
158
+ requestId: Type.String({ minLength: 1 }),
159
+ /** 1-based EDD swing index (the Nth evaluator→engineer→re-eval cycle). */
160
+ swing: Type.Integer({ minimum: 1 }),
161
+ subject: Type.String({ minLength: 1 }),
162
+ /** WHERE the engineer should fix — the evaluator PROPOSES, never patches. */
163
+ remedyTarget: Type.Union([
164
+ Type.Literal(RemedyTarget.AgentSpec),
165
+ Type.Literal(RemedyTarget.Impl),
166
+ ]),
167
+ /** the failing cases driving this request (≥1; each grounded). */
168
+ failingCases: Type.Array(FailingCaseRefSchema, { minItems: 1 }),
169
+ /** the proposed remedy in NL — a hypothesis for the engineer, not a mandate. */
170
+ proposedRemedy: Type.String({ minLength: 1 }),
171
+ status: Type.Literal(ChangeRequestStatus.Requested),
172
+ },
173
+ { $id: "EddChangeRequest", additionalProperties: false },
174
+ );
175
+ export type EddChangeRequest = Static<typeof EddChangeRequestSchema>;
176
+ /** Public alias used by change-request.ts (avoids shadowing the schema const). */
177
+ export type EddChangeRequestType = Static<typeof EddChangeRequestSchema>;
178
+
179
+ // ── F18 — the ai-engineer → evaluator response ──────────────────────────────
180
+ /**
181
+ * The engineer's reply after consuming a request. `amended` ⇒ the named target was
182
+ * edited (and, for an agentspec target, *build was re-run — def→impl cascade) and a
183
+ * re-eval is now warranted; `rejected` ⇒ the engineer declined (wrong target, not
184
+ * reproducible) WITH a reason. The loop controller reads `status` to decide the next
185
+ * step. There is NO "fixed it, trust me, skip re-eval" path — re-eval always follows.
186
+ */
187
+ export const ChangeRequestResponseSchema = Type.Object(
188
+ {
189
+ requestId: Type.String({ minLength: 1 }),
190
+ status: Type.Union([
191
+ Type.Literal(ChangeRequestStatus.Amended),
192
+ Type.Literal(ChangeRequestStatus.Rejected),
193
+ ]),
194
+ /** which artifact was actually amended (echoes the request's remedyTarget). */
195
+ amendedTarget: Type.Optional(
196
+ Type.Union([
197
+ Type.Literal(RemedyTarget.AgentSpec),
198
+ Type.Literal(RemedyTarget.Impl),
199
+ ]),
200
+ ),
201
+ /** for an agentspec amend: was *build re-run to cascade def→impl? */
202
+ rebuilt: Type.Optional(Type.Boolean()),
203
+ /** human summary of the amendment OR the rejection reason (always present). */
204
+ note: Type.String({ minLength: 1 }),
205
+ },
206
+ { $id: "ChangeRequestResponse", additionalProperties: false },
207
+ );
208
+ export type ChangeRequestResponse = Static<typeof ChangeRequestResponseSchema>;
209
+ /** Public alias used by change-request.ts (avoids shadowing the schema const). */
210
+ export type ChangeRequestResponseType = Static<typeof ChangeRequestResponseSchema>;
@@ -0,0 +1,186 @@
1
+ /**
2
+ * scripts/edd/variance-gate.ts — F19 VARIANCE-FIRST gate.
3
+ * ---------------------------------------------------------------------------
4
+ * The EDD loop's FIRST focus after the build: eliminate per-case VARIANCE before
5
+ * measuring accuracy. Run each case ~N times (default 5), report the spread, and
6
+ * GATE — accuracy over the full dataset is only worth measuring once the verdict
7
+ * has stopped flapping on the SAME cases. "Without stabilizing variance first,
8
+ * accuracy over big samples is wasted."
9
+ *
10
+ * This module is ADDITIVE and INTEGRATION-FRIENDLY. It does NOT re-implement the
11
+ * variance math — it consumes the already-shipped `evalScoreVariance` from
12
+ * evaluate.ts (EV-054). It adds (a) the per-case gate decision, (b) the run-level
13
+ * roll-up, and (c) the phase-ordering check that forbids entering ACCURACY until
14
+ * VARIANCE is stable.
15
+ *
16
+ * PURE — no clock / Math.random / network (coding-rules · C-PIN). Same inputs →
17
+ * same gate, always.
18
+ */
19
+ import { evalScoreVariance, trajectoryVariance } from "../evaluate.ts";
20
+ import { OutcomeVerdict, type OutcomeVerdictValue } from "../contracts/eval-types.ts";
21
+ import {
22
+ EddPhase,
23
+ type CaseVarianceObservation,
24
+ type EddPhaseValue,
25
+ } from "./edd-types.ts";
26
+
27
+ /** F19 default repeats — run each case 5× before measuring accuracy. */
28
+ export const DEFAULT_REPEAT_N = 5;
29
+
30
+ /**
31
+ * Default per-case variance threshold. A case is variance-STABLE iff its eval-score
32
+ * population variance is ≤ this. 0 = byte-identical verdict across reruns (the ideal);
33
+ * the small default tolerance admits a single uncertain among passes without flapping
34
+ * the gate. Override per subject via `VarianceGateConfig.maxVariance`.
35
+ */
36
+ export const DEFAULT_MAX_VARIANCE = 0;
37
+
38
+ export interface VarianceGateConfig {
39
+ /** required repeats per case (the gate is UNDER-SAMPLED below this). */
40
+ repeatN: number;
41
+ /** the per-case eval-score variance ceiling (≤ ⇒ stable). */
42
+ maxVariance: number;
43
+ }
44
+
45
+ export const DEFAULT_VARIANCE_GATE_CONFIG: VarianceGateConfig = {
46
+ repeatN: DEFAULT_REPEAT_N,
47
+ maxVariance: DEFAULT_MAX_VARIANCE,
48
+ };
49
+
50
+ /** Map an OutcomeVerdict string to the canonical enum value (validates the set). */
51
+ function asVerdict(s: string): OutcomeVerdictValue {
52
+ if (s === OutcomeVerdict.Pass || s === OutcomeVerdict.Fail || s === OutcomeVerdict.Uncertain) {
53
+ return s;
54
+ }
55
+ // Fail-loud: an out-of-set verdict is a contract violation, not a silent pass.
56
+ throw new Error(`variance-gate: out-of-set verdict "${s}" (expected pass|fail|uncertain)`);
57
+ }
58
+
59
+ export interface CaseVarianceResult {
60
+ caseId: string;
61
+ criterionId: string;
62
+ /** the eval-score population variance across the reruns (0 = no flap). */
63
+ variance: number;
64
+ mean: number;
65
+ /** distinct verdicts seen across reruns (1 = no flap). */
66
+ distinctVerdicts: number;
67
+ /** how many reruns were observed (vs the required repeatN). */
68
+ observed: number;
69
+ /** false ⇒ fewer reruns than repeatN: the gate is under-sampled for this case. */
70
+ sufficientlySampled: boolean;
71
+ /** distinct ordered tool trajectories (when trajectories supplied; else 0). */
72
+ distinctTrajectories: number;
73
+ /** true iff variance ≤ maxVariance AND sufficientlySampled. */
74
+ stable: boolean;
75
+ }
76
+
77
+ /**
78
+ * Evaluate ONE case's repeat-N spread against the threshold. PURE.
79
+ * A case is stable iff it was sampled ≥ repeatN times AND its variance is within
80
+ * the ceiling. Under-sampling NEVER reads as stable (you cannot certify a spread
81
+ * you did not measure).
82
+ */
83
+ export function gradeCaseVariance(
84
+ obs: CaseVarianceObservation,
85
+ config: VarianceGateConfig = DEFAULT_VARIANCE_GATE_CONFIG,
86
+ ): CaseVarianceResult {
87
+ const verdicts = obs.verdicts.map(asVerdict);
88
+ const sv = evalScoreVariance(verdicts);
89
+ const distinctVerdicts = new Set(verdicts).size;
90
+ const observed = verdicts.length;
91
+ const sufficientlySampled = observed >= config.repeatN;
92
+ const distinctTrajectories =
93
+ obs.trajectories !== undefined ? trajectoryVariance(obs.trajectories).distinct : 0;
94
+ const withinThreshold = sv.variance <= config.maxVariance;
95
+ return {
96
+ caseId: obs.caseId,
97
+ criterionId: obs.criterionId,
98
+ variance: sv.variance,
99
+ mean: sv.mean,
100
+ distinctVerdicts,
101
+ observed,
102
+ sufficientlySampled,
103
+ distinctTrajectories,
104
+ stable: withinThreshold && sufficientlySampled,
105
+ };
106
+ }
107
+
108
+ export interface VarianceGateResult {
109
+ /** the per-case grades (sorted by caseId then criterionId for C-PIN stability). */
110
+ cases: CaseVarianceResult[];
111
+ /** count of cases whose variance exceeds the ceiling. */
112
+ flapping: number;
113
+ /** count of cases sampled below repeatN. */
114
+ underSampled: number;
115
+ /** the worst (highest) per-case variance observed. */
116
+ maxVariance: number;
117
+ /**
118
+ * THE GATE: true iff EVERY case is variance-stable (within threshold AND
119
+ * sufficiently sampled). The accuracy phase MUST NOT be entered until this
120
+ * is true (F19). A run with zero cases is NOT passed (nothing was measured).
121
+ */
122
+ passed: boolean;
123
+ }
124
+
125
+ /**
126
+ * Roll up the per-case grades into the run-level variance gate. PURE +
127
+ * deterministic: the case list is sorted so the artifact is byte-identical
128
+ * across reruns (C-PIN). An empty case set fails the gate (you cannot certify
129
+ * stability you never measured).
130
+ */
131
+ export function evaluateVarianceGate(
132
+ observations: CaseVarianceObservation[],
133
+ config: VarianceGateConfig = DEFAULT_VARIANCE_GATE_CONFIG,
134
+ ): VarianceGateResult {
135
+ const cases = observations
136
+ .map((o) => gradeCaseVariance(o, config))
137
+ .sort((a, b) =>
138
+ a.caseId === b.caseId
139
+ ? a.criterionId.localeCompare(b.criterionId)
140
+ : a.caseId.localeCompare(b.caseId),
141
+ );
142
+ const flapping = cases.filter((c) => c.variance > config.maxVariance).length;
143
+ const underSampled = cases.filter((c) => !c.sufficientlySampled).length;
144
+ const maxVariance = cases.reduce((m, c) => Math.max(m, c.variance), 0);
145
+ const passed = cases.length > 0 && cases.every((c) => c.stable);
146
+ return { cases, flapping, underSampled, maxVariance, passed };
147
+ }
148
+
149
+ /**
150
+ * F19 phase-ordering guard. Given the current phase + the variance gate result,
151
+ * decide whether the loop MAY advance to the accuracy phase. This encodes the
152
+ * hard ordering: VARIANCE must pass BEFORE ACCURACY is entered.
153
+ *
154
+ * Returns the NEXT phase. PURE — a decision function, no side effects.
155
+ * - from `build`/`variance`: advance to `accuracy` ONLY if the gate passed;
156
+ * otherwise stay in `variance` (keep stabilizing).
157
+ * - from any other phase: returned unchanged (this guard owns only the
158
+ * variance→accuracy transition; DONE/STOPPED are owned by the loop controller).
159
+ */
160
+ export function nextPhaseAfterVariance(
161
+ current: EddPhaseValue,
162
+ gate: VarianceGateResult,
163
+ ): EddPhaseValue {
164
+ if (current === EddPhase.Build || current === EddPhase.Variance) {
165
+ return gate.passed ? EddPhase.Accuracy : EddPhase.Variance;
166
+ }
167
+ return current;
168
+ }
169
+
170
+ /**
171
+ * Hard assertion for callers that must NOT proceed to accuracy with a flapping
172
+ * suite. THROWS when accuracy is attempted before variance is stable (F19 — the
173
+ * "accuracy over big samples is wasted" guard). Use at the accuracy-run entry.
174
+ */
175
+ export function assertVarianceStableBeforeAccuracy(gate: VarianceGateResult): void {
176
+ if (!gate.passed) {
177
+ const detail =
178
+ gate.cases.length === 0
179
+ ? "no cases measured"
180
+ : `${gate.flapping} flapping, ${gate.underSampled} under-sampled (maxVariance=${gate.maxVariance})`;
181
+ throw new Error(
182
+ `variance-gate (F19): refusing to measure accuracy before variance is stable — ${detail}. ` +
183
+ `Stabilize per-case variance first; accuracy over big samples is wasted otherwise.`,
184
+ );
185
+ }
186
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * scripts/emit-completeness.ts — WS-1: the judge EMIT-CONTRACT completeness gate.
3
+ * ---------------------------------------------------------------------------
4
+ * The §9.4 judge walk is OPTIONAL in the schema (`present iff the judge emitted
5
+ * it`), so a judge that drops the structured reasoning still produces a
6
+ * schema-valid verdict file. That silent gap is what starved the report's
7
+ * Trajectory (§2) + Self-Eval (§5) tabs: walk/understanding(M2)/expectedTrajectory(M3)
8
+ * were 0/500 and agentSteps only 200/500, while the verdicts themselves were
9
+ * fully reasoned (rich critiques). This module makes the gap MACHINE-VISIBLE.
10
+ *
11
+ * It assesses, over the COMPLETE-fidelity dispatched verdicts (an INCOMPLETE trace
12
+ * legitimately SKIPS the per-criterion walk via the deterministic node-1 gate, so
13
+ * it is EXEMPT — never counted as a missing emit), how many carry each required
14
+ * judge-walk field. PURE + ADVISORY: it NEVER throws and NEVER alters a verdict —
15
+ * it returns coverage counts + a loud `warning` when a required field is wholly
16
+ * absent. Two consumers read the SAME numbers: the engine's aggregate log (loud
17
+ * assert) and the report's §5 Self-Eval "Emit-Completeness" panel (honest coverage).
18
+ */
19
+ import type { MatrixVerdictFile } from "./contracts/eval-matrix.ts";
20
+
21
+ /** The judge-walk fields the emit-contract REQUIRES on a complete-fidelity verdict. */
22
+ export const EMIT_FIELDS = ["agentSteps", "understanding", "expectedTrajectory", "judgeSteps"] as const;
23
+ export type EmitField = (typeof EMIT_FIELDS)[number];
24
+
25
+ /** Per-field coverage over the eligible (complete-fidelity) dispatched verdicts. */
26
+ export interface EmitFieldCoverage {
27
+ field: EmitField;
28
+ /** how many eligible verdicts carry a NON-EMPTY value for this field. */
29
+ present: number;
30
+ /** trajectoryIds of the eligible verdicts MISSING this field. */
31
+ missing: string[];
32
+ /** present / eligible, as a 0..100 integer (100 when there are 0 eligible). */
33
+ pct: number;
34
+ }
35
+
36
+ export interface EmitCompleteness {
37
+ /** dispatched verdicts total (complete + incomplete). */
38
+ total: number;
39
+ /** the DENOMINATOR — complete-fidelity verdicts that SHOULD carry the walk. */
40
+ eligible: number;
41
+ /** INCOMPLETE-fidelity verdicts, exempt from the walk contract (node-1 short-circuit). */
42
+ exemptIncomplete: number;
43
+ /** per-field coverage. */
44
+ fields: EmitFieldCoverage[];
45
+ /** eligible verdicts carrying ALL required fields (a fully-complete emit). */
46
+ completeEmits: number;
47
+ /** completeEmits / eligible, 0..100 integer. */
48
+ completePct: number;
49
+ /** SET (loud) when ≥1 required field is wholly absent across all eligible verdicts. */
50
+ warning?: string;
51
+ }
52
+
53
+ /** A verdict file is eligible for the walk contract iff its fidelity is COMPLETE. */
54
+ function isCompleteFidelity(f: MatrixVerdictFile): boolean {
55
+ // fidelity is required on the schema; `complete:false` is the node-1 INCOMPLETE gate.
56
+ return f.fidelity?.complete !== false;
57
+ }
58
+
59
+ /** Non-empty test for one emit field on a verdict file. */
60
+ function fieldPresent(f: MatrixVerdictFile, field: EmitField): boolean {
61
+ const v = (f as Record<string, unknown>)[field];
62
+ if (Array.isArray(v)) return v.length > 0;
63
+ if (field === "understanding") {
64
+ // M2 is an object — present iff it carries a non-empty rephrase/understanding.
65
+ if (v === undefined || v === null || typeof v !== "object") return false;
66
+ return Object.keys(v as object).length > 0;
67
+ }
68
+ return v !== undefined && v !== null;
69
+ }
70
+
71
+ /**
72
+ * Assess the judge emit-contract completeness over the dispatched verdict files.
73
+ * PURE. NEVER throws. The denominator is the COMPLETE-fidelity verdicts (INCOMPLETE
74
+ * traces are exempt — they short-circuit the walk by design).
75
+ */
76
+ export function assessEmitCompleteness(files: MatrixVerdictFile[]): EmitCompleteness {
77
+ const total = files.length;
78
+ const eligibleFiles = files.filter(isCompleteFidelity);
79
+ const exemptIncomplete = total - eligibleFiles.length;
80
+ const eligible = eligibleFiles.length;
81
+
82
+ const fields: EmitFieldCoverage[] = EMIT_FIELDS.map((field) => {
83
+ const missing = eligibleFiles.filter((f) => !fieldPresent(f, field)).map((f) => f.trajectoryId);
84
+ const present = eligible - missing.length;
85
+ return { field, present, missing, pct: eligible > 0 ? Math.round((100 * present) / eligible) : 100 };
86
+ });
87
+
88
+ const completeEmits = eligibleFiles.filter((f) => EMIT_FIELDS.every((field) => fieldPresent(f, field))).length;
89
+ const completePct = eligible > 0 ? Math.round((100 * completeEmits) / eligible) : 100;
90
+
91
+ const result: EmitCompleteness = {
92
+ total,
93
+ eligible,
94
+ exemptIncomplete,
95
+ fields,
96
+ completeEmits,
97
+ completePct,
98
+ };
99
+
100
+ const whollyAbsent = fields.filter((f) => eligible > 0 && f.present === 0).map((f) => f.field);
101
+ if (whollyAbsent.length > 0) {
102
+ result.warning =
103
+ `JUDGE EMIT-CONTRACT GAP: ${whollyAbsent.join(", ")} absent on ALL ${eligible} complete-fidelity ` +
104
+ `verdict(s) — the §9.4 judge walk was dropped. The Trajectory (§2) + Self-Eval (§5) tabs read ` +
105
+ `these as starved. The judge (#mode-judge-trajectory) MUST emit M2 understanding, M3 ` +
106
+ `expectedTrajectory, agentSteps and judgeSteps on every complete-fidelity trajectory ` +
107
+ `(assets/agents/evaluator.md §9.4 walk). agentSteps is factual trace data — reconstruct it ` +
108
+ `deterministically when the judge omits it; M2/M3/judgeSteps are judge reasoning — resend on absence.`;
109
+ }
110
+ return result;
111
+ }
@@ -0,0 +1,160 @@
1
+ /**
2
+ * scripts/eval-engine.ts — the ADL EVAL-stage ENGINE FORK resolver (Type A — PURE).
3
+ * ---------------------------------------------------------------------------
4
+ * F7 / F9 / F14. When the ADL `*build` stage hands the evaluator a freshly-built
5
+ * agent, `*build-evals` / `*evaluate` must ASK which eval engine to implement:
6
+ *
7
+ * - Path A `native-matrix` — mutagent NATIVE eval-matrix + LLM-judge SUB-AGENTS.
8
+ * HARD DEPENDENCY on a Claude-Code host (to spawn the judges). For a CODE
9
+ * framework target (Mastra/TS) it ALSO needs the built agent to EMIT
10
+ * logs/traces to a known sink for the judge to read (F9). The CC dependency +
11
+ * sink requirement are SURFACED in the menu (F7) — never discovered late.
12
+ * - Path B `code-written` — evals written in the TARGET'S OWN language
13
+ * (bun/TS for Mastra): deterministic code-checks + an LLM-judge call VIA SDK +
14
+ * eval-criteria checks. PORTABLE — no CC sub-agents, so a non-CC user is not
15
+ * trapped in the matrix (F14).
16
+ *
17
+ * The fork is TARGET-CONDITIONAL (F9): a code FRAMEWORK target may pick EITHER
18
+ * engine; a `harness:*` target is native-only (there is no target language to
19
+ * write portable evals into). This module is PURE DATA + gates — the
20
+ * AskUserQuestion prompt and the actual codegen live elsewhere
21
+ * (codegen-evals.ts). Subject-agnostic; no clock / random / network.
22
+ */
23
+ import {
24
+ EvalEngine,
25
+ type EvalEngineValue,
26
+ type EvalEngineOption,
27
+ type EvalEnginePlan,
28
+ type EngineTargetInput,
29
+ } from "./contracts/eval-engine.ts";
30
+
31
+ const HARNESS_PREFIX = "harness:";
32
+
33
+ /**
34
+ * Is the target a coding FRAMEWORK (mastra · langgraph · pydantic-ai · …) rather
35
+ * than a `harness:*` runtime? A framework has a target LANGUAGE we can write
36
+ * portable code-written evals into; a harness does not. PURE.
37
+ */
38
+ export function isFrameworkTarget(target: EngineTargetInput): boolean {
39
+ return !target.targetFramework.startsWith(HARNESS_PREFIX);
40
+ }
41
+
42
+ /**
43
+ * The discoverable OUTPUT SINK an engine writes (and, for native-on-framework,
44
+ * the sink the built agent must EMIT to). Always relative to the host project
45
+ * root — the discoverability success-gate ("outputs land in a discoverable
46
+ * sink"). PURE.
47
+ */
48
+ export function defaultOutputSink(engine: EvalEngineValue, target: EngineTargetInput): string {
49
+ if (engine === EvalEngine.CodeWritten) {
50
+ // Path B writes the eval suite + its results in the target's own tree.
51
+ return ".mutagent/evaluator/code-evals/";
52
+ }
53
+ // Path A. On a CODE framework the built agent emits logs/traces HERE for the
54
+ // matrix judge to read; on a harness target the judge reads CC transcripts
55
+ // directly, but the verdicts + scorecard still land under the run dir.
56
+ return isFrameworkTarget(target)
57
+ ? ".mutagent/evaluator/agent-logs/"
58
+ : ".mutagent/evaluator/runs/";
59
+ }
60
+
61
+ /**
62
+ * The target-conditional ENGINE MENU (F9). A code framework offers BOTH paths
63
+ * (Path A + Path B); a `harness:*` target is native-only. The Claude-Code
64
+ * dependency + the log-sink requirement are SURFACED on each option (F7) so the
65
+ * picker never silently traps a user in the matrix. Deterministic order:
66
+ * code-written first (the recommended, portable default for a framework), then
67
+ * native-matrix. PURE.
68
+ */
69
+ export function chooseEvalEngineOptions(target: EngineTargetInput): EvalEngineOption[] {
70
+ const framework = isFrameworkTarget(target);
71
+ const nativeNeedsSink = framework; // a code framework must emit to a sink (F9)
72
+ const nativeOption: EvalEngineOption = {
73
+ engine: EvalEngine.NativeMatrix,
74
+ label: "Path A — mutagent native eval-matrix (LLM-judge sub-agents)",
75
+ summary: framework
76
+ ? "Eval-matrix judged by Claude-Code sub-agents. Requires a Claude-Code host AND the " +
77
+ "built agent to emit logs/traces to a known sink for the judge to read."
78
+ : "Eval-matrix judged by Claude-Code sub-agents reading the harness session transcripts. " +
79
+ "Requires a Claude-Code host.",
80
+ requiresClaudeCode: true,
81
+ requiresLogSink: nativeNeedsSink,
82
+ portable: false,
83
+ recommended: !framework, // native is the only (thus default) choice for a harness
84
+ };
85
+ if (!framework) {
86
+ // harness:* — native-only (no target language for portable code-written evals).
87
+ return [nativeOption];
88
+ }
89
+ const codeOption: EvalEngineOption = {
90
+ engine: EvalEngine.CodeWritten,
91
+ label: `Path B — code-written evals in ${target.runtime}/${target.targetFramework}`,
92
+ summary:
93
+ "Evals written in the target's own language: deterministic code-checks + an LLM-judge " +
94
+ "call via SDK + eval-criteria checks. Portable — runs WITHOUT Claude Code.",
95
+ requiresClaudeCode: false,
96
+ requiresLogSink: false,
97
+ portable: true,
98
+ recommended: true, // portability-first default for a code framework
99
+ };
100
+ return [codeOption, nativeOption];
101
+ }
102
+
103
+ /**
104
+ * Gate: an engine choice must MATCH the target (F9). `code-written` needs a
105
+ * target LANGUAGE — it is rejected on a `harness:*` target. `native-matrix`
106
+ * matches any target. THROWS (fail-loud, no silent re-route). PURE.
107
+ */
108
+ export function assertEngineMatchesTarget(
109
+ engine: EvalEngineValue,
110
+ target: EngineTargetInput,
111
+ ): void {
112
+ if (engine === EvalEngine.CodeWritten && !isFrameworkTarget(target)) {
113
+ throw new Error(
114
+ `assertEngineMatchesTarget: code-written evals require a code-FRAMEWORK target ` +
115
+ `with a writable language, but target_framework='${target.targetFramework}' is a ` +
116
+ `harness target. A harness target is native-matrix only (Path A). ` +
117
+ `Choose native-matrix or re-target to a code framework.`,
118
+ );
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Resolve a user's engine choice into the RESOLVED plan `*evaluate` runs against.
124
+ * Surfaces the Path-A dependencies (Claude Code + log sink) explicitly. Unknown
125
+ * engine → THROW (no silent default). PURE.
126
+ */
127
+ export function resolveEvalEngine(
128
+ choice: EvalEngineValue,
129
+ target: EngineTargetInput,
130
+ ): EvalEnginePlan {
131
+ if (choice !== EvalEngine.NativeMatrix && choice !== EvalEngine.CodeWritten) {
132
+ throw new Error(
133
+ `resolveEvalEngine: unknown eval engine '${String(choice)}'. ` +
134
+ `Choose one of {${EvalEngine.NativeMatrix}, ${EvalEngine.CodeWritten}}.`,
135
+ );
136
+ }
137
+ assertEngineMatchesTarget(choice, target);
138
+ const framework = isFrameworkTarget(target);
139
+ const requiresClaudeCode = choice === EvalEngine.NativeMatrix;
140
+ const requiresLogSink = choice === EvalEngine.NativeMatrix && framework;
141
+ const outputSink = defaultOutputSink(choice, target);
142
+ const rationale =
143
+ choice === EvalEngine.CodeWritten
144
+ ? `Code-written evals in ${target.runtime}/${target.targetFramework} — portable, ` +
145
+ `runs without Claude Code (F14). Results land in ${outputSink}.`
146
+ : framework
147
+ ? `Native eval-matrix judged by Claude-Code sub-agents. The built agent MUST emit ` +
148
+ `logs/traces to ${outputSink} for the judge to read (F9).`
149
+ : `Native eval-matrix judged by Claude-Code sub-agents reading the harness ` +
150
+ `session transcripts directly.`;
151
+ return {
152
+ engine: choice,
153
+ target,
154
+ targetIsFramework: framework,
155
+ requiresClaudeCode,
156
+ requiresLogSink,
157
+ outputSink,
158
+ rationale,
159
+ };
160
+ }