@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,535 @@
1
+ /**
2
+ * scripts/library/store.ts
3
+ * R2.3 (+D2) — class-memory library read/write store.
4
+ * Type A — Pure Script (file I/O; clock + home INJECTED for determinism).
5
+ *
6
+ * WRITE GATE (R2.3, LOAD-BEARING): the library is written ONLY from operator-
7
+ * APPROVED findings. writeApprovedFinding() refuses unless the caller passes
8
+ * `approved: true`. There is NO bypass — an un-approved finding NEVER lands in
9
+ * the library (mirrors the report's approval gate; do not bypass it).
10
+ *
11
+ * DETERMINISM: INDEX.md is sorted by entity slug; journal.md is append-only;
12
+ * pattern files are stable JSON. The only non-determinism (timestamps) is injected
13
+ * by the caller so tests are byte-stable.
14
+ *
15
+ * The library lives PER-HOST + GITIGNORED — see paths.ts. We never commit data.
16
+ */
17
+
18
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, appendFileSync, statSync } from "fs";
19
+ import {
20
+ libraryRoot,
21
+ indexPath,
22
+ byEntityRoot,
23
+ entityDir,
24
+ entityJsonPath,
25
+ journalPath,
26
+ patternsDir,
27
+ patternPath,
28
+ deepReadLedgerPath,
29
+ verdictLedgerPath,
30
+ entitySlug,
31
+ } from "./paths.ts";
32
+ import type {
33
+ DeepReadLedgerEntry,
34
+ LibraryEntity,
35
+ LibraryPattern,
36
+ LibraryRunRecord,
37
+ VerdictLedgerEntry,
38
+ VerdictPolarity,
39
+ VerdictSeverity,
40
+ } from "./types.ts";
41
+ import { DEEP_READ_LEDGER_TTL_MS } from "./types.ts";
42
+
43
+ export interface ApprovedFindingInput {
44
+ entityName: string;
45
+ entityType: LibraryEntity["entityType"];
46
+ /** MUST be true — the write gate refuses otherwise (R2.3 approved-only). */
47
+ approved: boolean;
48
+ findingId: string;
49
+ signal: string;
50
+ /** Regex source promoted as a Tier-0 detector (plain regex). */
51
+ regex: string;
52
+ regexFlags?: string;
53
+ /** D2 — verbatim operator invocation that produced this run. */
54
+ operatorInvocation?: string;
55
+ runId: string;
56
+ /** INJECTED timestamp (ISO8601) — keeps writes deterministic in tests. */
57
+ nowIso: string;
58
+
59
+ // ── UNIFIED VERDICT LEDGER mirror (OPT-IN, additive) ─────────────────────────
60
+ // When `entityFingerprint` is supplied, writeApprovedFinding ADDITIONALLY mirrors an
61
+ // "approved" verdict into the unified verdict-ledger.json (so the ledger records BOTH
62
+ // polarities). This is PURELY additive — a new file write; entity.json / patterns /
63
+ // journal / INDEX bytes are UNCHANGED. Absent → no mirror (fully backward-compatible).
64
+ /** Current entity fingerprint — presence ENABLES the approved-verdict mirror. */
65
+ entityFingerprint?: string;
66
+ /** Failure-mode triple for the mirrored approved verdict (provenance + memory). */
67
+ what?: string;
68
+ why?: string;
69
+ where?: string;
70
+ /** OPTIONAL richer narration (failureOrigin.whatHappened) for the mirrored verdict. */
71
+ whatHappened?: string;
72
+ /** Severity of the approved finding (mirrored verdict baseline). Defaults to "info". */
73
+ severity?: VerdictSeverity;
74
+ }
75
+
76
+ export interface WriteResult {
77
+ written: boolean;
78
+ reason: string;
79
+ entitySlug: string;
80
+ }
81
+
82
+ /** Ensure a directory exists (idempotent). */
83
+ function ensureDir(dir: string): void {
84
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
85
+ }
86
+
87
+ /** Load an entity record, or null when absent. */
88
+ export function loadEntity(slug: string, home?: string): LibraryEntity | null {
89
+ const p = entityJsonPath(slug, home);
90
+ if (!existsSync(p)) return null;
91
+ try {
92
+ return JSON.parse(readFileSync(p, "utf8")) as LibraryEntity;
93
+ } catch {
94
+ return null;
95
+ }
96
+ }
97
+
98
+ /**
99
+ * R2.3 — the SOLE library write path. Refuses unless `approved === true`. Creates
100
+ * the per-entity dir, upserts entity.json (append run + pattern), appends to the
101
+ * journal, writes the pattern file, and regenerates INDEX.md deterministically.
102
+ */
103
+ export function writeApprovedFinding(input: ApprovedFindingInput, home?: string): WriteResult {
104
+ const slug = entitySlug(input.entityName);
105
+
106
+ // WRITE GATE — approved-only (R2.3). No bypass.
107
+ if (!input.approved) {
108
+ return {
109
+ written: false,
110
+ reason: "REFUSED — library write requires an operator-APPROVED finding (R2.3 approved-only gate).",
111
+ entitySlug: slug,
112
+ };
113
+ }
114
+
115
+ ensureDir(entityDir(slug, home));
116
+ ensureDir(patternsDir(slug, home));
117
+
118
+ // Upsert entity.json.
119
+ const existing = loadEntity(slug, home);
120
+ const runRecord: LibraryRunRecord = {
121
+ runId: input.runId,
122
+ diagnosedAt: input.nowIso,
123
+ operatorInvocation: input.operatorInvocation,
124
+ approvedFindingCount: 1,
125
+ };
126
+ const pattern: LibraryPattern = {
127
+ patternId: `${slug}-${input.findingId}`,
128
+ signal: input.signal,
129
+ regex: input.regex,
130
+ flags: input.regexFlags,
131
+ sourceFindingId: input.findingId,
132
+ approvedAt: input.nowIso,
133
+ };
134
+
135
+ let entity: LibraryEntity;
136
+ if (existing) {
137
+ // Append run (append-only) + upsert pattern by id.
138
+ const runs = [...existing.runs, runRecord];
139
+ const patterns = upsertPattern(existing.patterns, pattern);
140
+ // BLOCK G — tolerate pre-ledger entity.json records (field added in Wave-17).
141
+ const deepReadLedger = existing.deepReadLedger ?? [];
142
+ entity = { ...existing, runs, patterns, deepReadLedger, updatedAt: input.nowIso };
143
+ } else {
144
+ entity = {
145
+ name: input.entityName,
146
+ entityType: input.entityType,
147
+ slug,
148
+ runs: [runRecord],
149
+ patterns: [pattern],
150
+ deepReadLedger: [],
151
+ createdAt: input.nowIso,
152
+ updatedAt: input.nowIso,
153
+ };
154
+ }
155
+
156
+ writeFileSync(entityJsonPath(slug, home), JSON.stringify(entity, null, 2) + "\n", "utf8");
157
+ writeFileSync(patternPath(slug, pattern.patternId, home), JSON.stringify(pattern, null, 2) + "\n", "utf8");
158
+
159
+ // Append-only journal entry.
160
+ const journalEntry =
161
+ `## ${input.nowIso} — ${input.findingId} (${input.signal})\n` +
162
+ `- run: ${input.runId}\n` +
163
+ (input.operatorInvocation ? `- invocation: ${input.operatorInvocation.replace(/\n/g, " ")}\n` : "") +
164
+ `- pattern: \`${input.regex}\`${input.regexFlags ? ` /${input.regexFlags}` : ""}\n\n`;
165
+ appendFileSync(journalPath(slug, home), journalEntry, "utf8");
166
+
167
+ // Regenerate deterministic INDEX.md.
168
+ regenerateIndex(home);
169
+
170
+ // UNIFIED VERDICT LEDGER — additive mirror of the APPROVED polarity. Fires ONLY when
171
+ // the caller supplies verdict context (entityFingerprint). Writes verdict-ledger.json
172
+ // ONLY — the approve→pattern promote above is byte-unchanged. No journal touch (the
173
+ // verdict ledger is the audit trail; journal.md stays byte-identical to pre-mirror).
174
+ if (input.entityFingerprint !== undefined) {
175
+ recordVerdict(
176
+ {
177
+ entityName: input.entityName,
178
+ verdict: "approved",
179
+ findingId: input.findingId,
180
+ what: input.what ?? "",
181
+ why: input.why ?? "",
182
+ where: input.where ?? "",
183
+ whatHappened: input.whatHappened,
184
+ severityAtDismissal: input.severity ?? "info",
185
+ entityFingerprint: input.entityFingerprint,
186
+ operatorInvocation: input.operatorInvocation,
187
+ runId: input.runId,
188
+ nowIso: input.nowIso,
189
+ },
190
+ home
191
+ );
192
+ }
193
+
194
+ return { written: true, reason: "Approved finding written to library.", entitySlug: slug };
195
+ }
196
+
197
+ function upsertPattern(patterns: LibraryPattern[], next: LibraryPattern): LibraryPattern[] {
198
+ const idx = patterns.findIndex((p) => p.patternId === next.patternId);
199
+ if (idx === -1) return [...patterns, next];
200
+ const copy = [...patterns];
201
+ copy[idx] = next;
202
+ return copy;
203
+ }
204
+
205
+ /**
206
+ * Regenerate INDEX.md from the on-disk entity records. DETERMINISTIC: entities are
207
+ * sorted by slug; each row lists run-count + pattern-count. Pure given disk state.
208
+ */
209
+ export function regenerateIndex(home?: string): void {
210
+ ensureDir(libraryRoot(home));
211
+ const root = byEntityRoot(home);
212
+ const slugs = existsSync(root)
213
+ ? readdirSync(root).filter((e) => {
214
+ try {
215
+ return statSync(entityDir(e, home)).isDirectory();
216
+ } catch {
217
+ return false;
218
+ }
219
+ })
220
+ : [];
221
+ slugs.sort(); // deterministic ordering.
222
+
223
+ const lines: string[] = [
224
+ "# mutagent-diagnostics — class-memory library",
225
+ "",
226
+ "> Per-host, gitignored. Approved findings only (R2.3). Patterns are matched FIRST in Tier-0.",
227
+ "",
228
+ "| Entity | Type | Runs | Patterns |",
229
+ "|--------|------|------|----------|",
230
+ ];
231
+ for (const slug of slugs) {
232
+ const e = loadEntity(slug, home);
233
+ if (!e) continue;
234
+ lines.push(`| ${e.name} | ${e.entityType} | ${e.runs.length} | ${e.patterns.length} |`);
235
+ }
236
+ lines.push("");
237
+ writeFileSync(indexPath(home), lines.join("\n"), "utf8");
238
+ }
239
+
240
+ /** True when library priors exist for the entity (drives R2.1 refusal downgrade). */
241
+ export function hasPriors(entityName: string, home?: string): boolean {
242
+ const e = loadEntity(entitySlug(entityName), home);
243
+ return !!e && e.patterns.length > 0;
244
+ }
245
+
246
+ /**
247
+ * Build the priorSignalsRef string for an entity (consumed by R2.1's gate + R2.2's
248
+ * SKIP). Returns the journal-relative ref when priors exist, else undefined.
249
+ */
250
+ export function priorSignalsRef(entityName: string, home?: string): string | undefined {
251
+ const slug = entitySlug(entityName);
252
+ return hasPriors(entityName, home) ? `by-entity/${slug}/journal.md` : undefined;
253
+ }
254
+
255
+ // ── BLOCK G — cross-run deep-read LEDGER ─────────────────────────────────────
256
+ //
257
+ // The ledger records, per (entity, trace), that the deep-read analyzer already
258
+ // digested that trace. It lives in its OWN file (deep-read-ledger.json) — NOT inside
259
+ // entity.json — because deep-read digests are produced by the analyzer, not gated by
260
+ // the operator-approved write gate (R2.3) that governs patterns. Persistence is
261
+ // append-only + deduped by traceId; the clock is INJECTED (entry.ts) for byte-stable
262
+ // tests. foldValidDigests() applies the validity filter ONLY — it does NOT promote;
263
+ // Block C re-applies the evidence floor to the folded digests (clean boundary, R2).
264
+
265
+ /** Load an entity's deep-read ledger from its own file, or [] when absent/corrupt. */
266
+ export function loadLedger(entityName: string, home?: string): DeepReadLedgerEntry[] {
267
+ const slug = entitySlug(entityName);
268
+ const p = deepReadLedgerPath(slug, home);
269
+ if (!existsSync(p)) return [];
270
+ try {
271
+ const parsed = JSON.parse(readFileSync(p, "utf8")) as unknown;
272
+ return Array.isArray(parsed) ? (parsed as DeepReadLedgerEntry[]) : [];
273
+ } catch {
274
+ return [];
275
+ }
276
+ }
277
+
278
+ /** Persist an entity's deep-read ledger deterministically (stable JSON + trailing newline). */
279
+ function writeLedger(slug: string, entries: DeepReadLedgerEntry[], home?: string): void {
280
+ ensureDir(entityDir(slug, home));
281
+ writeFileSync(deepReadLedgerPath(slug, home), JSON.stringify(entries, null, 2) + "\n", "utf8");
282
+ }
283
+
284
+ /**
285
+ * BLOCK G — true when the entity's ledger already holds a digest for `traceId`.
286
+ * Existence check only — does NOT consider validity (a stale-but-present entry still
287
+ * counts as ledgered). Callers that need validity use foldValidDigests().
288
+ */
289
+ export function isLedgered(entityName: string, traceId: string, home?: string): boolean {
290
+ return loadLedger(entityName, home).some((e) => e.traceId === traceId);
291
+ }
292
+
293
+ /**
294
+ * BLOCK G — append deep-read digests to an entity's ledger, deduped by traceId. A new
295
+ * entry whose traceId already exists REPLACES the prior entry (latest digest wins —
296
+ * a re-read with a newer analyzerVersion/fingerprint/ts supersedes the stale one).
297
+ * Append-only across distinct traceIds; existing-trace digests are upserted in place.
298
+ * Returns the persisted ledger.
299
+ */
300
+ export function recordLedger(
301
+ entityName: string,
302
+ entries: DeepReadLedgerEntry[],
303
+ home?: string
304
+ ): DeepReadLedgerEntry[] {
305
+ const slug = entitySlug(entityName);
306
+ const merged = loadLedger(entityName, home);
307
+ for (const next of entries) {
308
+ const idx = merged.findIndex((e) => e.traceId === next.traceId);
309
+ if (idx === -1) merged.push(next);
310
+ else merged[idx] = next; // dedupe by traceId — latest digest wins.
311
+ }
312
+ writeLedger(slug, merged, home);
313
+ return merged;
314
+ }
315
+
316
+ export interface FoldValidOptions {
317
+ /** Current analyzer version — entries stamped with a different version are invalid. */
318
+ analyzerVersion: string;
319
+ /** Current entity fingerprint — entries stamped with a different fingerprint are invalid. */
320
+ entityFingerprint: string;
321
+ /** INJECTED current time (ms epoch) for TTL checks — keeps the fold deterministic in tests. */
322
+ nowMs: number;
323
+ /** Max age before an entry is stale. Defaults to DEEP_READ_LEDGER_TTL_MS (~30d). */
324
+ ttlMs?: number;
325
+ }
326
+
327
+ /**
328
+ * BLOCK G — fold an entity's ledger down to the entries that are still VALID.
329
+ *
330
+ * An entry is INVALID (excluded → the trace re-admits for a fresh deep-read) when ANY:
331
+ * - entry.analyzerVersion !== opts.analyzerVersion (analyzer logic changed)
332
+ * - entry.entityFingerprint !== opts.entityFingerprint (entity changed under it)
333
+ * - opts.nowMs - Date.parse(entry.ts) > ttlMs (digest aged out)
334
+ *
335
+ * An entry with an unparseable ts is treated as INVALID (fail-stale, never fail-fresh).
336
+ *
337
+ * BOUNDARY (R2): this returns version-stamped digests + validity filtering ONLY. It does
338
+ * NOT decide promotion — Block C re-applies the evidence floor to these. Keep it clean.
339
+ */
340
+ export function foldValidDigests(
341
+ entityName: string,
342
+ opts: FoldValidOptions,
343
+ home?: string
344
+ ): DeepReadLedgerEntry[] {
345
+ const ttlMs = opts.ttlMs ?? DEEP_READ_LEDGER_TTL_MS;
346
+ return loadLedger(entityName, home).filter((e) => {
347
+ if (e.analyzerVersion !== opts.analyzerVersion) return false;
348
+ if (e.entityFingerprint !== opts.entityFingerprint) return false;
349
+ const tsMs = Date.parse(e.ts);
350
+ if (Number.isNaN(tsMs)) return false; // fail-stale on a corrupt timestamp.
351
+ if (opts.nowMs - tsMs > ttlMs) return false;
352
+ return true;
353
+ });
354
+ }
355
+
356
+ /**
357
+ * BLOCK G — targeted poison removal: drop the ledger entry for `traceId` so the trace
358
+ * re-admits for a fresh deep-read on the next run. Returns true when an entry was
359
+ * removed, false when none matched. Persists only when a change occurred.
360
+ */
361
+ export function invalidateEntry(entityName: string, traceId: string, home?: string): boolean {
362
+ const slug = entitySlug(entityName);
363
+ const ledger = loadLedger(entityName, home);
364
+ const next = ledger.filter((e) => e.traceId !== traceId);
365
+ if (next.length === ledger.length) return false;
366
+ writeLedger(slug, next, home);
367
+ return true;
368
+ }
369
+
370
+ // ── UNIFIED VERDICT LEDGER — finding-verdict MEMORY (both polarities) ─────────
371
+ //
372
+ // The verdict ledger records BOTH polarities per entity: findings the operator
373
+ // APPROVED (valid) and findings the operator DISMISSED (not-an-issue → suppress). It
374
+ // is the runtime finding-verdict memory and the audit trail for suppressions (there is
375
+ // NO visible "Suppressed" report section — the ledger IS the trail). Persisted in its
376
+ // OWN file (verdict-ledger.json) so the approved-only entity.json write gate stays clean
377
+ // and the approve→pattern promote is byte-unchanged. Deterministic: stable JSON, clock
378
+ // INJECTED (entry.ts). NEVER-EXPIRE: a dismissal has no TTL — foldValidDismissals()
379
+ // invalidates ONLY on an entity-fingerprint change (config-change), never by age.
380
+
381
+ /** The input to recordVerdict — one operator verdict on a finding (either polarity). */
382
+ export interface VerdictInput {
383
+ entityName: string;
384
+ verdict: VerdictPolarity;
385
+ findingId: string;
386
+ what: string;
387
+ why: string;
388
+ where: string;
389
+ whatHappened?: string;
390
+ /** Severity when the verdict was cast — the enrich §escalation guard baseline. */
391
+ severityAtDismissal: VerdictSeverity;
392
+ /** Entity fingerprint at verdict time — a change invalidates the verdict (config-change). */
393
+ entityFingerprint: string;
394
+ reason?: string;
395
+ operatorInvocation?: string;
396
+ runId: string;
397
+ /** INJECTED ISO8601 timestamp — keeps writes deterministic in tests. */
398
+ nowIso: string;
399
+ }
400
+
401
+ /** Load an entity's verdict ledger from its own file, or [] when absent/corrupt. */
402
+ export function loadVerdictLedger(entityName: string, home?: string): VerdictLedgerEntry[] {
403
+ const slug = entitySlug(entityName);
404
+ const p = verdictLedgerPath(slug, home);
405
+ if (!existsSync(p)) return [];
406
+ try {
407
+ const parsed = JSON.parse(readFileSync(p, "utf8")) as unknown;
408
+ return Array.isArray(parsed) ? (parsed as VerdictLedgerEntry[]) : [];
409
+ } catch {
410
+ return [];
411
+ }
412
+ }
413
+
414
+ /** Persist an entity's verdict ledger deterministically (stable JSON + trailing newline). */
415
+ function writeVerdictLedger(slug: string, entries: VerdictLedgerEntry[], home?: string): void {
416
+ ensureDir(entityDir(slug, home));
417
+ writeFileSync(verdictLedgerPath(slug, home), JSON.stringify(entries, null, 2) + "\n", "utf8");
418
+ }
419
+
420
+ /** Stable dedupe key for a verdict entry — one verdict per (polarity, run, finding). */
421
+ function verdictKey(e: Pick<VerdictLedgerEntry, "verdict" | "runId" | "findingId">): string {
422
+ return `${e.verdict}:${e.runId}:${e.findingId}`;
423
+ }
424
+
425
+ /**
426
+ * Record an operator verdict (approved OR dismissed) into the unified verdict ledger,
427
+ * deduped by (polarity, runId, findingId) — re-persisting the same copy-back is
428
+ * idempotent (latest wins). Append-only across distinct verdicts. Returns the persisted
429
+ * ledger. Writes verdict-ledger.json ONLY (no journal touch — approve stays byte-clean).
430
+ */
431
+ export function recordVerdict(input: VerdictInput, home?: string): VerdictLedgerEntry[] {
432
+ const slug = entitySlug(input.entityName);
433
+ const merged = loadVerdictLedger(input.entityName, home);
434
+ const entry: VerdictLedgerEntry = {
435
+ verdict: input.verdict,
436
+ findingId: input.findingId,
437
+ entitySlug: slug,
438
+ what: input.what,
439
+ why: input.why,
440
+ where: input.where,
441
+ ...(input.whatHappened !== undefined ? { whatHappened: input.whatHappened } : {}),
442
+ severityAtDismissal: input.severityAtDismissal,
443
+ entityFingerprint: input.entityFingerprint,
444
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
445
+ ...(input.operatorInvocation !== undefined ? { operatorInvocation: input.operatorInvocation } : {}),
446
+ runId: input.runId,
447
+ ts: input.nowIso,
448
+ };
449
+ const key = verdictKey(entry);
450
+ const idx = merged.findIndex((e) => verdictKey(e) === key);
451
+ if (idx === -1) merged.push(entry);
452
+ else merged[idx] = entry; // idempotent re-persist — latest wins.
453
+ writeVerdictLedger(slug, merged, home);
454
+ return merged;
455
+ }
456
+
457
+ /** Load only the DISMISSED verdicts for an entity (the suppression source). */
458
+ export function loadDismissedVerdicts(entityName: string, home?: string): VerdictLedgerEntry[] {
459
+ return loadVerdictLedger(entityName, home).filter((e) => e.verdict === "dismissed");
460
+ }
461
+
462
+ export interface FoldDismissalsOptions {
463
+ /** Current entity fingerprint — entries stamped with a different fingerprint are void. */
464
+ entityFingerprint: string;
465
+ }
466
+
467
+ /**
468
+ * Fold an entity's DISMISSED verdicts down to the entries that are still VALID.
469
+ *
470
+ * NEVER-EXPIRE (operator decision): a dismissal has NO TTL. The ONLY invalidation is an
471
+ * entity-fingerprint change — when the agent's prompt/config changed under the dismissal
472
+ * (`entry.entityFingerprint !== opts.entityFingerprint`), the old "not-an-issue" verdict
473
+ * is void and the finding re-admits. This reuses the foldValidDigests fingerprint
474
+ * discipline WITHOUT the age branch (no time-based expiry, ever).
475
+ *
476
+ * The OTHER un-hide path — severity-escalation — is NOT here: it depends on the CURRENT
477
+ * finding's severity, which the store does not see. It lives in the enrich partition
478
+ * (enrich/dismissal-match.ts partitionByDismissal), which runs BEFORE the semantic match.
479
+ */
480
+ export function foldValidDismissals(
481
+ entityName: string,
482
+ opts: FoldDismissalsOptions,
483
+ home?: string
484
+ ): VerdictLedgerEntry[] {
485
+ return loadDismissedVerdicts(entityName, home).filter(
486
+ (e) => e.entityFingerprint === opts.entityFingerprint
487
+ );
488
+ }
489
+
490
+ /**
491
+ * Targeted un-dismiss: drop the DISMISSED verdict(s) for `findingId` so a matching
492
+ * finding re-admits on the next run. Approved verdicts for the same findingId are left
493
+ * intact. Returns true when ≥1 entry was removed. Persists only when a change occurred.
494
+ */
495
+ export function invalidateVerdict(entityName: string, findingId: string, home?: string): boolean {
496
+ const slug = entitySlug(entityName);
497
+ const ledger = loadVerdictLedger(entityName, home);
498
+ const next = ledger.filter((e) => !(e.verdict === "dismissed" && e.findingId === findingId));
499
+ if (next.length === ledger.length) return false;
500
+ writeVerdictLedger(slug, next, home);
501
+ return true;
502
+ }
503
+
504
+ // ── CLI entrypoint — persist a verdict from the copy-back (Step 11.5) ─────────
505
+ //
506
+ // The orchestrator parses the pasted `## Invalid findings` block and, per dismissed
507
+ // finding, calls this to land the verdict in the unified ledger. Injects the run-context
508
+ // provenance (runId · ts · operatorInvocation · entityFingerprint) the report cannot know.
509
+ //
510
+ // Usage: scripts/cli/run.sh scripts/library/store.ts
511
+ // --config-root <path> host project root (where .mutagent/diagnostics/ lives; default cwd)
512
+ // --verdict <json> a full VerdictInput JSON (entityName + verdict + triple + provenance)
513
+ if (import.meta.main) {
514
+ const argv = process.argv.slice(2);
515
+ const get = (flag: string): string | undefined => {
516
+ const i = argv.indexOf(flag);
517
+ return i >= 0 ? argv[i + 1] : undefined;
518
+ };
519
+ const configRoot = get("--config-root") ?? process.cwd();
520
+ const verdictJson = get("--verdict");
521
+ if (!verdictJson) {
522
+ process.stderr.write("Usage: store.ts --config-root <path> --verdict <VerdictInput json>\n");
523
+ process.exit(1);
524
+ }
525
+ let input: VerdictInput;
526
+ try {
527
+ input = JSON.parse(verdictJson) as VerdictInput;
528
+ } catch (e) {
529
+ process.stderr.write(`Invalid --verdict JSON: ${e}\n`);
530
+ process.exit(1);
531
+ }
532
+ const ledger = recordVerdict(input, configRoot);
533
+ process.stdout.write(JSON.stringify({ entity: input.entityName, count: ledger.length }, null, 2) + "\n");
534
+ process.exit(0);
535
+ }