@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,69 +1,49 @@
1
1
  /**
2
2
  * owned-freeze-reassign — the DETERMINISTIC resolution for the owned/freeze
3
- * unsatisfiable pair (nexttask 2): an AUTHORITATIVE owned requirement whose only
4
- * implementing file the same spec FREEZES. No model, no prose edit. The
5
- * requirement text is never altered — only which task's ledger entry carries it,
6
- * so "resolution by deletion" is structurally impossible.
7
- *
8
- * WHY NOT A REWRITE. Measured on mx5 run 18 (scripts/live-owned-freeze-conflict
9
- * -ab.ts, 20 trials/arm): forcing the pair through the critique seam drives
10
- * pair-present 8/20 → 0/20, but 11 of the 20 resolutions DELETE the
11
- * AUTHORITATIVE clause instead of moving it, and the delivered VERIFY still
12
- * greps `package.json` in both arms (6/20). Removal of the pair is not
13
- * satisfaction of the requirement.
3
+ * unsatisfiable pair: an AUTHORITATIVE owned requirement whose only implementing
4
+ * file the same spec FREEZES. No model, no prose edit. The requirement text is
5
+ * never altered — only which task's ledger entry carries it, so "resolution by
6
+ * deletion" is structurally impossible. That is the whole point: a model asked to
7
+ * remove a contradiction can satisfy the request by deleting the requirement, and
8
+ * removal of the pair is not satisfaction of the requirement.
14
9
  *
15
10
  * ── THE MECHANISM: DETACH, then CLAIM ───────────────────────────────────────
16
11
  *
17
12
  * Two steps, each run where the information it needs actually exists:
18
13
  *
19
- * DETACH at the conflicting task's own critique (right after the braces
20
- * stamp the bullet, which is the first moment the pair exists): the
21
- * entry is marked `pending: [frozen paths]` in the ledger and its
22
- * stamped bullet is dropped from this spec. It is now owned by
23
- * nobody; `ownedForTitle` skips it; the quote is still there, byte for
24
- * byte.
25
- * CLAIM at every LATER task's compose, before the belt block is built: if
26
- * that task's REFINED PROMPT shows a write intent on one of the
27
- * pending paths, the entry becomes that task's own — belt into its
28
- * compose, braces onto its spec.
29
- *
30
- * ── WHY NOT "PICK THE TARGET AT DETACH TIME", WHICH IS WHAT nexttask2.md ASKS ─
31
- *
32
- * nexttask2.md's branch 1 is "if exactly one OTHER task in the plan names path
33
- * `P` — its title or its spec's file list contains `P` — move the requirement
34
- * there". Measured over all 60 recorded composed specs on disk
35
- * (scripts/owned-freeze-reassign-baserate.ts), on the one conflict the corpus
36
- * contains (mx5 run 19 TASK_0015, path `src/server/index.ts`):
14
+ * DETACH at the conflicting task's own critique (`critiquePhase`, right after
15
+ * `appendOwnedConstraints` stamps the bullet, which is the first moment
16
+ * the pair exists): the entry is marked `pending: [frozen paths]` in the
17
+ * ledger and its stamped bullet is dropped from this spec. It is now
18
+ * owned by nobody; `ownedForTitle` skips it; the quote is still there,
19
+ * byte for byte.
20
+ * CLAIM at every LATER task's compose, before the belt block is built: if that
21
+ * task's REFINED PROMPT shows a write intent on one of the pending
22
+ * paths, the entry becomes that task's own — belt into its compose,
23
+ * braces onto its spec. First claimant wins.
37
24
  *
38
- * title-only 3 candidates TASK_0014 TASK_0016 TASK_0017
39
- * FILES-only 7 candidates TASK_0016 … TASK_0025
40
- * either 8 candidates → "exactly one" NEVER holds
25
+ * ── WHY NOT "PICK THE TARGET AT DETACH TIME" ─────────────────────────────────
41
26
  *
42
- * and, decisively, that measurement is against RECORDED SPECS, which production
43
- * does not have: at the conflicting task's compose the later tasks are still
44
- * bare plan titles. None of run 19's 26 plan titles contains the string
45
- * `src/server/index.ts` TASK_0017's reads "Client API layer typed
46
- * hono/client hc<AppType> in api.ts, small fetch/mutation hooks, SPA fallback
47
- * route on server". A path-lexical target rule at detach time is therefore
48
- * BLIND IN PRODUCTION (0 candidates), the same way the run-18 critique probe was.
27
+ * The obvious rule is "if exactly one OTHER task in the plan names path `P`, move
28
+ * the requirement there". It needs COMPOSED SPECS, and at the conflicting task's
29
+ * compose the later tasks are still bare plan titles. A plan title describes a
30
+ * slice of behaviour, not a file list, so a path-lexical target rule at detach
31
+ * time finds nothing to point at.
49
32
  *
50
- * The claimant knows what the planner did not. By its own compose, TASK_0017 has
51
- * a refined prompt that says "add an SPA fallback route to the existing server
52
- * `src/server/index.ts`". Over run 19's 26 refined prompts, `writeIntent` on that
53
- * path fires on exactly two: TASK_0014 (which created the file, already run) and
54
- * TASK_0017. Nothing else in the plan claims it — six other specs mention the
55
- * path, all of them to fence themselves off it.
33
+ * The claimant knows what the planner did not. By its own compose the later task
34
+ * has a REFINED prompt, which does say which files it will write and
35
+ * `writeIntent` reads exactly that, while its negation fence keeps every sibling
36
+ * that merely mentions the path in order to fence itself off it.
56
37
  *
57
- * ── WHY NOT nexttask2.md's BRANCH 2 (CARRY EVERYTHING CROSS-CUTTING) ────────
38
+ * ── WHY NOT CARRY IT AS CROSS-CUTTING ────────────────────────────────────────
58
39
  *
59
40
  * The cross-cutting channel is for prohibitions and product-wide rules
60
- * (`isCrossCuttingRequirement`; `accountCoverage` only routes those there). The
61
- * corpus conflict is a task-specific deliverable clause carrying it would push
62
- * "the server serves static `dist/`" into the 11 tasks that had not yet run,
63
- * none of which owns the server file. That is spec inflation dressed as a fix.
64
- * An entry nobody claims stays `pending` and is surfaced at the end of the run
65
- * (`unclaimedPendingRequirements`), which is a debt the run can see rather than
66
- * an obligation that quietly evaporated.
41
+ * (`isCrossCuttingRequirement`; `accountCoverage` only routes those there). A
42
+ * task-specific deliverable clause carried that way lands in every task that has
43
+ * not run yet, none of which owns the file spec inflation dressed as a fix. An
44
+ * entry nobody claims stays `pending` and `unclaimedPendingRequirements` surfaces
45
+ * it at the end of the run (run-final-gate.ts), so it becomes a debt the run can
46
+ * see rather than an obligation that quietly evaporated.
67
47
  */
