@khoavu882/doflow 2.0.0-beta.5 → 2.0.0

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 (471) hide show
  1. package/README.md +12 -11
  2. package/bin/doflow.js +21 -11
  3. package/core/.antigravity-plugin/plugin.json +1 -2
  4. package/core/.claude-plugin/plugin.json +1 -1
  5. package/core/.codex-plugin/plugin.json +1 -1
  6. package/core/.plugin/plugin.json +1 -1
  7. package/core/harnesses/claude/hooks/lib.sh +43 -24
  8. package/core/harnesses/claude/hooks/permission-audit.sh +3 -0
  9. package/core/harnesses/claude/hooks/post-compact.sh +35 -32
  10. package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
  11. package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
  12. package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
  13. package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
  14. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  15. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  16. package/core/harnesses/claude/settings/settings.json +18 -0
  17. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  18. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  19. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  20. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  21. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  22. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  23. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  24. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  25. package/core/harnesses/codex/hooks/lib.sh +44 -25
  26. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  27. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  28. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  29. package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
  30. package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
  31. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  32. package/core/harnesses/copilot/hooks/doflow-pre-bash-guard.sh +9 -0
  33. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  34. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  35. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  36. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  37. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  38. package/core/harnesses/copilot/hooks/doflow.json +57 -0
  39. package/core/harnesses/kiro/agents/doflow.json +1 -1
  40. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  41. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +1 -0
  42. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +1 -0
  43. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +1 -0
  44. package/core/harnesses/kiro/hooks/session-start.sh +1 -0
  45. package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
  46. package/core/harnesses/pi/extensions/doflow-guard.js +8 -0
  47. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +0 -1
  48. package/core/harnesses/shared/hooks/bridge/bridge.sh +102 -9
  49. package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
  50. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  51. package/core/harnesses/shared/hooks/bridge/respond.sh +10 -2
  52. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
  53. package/core/harnesses/shared/hooks/policies/capture-failure.sh +48 -15
  54. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  55. package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
  56. package/core/harnesses/shared/hooks/policies/deny-json.sh +2 -11
  57. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  58. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  59. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  60. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  61. package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
  62. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +3 -2
  63. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +213 -12
  64. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +114 -38
  65. package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
  66. package/core/harnesses/shared/hooks/policies/stop-check.sh +20 -9
  67. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +5 -2
  68. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  69. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
  70. package/core/harnesses/shared/hooks/stream-hook-runner.js +47 -8
  71. package/core/harnesses/shared/locator/doflow-run +2 -3
  72. package/core/registry/advice.json +3 -3
  73. package/core/registry/assets.json +55 -82
  74. package/core/registry/capabilities.json +12 -0
  75. package/core/registry/contracts.json +58 -31
  76. package/core/registry/contribution-points.json +32 -0
  77. package/core/registry/gates.json +32 -0
  78. package/core/registry/guidance-caps.json +40 -0
  79. package/core/registry/harnesses.json +1442 -363
  80. package/core/registry/lifecycle.json +485 -304
  81. package/core/registry/mcp.json +5 -1
  82. package/core/registry/models.json +7 -1
  83. package/core/registry/package-templates/README.md +19 -0
  84. package/core/registry/package-templates/agent/files/agent.md +9 -0
  85. package/core/registry/package-templates/agent/template.json +4 -0
  86. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  87. package/core/registry/package-templates/capability-provider/template.json +11 -0
  88. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  89. package/core/registry/package-templates/debate-preset/template.json +4 -0
  90. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  91. package/core/registry/package-templates/review-preset/template.json +4 -0
  92. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  93. package/core/registry/package-templates/skill/template.json +4 -0
  94. package/core/registry/package-templates/worker/files/worker.json +92 -0
  95. package/core/registry/package-templates/worker/template.json +11 -0
  96. package/core/registry/packages/doflow/doflow-package.json +15 -0
  97. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  98. package/core/registry/protocols.json +61 -0
  99. package/core/registry/routes.json +17 -0
  100. package/core/registry/rules.json +431 -0
  101. package/core/registry/settings.json +276 -0
  102. package/core/registry/storage.json +679 -31
  103. package/core/registry/telemetry.json +236 -0
  104. package/core/registry/transcripts.json +142 -0
  105. package/core/registry/verification.json +76 -1
  106. package/core/registry/workflows.json +55 -0
  107. package/core/shared/agent-specs/core-implementer.md +3 -0
  108. package/core/shared/agent-specs/delivery-lead.md +68 -0
  109. package/core/shared/agent-specs/quality-guardian.md +5 -1
  110. package/core/shared/agent-specs/research-writer.md +10 -3
  111. package/core/shared/agent-specs/reviewer.md +53 -0
  112. package/core/shared/agent-specs/spec-analyst.md +5 -6
  113. package/core/shared/agent-specs/system-architect.md +5 -1
  114. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  115. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  116. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  117. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  118. package/core/shared/guidance/pointers/codex.md +1 -4
  119. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  120. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  121. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  122. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  123. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  124. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  125. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  126. package/core/shared/guidance/references/ORCHESTRATION.md +1 -2
  127. package/core/shared/guidance/rules/RULES.md +45 -0
  128. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  129. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  130. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  131. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  132. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  133. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  134. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  135. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  136. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  137. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  138. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  139. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +48 -4
  140. package/core/shared/scripts/doflow/bin/doflow-run +149 -34
  141. package/core/shared/skills/do/SKILL.md +12 -10
  142. package/core/shared/skills/do/references/advice_calls.md +26 -0
  143. package/core/shared/skills/do/references/pm_routing.md +1 -2
  144. package/core/shared/skills/do/references/program_mode.md +31 -0
  145. package/core/shared/skills/do-brainstorm/SKILL.md +20 -74
  146. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -0
  147. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  148. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  149. package/core/shared/skills/do-code-review/SKILL.md +41 -144
  150. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  151. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  152. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  153. package/core/shared/skills/do-design/SKILL.md +18 -17
  154. package/core/shared/skills/do-diagnose/SKILL.md +14 -4
  155. package/core/shared/skills/do-document/SKILL.md +11 -1
  156. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  157. package/core/shared/skills/do-document/references/embedded-research.md +18 -6
  158. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  159. package/core/shared/skills/do-execute-plan/SKILL.md +15 -58
  160. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  161. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  162. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
  163. package/core/shared/skills/do-execute-plan/references/run_position.md +13 -1
  164. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  165. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  166. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  167. package/core/shared/skills/do-flow/SKILL.md +8 -9
  168. package/core/shared/skills/do-flow/references/task_classes.md +2 -2
  169. package/core/shared/skills/do-git/SKILL.md +4 -0
  170. package/core/shared/skills/do-implement/SKILL.md +4 -7
  171. package/core/shared/skills/do-plan/SKILL.md +26 -15
  172. package/core/shared/skills/do-test/SKILL.md +7 -4
  173. package/core/shared/templates/doflow/constitution-template.md +9 -3
  174. package/core/shared/templates/doflow/data-model-template.md +1 -1
  175. package/core/shared/templates/doflow/design-template.md +113 -16
  176. package/core/shared/templates/doflow/plan-template.md +11 -10
  177. package/core/shared/templates/doflow/question-log-template.md +14 -2
  178. package/core/shared/templates/doflow/requirement-template.md +1 -1
  179. package/core/worker-evidence/antigravity/checks.json +14 -0
  180. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  181. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  182. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  183. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  184. package/core/worker-evidence/codex/checks.json +38 -0
  185. package/package.json +10 -6
  186. package/src/adapters/antigravity/index.js +143 -66
  187. package/src/adapters/claude/index.js +24 -4
  188. package/src/adapters/codex/agents.js +25 -15
  189. package/src/adapters/codex/index.js +48 -13
  190. package/src/adapters/codex/native-projection.js +6 -2
  191. package/src/adapters/copilot/index.js +58 -23
  192. package/src/adapters/copy-tree.js +290 -44
  193. package/src/adapters/guidance-manifest.js +71 -0
  194. package/src/adapters/guidance-pointer.js +19 -0
  195. package/src/adapters/hook-commands.js +6 -10
  196. package/src/adapters/index.js +1 -0
  197. package/src/adapters/kiro/index.js +23 -12
  198. package/src/adapters/opencode/index.js +8 -8
  199. package/src/adapters/pi/hooks.js +2 -1
  200. package/src/adapters/pi/index.js +14 -7
  201. package/src/adapters/resolve-source.js +26 -2
  202. package/src/cli/commands/install.js +2 -1
  203. package/src/cli/commands/reconcile.js +53 -9
  204. package/src/cli/commands/remove.js +2 -2
  205. package/src/cli/commands/rollback.js +6 -3
  206. package/src/cli/commands/self-update.js +18 -9
  207. package/src/cli/commands/status.js +21 -2
  208. package/src/cli/commands/ui.js +99 -0
  209. package/src/cli/commands/update.js +2 -1
  210. package/src/cli/index.js +322 -29
  211. package/src/cli/runtime-commands.js +209 -57
  212. package/src/cli/shared.js +0 -2
  213. package/src/helper/git.js +1 -1
  214. package/src/helper/guardrails.js +1 -1
  215. package/src/helper/marker-merge.js +31 -13
  216. package/src/helper/package-ids.js +37 -0
  217. package/src/helper/semver.js +94 -0
  218. package/src/install/backup.js +105 -15
  219. package/src/install/context.js +1 -1
  220. package/src/install/targets.js +31 -16
  221. package/src/lifecycle/coverage.js +20 -3
  222. package/src/lifecycle/hook-tier.js +160 -0
  223. package/src/lifecycle/index.js +412 -78
  224. package/src/lifecycle/retired-harnesses.js +318 -0
  225. package/src/lifecycle/view.js +35 -15
  226. package/src/registry/index.js +551 -26
  227. package/src/registry/worker-ids.js +45 -0
  228. package/src/release/build-package.js +0 -3
  229. package/src/release/docs-blocks.js +492 -0
  230. package/src/release/preflight.js +425 -0
  231. package/src/release/rehearse.js +401 -0
  232. package/src/release/release-workflow.js +733 -0
  233. package/src/release/sync-plugin-versions.js +43 -7
  234. package/src/runtime/advice/bench-gate.js +25 -0
  235. package/src/runtime/advice/cli.js +59 -16
  236. package/src/runtime/advice/client.js +32 -9
  237. package/src/runtime/advice/config.js +98 -133
  238. package/src/runtime/advice/doctor.js +1 -1
  239. package/src/runtime/advice/elevation.js +97 -0
  240. package/src/runtime/advice/endpoint-guard.js +9 -3
  241. package/src/runtime/advice/mode.js +37 -0
  242. package/src/runtime/advice/record.js +18 -5
  243. package/src/runtime/advice/registry.js +4 -1
  244. package/src/runtime/advice/shadow-config.js +229 -0
  245. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  246. package/src/runtime/brief-rules.js +81 -0
  247. package/src/runtime/brief-tools.js +111 -34
  248. package/src/runtime/candidate.js +20 -11
  249. package/src/runtime/capabilities/executor.js +450 -0
  250. package/src/runtime/capabilities/loopback.js +41 -0
  251. package/src/runtime/capabilities/sanitizer.js +88 -0
  252. package/src/runtime/capability-router.js +135 -3
  253. package/src/runtime/checkouts.js +73 -11
  254. package/src/runtime/claims.js +13 -7
  255. package/src/runtime/cli.js +196 -19
  256. package/src/runtime/config-home.js +42 -0
  257. package/src/runtime/context/arbitrate.js +767 -0
  258. package/src/runtime/context/delivery-store.js +4 -6
  259. package/src/runtime/context/emission-rules.js +118 -0
  260. package/src/runtime/context/identity.js +227 -0
  261. package/src/runtime/context/primary-command.js +117 -0
  262. package/src/runtime/context/primary.js +344 -0
  263. package/src/runtime/context/summary-store.js +655 -0
  264. package/src/runtime/context-pack.js +154 -78
  265. package/src/runtime/decision-register.js +13 -4
  266. package/src/runtime/dispatch/admission.js +392 -0
  267. package/src/runtime/dispatch/attempt-end.js +274 -0
  268. package/src/runtime/dispatch/command.js +628 -0
  269. package/src/runtime/dispatch/controls.js +904 -0
  270. package/src/runtime/dispatch/envelope.js +276 -0
  271. package/src/runtime/dispatch/grants.js +310 -0
  272. package/src/runtime/dispatch/integrate.js +617 -0
  273. package/src/runtime/dispatch/loop.js +1835 -0
  274. package/src/runtime/dispatch/store.js +352 -0
  275. package/src/runtime/dispatch/verify-run.js +201 -0
  276. package/src/runtime/evidence-ledger.js +34 -7
  277. package/src/runtime/failure/capture.js +3 -1
  278. package/src/runtime/failure/cli.js +25 -9
  279. package/src/runtime/failure/home.js +57 -30
  280. package/src/runtime/failure/store.js +7 -2
  281. package/src/runtime/feature-pointer.js +174 -0
  282. package/src/runtime/feature-resolve.js +13 -2
  283. package/src/runtime/fleet/command.js +77 -0
  284. package/src/runtime/fleet/projects.js +178 -0
  285. package/src/runtime/fleet/tree.js +383 -0
  286. package/src/runtime/freshness.js +33 -3
  287. package/src/runtime/git-memo.js +46 -0
  288. package/src/runtime/guidance/ablation.js +427 -0
  289. package/src/runtime/health.js +565 -17
  290. package/src/runtime/history-compactor.js +13 -3
  291. package/src/runtime/implementation-gate.js +277 -22
  292. package/src/runtime/inventory/coverage.js +1 -1
  293. package/src/runtime/inventory/index.js +1 -1
  294. package/src/runtime/inventory/precedence.js +2 -2
  295. package/src/runtime/inventory/siblings.js +6 -4
  296. package/src/runtime/knowledge/code-corpus.js +277 -0
  297. package/src/runtime/knowledge/code-lexical.js +130 -0
  298. package/src/runtime/knowledge/code-retrieval.js +307 -0
  299. package/src/runtime/knowledge/code-validation.js +106 -0
  300. package/src/runtime/knowledge/gp3-gate.js +74 -0
  301. package/src/runtime/knowledge/graph-adapter.js +288 -0
  302. package/src/runtime/knowledge/graph-fallback.js +394 -0
  303. package/src/runtime/knowledge/hybrid.js +136 -8
  304. package/src/runtime/knowledge/retrieval.js +34 -1
  305. package/src/runtime/knowledge/rtk-compress.js +77 -0
  306. package/src/runtime/knowledge/semble-bridge.py +106 -0
  307. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  308. package/src/runtime/knowledge/semble-provider.js +365 -0
  309. package/src/runtime/lifecycle/cli.js +16 -6
  310. package/src/runtime/lifecycle/event-store.js +8 -6
  311. package/src/runtime/lifecycle/followup.js +6 -1
  312. package/src/runtime/lifecycle/overview.js +24 -1
  313. package/src/runtime/lifecycle/report-store.js +8 -10
  314. package/src/runtime/lifecycle/retention.js +95 -31
  315. package/src/runtime/lifecycle/root.js +9 -1
  316. package/src/runtime/lifecycle/status.js +34 -17
  317. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  318. package/src/runtime/mask.js +134 -7
  319. package/src/runtime/mcp-consultations.js +40 -6
  320. package/src/runtime/model-router.js +79 -7
  321. package/src/runtime/models/catalogue.js +191 -0
  322. package/src/runtime/models/command.js +153 -0
  323. package/src/runtime/off-words.js +12 -0
  324. package/src/runtime/outcome.js +2 -2
  325. package/src/runtime/packages/command.js +1009 -0
  326. package/src/runtime/packages/contributions.js +116 -0
  327. package/src/runtime/packages/digest.js +132 -0
  328. package/src/runtime/packages/fetch.js +182 -0
  329. package/src/runtime/packages/grants.js +192 -0
  330. package/src/runtime/packages/index-file.js +134 -0
  331. package/src/runtime/packages/instruction.js +90 -0
  332. package/src/runtime/packages/manifest.js +331 -0
  333. package/src/runtime/packages/points.js +477 -0
  334. package/src/runtime/packages/programs.js +216 -0
  335. package/src/runtime/packages/scaffold.js +277 -0
  336. package/src/runtime/packages/source.js +90 -0
  337. package/src/runtime/packages/state.js +164 -0
  338. package/src/runtime/packages/store.js +449 -0
  339. package/src/runtime/packages/tar.js +106 -0
  340. package/src/runtime/packages/view.js +406 -0
  341. package/src/runtime/plan-check.js +59 -0
  342. package/src/runtime/plan-content.js +324 -0
  343. package/src/runtime/policy-init.js +118 -0
  344. package/src/runtime/profiles/doctor.js +96 -0
  345. package/src/runtime/profiles/resolve.js +244 -0
  346. package/src/runtime/profiles/rollback.js +254 -0
  347. package/src/runtime/profiles/sampler.js +41 -0
  348. package/src/runtime/readiness-record.js +16 -11
  349. package/src/runtime/readiness.js +46 -5
  350. package/src/runtime/research-request.js +50 -25
  351. package/src/runtime/retrieval-plan.js +10 -30
  352. package/src/runtime/retrieval-record.js +75 -5
  353. package/src/runtime/review/command.js +246 -0
  354. package/src/runtime/review/dominance.js +68 -0
  355. package/src/runtime/review/findings.js +434 -0
  356. package/src/runtime/review/identity.js +255 -0
  357. package/src/runtime/review/protocol-command.js +109 -0
  358. package/src/runtime/review/protocols.js +405 -0
  359. package/src/runtime/review/resolve-protocol.js +302 -0
  360. package/src/runtime/review/start.js +530 -0
  361. package/src/runtime/roadmap/facts.js +479 -0
  362. package/src/runtime/roadmap/gates.js +270 -0
  363. package/src/runtime/roadmap/loop.js +1636 -0
  364. package/src/runtime/roadmap/merge.js +381 -0
  365. package/src/runtime/roadmap/rows.js +1113 -0
  366. package/src/runtime/roadmap/seed.js +951 -0
  367. package/src/runtime/rules-report.js +336 -0
  368. package/src/runtime/scaffold/artifacts.js +60 -9
  369. package/src/runtime/scaffold/generate.js +21 -9
  370. package/src/runtime/settings/autopilot.js +106 -0
  371. package/src/runtime/settings/cli.js +280 -0
  372. package/src/runtime/settings/config-write.js +314 -0
  373. package/src/runtime/settings/files.js +271 -0
  374. package/src/runtime/settings/legacy.js +154 -0
  375. package/src/runtime/settings/lexical.js +56 -0
  376. package/src/runtime/settings/prepared-run.js +269 -0
  377. package/src/runtime/settings/project-layers.js +118 -0
  378. package/src/runtime/settings/refs.js +288 -0
  379. package/src/runtime/settings/registry.js +553 -0
  380. package/src/runtime/settings/resolve.js +713 -0
  381. package/src/runtime/settings/shared.js +37 -0
  382. package/src/runtime/settings/worker-billing.js +107 -0
  383. package/src/runtime/settings/write.js +269 -0
  384. package/src/runtime/slot-command.js +78 -0
  385. package/src/runtime/slots.js +671 -0
  386. package/src/runtime/source-version.js +1 -0
  387. package/src/runtime/state-root.js +217 -0
  388. package/src/runtime/storage/cli.js +12 -5
  389. package/src/runtime/storage/engine.js +9 -2
  390. package/src/runtime/storage/registry.js +14 -1
  391. package/src/runtime/storage/roots.js +66 -16
  392. package/src/runtime/storage/rules.js +82 -10
  393. package/src/runtime/storage/upkeep.js +10 -2
  394. package/src/runtime/storage/work-status.js +245 -26
  395. package/src/runtime/task-attempts.js +589 -69
  396. package/src/runtime/task-classifier.js +47 -11
  397. package/src/runtime/task-graph.js +373 -0
  398. package/src/runtime/task-run.js +778 -0
  399. package/src/runtime/task-scope.js +176 -55
  400. package/src/runtime/task-sources.js +147 -0
  401. package/src/runtime/task-state.js +374 -64
  402. package/src/runtime/team/admission.js +301 -0
  403. package/src/runtime/team/envelope.js +324 -0
  404. package/src/runtime/team/review-guard.js +156 -0
  405. package/src/runtime/trace/analyze.js +427 -0
  406. package/src/runtime/trace/baseline.js +770 -0
  407. package/src/runtime/trace/ledger.js +63 -140
  408. package/src/runtime/trace/otlp-export.js +568 -0
  409. package/src/runtime/trace/otlp-map.js +481 -0
  410. package/src/runtime/trace/spans.js +745 -0
  411. package/src/runtime/trace/telemetry.js +225 -0
  412. package/src/runtime/trace/views.js +1 -0
  413. package/src/runtime/transcripts/command.js +98 -0
  414. package/src/runtime/transcripts/cursor.js +326 -0
  415. package/src/runtime/transcripts/read.js +126 -0
  416. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  417. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  418. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  419. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  420. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  421. package/src/runtime/transcripts/registry.js +161 -0
  422. package/src/runtime/transcripts/stats.js +161 -0
  423. package/src/runtime/verification/check-key.js +628 -0
  424. package/src/runtime/verification/contract-runner.js +546 -11
  425. package/src/runtime/verification/engine.js +499 -9
  426. package/src/runtime/verification/impact.js +617 -0
  427. package/src/runtime/verification/inflight.js +205 -0
  428. package/src/runtime/verification/registry.js +176 -0
  429. package/src/runtime/verification/reuse.js +184 -0
  430. package/src/runtime/verification/telemetry-emit.js +254 -0
  431. package/src/runtime/verification/test-selection.js +67 -7
  432. package/src/runtime/worker/active.js +90 -0
  433. package/src/runtime/worker/cancel.js +222 -0
  434. package/src/runtime/worker/catalogue.js +122 -0
  435. package/src/runtime/worker/command.js +677 -0
  436. package/src/runtime/worker/evidence.js +288 -0
  437. package/src/runtime/worker/launch.js +288 -0
  438. package/src/runtime/worker/models.js +137 -0
  439. package/src/runtime/worker/parsers.js +218 -0
  440. package/src/runtime/worker/probes/index.js +706 -0
  441. package/src/runtime/worker/process-tree.js +415 -0
  442. package/src/runtime/worker/quota.js +43 -0
  443. package/src/runtime/worker/readiness.js +713 -0
  444. package/src/runtime/worker/run-store.js +166 -0
  445. package/src/runtime/worker/supervisor.js +541 -0
  446. package/src/runtime/worker/worktree-check.js +252 -0
  447. package/src/runtime/workflow-engine.js +5 -1
  448. package/src/runtime/workflow-orchestrator.js +578 -63
  449. package/src/runtime/worktree.js +149 -22
  450. package/src/state/index.js +1 -1
  451. package/src/state/lockfile.js +64 -10
  452. package/src/state/run-lock.js +1 -1
  453. package/types/node-commonjs.d.ts +106 -7
  454. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  455. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  456. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
  457. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  458. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
  459. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  460. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
  461. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  462. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  463. package/core/harnesses/gemini/hooks/session-start.sh +0 -7
  464. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  465. package/core/shared/guidance/FLAGS.md +0 -25
  466. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  467. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  468. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  469. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  470. package/src/adapters/gemini/hooks.js +0 -251
  471. package/src/adapters/gemini/index.js +0 -429
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ // TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
4
+
5
+ /**
6
+ * A call-scoped memo for git answers that cannot change while one runtime call runs (the project root
7
+ * of a path, a repository's common directory). One `git` child costs a process spawn, and a roadmap
8
+ * tick or a dispatch call asks the same question many times.
9
+ *
10
+ * The scope is the call, never the process: `withGitMemo(fn)` opens a fresh Map for `fn` (and for
11
+ * everything `fn` awaits), and the Map is dropped when `fn` settles. Outside a scope `memoGit` just
12
+ * computes, so a long-lived process, a test calling a helper directly and a nested call that opened
13
+ * no scope all see the answer git gives now. A scope opened inside another is the outer one.
14
+ *
15
+ * Only an answer that cannot move belongs here. A ref (HEAD, a branch tip, an index path in a
16
+ * worktree the call may remove and add again) is not cached: the code that moves it is not
17
+ * the memo's to track.
18
+ */
19
+
20
+ const { AsyncLocalStorage } = require('node:async_hooks');
21
+
22
+ const scope = new AsyncLocalStorage();
23
+
24
+ /** Runs `fn` inside a call scope (the current one when already inside one) and returns what `fn` returns. */
25
+ function withGitMemo (fn ) {
26
+ if (scope.getStore()) return fn();
27
+ return scope.run(new Map(), fn);
28
+ }
29
+
30
+ /**
31
+ * `compute()` once per `key` inside the current scope. A throw is not remembered, and a `compute`
32
+ * that returns `undefined` is not either, so a failed or inconclusive read is asked again.
33
+ */
34
+ function memoGit (key , compute ) {
35
+ const memo = scope.getStore();
36
+ if (!memo) return compute();
37
+ if (memo.has(key)) return memo.get(key);
38
+ const value = compute();
39
+ if (value !== undefined) memo.set(key, value);
40
+ return value;
41
+ }
42
+
43
+ /** Whether a call scope is open (for tests). */
44
+ function inGitMemo() { return scope.getStore() !== undefined; }
45
+
46
+ module.exports = { withGitMemo, memoGit, inGitMemo };
@@ -0,0 +1,427 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { REPO_ROOT } = require('../../helper/repo-root.js');
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+ /**
59
+ * Permanent immutable set of protected safety invariant rule IDs (IC-002).
60
+ */
61
+ const PERMANENT_NEVER_ABLATE_RULE_IDS = Object.freeze(new Set ([
62
+ 'rule-safety-conflict-order',
63
+ 'rule-safety-temporal-awareness',
64
+ 'rule-principles-retrieved-content-data',
65
+ 'rule-quality-no-invented-sources',
66
+ 'rule-quality-admit-unknowns',
67
+ 'rule-questions-noninteractive-fallback',
68
+ 'rule-questions-noninteractive-halt-on-blocker',
69
+ ]));
70
+
71
+ /**
72
+ * Error thrown when an ablation attempt violates the never-ablate safety invariant (IC-002).
73
+ */
74
+ class NeverAblateViolationError extends Error {
75
+ code = 'ERR_NEVER_ABLATE';
76
+ violatedRuleIds ;
77
+
78
+ constructor(violatedRuleIds ) {
79
+ super(`Cannot ablate protected rules [${violatedRuleIds.join(', ')}]: neverAblate safety invariant is violated.`);
80
+ this.name = 'NeverAblateViolationError';
81
+ this.violatedRuleIds = violatedRuleIds;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Loads and validates core/registry/rules.json (IC-001 / IC-003).
87
+ */
88
+ function loadRuleLedger(options ) {
89
+ const fsImpl = options?.fsImpl || fs;
90
+ const root = options?.repoRoot || REPO_ROOT;
91
+ const ledgerPath = path.join(root, 'core', 'registry', 'rules.json');
92
+
93
+ if (!fsImpl.existsSync(ledgerPath)) {
94
+ const err = new Error(`ERR_RULE_LEDGER_INVALID: rules registry not found at ${ledgerPath}`);
95
+ err.code = 'ERR_RULE_LEDGER_INVALID';
96
+ throw err;
97
+ }
98
+
99
+ let text ;
100
+ try {
101
+ text = fsImpl.readFileSync(ledgerPath, 'utf8');
102
+ } catch (cause ) {
103
+ const err = new Error(`ERR_RULE_LEDGER_INVALID: failed to read ${ledgerPath}: ${cause?.message || cause}`);
104
+ err.code = 'ERR_RULE_LEDGER_INVALID';
105
+ throw err;
106
+ }
107
+
108
+ let parsed ;
109
+ try {
110
+ parsed = JSON.parse(text);
111
+ } catch (cause ) {
112
+ const err = new Error(`ERR_RULE_LEDGER_INVALID: rules.json is not valid JSON: ${cause?.message || cause}`);
113
+ err.code = 'ERR_RULE_LEDGER_INVALID';
114
+ throw err;
115
+ }
116
+
117
+ if (!parsed || typeof parsed !== 'object' || parsed.version !== 1 || !Array.isArray(parsed.rules)) {
118
+ const err = new Error('ERR_RULE_LEDGER_INVALID: schema must have version: 1 and rules: array');
119
+ err.code = 'ERR_RULE_LEDGER_INVALID';
120
+ throw err;
121
+ }
122
+
123
+ const seenIds = new Set ();
124
+ for (const rule of parsed.rules) {
125
+ if (!rule || typeof rule !== 'object') {
126
+ const err = new Error('ERR_RULE_LEDGER_INVALID: rule entry must be an object');
127
+ err.code = 'ERR_RULE_LEDGER_INVALID';
128
+ throw err;
129
+ }
130
+ if (!rule.id || typeof rule.id !== 'string') {
131
+ const err = new Error('ERR_RULE_LEDGER_INVALID: rule id must be a non-empty string');
132
+ err.code = 'ERR_RULE_LEDGER_INVALID';
133
+ throw err;
134
+ }
135
+ if (seenIds.has(rule.id)) {
136
+ const err = new Error(`ERR_RULE_LEDGER_INVALID: duplicate rule id: ${rule.id}`);
137
+ err.code = 'ERR_RULE_LEDGER_INVALID';
138
+ throw err;
139
+ }
140
+ seenIds.add(rule.id);
141
+
142
+ // Mutual exclusion invariant
143
+ if (rule.neverAblate === true && rule.ablationCandidate === true) {
144
+ const err = new Error(`ERR_RULE_LEDGER_INVALID: rule ${rule.id} cannot have both neverAblate: true and ablationCandidate: true`);
145
+ err.code = 'ERR_RULE_LEDGER_INVALID';
146
+ throw err;
147
+ }
148
+ }
149
+
150
+ return parsed ;
151
+ }
152
+
153
+ /**
154
+ * Retrieves all rules eligible for ablation trials (neverAblate === false && ablationCandidate === true).
155
+ */
156
+ function getAblationCandidates(ledger ) {
157
+ if (!ledger || !Array.isArray(ledger.rules)) return [];
158
+ return ledger.rules.filter((rule) => !rule.neverAblate && rule.ablationCandidate === true);
159
+ }
160
+
161
+ /**
162
+ * Verifies that none of the target rule IDs violate the never-ablate invariant (IC-002).
163
+ * Throws NeverAblateViolationError (ERR_NEVER_ABLATE) if violated.
164
+ */
165
+ function assertAblatable(ruleIds , ledger ) {
166
+ if (!Array.isArray(ruleIds) || ruleIds.length === 0) return;
167
+
168
+ const ruleMap = new Map ();
169
+ if (ledger && Array.isArray(ledger.rules)) {
170
+ for (const rule of ledger.rules) {
171
+ ruleMap.set(rule.id, rule);
172
+ }
173
+ }
174
+
175
+ const violated = [];
176
+ for (const id of ruleIds) {
177
+ if (PERMANENT_NEVER_ABLATE_RULE_IDS.has(id)) {
178
+ violated.push(id);
179
+ continue;
180
+ }
181
+ const rule = ruleMap.get(id);
182
+ if (!rule) {
183
+ const err = new Error(`ERR_RULE_NOT_FOUND: Rule '${id}' not found in rule ledger.`);
184
+ err.code = 'ERR_RULE_NOT_FOUND';
185
+ throw err;
186
+ }
187
+ if (rule.neverAblate) {
188
+ violated.push(id);
189
+ }
190
+ }
191
+
192
+ if (violated.length > 0) {
193
+ throw new NeverAblateViolationError(violated);
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Masks designated rules from the guidance string without altering disk files (IC-003).
199
+ */
200
+ function maskGuidance(options ) {
201
+ const { guidanceText, ablatedRuleIds } = options;
202
+ if (!ablatedRuleIds || ablatedRuleIds.length === 0) {
203
+ return guidanceText;
204
+ }
205
+
206
+ const ledger = options.ledger || loadRuleLedger();
207
+ assertAblatable(ablatedRuleIds, ledger);
208
+
209
+ const ruleMap = new Map ();
210
+ for (const rule of ledger.rules) {
211
+ ruleMap.set(rule.id, rule);
212
+ }
213
+
214
+ const targets = ablatedRuleIds.map((id) => ruleMap.get(id) ).filter(Boolean);
215
+ if (targets.length === 0) return guidanceText;
216
+
217
+ const targetSignatures = targets.map((target) => {
218
+ const rawStatement = target.statement.replace(/\.\.\./g, ' ').trim();
219
+ const cleanStatement = rawStatement.replace(/[`*#_]/g, '').trim();
220
+ const prefix = cleanStatement.slice(0, 36).toLowerCase();
221
+
222
+ // Support section-headed rules (e.g. "Trade-offs: Classify a decision...")
223
+ const colonIdx = cleanStatement.indexOf(':');
224
+ let headingPrefix = '';
225
+ let bodyPrefix = '';
226
+ if (colonIdx > 0) {
227
+ headingPrefix = cleanStatement.slice(0, colonIdx).trim().toLowerCase();
228
+ bodyPrefix = cleanStatement.slice(colonIdx + 1).trim().slice(0, 36).toLowerCase();
229
+ }
230
+
231
+ return {
232
+ id: target.id,
233
+ tag: target.tag,
234
+ cleanStatement,
235
+ prefix,
236
+ headingPrefix,
237
+ bodyPrefix,
238
+ };
239
+ });
240
+
241
+ const lines = guidanceText.split('\n');
242
+ const filteredLines = [];
243
+
244
+ for (let i = 0; i < lines.length; i++) {
245
+ const line = lines[i];
246
+ const cleanLine = line.replace(/[`*#_]/g, '').toLowerCase().trim();
247
+
248
+ let matchesTarget = false;
249
+ for (const sig of targetSignatures) {
250
+ if (line.includes(sig.id)) {
251
+ matchesTarget = true;
252
+ break;
253
+ }
254
+ if (sig.prefix && cleanLine.includes(sig.prefix)) {
255
+ matchesTarget = true;
256
+ break;
257
+ }
258
+ if (sig.bodyPrefix && cleanLine.includes(sig.bodyPrefix)) {
259
+ matchesTarget = true;
260
+ break;
261
+ }
262
+ if (sig.headingPrefix && (cleanLine === sig.headingPrefix || cleanLine.startsWith(sig.headingPrefix))) {
263
+ matchesTarget = true;
264
+ break;
265
+ }
266
+ if (sig.cleanStatement && cleanLine.length > 10 && sig.cleanStatement.toLowerCase().includes(cleanLine)) {
267
+ matchesTarget = true;
268
+ break;
269
+ }
270
+ }
271
+
272
+ if (!matchesTarget) {
273
+ filteredLines.push(line);
274
+ }
275
+ }
276
+
277
+ return filteredLines.join('\n');
278
+ }
279
+
280
+ /**
281
+ * Helper to count total test runs across cases for infraShare computation.
282
+ */
283
+ function countRuns(scores ) {
284
+ if (!scores || typeof scores !== 'object') return 0;
285
+ return Object.values(scores).reduce((acc, curr) => acc + (Array.isArray(curr) ? curr.length : 0), 0);
286
+ }
287
+
288
+ /**
289
+ * Noise-floor decision bridge evaluating statistical ablation success via bench/noise.ts decide() (IC-004).
290
+ */
291
+ function evaluateAblationNoiseDecision({
292
+ baselineScores,
293
+ candidateScores,
294
+ noiseArtifact,
295
+ noiseConfig,
296
+ scope = 'heldout',
297
+ }
298
+
299
+
300
+
301
+
302
+
303
+ ) {
304
+ let decide ;
305
+ try {
306
+ const noiseMod = require('../../../bench/noise.ts');
307
+ decide = noiseMod.decide;
308
+ } catch (err ) {
309
+ const error = new Error(`ERR_BENCH_NOT_FOUND: bench/noise.ts is only available in developer checkouts: ${err?.message || err}`);
310
+ error.code = 'ERR_BENCH_NOT_FOUND';
311
+ throw error;
312
+ }
313
+
314
+ const noise = noiseArtifact?.scopes?.[scope]?.noise ?? null;
315
+ const cfg = noiseConfig || {};
316
+ const mde = typeof cfg.mde === 'number' ? cfg.mde : 0.05;
317
+ const maxInfraShare = typeof cfg.maxInfraShare === 'number' ? cfg.maxInfraShare : 0.10;
318
+ const seed = Number.isInteger(cfg.seed) ? cfg.seed : 96;
319
+
320
+ const decision = decide({
321
+ scope,
322
+ baseline: baselineScores,
323
+ candidate: candidateScores,
324
+ excluded: {
325
+ baseline: { runs: countRuns(baselineScores), excluded: 0 },
326
+ candidate: { runs: countRuns(candidateScores), excluded: 0 },
327
+ },
328
+ noise,
329
+ mde,
330
+ maxInfraShare,
331
+ seed,
332
+ });
333
+
334
+ const rawVerdict = decision.verdict;
335
+ const recommendation = (rawVerdict === 'gain-above-noise' || rawVerdict === 'within-noise')
336
+ ? 'merge-candidate'
337
+ : 'do-not-merge';
338
+
339
+ return {
340
+ verdict: rawVerdict,
341
+ recommendation,
342
+ gain: decision.gain,
343
+ ci95: decision.ci95,
344
+ band: decision.band,
345
+ detail: decision.detail,
346
+ };
347
+ }
348
+
349
+ /**
350
+ * Loads baseline core guidance from filesystem for trial evaluation.
351
+ */
352
+ function loadCanonicalGuidance(repoRoot , fsImpl ) {
353
+ const guidanceDir = path.join(repoRoot, 'core', 'shared', 'guidance');
354
+ const files = [
355
+ path.join(guidanceDir, 'PRINCIPLES.md'),
356
+ path.join(guidanceDir, 'rules', 'RULES.md'),
357
+ ];
358
+ const parts = [];
359
+ for (const f of files) {
360
+ if (fsImpl.existsSync(f)) {
361
+ parts.push(fsImpl.readFileSync(f, 'utf8'));
362
+ }
363
+ }
364
+ return parts.join('\n\n');
365
+ }
366
+
367
+ /**
368
+ * Runs an ablation trial evaluating behavioral impact against baseline repeats (IC-003).
369
+ */
370
+ function runAblationTrial(options ) {
371
+ const repoRoot = options?.repoRoot || REPO_ROOT;
372
+ const fsImpl = (options )?.fsImpl || fs;
373
+ const ledger = options.ledger || loadRuleLedger({ repoRoot, fsImpl });
374
+
375
+ assertAblatable(options.candidateRuleIds, ledger);
376
+
377
+ const baseText = options.guidanceText || loadCanonicalGuidance(repoRoot, fsImpl);
378
+ const maskedText = maskGuidance({
379
+ guidanceText: baseText,
380
+ ablatedRuleIds: options.candidateRuleIds,
381
+ ledger,
382
+ });
383
+
384
+ const originalLength = Buffer.byteLength(baseText, 'utf8');
385
+ const maskedLength = Buffer.byteLength(maskedText, 'utf8');
386
+ const byteDelta = originalLength - maskedLength;
387
+
388
+ let trialVerdict = 'inconclusive';
389
+ let recommendation = 'do-not-merge';
390
+ let heldoutGain = null;
391
+ let ci95 = null;
392
+
393
+ if (options.simulationScores) {
394
+ const decision = evaluateAblationNoiseDecision({
395
+ baselineScores: options.simulationScores.baseline,
396
+ candidateScores: options.simulationScores.candidate,
397
+ noiseArtifact: options.noiseArtifact,
398
+ noiseConfig: options.noiseConfig,
399
+ scope: 'heldout',
400
+ });
401
+ trialVerdict = decision.verdict ;
402
+ recommendation = decision.recommendation ;
403
+ heldoutGain = decision.gain;
404
+ ci95 = decision.ci95;
405
+ }
406
+
407
+ return {
408
+ candidateRuleIds: options.candidateRuleIds,
409
+ maskedGuidanceLengthBytes: maskedLength,
410
+ byteDelta,
411
+ trialVerdict,
412
+ recommendation,
413
+ heldoutGain,
414
+ ci95,
415
+ };
416
+ }
417
+
418
+ module.exports = {
419
+ PERMANENT_NEVER_ABLATE_RULE_IDS,
420
+ NeverAblateViolationError,
421
+ loadRuleLedger,
422
+ getAblationCandidates,
423
+ assertAblatable,
424
+ maskGuidance,
425
+ evaluateAblationNoiseDecision,
426
+ runAblationTrial,
427
+ };