@mjasnikovs/pi-task 0.38.29 → 0.38.30

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 (370) hide show
  1. package/dist/config/config.d.ts +70 -70
  2. package/dist/config/config.js +26 -35
  3. package/dist/config/extension-list.d.ts +6 -5
  4. package/dist/config/extension-list.js +3 -2
  5. package/dist/config/reasoning-args.d.ts +9 -7
  6. package/dist/config/reasoning-args.js +12 -10
  7. package/dist/config/reasoning.d.ts +44 -105
  8. package/dist/config/reasoning.js +27 -704
  9. package/dist/config/register.d.ts +34 -48
  10. package/dist/config/register.js +41 -51
  11. package/dist/config/tool-list.d.ts +16 -16
  12. package/dist/config/tool-list.js +1 -1
  13. package/dist/remote/bridge.d.ts +19 -10
  14. package/dist/remote/bridge.js +3 -2
  15. package/dist/remote/broadcast.js +3 -1
  16. package/dist/remote/events.js +12 -11
  17. package/dist/remote/history.d.ts +1 -1
  18. package/dist/remote/protocol.d.ts +6 -3
  19. package/dist/remote/protocol.js +2 -1
  20. package/dist/remote/push.d.ts +16 -16
  21. package/dist/remote/push.js +27 -27
  22. package/dist/remote/register.d.ts +3 -3
  23. package/dist/remote/register.js +17 -19
  24. package/dist/remote/server.d.ts +9 -8
  25. package/dist/remote/server.js +15 -14
  26. package/dist/remote/session-state.d.ts +5 -4
  27. package/dist/remote/session-state.js +8 -5
  28. package/dist/remote/sw.d.ts +7 -6
  29. package/dist/remote/sw.js +7 -6
  30. package/dist/remote/tailscale.d.ts +4 -2
  31. package/dist/remote/tailscale.js +4 -2
  32. package/dist/remote/ui-highlight.js +6 -5
  33. package/dist/remote/ui-render.js +4 -4
  34. package/dist/remote/ui-script.js +24 -24
  35. package/dist/remote/ui-styles.d.ts +1 -1
  36. package/dist/remote/ui-styles.js +10 -13
  37. package/dist/remote/ui-tools.js +9 -6
  38. package/dist/shared/child-extensions.d.ts +29 -17
  39. package/dist/shared/child-extensions.js +29 -17
  40. package/dist/shared/child-output.d.ts +30 -24
  41. package/dist/shared/child-output.js +25 -17
  42. package/dist/shared/child-process.d.ts +47 -40
  43. package/dist/shared/child-process.js +50 -59
  44. package/dist/shared/command-watchdog.d.ts +22 -16
  45. package/dist/shared/command-watchdog.js +28 -21
  46. package/dist/shared/fs-text.d.ts +16 -10
  47. package/dist/shared/fs-text.js +16 -10
  48. package/dist/shared/git-runner.d.ts +25 -25
  49. package/dist/shared/git-runner.js +25 -25
  50. package/dist/shared/leaked-tool-call.d.ts +17 -11
  51. package/dist/shared/leaked-tool-call.js +23 -15
  52. package/dist/shared/model-endpoint.d.ts +29 -16
  53. package/dist/shared/model-endpoint.js +33 -21
  54. package/dist/shared/pi-invocation.d.ts +7 -4
  55. package/dist/shared/pi-invocation.js +12 -7
  56. package/dist/shared/pkg-version.d.ts +13 -5
  57. package/dist/shared/pkg-version.js +13 -5
  58. package/dist/shared/reasoning-capability.d.ts +35 -24
  59. package/dist/shared/reasoning-capability.js +35 -24
  60. package/dist/shared/stream-watchdog.d.ts +60 -44
  61. package/dist/shared/stream-watchdog.js +62 -45
  62. package/dist/task/accept-debt.d.ts +41 -43
  63. package/dist/task/accept-debt.js +73 -65
  64. package/dist/task/api-synthesis.d.ts +24 -21
  65. package/dist/task/api-synthesis.js +32 -26
  66. package/dist/task/apis-contract.d.ts +32 -64
  67. package/dist/task/apis-contract.js +32 -64
  68. package/dist/task/artifact-closure.d.ts +27 -13
  69. package/dist/task/artifact-closure.js +95 -67
  70. package/dist/task/auto-commit.d.ts +46 -35
  71. package/dist/task/auto-commit.js +51 -38
  72. package/dist/task/auto-io.d.ts +45 -25
  73. package/dist/task/auto-io.js +57 -29
  74. package/dist/task/auto-orchestrator.d.ts +26 -24
  75. package/dist/task/auto-orchestrator.js +178 -162
  76. package/dist/task/auto-prompts.d.ts +36 -24
  77. package/dist/task/auto-prompts.js +40 -26
  78. package/dist/task/autofix-ledger.d.ts +27 -25
  79. package/dist/task/autofix-ledger.js +29 -26
  80. package/dist/task/batch-test-task.d.ts +20 -12
  81. package/dist/task/batch-test-task.js +67 -60
  82. package/dist/task/boot-probe.d.ts +60 -44
  83. package/dist/task/boot-probe.js +91 -72
  84. package/dist/task/cancel-input.d.ts +30 -16
  85. package/dist/task/cancel-input.js +20 -11
  86. package/dist/task/cancel-points.d.ts +27 -20
  87. package/dist/task/cancel-points.js +30 -22
  88. package/dist/task/child-runner.d.ts +46 -51
  89. package/dist/task/child-runner.js +48 -49
  90. package/dist/task/child-status.d.ts +23 -16
  91. package/dist/task/child-status.js +23 -16
  92. package/dist/task/clamp-output.js +12 -5
  93. package/dist/task/command-run.d.ts +31 -28
  94. package/dist/task/command-run.js +44 -35
  95. package/dist/task/command-shrink.d.ts +25 -18
  96. package/dist/task/command-shrink.js +37 -31
  97. package/dist/task/command-watchdog.d.ts +9 -6
  98. package/dist/task/command-watchdog.js +21 -15
  99. package/dist/task/context-attribution.d.ts +34 -26
  100. package/dist/task/context-attribution.js +34 -26
  101. package/dist/task/context-silence.d.ts +39 -29
  102. package/dist/task/context-silence.js +35 -25
  103. package/dist/task/context-usage.d.ts +16 -9
  104. package/dist/task/context-usage.js +16 -9
  105. package/dist/task/contracts.d.ts +8 -4
  106. package/dist/task/contracts.js +25 -17
  107. package/dist/task/coverage-loop.d.ts +22 -18
  108. package/dist/task/coverage-loop.js +35 -30
  109. package/dist/task/critique-probes.d.ts +13 -14
  110. package/dist/task/critique-probes.js +50 -39
  111. package/dist/task/debug-log.d.ts +13 -5
  112. package/dist/task/debug-log.js +32 -20
  113. package/dist/task/decompose-fidelity.d.ts +11 -9
  114. package/dist/task/decompose-fidelity.js +38 -33
  115. package/dist/task/decompose-granularity.d.ts +41 -38
  116. package/dist/task/decompose-granularity.js +41 -38
  117. package/dist/task/deep-render-check.d.ts +22 -14
  118. package/dist/task/deep-render-check.js +40 -31
  119. package/dist/task/dropped-input.d.ts +12 -7
  120. package/dist/task/dropped-input.js +5 -2
  121. package/dist/task/enforce-attribution.d.ts +38 -47
  122. package/dist/task/enforce-attribution.js +46 -52
  123. package/dist/task/enforce-guidelines.d.ts +31 -20
  124. package/dist/task/enforce-guidelines.js +32 -21
  125. package/dist/task/enrichment.d.ts +7 -2
  126. package/dist/task/enrichment.js +26 -14
  127. package/dist/task/env-notes.d.ts +16 -7
  128. package/dist/task/env-notes.js +48 -31
  129. package/dist/task/env-template-closure.d.ts +4 -4
  130. package/dist/task/env-template-closure.js +42 -34
  131. package/dist/task/external-context.d.ts +28 -21
  132. package/dist/task/external-context.js +17 -12
  133. package/dist/task/failure-classifier.d.ts +4 -5
  134. package/dist/task/failure-classifier.js +6 -7
  135. package/dist/task/file-inventory.d.ts +15 -11
  136. package/dist/task/file-inventory.js +25 -22
  137. package/dist/task/final-gate-fix.d.ts +74 -86
  138. package/dist/task/final-gate-fix.js +97 -116
  139. package/dist/task/final-gate-progress.d.ts +29 -46
  140. package/dist/task/final-gate-progress.js +40 -51
  141. package/dist/task/final-gate.d.ts +64 -97
  142. package/dist/task/final-gate.js +192 -199
  143. package/dist/task/fix-child.d.ts +21 -27
  144. package/dist/task/fix-child.js +21 -27
  145. package/dist/task/foreign-path.d.ts +6 -5
  146. package/dist/task/foreign-path.js +0 -0
  147. package/dist/task/frozen-conflict.d.ts +9 -10
  148. package/dist/task/frozen-conflict.js +61 -64
  149. package/dist/task/frozen-path-guard.d.ts +35 -14
  150. package/dist/task/frozen-path-guard.js +56 -39
  151. package/dist/task/gate-child.d.ts +27 -28
  152. package/dist/task/gate-child.js +36 -35
  153. package/dist/task/gate-deps.d.ts +34 -27
  154. package/dist/task/gate-deps.js +169 -159
  155. package/dist/task/gate-tally.d.ts +77 -80
  156. package/dist/task/gate-tally.js +65 -68
  157. package/dist/task/git-state-guard.d.ts +15 -11
  158. package/dist/task/git-state-guard.js +76 -66
  159. package/dist/task/impl-widget.d.ts +25 -16
  160. package/dist/task/impl-widget.js +27 -17
  161. package/dist/task/implementation-thinking.d.ts +33 -31
  162. package/dist/task/implementation-thinking.js +5 -6
  163. package/dist/task/implementation-turn.d.ts +34 -31
  164. package/dist/task/implementation-turn.js +29 -27
  165. package/dist/task/inline-markdown.d.ts +20 -7
  166. package/dist/task/inline-markdown.js +15 -6
  167. package/dist/task/launch-config-gap.js +25 -39
  168. package/dist/task/launch-contract.d.ts +18 -21
  169. package/dist/task/launch-contract.js +28 -30
  170. package/dist/task/launch-manifest.d.ts +6 -2
  171. package/dist/task/launch-manifest.js +35 -34
  172. package/dist/task/ledger.js +16 -14
  173. package/dist/task/lint-fix.d.ts +6 -8
  174. package/dist/task/lint-fix.js +67 -69
  175. package/dist/task/loop-detector.d.ts +9 -8
  176. package/dist/task/loop-detector.js +16 -12
  177. package/dist/task/mid-run-input.d.ts +17 -15
  178. package/dist/task/mid-run-input.js +17 -15
  179. package/dist/task/orchestrator.d.ts +24 -28
  180. package/dist/task/orchestrator.js +62 -64
  181. package/dist/task/orientation.d.ts +18 -23
  182. package/dist/task/orientation.js +24 -31
  183. package/dist/task/owned-freeze-conflict.d.ts +21 -20
  184. package/dist/task/owned-freeze-conflict.js +52 -85
  185. package/dist/task/owned-freeze-reassign.d.ts +40 -60
  186. package/dist/task/owned-freeze-reassign.js +41 -61
  187. package/dist/task/parsers.d.ts +4 -2
  188. package/dist/task/parsers.js +4 -4
  189. package/dist/task/phases.d.ts +41 -48
  190. package/dist/task/phases.js +179 -248
  191. package/dist/task/plan-io.d.ts +6 -7
  192. package/dist/task/plan-io.js +6 -7
  193. package/dist/task/plan-orchestrator.d.ts +10 -8
  194. package/dist/task/plan-orchestrator.js +14 -10
  195. package/dist/task/plan-prompts.d.ts +6 -5
  196. package/dist/task/plan-prompts.js +6 -5
  197. package/dist/task/plan-readonly.d.ts +4 -5
  198. package/dist/task/plan-readonly.js +4 -5
  199. package/dist/task/plan-rounds.d.ts +17 -29
  200. package/dist/task/plan-rounds.js +21 -34
  201. package/dist/task/plan-session.d.ts +58 -72
  202. package/dist/task/plan-session.js +61 -83
  203. package/dist/task/probe-gaming.d.ts +28 -27
  204. package/dist/task/probe-gaming.js +0 -0
  205. package/dist/task/prohibition-probe.d.ts +14 -16
  206. package/dist/task/prompts.d.ts +3 -4
  207. package/dist/task/prompts.js +17 -26
  208. package/dist/task/qa-transcript.d.ts +15 -22
  209. package/dist/task/qa-transcript.js +15 -21
  210. package/dist/task/question-box.d.ts +17 -13
  211. package/dist/task/question-box.js +19 -15
  212. package/dist/task/question-dedup.d.ts +6 -7
  213. package/dist/task/question-dedup.js +13 -14
  214. package/dist/task/question-dialog.d.ts +22 -32
  215. package/dist/task/question-dialog.js +22 -32
  216. package/dist/task/question-source.d.ts +18 -44
  217. package/dist/task/question-source.js +22 -51
  218. package/dist/task/refuted-constraint.d.ts +11 -31
  219. package/dist/task/refuted-constraint.js +27 -51
  220. package/dist/task/regenerable-artifacts.d.ts +12 -31
  221. package/dist/task/regenerable-artifacts.js +12 -31
  222. package/dist/task/render-check.d.ts +11 -22
  223. package/dist/task/render-check.js +33 -46
  224. package/dist/task/repo-health-check.d.ts +10 -14
  225. package/dist/task/repo-health-check.js +17 -23
  226. package/dist/task/requirements.d.ts +38 -71
  227. package/dist/task/requirements.js +78 -126
  228. package/dist/task/research-fanout-budget.d.ts +51 -88
  229. package/dist/task/research-fanout-budget.js +51 -88
  230. package/dist/task/research-worker.d.ts +29 -39
  231. package/dist/task/research-worker.js +37 -61
  232. package/dist/task/resume-gap.d.ts +14 -15
  233. package/dist/task/root-cause-repair.d.ts +9 -9
  234. package/dist/task/root-cause-repair.js +28 -40
  235. package/dist/task/run-bracket.d.ts +10 -13
  236. package/dist/task/run-end.d.ts +12 -22
  237. package/dist/task/run-end.js +8 -16
  238. package/dist/task/run-final-gate.d.ts +19 -21
  239. package/dist/task/run-final-gate.js +62 -80
  240. package/dist/task/runner-globs.d.ts +12 -13
  241. package/dist/task/runner-globs.js +12 -13
  242. package/dist/task/runner-resolve.d.ts +9 -9
  243. package/dist/task/runner-resolve.js +22 -23
  244. package/dist/task/script-escape.d.ts +10 -12
  245. package/dist/task/script-escape.js +13 -14
  246. package/dist/task/serve-entry.d.ts +1 -1
  247. package/dist/task/serve-entry.js +22 -25
  248. package/dist/task/service-blocks.js +4 -2
  249. package/dist/task/shipped-source.d.ts +11 -29
  250. package/dist/task/shipped-source.js +11 -29
  251. package/dist/task/skip-escape.js +10 -14
  252. package/dist/task/spec-urls.d.ts +26 -65
  253. package/dist/task/spec-urls.js +26 -65
  254. package/dist/task/spec-validation.d.ts +17 -20
  255. package/dist/task/spec-validation.js +17 -20
  256. package/dist/task/stall-detector.d.ts +23 -30
  257. package/dist/task/stall-detector.js +23 -30
  258. package/dist/task/stream-watchdog.d.ts +14 -12
  259. package/dist/task/stream-watchdog.js +14 -12
  260. package/dist/task/substitution-probe.d.ts +17 -20
  261. package/dist/task/substitution-probe.js +17 -20
  262. package/dist/task/task-gates.d.ts +36 -41
  263. package/dist/task/task-gates.js +95 -106
  264. package/dist/task/task-io.d.ts +4 -4
  265. package/dist/task/task-io.js +4 -4
  266. package/dist/task/task-parsers.js +4 -3
  267. package/dist/task/task-provenance.d.ts +2 -2
  268. package/dist/task/task-provenance.js +11 -13
  269. package/dist/task/task-types.d.ts +4 -3
  270. package/dist/task/terminal-outcome.d.ts +14 -16
  271. package/dist/task/terminal-outcome.js +12 -14
  272. package/dist/task/test-assembly.d.ts +13 -20
  273. package/dist/task/test-assembly.js +13 -20
  274. package/dist/task/timings.d.ts +5 -3
  275. package/dist/task/timings.js +5 -3
  276. package/dist/task/title-label.d.ts +9 -4
  277. package/dist/task/title-label.js +9 -4
  278. package/dist/task/type-only-answer.d.ts +44 -52
  279. package/dist/task/type-only-answer.js +44 -52
  280. package/dist/task/unfailable-command.d.ts +18 -24
  281. package/dist/task/unfailable-command.js +21 -27
  282. package/dist/task/unknown-routing.d.ts +10 -4
  283. package/dist/task/unknown-routing.js +10 -4
  284. package/dist/task/user-directives.d.ts +5 -8
  285. package/dist/task/user-directives.js +5 -8
  286. package/dist/task/verify-quality.d.ts +18 -22
  287. package/dist/task/verify-quality.js +45 -46
  288. package/dist/task/verify-reconcile.d.ts +15 -10
  289. package/dist/task/verify-reconcile.js +45 -43
  290. package/dist/task/verify-resolution.d.ts +24 -20
  291. package/dist/task/verify-resolution.js +51 -50
  292. package/dist/task/verify-work.d.ts +59 -66
  293. package/dist/task/verify-work.js +101 -138
  294. package/dist/task/widget.d.ts +15 -14
  295. package/dist/task/widget.js +22 -17
  296. package/dist/task/wiring-claims.d.ts +25 -32
  297. package/dist/task/wiring-claims.js +30 -35
  298. package/dist/task/write-guard.d.ts +39 -39
  299. package/dist/task/write-guard.js +48 -51
  300. package/dist/task/yolo.d.ts +34 -30
  301. package/dist/task/yolo.js +42 -37
  302. package/dist/workers/abstention.d.ts +21 -41
  303. package/dist/workers/abstention.js +27 -48
  304. package/dist/workers/brave-search.d.ts +4 -3
  305. package/dist/workers/brave-search.js +5 -2
  306. package/dist/workers/brave-warning.d.ts +7 -4
  307. package/dist/workers/brave-warning.js +19 -7
  308. package/dist/workers/ddg-search.d.ts +6 -6
  309. package/dist/workers/ddg-search.js +18 -12
  310. package/dist/workers/docs-cache.js +5 -2
  311. package/dist/workers/docs-chunk.d.ts +30 -37
  312. package/dist/workers/docs-chunk.js +37 -41
  313. package/dist/workers/docs-core.d.ts +28 -44
  314. package/dist/workers/docs-core.js +25 -44
  315. package/dist/workers/docs-index.js +4 -3
  316. package/dist/workers/docs-lookup.d.ts +15 -22
  317. package/dist/workers/docs-lookup.js +12 -21
  318. package/dist/workers/docs-project.d.ts +15 -9
  319. package/dist/workers/docs-project.js +17 -10
  320. package/dist/workers/docs-resolve.d.ts +19 -20
  321. package/dist/workers/docs-resolve.js +35 -32
  322. package/dist/workers/docs-retrieve.d.ts +5 -6
  323. package/dist/workers/docs-retrieve.js +18 -15
  324. package/dist/workers/exa-search.d.ts +9 -6
  325. package/dist/workers/exa-search.js +23 -12
  326. package/dist/workers/fetch-core.d.ts +13 -16
  327. package/dist/workers/fetch-core.js +23 -23
  328. package/dist/workers/focused-extractor.d.ts +12 -12
  329. package/dist/workers/focused-extractor.js +16 -19
  330. package/dist/workers/html-clean.js +24 -14
  331. package/dist/workers/http-request.d.ts +28 -20
  332. package/dist/workers/http-request.js +22 -17
  333. package/dist/workers/npm-version.d.ts +28 -11
  334. package/dist/workers/npm-version.js +24 -15
  335. package/dist/workers/phantom-imports.d.ts +15 -12
  336. package/dist/workers/phantom-imports.js +30 -24
  337. package/dist/workers/pi-worker-core.d.ts +69 -71
  338. package/dist/workers/pi-worker-core.js +100 -109
  339. package/dist/workers/pi-worker-docs.d.ts +24 -19
  340. package/dist/workers/pi-worker-docs.js +67 -76
  341. package/dist/workers/pi-worker-fetch.d.ts +7 -3
  342. package/dist/workers/pi-worker-fetch.js +27 -19
  343. package/dist/workers/pi-worker-search.js +12 -8
  344. package/dist/workers/pi-worker.d.ts +9 -4
  345. package/dist/workers/pi-worker.js +21 -14
  346. package/dist/workers/reasoning-warning.d.ts +18 -17
  347. package/dist/workers/reasoning-warning.js +22 -20
  348. package/dist/workers/research-cache.js +50 -78
  349. package/dist/workers/search-core.js +7 -5
  350. package/dist/workers/search-types.d.ts +10 -9
  351. package/dist/workers/search-types.js +9 -8
  352. package/dist/workers/session-hint.d.ts +13 -14
  353. package/dist/workers/session-hint.js +8 -9
  354. package/dist/workers/shared.d.ts +21 -25
  355. package/dist/workers/shared.js +0 -0
  356. package/dist/workers/single-read-extension.d.ts +14 -7
  357. package/dist/workers/single-read-extension.js +14 -7
  358. package/dist/workers/single-read-guard.d.ts +25 -28
  359. package/dist/workers/single-read-guard.js +32 -32
  360. package/dist/workers/typeonly-log.d.ts +12 -9
  361. package/dist/workers/typeonly-log.js +29 -33
  362. package/dist/workers/worker-channels.d.ts +15 -23
  363. package/dist/workers/worker-channels.js +15 -23
  364. package/dist/workers/worker-failure.d.ts +38 -46
  365. package/dist/workers/worker-failure.js +31 -39
  366. package/dist/workers/worker-kill.d.ts +25 -26
  367. package/dist/workers/worker-kill.js +16 -19
  368. package/dist/workers/worker-profiles.d.ts +43 -53
  369. package/dist/workers/worker-profiles.js +30 -38
  370. package/package.json +10 -8
