@mjasnikovs/pi-task 0.38.28 → 0.38.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/dist/config/config.d.ts +70 -70
  2. package/dist/config/config.js +26 -35
  3. package/dist/config/extension-list.d.ts +6 -5
  4. package/dist/config/extension-list.js +3 -2
  5. package/dist/config/reasoning-args.d.ts +9 -7
  6. package/dist/config/reasoning-args.js +12 -10
  7. package/dist/config/reasoning.d.ts +44 -105
  8. package/dist/config/reasoning.js +27 -704
  9. package/dist/config/register.d.ts +34 -48
  10. package/dist/config/register.js +41 -51
  11. package/dist/config/tool-list.d.ts +16 -16
  12. package/dist/config/tool-list.js +1 -1
  13. package/dist/remote/bridge.d.ts +19 -10
  14. package/dist/remote/bridge.js +3 -2
  15. package/dist/remote/broadcast.js +3 -1
  16. package/dist/remote/events.js +12 -11
  17. package/dist/remote/history.d.ts +1 -1
  18. package/dist/remote/protocol.d.ts +6 -3
  19. package/dist/remote/protocol.js +2 -1
  20. package/dist/remote/push.d.ts +16 -16
  21. package/dist/remote/push.js +27 -27
  22. package/dist/remote/register.d.ts +3 -3
  23. package/dist/remote/register.js +17 -19
  24. package/dist/remote/server.d.ts +9 -8
  25. package/dist/remote/server.js +15 -14
  26. package/dist/remote/session-state.d.ts +5 -4
  27. package/dist/remote/session-state.js +8 -5
  28. package/dist/remote/sw.d.ts +7 -6
  29. package/dist/remote/sw.js +7 -6
  30. package/dist/remote/tailscale.d.ts +4 -2
  31. package/dist/remote/tailscale.js +4 -2
  32. package/dist/remote/ui-highlight.js +6 -5
  33. package/dist/remote/ui-render.js +4 -4
  34. package/dist/remote/ui-script.js +24 -24
  35. package/dist/remote/ui-styles.d.ts +1 -1
  36. package/dist/remote/ui-styles.js +10 -13
  37. package/dist/remote/ui-tools.js +9 -6
  38. package/dist/shared/child-extensions.d.ts +29 -17
  39. package/dist/shared/child-extensions.js +29 -17
  40. package/dist/shared/child-output.d.ts +30 -24
  41. package/dist/shared/child-output.js +25 -17
  42. package/dist/shared/child-process.d.ts +47 -40
  43. package/dist/shared/child-process.js +50 -59
  44. package/dist/shared/command-watchdog.d.ts +22 -16
  45. package/dist/shared/command-watchdog.js +28 -21
  46. package/dist/shared/fs-text.d.ts +16 -10
  47. package/dist/shared/fs-text.js +16 -10
  48. package/dist/shared/git-runner.d.ts +25 -25
  49. package/dist/shared/git-runner.js +25 -25
  50. package/dist/shared/leaked-tool-call.d.ts +17 -11
  51. package/dist/shared/leaked-tool-call.js +23 -15
  52. package/dist/shared/model-endpoint.d.ts +29 -16
  53. package/dist/shared/model-endpoint.js +33 -21
  54. package/dist/shared/pi-invocation.d.ts +7 -4
  55. package/dist/shared/pi-invocation.js +12 -7
  56. package/dist/shared/pkg-version.d.ts +13 -5
  57. package/dist/shared/pkg-version.js +13 -5
  58. package/dist/shared/reasoning-capability.d.ts +35 -24
  59. package/dist/shared/reasoning-capability.js +35 -24
  60. package/dist/shared/stream-watchdog.d.ts +60 -44
  61. package/dist/shared/stream-watchdog.js +62 -45
  62. package/dist/task/accept-debt.d.ts +41 -43
  63. package/dist/task/accept-debt.js +73 -65
  64. package/dist/task/api-synthesis.d.ts +24 -21
  65. package/dist/task/api-synthesis.js +32 -26
  66. package/dist/task/apis-contract.d.ts +32 -64
  67. package/dist/task/apis-contract.js +32 -64
  68. package/dist/task/artifact-closure.d.ts +27 -13
  69. package/dist/task/artifact-closure.js +95 -67
  70. package/dist/task/auto-commit.d.ts +46 -35
  71. package/dist/task/auto-commit.js +51 -38
  72. package/dist/task/auto-io.d.ts +45 -25
  73. package/dist/task/auto-io.js +57 -29
  74. package/dist/task/auto-orchestrator.d.ts +26 -24
  75. package/dist/task/auto-orchestrator.js +178 -162
  76. package/dist/task/auto-prompts.d.ts +36 -24
  77. package/dist/task/auto-prompts.js +40 -26
  78. package/dist/task/autofix-ledger.d.ts +27 -25
  79. package/dist/task/autofix-ledger.js +29 -26
  80. package/dist/task/batch-test-task.d.ts +20 -12
  81. package/dist/task/batch-test-task.js +67 -60
  82. package/dist/task/boot-probe.d.ts +60 -44
  83. package/dist/task/boot-probe.js +91 -72
  84. package/dist/task/cancel-input.d.ts +30 -16
  85. package/dist/task/cancel-input.js +20 -11
  86. package/dist/task/cancel-points.d.ts +27 -20
  87. package/dist/task/cancel-points.js +30 -22
  88. package/dist/task/child-runner.d.ts +46 -51
  89. package/dist/task/child-runner.js +48 -49
  90. package/dist/task/child-status.d.ts +23 -16
  91. package/dist/task/child-status.js +23 -16
  92. package/dist/task/clamp-output.js +12 -5
  93. package/dist/task/command-run.d.ts +31 -28
  94. package/dist/task/command-run.js +44 -35
  95. package/dist/task/command-shrink.d.ts +25 -18
  96. package/dist/task/command-shrink.js +37 -31
  97. package/dist/task/command-watchdog.d.ts +9 -6
  98. package/dist/task/command-watchdog.js +21 -15
  99. package/dist/task/context-attribution.d.ts +34 -26
  100. package/dist/task/context-attribution.js +34 -26
  101. package/dist/task/context-silence.d.ts +39 -29
  102. package/dist/task/context-silence.js +35 -25
  103. package/dist/task/context-usage.d.ts +25 -7
  104. package/dist/task/context-usage.js +21 -6
  105. package/dist/task/contracts.d.ts +8 -4
  106. package/dist/task/contracts.js +25 -17
  107. package/dist/task/coverage-loop.d.ts +22 -18
  108. package/dist/task/coverage-loop.js +35 -30
  109. package/dist/task/critique-probes.d.ts +13 -14
  110. package/dist/task/critique-probes.js +50 -39
  111. package/dist/task/debug-log.d.ts +13 -5
  112. package/dist/task/debug-log.js +32 -20
  113. package/dist/task/decompose-fidelity.d.ts +11 -9
  114. package/dist/task/decompose-fidelity.js +38 -33
  115. package/dist/task/decompose-granularity.d.ts +41 -38
  116. package/dist/task/decompose-granularity.js +41 -38
  117. package/dist/task/deep-render-check.d.ts +22 -14
  118. package/dist/task/deep-render-check.js +40 -31
  119. package/dist/task/dropped-input.d.ts +12 -7
  120. package/dist/task/dropped-input.js +5 -2
  121. package/dist/task/enforce-attribution.d.ts +38 -47
  122. package/dist/task/enforce-attribution.js +46 -52
  123. package/dist/task/enforce-guidelines.d.ts +31 -20
  124. package/dist/task/enforce-guidelines.js +32 -21
  125. package/dist/task/enrichment.d.ts +7 -2
  126. package/dist/task/enrichment.js +26 -14
  127. package/dist/task/env-notes.d.ts +16 -7
  128. package/dist/task/env-notes.js +48 -31
  129. package/dist/task/env-template-closure.d.ts +4 -4
  130. package/dist/task/env-template-closure.js +42 -34
  131. package/dist/task/external-context.d.ts +28 -21
  132. package/dist/task/external-context.js +17 -12
  133. package/dist/task/failure-classifier.d.ts +4 -5
  134. package/dist/task/failure-classifier.js +6 -7
  135. package/dist/task/file-inventory.d.ts +15 -11
  136. package/dist/task/file-inventory.js +25 -22
  137. package/dist/task/final-gate-fix.d.ts +74 -86
  138. package/dist/task/final-gate-fix.js +97 -116
  139. package/dist/task/final-gate-progress.d.ts +29 -46
  140. package/dist/task/final-gate-progress.js +40 -51
  141. package/dist/task/final-gate.d.ts +64 -97
  142. package/dist/task/final-gate.js +192 -199
  143. package/dist/task/fix-child.d.ts +21 -27
  144. package/dist/task/fix-child.js +21 -27
  145. package/dist/task/foreign-path.d.ts +6 -5
  146. package/dist/task/foreign-path.js +0 -0
  147. package/dist/task/frozen-conflict.d.ts +9 -10
  148. package/dist/task/frozen-conflict.js +61 -64
  149. package/dist/task/frozen-path-guard.d.ts +35 -14
  150. package/dist/task/frozen-path-guard.js +56 -39
  151. package/dist/task/gate-child.d.ts +27 -28
  152. package/dist/task/gate-child.js +37 -35
  153. package/dist/task/gate-deps.d.ts +34 -27
  154. package/dist/task/gate-deps.js +169 -159
  155. package/dist/task/gate-tally.d.ts +77 -80
  156. package/dist/task/gate-tally.js +65 -68
  157. package/dist/task/git-state-guard.d.ts +15 -11
  158. package/dist/task/git-state-guard.js +76 -66
  159. package/dist/task/impl-widget.d.ts +25 -16
  160. package/dist/task/impl-widget.js +27 -17
  161. package/dist/task/implementation-thinking.d.ts +33 -31
  162. package/dist/task/implementation-thinking.js +5 -6
  163. package/dist/task/implementation-turn.d.ts +34 -31
  164. package/dist/task/implementation-turn.js +29 -27
  165. package/dist/task/inline-markdown.d.ts +20 -7
  166. package/dist/task/inline-markdown.js +15 -6
  167. package/dist/task/launch-config-gap.js +25 -39
  168. package/dist/task/launch-contract.d.ts +18 -21
  169. package/dist/task/launch-contract.js +28 -30
  170. package/dist/task/launch-manifest.d.ts +6 -2
  171. package/dist/task/launch-manifest.js +35 -34
  172. package/dist/task/ledger.js +16 -14
  173. package/dist/task/lint-fix.d.ts +6 -8
  174. package/dist/task/lint-fix.js +67 -69
  175. package/dist/task/loop-detector.d.ts +9 -8
  176. package/dist/task/loop-detector.js +16 -12
  177. package/dist/task/mid-run-input.d.ts +17 -15
  178. package/dist/task/mid-run-input.js +17 -15
  179. package/dist/task/orchestrator.d.ts +24 -28
  180. package/dist/task/orchestrator.js +62 -64
  181. package/dist/task/orientation.d.ts +18 -23
  182. package/dist/task/orientation.js +24 -31
  183. package/dist/task/owned-freeze-conflict.d.ts +21 -20
  184. package/dist/task/owned-freeze-conflict.js +52 -85
  185. package/dist/task/owned-freeze-reassign.d.ts +40 -60
  186. package/dist/task/owned-freeze-reassign.js +41 -61
  187. package/dist/task/parsers.d.ts +4 -2
  188. package/dist/task/parsers.js +4 -4
  189. package/dist/task/phases.d.ts +41 -48
  190. package/dist/task/phases.js +180 -248
  191. package/dist/task/plan-io.d.ts +6 -7
  192. package/dist/task/plan-io.js +6 -7
  193. package/dist/task/plan-orchestrator.d.ts +10 -8
  194. package/dist/task/plan-orchestrator.js +14 -10
  195. package/dist/task/plan-prompts.d.ts +6 -5
  196. package/dist/task/plan-prompts.js +6 -5
  197. package/dist/task/plan-readonly.d.ts +4 -5
  198. package/dist/task/plan-readonly.js +4 -5
  199. package/dist/task/plan-rounds.d.ts +17 -29
  200. package/dist/task/plan-rounds.js +21 -34
  201. package/dist/task/plan-session.d.ts +58 -72
  202. package/dist/task/plan-session.js +61 -83
  203. package/dist/task/probe-gaming.d.ts +28 -27
  204. package/dist/task/probe-gaming.js +0 -0
  205. package/dist/task/prohibition-probe.d.ts +14 -16
  206. package/dist/task/prompts.d.ts +3 -4
  207. package/dist/task/prompts.js +17 -26
  208. package/dist/task/qa-transcript.d.ts +15 -22
  209. package/dist/task/qa-transcript.js +15 -21
  210. package/dist/task/question-box.d.ts +17 -13
  211. package/dist/task/question-box.js +19 -15
  212. package/dist/task/question-dedup.d.ts +6 -7
  213. package/dist/task/question-dedup.js +13 -14
  214. package/dist/task/question-dialog.d.ts +22 -32
  215. package/dist/task/question-dialog.js +22 -32
  216. package/dist/task/question-source.d.ts +18 -44
  217. package/dist/task/question-source.js +22 -51
  218. package/dist/task/refuted-constraint.d.ts +11 -31
  219. package/dist/task/refuted-constraint.js +27 -51
  220. package/dist/task/regenerable-artifacts.d.ts +12 -31
  221. package/dist/task/regenerable-artifacts.js +12 -31
  222. package/dist/task/render-check.d.ts +11 -22
  223. package/dist/task/render-check.js +33 -46
  224. package/dist/task/repo-health-check.d.ts +10 -14
  225. package/dist/task/repo-health-check.js +17 -23
  226. package/dist/task/requirements.d.ts +38 -71
  227. package/dist/task/requirements.js +78 -126
  228. package/dist/task/research-fanout-budget.d.ts +51 -88
  229. package/dist/task/research-fanout-budget.js +51 -88
  230. package/dist/task/research-worker.d.ts +33 -36
  231. package/dist/task/research-worker.js +39 -61
  232. package/dist/task/resume-gap.d.ts +14 -15
  233. package/dist/task/root-cause-repair.d.ts +9 -9
  234. package/dist/task/root-cause-repair.js +28 -40
  235. package/dist/task/run-bracket.d.ts +10 -13
  236. package/dist/task/run-end.d.ts +12 -22
  237. package/dist/task/run-end.js +8 -16
  238. package/dist/task/run-final-gate.d.ts +19 -21
  239. package/dist/task/run-final-gate.js +62 -80
  240. package/dist/task/runner-globs.d.ts +12 -13
  241. package/dist/task/runner-globs.js +12 -13
  242. package/dist/task/runner-resolve.d.ts +9 -9
  243. package/dist/task/runner-resolve.js +22 -23
  244. package/dist/task/script-escape.d.ts +10 -12
  245. package/dist/task/script-escape.js +13 -14
  246. package/dist/task/serve-entry.d.ts +1 -1
  247. package/dist/task/serve-entry.js +22 -25
  248. package/dist/task/service-blocks.js +4 -2
  249. package/dist/task/shipped-source.d.ts +11 -29
  250. package/dist/task/shipped-source.js +11 -29
  251. package/dist/task/skip-escape.js +10 -14
  252. package/dist/task/spec-urls.d.ts +26 -65
  253. package/dist/task/spec-urls.js +26 -65
  254. package/dist/task/spec-validation.d.ts +17 -20
  255. package/dist/task/spec-validation.js +17 -20
  256. package/dist/task/stall-detector.d.ts +23 -30
  257. package/dist/task/stall-detector.js +23 -30
  258. package/dist/task/stream-watchdog.d.ts +14 -12
  259. package/dist/task/stream-watchdog.js +14 -12
  260. package/dist/task/substitution-probe.d.ts +17 -20
  261. package/dist/task/substitution-probe.js +17 -20
  262. package/dist/task/task-gates.d.ts +36 -41
  263. package/dist/task/task-gates.js +95 -106
  264. package/dist/task/task-io.d.ts +4 -4
  265. package/dist/task/task-io.js +4 -4
  266. package/dist/task/task-parsers.js +4 -3
  267. package/dist/task/task-provenance.d.ts +2 -2
  268. package/dist/task/task-provenance.js +11 -13
  269. package/dist/task/task-types.d.ts +4 -3
  270. package/dist/task/terminal-outcome.d.ts +14 -16
  271. package/dist/task/terminal-outcome.js +12 -14
  272. package/dist/task/test-assembly.d.ts +13 -20
  273. package/dist/task/test-assembly.js +13 -20
  274. package/dist/task/timings.d.ts +5 -3
  275. package/dist/task/timings.js +5 -3
  276. package/dist/task/title-label.d.ts +9 -4
  277. package/dist/task/title-label.js +9 -4
  278. package/dist/task/type-only-answer.d.ts +44 -52
  279. package/dist/task/type-only-answer.js +44 -52
  280. package/dist/task/unfailable-command.d.ts +18 -24
  281. package/dist/task/unfailable-command.js +21 -27
  282. package/dist/task/unknown-routing.d.ts +10 -4
  283. package/dist/task/unknown-routing.js +10 -4
  284. package/dist/task/user-directives.d.ts +5 -8
  285. package/dist/task/user-directives.js +5 -8
  286. package/dist/task/verify-quality.d.ts +18 -22
  287. package/dist/task/verify-quality.js +45 -46
  288. package/dist/task/verify-reconcile.d.ts +15 -10
  289. package/dist/task/verify-reconcile.js +45 -43
  290. package/dist/task/verify-resolution.d.ts +24 -20
  291. package/dist/task/verify-resolution.js +51 -50
  292. package/dist/task/verify-work.d.ts +59 -66
  293. package/dist/task/verify-work.js +101 -138
  294. package/dist/task/widget.d.ts +15 -14
  295. package/dist/task/widget.js +22 -17
  296. package/dist/task/wiring-claims.d.ts +25 -32
  297. package/dist/task/wiring-claims.js +30 -35
  298. package/dist/task/write-guard.d.ts +39 -39
  299. package/dist/task/write-guard.js +48 -51
  300. package/dist/task/yolo.d.ts +34 -30
  301. package/dist/task/yolo.js +42 -37
  302. package/dist/workers/abstention.d.ts +21 -41
  303. package/dist/workers/abstention.js +27 -48
  304. package/dist/workers/brave-search.d.ts +4 -3
  305. package/dist/workers/brave-search.js +5 -2
  306. package/dist/workers/brave-warning.d.ts +7 -4
  307. package/dist/workers/brave-warning.js +19 -7
  308. package/dist/workers/ddg-search.d.ts +6 -6
  309. package/dist/workers/ddg-search.js +18 -12
  310. package/dist/workers/docs-cache.js +5 -2
  311. package/dist/workers/docs-chunk.d.ts +30 -37
  312. package/dist/workers/docs-chunk.js +37 -41
  313. package/dist/workers/docs-core.d.ts +28 -44
  314. package/dist/workers/docs-core.js +25 -44
  315. package/dist/workers/docs-index.js +4 -3
  316. package/dist/workers/docs-lookup.d.ts +15 -22
  317. package/dist/workers/docs-lookup.js +12 -21
  318. package/dist/workers/docs-project.d.ts +15 -9
  319. package/dist/workers/docs-project.js +17 -10
  320. package/dist/workers/docs-resolve.d.ts +19 -20
  321. package/dist/workers/docs-resolve.js +35 -32
  322. package/dist/workers/docs-retrieve.d.ts +5 -6
  323. package/dist/workers/docs-retrieve.js +18 -15
  324. package/dist/workers/exa-search.d.ts +9 -6
  325. package/dist/workers/exa-search.js +23 -12
  326. package/dist/workers/fetch-core.d.ts +13 -16
  327. package/dist/workers/fetch-core.js +23 -23
  328. package/dist/workers/focused-extractor.d.ts +12 -12
  329. package/dist/workers/focused-extractor.js +16 -19
  330. package/dist/workers/html-clean.js +24 -14
  331. package/dist/workers/http-request.d.ts +28 -20
  332. package/dist/workers/http-request.js +22 -17
  333. package/dist/workers/npm-version.d.ts +28 -11
  334. package/dist/workers/npm-version.js +24 -15
  335. package/dist/workers/phantom-imports.d.ts +15 -12
  336. package/dist/workers/phantom-imports.js +30 -24
  337. package/dist/workers/pi-worker-core.d.ts +86 -54
  338. package/dist/workers/pi-worker-core.js +112 -112
  339. package/dist/workers/pi-worker-docs.d.ts +24 -19
  340. package/dist/workers/pi-worker-docs.js +67 -76
  341. package/dist/workers/pi-worker-fetch.d.ts +7 -3
  342. package/dist/workers/pi-worker-fetch.js +27 -19
  343. package/dist/workers/pi-worker-search.js +12 -8
  344. package/dist/workers/pi-worker.d.ts +9 -4
  345. package/dist/workers/pi-worker.js +23 -10
  346. package/dist/workers/reasoning-warning.d.ts +18 -17
  347. package/dist/workers/reasoning-warning.js +22 -20
  348. package/dist/workers/research-cache.js +50 -78
  349. package/dist/workers/search-core.js +7 -5
  350. package/dist/workers/search-types.d.ts +10 -9
  351. package/dist/workers/search-types.js +9 -8
  352. package/dist/workers/session-hint.d.ts +13 -14
  353. package/dist/workers/session-hint.js +8 -9
  354. package/dist/workers/shared.d.ts +21 -25
  355. package/dist/workers/shared.js +0 -0
  356. package/dist/workers/single-read-extension.d.ts +14 -7
  357. package/dist/workers/single-read-extension.js +14 -7
  358. package/dist/workers/single-read-guard.d.ts +25 -28
  359. package/dist/workers/single-read-guard.js +32 -32
  360. package/dist/workers/typeonly-log.d.ts +12 -9
  361. package/dist/workers/typeonly-log.js +29 -33
  362. package/dist/workers/worker-channels.d.ts +15 -23
  363. package/dist/workers/worker-channels.js +15 -23
  364. package/dist/workers/worker-failure.d.ts +38 -46
  365. package/dist/workers/worker-failure.js +31 -39
  366. package/dist/workers/worker-kill.d.ts +25 -26
  367. package/dist/workers/worker-kill.js +16 -19
  368. package/dist/workers/worker-profiles.d.ts +43 -53
  369. package/dist/workers/worker-profiles.js +30 -38
  370. package/package.json +10 -8
