@mjasnikovs/pi-task 0.38.28 → 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 +25 -7
  104. package/dist/task/context-usage.js +21 -6
  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 +37 -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 +180 -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 +33 -36
  231. package/dist/task/research-worker.js +39 -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 +86 -54
  338. package/dist/workers/pi-worker-core.js +112 -112
  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 +23 -10
  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,21 +1,12 @@
1
1
  /**
2
2
  * root-cause-repair — turn a verify-FAIL that was CAUSED by another task's file
3
- * into a scoped repair task in the running plan (mx5 run 14, PROMPT item 5).
3
+ * into a scoped repair task in the running plan.
4
4
  *
5
- * The failure class this closes, observed end-to-end in run 14: TASK_0007 shipped
6
- * `test/teardown.ts` with parameterized table names in its TRUNCATE statements.
7
- * That bug then FAILED two later, unrelated tasks
8
- *
9
- * TASK_0013 "test/teardown.ts has a pre-existing bug (parameterized table names
10
- * in TRUNCATE statements) … despite all 10 actual tests passing"
11
- * TASK_0019 "… due to a pre-existing teardown bug in `test/teardown.ts`
12
- * (created by TASK_0007) … this task did not modify the teardown"
13
- *
14
- * — and BOTH ended in an enforce-revert, so the enforce pass's edits were destroyed
15
- * over a defect the current task did not create. The ledger recorded the root cause
16
- * twice and NOTHING ever scheduled a fix: the bug survived ~24h, until the final
17
- * gate's fix child happened to patch it, and it also generated the "2 pre-existing
18
- * failures / state pollution" excuse notes repeated across TASK_0033…0038.
5
+ * The failure class this closes: one task ships a broken shared file — a test
6
+ * teardown, say and that file then FAILS later, unrelated tasks. Each of those
7
+ * FAILs is recorded as a debt naming the same root cause, and nothing schedules a
8
+ * fix: every later task keeps hitting it, and each one's enforce pass can be
9
+ * reverted over a defect it did not create.
19
10
  *
20
11
  * The channel here is deliberately narrow, because a false positive costs a whole
21
12
  * task slot and mutates a running plan. Three independent conditions must ALL hold:
@@ -23,25 +14,22 @@
23
14
  * 1. TEXT — the FAIL reason (or the resolution research's rationale) carries an
24
15
  * explicit blame cue ("pre-existing", "created by TASK_nnnn", "bug in", "this
25
16
  * task did not modify") and a path token near it. Merely MENTIONING a path is
26
- * not blame: run 14's TASK_0010 FAIL lists `src/server/db.ts` inside the
27
- * spec's own "Preserve all existing files on disk" quote, and must not spawn
28
- * a repair task for it.
17
+ * not blame: a FAIL that quotes the spec's own "Preserve all existing files
18
+ * on disk" alongside a path must not spawn a repair task for that path.
29
19
  * 2. PROVENANCE — the blamed file was introduced by a DIFFERENT task's commit
30
20
  * (task-provenance.ts). Unknown provenance is never evidence.
31
21
  * 3. AUTHORSHIP — the current task's own work does not touch the blamed file. If
32
22
  * this task edited it, the defect may well be its own and the ordinary
33
23
  * autofix/revert path is right.
34
24
  *
35
- * Environment-attributed failures are vetoed outright (run 14's TASK_0006: "no
36
- * PostgreSQL database server is available in this environment"). No file edit can
37
- * repair a missing daemon, so a repair task would be a guaranteed non-converging
38
- * yolo-FAIL.
25
+ * Environment-attributed failures are vetoed outright ("no PostgreSQL database
26
+ * server is available in this environment"). No file edit repairs a missing
27
+ * daemon, so a repair task there would be a guaranteed non-converging FAIL.
39
28
  *
40
- * Everything downstream is deduplicated by FILE: N debts naming one root file yield
41
- * exactly ONE repair task per run (run 14 would otherwise have spawned two for
42
- * `test/teardown.ts`). The repair task itself is just an ordinary plan entry if it
43
- * fails, it lands in the ledger like any other task and is never re-spawned, which
44
- * is what keeps this from looping.
29
+ * Everything downstream is deduplicated by FILE: N debts naming one root file
30
+ * yield exactly ONE repair task per run. The repair task itself is just an
31
+ * ordinary plan entry if it fails, it lands in the ledger like any other task
32
+ * and is never re-spawned, which is what keeps this from looping.
45
33
  */
