@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
@@ -5,28 +5,24 @@
5
5
  * Five children run under the gates: `verify`, `recommend`, `lint-fix`,
6
6
  * `final-fix` and `enforce`. All five share one ritual — reset the widget state,
7
7
  * stamp the start, open a per-gate debug log, write a start marker, raise a
8
- * status loader, call `runWorker` unguarded (no wall clock, exact-match loop
9
- * guard only), warn on a surviving loop, classify the failure, write an end
10
- * marker, throw on failure, and stop the loader in a `finally`. That was ~85
11
- * lines, and it was written TWICE: once as `makeGateChild` and once as an inline
12
- * closure for `enforce`, whose comments repeated the originals verbatim.
8
+ * status loader, call `runWorker` on the `gate` profile (no wall clock; the
9
+ * path-revisit loop rule disabled, leaving the exact-match rule), warn on a
10
+ * surviving loop, classify the failure, write an end marker, throw on failure,
11
+ * and stop the loader `ChildStatus.track` does that last one in a `finally`,
12
+ * so a throwing child never leaves the widget up.
13
13
  *
14
- * The enforce copy differed in exactly four things no git-state guard, no
15
- * tool-result logging, no tree-change capture, and a different end marker which
16
- * is why they are row data here rather than a forked body. Apply the deletion
17
- * test to that copy and it passes: routing enforce through this concentrates the
18
- * differences into a table instead of moving them.
14
+ * Only THREE of the differences between the kinds are row data below: the
15
+ * git-state guard, tool-result logging, and the end marker (plus the loader's
16
+ * step label). Tree-change capture is deliberately NOT a row it is decided at
17
+ * the bottom of this file by a test on the child's TOOLS, so a future
18
+ * write-capable kind gets it without anyone remembering to set a flag.
19
19
  *