@@ -1,33 +1,23 @@
1
1
  /**
2
- * final-gate-progress — the non-progress classifier for the final-gate autofix loop.
2
+ * final-gate-progress — the non-progress classifier for the final-gate autofix
3
+ * loop. `AutofixLedger.judge` is its only caller.
3
4
  *
4
- * The failure this closes (mx5 run 14, validated from TASK_AUTO_0001.md's gates
5
- * trail): the gate's boot check asserted "the app never opened a listening socket"
6
- * in a sandbox where NO tool the probe knows (`ss`, `lsof`) exists the check was
7
- * UNFALSIFIABLE there. Three autofix attempts each edited real files, re-ran, and
8
- * came back with a byte-identical ranked-first failure; the budget was spent on a
9
- * check no edit could ever move, the two checks that WERE fixable had converged by
10
- * attempt 2, and the run ended `failed` with 13 genuinely repaired files sitting
11
- * uncommitted in the working tree.
12
- *
13
- * The rule this encodes: an attempt that CHANGED the tree and re-ran the gate, and
14
- * got the same first failure back as the previous attempt, is evidence about the
15
- * CHECK, not about the fix. Two identical post-fix results ⇒ the check is
16
- * env-shaped/unfalsifiable in this environment ⇒ stop paying for it: demote that
17
- * one check to UNOBSERVED-with-debt (durable, so the NEXT run's gate re-checks it)
18
- * and let the REMAINING checks decide whether the gate converged. Run 14 replay:
19
- * checks 2 and 3 were fixed by attempts 1–2, so the run converges with the boot
20
- * check carried as debt instead of failing with the repairs stranded.
5
+ * The rule: an attempt that CHANGED the tree and re-ran the gate, and got the
6
+ * same ranked-first failure back as the previous attempt, is evidence about the
7
+ * CHECK, not about the fix. A check that survives two post-fix results
8
+ * identically is unfalsifiable in this environment, so stop paying for it —
9
+ * demote that ONE check to UNOBSERVED-with-debt and let the remaining checks
10
+ * decide whether the gate converged. The debt is appended to the ledger file
11
+ * under `.pi-tasks/`, so it outlives the run and the next gate re-checks it.
21
12
  *
22
13
  * Deliberately conservative:
23
- * - It never fires on attempt 1. The first repeat can be an ordinary
24
- * didn't-fix-it-yet; only a SECOND identical post-fix result is evidence.
25
- * - It never fires when the attempt changed nothing (a BLOCKED child, a
26
- * guard-discarded attempt): with no edit there is nothing to conclude about
27
- * falsifiability.
28
- * - It demotes exactly the one repeated check. Every other failure still has to
29
- * pass for real; the debt keeps the demoted one visible at run end and in the
30
- * next run's gate.
14
+ * - It never fires on attempt 1: `previousSignature` is null until an attempt
15
+ * has produced one, and null returns false.
16
+ * - It never fires when the attempt changed nothing. The caller passes
17
+ * `edited` as "the gate re-ran AND the tree is dirty", and a guard-rejected
18
+ * attempt returns before the re-run, so its `gate` is undefined.
19
+ * - It demotes exactly the one repeated signature. Every other failure still
20
+ * has to pass for real.
31
21
  */
