@mjasnikovs/pi-task 0.38.29 → 0.38.31

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 (373) 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/index.js +2 -0
  14. package/dist/remote/bridge.d.ts +19 -10
  15. package/dist/remote/bridge.js +3 -2
  16. package/dist/remote/broadcast.js +3 -1
  17. package/dist/remote/events.js +12 -11
  18. package/dist/remote/history.d.ts +1 -1
  19. package/dist/remote/protocol.d.ts +6 -3
  20. package/dist/remote/protocol.js +2 -1
  21. package/dist/remote/push.d.ts +16 -16
  22. package/dist/remote/push.js +27 -27
  23. package/dist/remote/register.d.ts +3 -3
  24. package/dist/remote/register.js +17 -19
  25. package/dist/remote/server.d.ts +9 -8
  26. package/dist/remote/server.js +15 -14
  27. package/dist/remote/session-state.d.ts +5 -4
  28. package/dist/remote/session-state.js +8 -5
  29. package/dist/remote/sw.d.ts +7 -6
  30. package/dist/remote/sw.js +7 -6
  31. package/dist/remote/tailscale.d.ts +4 -2
  32. package/dist/remote/tailscale.js +4 -2
  33. package/dist/remote/ui-highlight.js +6 -5
  34. package/dist/remote/ui-render.js +4 -4
  35. package/dist/remote/ui-script.js +24 -24
  36. package/dist/remote/ui-styles.d.ts +1 -1
  37. package/dist/remote/ui-styles.js +10 -13
  38. package/dist/remote/ui-tools.js +9 -6
  39. package/dist/shared/child-extensions.d.ts +29 -17
  40. package/dist/shared/child-extensions.js +29 -17
  41. package/dist/shared/child-output.d.ts +30 -24
  42. package/dist/shared/child-output.js +25 -17
  43. package/dist/shared/child-process.d.ts +47 -40
  44. package/dist/shared/child-process.js +50 -59
  45. package/dist/shared/command-watchdog.d.ts +85 -16
  46. package/dist/shared/command-watchdog.js +115 -21
  47. package/dist/shared/fs-text.d.ts +16 -10
  48. package/dist/shared/fs-text.js +16 -10
  49. package/dist/shared/git-runner.d.ts +25 -25
  50. package/dist/shared/git-runner.js +25 -25
  51. package/dist/shared/leaked-tool-call.d.ts +17 -11
  52. package/dist/shared/leaked-tool-call.js +23 -15
  53. package/dist/shared/model-endpoint.d.ts +29 -16
  54. package/dist/shared/model-endpoint.js +33 -21
  55. package/dist/shared/pi-invocation.d.ts +7 -4
  56. package/dist/shared/pi-invocation.js +12 -7
  57. package/dist/shared/pkg-version.d.ts +13 -5
  58. package/dist/shared/pkg-version.js +13 -5
  59. package/dist/shared/reasoning-capability.d.ts +35 -24
  60. package/dist/shared/reasoning-capability.js +35 -24
  61. package/dist/shared/stream-watchdog.d.ts +60 -44
  62. package/dist/shared/stream-watchdog.js +62 -45
  63. package/dist/task/accept-debt.d.ts +41 -43
  64. package/dist/task/accept-debt.js +73 -65
  65. package/dist/task/api-synthesis.d.ts +24 -21
  66. package/dist/task/api-synthesis.js +32 -26
  67. package/dist/task/apis-contract.d.ts +32 -64
  68. package/dist/task/apis-contract.js +32 -64
  69. package/dist/task/artifact-closure.d.ts +27 -13
  70. package/dist/task/artifact-closure.js +95 -67
  71. package/dist/task/auto-commit.d.ts +46 -35
  72. package/dist/task/auto-commit.js +51 -38
  73. package/dist/task/auto-io.d.ts +45 -25
  74. package/dist/task/auto-io.js +57 -29
  75. package/dist/task/auto-orchestrator.d.ts +26 -24
  76. package/dist/task/auto-orchestrator.js +192 -165
  77. package/dist/task/auto-prompts.d.ts +36 -24
  78. package/dist/task/auto-prompts.js +40 -26
  79. package/dist/task/autofix-ledger.d.ts +27 -25
  80. package/dist/task/autofix-ledger.js +29 -26
  81. package/dist/task/batch-test-task.d.ts +20 -12
  82. package/dist/task/batch-test-task.js +67 -60
  83. package/dist/task/boot-probe.d.ts +60 -44
  84. package/dist/task/boot-probe.js +91 -72
  85. package/dist/task/cancel-input.d.ts +30 -16
  86. package/dist/task/cancel-input.js +20 -11
  87. package/dist/task/cancel-points.d.ts +27 -20
  88. package/dist/task/cancel-points.js +30 -22
  89. package/dist/task/child-runner.d.ts +124 -55
  90. package/dist/task/child-runner.js +298 -90
  91. package/dist/task/child-status.d.ts +23 -16
  92. package/dist/task/child-status.js +23 -16
  93. package/dist/task/clamp-output.js +12 -5
  94. package/dist/task/command-run.d.ts +31 -28
  95. package/dist/task/command-run.js +44 -35
  96. package/dist/task/command-shrink.d.ts +25 -18
  97. package/dist/task/command-shrink.js +37 -31
  98. package/dist/task/command-watchdog.d.ts +9 -6
  99. package/dist/task/command-watchdog.js +21 -15
  100. package/dist/task/context-attribution.d.ts +34 -26
  101. package/dist/task/context-attribution.js +34 -26
  102. package/dist/task/context-silence.d.ts +39 -29
  103. package/dist/task/context-silence.js +35 -25
  104. package/dist/task/context-usage.d.ts +16 -9
  105. package/dist/task/context-usage.js +16 -9
  106. package/dist/task/contracts.d.ts +8 -4
  107. package/dist/task/contracts.js +25 -17
  108. package/dist/task/coverage-loop.d.ts +22 -18
  109. package/dist/task/coverage-loop.js +35 -30
  110. package/dist/task/critique-probes.d.ts +13 -14
  111. package/dist/task/critique-probes.js +50 -39
  112. package/dist/task/debug-log.d.ts +13 -5
  113. package/dist/task/debug-log.js +32 -20
  114. package/dist/task/decompose-fidelity.d.ts +11 -9
  115. package/dist/task/decompose-fidelity.js +38 -33
  116. package/dist/task/decompose-granularity.d.ts +41 -38
  117. package/dist/task/decompose-granularity.js +41 -38
  118. package/dist/task/deep-render-check.d.ts +22 -14
  119. package/dist/task/deep-render-check.js +40 -31
  120. package/dist/task/dropped-input.d.ts +12 -7
  121. package/dist/task/dropped-input.js +5 -2
  122. package/dist/task/enforce-attribution.d.ts +38 -47
  123. package/dist/task/enforce-attribution.js +46 -52
  124. package/dist/task/enforce-guidelines.d.ts +31 -20
  125. package/dist/task/enforce-guidelines.js +32 -21
  126. package/dist/task/enrichment.d.ts +7 -2
  127. package/dist/task/enrichment.js +26 -14
  128. package/dist/task/env-notes.d.ts +16 -7
  129. package/dist/task/env-notes.js +48 -31
  130. package/dist/task/env-template-closure.d.ts +4 -4
  131. package/dist/task/env-template-closure.js +42 -34
  132. package/dist/task/external-context.d.ts +28 -21
  133. package/dist/task/external-context.js +17 -12
  134. package/dist/task/failure-classifier.d.ts +4 -5
  135. package/dist/task/failure-classifier.js +30 -8
  136. package/dist/task/file-inventory.d.ts +15 -11
  137. package/dist/task/file-inventory.js +25 -22
  138. package/dist/task/final-gate-fix.d.ts +74 -86
  139. package/dist/task/final-gate-fix.js +97 -116
  140. package/dist/task/final-gate-progress.d.ts +29 -46
  141. package/dist/task/final-gate-progress.js +40 -51
  142. package/dist/task/final-gate.d.ts +64 -97
  143. package/dist/task/final-gate.js +192 -199
  144. package/dist/task/fix-child.d.ts +21 -27
  145. package/dist/task/fix-child.js +21 -27
  146. package/dist/task/foreign-path.d.ts +6 -5
  147. package/dist/task/foreign-path.js +0 -0
  148. package/dist/task/frozen-conflict.d.ts +9 -10
  149. package/dist/task/frozen-conflict.js +61 -64
  150. package/dist/task/frozen-path-guard.d.ts +35 -14
  151. package/dist/task/frozen-path-guard.js +56 -39
  152. package/dist/task/gate-child.d.ts +27 -28
  153. package/dist/task/gate-child.js +36 -35
  154. package/dist/task/gate-deps.d.ts +34 -27
  155. package/dist/task/gate-deps.js +169 -159
  156. package/dist/task/gate-tally.d.ts +77 -80
  157. package/dist/task/gate-tally.js +65 -68
  158. package/dist/task/git-state-guard.d.ts +15 -11
  159. package/dist/task/git-state-guard.js +76 -66
  160. package/dist/task/impl-widget.d.ts +25 -16
  161. package/dist/task/impl-widget.js +27 -17
  162. package/dist/task/implementation-guards.d.ts +26 -0
  163. package/dist/task/implementation-guards.js +177 -0
  164. package/dist/task/implementation-thinking.d.ts +33 -31
  165. package/dist/task/implementation-thinking.js +5 -6
  166. package/dist/task/implementation-turn.d.ts +39 -31
  167. package/dist/task/implementation-turn.js +41 -28
  168. package/dist/task/inline-markdown.d.ts +20 -7
  169. package/dist/task/inline-markdown.js +15 -6
  170. package/dist/task/launch-config-gap.js +25 -39
  171. package/dist/task/launch-contract.d.ts +18 -21
  172. package/dist/task/launch-contract.js +28 -30
  173. package/dist/task/launch-manifest.d.ts +6 -2
  174. package/dist/task/launch-manifest.js +35 -34
  175. package/dist/task/ledger.js +16 -14
  176. package/dist/task/lint-fix.d.ts +6 -8
  177. package/dist/task/lint-fix.js +67 -69
  178. package/dist/task/loop-detector.d.ts +27 -8
  179. package/dist/task/loop-detector.js +38 -14
  180. package/dist/task/mid-run-input.d.ts +17 -15
  181. package/dist/task/mid-run-input.js +17 -15
  182. package/dist/task/orchestrator.d.ts +24 -28
  183. package/dist/task/orchestrator.js +89 -66
  184. package/dist/task/orientation.d.ts +18 -23
  185. package/dist/task/orientation.js +24 -31
  186. package/dist/task/owned-freeze-conflict.d.ts +21 -20
  187. package/dist/task/owned-freeze-conflict.js +52 -85
  188. package/dist/task/owned-freeze-reassign.d.ts +40 -60
  189. package/dist/task/owned-freeze-reassign.js +41 -61
  190. package/dist/task/parsers.d.ts +4 -2
  191. package/dist/task/parsers.js +4 -4
  192. package/dist/task/phases.d.ts +41 -48
  193. package/dist/task/phases.js +196 -252
  194. package/dist/task/plan-io.d.ts +6 -7
  195. package/dist/task/plan-io.js +6 -7
  196. package/dist/task/plan-orchestrator.d.ts +10 -8
  197. package/dist/task/plan-orchestrator.js +14 -10
  198. package/dist/task/plan-prompts.d.ts +6 -5
  199. package/dist/task/plan-prompts.js +6 -5
  200. package/dist/task/plan-readonly.d.ts +4 -5
  201. package/dist/task/plan-readonly.js +4 -5
  202. package/dist/task/plan-rounds.d.ts +17 -29
  203. package/dist/task/plan-rounds.js +21 -34
  204. package/dist/task/plan-session.d.ts +58 -72
  205. package/dist/task/plan-session.js +61 -83
  206. package/dist/task/probe-gaming.d.ts +28 -27
  207. package/dist/task/probe-gaming.js +0 -0
  208. package/dist/task/prohibition-probe.d.ts +14 -16
  209. package/dist/task/prompts.d.ts +3 -4
  210. package/dist/task/prompts.js +17 -26
  211. package/dist/task/qa-transcript.d.ts +15 -22
  212. package/dist/task/qa-transcript.js +15 -21
  213. package/dist/task/question-box.d.ts +17 -13
  214. package/dist/task/question-box.js +19 -15
  215. package/dist/task/question-dedup.d.ts +6 -7
  216. package/dist/task/question-dedup.js +13 -14
  217. package/dist/task/question-dialog.d.ts +22 -32
  218. package/dist/task/question-dialog.js +22 -32
  219. package/dist/task/question-source.d.ts +18 -44
  220. package/dist/task/question-source.js +22 -51
  221. package/dist/task/refuted-constraint.d.ts +11 -31
  222. package/dist/task/refuted-constraint.js +27 -51
  223. package/dist/task/regenerable-artifacts.d.ts +12 -31
  224. package/dist/task/regenerable-artifacts.js +12 -31
  225. package/dist/task/render-check.d.ts +11 -22
  226. package/dist/task/render-check.js +33 -46
  227. package/dist/task/repo-health-check.d.ts +10 -14
  228. package/dist/task/repo-health-check.js +17 -23
  229. package/dist/task/requirements.d.ts +38 -71
  230. package/dist/task/requirements.js +78 -126
  231. package/dist/task/research-fanout-budget.d.ts +51 -88
  232. package/dist/task/research-fanout-budget.js +51 -88
  233. package/dist/task/research-worker.d.ts +29 -39
  234. package/dist/task/research-worker.js +37 -61
  235. package/dist/task/resume-gap.d.ts +14 -15
  236. package/dist/task/root-cause-repair.d.ts +9 -9
  237. package/dist/task/root-cause-repair.js +28 -40
  238. package/dist/task/run-bracket.d.ts +10 -13
  239. package/dist/task/run-end.d.ts +12 -22
  240. package/dist/task/run-end.js +8 -16
  241. package/dist/task/run-final-gate.d.ts +19 -21
  242. package/dist/task/run-final-gate.js +62 -80
  243. package/dist/task/runner-globs.d.ts +12 -13
  244. package/dist/task/runner-globs.js +12 -13
  245. package/dist/task/runner-resolve.d.ts +9 -9
  246. package/dist/task/runner-resolve.js +22 -23
  247. package/dist/task/script-escape.d.ts +10 -12
  248. package/dist/task/script-escape.js +13 -14
  249. package/dist/task/serve-entry.d.ts +1 -1
  250. package/dist/task/serve-entry.js +22 -25
  251. package/dist/task/service-blocks.js +4 -2
  252. package/dist/task/shipped-source.d.ts +11 -29
  253. package/dist/task/shipped-source.js +11 -29
  254. package/dist/task/skip-escape.js +10 -14
  255. package/dist/task/spec-urls.d.ts +26 -65
  256. package/dist/task/spec-urls.js +26 -65
  257. package/dist/task/spec-validation.d.ts +17 -20
  258. package/dist/task/spec-validation.js +17 -20
  259. package/dist/task/stall-detector.d.ts +23 -30
  260. package/dist/task/stall-detector.js +23 -30
  261. package/dist/task/stream-watchdog.d.ts +14 -12
  262. package/dist/task/stream-watchdog.js +14 -12
  263. package/dist/task/substitution-probe.d.ts +17 -20
  264. package/dist/task/substitution-probe.js +17 -20
  265. package/dist/task/task-gates.d.ts +36 -41
  266. package/dist/task/task-gates.js +95 -106
  267. package/dist/task/task-io.d.ts +4 -4
  268. package/dist/task/task-io.js +4 -4
  269. package/dist/task/task-parsers.js +4 -3
  270. package/dist/task/task-provenance.d.ts +2 -2
  271. package/dist/task/task-provenance.js +11 -13
  272. package/dist/task/task-types.d.ts +4 -3
  273. package/dist/task/terminal-outcome.d.ts +14 -16
  274. package/dist/task/terminal-outcome.js +12 -14
  275. package/dist/task/test-assembly.d.ts +13 -20
  276. package/dist/task/test-assembly.js +13 -20
  277. package/dist/task/timings.d.ts +5 -3
  278. package/dist/task/timings.js +5 -3
  279. package/dist/task/title-label.d.ts +9 -4
  280. package/dist/task/title-label.js +9 -4
  281. package/dist/task/type-only-answer.d.ts +44 -52
  282. package/dist/task/type-only-answer.js +44 -52
  283. package/dist/task/unfailable-command.d.ts +18 -24
  284. package/dist/task/unfailable-command.js +21 -27
  285. package/dist/task/unknown-routing.d.ts +10 -4
  286. package/dist/task/unknown-routing.js +10 -4
  287. package/dist/task/user-directives.d.ts +5 -8
  288. package/dist/task/user-directives.js +5 -8
  289. package/dist/task/verify-quality.d.ts +18 -22
  290. package/dist/task/verify-quality.js +45 -46
  291. package/dist/task/verify-reconcile.d.ts +15 -10
  292. package/dist/task/verify-reconcile.js +45 -43
  293. package/dist/task/verify-resolution.d.ts +24 -20
  294. package/dist/task/verify-resolution.js +51 -50
  295. package/dist/task/verify-work.d.ts +59 -66
  296. package/dist/task/verify-work.js +101 -138
  297. package/dist/task/widget.d.ts +15 -14
  298. package/dist/task/widget.js +22 -17
  299. package/dist/task/wiring-claims.d.ts +25 -32
  300. package/dist/task/wiring-claims.js +30 -35
  301. package/dist/task/write-guard.d.ts +39 -39
  302. package/dist/task/write-guard.js +48 -51
  303. package/dist/task/yolo.d.ts +34 -30
  304. package/dist/task/yolo.js +42 -37
  305. package/dist/workers/abstention.d.ts +21 -41
  306. package/dist/workers/abstention.js +27 -48
  307. package/dist/workers/brave-search.d.ts +4 -3
  308. package/dist/workers/brave-search.js +5 -2
  309. package/dist/workers/brave-warning.d.ts +7 -4
  310. package/dist/workers/brave-warning.js +19 -7
  311. package/dist/workers/ddg-search.d.ts +6 -6
  312. package/dist/workers/ddg-search.js +18 -12
  313. package/dist/workers/docs-cache.js +5 -2
  314. package/dist/workers/docs-chunk.d.ts +30 -37
  315. package/dist/workers/docs-chunk.js +37 -41
  316. package/dist/workers/docs-core.d.ts +28 -44
  317. package/dist/workers/docs-core.js +25 -44
  318. package/dist/workers/docs-index.js +4 -3
  319. package/dist/workers/docs-lookup.d.ts +15 -22
  320. package/dist/workers/docs-lookup.js +12 -21
  321. package/dist/workers/docs-project.d.ts +15 -9
  322. package/dist/workers/docs-project.js +17 -10
  323. package/dist/workers/docs-resolve.d.ts +19 -20
  324. package/dist/workers/docs-resolve.js +35 -32
  325. package/dist/workers/docs-retrieve.d.ts +5 -6
  326. package/dist/workers/docs-retrieve.js +18 -15
  327. package/dist/workers/exa-search.d.ts +9 -6
  328. package/dist/workers/exa-search.js +23 -12
  329. package/dist/workers/fetch-core.d.ts +13 -16
  330. package/dist/workers/fetch-core.js +23 -23
  331. package/dist/workers/focused-extractor.d.ts +13 -12
  332. package/dist/workers/focused-extractor.js +27 -19
  333. package/dist/workers/html-clean.js +24 -14
  334. package/dist/workers/http-request.d.ts +28 -20
  335. package/dist/workers/http-request.js +22 -17
  336. package/dist/workers/npm-version.d.ts +28 -11
  337. package/dist/workers/npm-version.js +24 -15
  338. package/dist/workers/phantom-imports.d.ts +15 -12
  339. package/dist/workers/phantom-imports.js +30 -24
  340. package/dist/workers/pi-worker-core.d.ts +65 -96
  341. package/dist/workers/pi-worker-core.js +93 -181
  342. package/dist/workers/pi-worker-docs.d.ts +24 -19
  343. package/dist/workers/pi-worker-docs.js +67 -76
  344. package/dist/workers/pi-worker-fetch.d.ts +7 -3
  345. package/dist/workers/pi-worker-fetch.js +27 -19
  346. package/dist/workers/pi-worker-search.js +12 -8
  347. package/dist/workers/pi-worker.d.ts +9 -4
  348. package/dist/workers/pi-worker.js +21 -14
  349. package/dist/workers/reasoning-warning.d.ts +18 -17
  350. package/dist/workers/reasoning-warning.js +22 -20
  351. package/dist/workers/research-cache.js +50 -78
  352. package/dist/workers/search-core.js +7 -5
  353. package/dist/workers/search-types.d.ts +10 -9
  354. package/dist/workers/search-types.js +9 -8
  355. package/dist/workers/session-hint.d.ts +13 -14
  356. package/dist/workers/session-hint.js +8 -9
  357. package/dist/workers/shared.d.ts +21 -25
  358. package/dist/workers/shared.js +0 -0
  359. package/dist/workers/single-read-extension.d.ts +14 -7
  360. package/dist/workers/single-read-extension.js +14 -7
  361. package/dist/workers/single-read-guard.d.ts +27 -30
  362. package/dist/workers/single-read-guard.js +36 -36
  363. package/dist/workers/typeonly-log.d.ts +12 -9
  364. package/dist/workers/typeonly-log.js +29 -33
  365. package/dist/workers/worker-channels.d.ts +15 -23
  366. package/dist/workers/worker-channels.js +15 -23
  367. package/dist/workers/worker-failure.d.ts +38 -46
  368. package/dist/workers/worker-failure.js +31 -39
  369. package/dist/workers/worker-kill.d.ts +25 -26
  370. package/dist/workers/worker-kill.js +16 -19
  371. package/dist/workers/worker-profiles.d.ts +54 -56
  372. package/dist/workers/worker-profiles.js +63 -39
  373. package/package.json +10 -8
