@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
@@ -1,42 +1,40 @@
1
1
  /**
2
- * Verify-FAIL resolution research for /task-auto.
2
+ * Verify-FAIL resolution research.
3
3
  *
4
- * When the work-verification gate (verify-work.ts) returns a FAIL, the run no
5
- * longer dead-stops with "fix and run /task-auto-resume". Instead the user is
6
- * shown a boxed two-choice picker:
4
+ * When the work-verification gate (verify-work.ts) FAILs a task, one of two
5
+ * things has to happen next:
7
6
  *
8
- * • Autofix — re-run the task's implementation turn against the failure, then
9
- * re-enter the verify gate.
10
- * • Accept — treat the artifact as good, override the gate, and proceed
11
- * (check off + commit) exactly as a PASS would.
7
+ * • Autofix — re-run the task's implementation turn against the failure, then
8
+ * re-enter the verify gate.
9
+ * • Accept — treat the artifact as good, override the gate, and proceed
10
+ * (check off + commit) exactly as a PASS would.
12
11
  *
13
- * The recommendation now also GATES whether the user is prompted at all: an
14
- * AUTOFIX recommendation is auto-applied unattended (bounded see
15
- * task-gates.ts MAX_AUTO_AUTOFIX), and the picker is shown only when the
16
- * recommendation is ACCEPT (blessing the artifact is a human's call) or when the
17
- * unattended-autofix cap is reached. This module only computes which of the two
18
- * cards is tinted RECOMMENDED, by handing the FAIL reason + the task spec to
19
- * a fresh read+bash child of the SAME local model and letting it INVESTIGATE the
20
- * real workspace: is the FAIL a genuine defect in the work (→ recommend AUTOFIX),
21
- * or a false alarm / an acceptable artifact the gate misjudged (→ recommend
22
- * ACCEPT)? This is the same shape of judgement a human reviewer makes when a CI
23
- * check is red — sometimes the code is broken, sometimes the check is wrong.
12
+ * This module only computes which of the two is RECOMMENDED. It hands the FAIL
13
+ * reason and the composed spec to a fresh read+bash child and lets it
14
+ * INVESTIGATE the real workspace: a genuine defect in the work (→ AUTOFIX), or
15
+ * an artifact the gate misjudged (→ ACCEPT).
24
16
  *
25
- * Tools: `read` + `bash` only identical to the verify pass. The recommendation
26
- * observes; it never edits. (Autofix, when chosen, is what edits and it goes
27
- * through the full implementation runner, not this pass.) A read-only research
28
- * step can never itself change the tree it is judging.
17
+ * The recommendation also decides whether a human is asked at all. In
18
+ * task-gates.ts an AUTOFIX recommendation is applied UNATTENDED, bounded by
19
+ * MAX_AUTO_AUTOFIX; the picker is reached on an ACCEPT recommendation, once that
20
+ * bound is spent, or when the FAIL is UNOBSERVED or frozen-blocked.
29
21
  *
30
- * The verdict defaults to AUTOFIX when missing/garbled the conservative choice
31
- * (re-do the work rather than bless it), which is also the auto-applied path.
22
+ * Tools: `read` + `bash`, the same string as verify-work's VERIFY_TOOLS. That is
23
+ * a CONTRACT, not a capability `bash` can write. gate-child.ts marks the
24
+ * `recommend` kind `guarded`, so the git-state guard restores whatever this pass
25
+ * moves.
26
+ *
27
+ * The verdict defaults to AUTOFIX when missing or garbled: re-doing the work
28
+ * rather than blessing it.
32
29
  */
33
30
  import { USER_CANCELLED } from './child-runner.js';
34
- /** Same read-only contract as the verify pass: observe, never edit. */
31
+ /** The observe-only contract handed to the child. The same string as
32
+ * verify-work's VERIFY_TOOLS, so both passes are told the same thing. */
35
33
  const RESOLUTION_TOOLS = 'read,bash';