32
22
  /**
33
23
  * Comparison key for a gate failure entry: lowercased, volatile substrings erased,
@@ -51,7 +41,7 @@ export interface NonProgressInput {
51
41
  * attempt that edited and re-tested says anything about falsifiability. */
52
42
  edited: boolean;
53
43
  /**
54
- * Did a PROBE return this failure after OBSERVING? (nexttask 19A.) Read off
44
+ * Did a PROBE return this failure after OBSERVING? Read off
55
45
  * `FinalGateOutcome.observedFailures` by exact text identity — never re-derived
56
46
  * from the failure string.
57
47
  *
@@ -64,24 +54,17 @@ export interface NonProgressInput {
64
54
  * here: it edited the tree, the gate re-ran, and returned the same first failure
65
55
  * as the previous attempt.
66
56
  *
67
- * …EXCEPT when the probe OBSERVED the failure (nexttask 19A). This rule was built
68
- * as a blind compensator for a probe limitation run 14's boot check "could not
69
- * observe a listener in that sandbox at all" and that limitation was fixed
70
- * upstream ELEVEN MINUTES BEFORE this rule landed (`b0f90a7` 23:34:05, `dd3b0c3`
71
- * 23:45:09, both 2026-07-19). Every probe now reports "I could not look" as its
72
- * own outcome, with the reason. What was left was a second, blind judgment of the
73
- * same question, made DOWNSTREAM from the evidence — and its only reachable effect
74
- * was to overrule a probe that DID look.
75
- *
76
- * It has to be overruled, because a deterministic un-fixed defect emits an
77
- * IDENTICAL failure by definition. String equality therefore reads reproducibility
78
- * as evidence against the instrument, which is backwards for every project type: a
79
- * CLI that exits 2 twice, a build that fails on the same symbol twice, a C++ plugin
80
- * missing the same export twice. mx5 run 21 is the one recorded instance and it
81
- * released a product whose every page was blank as a `completed` run.
57
+ * …EXCEPT when a probe OBSERVED the failure, which is checked FIRST and wins
58
+ * outright. A probe that looked and saw the defect has already answered the
59
+ * question this rule guesses at, and it answered it where the evidence is. A
60
+ * probe that could NOT look reports that as its own outcome instead, so it never
61
+ * reaches `observedFailures`.
82
62
  *
83
- * The fix is NOT a better string pattern the bug is that the decision was made
84
- * downstream from the evidence, not that the pattern was too coarse.
63
+ * The observed guard has to win, because a deterministic un-fixed defect emits an
64
+ * IDENTICAL failure by definition. Without it, string equality reads
65
+ * reproducibility as evidence against the instrument — a CLI that exits 2 twice,
66
+ * a build that fails on the same symbol twice — and demotes a real, still-broken
67
+ * check to debt.
85
68
  */