@@ -2,25 +2,30 @@
2
2
  * Model-stream watchdog — the inactivity machine for a stream that goes SILENT
3
3
  * without erroring.
4
4
  *
5
- * WHY (mx5 run 14): three main-session implementation turns died mid-turn the
6
- * session jsonl's last event is an ordinary assistant message, then nothing,
7
- * forever, while the model server stayed Up(healthy) the whole time. A hung or
8
- * silently-dropped stream throws NOTHING, so:
9
- * - the connection-error retry (child-runner.ts) never fires: it needs a
10
- * thrown/reported ModelError,
11
- * - the command watchdog never fires: it only covers TOOL executions,
12
- * - the child stall guard never fires: it treats a reachable endpoint as proof
13
- * of life, which it is the endpoint was fine, the stream was not.
14
- * Cost in run 14: ~2.9h of dead air awaiting manual restarts.
5
+ * WHY: a turn can die mid-stream the last thing recorded is an ordinary
6
+ * assistant message, then nothing, while the model server stays healthy. A hung
7
+ * or silently-dropped stream throws NOTHING, so none of the three guards that
8
+ * already exist can see it:
9
+ * - the connection-error retry never fires. child-runner reaches it only
10
+ * inside `if (r.modelError)`, and a silent hang reports no error at all.
11
+ * - the command watchdog never fires: it arms per tool call and covers only
12
+ * TOOL executions.
13
+ * - the child stall guard never fires: it kills only when a probe finds the
14
+ * endpoint UNREACHABLE, and here the endpoint answers fine. The stream is
15
+ * what died, not the server.
15
16
  *