@@ -1,36 +1,12 @@
1
1
  /**
2
- * Where the NEXT question comes from — the other half of `question-dialog.ts`.
2
+ * Where the NEXT question comes from — the other half of `question-dialog.ts`,
3
+ * which owns the ANSWER side.
3
4
  *
4
- * `question-dialog.ts` unified the ANSWER side of the adaptive dialogs (the picker
5
- * cards, the reply mapping) and its own docstring makes the argument for doing so:
6
- * *"It was written three times… the two mirrors were never converted, and they had
7
- * already drifted apart in three ways… The next edit to any of them is where the
8
- * bug lands."* The QUESTION side — generate → parse → pick the real question →
9
- * dedupe → spend one corrective re-prompt → yield or exhaust — was left behind,
10
- * and it had drifted between the two loops that use the SAME parser on the SAME
11
- * prompt format (`plan-prompts.ts` says `parseClarifyList` parses it "UNCHANGED";
12
- * `auto-prompts.ts` specifies the identical shape).
13
- *
14
- * The five drifts, all in clarify's favour of being wrong:
15
- *
16
- * 1. **Which entry is the question.** `parseClarifyList` pushes an entry for
17
- * EVERY numbered line, and the local model writes numbered analysis notes
18
- * before the question it was asked for (measured live). `pickQuestion` prefers
19
- * the first entry carrying a `SUGGESTED:` line; clarify took `parsed[0]`
20
- * blindly, showing the note as the question and losing the recommendation
21
- * attached further down.
22
- * 2. **NONE vs unparseable.** The parser returns `[]` for both. Clarify's
23
- * `if (parsed.length === 0) break` ended the whole clarify — and decomposed the
24
- * feature with ZERO clarifications — on a formatting slip.
25
- * 3. **A re-typed sentinel.** `isNoneReply`'s regex was a byte-identical second
26
- * copy of the parser's own.
27
- * 4. **Missing SUGGESTED** bought one corrective re-prompt in plan and none in
28
- * clarify, so clarify showed a card-less question.
29
- * 5. **The deferral guard.** It exists because an accepted "clarify with the user
30
- * before proceeding" rode into `/task`'s handoff AS AN AUTHORITATIVE DECISION
31
- * and produced a task whose VERIFY asserted no source file had changed.
32
- * Clarify's answers ride into the decompose prompt and the AUTO file with
33
- * exactly the same authority, and had no guard.
5
+ * One state machine: generate parse → pick the real question dedupe → spend
6
+ * one corrective re-prompt yield or exhaust. Two loops drive it, `/task-auto`'s
7
+ * clarify and `/task-plan`, and they use the SAME parser on the SAME prompt format
8
+ * plan-prompts.ts says `parseClarifyList` parses its output UNCHANGED, and
9
+ * auto-prompts.ts specifies the identical shape.
34
10
  *
35
11
  * NOT unified here: grill's generation loop. It uses a different parser
36
12
  * (`parseGrillQuestions`, which yields bare strings) and has no `SUGGESTED` at
@@ -43,11 +19,9 @@ import { parseClarifyList } from './parsers.js';
43
19
  import { DUP_REPROMPT_HINT, isDuplicateQuestion, MAX_DUP_STRIKES } from './question-dedup.js';
44
20
  import { stripInlineMarkdown } from './inline-markdown.js';
45
21
  /**
46
- * The cap on distinct questions ONE adaptive dialog may ask.
47
- *
48
- * Clarify and plan each declared their own `8`, linked only by a comment saying
49
- * "matches /task-auto's MAX_CLARIFY_QUESTIONS, for the same reason". They bound
50
- * the same thing for the same reason; this is that reason, once.
22
+ * Default cap on distinct questions ONE adaptive dialog may ask. Both live
23
+ * callers pass their own constant of the same value instead
24
+ * (MAX_CLARIFY_QUESTIONS, MAX_PLAN_QUESTIONS); this is what an unset `cap` gets.
51
25
  */