86
69
  export declare function isNonProgress(input: NonProgressInput): boolean;
87
70
  /**
@@ -89,6 +72,6 @@ export declare function isNonProgress(input: NonProgressInput): boolean;
89
72
  * what still has to pass for the gate to converge; empty ⇒ converged-with-debt.
90
73
  */
91
74
  export declare function applyDemotions(failures: string[], demoted: ReadonlySet<string>): string[];
92
- /** The debt reason recorded for a demoted check, and the gate-trail wording. Kept
93
- * in one place so the ledger line and the trail line cannot drift apart. */
75
+ /** The debt reason recorded for a demoted check. One function so the ledger entry
76
+ * and the wording the user reads cannot drift apart. */
94
77
  export declare function unobservedDebtReason(detail: string): string;
@@ -1,33 +1,23 @@
1
1
  /**
2
- * final-gate-progress — the non-progress classifier for the final-gate autofix loop.
2
+ * final-gate-progress — the non-progress classifier for the final-gate autofix
3
+ * loop. `AutofixLedger.judge` is its only caller.
3
4
  *
4
- * The failure this closes (mx5 run 14, validated from TASK_AUTO_0001.md's gates
5
- * trail): the gate's boot check asserted "the app never opened a listening socket"
6
- * in a sandbox where NO tool the probe knows (`ss`, `lsof`) exists the check was
7
- * UNFALSIFIABLE there. Three autofix attempts each edited real files, re-ran, and
8
- * came back with a byte-identical ranked-first failure; the budget was spent on a
9
- * check no edit could ever move, the two checks that WERE fixable had converged by
10
- * attempt 2, and the run ended `failed` with 13 genuinely repaired files sitting
11
- * uncommitted in the working tree.
12
- *
13
- * The rule this encodes: an attempt that CHANGED the tree and re-ran the gate, and
14
- * got the same first failure back as the previous attempt, is evidence about the
15
- * CHECK, not about the fix. Two identical post-fix results ⇒ the check is
16
- * env-shaped/unfalsifiable in this environment ⇒ stop paying for it: demote that
17
- * one check to UNOBSERVED-with-debt (durable, so the NEXT run's gate re-checks it)
18
- * and let the REMAINING checks decide whether the gate converged. Run 14 replay:
19
- * checks 2 and 3 were fixed by attempts 1–2, so the run converges with the boot
20
- * check carried as debt instead of failing with the repairs stranded.
5
+ * The rule: an attempt that CHANGED the tree and re-ran the gate, and got the
6
+ * same ranked-first failure back as the previous attempt, is evidence about the
7
+ * CHECK, not about the fix. A check that survives two post-fix results
8
+ * identically is unfalsifiable in this environment, so stop paying for it —
9
+ * demote that ONE check to UNOBSERVED-with-debt and let the remaining checks
10
+ * decide whether the gate converged. The debt is appended to the ledger file
11
+ * under `.pi-tasks/`, so it outlives the run and the next gate re-checks it.
21
12
  *
22
13
  * Deliberately conservative:
23
- * - It never fires on attempt 1. The first repeat can be an ordinary
24
- * didn't-fix-it-yet; only a SECOND identical post-fix result is evidence.
25
- * - It never fires when the attempt changed nothing (a BLOCKED child, a
26
- * guard-discarded attempt): with no edit there is nothing to conclude about
27
- * falsifiability.
28
- * - It demotes exactly the one repeated check. Every other failure still has to
29
- * pass for real; the debt keeps the demoted one visible at run end and in the
30
- * next run's gate.
14
+ * - It never fires on attempt 1: `previousSignature` is null until an attempt
15
+ * has produced one, and null returns false.
16
+ * - It never fires when the attempt changed nothing. The caller passes
17
+ * `edited` as "the gate re-ran AND the tree is dirty", and a guard-rejected
18
+ * attempt returns before the re-run, so its `gate` is undefined.
19
+ * - It demotes exactly the one repeated signature. Every other failure still
20
+ * has to pass for real.
31
21
  */