16
- * WHAT THIS MEASURES: time since the LAST stream event of ANY kind text token,
17
- * tool-call delta, thinking delta, provider response header. NOT wall-clock, and
18
- * NOT "time to first token". One token every 30s is a working local model and
19
- * must never be killed; zero events for the whole window is a hang.
17
+ * WHAT THIS MEASURES: time since the last sign of life, NOT wall-clock and NOT
18
+ * time-to-first-token. What counts as a sign differs by surface — for the main
19
+ * session it is any of six pi events (`before_provider_request`,
20
+ * `after_provider_response`, `turn_start`, `message_start`, `message_update`,
21
+ * `message_end`), with every text, thinking and tool-call delta arriving as
22
+ * `message_update`; for a child it is any stdout or stderr CHUNK. A slow model
23
+ * that emits something occasionally is working and must never be killed. Zero
24
+ * for the whole window is a hang.
20
25
  *
21
- * WHY THE DEFAULT IS GENEROUS: on a local llama-server a 32k-context prompt can
22
- * spend many minutes in prompt processing emitting nothing at all. A 60-120s
23
- * ceiling would kill every long prompt on local hardware. See
26
+ * WHY THE DEFAULT IS GENEROUS: prompt processing legitimately emits nothing
27
+ * while it runs, so a tight ceiling would kill honest long prompts. This guard
28
+ * exists to bound dead air, not to police slowness. See
24
29
  * DEFAULT_STREAM_INACTIVITY_MS.