52
26
  export const MAX_DIALOG_QUESTIONS = 8;
53
27
  /** True when the reply is the deliberate "nothing left to ask" sentinel, as
@@ -58,13 +32,12 @@ export function isNoneReply(raw) {
58
32
  /**
59
33
  * Which of the parsed entries is the actual question.
60
34
  *
61
- * `parseClarifyList` turns EVERY numbered line into an entry, and the local model
62
- * sometimes writes a numbered analysis note or two before the question it was
63
- * asked for (measured live: the first numbered line was a note like
64
- * "1. gateDebugWriter in orchestrator.ts wraps a raw append function"). Taking
65
- * entry 0 blindly then shows the note as the question and loses the SUGGESTED line
66
- * attached further down. The prompt requires exactly one SUGGESTED, and the parser
67
- * attaches it to the entry it follows.
35
+ * `parseClarifyList` turns EVERY numbered line into an entry, and a model that
36
+ * writes a numbered analysis note before the question it was asked for produces
37
+ * more than one. Taking entry 0 blindly then shows the note as the question and
38
+ * loses the SUGGESTED line attached further down. The prompt requires exactly one
39
+ * SUGGESTED, and the parser attaches it to the entry it follows, so preferring the
40
+ * entry that HAS one lands on the real question.
68
41
  */
