@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,105 @@
1
+ /**
2
+ * scripts/cli/variance-check.ts — coordinator entrypoint.
3
+ * ---------------------------------------------------------------------------
4
+ * The COORDINATOR role (executor != reviewer): compares TWO run bundles on the
5
+ * fixed 15-dim determinism scorecard and emits the delta + trend. This is fully
6
+ * deterministic — no judge, no model — so it runs as a complete wired script.
7
+ *
8
+ * variance-check.ts <bundleDirA> <bundleDirB> [--out <scorecard.json>]
9
+ * [--generated-at <iso>] [--emit-masked]
10
+ */
11
+ import { writeFileSync } from "node:fs";
12
+ import { loadBundle } from "../load-bundle.ts";
13
+ import { varianceCompare } from "../variance-compare.ts";
14
+ import { assembleScorecard } from "../assemble-scorecard.ts";
15
+ import { maskedCanonicalJson } from "../mask.ts";
16
+ import { DEFAULT_GENERATED_AT } from "./audit-run.ts";
17
+
18
+ interface Args {
19
+ a: string;
20
+ b: string;
21
+ out?: string;
22
+ generatedAt: string;
23
+ emitMasked: boolean;
24
+ }
25
+
26
+ function parseArgs(argv: string[]): Args {
27
+ const positional: string[] = [];
28
+ const flags: Record<string, string | boolean> = {};
29
+ for (let i = 0; i < argv.length; i++) {
30
+ const a = argv[i];
31
+ if (a.startsWith("--")) {
32
+ const key = a.slice(2);
33
+ const next = argv[i + 1];
34
+ if (next && !next.startsWith("--")) {
35
+ flags[key] = next;
36
+ i++;
37
+ } else flags[key] = true;
38
+ } else positional.push(a);
39
+ }
40
+ if (positional.length < 2) {
41
+ throw new Error(
42
+ "usage: variance-check.ts <bundleDirA> <bundleDirB> [--out <file>] [--generated-at <iso>] [--emit-masked]",
43
+ );
44
+ }
45
+ return {
46
+ a: positional[0],
47
+ b: positional[1],
48
+ out: (flags.out as string) || undefined,
49
+ generatedAt: (flags["generated-at"] as string) || DEFAULT_GENERATED_AT,
50
+ emitMasked: flags["emit-masked"] === true,
51
+ };
52
+ }
53
+
54
+ export function main(argvIn?: string[]): number {
55
+ const argv =
56
+ argvIn ??
57
+ (typeof Bun !== "undefined" ? Bun.argv.slice(2) : process.argv.slice(2));
58
+ const args = parseArgs(argv);
59
+
60
+ const { bundle: a } = loadBundle(args.a);
61
+ const { bundle: b } = loadBundle(args.b);
62
+ const trend = varianceCompare(a, b);
63
+
64
+ // Carry the trend into a TREND-only scorecard frame (GATE empty — this is the
65
+ // coordinator's variance comparison, not a conformance gate).
66
+ const scorecard = assembleScorecard({
67
+ subject: a.runId,
68
+ runId: `${a.runId}__vs__${b.runId}`,
69
+ generatedAt: args.generatedAt,
70
+ rows: [],
71
+ trendDimensions: trend.dimensions,
72
+ trendRunPair: trend.runPair,
73
+ });
74
+
75
+ const json = args.emitMasked
76
+ ? maskedCanonicalJson(scorecard)
77
+ : JSON.stringify(scorecard, null, 2);
78
+ if (args.out) writeFileSync(args.out, json + "\n");
79
+
80
+ console.info(
81
+ JSON.stringify(
82
+ {
83
+ runPair: trend.runPair,
84
+ varianceScore: trend.varianceScore,
85
+ dimensions: trend.dimensions.length,
86
+ diverged: trend.dimensions
87
+ .filter((d) => d.divergence === "diverged")
88
+ .map((d) => d.name),
89
+ out: args.out ?? "(stdout only)",
90
+ },
91
+ null,
92
+ 2,
93
+ ),
94
+ );
95
+ // exit 0 when byte-identical (varianceScore 0), 1 otherwise.
96
+ return trend.varianceScore === 0 ? 0 : 1;
97
+ }
98
+
99
+ declare const Bun: { argv: string[] } | undefined;
100
+ const isMain =
101
+ typeof import.meta !== "undefined" &&
102
+ (import.meta as unknown as { main?: boolean }).main === true;
103
+ if (isMain) {
104
+ process.exit(main());
105
+ }
@@ -0,0 +1,248 @@
1
+ /**
2
+ * scripts/code-eval.ts — P3 (EX-2): the v2 CODE-track primitive library.
3
+ * ---------------------------------------------------------------------------
4
+ * Code-class criteria (§5b `check_method: deterministic`, and the pre-filter
5
+ * half of `hybrid`) are evaluated by DETERMINISTIC code-eval scripts the
6
+ * evaluator agent runs via its Bash tool — NO LLM, ZERO judge tokens,
7
+ * byte-identical across reruns (restores full C-PIN on code rows; closes M1/M2).
8
+ *
9
+ * This is a generic, SUBJECT-AGNOSTIC primitive set over the `EvalTrace` shape:
10
+ * - presence — a field is present + non-empty
11
+ * - string-equality — exact (optionally case-insensitive) match
12
+ * - format-validity — a regex/format conformance check
13
+ * - schema-conformance — an object carries the required keys
14
+ * - ref-integrity — cross-stage: every value produced in stage A is
15
+ * present in stage B's output (referential integrity)
16
+ * - recovery-after-failure — TEMPORAL: a failure marker on an observation MUST
17
+ * be followed by a recovery tool LATER in the trace; an
18
+ * un-recovered failure is a "silent drop" (FAIL).
19
+ * - tool-output-failure — a named tool's success flag is false on any call (FAIL).
20
+ * A per-subject extraction (check-method-router.ts) maps a code-class
21
+ * MinedCriterion → one of these specs; the primitives themselves hold NO subject
22
+ * literal — the field names, fail values, and tool names are all PARAMETERS, so
23
+ * the temporal/tool primitives are reusable on ANY agent's failure modes (the
24
+ * sample `send-failure-silent-drop` mode is just one parameterization).
25
+ *
26
+ * TWO-WORLDS BOUNDARY: this is the v2 code-track over `EvalTrace` +
27
+ * `MinedCriterion`. It deliberately does NOT import the v1 audit world
28
+ * (`run-deterministic.ts` / `contracts/types.ts` 6-value Track over RunBundle) —
29
+ * the two stay disjoint.
30
+ *
31
+ * PURE + deterministic: no clock / random / network. Reading a trace field is
32
+ * the only effect-free input; the verdict is a pure function of (spec, trace).
33
+ */
34
+ import type { EvalTrace, TraceObservation } from "./contracts/eval-types.ts";
35
+
36
+ /** A single code-eval's binary, deterministic outcome. `detail` → verdict critique. */
37
+ export interface CodeEvalResult {
38
+ result: "pass" | "fail";
39
+ detail: string;
40
+ }
41
+
42
+ /**
43
+ * Read a dotted path off an `EvalTrace`. Supports:
44
+ * - `output.response`, `input.prompt` → navigate the trace object
45
+ * - `obs:<name>.<path>` → the named GENERATION observation's
46
+ * output, then navigate (SV-1: per-stage
47
+ * outputs live in the observations)
48
+ * Returns undefined for any missing segment (tolerant — never throws). PURE.
49
+ */
50
+ export function readTracePath(trace: EvalTrace, path: string): unknown {
51
+ if (path.startsWith("obs:")) {
52
+ const rest = path.slice(4);
53
+ const dot = rest.indexOf(".");
54
+ const name = dot === -1 ? rest : rest.slice(0, dot);
55
+ const sub = dot === -1 ? "" : rest.slice(dot + 1);
56
+ const obs = trace.observations.find(
57
+ (o: TraceObservation) => o.name === name && typeof o.type === "string" && o.type.toUpperCase() === "GENERATION",
58
+ );
59
+ if (obs === undefined) return undefined;
60
+ return sub.length === 0 ? obs.output : navigate(obs.output, sub);
61
+ }
62
+ return navigate(trace as unknown, path);
63
+ }
64
+
65
+ /** Navigate a dotted path through a plain object graph. Undefined on any gap. */
66
+ function navigate(root: unknown, path: string): unknown {
67
+ let cur: unknown = root;
68
+ for (const seg of path.split(".")) {
69
+ if (cur === null || typeof cur !== "object") return undefined;
70
+ cur = (cur as Record<string, unknown>)[seg];
71
+ if (cur === undefined) return undefined;
72
+ }
73
+ return cur;
74
+ }
75
+
76
+ /** Coerce a value to a search "haystack" string for ref-integrity. */
77
+ function haystack(value: unknown): string {
78
+ if (typeof value === "string") return value;
79
+ if (value === undefined || value === null) return "";
80
+ return JSON.stringify(value);
81
+ }
82
+
83
+ /** Coerce a producer value to its set of string tokens (array → items; scalar → [it]). */
84
+ function tokens(value: unknown): string[] {
85
+ if (Array.isArray(value)) return value.map((v) => (typeof v === "string" ? v : JSON.stringify(v)));
86
+ if (value === undefined || value === null) return [];
87
+ return [typeof value === "string" ? value : JSON.stringify(value)];
88
+ }
89
+
90
+ /**
91
+ * Coerce a scalar trace value to a canonical string for EXACT equality compare
92
+ * (used by the temporal/tool primitives). Booleans/numbers stringify (`false` →
93
+ * "false", `0` → "0"); strings pass through; null/undefined → "" (so a missing
94
+ * field never spuriously equals a non-empty `failEquals`); objects JSON-serialize.
95
+ */
96
+ function coerce(value: unknown): string {
97
+ if (typeof value === "string") return value;
98
+ if (typeof value === "boolean" || typeof value === "number" || typeof value === "bigint") {
99
+ return String(value);
100
+ }
101
+ if (value === undefined || value === null) return "";
102
+ return JSON.stringify(value);
103
+ }
104
+
105
+ /** The `name` of an observation, or "" when unnamed. */
106
+ function obsName(o: TraceObservation): string {
107
+ return typeof o.name === "string" ? o.name : "";
108
+ }
109
+
110
+ // ── The CodeEvalSpec union (one per primitive) ──────────────────────────────
111
+
112
+ export type CodeEvalSpec =
113
+ | { primitive: "presence"; field: string }
114
+ | { primitive: "string-equality"; field: string; expected: string; caseInsensitive?: boolean }
115
+ | { primitive: "format-validity"; field: string; pattern: string }
116
+ | { primitive: "schema-conformance"; field: string; requiredKeys: string[] }
117
+ | { primitive: "ref-integrity"; producer: string; consumer: string }
118
+ | {
119
+ primitive: "recovery-after-failure";
120
+ /** path read RELATIVE TO each observation (e.g. "output.status"). */
121
+ failField: string;
122
+ /** the coerced value at `failField` that marks an observation as a failure. */
123
+ failEquals: string;
124
+ /** observation `name`s that count as a recovery reaction AFTER the failure. */
125
+ recoveryTools: string[];
126
+ }
127
+ | {
128
+ primitive: "tool-output-failure";
129
+ /** the observation `name` of the tool to inspect. */
130
+ tool: string;
131
+ /** path read RELATIVE TO the tool observation; `false` (bool/string) ⇒ failure. */
132
+ successPath: string;
133
+ };
134
+
135
+ function pass(detail: string): CodeEvalResult {
136
+ return { result: "pass", detail };
137
+ }
138
+ function fail(detail: string): CodeEvalResult {
139
+ return { result: "fail", detail };
140
+ }
141
+
142
+ /**
143
+ * Run one code-eval over a trace → a deterministic binary verdict. Exhaustive on
144
+ * the primitive union; an UNKNOWN primitive THROWS (no silent pass — a
145
+ * misconfigured code-eval is a fail-loud error, never a fabricated success). PURE.
146
+ */
147
+ export function runCodeEval(spec: CodeEvalSpec, trace: EvalTrace): CodeEvalResult {
148
+ switch (spec.primitive) {
149
+ case "presence": {
150
+ const v = readTracePath(trace, spec.field);
151
+ const empty =
152
+ v === undefined ||
153
+ v === null ||
154
+ (typeof v === "string" && v.length === 0) ||
155
+ (Array.isArray(v) && v.length === 0);
156
+ return empty ? fail(`'${spec.field}' is absent/empty`) : pass(`'${spec.field}' is present`);
157
+ }
158
+ case "string-equality": {
159
+ const v = readTracePath(trace, spec.field);
160
+ const s = typeof v === "string" ? v : haystack(v);
161
+ const a = spec.caseInsensitive === true ? s.toLowerCase() : s;
162
+ const b = spec.caseInsensitive === true ? spec.expected.toLowerCase() : spec.expected;
163
+ return a === b
164
+ ? pass(`'${spec.field}' equals expected`)
165
+ : fail(`'${spec.field}'='${s}' != expected '${spec.expected}'`);
166
+ }
167
+ case "format-validity": {
168
+ const v = readTracePath(trace, spec.field);
169
+ const s = typeof v === "string" ? v : haystack(v);
170
+ return new RegExp(spec.pattern).test(s)
171
+ ? pass(`'${spec.field}' matches /${spec.pattern}/`)
172
+ : fail(`'${spec.field}'='${s}' does not match /${spec.pattern}/`);
173
+ }
174
+ case "schema-conformance": {
175
+ const v = readTracePath(trace, spec.field);
176
+ if (v === null || typeof v !== "object") {
177
+ return fail(`'${spec.field}' is not an object`);
178
+ }
179
+ const obj = v as Record<string, unknown>;
180
+ const missing = spec.requiredKeys.filter((k) => obj[k] === undefined);
181
+ return missing.length === 0
182
+ ? pass(`'${spec.field}' has all required keys`)
183
+ : fail(`'${spec.field}' missing keys: ${missing.join(", ")}`);
184
+ }
185
+ case "ref-integrity": {
186
+ const producerTokens = tokens(readTracePath(trace, spec.producer));
187
+ const hay = haystack(readTracePath(trace, spec.consumer));
188
+ const missing = producerTokens.filter((t) => !hay.includes(t));
189
+ return missing.length === 0
190
+ ? pass(`all ${producerTokens.length} '${spec.producer}' value(s) present in '${spec.consumer}'`)
191
+ : fail(`'${spec.consumer}' is missing producer value(s): ${missing.join(", ")}`);
192
+ }
193
+ case "recovery-after-failure": {
194
+ // TEMPORAL: find the FIRST observation whose `failField` marks a failure, then
195
+ // require a recovery-tool observation AFTER it. No failure ⇒ vacuously pass.
196
+ let failIdx = -1;
197
+ for (let i = 0; i < trace.observations.length; i++) {
198
+ const v = navigate(trace.observations[i], spec.failField);
199
+ if (v !== undefined && coerce(v) === spec.failEquals) {
200
+ failIdx = i;
201
+ break;
202
+ }
203
+ }
204
+ if (failIdx === -1) {
205
+ return pass(
206
+ `no observation has '${spec.failField}'=='${spec.failEquals}' — no failure to recover from`,
207
+ );
208
+ }
209
+ const recoverySet = new Set(spec.recoveryTools);
210
+ const after = trace.observations.slice(failIdx + 1);
211
+ const recovered = after.find((o) => recoverySet.has(obsName(o)));
212
+ return recovered !== undefined
213
+ ? pass(
214
+ `failure at obs#${failIdx} ('${spec.failField}'=='${spec.failEquals}') was followed by ` +
215
+ `recovery tool '${obsName(recovered)}'`,
216
+ )
217
+ : fail(
218
+ `failure at obs#${failIdx} ('${spec.failField}'=='${spec.failEquals}') with NO recovery ` +
219
+ `tool (${spec.recoveryTools.join(" | ")}) AFTER it — silent drop`,
220
+ );
221
+ }
222
+ case "tool-output-failure": {
223
+ const calls = trace.observations.filter((o) => obsName(o) === spec.tool);
224
+ if (calls.length === 0) {
225
+ return pass(`no '${spec.tool}' observation present — nothing to check`);
226
+ }
227
+ const failed = calls.filter((o) => {
228
+ const v = navigate(o, spec.successPath);
229
+ return v === false || coerce(v) === "false";
230
+ });
231
+ return failed.length === 0
232
+ ? pass(`all ${calls.length} '${spec.tool}' call(s) report '${spec.successPath}' != false`)
233
+ : fail(
234
+ `'${spec.tool}' reports failure ('${spec.successPath}'==false) in ` +
235
+ `${failed.length}/${calls.length} call(s)`,
236
+ );
237
+ }
238
+ default: {
239
+ // exhaustiveness: an unknown primitive is a fail-loud error.
240
+ const unknown = spec as { primitive?: unknown };
241
+ throw new Error(
242
+ `runCodeEval: unknown code-eval primitive '${String(unknown.primitive)}'. ` +
243
+ "Known: presence | string-equality | format-validity | schema-conformance | " +
244
+ "ref-integrity | recovery-after-failure | tool-output-failure.",
245
+ );
246
+ }
247
+ }
248
+ }
@@ -0,0 +1,285 @@
1
+ /**
2
+ * scripts/code-quality-verdict.ts — the CODE-QUALITY judge mode (Wave-2 W2I1).
3
+ * ---------------------------------------------------------------------------
4
+ * A JUDGE mode that scores a CODE subject's QUALITY (the amended/scaffolded
5
+ * implementation of a `code`-kind subject) and emits a binary PASS/FAIL quality
6
+ * verdict with a critique-before-verdict per criterion. It is the (b) half of the
7
+ * ⑤ IMPROVE loop's code-target BOTH-gate: "converged" for a `code` subject = the
8
+ * subject's OWN test suite green (a deterministic gate the session records as
9
+ * `testsGreen`) AND this code-quality verdict PASSes. Neither alone converges.
10
+ *
11
+ * DISTINCT FROM `code-eval.ts`. That file is the DETERMINISTIC code-track primitive
12
+ * library (presence/string-equality/... over an EvalTrace — no LLM, byte-identical).
13
+ * This file is an LLM JUDGE mode: it scores the irreducibly-subjective quality of a
14
+ * code implementation (spec-faithfulness, maintainability, error-handling, ...) that
15
+ * a deterministic primitive cannot decide.
16
+ *
17
+ * INVARIANTS (consistent with the existing evaluator cell):
18
+ * - JUDGE-ONLY (EV-051). It scores; it NEVER fixes. Failures route to the ⑤ loop's
19
+ * ai-engineer amend (via the loop, not from here).
20
+ * - HOST-RUNTIME. Under the DEFAULT agent-dispatch substrate the authoritative
21
+ * rubric lives in the evaluator agent def (`#mode-judge-code-quality`), and the
22
+ * verdict comes from a dispatched subagent — this file's prompt is the
23
+ * provider-callable MIRROR for the OPTIONAL in-house / export substrate (same
24
+ * operator-named exception as judge-prompt-template.ts). No provider key on the
25
+ * default path.
26
+ * - PINNED model + temperature 0 (C-PIN). `runCodeQualityJudge` THROWS if the pin
27
+ * is not (modelId present AND temperature === 0) — reruns must be byte-identical.
28
+ * - PURE renderer + a thin injected-seam run wrapper. No clock, no random, no
29
+ * network; the LLM call is the injected `JudgeInvoke` seam so tests drive it.
30
+ */
31
+ import { parseCritiqueVerdict, type JudgeInvoke } from "./determine-outcome.ts";
32
+ import type { JudgePin } from "./build-evals.ts";
33
+ import type { CritiqueVerdict } from "./contracts/eval-types.ts";
34
+
35
+ /** Severity of a code-quality criterion — gates the aggregate (CRIT/HIGH block). */
36
+ export const CodeQualitySeverity = {
37
+ Critical: "critical",
38
+ High: "high",
39
+ Medium: "medium",
40
+ } as const;
41
+ export type CodeQualitySeverityValue =
42
+ (typeof CodeQualitySeverity)[keyof typeof CodeQualitySeverity];
43
+
44
+ /** One binary code-quality criterion the judge scores. */
45
+ export interface CodeQualityCriterion {
46
+ /** Stable id (byte-identity key + report anchor). */
47
+ id: string;
48
+ /** The one-line binary statement the judge decides pass/fail on. */
49
+ statement: string;
50
+ /** What a PASS looks like (concrete, so the judge is not guessing). */
51
+ passDefinition: string;
52
+ /** What a FAIL looks like. */
53
+ failDefinition: string;
54
+ /** Gating weight — a `fail`/`uncertain` on a CRIT/HIGH criterion blocks the gate. */
55
+ severity: CodeQualitySeverityValue;
56
+ }
57
+
58
+ /**
59
+ * ⚠️ FLAGGED-FOR-OPERATOR-SIGN-OFF (Wave-2 W2I1). This is the DRAFT default set of
60
+ * acceptance criteria that define "code quality-pass" BEYOND tests-green. It is
61
+ * implemented behind this clearly-named default so the operator can confirm/adjust
62
+ * the criteria + their severities WITHOUT a code change to the loop. The picks
63
+ * below are a conservative, subject-agnostic starting point — NOT a final contract.
64
+ *
65
+ * The five drafted criteria (each BINARY, critique-before-verdict):
66
+ * Q1 spec-faithful (critical) — the impl realizes the agentspec DEFINITION the
67
+ * amend targeted; no dropped tool / JTBD / silently
68
+ * altered system_prompt (def→impl cascade held).
69
+ * Q2 addresses-diagnosis (high) — the change actually targets the diagnosed
70
+ * root-cause locus, not an adjacent symptom.
71
+ * Q3 no-regression (high) — no unrelated behavior removed/broken; scope stayed
72
+ * on what the remedy named (scope discipline).
73
+ * Q4 error-handling (high) — failure paths are handled, not silently dropped
74
+ * (recovery/observability preserved).
75
+ * Q5 maintainable (medium) — readable, framework-idiomatic, no dead code /
76
+ * copy-paste / obvious footgun introduced.
77
+ *
78
+ * Aggregation (also FLAGGED): the gate is severity-gated — a `fail` OR `uncertain`
79
+ * on any CRITICAL/HIGH criterion blocks the quality-pass; MEDIUM is advisory. The
80
+ * operator may instead choose strict-all-pass or a different severity map.
81
+ */
82
+ export const DEFAULT_CODE_QUALITY_CRITERIA: readonly CodeQualityCriterion[] = [
83
+ {
84
+ id: "Q1-spec-faithful",
85
+ statement: "The implementation realizes the agentspec definition the amend targeted.",
86
+ passDefinition:
87
+ "PASS: every spec-declared tool / job-to-be-done is present and the operative system_prompt is unchanged except where the amend intended; the def→impl cascade held.",
88
+ failDefinition:
89
+ "FAIL: a spec-declared tool or JTBD is missing, or the system_prompt was altered beyond the amend intent (the impl forked from the SSoT).",
90
+ severity: CodeQualitySeverity.Critical,
91
+ },
92
+ {
93
+ id: "Q2-addresses-diagnosis",
94
+ statement: "The change targets the diagnosed root-cause locus, not an adjacent symptom.",
95
+ passDefinition:
96
+ "PASS: the edit is at (or directly causes a fix at) the RCA-named locus / the failing-case root.",
97
+ failDefinition:
98
+ "FAIL: the change edits an unrelated place or patches a symptom while the root cause remains.",
99
+ severity: CodeQualitySeverity.High,
100
+ },
101
+ {
102
+ id: "Q3-no-regression",
103
+ statement: "The change introduces no unrelated regression and stays in scope.",
104
+ passDefinition:
105
+ "PASS: only the remedy-named surface changed; no unrelated behavior was removed or broken.",
106
+ failDefinition:
107
+ "FAIL: unrelated code was changed/removed, or a previously-working path was broken.",
108
+ severity: CodeQualitySeverity.High,
109
+ },
110
+ {
111
+ id: "Q4-error-handling",
112
+ statement: "Failure paths are handled, not silently dropped.",
113
+ passDefinition:
114
+ "PASS: error/failure branches surface, recover, or log per the subject's contract; no new silent drop.",
115
+ failDefinition:
116
+ "FAIL: a failure is swallowed with no recovery/notify/observability (a silent-drop regression).",
117
+ severity: CodeQualitySeverity.High,
118
+ },
119
+ {
120
+ id: "Q5-maintainable",
121
+ statement: "The code is readable, framework-idiomatic, and free of obvious footguns.",
122
+ passDefinition:
123
+ "PASS: clear structure, idiomatic to the target framework, no dead code / copy-paste / obvious footgun introduced.",
124
+ failDefinition:
125
+ "FAIL: unreadable/duplicated/dead code or an obvious maintainability footgun was introduced.",
126
+ severity: CodeQualitySeverity.Medium,
127
+ },
128
+ ] as const;
129
+
130
+ /** The code subject under quality review (minimal, subject-agnostic). */
131
+ export interface CodeQualitySubject {
132
+ /** Subject id (spec_id / target name) — provenance only. */
133
+ subjectId: string;
134
+ /** The target framework/harness the impl was built into (context for the judge). */
135
+ framework: string;
136
+ /** A compact summary of the agentspec DEFINITION the impl must realize (the SSoT). */
137
+ specSummary: string;
138
+ /** The applied change under review — the amend diff, or the scaffold summary. */
139
+ appliedChange: string;
140
+ /**
141
+ * The diagnosed root-cause / remedy locus this change was meant to address (feeds
142
+ * Q2). Empty for a fresh scaffold with no prior diagnosis.
143
+ */
144
+ diagnosisLocus?: string;
145
+ }
146
+
147
+ /** One criterion's judged result (critique-before-verdict, binary). */
148
+ export interface CodeQualityCriterionVerdict {
149
+ criterionId: string;
150
+ severity: CodeQualitySeverityValue;
151
+ result: CritiqueVerdict["result"]; // pass | fail | uncertain
152
+ critique: string;
153
+ confidence: number;
154
+ }
155
+
156
+ /** The aggregated code-quality verdict for one subject. */
157
+ export interface CodeQualityVerdict {
158
+ subjectId: string;
159
+ /** The binary quality gate — the (b) half of the ⑤ code-target BOTH-gate. */
160
+ pass: boolean;
161
+ perCriterion: CodeQualityCriterionVerdict[];
162
+ /** C-PIN provenance stamped on the verdict (byte-identity guarantee). */
163
+ pinned: JudgePin;
164
+ }
165
+
166
+ /**
167
+ * Render the code-quality judge prompt for ONE criterion — the provider-callable
168
+ * mirror of the `#mode-judge-code-quality` rubric. Critique-BEFORE-verdict, strictly
169
+ * BINARY (no Likert), judge-only. No decision is made here.
170
+ */
171
+ export function buildCodeQualityPrompt(
172
+ criterion: CodeQualityCriterion,
173
+ subject: CodeQualitySubject,
174
+ ): { system: string; user: string } {
175
+ const system = [
176
+ "You are a BINARY Pass/Fail code-QUALITY judge for ONE criterion of a CODE",
177
+ "subject (an agent/tooling implementation). Judge exactly this criterion and",
178
+ "nothing else. You are a JUDGE ONLY — you NEVER propose or write a fix.",
179
+ "",
180
+ "Quality is assessed BEYOND the subject's test suite (tests-green is a separate",
181
+ "deterministic gate). Judge the code as written against the criterion.",
182
+ "",
183
+ `Criterion (${criterion.id}, severity ${criterion.severity}): ${criterion.statement}`,
184
+ criterion.passDefinition,
185
+ criterion.failDefinition,
186
+ "",
187
+ "Outcomes are strictly BINARY: pass or fail (use uncertain ONLY when the change",
188
+ "genuinely lacks the evidence to decide). NO Likert scales, NO 1-5 / letter",
189
+ "grades, NO partial credit.",
190
+ "",
191
+ "Output STRICT JSON with the critique BEFORE the verdict (reason first, then",
192
+ "commit):",
193
+ '{ "critique": "<evidence-citing assessment>", "result": "pass"|"fail"|"uncertain",',
194
+ ' "confidence": <0..1> }',
195
+ ].join("\n");
196
+
197
+ const user = [
198
+ `Subject: ${subject.subjectId} · target framework: ${subject.framework}`,
199
+ "",
200
+ "Agentspec definition the implementation must realize (the SSoT):",
201
+ subject.specSummary,
202
+ "",
203
+ subject.diagnosisLocus !== undefined && subject.diagnosisLocus.length > 0
204
+ ? `Diagnosed root-cause / remedy locus (for the addresses-diagnosis check):\n${subject.diagnosisLocus}\n`
205
+ : "",
206
+ "Applied change under review (diff or scaffold summary):",
207
+ subject.appliedChange,
208
+ ]
209
+ .filter((l) => l !== "")
210
+ .join("\n");
211
+
212
+ return { system, user };
213
+ }
214
+
215
+ /**
216
+ * The PURE aggregation: severity-gate the per-criterion verdicts into ONE binary
217
+ * quality-pass. FLAGGED default rule — a `fail` OR `uncertain` on any CRITICAL/HIGH
218
+ * criterion blocks the pass; MEDIUM is advisory (never blocks). Deterministic.
219
+ */
220
+ export function codeQualityGatePass(
221
+ perCriterion: readonly CodeQualityCriterionVerdict[],
222
+ ): boolean {
223
+ for (const v of perCriterion) {
224
+ const gating =
225
+ v.severity === CodeQualitySeverity.Critical || v.severity === CodeQualitySeverity.High;
226
+ if (gating && v.result !== "pass") return false;
227
+ }
228
+ return true;
229
+ }
230
+
231
+ /**
232
+ * Run the code-quality judge over the criteria set under a PINNED model. THROWS if
233
+ * the pin is not (modelId present AND temperature === 0) — C-PIN (byte-identical
234
+ * reruns). Renders each criterion → the injected `JudgeInvoke` seam → parses
235
+ * (critique-before-verdict) → severity-gated aggregate. Under the DEFAULT
236
+ * agent-dispatch substrate the verdicts instead come from a dispatched
237
+ * `#mode-judge-code-quality` subagent (verdict files) and this wrapper is not used.
238
+ * Deterministic given (subject, judge, pin, criteria).
239
+ */
240
+ export async function runCodeQualityJudge(
241
+ subject: CodeQualitySubject,
242
+ judge: JudgeInvoke,
243
+ pin: JudgePin,
244
+ criteria: readonly CodeQualityCriterion[] = DEFAULT_CODE_QUALITY_CRITERIA,
245
+ ): Promise<CodeQualityVerdict> {
246
+ if (typeof pin.modelId !== "string" || pin.modelId.length === 0) {
247
+ throw new Error(
248
+ "runCodeQualityJudge: judge is not pinned (missing modelId). MODEL INTENT IS " +
249
+ "SACRED — a non-pinned judge can never produce a verdict (C-PIN).",
250
+ );
251
+ }
252
+ if (pin.temperature !== 0) {
253
+ throw new Error(
254
+ `runCodeQualityJudge: judge temperature=${pin.temperature} (!= 0) — not pinned. ` +
255
+ "MODEL INTENT IS SACRED: reruns must be byte-identical (C-PIN); refusing.",
256
+ );
257
+ }
258
+ if (criteria.length === 0) {
259
+ throw new Error(
260
+ "runCodeQualityJudge: empty criteria set — a code-quality verdict with no " +
261
+ "criteria would vacuously pass (a false-green). Refusing.",
262
+ );
263
+ }
264
+
265
+ const perCriterion: CodeQualityCriterionVerdict[] = [];
266
+ for (const criterion of criteria) {
267
+ const { system, user } = buildCodeQualityPrompt(criterion, subject);
268
+ const raw = await judge(system, user);
269
+ const v = parseCritiqueVerdict(raw);
270
+ perCriterion.push({
271
+ criterionId: criterion.id,
272
+ severity: criterion.severity,
273
+ result: v.result,
274
+ critique: v.critique,
275
+ confidence: v.confidence,
276
+ });
277
+ }
278
+
279
+ return {
280
+ subjectId: subject.subjectId,
281
+ pass: codeQualityGatePass(perCriterion),
282
+ perCriterion,
283
+ pinned: { modelId: pin.modelId, temperature: pin.temperature },
284
+ };
285
+ }