25
30
  *
26
31
  * TWO SURFACES, one machine (same split as command-watchdog.ts):
@@ -36,20 +41,25 @@
36
41
  * blind re-send of a half-executed turn).
37
42
  */
38
43
  /**
39
- * Default inactivity ceiling: 10 minutes. Chosen from the constraint that a local
40
- * model's first token can legitimately be many minutes away the guard exists to
41
- * turn hours of dead air into minutes, not to police slowness.
44
+ * Default inactivity ceiling. Sized by the constraint that a local model's first
45
+ * token can legitimately be a long way off, so the number has to clear honest
46
+ * prompt processing rather than sit close to it.
42
47
  */
43
48
  export const DEFAULT_STREAM_INACTIVITY_MS = 10 * 60_000;
44
- /** Whole minutes, floored at 1, for the human-facing window in every message. */
49
+ /** Whole minutes for the human-facing window in every message: rounded to
50
+ * nearest, then floored at 1 so a sub-minute window never reads "0 minutes". */
45
51
  function minutes(ms) {
46
52
  const mins = Math.max(1, Math.round(ms / 60_000));
47
53
  return `${mins} minute${mins === 1 ? '' : 's'}`;
48
54
  }
49
55
  /**
50
- * How often the machine checks the idle clock. A poll (rather than re-arming a
51
- * timeout on every token) keeps cost O(1) per window instead of O(1) per token —
52
- * a streaming turn emits thousands of events. Same idiom as the child stall guard.
56
+ * How often the machine checks the idle clock. A poll, rather than re-arming a
57
+ * timeout on every token, keeps the cost per window constant instead of per
58
+ * event and "thousands of events" is not a figure of speech: one captured turn
59
+ * emitted over two thousand, nearly all of them `message_update`.
60
+ *
61
+ * A quarter of the window, clamped: never tighter than 50ms, never looser than
62
+ * 30s. The child stall guard polls with the same shape and its own divisor.
53
63
  */