32
22
  /**
33
23
  * Volatile substrings that differ between two runs of the SAME failing check —
@@ -60,12 +50,18 @@ const VOLATILE = [
60
50
  * A bare `:NNNN` port, which the localhost/`port N` rules above do not reach (a
61
51
  * failure that just says "no listener on :3000").
62
52
  *
63
- * NOT applied when the colon follows a SOURCE LOCATION `src/db.ts:41`,
64
- * `Cart.tsx:88:12`. A failure detail embeds the failing command's output tail
65
- * verbatim (final-gate.ts `r.tail`), and tsc/eslint/bun-test tails are mostly
66
- * file:line. Collapsing those made two DIFFERENT defects in one file the second
67
- * uncovered by fixing the first compare equal, which reads as non-progress and
68
- * demotes a genuinely fixable check to UNOBSERVED debt. A moved error is progress.
53
+ * NOT applied when the colon follows a SOURCE LOCATION. A failure detail embeds
54
+ * the failing command's output tail verbatim (final-gate.ts interpolates
55
+ * `r.tail`), and tsc/eslint/bun-test tails are mostly `file:line`. Collapsing
56
+ * those would make two DIFFERENT defects in one file compare equal, which reads
57
+ * as non-progress and demotes a genuinely fixable check. A moved error is
58
+ * progress.
59
+ *
60
+ * The exemption covers the FILE:LINE colon only. Measured: `src/db.ts:41` and
61
+ * `src/db.ts:88` keep their line numbers and stay different, but the COLUMN in
62
+ * `Cart.tsx:88:12` normalises to `cart.tsx:88:<port>` — the prefix at that colon
63
+ * is the bare `88`, which is neither a path nor a filename. Two defects that
64
+ * differ only in column therefore compare equal.
69
65
  */