36
34
  /**
37
35
  * Build the resolution research child's prompt. Pure, so the wording is
38
- * unit-tested without spawning pi. The contract: investigate the real workspace
39
- * and end on exactly one RESOLUTION verdict line.
36
+ * unit-tested without spawning pi. The contract it states: investigate the real
37
+ * workspace and end on exactly one `VERIFY-RESOLUTION:` line.
40
38
  */
41
39
  export function buildResolutionPrompt(spec, failReason) {
42
40
  return [
@@ -96,13 +94,14 @@ export function buildResolutionPrompt(spec, failReason) {
96
94
  ].join('\n');
97
95
  }
98
96
  /**
99
- * Parse the child's recommendation. Scans for the LAST
100
- * `VERIFY-RESOLUTION: AUTOFIX|ACCEPT` marker (the model reasons before
101
- * concluding, and bash output may echo these words, so a distinct token and
102
- * last-match-wins both matter).
97
+ * Parse the child's recommendation out of the LAST
98
+ * `VERIFY-RESOLUTION: AUTOFIX|ACCEPT` marker, case-insensitively. Last match
99
+ * wins: the model reasons before concluding, and a bash command it runs can
100
+ * print the token back, so an earlier occurrence is not the verdict.
103
101
  *
104
- * No marker → recommend AUTOFIX (conservative: re-do rather than bless), with a
105
- * rationale that says the research was inconclusive.
102
+ * No marker → AUTOFIX (re-do rather than bless), with a rationale saying the
103
+ * research was inconclusive. A marker with no trailing sentence gets a stock
104
+ * rationale, so `rationale` is never empty.
106
105
  */
107
106
  export function parseResolutionVerdict(text) {
108
107
  const re = /VERIFY-RESOLUTION:\s*(AUTOFIX|ACCEPT)\b[ \t]*(.*)/gi;
@@ -122,20 +121,20 @@ export function parseResolutionVerdict(text) {
122
121
  }
123
122
  // ─── Picker plumbing ─────────────────────────────────────────────────────────
124
123
  //
125
- // The user ALWAYS makes the final call on a verify FAIL. These pure helpers shape
126
- // the boxed two-choice picker (verify-resolution → SessionUI.ask in the loop) and
127
- // classify whatever comes back — a card value, a remote button label, or free
128
- // text typed via the "type a different answer" fallback — so the orchestration
129
- // stays mechanical and unit-tested.
124
+ // These pure helpers shape the boxed two-choice picker (task-gates.ts
125
+ // `askVerifyResolution` → SessionUI.ask) and classify whatever comes back — a
126
+ // card value, a remote button label, or free text typed via the "type a
127
+ // different answer" fallback — so the orchestration stays mechanical and
128
+ // unit-tested.
130
129
  export const ACCEPT_VALUE = 'accept';
131
130
  export const AUTOFIX_VALUE = 'autofix';
132
131
  export const ACCEPT_LABEL = 'Accept — keep the artifact as-is and continue';
133
132
  export const AUTOFIX_LABEL = 'Autofix — re-run the task to fix it, then verify again';
134
133
  /**
135
- * The two cards for the picker, with the model-recommended one FIRST so the boxed
136
- * renderer tints it green (it marks index 0 as recommended). Values are the bare
137
- * tokens; remote buttons use the labels — {@link classifyResolutionAnswer}
138
- * accepts both.
134
+ * The two cards for the picker, model-recommended one FIRST because the boxed
135
+ * renderer marks index 0 as the recommended card (bridge.ts `askLocal` passes
136
+ * `recommended: i === 0`). Values are the bare tokens; remote buttons carry the
137
+ * labels — {@link classifyResolutionAnswer} accepts both.
139
138
  */
140
139
  export function resolutionOptions(recommend) {
141
140
  const accept = { label: ACCEPT_LABEL, value: ACCEPT_VALUE };
@@ -151,10 +150,11 @@ export function resolutionOptions(recommend) {
151
150
  ];
152
151
  }
153
152
  /**
154
- * Map a picker answer to an action. Handles the card value tokens, the remote
155
- * button labels, an empty/undefined dismissal (cancel), and arbitrary free text
156
- * typed via the fallback which becomes an AUTOFIX with that text as guidance
157
- * (the user is steering the re-run rather than blessing the artifact).
153
+ * Map a picker answer to an action. undefined or blank is a dismissal (cancel).
154
+ * A LEADING `accept`/`autofix` word matches, which covers both the bare card
155
+ * values and the remote button labels. Anything else becomes an AUTOFIX carrying
156
+ * that text as guidance including a sentence that mentions "accept" further
157
+ * along, since the user is steering the re-run, not blessing the artifact.
158
158
  */
159
159
  export function classifyResolutionAnswer(answer) {
160
160
  if (answer === undefined)
@@ -171,9 +171,10 @@ export function classifyResolutionAnswer(answer) {
171
171
  }
172
172
  /**
173
173
  * Research a verify FAIL and return which action to recommend. Never throws
174
- * (except a user cancel, which propagates so the loop's USER_CANCELLED handler
175
- * reports a clean "cancelled — resume"). A child crash defaults to recommending
176
- * AUTOFIX the picker is still shown, only the default tint changes.
174
+ * except on a user cancel, which propagates so the loop's USER_CANCELLED handler
175
+ * reports a clean "cancelled — resume". A child crash returns AUTOFIX with a
176
+ * "could not run" rationale; since AUTOFIX is the unattended path, a crash here
177
+ * costs an implementation re-run rather than a prompt.
177
178
  */
178
179
  export async function researchResolution(deps) {
179
180
  let text;
@@ -9,9 +9,9 @@ import { type CrossTaskDeletion } from './task-provenance.js';
9
9
  * - `read` lets it inspect a file the VERIFY output points at (a build error's
10
10
  * source line, a config it just validated) to characterise a failure precisely.
11
11
  * - No `edit`/`write`: this pass reports a verdict, it does not change the tree.
12
- * Keeping it read-only means a verify run can never itself introduce a change
13
- * that needs re-verifying, and never scaffolds the junk-file runaway that the
14
- * enforce pass had to drop `write` to stop.
12
+ * That is a CONTRACT, not a capability `bash` can write so the git-state
13
+ * guard backs it up and `mutationCheck` throws away a verdict reached on a
14
+ * mutated tree. The enforce pass, whose job IS editing, runs `read,edit`.
15
15
  */
16
16
  declare const VERIFY_TOOLS = "read,bash";
17
17
  export interface VerifyOutcome {
@@ -37,26 +37,22 @@ export interface VerifyOutcome {
37
37
  /**
38
38
  * WHICH KIND of FAIL this is, as data. Only meaningful when ok === false.
39
39
  *
40
- * `unobserved` was already carried as a typed field and read as one. Its
41
- * siblings were not: the repo-health class travelled only as the `repo health:`
42
- * PREFIX of `reason`, and three independent production sites recovered it by
43
- * re-typing that literal with two different matchers the graduated lint-fix
44
- * gate, the frozen-blocked contradiction test, and the ONE auto-closing debt
45
- * class. A reword of the mint disabled all three, with no compile error and a
46
- * green suite. This is the `observedFailures` finding one altitude down: the
47
- * outcome CLASS never travelled with the failure TEXT, so every classifier
48
- * downstream had to guess.
40
+ * Without it the class travels only as the PREFIX of `reason`, and every
41
+ * downstream classifier has to recover it by re-typing that literal a
42
+ * reword of the mint would then disarm them with no compile error.
43
+ * `VERIFY_FAIL_PREFIX` owns the strings so mint and match cannot drift, and
44
+ * `verifyFailClass` prefers this field over the prefix.
49
45
  */
50
46
  failClass?: VerifyFailClass;
51
47
  }
52
48
  /**
53
- * The kinds of verify FAIL. A new member is a compile error until it declares a
54
- * display prefix below.
49
+ * The kinds of verify FAIL. `VERIFY_FAIL_PREFIX` below is a
50
+ * `Record<VerifyFailClass, string>`, so a new member here is a compile error
51
+ * (TS2741, "Property 'x' is missing") until it declares a display prefix.
55
52
  *
56
- * `static-checks` is the RUN-level twin of `repo-health`: `final-gate.ts` mints
57
- * `static checks: …` for the same concept at the other altitude, which is why
58
- * `isStaticClassDebt` was structurally blind to every run-level static failure
59
- * that reached the ledger.
53
+ * `static-checks` is the RUN-level twin of `repo-health`: final-gate.ts mints
54
+ * `VERIFY_FAIL_PREFIX['static-checks']` for the same concept at the other
55
+ * altitude, and `isStaticClass` answers true for both.
60
56
  */
61
57
  export type VerifyFailClass = 'repo-health' | 'static-checks' | 'unobserved' | 'model-verdict' | 'harness-fault';
62
58
  /**
@@ -71,10 +67,10 @@ export declare const VERIFY_FAIL_PREFIX: Record<VerifyFailClass, string>;
71
67
  * The class of a FAIL — from the typed field when it is there, else from the
72
68
  * prefix the registry above owns.
73
69
  *
74
- * The prefix test survives in exactly ONE place instead of three. It has to
75
- * survive somewhere: `GateDeps.verify` is a seam, a debt read back off disk is a
76
- * bare string with no outcome attached, and the run-level gate mints its own
77
- * `static checks:` line through a different path entirely.
70
+ * The prefix test has to survive somewhere: `GateDeps.verify` is a seam, a debt
71
+ * read back off disk is a bare string with no outcome attached, and final-gate.ts
72
+ * mints its `static checks:` line through a different path entirely. This is the
73
+ * only place in src/ that tests a reason against a prefix.
78
74
  */
79
75
  export declare function verifyFailClass(o: Pick<VerifyOutcome, 'failClass' | 'reason'>): VerifyFailClass | undefined;
80
76
  /** The class a recorded reason STRING belongs to, by its minted prefix. */
@@ -83,46 +79,40 @@ export declare function failClassOfReason(reason: string): VerifyFailClass | und
83
79
  export declare function isStaticClass(cls: VerifyFailClass | undefined): boolean;
84
80
  /**
85
81
  * Slice the delivered spec (GOAL / CONSTRAINTS / ACCEPTANCE / VERIFY) out of a
86
- * task file body. The composed spec lives under a `## spec` header and runs until
87
- * the next top-level `## ` section (`## phase timings`). Returns null when no spec
88
- * section is present (e.g. a task that never reached compose), which the caller
89
- * treats as a pass there is nothing to verify against.
82
+ * task file body. The compose and critique phases write the section named `spec`,
83
+ * so the composed spec lives under `## spec` and runs to the next line matching
84
+ * `## ` plus non-space (`## phase timings`); a `### ` subheading stays inside.
85
+ * Returns null when there is no spec section or it is blank (a task that never
86
+ * reached compose), which the caller treats as a pass — nothing to verify against.
90
87
  */
91
88
  export declare function extractSpecForVerification(taskBody: string): string | null;
92
89
  /**
93
90
  * ─────────────────────────── THE PROBE TABLE ───────────────────────────
94
91
  *
95
- * Every deterministic probe that sharpens this prompt used to cost the same
96
- * ritual in four places: a `let x = []` + try/catch in runWorkVerification, a
97
- * positional parameter on buildVerifyPrompt, a `const xBlock =` ternary, and a
98
- * spread into the assembled prompt plus its hand-numbered rule. Adding one
99
- * meant editing all of them and hoping none was missed; the ninth would not
100
- * even fit the signature (hence the `projectSurface` bag that used to group
101
- * three of them).
92
+ * Each deterministic probe is one ADAPTER row carrying only what is specific to
93
+ * it: its key (which names the thunk it reads from `deps.probes`), the empty
94
+ * value it degrades to, how its raw result becomes finding lines, the notice
95
+ * block those lines produce, and the numbered rule the notice routes the child
96
+ * to. The loop in `runWorkVerification` owns the ritual, so adding a probe is a
97
+ * `ProbeRaw` line, a row here, and a binding line in gate-deps — nothing else.
98
+ * (Same shape as `LOCKFILE_CHECKS` in final-gate.ts, where a whole package
99
+ * ecosystem is one row.)
102
100
  *
103
- * Each probe is now an ADAPTER: one row carrying only what is specific to it —
104
- * its key (which names the thunk it reads from `deps.probes`), the empty value it
105
- * degrades to, how its raw result becomes finding lines, the notice block those
106
- * lines produce, and the numbered rule the notice routes the child to. The loop
107
- * owns the ritual. (Same shape as
108
- * LOCKFILE_CHECKS in final-gate.ts, where a whole package ecosystem is one row.)
109
- *
110
- * THIS PROMPT IS A MEASURED ARTIFACT — its wording is A/B-tested on the live
111
- * local model and the verdicts are recorded in VALIDATION-DEBT.md, so the table
112
- * must emit BYTE-IDENTICAL text for the same findings. Two orders are
113
- * load-bearing and they are NOT the same order:
101
+ * TWO ORDERS ARE LOAD-BEARING AND THEY ARE NOT THE SAME ORDER:
114
102
  * - NOTICE BLOCKS are emitted in TABLE order (the order the rows appear below).
115
- * - RULES are emitted sorted by `ruleId`, because the 4b…4g band was
116
- * hand-numbered long before this table existed and its numbering is what the
117
- * notices cite ("rule 4b applies").
118
- * A row whose rule is woven into the numbered narrative elsewhere (3b inside the
119
- * substitution rules, 3f, 5c) carries `ruleId` for the reader and no `rule` text.
103
+ * - RULES are emitted sorted by `ruleId`, because the 4b…4g band is
104
+ * hand-numbered and that numbering is what the notices cite ("rule 4b
105
+ * applies").
106
+ * A row whose rule is woven into the numbered narrative elsewhere (3b, 3f, 5c)
107
+ * carries `ruleId` for the reader and no `rule` text.
120
108
  */
121
109
  /**
122
110
  * What each probe channel's RAW probe returns — the one place a channel's shape
123
- * is declared. `ProbeKey` is derived from it, so a channel exists exactly when it
124
- * has a row here; delete one and the compiler names its table row and its single
125
- * binding line in gate-deps' `buildVerifyProbes`.
111
+ * is declared. `ProbeKey` is `keyof ProbeRaw`, so a channel exists exactly when
112
+ * it has a line here. Deleting one is a compile error at BOTH of its other sites:
113
+ * the table row's `key` ("not assignable to type 'keyof ProbeRaw'") and the
114
+ * binding line in gate-deps' `buildVerifyProbes` ("does not exist in type
115
+ * 'VerifyProbes'").
126
116
  */
127
117
  export interface ProbeRaw {
128
118
  substitution: string[];
@@ -166,8 +156,8 @@ export declare const BOUND_PROBE_KEYS: readonly BoundProbeKey[];
166
156
  * workspace, judge against ACCEPTANCE, and end on exactly one verdict line.
167
157
  *
168
158
  * `findings` is the probe bag: one key per PROBE_ADAPTERS row (see the table
169
- * above for what each channel means and the A/B evidence behind it). A key that
170
- * is absent or empty emits no block — the probes are independently optional.
159
+ * above for what each channel means). A key that is absent or empty emits no
160
+ * block — the probes are independently optional.
171
161
  */
172
162
  export declare function buildVerifyPrompt(spec: string, findings?: ProbeFindings, context?: {
173
163
  /** Environment facts earlier gate children discovered — see env-notes.ts. */
@@ -176,9 +166,11 @@ export declare function buildVerifyPrompt(spec: string, findings?: ProbeFindings
176
166
  contracts?: string;
177
167
  }): string;
178
168
  /**
179
- * Parse the child's verdict. Scans for the LAST `WORK-VERIFIED: PASS|FAIL|UNOBSERVED`
180
- * marker (the model discusses before concluding, and bash output may echo the word
181
- * "VERIFY", so a distinct token and last-match win matter).
169
+ * Parse the child's verdict out of the LAST `WORK-VERIFIED: PASS|FAIL|UNOBSERVED`
170
+ * marker, case-insensitively. Last match wins: the model discusses before
171
+ * concluding, and a bash command it runs can print the token back, so an earlier
172
+ * occurrence is not the verdict. A marker with no trailing text gets a stock
173
+ * detail, so FAIL and UNOBSERVED are never bare.
182
174
  *
183
175
  * UNOBSERVED (rule 5c) is a distinct third outcome: a spec-required behavioral check
184
176
  * could not run because its observation tooling is absent, so the behavior is neither
@@ -220,8 +212,8 @@ export interface VerificationDeps {
220
212
  * `probes` below, all of which run BEFORE the child (and therefore before the
221
213
  * child's own status widget exists). Called with a short label as each step
222
214
  * starts, so the caller can keep a live line on screen through what was
223
- * otherwise the run's longest stretch of dead air (MEASURED at 15–69s per
224
- * repo-health run). ABSENT → no progress reporting, same behaviour as before. */
215
+ * otherwise a long stretch of dead air. Wrapped in a try/catch by the caller,
216
+ * so a throwing hook cannot break the gate. ABSENT → no progress reporting. */
225
217
  onStage?: (stage: string) => void;
226
218
  /**
227
219
  * The DETERMINISTIC probes, one optional thunk per channel (see `PROBE_ADAPTERS`
@@ -236,7 +228,7 @@ export interface VerificationDeps {
236
228
  * Result of the git-state guard for the MOST RECENT runChild call (see
237
229
  * git-state-guard.ts): did the child mutate repo state (stash/checkout/file
238
230
  * rewrites), which the guard then restored? A verdict computed on a mutated
239
- * tree is untrustworthy in BOTH directions — the mx5 run 6 child stashed the
231
+ * tree is untrustworthy in BOTH directions — a child that stashed the
240
232
  * work away and judged an empty tree — so it is discarded: the first mutated
241
233
  * run is retried once on the restored tree; a second mutation is a FAIL that
242
234
  * names the behavior. ABSENT → no guard (tests / non-git repos), unchanged. */
@@ -259,16 +251,17 @@ export interface VerificationDeps {
259
251
  * Per-run cross-slice contract registry (see contracts.ts): `read` supplies the
260
252
  * verbatim interface facts the SOURCE design pins that more than one slice
261
253
  * touches, injected so the verify child checks THIS slice's boundary against
262
- * them (F3 seam bugs are locally right but globally wrong). ABSENT/empty → no
263
- * block (single `/task` runs, or a design pinning no shared boundary), unchanged.
254
+ * them rather than only against itself. ABSENT/empty → no block (single
255
+ * `/task` runs, or a design pinning no shared boundary).
264
256
  */
265
257
  contracts?: () => Promise<string>;
266
258
  }
267
259
  /**
268
- * Run the verification pass for one task. A missing spec is a pass. Otherwise run
269
- * the child against the real workspace and turn its verdict into an ok/blocked
270
- * outcome. Never throws (except a user cancel, which propagates so the loop's
271
- * USER_CANCELLED handler reports a clean "cancelled resume").
260
+ * Run the verification pass for one task. `repoHealth` runs first and can FAIL on
261
+ * its own; after it, a missing or empty spec is a pass. Otherwise the child runs
262
+ * against the real workspace and its verdict becomes an ok/blocked outcome. Never
263
+ * throws except on a user cancel, which propagates so the loop's USER_CANCELLED
264
+ * handler reports a clean "cancelled — resume".
272
265
  */
273
266
  export declare function runWorkVerification(deps: VerificationDeps): Promise<VerifyOutcome>;
274
267
  export { VERIFY_TOOLS };