68
48
  import { findOwnedFreezeConflicts } from './owned-freeze-conflict.js';
69
49
  import { ownedForTitle } from './requirements.js';
@@ -72,11 +52,10 @@ import { PROHIBITION_RE } from './prohibition-probe.js';
72
52
  * Does this text CLAIM a write on `p` — a create/modify verb reaching a mention
73
53
  * of the path, not fenced by a negation?
74
54
  *
75
- * The negation half is not decoration. Every sibling task's refined prompt names
76
- * the files it must not touch ("Do not create or modify any other files outside
77
- * this slice (e.g., no changes to `src/server/index.ts`, …)" — mx5 run 19
78
- * TASK_0008). Without the fence check that spec claims the server file; with it,
79
- * run 19's 26 refined prompts yield exactly the two tasks that do write it.
55
+ * The negation half is not decoration. A refined prompt routinely names the files
56
+ * its task must NOT touch, in the same sentence as a write verb — "Do not create
57
+ * or modify any other files outside this slice (e.g. no changes to `X`)". Without
58
+ * the fence check, every such sibling claims `X`.
80
59
  */
81
60
  export function writeIntent(text, p) {
82
61
  const re = new RegExp(String.raw `\b(?:creat|add|implement|modif|updat|extend|wir|writ|mount|chang)\w*\b`
@@ -84,7 +63,7 @@ export function writeIntent(text, p) {
84
63
  + p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
85
64
  for (const m of text.matchAll(re)) {
86
65
  // The negation usually sits BEFORE the verb, so the window reaches back
87
- // past it — matching only the verb→path span misses TASK_0008 entirely.
66
+ // past it — matching only the verb→path span misses a fenced spec entirely.
88
67
  const from = Math.max(0, (m.index ?? 0) - 90);
89
68
  const window = text.slice(from, (m.index ?? 0) + m[0].length);
90
69
  if (NEGATED_RE.test(window) || PROHIBITION_RE.test(window))
@@ -171,8 +150,9 @@ export function detachUnsatisfiableRequirements(args) {
171
150
  * pending paths its refined prompt writes. Run at the START of compose, so the
172
151
  * claimed obligation rides the same belt block every owned requirement does.
173
152
  *
174
- * First claimant wins (`inv-single-owner`): the entry stops being pending the
175
- * moment it is claimed, so a later task cannot take it as well.
153
+ * First claimant wins: `delete entry.pending` runs before the entry is retitled,
154
+ * so a later task finds nothing pending to take. The test named
155
+ * `inv-single-owner` pins that.
176
156
  */
177
157
  export function claimPendingRequirements(args) {
178
158
  const out = { ledger: args.ledger.map(o => ({ ...o })), actions: [] };
@@ -12,8 +12,10 @@
12
12
  * bare recommendation): a genuine open fork carrying a best-effort suggestion.
13
13
  * - 'api-synthesis' — the answer was ANSWERED, then DEMOTED because it names an
14
14
  * API identifier absent from the research and the question, in a namespace the
15
- * research covers (mx5 run 13: an invented `Bun.mkdirSync` reached requirements
16
- * AND the VERIFY block). The suggestion rides along for a HUMAN to judge.
15
+ * research covers. `Bun.mkdirSync` is the shape: bun-types declares no such
16
+ * member, but an answer naming it reads as authoritative and can reach both
17
+ * requirements and the VERIFY block. The suggestion rides along for a HUMAN
18
+ * to judge.
17
19
  * - 'integration' — an integration/build-wiring unknown no fetched doc grounded;
18
20
  * a wrong guess is a structural landmine, so the model's answer is offered as
19
21
  * a recommendation instead of being taken silently.
@@ -224,10 +224,10 @@ export function deriveTitle(refined) {
224
224
  }
225
225
  // ─── Display label ───────────────────────────────────────────────────────────
226
226
  //
227
- // `title` is stored in full (a refine GOAL paragraph can be 1000+ chars — see
228
- // the "no truncation at storage" contract in deriveTitle). These helpers shrink
229
- // it for status surfaces (widget head, /task list) WITHOUT touching what's
230
- // stored: the pipeline always reads the full title. A model-compressed `label`
227
+ // `title` is stored in full: `deriveTitle` returns the GOAL line whole, however
228
+ // long it is, and nothing clamps it on the way to disk. These helpers shrink it
229
+ // for status surfaces (widget head, /task list) WITHOUT touching what is stored —
230
+ // the pipeline always reads the full title. A model-compressed `label`
231
231
  // is preferred when present (see title-label.ts); otherwise we fall back to a
232
232
  // deterministic, word-boundary truncation so a label-less task still reads
233
233
  // cleanly.
@@ -46,8 +46,8 @@ export interface PhaseConfig {
46
46
  * that matters: it drops constraints research REFUTED from `refined`, critique
47
47
  * re-reads `refined` as GROUND TRUTH under a prompt that says CONSTRAINTS "MUST
48
48
  * be preserved", and `## refined prompt` on disk is deliberately left as refine
49
- * wrote it. A resume at critique used to hand the refuted constraint straight
50
- * back — the mx5 run-19 defect, restored by the very machinery that closed it.
49
+ * wrote it. A resume at critique hands the refuted constraint straight
50
+ * back — the defect, restored by the very machinery that closed it.
51
51
  *
52
52
  * The trail is returned rather than written so the replay cannot duplicate a
53
53
  * gate line the live run already recorded.
@@ -84,41 +84,41 @@ export declare function refineExistingFilesBlock(deps: PhaseDeps): Promise<strin
84
84
  export declare function phaseContractsBlock(deps: PhaseDeps): Promise<string>;
85
85
  /**
86
86
  * The carried-context blocks a GENERATIVE phase (refine, compose) receives: the
87
- * cross-slice contracts plus the carried cross-cutting requirements (mx5 run 11,
88
- * goals A/C — `.pi-tasks/requirements.md`, written at plan time). The verbatim
89
- * requirement quotes travel INTO every task's spec generation, so a mandated
90
- * methodology ("a test lands in the same change as each new route") reaches the
91
- * task's GOAL/CONSTRAINTS and its VERIFY a pointer back to the spec doc
92
- * recovered the dropped §10 in only 1 of ~6 applicable run-11 tasks; content
93
- * travels, pointers don't. Both blocks are '' outside their runs, so a bare
94
- * /task is byte-identical to before.
87
+ * cross-slice contracts plus the carried cross-cutting requirements
88
+ * (`.pi-tasks/requirements.md`, written at plan time). The verbatim requirement
89
+ * quotes travel INTO every task's spec generation, so a mandated methodology
90
+ * ("a test lands in the same change as each new route") reaches the task's
91
+ * GOAL/CONSTRAINTS and its VERIFY. Content travels; a pointer back to the spec
92
+ * doc does not. Both blocks are '' outside a /task-auto run, so a bare /task
93
+ * sees no change.
95
94
  */
96
95
  export declare function phaseCarriedBlocks(deps: PhaseDeps): Promise<string>;
97
96
  /**
98
- * DETACH (nexttask 2) — an owned requirement this task cannot satisfy, because a
97
+ * DETACH — an owned requirement this task cannot satisfy, because a
99
98
  * category freeze in the very spec that carries it covers the only file that
100
99
  * could, stops being this task's obligation and is released to whichever later
101
100
  * task writes that file.
102
101
  *
103
102
  * Runs at the LAST spec-producing step, where the pair first exists: the stamped
104
103
  * bullet is written one statement earlier by `appendOwnedConstraints`, and a
105
- * critique-time probe measured 0/40 because the stamp did not exist yet. It
106
- * never edits prose and never asks a model — the run-18 rewrite lever resolved
107
- * 11 of 20 pairs by DELETING the authoritative clause. The quote stays in the
108
- * ledger throughout; only its owner changes.
104
+ * critique-time probe would find nothing because the stamp does not exist yet.
105
+ * It never edits prose and never asks a model — a model asked to remove a
106
+ * contradiction can satisfy the request by DELETING the authoritative clause,
107
+ * which is not satisfaction of the requirement. The quote stays in the ledger
108
+ * throughout; only its owner changes.
109
109
  */
110
110
  export declare function resolveOwnedFreezeForThisTask(deps: PhaseDeps, spec: string): Promise<string>;
111
111
  /**
112
- * CLAIM (nexttask 2) — the other half. A requirement detached by an earlier task
112
+ * CLAIM — the other half. A requirement detached by an earlier task
113
113
  * becomes THIS task's own when its refined prompt says it writes the frozen
114
114
  * file. Run before compose builds its carried blocks, so the claimed obligation
115
115
  * rides the same belt every owned requirement does and the braces stamp it onto
116
116
  * this spec.
117
117
  *
118
- * The claimant is the only party that knows: at detach time the later tasks are
119
- * bare plan titles, and none of mx5 run 19's 26 titles contains the path. Over
120
- * the same run's 26 REFINED prompts, `writeIntent` picks out exactly the two
121
- * tasks that write the server file.
118
+ * The claimant is the only party that knows. At detach time the later tasks are
119
+ * bare plan titles, and a plan title names a slice of behaviour rather than a
120
+ * file. By its own compose a task has a REFINED prompt, which does say which
121
+ * files it will write and that is what `writeIntent` reads.
122
122
  */
123
123
  export declare function claimOwnedFreezeForThisTask(deps: PhaseDeps, refined: string): Promise<void>;
124
124
  export declare const phaseRefine: (deps: PhaseDeps, raw: string, planContext?: string) => Promise<string>;
@@ -127,10 +127,10 @@ export declare function phaseVerifyTooling(deps: PhaseDeps, research: string): P
127
127
  * The worker channels the APIS research worker is given.
128
128
  *
129
129
  * `pi-worker-search` + `pi-worker-fetch` ride along only when the configured
130
- * engine is usable (a keyless engine always is; brave needs its key). A tool
131
- * without a key just errors, and a weak model burns calls on it — while search
132
- * being ABSENT was structural in the other direction: three consecutive audited
133
- * runs made 0 search calls because the child literally did not have the tool.
130
+ * engine is usable. `searchConfigured` decides: exa and ddg are keyless and
131
+ * always usable, brave is usable only with its key. A keyless tool that errors
132
+ * on every call is something a weak model burns calls on; a tool the child was
133
+ * never handed is a channel it cannot use at all, however the prompt is worded.
134
134
  *
135
135
  * Both halves of "given a channel" — the tools string and the `-e` path — come
136
136
  * from the same rows, so they cannot disagree.
@@ -151,9 +151,9 @@ export declare const RESEARCH_SEARCH_HINT: string;
151
151
  * In-process guards loaded into the TOOLING worker only: block a re-read of any
152
152
  * file already read, and block any byte-identical grep/find/ls repeat, feeding
153
153
  * the model "you already have this, answer now" instead of letting it re-run.
154
- * TOOLING reads each file once and never needs an identical search twice in any
155
- * healthy recorded run, so neither rule has a legitimate false positive here.
156
- * See single-read-guard.ts.
154
+ * TOOLING's job is to name verification commands, so it has no reason to read a
155
+ * file twice or repeat a search byte for byte which is what makes both rules
156
+ * safe to arm HERE and nowhere else. See single-read-guard.ts.
157
157
  */
158
158
  export declare const SINGLE_READ_EXTENSION_PATH: string;
159
159
  /**
@@ -161,15 +161,13 @@ export declare const SINGLE_READ_EXTENSION_PATH: string;
161
161
  * cares about — never the per-file edit list. Big refined prompts embed a long
162
162
  * bulleted "fix these files" checklist *inside* the GOAL block; handing that to
163
163
  * a weak local model drags it into reading/grepping source it doesn't need and
164
- * it loops (TASK_0017: read(sql-adapter.ts) ×5 → loop-kill → fails the phase).
164
+ * it loops.
165
165
  * So scope TOOLING's view to the GOAL prose, truncated at the first bullet.
166
166
  *
167
167
  * Fallbacks, in order: no bare `GOAL` header (free-form refined) → the whole
168
168
  * refined unchanged; a GOAL block with no bullets → the full GOAL block. The
169
169
  * GOAL boundary is the next bare ALL-CAPS header (CONSTRAINTS, KNOWN-UNKNOWNS,
170
- * …) or end of text. Verified against every recorded refined prompt: the
171
- * bullet-heavy failure case drops 3319→329 chars with zero source-file
172
- * mentions; the rest are unchanged or only lightly trimmed.
170
+ * …) or end of text.
173
171
  */
174
172
  export declare function scopedToolingGoal(refined: string): string;
175
173
  export declare function phaseResearch(deps: PhaseDeps, refined: string): Promise<string>;
@@ -192,8 +190,6 @@ export declare function phaseGrill(deps: PhaseDeps, ctx: ExtensionCommandContext
192
190
  * the same place. The task file's `## refined prompt` is deliberately left as
193
191
  * refine wrote it; the drop is recorded on the `## gates` trail with both source
194
192
  * lines quoted, so the decision stays auditable after the fact.
195
- *
196
- * STEP 0 `scripts/refuted-constraint-baserate.ts`; A/B-1 `…-ab.ts` (PASS).
197
193
  */
198
194
  export declare function dropRefutedConstraints(deps: PhaseDeps, refined: string, research: string): Promise<string>;
199
195
  /**
@@ -213,11 +209,9 @@ export declare function phaseCritique(deps: PhaseDeps, spec: string, refined: st
213
209
  * An additional deterministic defect block, forced into the rewrite exactly
214
210
  * like the probes below and overriding a CLEAN triage the same way.
215
211
  *
216
- * This is the A/B seam for a probe that is not wired yet: the discipline
217
- * here is "wire only on PASS" (memory/prompt4-spec-urls-failed.md), so a
218
- * candidate probe has to be measurable through the SHIPPED critique path
219
- * rather than through a hand-copied replica of it, or the two arms differ by
220
- * more than the probe. Undefined in production.
212
+ * The seam exists so a candidate probe can be exercised through the SHIPPED
213
+ * critique path rather than through a hand-copied replica of it — otherwise a
214
+ * comparison differs by more than the probe. Undefined in production.
221
215
  */
222
216
  extraDefects?: string | null): Promise<string>;
223
217
  export declare function critiqueWithFallback(d: PhaseDeps, p: PhaseContext): Promise<string>;
@@ -225,8 +219,8 @@ export declare function critiqueWithFallback(d: PhaseDeps, p: PhaseContext): Pro
225
219
  * REFINE — restate the raw prompt as a bounded 4-section spec, then subtractively
226
220
  * strike any phantom runtime specifier (`bun:sql`) it carried up verbatim from the
227
221
  * spec doc, BEFORE it flows to research/grill/compose. An appended correction alone
228
- * loses: the affirmative survives into the composed GOAL and on to the implementer
229
- * (proven: compose re-leaks it 4/4). Rewriting the source so compose has nothing to
222
+ * loses: the affirmative survives into the composed GOAL and on to the
223
+ * implementer, because compose re-leaks it. Rewriting the source so compose has nothing to
230
224
  * contradict is the fix. Silent + no-op when nothing is wrong or the runtime's types
231
225
  * aren't installed.
232
226
  */
@@ -255,26 +249,25 @@ export declare function composePhase(d: PhaseDeps, p: PhaseContext): Promise<str
255
249
  * CRITIQUE — the last spec-producing step, and the two host-side corrections that
256
250
  * must run after it in THIS ORDER.
257
251
  *
258
- * BRACES (mx5 run 16): append any owned design obligation the spec still omits as a
259
- * CONSTRAINTS bullet. The belt block upstream is obeyed ~25% (measured); a host-side
252
+ * BRACES: append any owned design obligation the spec still omits as a
253
+ * CONSTRAINTS bullet. The belt block upstream is obeyed only sometimes; a host-side
260
254
  * append is obeyed by construction. Idempotent — quotes the spec already carries
261
255
  * (belt-obeying reps) are skipped.
262
256
  *
263
257
  * Then DETACH: an owned obligation whose only file this spec also FREEZES is
264
258
  * unsatisfiable here, so it moves to the pending task that writes that file rather
265
259
  * than shipping a requirement no one can meet. It MUST run after the append, because
266
- * the append is what writes the stamp the detach reads a critique-time probe
267
- * measured 0/40 because the stamp did not exist yet.
260
+ * the append is what writes the stamp the detach reads, so a critique-time probe
261
+ * would find nothing.
268
262
  */
269
263
  export declare function critiquePhase(d: PhaseDeps, p: PhaseContext): Promise<string>;
270
264
  /**
271
265
  * The pipeline, as a table with no bodies.
272
266
  *
273
267
  * Every row's `run` is a named exported function, so the COMPOSITION inside a
274
- * step which is where this codebase's recorded phase defects have lived, not in
275
- * the parts is drivable directly instead of only through a whole TaskRunner run.
276
- * The parts stay exported and separately covered; what changed is that the ORDER
277
- * they run in is now asserted by driving the row rather than retyped in a test.
268
+ * step is drivable directly instead of only through a whole TaskRunner run. That
269
+ * matters because a step's parts can each be correct while the order they run in
270
+ * is wrong see `runPhaseRow`, which is the surface that pins the order.
278
271
  */
279
272
  export declare const PHASES: PhaseConfig[];
280
273
  /**