70
66
  const BARE_PORT = /(\S*?):(\d{2,5})\b/g;
71
67
  /** A path (has a separator) or a filename with an extension ⇒ a source location. */
@@ -97,24 +93,17 @@ export function rankedFirstFailure(outcome) {
97
93
  * here: it edited the tree, the gate re-ran, and returned the same first failure
98
94
  * as the previous attempt.
99
95
  *
100
- * …EXCEPT when the probe OBSERVED the failure (nexttask 19A). This rule was built
101
- * as a blind compensator for a probe limitation run 14's boot check "could not
102
- * observe a listener in that sandbox at all" and that limitation was fixed
103
- * upstream ELEVEN MINUTES BEFORE this rule landed (`b0f90a7` 23:34:05, `dd3b0c3`
104
- * 23:45:09, both 2026-07-19). Every probe now reports "I could not look" as its
105
- * own outcome, with the reason. What was left was a second, blind judgment of the
106
- * same question, made DOWNSTREAM from the evidence — and its only reachable effect
107
- * was to overrule a probe that DID look.
108
- *
109
- * It has to be overruled, because a deterministic un-fixed defect emits an
110
- * IDENTICAL failure by definition. String equality therefore reads reproducibility
111
- * as evidence against the instrument, which is backwards for every project type: a
112
- * CLI that exits 2 twice, a build that fails on the same symbol twice, a C++ plugin
113
- * missing the same export twice. mx5 run 21 is the one recorded instance and it
114
- * released a product whose every page was blank as a `completed` run.
96
+ * …EXCEPT when a probe OBSERVED the failure, which is checked FIRST and wins
97
+ * outright. A probe that looked and saw the defect has already answered the
98
+ * question this rule guesses at, and it answered it where the evidence is. A
99
+ * probe that could NOT look reports that as its own outcome instead, so it never
100
+ * reaches `observedFailures`.
115
101
  *
116
- * The fix is NOT a better string pattern the bug is that the decision was made
117
- * downstream from the evidence, not that the pattern was too coarse.
102
+ * The observed guard has to win, because a deterministic un-fixed defect emits an
103
+ * IDENTICAL failure by definition. Without it, string equality reads
104
+ * reproducibility as evidence against the instrument — a CLI that exits 2 twice,
105
+ * a build that fails on the same symbol twice — and demotes a real, still-broken
106
+ * check to debt.
118
107
  */
119
108
  export function isNonProgress(input) {
120
109
  if (input.observed === true)
@@ -134,8 +123,8 @@ export function applyDemotions(failures, demoted) {
134
123
  return [...failures];
135
124
  return failures.filter(f => !demoted.has(normalizeFailureDetail(f)));
136
125
  }
137
- /** The debt reason recorded for a demoted check, and the gate-trail wording. Kept
138
- * in one place so the ledger line and the trail line cannot drift apart. */
126
+ /** The debt reason recorded for a demoted check. One function so the ledger entry
127
+ * and the wording the user reads cannot drift apart. */
139
128
  export function unobservedDebtReason(detail) {
140
129
  return (`final gate check UNOBSERVED — ${detail.trim().slice(0, 200)} — `
141
130
  + 'repeated identically across two fix attempts that both changed the tree and '
@@ -11,40 +11,34 @@ export interface FinalGateOutcome {
11
11
  /**
12
12
  * On a fail: the exact command(s), exit code(s), and output tail(s) — the
13
13
  * MECHANICAL failures only. The accept-debt note is deliberately NOT folded in
14
- * here (mx5 run 11): this string seeds the final-gate AUTOFIX child's prompt,
15
- * and a debt included there is read as an instruction — the run-11 fix child
16
- * `rm`'d a sibling task's verified deliverable to satisfy a recorded claim. The
17
- * child cannot act on text it never receives; debts travel in `debtNote`.
18
- * With multiple failures this is the numbered, ranked list (see `failures`).
14
+ * here, because this string is what `buildFinalFixPrompt` puts in front of the
15
+ * autofix child, and a recorded debt claim reaching a write-enabled child reads
16
+ * as an instruction to act on it. The child cannot act on text it never
17
+ * receives; debts travel in `debtNote`. With multiple failures this is the
18
+ * numbered, ranked list (see `failures`).
19
19
  */
20
20
  reason: string;
21
21
  /**
22
22
  * On a fail: EVERY section failure individually, ranked most load-bearing
23
23
  * first — boot/render ("the app does not serve/render") outranks any single
24
- * test failure. The gate runs every section and aggregates rather than
25
- * early-returning (mx5 run 13: a bun-test glob failure shadowed the boot +
26
- * render probe, so the user accepted the FAIL having only ever seen 1 failing
27
- * CT test while the shipped app 404'd on every non-API GET). Callers trail
28
- * each entry and show the full list wherever an ACCEPT decision is made.
24
+ * test failure. The gate aggregates rather than early-returning: the boot and
25
+ * render probes run LAST, so a first-failure return would let any earlier test
26
+ * failure shadow the one signal that answers "does the app serve anything at
27
+ * all". Callers trail each entry and show the full list wherever an ACCEPT
28
+ * decision is made.
29
29
  */
30
30
  failures?: string[];
31
31
  /**
32
32
  * The SUBSET of `failures` that a PROBE returned after actually observing —
33
33
  * entries whose evidence is "we looked, and what we saw was bad", as opposed to
34
- * "we could not look" (nexttask 19A).
34
+ * "we could not look".
35
35
  *
36
- * The probes have always known this about themselves: `RenderOutcome` is
37
- * `pass | fail | skip`, `f648f5b` (2026-07-14) turned a render `skip` into
38
- * "render check UNOBSERVED: <reason>", and `b0f90a7` (2026-07-19) made an
39
- * unenumerable boot return PASS-stamped-UNOBSERVED rather than FAIL. What was
40
- * missing is that the outcome CLASS never travelled with the failure TEXT, so
41
- * the non-progress classifier downstream had to guess — and guessed by string
42
- * equality, which a deterministic un-fixed defect satisfies by definition.
43
- *
44
- * mx5 run 21: the render probe FAILED on a blank page, the same failure came
45
- * back from two tree-changing fix attempts (because the defect was real and
46
- * unfixed), the classifier read that as evidence against the INSTRUMENT, and
47
- * the run shipped a product whose every page was blank as `completed`.
36
+ * The probes distinguish "we looked and it was bad" from "we could not look"
37
+ * in their own outcomes; this field carries that class alongside the failure
38
+ * TEXT. Without it the non-progress classifier downstream has only string
39
+ * equality to go on, and a deterministic un-fixed defect satisfies string
40
+ * equality by definition so a real, still-broken check reads as an
41
+ * unfalsifiable one and gets demoted to debt.
48
42
  *
49
43
  * Membership is by exact text identity with an entry of `failures` — never a
50
44
  * pattern, never a re-derivation. Absent/empty on a pass.
@@ -57,10 +51,10 @@ export interface FinalGateOutcome {
57
51
  */
58
52
  debtNote?: string;
59
53
  /**
60
- * ACCEPT-despite-verify-FAIL debts still open at run end (mx5 run 4 B3 / run 8
61
- * TASK_0012): tasks the user blessed as-is despite a verify-FAIL that a
62
- * deterministic re-check could not prove resolved. The caller surfaces them so a
63
- * run never completes silently carrying an accepted defect. Empty/absent = none.
54
+ * ACCEPT-despite-verify-FAIL debts still open at run end: tasks the user
55
+ * blessed as-is despite a verify-FAIL that a deterministic re-check could not
56
+ * prove resolved. The caller surfaces them so a run never completes silently
57
+ * carrying an accepted defect. Empty/absent = none.
64
58
  */
65
59
  openDebts?: AcceptDebt[];
66
60
  /**
@@ -68,8 +62,8 @@ export interface FinalGateOutcome {
68
62
  * supposed to. Two independent triggers, either or both:
69
63
  * - nothing dynamic ran at all — no command was discoverable, or every discovered
70
64
  * one skipped as an environment gap (unobservedVerdict);
71
- * - a served app's boot command was discovered and SKIPPED, whatever else ran
72
- * (bootSkipVerdict, mx5 run 18 — test suites may not stand in for a launch).
65
+ * - a served app's boot command was discovered and SKIPPED, whatever else ran.
66
+ *
73
67
  * `ok` is still true (the statics did pass and there is nothing to fix), but this is
74
68
  * NOT a PASS: the caller must record it as UNOBSERVED, never as "checked and fine".
75
69
  * Absent ⇒ everything the gate meant to observe, it observed.
@@ -82,24 +76,19 @@ export interface FinalGateOutcome {
82
76
  * manifest that exists wins, mirroring discoverHealthCommands. Empty means
83
77
  * "nothing to run" — the static half may still gate.
84
78
  *
85
- * THE MANIFEST ALLOWLIST BELOW IS NARROW, AND THAT IS A KNOWN, MEASURED GAP: a
86
- * C++/CMake project (no package.json) and a package.json whose only script is
87
- * `verify` both discover NOTHING here. That outcome is now reported as UNOBSERVED
88
- * rather than as a PASS (see unobservedVerdict), which makes the blindness loud and
89
- * durable — it does not remove it. The gap itself stands.
79
+ * THE MANIFEST ALLOWLIST BELOW IS NARROW, AND THAT IS A KNOWN GAP: a project with
80
+ * no package.json, Makefile, Cargo.toml, go.mod or pyproject.toml discovers
81
+ * NOTHING here, and so does a package.json whose only script is named something
82
+ * else. That outcome is reported as UNOBSERVED rather than as a PASS (see
83
+ * unobservedVerdict), which makes the blindness loud — it does not remove it.
90
84
  *
91
- * The obvious fix harvest each task's own `## verified tooling` section, which
92
- * DOES record the missing commands was measured on 2026-07-27 and REFUTED. That
93
- * section is model-authored and, despite its name, unverified: on godot-engine it
94
- * yields 3 commands that exit 0 and 8 that exit non-zero, six of those for purely
95
- * fabricated reasons (recorded without a required argument, pointing at files that
96
- * do not exist, naming a test runner the project does not use) — so harvesting it
97
- * turns that project's PASS into a FAIL citing "No scene path provided", plus ~15
98
- * minutes of hang. Full numbers, the reproduction rig, and why no pre-execution
99
- * filter can separate a fabricated command from a real one:
100
- * scripts/harvest-verified-tooling-step0.ts. DO NOT re-propose the harvest without
101
- * first fixing the PROVENANCE of `## verified tooling` (record cwd + exit code at
102
- * authoring time); widening this allowlist tool-by-tool is not the fix either.
85
+ * DO NOT close the gap by harvesting each task's own `## verified tooling`
86
+ * section. That section is the parsed output of a model child (phases.ts writes
87
+ * it from the verify-tooling worker), and despite its name nothing records the
88
+ * cwd the command was tried in or the code it exited with so a fabricated
89
+ * command is indistinguishable from a real one before it runs, and running it is
90
+ * how the gate would find out. Fix that provenance first. Widening this allowlist
91
+ * tool-by-tool is not the fix either.
103
92
  */
104
93
  export declare function discoverIntegrationCommands(cwd: string): {
105
94
  ecosystem: string | null;
@@ -119,11 +108,11 @@ export declare function discoverGateCommandLabels(cwd: string): string[];
119
108
  * The RESOLVED BODY of every discoverable gate command, keyed by the same label
120
109
  * `discoverGateCommandLabels` produces.
121
110
  *
122
- * The label is what the gate CALLS; the body is what actually runs. mx5 run 19's
123
- * autofix changed `scripts.test` from `AGENT=1 bun test` to `AGENT=1 bun test
124
- * ./test` — the label `bun run test` was identical before and after, so the
125
- * label guard saw nothing while the suite stopped covering the repository. The
126
- * shrink guard compares these bodies (see command-shrink.ts).
111
+ * The label is what the gate CALLS; the body is what actually runs. A fix pass
112
+ * can rewrite `scripts.test` to run one subdirectory and leave the label
113
+ * `bun run test` identical, so the label guard sees nothing while the suite stops
114
+ * covering the repository. The shrink guard compares these bodies (see
115
+ * command-shrink.ts).
127
116
  *
128
117
  * A command with no indirection (`cargo test --quiet`, `pytest -q`) resolves to
129
118
  * itself: it cannot be narrowed without changing the label, which the label
@@ -145,10 +134,9 @@ export { deriveOpenDebts, rerunDebtVerifyCommand };
145
134
  * with no runnable command at all still FAILS the scan instead of returning
146
135
  * UNOBSERVED. A static check needs no runner; that is the whole point of
147
136
  * deciding it in exactly the environment where every dynamic probe went blind.
148
- * - `post-boot` runs after the dynamic sections, which is where these scans'
149
- * failures have always landed relative to command/launch/boot failures.
150
- * Execution order is the aggregate's tiebreak within a rank, so moving a row
151
- * between stages MOVES it in the user-visible failure list.
137
+ * - `post-boot` runs after the dynamic sections. Execution order is the
138
+ * aggregate's tiebreak within a rank, so moving a row between stages MOVES it
139
+ * in the user-visible failure list.
152
140
  */
153
141
  type ClosureScanStage = 'pre-discovery' | 'post-boot';
154
142
  /** Everything a closure scan may look at. Static and synchronous by construction:
@@ -181,13 +169,12 @@ interface ClosureScan {
181
169
  * finding.
182
170
  *
183
171
  * A GENERATOR rather than a function returning an array, for two reasons.
184
- * First, the driver's try/catch wraps the ITERATION, so a scan that produces
185
- * two findings and then faults still emits those two precisely what the
186
- * three hand-written `for (… ) fail(…)` loops inside try blocks did. Second,
187
- * the three scans do not share a result shape (one nullable finding; a list;
188
- * a list plus the template set its formatter also needs), and folding scan
189
- * and format together lets each row keep its own arity instead of forcing a
190
- * lowest-common-denominator result type on all of them.
172
+ * First, the driver's try/catch wraps the ITERATION, so a scan that yields two
173
+ * findings and then throws still emits those two. Second, the three scans do
174
+ * not share a result shape one nullable finding, a list, and a list plus the
175
+ * template set its formatter also needs and folding scan and format together
176
+ * lets each row keep its own arity instead of forcing a
177
+ * lowest-common-denominator result type on all three.
191
178
  */
192
179
  run: (input: ClosureScanInput) => Iterable<string>;
193
180
  }
@@ -195,12 +182,12 @@ interface ClosureScan {
195
182
  * The run-level closure scans, in emission order within their stage.
196
183
  *
197
184
  * ONLY checks of this shape belong here. Four other checks in this gate are
198
- * deliberately NOT rows: repo-health returns {ok, reason} and formats inline;
199
- * the launch-contract diff branches on manifest kind and can emit a NOTE instead
200
- * of a failure; the launch config-gap produces neither a failure nor a note but
201
- * UN-COUNTS a dynamic observation; and the boot check is an async, stateful,
202
- * port-binding exercise. Squeezing any of those in would mean a row type with
203
- * more escape hatches than content.
185
+ * deliberately NOT rows: repo-health returns {ok, reason} and formats inline; the
186
+ * launch-contract diff branches on manifest kind and can emit a NOTE instead of a
187
+ * failure; the launch config-gap produces neither a failure nor a note but
188
+ * UN-COUNTS a dynamic observation (`tally.unobserve()`); and the boot check is
189
+ * async, stateful and port-binding. Squeezing any of those in would mean a row
190
+ * type with more escape hatches than content.
204
191
  */
205
192
  declare const CLOSURE_SCANS: ClosureScan[];
206
193
  /**
@@ -217,36 +204,16 @@ declare const CLOSURE_SCANS: ClosureScan[];
217
204
  declare function runClosureScans(stage: ClosureScanStage, input: ClosureScanInput, fail: (text: string, rank: number) => void, scans?: readonly ClosureScan[]): void;
218
205
  export { CLOSURE_SCANS, runClosureScans };
219
206
  export type { ClosureScan, ClosureScanInput, ClosureScanStage };
220
- /**
221
- * Run the final gate: static analysis first, then the lockfile consistency
222
- * checks, then the discovered integration commands, then one boot exercise of
223
- * the start command — whole-repo, verbatim, unaided. Deterministic (no model).
224
- *
225
- * EVERY section runs and failures AGGREGATE (mx5 run 13): the gate used to
226
- * early-return on the first failing section, and the boot + render probe — built
227
- * after run 11 exactly for "app serves blank/nothing" — was ordered last, so any
228
- * earlier failure shadowed the most load-bearing signal. Run 13's user accepted
229
- * the FAIL having seen only 1 failing CT test while the app 404'd on every
230
- * non-API GET; boot/render never executed in any attempt. Now the outcome
231
- * carries the full ranked failure list (boot/render first — "the app does not
232
- * serve/render" outranks any single test), the ACCEPT decision is made on all of
233
- * it, and autofix converges only when the whole list is empty. Per-section
234
- * env-gap/INFRA_GAP skip semantics and orphan-port recovery are unchanged.
235
- */
236
207
  /**
237
208
  * Everything the run-end gate needs beyond the tree it is judging.
238
209
  *
239
- * An options object rather than a positional tail: the production call site read
240
- * `runFinalIntegrationGate(cwd, undefined, undefined, undefined, planText)`, and
241
- * `bootGraceMs`/`timeoutMs` are adjacent numbers that swap without a type error.
210
+ * An options object rather than a positional tail, because `bootGraceMs` and
211
+ * `timeoutMs` are adjacent numbers that would swap without a type error.
242
212
  *
243
- * `run`, `envClosure` and `trackedFiles` are SEAMS, by the same test GateDeps
244
- * states: a scenario needs to substitute them. `runGateCommand`,
245
- * `runVerifyCommandLine` and `rerunDebtVerifyCommand` each already take a
246
- * `CommandRunner`; this is the fourth and last driver in the file, and without it
247
- * the config-gap branch below is unreachable in test — not by oversight, but
248
- * because reaching it needs a git-tracked env template, so every launch-contract
249
- * test (bare `makeDir`, no `git init`) misses it by construction.
213
+ * `run`, `envClosure` and `trackedFiles` are test SEAMS. Without `run`, the
214
+ * config-gap branch below is unreachable from a test: reaching it needs a
215
+ * git-tracked env template, and the launch-contract tests build a bare directory
216
+ * with no `git init`, so they miss it by construction.
250
217
  */
251
218
  export interface FinalGateOptions {
252
219
  timeoutMs?: number;
@@ -262,9 +229,9 @@ export interface FinalGateOptions {
262
229
  trackedFiles?: (cwd: string) => string[] | null;
263
230
  /**
264
231
  * The run's cancel. Reaches every command the gate spawns — repo-health, the
265
- * lockfile/integration/launch sections and the ACCEPT-debt re-runs. Nothing
266
- * could be cancelled while `CommandRunner` was synchronous: the event loop
267
- * never got a turn in which to notice.
232
+ * lockfile, integration and launch sections, and the ACCEPT-debt re-runs. It
233
+ * only works because `CommandRunner` is async: a synchronous spawn never gives
234
+ * the event loop a turn in which to notice an abort.
268
235
  */
269
236
  signal?: AbortSignal;
270
237
  }