54
64
  export function pollIntervalMs(timeoutMs) {
55
65
  return Math.max(50, Math.min(Math.floor(timeoutMs / 4), 30_000));
@@ -64,12 +74,14 @@ export class StreamWatchdog {
64
74
  * legitimately idle, and that window belongs to the command watchdog, not to
65
75
  * this one — without it a 10-minute build looks identical to a hung stream.
66
76
  *
67
- * A SET, not a boolean: pi runs a tool batch in parallel (agent-loop.js
68
- * `executeToolCallsParallel` emits every tool_execution_start up front, then one
69
- * end per call as each settles, and answers an immediate call inline while an
70
- * earlier one is still running). A boolean would be cleared by the FIRST end and
71
- * leave the still-running sibling the long build exposed to a false fire.
72
- * Same per-toolCallId idiom the command watchdog uses.
77
+ * A SET, not a boolean, and pi's own loop is why. `executeToolCallsParallel`
78
+ * in agent-loop.js emits EVERY `tool_execution_start` up front, before any
79
+ * call is prepared; a call that prepares "immediate" gets its end emitted
80
+ * inline right there, while the rest are deferred as closures and settle
81
+ * through a `Promise.all`. So an end can arrive while earlier siblings are
82
+ * still running. A boolean would be cleared by that first end and leave the
83
+ * long build exposed to a false fire. Same per-toolCallId idiom the command
84
+ * watchdog uses.
73
85
  */
74
86
  active = new Set();
75
87
  /** Nesting depth for callers that cannot supply an id, counted so an unkeyed
@@ -152,18 +164,20 @@ export class StreamWatchdog {
152
164
  * cancels it on stop/fire, and runChild's cleanup() stops the watchdog on every
153
165
  * settle path (close, error, abort), so it cannot outlive the child it watches.
154
166
  *
155
- * The poll is REF'd, deliberately. It used to be unref'd, on the reasoning that a
156
- * pending watchdog poll should never keep the process alive at exit — but under
157
- * Bun on WINDOWS an unref'd timer does not fire at all once nothing ref'd is
158
- * pending. Measured on a windows-latest runner (bun 1.3.14): an unref'd interval
159
- * with nothing else pending never fired in 20s, while the identical ref'd one
160
- * fired at 101ms; on linux both fire at 100ms.
167
+ * The poll is REF'd, deliberately. Unref'd reads better a pending watchdog poll
168
+ * should never keep the process alive at exit — but an unref'd timer is only
169
+ * guaranteed to fire while something ref'd is still pending, and that guarantee
170
+ * is not the platform-independent thing it looks like.
171
+ *
172
+ * Measured here, on both runtimes: with nothing else pending an unref'd timer
173
+ * never fires at all, the process just exits; with a spawned child holding its
174
+ * stdout and stderr pipes open it fires on schedule throughout. A silent child
175
+ * is the SECOND case — its pipes are still ref'd work — so on this platform the
176
+ * unref would not have broken the child guard. The reason to keep it ref'd is
177
+ * that this machine also runs in the main session, where no such handle is
178
+ * guaranteed, and the failure mode is silent: a watchdog that never fires looks
179
+ * exactly like a stream that never hung.
161
180
  *
162
- * That state — no ref'd work outstanding — is EXACTLY the state this watchdog
163
- * exists to police: a child whose model stream has gone silent. So the unref
164
- * disabled the guard precisely when it was needed, and every stream-stall
165
- * integration test hung forever on windows (CI runs 30476786365, 30477802633,
166
- * 30478455402 — it hangs at v0.24.1 too, so this predates that release).
167
181
  * A poll that can delay exit by one interval is the cheaper failure.
168
182
  */
169
183
  export const realStreamTimerDeps = {
@@ -173,10 +187,13 @@ export const realStreamTimerDeps = {
173
187
  };
174
188
  /**
175
189
  * The cause string a CHILD's stream stall is reported as. Phrased so
176
- * {@link isConnectionError} (child-runner.ts) matches it — the whole point is to
177
- * route a silent hang into the retry path that already exists for a LOUD
178
- * connection failure, rather than inventing a second one. Honest about who
179
- * killed it: pi-task aborted the request, the provider did not report anything.
190
+ * {@link isConnectionError} (child-runner.ts) matches it — checked by running the
191
+ * round-trip, and it does. The whole point is to route a silent hang into the
192
+ * retry path that already exists for a LOUD connection failure rather than
193
+ * inventing a second one, so the phrase "connection lost" is load-bearing, not
194
+ * decoration: reword it past that predicate and stream stalls stop retrying.
195
+ * Honest about who killed it, too — pi-task aborted the request, the provider
196
+ * reported nothing.
180
197
  */
181
198
  export function streamStallCause(idleMs) {
182
199
  return (`model stream inactivity: no stream events for ${minutes(idleMs)} — `
@@ -3,19 +3,17 @@ import { type CommandRunner } from './command-run.js';
3
3
  * Provenance of a recorded defect:
4
4
  * - 'accepted' — the user chose ACCEPT despite a verify-FAIL (the original class).
5
5
  * - 'enforce-revert' — an enforce-pass re-verify FAILED and the enforce edits were
6
- * reverted; the FAIL indicted the ORIGINAL work (mx5 run 10 TASK_0004: "Missing
7
- * server entry point … the Hono server cannot be started"), so the terminal defect
6
+ * reverted, but the FAIL indicted the ORIGINAL work, so the terminal defect
8
7
  * was FOUND and then erased by the very mechanism that found it. Persisted here so
9
8
  * the final gate re-checks and surfaces it instead of letting it die with the revert.
10
9
  * - 'enforce-kept' — the same enforce re-verify FAIL, but the failing check named
11
10
  * only files the ENFORCE COMMIT does not touch, so reverting that commit could not
12
- * possibly repair it (mx5 run 18 TASK_0024: a one-line paren removal in `Admin.tsx`
13
- * was reverted over a `MyListings.spec.tsx` CT failure it cannot reach, and the
14
- * final gate re-made the identical change 5 minutes later). The edits are KEPT and
11
+ * possibly repair it reverting a change in one file over a failure in a file
12
+ * it cannot reach only loses the change. The edits are KEPT and
15
13
  * the defect is recorded here — keeping the work must never mean losing the finding.
16
14
  * - 'frozen-blocked' — a repo-health verify-FAIL whose only fix is an edit to a path
17
- * THIS task's spec froze (mx5 run 12: `bun run lint` permanently red because the
18
- * created files need a tsconfig registration every spec forbids). Cross-task
15
+ * THIS task's spec froze a lint left permanently red because the files it
16
+ * created need a registration every spec forbids editing. Cross-task
19
17
  * contradiction: no unattended re-run can converge, so the gate loop records the
20
18
  * defect and routes to the human picker instead of burning AUTOFIX rounds.
21
19
  * - 'yolo-accepted' — YOLO MODE (unattended auto-pick, see yolo.ts) took the
@@ -24,16 +22,16 @@ import { type CommandRunner } from './command-run.js';
24
22
  * weighed this failing artifact and blessed it, which is exactly the assurance
25
23
  * an auto-pick cannot give. Same re-check treatment, honest provenance.
26
24
  * - 'cross-task-deletion' — the task's work DELETED a sibling task's committed
27
- * deliverable (mx5 run 12 PROMPT 2: a fix child deleted TASK_0020's playwright ct
28
- * files to green a lint) and the user ACCEPTed the verify-FAIL anyway, so the
25
+ * deliverable a fix child deleting a sibling's test files to green a lint —
26
+ * and the user ACCEPTed the verify-FAIL anyway, so the
29
27
  * deletion ships in the next commit. Recorded so the final gate re-checks it:
30
28
  * resolved iff the named file is back in the tree (a later task restored it),
31
29
  * otherwise surfaced.
32
30
  * - 'final-gate' — the final integration gate DEMOTED one of its own checks to
33
- * UNOBSERVED (mx5 run 14): two fix attempts that both changed the tree and
31
+ * UNOBSERVED: two fix attempts that both changed the tree and
34
32
  * re-ran the gate produced a byte-identical ranked-first failure, so the check
35
- * is unfalsifiable in this environment (run 14: the boot probe needed `ss` or
36
- * `lsof` and the sandbox had neither) and no further attempt can move it. The
33
+ * is unfalsifiable in this environment the boot probe needing a tool the
34
+ * sandbox does not have, say and no further attempt can move it. The
37
35
  * run is allowed to converge on the REMAINING checks, carrying this one here
38
36
  * so the next run's gate re-checks and re-surfaces it rather than losing it.
39
37
  * Also recorded for the ZERO-OBSERVATION verdict (final-gate.ts
@@ -42,13 +40,13 @@ import { type CommandRunner } from './command-run.js';
42
40
  * completed on statics alone. Same treatment for the same reason: unprovable
43
41
  * here, so carry it forward rather than let a silent PASS bury it.
44
42
  * - 'root-cause' — the task's verify FAILed because of a PRE-EXISTING defect in a
45
- * file a DIFFERENT task created, which this task's own work never touched (mx5
46
- * run 14: TASK_0007's `test/teardown.ts` TRUNCATE bug FAILed TASK_0013 and
47
- * TASK_0019). The current task is not at fault, so its work — and, at the
43
+ * file a DIFFERENT task created, which this task's own work never touched. One
44
+ * such defect can FAIL several later tasks in a row. The current task is not
45
+ * at fault, so its work — and, at the
48
46
  * enforce site, the enforce pass's edits — are KEPT rather than reverted; the
49
47
  * defect is recorded here and a scoped repair task is queued into the plan
50
- * (root-cause-repair.ts). Before this class existed the ledger recorded the same
51
- * root cause twice and nothing ever scheduled a fix, so it survived ~24h.
48
+ * (root-cause-repair.ts). Recording without queuing would let the same root
49
+ * cause be re-recorded by each task it fails, with nothing ever fixing it.
52
50
  */
53
51
  export type DebtOrigin = 'accepted' | 'enforce-revert' | 'enforce-kept' | 'frozen-blocked' | 'cross-task-deletion' | 'yolo-accepted' | 'final-gate' | 'root-cause';
54
52
  /** One recorded defect: the task, why its VERIFY failed, and how it was recorded. */
@@ -61,16 +59,15 @@ export interface AcceptDebt {
61
59
  * Set (never serialized) when the recorded reason CONFLICTS with the run itself:
62
60
  * it asserts a file's existence is the failure, but that file is another task's
63
61
  * committed deliverable (see annotateDebtConflicts). A conflicting debt is a
64
- * PLAN defect to surface, never an instruction to act on mx5 run 11's autofix
65
- * child `rm`'d TASK_0008's verified admin page to satisfy exactly such a claim.
62
+ * PLAN defect to surface, never an instruction to act on. An autofix child
63
+ * seeded with such a claim will delete the file to satisfy it.
66
64
  */
67
65
  conflict?: string;
68
66
  /**
69
67
  * The ONE command this debt's own reason NAMES, quoted verbatim in backticks and
70
- * present byte-identically in the owning task's VERIFY block (nexttask 5, mx5 run
71
- * 19 TASK_0009). Set at record time by classifyVerifyCommand; absent whenever the
72
- * reason names no such command — which is most of them (measured: 2 of 19
73
- * PROJECT-pool debts, `scripts/debt-verify-class-baserate.ts`).
68
+ * present byte-identically in the owning task's VERIFY block. Set at record
69
+ * time by classifyVerifyCommand, and absent whenever the reason names no such
70
+ * command — which is the common case, since most FAIL reasons are prose.
74
71
  *
75
72
  * It exists so the run-end re-check can settle the debt the way the debt was
76
73
  * created: by RUNNING the command and reading its exit status. Never
@@ -105,17 +102,16 @@ export declare function readAcceptDebts(cwd: string): Promise<AcceptDebt[]>;
105
102
  * Best-effort by construction (appendDebt swallows its own faults): the ledger is an
106
103
  * auditing aid and must never break the gate sequence that calls it.
107
104
  *
108
- * `origin` is REQUIRED and deliberately has no default. It used to default to
109
- * 'accepted' (the legacy 2-field on-disk shape), and that default silently absorbed
110
- * a dropped argument: the eight-recorder collapse migrated one call in
111
- * scripts/ignored-writes-ab.ts without its origin, so a run-level 'final-gate'
112
- * demotion was stamped as a human 'accepted'. The wrappers each carried their class
113
- * in the NAME, so no migration of them could lose it; a defaulted parameter can.
114
- * Making it explicit turns that whole class of slip into a compile error.
105
+ * `origin` is REQUIRED and deliberately has no default. A default of 'accepted'
106
+ * would be the tempting one, since that is the legacy 2-field on-disk shape and
107
+ * that is exactly what makes it dangerous. A dropped argument would then be
108
+ * absorbed in silence, stamping a run-level 'final-gate' demotion as a human
109
+ * 'accepted': the one confusion this type exists to prevent. Requiring it turns
110
+ * that slip into a compile error instead.
115
111
  */
116
112
  export declare function recordDebt(cwd: string, taskId: string, reason: string, origin: DebtOrigin): Promise<void>;
117
113
  /**
118
- * The reason text a CROSS-TASK DELETION debt stores (mx5 run 12 PROMPT 2): the task's
114
+ * The reason text a CROSS-TASK DELETION debt stores: the task's
119
115
  * work deleted a file a DIFFERENT task's commit introduced, verify FAILed, and the
120
116
  * user ACCEPTed — so the deletion survives into the next commit. The shape is fixed
121
117
  * and machine-parseable so the final gate's re-check can extract the path and prove
@@ -151,9 +147,9 @@ export declare function isStaticClassDebt(reason: string): boolean;
151
147
  * VERIFY fence, or a reason that quotes nothing all yield null, and null simply
152
148
  * means the debt keeps today's behaviour (surfaced, never auto-closed).
153
149
  *
154
- * The STRICT parse matters here. mx5 run 19's `TASK_0001.md` opens ```sh and never
155
- * closes it, so the lenient parser hands back the phase-timings table and every
156
- * appended gate-trail line as "VERIFY commands" — including sentences that quote
150
+ * The STRICT parse matters here. A spec that opens ```sh and never closes it
151
+ * makes the lenient parser hand back the phase-timings table and every appended
152
+ * gate-trail line as "VERIFY commands" — including sentences that quote
157
153
  * `bun run lint`. Matching a reason against that would mint a stored, re-runnable
158
154
  * command with fabricated provenance, which is the one thing this class may not do.
159
155
  */
@@ -176,7 +172,7 @@ export interface VerifyRerunResult {
176
172
  * task or a human restored it, so the deletion no longer holds); every other debt
177
173
  * stays OPEN (unprovable ⇒ surface, never re-hide) — unless it carries a stored
178
174
  * `verifyCommand` and `rerunVerify` re-runs that command to a ZERO exit, which is the
179
- * third class (nexttask 5): the debt named a command, the command was run, and it
175
+ * third class: the debt named a command, the command was run, and it
180
176
  * passed. FP-safe: the only auto-closes are ones a deterministic check can stand
181
177
  * behind, and here the check is the task spec's own command.
182
178
  */
@@ -184,7 +180,7 @@ export declare function recheckAcceptDebts(debts: AcceptDebt[], opts: {
184
180
  staticOk: boolean;
185
181
  fileExists?: (rel: string) => boolean;
186
182
  /**
187
- * Re-run a debt's stored VERIFY command (nexttask 5). Absent ⇒ the class is
183
+ * Re-run a debt's stored VERIFY command. Absent ⇒ the class is
188
184
  * inert and every debt behaves exactly as it did before it existed. Only
189
185
  * `pass` may close a debt; `fail` and `gap` both leave it open, and the
190
186
  * caller is expected to have made `pass` mean "ran, exited 0, and changed
@@ -201,7 +197,7 @@ export declare function recheckAcceptDebts(debts: AcceptDebt[], opts: {
201
197
  * token immediately followed by "exists" / "still exists", or by "must/should not
202
198
  * exist". Only this narrow shape qualifies: a reason that merely MENTIONS a path
203
199
  * (a prohibition violation, a broken import) is an ordinary defect claim, not an
204
- * existence assertion, and must never be flagged (run 11's T1/T7 debts name paths
200
+ * existence assertion, and must never be flagged (such debts name paths
205
201
  * this way and are genuine).
206
202
  */
207
203
  export declare function extractExistenceClaims(reason: string): string[];
@@ -228,7 +224,7 @@ export declare function buildAcceptDebtNote(open: AcceptDebt[]): string;
228
224
  */
229
225
  export declare function describeDebt(d: AcceptDebt): string;
230
226
  /**
231
- * ACCEPT-debt re-check (mx5 run 4 B3 / run 8 TASK_0012): read the ledger of tasks
227
+ * ACCEPT-debt re-check: read the ledger of tasks
232
228
  * the user accepted despite a verify-FAIL and re-check each against the CURRENT
233
229
  * tree. A static-class debt whose statics now pass is provably RESOLVED (a later
234
230
  * task fixed it) and pruned from the ledger; every other debt cannot be proven
@@ -237,9 +233,9 @@ export declare function describeDebt(d: AcceptDebt): string;
237
233
  * accept-debt.ts). Best-effort: a ledger read/write failure must never break the
238
234
  * caller.
239
235
  *
240
- * FACTORED OUT of runFinalIntegrationGate (nexttask 6): the derivation has to be
236
+ * FACTORED OUT of runFinalIntegrationGate: the derivation has to be
241
237
  * runnable at a SECOND moment — after a converged final-gate autofix, where the
242
- * orchestrator used to rebuild its gate outcome as a bare `{ok, reason}` and drop
238
+ * orchestrator rebuilds its gate outcome as a bare `{ok, reason}` and drops
243
239
  * `openDebts` entirely. The report a run ends on has to be derived from the tree
244
240
  * the run ends with, not from the tree as it was before the fix pass.
245
241
  *
@@ -263,9 +259,11 @@ run?: CommandRunner, signal?: AbortSignal): Promise<{
263
259
  * a passing tree and have that count as the debt being fixed — the run would then be
264
260
  * certifying its own side effect. So tracked state is captured before and after, and
265
261
  * a pass that came with a tracked change is downgraded to INCONCLUSIVE with the
266
- * change named. Untracked output is left alone: it is what a build legitimately
267
- * produces, and `git status --porcelain` in a repo with the usual ignores does not
268
- * see it.
262
+ * change named. Untracked output is left alone because the guard asks git not to
263
+ * report it: `--untracked-files=no` is doing that work, NOT the project's ignore
264
+ * rules. Checked both ways — with and without a matching `.gitignore`, the flag
265
+ * returns an empty status for a fresh untracked build directory, while plain
266
+ * `--porcelain` reports it when it is not ignored.
269
267
  *
270
268
  * A repository the guard cannot read (no git, git absent) is not a licence to skip
271
269
  * the guard: the re-run is INCONCLUSIVE there, because "nothing changed" would be an