69
42
  export function pickQuestion(parsed) {
70
43
  return parsed.find(q => q.suggested !== undefined && q.suggested.length > 0) ?? parsed[0];
@@ -98,17 +71,16 @@ export function makeQuestionSource(deps) {
98
71
  const parsed = parseClarifyList(raw);
99
72
  if (parsed.length === 0) {
100
73
  // `[]` means BOTH "deliberate NONE" and "could not parse". Ending
101
- // the dialog on the second is how a formatting slip becomes a
102
- // feature decomposed with zero clarifications.
74
+ // the dialog on the second would decompose the feature with zero
75
+ // clarifications because of one formatting slip.
103
76
  if (!isNoneReply(raw) && hint === null) {
104
77
  deps.log?.('unparseable question reply — one format re-prompt');
105
78
  hint = deps.formatHint;
106
79
  continue;
107
80
  }
108
- // A SECOND unreadable reply is not a NONE. Recording it as one is
109
- // the very conflation this module exists to end — it would put
110
- // "model has no further questions" on the trail for a run where
111
- // the model produced two malformed replies.
81
+ // A SECOND unreadable reply is not a NONE: the caller is told
82
+ // 'unparseable', so nothing writes "model has no further
83
+ // questions" on a run that produced two malformed replies.
112
84
  if (!isNoneReply(raw)) {
113
85
  deps.log?.('second unparseable reply — giving up on this draw');
114
86
  hint = null;
@@ -163,8 +135,7 @@ export function makeQuestionSource(deps) {
163
135
  *
164
136
  * `/task-plan` lets the user ask the model a question or state a decision
165
137
  * mid-session; that is new context, so a generator that had struck out may now
166
- * have something novel. The plan loop reset its own `dupStrikes` at two sites
167
- * for exactly this; the budget lives here now, so the reset has to.
138
+ * have something novel.
168
139
  */
169
140
  function reopen() {
170
141
  dupStrikes = 0;
@@ -1,43 +1,22 @@
1
1
  /**
2
2
  * A refutation is a DELETION, not an addition.
3
3
  *
4
- * THE LEAD (mx5 run 19, `~/hub/mx5 @ dfbdd6f`, TASK_0001). Refine invented a
5
- * dependency the design explicitly rules out; the run's own research said so, in
6
- * writing, in the same file; the composed spec then turned the invention into a
7
- * capitalised prohibition against the design's own API:
4
+ * The failure this closes: refine writes a dependency into CONSTRAINTS that the
5
+ * design rules out, the run's own research says so in its CONTEXT section, and
6
+ * compose reads both and hardens the invention into a prohibition against the API
7
+ * the repo actually uses. An appended correction loses to the text it contradicts,
8
+ * because CONSTRAINTS is what the implementer is told is authoritative.
8
9
  *
9
- * :21 refine CONSTRAINTS "Add only new entries the task requires (e.g.,
10
- * `hono`, `bun-sql`-equivalent, …, `argon2`, …)"
11
- * :92 research CONTEXT "Password hashing uses `Bun.password` (built-in
12
- * argon2id) no external `argon2` or
13
- * `@node-rs/argon2` dependency needed despite the
14
- * task's mention of it."
15
- * :132 spec CONSTRAINTS "Do NOT use built-in `Bun.password` for hashing —
16
- * the refined task explicitly requires `argon2`."
17
- *
18
- * `argon2@^0.41.0` shipped as a runtime dependency of a repo that never imports
19
- * it, locked in by a VERIFY assertion, next to a spec telling the next
20
- * implementer not to use `Bun.sql` — the API the whole data layer is built on.
21
- *
22
- * This is `memory/phantom-correction-additive-not-subtractive.md` at spec scale:
23
- * the correction was APPENDED to research CONTEXT while the wrong text stayed in
24
- * refine's CONSTRAINTS, and CONSTRAINTS is what the implementer is told is
25
- * authoritative.
26
- *
27
- * THE LEVER. Deterministic detection, then a scoped removal, BEFORE compose sees
28
- * the refined task. Never a model rewrite: every model-rewrite lever at this seam
29
- * has resolved contradictions by deleting the AUTHORITATIVE side
30
- * (`memory/owned-freeze-critique-lever-refuted.md`, 11/20). This pass can only
31
- * delete a refine-invented token, and can never touch an owned line.
10
+ * So the correction is SUBTRACTIVE, and it runs before compose sees the refined
11
+ * task (phases.ts `composeCarry`). Never a model rewrite: this pass can only
12
+ * delete a refine-invented token, and it skips any line carrying the
13
+ * owned-requirement stamp.
32
14
  *
33
15
  * The match is lexical, never semantic: a research CONTEXT bullet refutes a
34
16
  * refine constraint when it carries one of a closed set of negation-of-need
35
17
  * shapes AROUND a backticked token, and that same token appears backticked in a
36
18
  * refine CONSTRAINTS line. Both sides are already separate strings in the task
37
19
  * file.
38
- *
39
- * STEP 0 (`scripts/refuted-constraint-baserate.ts`) measured the closed set over
40
- * every recorded task file in the corpus before any of it was wired.
41
20
  */
42
21
  export type Refutation = {
43
22
  /** The token as it appears inside the backticks, e.g. `argon2`. */
@@ -77,6 +56,7 @@ export type RefutationResult = {
77
56
  };
78
57
  /**
79
58
  * Apply every detected refutation to the refined prompt. Purely subtractive: the
80
- * result is always a character subsequence of the input (`inv-no-line-invention`).
59
+ * result is always a character subsequence of the input, which
60
+ * refuted-constraint.test.ts asserts under `inv-no-line-invention`.
81
61
  */
82
62
  export declare function applyRefutations(refined: string, research: string): RefutationResult;
@@ -1,43 +1,22 @@
1
1
  /**
2
2
  * A refutation is a DELETION, not an addition.
3
3
  *
4
- * THE LEAD (mx5 run 19, `~/hub/mx5 @ dfbdd6f`, TASK_0001). Refine invented a
5
- * dependency the design explicitly rules out; the run's own research said so, in
6
- * writing, in the same file; the composed spec then turned the invention into a
7
- * capitalised prohibition against the design's own API:
4
+ * The failure this closes: refine writes a dependency into CONSTRAINTS that the
5
+ * design rules out, the run's own research says so in its CONTEXT section, and
6
+ * compose reads both and hardens the invention into a prohibition against the API
7
+ * the repo actually uses. An appended correction loses to the text it contradicts,
8
+ * because CONSTRAINTS is what the implementer is told is authoritative.
8
9
  *
9
- * :21 refine CONSTRAINTS "Add only new entries the task requires (e.g.,
10
- * `hono`, `bun-sql`-equivalent, …, `argon2`, …)"
11
- * :92 research CONTEXT "Password hashing uses `Bun.password` (built-in
12
- * argon2id) no external `argon2` or
13
- * `@node-rs/argon2` dependency needed despite the
14
- * task's mention of it."
15
- * :132 spec CONSTRAINTS "Do NOT use built-in `Bun.password` for hashing —
16
- * the refined task explicitly requires `argon2`."
17
- *
18
- * `argon2@^0.41.0` shipped as a runtime dependency of a repo that never imports
19
- * it, locked in by a VERIFY assertion, next to a spec telling the next
20
- * implementer not to use `Bun.sql` — the API the whole data layer is built on.
21
- *
22
- * This is `memory/phantom-correction-additive-not-subtractive.md` at spec scale:
23
- * the correction was APPENDED to research CONTEXT while the wrong text stayed in
24
- * refine's CONSTRAINTS, and CONSTRAINTS is what the implementer is told is
25
- * authoritative.
26
- *
27
- * THE LEVER. Deterministic detection, then a scoped removal, BEFORE compose sees
28
- * the refined task. Never a model rewrite: every model-rewrite lever at this seam
29
- * has resolved contradictions by deleting the AUTHORITATIVE side
30
- * (`memory/owned-freeze-critique-lever-refuted.md`, 11/20). This pass can only
31
- * delete a refine-invented token, and can never touch an owned line.
10
+ * So the correction is SUBTRACTIVE, and it runs before compose sees the refined
11
+ * task (phases.ts `composeCarry`). Never a model rewrite: this pass can only
12
+ * delete a refine-invented token, and it skips any line carrying the
13
+ * owned-requirement stamp.
32
14
  *
33
15
  * The match is lexical, never semantic: a research CONTEXT bullet refutes a
34
16
  * refine constraint when it carries one of a closed set of negation-of-need
35
17
  * shapes AROUND a backticked token, and that same token appears backticked in a
36
18
  * refine CONSTRAINTS line. Both sides are already separate strings in the task
37
19
  * file.
38
- *
39
- * STEP 0 (`scripts/refuted-constraint-baserate.ts`) measured the closed set over
40
- * every recorded task file in the corpus before any of it was wired.
41
20
  */
42
21
  /** Bare ALL-CAPS section header, the boundary convention used across the
43
22
  * refined prompt and every research section. */
@@ -53,9 +32,10 @@ const TOKEN_LIST = `${TOKEN}(?:(?:\\s*,\\s*|\\s+or\\s+|\\s+and\\s+)${TOKEN})*`;
53
32
  * ("no `@node-rs/argon2` dependency — we use `argon2`") can only ever refute the
54
33
  * one inside the phrase.
55
34
  *
56
- * Kept deliberately small. `inv-precision` is a FAIL of the whole task on one
57
- * false drop, so a shape earns its place here only by surviving a hand-read of
58
- * every corpus hit it produces.
35
+ * Kept deliberately small. One false drop silently removes a real constraint, so
36
+ * a shape belongs here only when it cannot be read as anything but a claim that
37
+ * the dependency is unnecessary. refuted-constraint.test.ts pins the rejected
38
+ * shapes under `inv-precision`.
59
39
  */
60
40
  const NEGATIONS = [
61
41
  {
@@ -71,29 +51,25 @@ const NEGATIONS = [
71
51
  {
72
52
  // "no `argon2` dependency is needed".
73
53
  //
74
- // The trailing need-negation is NOT optional, and STEP 0 is why. The
75
- // first cut of this pattern was the bare "no `X` dependency", and it
76
- // fired 300 times in 306 corpus hits — every one of them on a
77
- // MANIFEST-STATE bullet that says the exact opposite of a refutation:
54
+ // The trailing need-negation is NOT optional. Without it the pattern is
55
+ // the bare "no `X` dependency", which matches MANIFEST-STATE bullets that
56
+ // say the exact opposite of a refutation:
78
57
  //
79
58
  // "`package.json` currently lists no `hono` or `@hono/zod-validator`
80
- // dependencies; they MUST BE ADDED at versions 4.12.27 and 0.8.0"
59
+ // dependencies; they MUST BE ADDED"
81
60
  // "`package.json` has … and no `sharp` dependency — MUST ADD `sharp`
82
61
  // as devDependency"
83
62
  //
84
- // Dropping on that signal mutilated real constraints ("use with the
85
- // shared `loginSchema`"). "The repo does not have X yet" is a fact about
86
- // the tree; "X is not needed" is a claim about the task. Only the second
87
- // one refutes anything.
63
+ // "The repo does not have X yet" is a fact about the tree; "X is not
64
+ // needed" is a claim about the task. Only the second refutes anything.
88
65
  name: 'no-dep-needed',
89
66
  re: new RegExp(`\\bno\\s+(${TOKEN_LIST})\\s+dependenc(?:y|ies)\\s+(?:is\\s+|are\\s+)?(?:needed|required|necessary)\\b`, 'i')
90
67
  },
91
68
  // The two shapes below name no dependency noun of their own, so they carry a
92
- // DEP_WORD guard. STEP 0's near-miss census is the reason: "does not require"
93
- // appears in 412 corpus CONTEXT bullets, and the shape is overwhelmingly
94
- // prose about behaviour, not dependencies"the `GET /api/listings`
95
- // endpoint does NOT require authentication for the `mine` filter". Token
96
- // adjacency alone would eventually reach a backticked API expression there.
69
+ // DEP_WORD guard. "does not require" is mostly prose about behaviour, not
70
+ // dependencies "the `GET /api/listings` endpoint does NOT require
71
+ // authentication for the `mine` filter"and token adjacency alone would
72
+ // eventually reach a backticked API expression inside such a bullet.
97
73
  {
98
74
  // "`argon2` is not needed" / "`argon2` and `sharp` are not required"
99
75
  name: 'not-needed',
@@ -109,9 +85,8 @@ const NEGATIONS = [
109
85
  ];
110
86
  /** The claim has to be ABOUT a dependency for a dependency to be dropped. */
111
87
  const DEP_WORD = /\bdependenc(?:y|ies)\b|\bnpm\b|\bpackages?\b|\bdevDependenc(?:y|ies)\b/i;
112
- /** The owned-requirement stamp (requirements.ts:813). A line carrying it is a
113
- * design-sourced obligation and is NEVER refutable by research — this is the
114
- * guard that keeps this pass out of nexttask 2's failure mode. */
88
+ /** The owned-requirement stamp requirements.ts writes onto every design-sourced
89
+ * obligation. A line carrying it is NEVER refutable by research. */
115
90
  const OWNED_MARKER = 'owned requirement from the source design';
116
91
  /** Section body between a bare ALL-CAPS header and the next one (or EOF). */
117
92
  export function extractCapsSection(text, heading) {
@@ -253,7 +228,8 @@ export function dropToken(line, token) {
253
228
  }
254
229
  /**
255
230
  * Apply every detected refutation to the refined prompt. Purely subtractive: the
256
- * result is always a character subsequence of the input (`inv-no-line-invention`).
231
+ * result is always a character subsequence of the input, which
232
+ * refuted-constraint.test.ts asserts under `inv-no-line-invention`.
257
233
  */
258
234
  export function applyRefutations(refined, research) {
259
235
  const refutations = detectRefutations(refined, research);
@@ -1,14 +1,10 @@
1
1
  /**
2
2
  * The one place that knows which repo paths are regenerable machine OUTPUT.
3
3
  *
4
- * This module exists because the knowledge was in exactly one module and two
5
- * others needed it (mx5 run 20). `git-state-guard.ts` knew `test-results/` was
6
- * regenerable and used it for VERDICT decisions only; `write-guard.ts`'s deletion
7
- * guard did not, so it rejected two whole fix attempts over three Playwright
8
- * failure screenshots — taking each attempt's real `src/client/api.test.tsx`
9
- * repair with them — and `auto-commit.ts` did not, so its blind `git add -A` is
10
- * how the screenshots became tracked in the first place. Three modules, one fact,
11
- * shared with neither of the two that needed it. Import from here; do not copy.
4
+ * Three call sites need the fact and all three import it from here rather than
5
+ * keeping a copy: `git-state-guard.ts` (verdicts), `write-guard.ts` (whether a
6
+ * deletion rejects the whole fix attempt) and `auto-commit.ts` (what the commit
7
+ * may newly track). Import from here; do not copy.
12
8
  *
13
9
  * TWO LISTS, and the split between them is the whole point.
14
10
  *
@@ -21,28 +17,12 @@
21
17
  * deliverable, so it is narrower, and `dist/`, `build/`, `.next/`, `.turbo/` and
22
18
  * `.svelte-kit/` are deliberately NOT in it.
23
19
  *
24
- * MEASURED over 269 git work trees under ~/hub, ~/tmp, ~/.cache
25
- * (`scripts/tracked-artifact-baserate.ts`, 2026-08-07):
26
- *
27
- * trees tracking any artifact path 33 (33 of 33 have .pi-tasks)
28
- * test-results/ 33 trees / 33 files
29
- * .last-run.json 33 trees / 33 files ← the SAME 33 files
30
- * dist/, build/, .next/, .turbo/, .svelte-kit/, playwright-report/,
31
- * coverage/, .nyc_output/, *.tsbuildinfo 0 trees
32
- *
33
- * So `test-results/` and `.last-run.json` are exempt on MEASUREMENT — they are the
34
- * only artifact paths this corpus tracks at all, and the one real episode is
35
- * exactly a tracked `test-results/` deletion. `playwright-report/`, `coverage/`,
36
- * `.nyc_output/` and `*.tsbuildinfo` are exempt BY CONSTRUCTION with zero corpus
37
- * evidence either way: none of the four has a hand-authored form, so there is no
38
- * version of them that is a deliverable. `dist/` and its family have exactly the
39
- * hand-authored form the other six lack — a published package's `dist/` IS the
40
- * shipped artifact — and with 0 tracked instances here the exemption would never
41
- * fire anyway, so it would buy nothing while carrying that risk.
42
- *
43
- * 32 of the 33 trees are one A/B harness's delivery trees built from a single mx5
44
- * DESIGN/PROJECT.md: 32 independent RUNS of one project shape, which is evidence
45
- * of reproducibility and not of breadth. The 33rd is mx5 itself.
20
+ * The line between the two lists is whether the path has a HAND-AUTHORED form.
21
+ * `test-results/`, `playwright-report/`, `coverage/`, `.nyc_output/`,
22
+ * `.last-run.json` and `*.tsbuildinfo` have none — no version of them is
23
+ * somebody's deliverable so deleting one can never destroy work. `dist/` and
24
+ * its family do: a published package's `dist/` IS the shipped artifact, so a
25
+ * delete there can.
46
26
  */
47
27
  /** Directory prefixes and file names that are regenerable test/build output. */
48
28
  export declare const REGENERABLE_ARTIFACT_PATTERNS: readonly RegExp[];
@@ -54,7 +34,8 @@ export declare const REGENERABLE_ARTIFACT_PATTERNS: readonly RegExp[];
54
34
  * `.svelte-kit/` — see the header.
55
35
  */
56
36
  export declare const DELETION_EXEMPT_ARTIFACT_PATTERNS: readonly RegExp[];
57
- /** Human-readable form of the exempt list, for trail lines and pathspecs. */
37
+ /** Human-readable form of the exempt list. Nothing in this repo reads it today;
38
+ * the guards go through {@link isDeletionExemptArtifact}. */
58
39
  export declare const DELETION_EXEMPT_ARTIFACT_GLOBS: readonly string[];
59
40
  /** Is this path regenerable machine output, for VERDICT purposes? */
60
41
  export declare function isRegenerableArtifact(relPath: string): boolean;
@@ -1,14 +1,10 @@
1
1
  /**
2
2
  * The one place that knows which repo paths are regenerable machine OUTPUT.
3
3
  *
4
- * This module exists because the knowledge was in exactly one module and two
5
- * others needed it (mx5 run 20). `git-state-guard.ts` knew `test-results/` was
6
- * regenerable and used it for VERDICT decisions only; `write-guard.ts`'s deletion
7
- * guard did not, so it rejected two whole fix attempts over three Playwright
8
- * failure screenshots — taking each attempt's real `src/client/api.test.tsx`
9
- * repair with them — and `auto-commit.ts` did not, so its blind `git add -A` is
10
- * how the screenshots became tracked in the first place. Three modules, one fact,
11
- * shared with neither of the two that needed it. Import from here; do not copy.
4
+ * Three call sites need the fact and all three import it from here rather than
5
+ * keeping a copy: `git-state-guard.ts` (verdicts), `write-guard.ts` (whether a
6
+ * deletion rejects the whole fix attempt) and `auto-commit.ts` (what the commit
7
+ * may newly track). Import from here; do not copy.
12
8
  *
13
9
  * TWO LISTS, and the split between them is the whole point.
14
10
  *
@@ -21,28 +17,12 @@
21
17
  * deliverable, so it is narrower, and `dist/`, `build/`, `.next/`, `.turbo/` and
22
18
  * `.svelte-kit/` are deliberately NOT in it.
23
19
  *
24
- * MEASURED over 269 git work trees under ~/hub, ~/tmp, ~/.cache
25
- * (`scripts/tracked-artifact-baserate.ts`, 2026-08-07):
26
- *
27
- * trees tracking any artifact path 33 (33 of 33 have .pi-tasks)
28
- * test-results/ 33 trees / 33 files
29
- * .last-run.json 33 trees / 33 files ← the SAME 33 files
30
- * dist/, build/, .next/, .turbo/, .svelte-kit/, playwright-report/,
31
- * coverage/, .nyc_output/, *.tsbuildinfo 0 trees
32
- *
33
- * So `test-results/` and `.last-run.json` are exempt on MEASUREMENT — they are the
34
- * only artifact paths this corpus tracks at all, and the one real episode is
35
- * exactly a tracked `test-results/` deletion. `playwright-report/`, `coverage/`,
36
- * `.nyc_output/` and `*.tsbuildinfo` are exempt BY CONSTRUCTION with zero corpus
37
- * evidence either way: none of the four has a hand-authored form, so there is no
38
- * version of them that is a deliverable. `dist/` and its family have exactly the
39
- * hand-authored form the other six lack — a published package's `dist/` IS the
40
- * shipped artifact — and with 0 tracked instances here the exemption would never
41
- * fire anyway, so it would buy nothing while carrying that risk.
42
- *
43
- * 32 of the 33 trees are one A/B harness's delivery trees built from a single mx5
44
- * DESIGN/PROJECT.md: 32 independent RUNS of one project shape, which is evidence
45
- * of reproducibility and not of breadth. The 33rd is mx5 itself.
20
+ * The line between the two lists is whether the path has a HAND-AUTHORED form.
21
+ * `test-results/`, `playwright-report/`, `coverage/`, `.nyc_output/`,
22
+ * `.last-run.json` and `*.tsbuildinfo` have none — no version of them is
23
+ * somebody's deliverable so deleting one can never destroy work. `dist/` and
24
+ * its family do: a published package's `dist/` IS the shipped artifact, so a
25
+ * delete there can.
46
26
  */
47
27
  /** Directory prefixes and file names that are regenerable test/build output. */
48
28
  export const REGENERABLE_ARTIFACT_PATTERNS = [
@@ -62,7 +42,8 @@ export const DELETION_EXEMPT_ARTIFACT_PATTERNS = [
62
42
  /(?:^|\/)\.last-run\.json$/,
63
43
  /\.tsbuildinfo$/
64
44
  ];
65
- /** Human-readable form of the exempt list, for trail lines and pathspecs. */
45
+ /** Human-readable form of the exempt list. Nothing in this repo reads it today;
46
+ * the guards go through {@link isDeletionExemptArtifact}. */
66
47
  export const DELETION_EXEMPT_ARTIFACT_GLOBS = [
67
48
  'test-results/',
68
49
  'playwright-report/',
@@ -10,12 +10,10 @@ export type RenderOutcome = {
10
10
  };
11
11
  /**
12
12
  * The newest Playwright-cache Chromium, if any — the HEADLESS SHELL preferred over
13
- * the full build. Found, never installed: the cache exists on any box that ever ran
14
- * Playwright browsers (the mx5-class projects install it as their own test
15
- * dependency). The headless shell is purpose-built for `--dump-dom` and returns
16
- * promptly on a network URL where the full system chromium can stall under a
17
- * virtual-time budget (validated live on this box: shell exits 0 in ~1s, full
18
- * chromium times out at 30s on the same http:// URL).
13
+ * the full build. Found, never installed: the cache exists on any box that ever
14
+ * ran Playwright browsers, which many projects install as a test dependency. The
15
+ * headless shell is preferred because it is purpose-built for exactly this — one
16
+ * `--dump-dom` and exit with no browser UI to bring up.
19
17
  */
20
18
  export declare function playwrightCachedChromium(): string | null;
21
19
  /**
@@ -37,27 +35,18 @@ export declare function judgeRenderedDom(html: string): {
37
35
  /**
38
36
  * The page's console output, as captured while the DOM was being rendered.
39
37
  *
40
- * MEASURED on this box (2026-08-14) against the shipped mx5 run-21 bundle, both
41
- * binaries the probe can discover:
42
- *
43
- * /usr/bin/chromium --dump-dom alone → 0 bytes of stderr
44
- * + --enable-logging=stderr --v=0 → 2 CONSOLE
45
- * lines, one of them the cause
46
- * playwright chrome-headless-shell
47
- * → the 2 CONSOLE lines either way
48
- *
49
- * and in ALL FOUR arms stdout was byte-identical at 318 bytes, so the DOM the
50
- * judge reads is untouched by the flags.
38
+ * `--enable-logging=stderr --v=0` is what routes the page's console to stderr.
39
+ * The DOM the judge reads is untouched by those flags: with and without them,
40
+ * `--dump-dom` writes byte-identical stdout on both binaries this probe can
41
+ * discover.
51
42
  */
52
43
  export declare function parseConsoleLines(stderr: string): string[];
53
44
  /**
54
45
  * Append the console output to a FAIL detail — and to nothing else.
55
46
  *
56
- * WHY (nexttask 19B; the class 18A opened for repo-health). Run 21's fix child was
57
- * told "the body is EMPTY" and nothing more. It spent 45 minutes on tests, bundler
58
- * config and static serving, read the offending line twice, and moved on. The
59
- * probe was holding the answer the whole time: `Uncaught ReferenceError: process
60
- * is not defined`, at main.js:322.
47
+ * Without it the fix child is told "the body is EMPTY" and nothing more, while the
48
+ * probe was holding the cause the whole time: the page's own
49
+ * `Uncaught ReferenceError`, with the source file and line Chrome already printed.
61
50
  *
62
51
  * Strictly additive by construction: it takes an existing FAIL detail and returns
63
52
  * it with text appended. It cannot turn a PASS into a FAIL, cannot reach