20
- * The second reason for the module is that all of it used to live inside
21
- * `buildGateDeps`'s closure, so nothing about it was reachable from a test:
22
- * `buildGateDeps` is ~700 lines and is never called by the suite. The
23
- * git-state-guard wiring in particular snapshot, restore-in-`finally`,
24
- * `verdictTainted` is the mechanism that discards a verify verdict computed on
25
- * a tree the child mutated (mx5 run 6, where the verify child `git stash`ed the
26
- * task's uncommitted work and never popped it), and it could only be checked
27
- * indirectly through a fake `mutationCheck` one layer up. Here `runWorker` and
28
- * the git helpers are injected, so the ordering, the trail lines and the
29
- * throwing-child path are all directly assertable.
20
+ * The module exists so this is reachable from a test at all. It would otherwise
21
+ * live inside `buildGateDeps`'s closure, and the git-state-guard wiring in
22
+ * particular snapshot, restore-in-`finally`, `verdictTainted` is what
23
+ * discards a verify verdict computed on a tree the child itself mutated. Here
24
+ * `runWorker` and the git helpers are injected, so the ordering, the trail lines
25
+ * and the throwing-child path are directly assertable.
30
26
  */
31
27
  import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
32
28
  import type { RunWorkerInput, RunWorkerResult } from '../workers/pi-worker-core.js';
@@ -36,16 +32,17 @@ import type { ChildStatus } from './child-status.js';
36
32
  export type GateChildKind = 'verify' | 'recommend' | 'lint-fix' | 'final-fix' | 'enforce';
37
33
  export interface GateChildRow {
38
34
  /**
39
- * Snapshot the tree before and restore after. These children are read-only BY
40
- * CONTRACT, but the contract is prompt-level and the live model breaks it.
41
- * `lint-fix` and `final-fix` are excluded because editing is their job (they
42
- * carry their own revert guards), and `enforce` because it edits too.
35
+ * Snapshot the tree before and restore after. `verify` and `recommend` are
36
+ * read-only BY CONTRACT, but that contract is only prompt-level nothing
37
+ * stops the child mutating the tree, so the restore is what makes it hold.
38
+ * `lint-fix` and `final-fix` are excluded because editing is their job and
39
+ * they carry their own revert guards; `enforce` because it edits too.
43
40
  */
44
41
  guarded: boolean;
45
42
  /**
46
- * Log tool OUTPUTS, not just the calls (mx5 run 10 item 6): without the result,
47
- * "verify claimed curl PASS on a server that cannot serve" is undecidable from
48
- * the log. Off for `enforce`, whose log is a per-pass verdict trail.
43
+ * Log tool OUTPUTS, not just the calls. Without the result, a claim like
44
+ * "verify ran curl and it passed" cannot be checked against what the command
45
+ * actually printed. Off for `enforce`, whose log is a per-pass verdict trail.
49
46
  */
50
47
  logToolResults: boolean;
51
48
  /** The loader's step label. */
@@ -71,7 +68,9 @@ export interface GateChildDeps {
71
68
  * verify gate does). Two loaders on one widget key only fight each other.
72
69
  */
73
70
  loader?: boolean;
74
- /** Per-command ceiling; pi's bash tool has no default timeout. */
71
+ /** Per-command ceiling. pi's bash tool has none of its own: its schema
72
+ * describes `timeout` as "optional, no default timeout", and
73
+ * `resolveTimeoutMs(undefined)` returns undefined. */
75
74
  commandTimeoutMs: number;
76
75
  /** Hung-stream bound; the probe-based stall guard cannot supply it. */
77
76
  streamInactivityMs: number;
@@ -5,28 +5,24 @@
5
5
  * Five children run under the gates: `verify`, `recommend`, `lint-fix`,
6
6
  * `final-fix` and `enforce`. All five share one ritual — reset the widget state,
7
7
  * stamp the start, open a per-gate debug log, write a start marker, raise a
8
- * status loader, call `runWorker` unguarded (no wall clock, exact-match loop
9
- * guard only), warn on a surviving loop, classify the failure, write an end
10
- * marker, throw on failure, and stop the loader in a `finally`. That was ~85
11
- * lines, and it was written TWICE: once as `makeGateChild` and once as an inline
12
- * closure for `enforce`, whose comments repeated the originals verbatim.
8
+ * status loader, call `runWorker` on the `gate` profile (no wall clock; the
9
+ * path-revisit loop rule disabled, leaving the exact-match rule), warn on a
10
+ * surviving loop, classify the failure, write an end marker, throw on failure,
11
+ * and stop the loader `ChildStatus.track` does that last one in a `finally`,
12
+ * so a throwing child never leaves the widget up.
13
13
  *
14
- * The enforce copy differed in exactly four things no git-state guard, no
15
- * tool-result logging, no tree-change capture, and a different end marker which
16
- * is why they are row data here rather than a forked body. Apply the deletion
17
- * test to that copy and it passes: routing enforce through this concentrates the
18
- * differences into a table instead of moving them.
14
+ * Only THREE of the differences between the kinds are row data below: the
15
+ * git-state guard, tool-result logging, and the end marker (plus the loader's
16
+ * step label). Tree-change capture is deliberately NOT a row it is decided at
17
+ * the bottom of this file by a test on the child's TOOLS, so a future
18
+ * write-capable kind gets it without anyone remembering to set a flag.
19
19
  *
20
- * The second reason for the module is that all of it used to live inside
21
- * `buildGateDeps`'s closure, so nothing about it was reachable from a test:
22
- * `buildGateDeps` is ~700 lines and is never called by the suite. The
23
- * git-state-guard wiring in particular snapshot, restore-in-`finally`,
24
- * `verdictTainted` is the mechanism that discards a verify verdict computed on
25
- * a tree the child mutated (mx5 run 6, where the verify child `git stash`ed the
26
- * task's uncommitted work and never popped it), and it could only be checked
27
- * indirectly through a fake `mutationCheck` one layer up. Here `runWorker` and
28
- * the git helpers are injected, so the ordering, the trail lines and the
29
- * throwing-child path are all directly assertable.
20
+ * The module exists so this is reachable from a test at all. It would otherwise
21
+ * live inside `buildGateDeps`'s closure, and the git-state-guard wiring in
22
+ * particular snapshot, restore-in-`finally`, `verdictTainted` is what
23
+ * discards a verify verdict computed on a tree the child itself mutated. Here
24
+ * `runWorker` and the git helpers are injected, so the ordering, the trail lines
25
+ * and the throwing-child path are directly assertable.
30
26
  */
31
27
  import { formatLoopHint } from './child-runner.js';
32
28
  import { classifyEnforceChildFailure } from './enforce-guidelines.js';
@@ -64,9 +60,11 @@ export function makeGateChild(deps) {
64
60
  deps.status.reset();
65
61
  const startedAt = Date.now();
66
62
  // Every marker below (start/end, the guard's restore, the loop warning, a
67
- // write-capable child's tree changes) is a guard record that survives at
68
- // the default level. Only the child's own stdout and its tool results
69
- // pass 'stream'.
63
+ // write-capable child's tree changes) goes through `log` with no kind, so
64
+ // it defaults to 'event'. The shipped default level is 'events', where
65
+ // shouldLogDebug keeps 'event' and drops 'stream' — so the audit trail
66
+ // survives while the child's own stdout and its tool results, the only
67
+ // things passed as 'stream', do not.
70
68
  const log = deps.makeDebugAppender(deps.logPath);
71
69
  log(`=== ${deps.kind} start: ${deps.taskTitle} ===`);
72
70
  const guardSnapshot = row.guarded ? await deps.captureGitState(deps.cwd, sig) : null;
@@ -88,12 +86,13 @@ export function makeGateChild(deps) {
88
86
  cwd: deps.cwd,
89
87
  ...(sig ? { signal: sig } : {}),
90
88
  tools,
91
- // The four guard literals that used to sit here — run to
92
- // completion, a per-command watchdog, a stream watchdog, and
93
- // the path rule disabled — are the `gate` row of
94
- // WORKER_PROFILES (workers/worker-profiles.ts), which carries
95
- // the reasoning for each. The two ceilings stay inputs
96
- // because they are user config, not policy.
89
+ // The four guard literals run to completion, a per-command
90
+ // watchdog, a stream watchdog, and the path-revisit rule
91
+ // disabled — are the `gate` row of WORKER_PROFILES
92
+ // (workers/worker-profiles.ts), whose resolve() sets
93
+ // worker-timeout to {timeoutMs: 0} and pathThreshold to
94
+ // Infinity. The two ceilings stay inputs because they are user
95
+ // config, not policy.
97
96
  profile: 'gate',
98
97
  policyInputs: {
99
98
  commandTimeoutMs: deps.commandTimeoutMs,
@@ -122,8 +121,10 @@ export function makeGateChild(deps) {
122
121
  }
123
122
  : {}),
124
123
  onContextUsage: snapshot => deps.status.onContextUsage(snapshot),
125
- // The gate child has to be TOLD its window: nothing in pi's
126
- // event stream reports one (issue #16).
124
+ // The gate child has to be TOLD its window. pi's session event
125
+ // stream what `--mode json` emits — carries token counts but
126
+ // no context window; `contextWindow` appears nowhere in
127
+ // agent-session.d.ts.
127
128
  contextWindow: deps.status.parentContextWindow
128
129
  });
129
130
  }
@@ -164,10 +165,10 @@ export function makeGateChild(deps) {
164
165
  : `=== ${deps.kind} end: ${row.okMarker} ===`);
165
166
  if (failure)
166
167
  throw new Error(failure);
167
- // CAPABILITY-LEVEL diff capture (mx5 run 11): any WRITE-capable child —
168
- // decided by its TOOLS, not by which phase spawned it gets its tree
169
- // changes logged, so a future write-capable kind cannot run invisibly
170
- // the way the final-fix child's `rm` did.
168
+ // CAPABILITY-LEVEL diff capture: any WRITE-capable child — decided by
169
+ // its TOOLS, not by which phase spawned it or by a row in the table
170
+ // above — gets its tree changes logged, so a future write-capable kind
171
+ // cannot run invisibly.
171
172
  if (/\b(?:edit|bash|write)\b/.test(tools)) {
172
173
  log(`=== ${deps.kind} tree changes: `
173
174
  + `${await deps.describeTreeChanges(deps.cwd, sig)} ===`);
@@ -10,8 +10,11 @@ import { type TreeChangeSummary, type IgnoredSnapshot } from './write-guard.js';
10
10
  export type RunTaskFn = GateDeps['runTask'];
11
11
  /**
12
12
  * One-line, tail-kept, whitespace-flattened summary of a tool's output for the gate
13
- * debug log. The TAIL is kept (a bind failure / final status / assertion lands at the
14
- * end of the output) with a leading ellipsis when truncated; empty output → "(no output)".
13
+ * debug log. The TAIL is kept a bind failure, a final status or an assertion
14
+ * lands at the END of the output with a leading ellipsis when truncated.
15
+ * Measured: all-whitespace and empty input both give "(no output)", internal
16
+ * newlines collapse to single spaces, and a 410-char input comes back 301 chars
17
+ * long, starting `…` and ending on the input's last characters.
15
18
  */
16
19
  export declare function truncateToolResult(text: string, limit?: number): string;
17
20
  /** One bounded final-gate fix attempt (see final-gate-fix.ts): fix child →
@@ -32,7 +35,7 @@ ignoredKnown?: string[]) => Promise<FinalFixResult>;
32
35
  export declare function collectChangedFiles(cwd: string, signal?: AbortSignal): Promise<ChangedFile[]>;
33
36
  /**
34
37
  * Collect the task's added lines WITH CONTENT (path + text) for the probe-gaming
35
- * probe (F6), which needs the actual line text the numstat-shape collector omits.
38
+ * probe, which needs the actual line text the numstat-shape collector omits.
36
39
  * Pre-commit the work is the tree-vs-HEAD diff plus untracked files (read whole, as
37
40
  * all-added); on the post-enforce re-verify the tree is clean, so fall back to the
38
41
  * last commit's diff. Failures degrade to an empty list — the probe is a sharpener,
@@ -40,10 +43,10 @@ export declare function collectChangedFiles(cwd: string, signal?: AbortSignal):
40
43
  */
41
44
  export declare function collectAddedLines(cwd: string, signal?: AbortSignal): Promise<AddedLine[]>;
42
45
  /**
43
- * Deterministic sandbox-path-leak pass (see foreign-path.ts, mx5 run 13 PROMPT 4
44
- * item 1): find absolute paths the task committed that resolve nowhere on this
45
- * machine while the real file sits in the repo, REPAIR the ones whose relative
46
- * form provably resolves, and return verify findings for whatever is left.
46
+ * Deterministic sandbox-path-leak pass (see foreign-path.ts): find absolute paths
47
+ * the task committed that resolve nowhere on this machine while the real file sits
48
+ * in the repo, REPAIR the ones whose relative form provably resolves, and return
49
+ * verify findings for whatever is left.
47
50
  *
48
51
  * The repair runs here, before the verify child, for the same reason lint-fix
49
52
  * does: the defect is mechanical and the correct target is already known, so
@@ -53,9 +56,8 @@ export declare function collectAddedLines(cwd: string, signal?: AbortSignal): Pr
53
56
  */
54
57
  export declare function collectForeignPathFindings(cwd: string, signal?: AbortSignal, logDebug?: (m: string) => void): Promise<string[]>;
55
58
  /**
56
- * Deterministic neutered-check-script pass (see script-escape.ts, mx5 run 13 PROMPT
57
- * 4 item 4): check-class scripts that cannot report failure, in a manifest THIS
58
- * task changed.
59
+ * Deterministic neutered-check-script pass (see script-escape.ts): check-class
60
+ * scripts that cannot report failure, in a manifest THIS task changed.
59
61
  *
60
62
  * Scoped to manifests the task touched, so the finding lands on the task that
61
63
  * authored the script rather than being re-served to every later task. A script
@@ -66,10 +68,9 @@ export declare function collectForeignPathFindings(cwd: string, signal?: AbortSi
66
68
  */
67
69
  export declare function collectScriptEscapeFindings(cwd: string, signal?: AbortSignal): Promise<string[]>;
68
70
  /**
69
- * Deterministic test-runner glob-collision pass (see runner-globs.ts, mx5 runs 7 AND
70
- * 13, PROMPT 4 item 2): the manifest declares both `bun test` and `playwright test`
71
- * without a provably disjoint file set, so `bun test` imports the playwright specs
72
- * and dies during collection.
71
+ * Deterministic test-runner glob-collision pass (see runner-globs.ts): the manifest
72
+ * declares both `bun test` and `playwright test` without a provably disjoint file
73
+ * set, so `bun test` imports the playwright specs and dies during collection.
73
74
  *
74
75
  * Whole-repo rather than diff-scoped, unlike the neutered-script probe: a collision
75
76
  * is a property of the PAIR of declarations, and the task that completes the pair is
@@ -85,24 +86,30 @@ export declare function collectRunnerGlobFindings(cwd: string): Promise<string[]
85
86
  */
86
87
  export declare function collectTreeChanges(cwd: string, signal?: AbortSignal): Promise<TreeChangeSummary>;
87
88
  /**
88
- * Build output directories declared by the project's OWN build commands
89
- * (`--outdir=X`, `--out-dir X`), so the ignored-write exemption follows the real
90
- * tooling instead of a name list. Best-effort: an unreadable or non-JSON manifest
91
- * contributes nothing and the name-list fallback in classifyIgnoredPath applies.
89
+ * Build output directories declared by the project's OWN build commands, so the
90
+ * ignored-write exemption follows the real tooling instead of a name list.
91
+ *
92
+ * The pattern is `--outdir` or `--out-dir`, LOWERCASE, followed by `=` or a space.
93
+ * Measured on a manifest declaring all four spellings: `--outdir=./dist/` yields
94
+ * `dist` and `--out-dir build` yields `build`, while `--outDir out` (tsc's
95
+ * spelling) yields nothing and a bare `--outdir -` is dropped by the leading-dash
96
+ * guard. Best-effort: an unreadable or non-JSON manifest contributes nothing and
97
+ * the name-list fallback in classifyIgnoredPath applies.
92
98
  */
93
99
  export declare function parseBuildOutdirs(cwd: string): string[];
94
100
  /**
95
- * IGNORED-PATH CHANNEL (mx5 run 19 — see write-guard.ts). A fingerprint of every
101
+ * IGNORED-PATH CHANNEL (see write-guard.ts). A fingerprint of every
96
102
  * ACTIONABLE ignored path (`git status --porcelain --ignored=matching`, minus
97
103
  * build output / node_modules / .pi-tasks / .git), taken before and after a
98
104
  * write-capable gate child so its writes to files git never reports are
99
105
  * attributable to it.
100
106
  *
101
107
  * `--ignored=matching` collapses a wholly-ignored directory into ONE entry, which
102
- * is what keeps this cheap: `node_modules/` is one exempt line, never 40,000
103
- * stats. Every failure mode degrades to `{}` no git, an older git that rejects
104
- * `--ignored=matching`, an unreadable pathso the gate behaves exactly as it did
105
- * before this channel existed.
108
+ * is what keeps this cheap: run against a repo ignoring `logs/`, `node_modules/`
109
+ * and `.env`, with files in all three, it reports exactly three lines
110
+ * `!! .env`, `!! logs/`, `!! node_modules/` never one per file. Every failure
111
+ * mode degrades to `{}` (no git, a git that rejects the flag, an unreadable path),
112
+ * so the gate behaves as if the channel were absent.
106
113
  */
107
114
  export declare function collectIgnoredSnapshot(cwd: string, signal?: AbortSignal): Promise<IgnoredSnapshot>;
108
115
  /**
@@ -128,9 +135,9 @@ export declare function gatePassesWithoutIgnored(cwd: string, paths: string[], r
128
135
  */
129
136
  export declare function collectTaskTreeChanges(cwd: string, signal?: AbortSignal): Promise<TreeChangeSummary>;
130
137
  /**
131
- * Deterministic test-assembly probe input (see test-assembly.ts, run-8 F4): read the
132
- * task's own changed TEST files plus the repo's tracked source files, and return the
133
- * finding lines naming any test that rebuilds a production assembly it never imports.
138
+ * Deterministic test-assembly probe input: read the task's own changed TEST files
139
+ * plus the repo's tracked source files, and return the finding lines naming any
140
+ * test that rebuilds a production assembly it never imports.
134
141
  * Pure import-graph shape; failures degrade to no findings (the probe is a sharpener,
135
142
  * never a blocker). `changed` is the already-collected task diff, reused so the probe
136
143
  * costs one extra tracked-file listing, not a second diff.
@@ -142,7 +149,7 @@ export declare function collectTestAssemblyFindings(cwd: string, changed: Change
142
149
  * section, and an unreadable task file is the same case — both are null, and every
143
150
  * caller already treats null as "nothing to hold the work to" (verify no-ops,
144
151
  * frozen paths are empty, recommend falls back to the title). Never throws. This
145
- * used to be the same four-line try/catch at four gate sites.
152
+ * would otherwise be the same four-line try/catch at four gate sites.
146
153
  */
147
154
  export declare function readSpecForVerification(cwd: string, taskId: string): Promise<string | null>;
148
155
  /**