46
34
  import { makeLedger } from './ledger.js';
47
35
  /** A path-like token: at least one directory separator, ending in a file name. */
@@ -50,14 +38,14 @@ const PATH_TOKEN_RE = /(?:[\w.@-]+\/)+[\w.@-]+\.\w+/g;
50
38
  * Phrases that ATTRIBUTE a failure to something that predates the current task.
51
39
  * Each is a blame cue: the path token nearest a cue is the accused file. Kept
52
40
  * deliberately specific — a bare "existing" matches the spec boilerplate
53
- * "Preserve all existing files on disk" that run 14's TASK_0010 FAIL quotes.
41
+ * "Preserve all existing files on disk" that a task FAIL quotes.
54
42
  */
55
43
  const BLAME_CUE_RE = /pre-?\s?existing|existing (?:bug|defect|failure|issue|fault)|(?:created|introduced|added|written) (?:by|in) TASK_\d+|(?:bug|defect|fault|error) in\b|already (?:broken|failing|red)|(?:this task )?did not (?:modify|touch|create|change)|not (?:modified|touched|created|introduced) by this task|unrelated to this task/gi;
56
44
  /**
57
45
  * Failures the environment causes, not a file. No edit to any file repairs a
58
- * missing database server, so these must never open the repair channel — run 14's
59
- * TASK_0006 ("no PostgreSQL database server is available in this environment (no
60
- * binary, no Docker, no listener on port 5432)") is the canonical shape.
46
+ * missing database server, so these must never open the repair channel. The
47
+ * canonical shape is "no PostgreSQL database server is available in this
48
+ * environment (no binary, no Docker, no listener on port 5432)".
61
49
  */
62
50
  const ENVIRONMENT_BLAME_RE = /no (?:postgres|postgresql|mysql|database|redis|docker|network|internet|display)\b|not (?:installed|available|running|present) (?:in|on|for) (?:this |the )?(?:env|environment|sandbox|container|machine|image|system)|(?:environment|env|sandbox|container) (?:gap|limitation|lacks|has no|does not (?:have|provide))|no (?:binary|listener|daemon|server) (?:on|for|available)|missing (?:binary|executable|system (?:tool|package)|runtime)|is not installed|command not found/i;
63
51
  /** How far from a blame cue a path token may sit and still be the accused file. */
@@ -280,10 +268,11 @@ export async function drainRepairQueue(cwd) {
280
268
  return parsed;
281
269
  }
282
270
  /**
283
- * Collapse candidates by file — MANDATORY dedup: run 14's two teardown.ts debts
284
- * (TASK_0013, TASK_0019) must yield exactly ONE repair task naming both. First
285
- * record wins for defect/command (they describe the same fault); blamed tasks
286
- * accumulate in first-seen order.
271
+ * Collapse candidates by file — MANDATORY dedup: two debts naming the same file
272
+ * must yield exactly ONE repair task naming both blamed tasks. Keyed on the
273
+ * NORMALISED path, so `./x.ts` and `x.ts` are one entry. First record wins for
274
+ * defect and command (they describe the same fault); blamed tasks accumulate in
275
+ * first-seen order.
287
276
  */
288
277
  export function mergeRepairCandidates(candidates) {
289
278
  const byFile = new Map();
@@ -339,11 +328,10 @@ export function planHasRepairFor(titles, file) {
339
328
  });
340
329
  }
341
330
  /**
342
- * The extra scope fence a repair entry carries into refine. Without it, refine
343
- * re-expands "repair test/teardown.ts: parameterized table names in TRUNCATE"
344
- * into "overhaul the test infrastructure" the /task-auto drift lesson. The
345
- * fence pins the single editable file and pins the VERIFY to the exact command
346
- * the debt failed on.
331
+ * The extra scope fence a repair entry carries into refine. A repair title names
332
+ * one file and one narrow defect, which refine will otherwise re-expand into
333
+ * "overhaul the test infrastructure". The fence pins the single editable file and
334
+ * pins the VERIFY to the exact command the debt failed on.
347
335
  */
348
336
  export function buildRepairScopeFence(file, verifyCommand) {
349
337
  return [
@@ -13,23 +13,20 @@
13
13
  * 2. the raw-stdin interception that makes the terminal behave like the
14
14
  * browser is ARMED (`cancel-input.ts`: `armCancelListener`/`disarm…`).
15
15
  *
16
- * Before this module the pairbegin, arm, finally disarm, end, report the
17
- * dropped lines — was written out at four sites in two files, and the `finally`
18
- * halves disagreed on order (the orchestrator disarmed first; `/task-auto` ended
19
- * first). The order is not observable — both halves are synchronous, the
16
+ * The teardown order is not observable both halves are synchronous, the
20
17
  * listener only consults `isRunActive()` on a keystroke, and no keystroke can
21
18
  * land between two statements of one tick — so there is ONE order here, not an
22
19
  * option: stop listening, then release the hold and report what it dropped.
23
20
  *
24
- * The two refcounts stay two, deliberately. `runDepth` is read by the remote
25
- * bridge (`isRunActive`) with no ctx in hand and by the listener itself;
26
- * `armed.depth` guards a live stdin subscription that is re-pointed on every
27
- * session replacement (`rearmCancelListener`) and is armed on its own by the
28
- * cancel-latency harness and cancel-points tests. Collapsing them means one
29
- * module's counter driving the other's lifecycle, or a third counter with both
30
- * modules demoted to flags a wider change than the drift it prevents. What
31
- * prevents drift now is that this bracket is the ONLY production caller of
32
- * either pair.
21
+ * The two refcounts stay two, deliberately. `runDepth` (mid-run-input.ts) is read
22
+ * by the remote bridge through `isRunActive` with no ctx in hand, and by the
23
+ * listener itself; `armed.depth` (cancel-input.ts) guards a live stdin
24
+ * subscription that is re-pointed on every session replacement
25
+ * (`rearmCancelListener`, called from orchestrator.ts) and that
26
+ * cancel-input.test.ts arms directly. Collapsing them means one module's counter
27
+ * driving the other's lifecycle, or a third counter with both modules demoted to
28
+ * flags a wider change than the drift it prevents. What prevents drift now is
29
+ * that this bracket is the ONLY production caller of either pair.
33
30
  */
34
31
  import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
35
32
  export interface RunBracketOptions {
@@ -1,22 +1,14 @@
1
1
  /**
2
2
  * run-end — how a single /task run ENDED, named once.
3
3
  *
4
- * `TaskRunner.run` returned `void` and never threw, so `runSingleTask` learned
5
- * what it had just done by RE-READING the task file's front matter, narrowing
6
- * that to `ok: boolean`, and smuggling the rest out of the `withSession` closure
7
- * through three mutable captures. Both commands then re-derived a cause the
8
- * runner already had: `classifyFailure` names the ending exactly, and
9
- * `handleFailure` threw the name away.
4
+ * `TaskRunner.run` returns this, so a caller never has to re-derive the ending by
5
+ * re-reading the task file's front matter and narrowing it to a boolean. Reading
6
+ * the file back cannot tell a user cancel from a fault: `/task-cancel` writes
7
+ * `cancelled`, and anything that only asks "is the state completed?" then treats
8
+ * that stop as a failure and overwrites it.
10
9
  *
11
- * The live consequence was a wrong report. `/task-cancel` during a gated run
12
- * writes `cancelled` to the file; `ok` is `state === 'completed'`, so it is
13
- * false; `!res.ok` calls `markResumable`, which overwrites `cancelled` with
14
- * `failed`, and announces a red *"stopped — fix and run /task-resume"*.
15
- * `/task-auto` hits the same arm for the same input, because its cancel branch
16
- * only consults a module global that `/task-cancel` never sets.
17
- *
18
- * The file is still written — it is what a RESUME reads. What changed is that it
19
- * is no longer the channel this process uses to talk to itself.
10
+ * The file is still written — it is what a RESUME reads. It is just not the
11
+ * channel this process uses to talk to itself.
20
12
  */
21
13
  /** Why a run stopped. Exactly one of these is true of any finished run. */
22
14
  export type RunEnd =
@@ -45,14 +37,12 @@ export type RunEndKind = RunEnd['kind'];
45
37
  /**
46
38
  * What a command does about each ending.
47
39
  *
48
- * `resumable` and `announce` are the two facts the two hand-written ladders
49
- * disagreed about, and the disagreement is where the cancel bug lived: a
50
- * `cancelled` run was falling into the `failed` arm and being marked resumable.
51
- * The WORDING stays per-command — `/task` says "resume with /task-resume" where
52
- * `/task-auto` says "/task-auto-resume" — so only the policy is shared.
40
+ * The POLICY is shared by /task's loop (orchestrator.ts) and /task-auto's
41
+ * (auto-orchestrator.ts). The WORDING stays per-command /task says "resume with
42
+ * /task-resume" where /task-auto says "/task-auto-resume".
53
43
  */
54
44
  export interface RunEndPolicy {
55
- /** Mark the task resumable (overwrites its state with `failed`). */
45
+ /** Mark the task resumable `markResumable` writes `state: failed`. */
56
46
  resumable: boolean;
57
47
  /**
58
48
  * Does this ending FAIL the plan that contains the task?
@@ -73,5 +63,5 @@ export interface RunEndPolicy {
73
63
  * fault.
74
64
  */
75
65
  export declare const RUN_END_POLICY: Record<RunEndKind, RunEndPolicy>;
76
- /** Did the run deliver a spec? The single question the old `ok` boolean answered. */
66
+ /** Did the run deliver a spec? True for `completed` and nothing else. */
77
67
  export declare function runSucceeded(end: RunEnd): boolean;
@@ -1,22 +1,14 @@
1
1
  /**
2
2
  * run-end — how a single /task run ENDED, named once.
3
3
  *
4
- * `TaskRunner.run` returned `void` and never threw, so `runSingleTask` learned
5
- * what it had just done by RE-READING the task file's front matter, narrowing
6
- * that to `ok: boolean`, and smuggling the rest out of the `withSession` closure
7
- * through three mutable captures. Both commands then re-derived a cause the
8
- * runner already had: `classifyFailure` names the ending exactly, and
9
- * `handleFailure` threw the name away.
4
+ * `TaskRunner.run` returns this, so a caller never has to re-derive the ending by
5
+ * re-reading the task file's front matter and narrowing it to a boolean. Reading
6
+ * the file back cannot tell a user cancel from a fault: `/task-cancel` writes
7
+ * `cancelled`, and anything that only asks "is the state completed?" then treats
8
+ * that stop as a failure and overwrites it.
10
9
  *
11
- * The live consequence was a wrong report. `/task-cancel` during a gated run
12
- * writes `cancelled` to the file; `ok` is `state === 'completed'`, so it is
13
- * false; `!res.ok` calls `markResumable`, which overwrites `cancelled` with
14
- * `failed`, and announces a red *"stopped — fix and run /task-resume"*.
15
- * `/task-auto` hits the same arm for the same input, because its cancel branch
16
- * only consults a module global that `/task-cancel` never sets.
17
- *
18
- * The file is still written — it is what a RESUME reads. What changed is that it
19
- * is no longer the channel this process uses to talk to itself.
10
+ * The file is still written — it is what a RESUME reads. It is just not the
11
+ * channel this process uses to talk to itself.
20
12
  */
21
13
  /**
22
14
  * The one table. A run that the USER stopped is not resumable-as-failed: its
@@ -31,7 +23,7 @@ export const RUN_END_POLICY = {
31
23
  failed: { resumable: true, failsRun: true, level: 'error' },
32
24
  'no-session': { resumable: false, failsRun: false, level: 'warning' }
33
25
  };
34
- /** Did the run deliver a spec? The single question the old `ok` boolean answered. */
26
+ /** Did the run deliver a spec? True for `completed` and nothing else. */
35
27
  export function runSucceeded(end) {
36
28
  return end.kind === 'completed';
37
29
  }
@@ -3,14 +3,14 @@
3
3
  *
4
4
  * task-gates.ts gates ONE task against its own spec. This gates the WHOLE REPO once,
5
5
  * when every task in a /task-auto run is checked off and BEFORE the run is declared
6
- * complete: every task passed its own per-slice gates, but per-slice green has shipped
7
- * a dead app twice (mx5 runs 3 & 5 statics clean, every protected route 500ing). So
8
- * the project's OWN whole-repo commands run once here, unaided.
6
+ * complete. Every task passing its own per-slice gate does not prove the assembled
7
+ * whole works, so the project's OWN whole-repo commands run once here, unaided.
9
8
  *
10
9
  * The stage owns four things the per-task gate has no equivalent of:
11
10
  *
12
11
  * 1. THREE verdicts, not two — PASS / FAIL / UNOBSERVED. A gate that observed
13
- * nothing dynamic is never announced as a pass (final-gate.ts unobservedVerdict).
12
+ * nothing dynamic is never announced as a pass (gate-tally.ts
13
+ * `unobservedVerdict`).
14
14
  * 2. The run-end ACCEPT-debt report — every defect a task was allowed to ship with,
15
15
  * surfaced at the last moment anyone will look, and RE-DERIVED against the final
16
16
  * tree after a converged autofix so the last word is about the tree that shipped.
@@ -19,7 +19,7 @@
19
19
  * after MAX_FINAL_GATE_AUTOFIX so a non-converging fix pass cannot loop forever.
20
20
  * 4. The stranded sub-fixes a non-converging fix pass leaves in the working tree —
21
21
  * committed on EVERY terminal outcome, because both of them end the run and the
22
- * next `git checkout` would destroy real repairs (mx5 run 14: 13 of them).
22
+ * next `git checkout` would destroy real repairs.
23
23
  *
24
24
  * Every terminal outcome is RETURNED, never announced here — same contract as
25
25
  * {@link runGatesForTask}'s GateResult: the caller owns the parent task file's state
@@ -54,21 +54,19 @@ export interface FinalGateStageDeps {
54
54
  finalGateFix?: FinalGateFixFn;
55
55
  /**
56
56
  * Paths currently uncommitted in the working tree (`git status` shape), used to
57
- * detect SUB-FIXES a non-converging fix pass left behind (mx5 run 13 PROMPT 4 item
58
- * 3). Every task is committed by the time this stage runs, so anything dirty here
59
- * is the fix pass's own work. Absent → the stranded-fix handling is skipped
57
+ * detect SUB-FIXES a non-converging fix pass left behind (item 4 in the header).
58
+ * Every task is committed by the time this stage runs, so anything dirty here is
59
+ * the fix pass's own work. Absent → the stranded-fix handling is skipped
60
60
  * entirely (prior behavior).
61
61
  */
62
62
  pendingChanges?: (cwd: string) => Promise<string[]>;
63
63
  /**
64
64
  * Re-derive the still-open ACCEPT-debt ledger against the tree AS IT IS NOW
65
- * (final-gate.ts `deriveOpenDebts`). Needed because the run's "N recorded
66
- * verify-FAIL defect(s) are STILL unresolved" report used to be built from the
67
- * FIRST gate result and the converged-autofix path then rebuilt the gate outcome
68
- * as a bare `{ok, reason}` so `openDebts` was not merely un-actioned, it was GONE
69
- * from the value, and no code path could ever clear, re-check or act on it (mx5 run
70
- * 18: four defects reported STILL OPEN at 14:58, one of them fixed by the autofix
71
- * that converged at 15:03, and the report never moved).
65
+ * (`deriveOpenDebts`, defined in accept-debt.ts and re-exported by
66
+ * final-gate.ts). Needed because the run's "N recorded verify-FAIL defect(s) are
67
+ * STILL unresolved" report is built from the FIRST gate result: without this, an
68
+ * autofix that converged after that report would leave the run's last word about
69
+ * a tree that no longer exists.
72
70
  *
73
71
  * `staticOk` is the caller's PROOF about the current statics, never a guess: it is
74
72
  * passed true only where the gate itself just passed them. Absent (tests) → the
@@ -108,8 +106,9 @@ export interface FinalGateStageParams {
108
106
  /** The parent /task-auto id: trail target, notify prefix, commit-message tag. */
109
107
  runId: string;
110
108
  /** The parent plan (the task list), handed to the gate so it can tell a served app
111
- * from a CLI — the boot check requires a listener only for the former (mx5 run 10:
112
- * a CSS watcher satisfied "still alive"). */
109
+ * from a CLI — the boot check requires a listener only for the former. Without
110
+ * that distinction any long-lived process, a file watcher included, satisfies
111
+ * "still alive". */
113
112
  planText: string;
114
113
  /** How many tasks the run completed — for the completion announcement only. */
115
114
  taskCount: number;
@@ -134,9 +133,8 @@ export type FinalGateStageResult = {
134
133
  /**
135
134
  * Run the whole-repo gate and resolve its verdict with the user.
136
135
  *
137
- * Lifted verbatim out of /task-auto's run loop, which it never shared state with:
138
- * the stage reads no per-task variable and writes none. Never throws for a gate
139
- * outcome — only a user cancel inside a gate child propagates (the caller's
140
- * USER_CANCELLED path handles it).
136
+ * Shares no state with /task-auto's run loop: the stage reads no per-task variable
137
+ * and writes none. Never throws for a gate outcome — only a user cancel inside a
138
+ * gate child propagates (the caller's USER_CANCELLED path handles it).
141
139
  */
142
140
  export declare function runFinalGateStage(active: ExtensionCommandContext, deps: FinalGateStageDeps, p: FinalGateStageParams): Promise<FinalGateStageResult>;