@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,27 +1,20 @@
1
1
  /**
2
2
  * test-assembly — deterministic detection of TEST-REBUILT PRODUCTION WIRING, feeding
3
- * the verify gate's prompt (run-8 F4; third recurrence of the test-the-copy class,
4
- * runs 3, 4, 8).
3
+ * the verify gate's prompt. A recurring shape, not a one-off.
5
4
  *
6
5
  * The failure class: a test file re-constructs wiring that ALSO exists in production
7
6
  * — it builds its own app assembly / its own entry point out of the same leaf modules
8
7
  * the production entry composes, then tests THAT private copy. The copy can be wired
9
- * differently from production and stay green while the shipped wiring is broken. Run-8
10
- * fixture: `test/photos.test.ts` imports the real `authRoutes` + `photosRoutes` leaves,
11
- * mounts them into its OWN app at a DIFFERENT prefix than the production entry, and
12
- * runs 102/102 green — while the shipped upload path is dead because production mounts
13
- * the same leaf at the wrong prefix. The verify child, judging "do the tests pass",
14
- * saw green and counted the photos area verified. The seam the test was supposed to
15
- * cover is exactly the seam it re-implemented away.
8
+ * differently from production and stay green while the shipped wiring is broken: the
9
+ * test mounts the same leaf at one prefix, production mounts it at another, and the
10
+ * seam the test was supposed to cover is the seam it re-implemented away.
16
11
  *
17
12
  * This is the VERIFY-SIDE complement of the generation-side wiring probe
18
- * (wiring-claims.ts, item #5) and shares the load-bearing lesson of
19
- * substitution-probe / skip-escape / wiring-claims: a deterministic finding that NAMES
20
- * the suspect file is the reliable lever; a bare prompt rule is weak. rule 3b already
21
- * tells the child to spot-check that self-authored tests exercise the real artifact,
22
- * but F4 slips through because these tests DO import the real leaf modules — they just
23
- * bypass the real ASSEMBLY, which rule 3b's "did it import and call the module" check
24
- * does not catch. This probe supplies the missing concrete fact.
13
+ * (wiring-claims.ts). Rule 3b already tells the child to spot-check that
14
+ * self-authored tests exercise the real artifact, but this shape slips past it:
15
+ * these tests DO import the real leaf modules they just bypass the real ASSEMBLY,
16
+ * which "did it import and call the module" does not catch. This probe supplies the
17
+ * missing concrete fact.
25
18
  *
26
19
  * THE SIGNAL is pure import-graph SHAPE, zero stack/framework assumptions (no "app",
27
20
  * no "route", no "mount", no language runtime): a test file T is flagged when there is
@@ -34,10 +27,10 @@
34
27
  * shared-utility imports out: a test importing an api client + a schema module that
35
28
  * every page also imports is NOT re-assembly (those utilities have many production
36
29
  * importers); a test importing two route modules that only the server entry composes
37
- * IS re-assembly. Measured on the run-8 fixture tree: flags exactly the four backend
38
- * tests that rebuild the server entry's route composition (including the real
39
- * photos seam bug) and leaves clean the single-leaf direct test, the utility-sharing
40
- * page test, and the source-grepping test — 0 false positives.
30
+ * IS re-assembly. What that leaves clean, by construction: a test importing ONE
31
+ * leaf, a test importing utilities several production files also import, a test that
32
+ * imports the assembly itself, and a source-grepping test whose "imports" are quoted
33
+ * strings inside assertions.
41
34
  *
42
35
  * Findings are ADVISORY (probe+rule): they mandate the child to exercise the REAL
43
36
  * shipped assembly directly before counting the area verified; they never auto-FAIL.
@@ -1,27 +1,20 @@
1
1
  /**
2
2
  * test-assembly — deterministic detection of TEST-REBUILT PRODUCTION WIRING, feeding
3
- * the verify gate's prompt (run-8 F4; third recurrence of the test-the-copy class,
4
- * runs 3, 4, 8).
3
+ * the verify gate's prompt. A recurring shape, not a one-off.
5
4
  *
6
5
  * The failure class: a test file re-constructs wiring that ALSO exists in production
7
6
  * — it builds its own app assembly / its own entry point out of the same leaf modules
8
7
  * the production entry composes, then tests THAT private copy. The copy can be wired
9
- * differently from production and stay green while the shipped wiring is broken. Run-8
10
- * fixture: `test/photos.test.ts` imports the real `authRoutes` + `photosRoutes` leaves,
11
- * mounts them into its OWN app at a DIFFERENT prefix than the production entry, and
12
- * runs 102/102 green — while the shipped upload path is dead because production mounts
13
- * the same leaf at the wrong prefix. The verify child, judging "do the tests pass",
14
- * saw green and counted the photos area verified. The seam the test was supposed to
15
- * cover is exactly the seam it re-implemented away.
8
+ * differently from production and stay green while the shipped wiring is broken: the
9
+ * test mounts the same leaf at one prefix, production mounts it at another, and the
10
+ * seam the test was supposed to cover is the seam it re-implemented away.
16
11
  *
17
12
  * This is the VERIFY-SIDE complement of the generation-side wiring probe
18
- * (wiring-claims.ts, item #5) and shares the load-bearing lesson of
19
- * substitution-probe / skip-escape / wiring-claims: a deterministic finding that NAMES
20
- * the suspect file is the reliable lever; a bare prompt rule is weak. rule 3b already
21
- * tells the child to spot-check that self-authored tests exercise the real artifact,
22
- * but F4 slips through because these tests DO import the real leaf modules — they just
23
- * bypass the real ASSEMBLY, which rule 3b's "did it import and call the module" check
24
- * does not catch. This probe supplies the missing concrete fact.
13
+ * (wiring-claims.ts). Rule 3b already tells the child to spot-check that
14
+ * self-authored tests exercise the real artifact, but this shape slips past it:
15
+ * these tests DO import the real leaf modules they just bypass the real ASSEMBLY,
16
+ * which "did it import and call the module" does not catch. This probe supplies the
17
+ * missing concrete fact.
25
18
  *
26
19
  * THE SIGNAL is pure import-graph SHAPE, zero stack/framework assumptions (no "app",
27
20
  * no "route", no "mount", no language runtime): a test file T is flagged when there is
@@ -34,10 +27,10 @@
34
27
  * shared-utility imports out: a test importing an api client + a schema module that
35
28
  * every page also imports is NOT re-assembly (those utilities have many production
36
29
  * importers); a test importing two route modules that only the server entry composes
37
- * IS re-assembly. Measured on the run-8 fixture tree: flags exactly the four backend
38
- * tests that rebuild the server entry's route composition (including the real
39
- * photos seam bug) and leaves clean the single-leaf direct test, the utility-sharing
40
- * page test, and the source-grepping test — 0 false positives.
30
+ * IS re-assembly. What that leaves clean, by construction: a test importing ONE
31
+ * leaf, a test importing utilities several production files also import, a test that
32
+ * imports the assembly itself, and a source-grepping test whose "imports" are quoted
33
+ * strings inside assertions.
41
34
  *
42
35
  * Findings are ADVISORY (probe+rule): they mandate the child to exercise the REAL
43
36
  * shipped assembly directly before counting the area verified; they never auto-FAIL.
@@ -2,9 +2,11 @@
2
2
  * Phase timing data — captures how long each pipeline phase took so we can
3
3
  * spot regressions and target future speed improvements.
4
4
  *
5
- * Top-level entries are the five phases (refine, research, grill, compose,
6
- * critique). Each phase may attach optional sub-step children (e.g. research
7
- * workers + verify-tooling, grill → gen + auto-answers + user input).
5
+ * Top-level entries are the five phases of PHASE_ORDER (refine, research, grill,
6
+ * compose, critique). Each phase may attach optional sub-step children, recorded
7
+ * through `deps.recordSubStep`: research reports `workers` and `verify-tooling`,
8
+ * grill `gen` and `auto-answer`, critique `triage` and `rewrite`, and every phase
9
+ * child reports its own `<name> wait` / `<name> work` split.
8
10
  *
9
11
  * `formatTimings` produces the human-readable block we write to the
10
12
  * `## phase timings` section of the TASK_NNNN.md file.
@@ -2,9 +2,11 @@
2
2
  * Phase timing data — captures how long each pipeline phase took so we can
3
3
  * spot regressions and target future speed improvements.
4
4
  *
5
- * Top-level entries are the five phases (refine, research, grill, compose,
6
- * critique). Each phase may attach optional sub-step children (e.g. research
7
- * workers + verify-tooling, grill → gen + auto-answers + user input).
5
+ * Top-level entries are the five phases of PHASE_ORDER (refine, research, grill,
6
+ * compose, critique). Each phase may attach optional sub-step children, recorded
7
+ * through `deps.recordSubStep`: research reports `workers` and `verify-tooling`,
8
+ * grill `gen` and `auto-answer`, critique `triage` and `rewrite`, and every phase
9
+ * child reports its own `<name> wait` / `<name> work` split.
8
10
  *
9
11
  * `formatTimings` produces the human-readable block we write to the
10
12
  * `## phase timings` section of the TASK_NNNN.md file.
@@ -2,8 +2,8 @@
2
2
  * Display-label compression.
3
3
  *
4
4
  * A refined GOAL paragraph becomes the stored `title`, which the pipeline reads
5
- * in full — but it can run to 1000+ characters, which makes the widget head and
6
- * `/task list` unreadable. `compressTitle` spawns a tool-less local-model child
5
+ * in full — but a paragraph-long title makes the widget head and `/task list`
6
+ * unreadable. `compressTitle` spawns a tool-less local-model child
7
7
  * to distill that title into a short, identifying label that we store ALONGSIDE
8
8
  * (never replacing) the full title, purely for display. Every failure mode —
9
9
  * model error, empty output, leaked tool call, abort, an over-long answer —
@@ -13,8 +13,13 @@
13
13
  import type { PhaseDeps } from './child-runner.js';
14
14
  /**
15
15
  * Reduce a raw model completion to a single clean label line: first non-empty
16
- * line, stripped of surrounding quotes/backticks and a leading "label:" echo,
17
- * whitespace collapsed. Returns '' when nothing usable remains.
16
+ * line, a leading "label:" echo removed, then quotes/backticks stripped from the
17
+ * ends, then whitespace collapsed. Returns '' when nothing usable remains.
18
+ *
19
+ * The quote strip runs BEFORE the collapse, so it anchors on the raw line: a quote
20
+ * sitting next to leading or trailing whitespace survives (`"X" ` → `X"`). That
21
+ * only ever leaves one stray character in the label, and the label is display-only
22
+ * — `title` is what the pipeline reads.
18
23
  */
19
24
  export declare function sanitizeLabel(raw: string): string;
20
25
  /**
@@ -2,8 +2,8 @@
2
2
  * Display-label compression.
3
3
  *
4
4
  * A refined GOAL paragraph becomes the stored `title`, which the pipeline reads
5
- * in full — but it can run to 1000+ characters, which makes the widget head and
6
- * `/task list` unreadable. `compressTitle` spawns a tool-less local-model child
5
+ * in full — but a paragraph-long title makes the widget head and `/task list`
6
+ * unreadable. `compressTitle` spawns a tool-less local-model child
7
7
  * to distill that title into a short, identifying label that we store ALONGSIDE
8
8
  * (never replacing) the full title, purely for display. Every failure mode —
9
9
  * model error, empty output, leaked tool call, abort, an over-long answer —
@@ -15,8 +15,13 @@ import { LABEL_MAX, truncateLabel } from './parsers.js';
15
15
  import { COMPRESS_LABEL_PROMPT } from './prompts.js';
16
16
  /**
17
17
  * Reduce a raw model completion to a single clean label line: first non-empty
18
- * line, stripped of surrounding quotes/backticks and a leading "label:" echo,
19
- * whitespace collapsed. Returns '' when nothing usable remains.
18
+ * line, a leading "label:" echo removed, then quotes/backticks stripped from the
19
+ * ends, then whitespace collapsed. Returns '' when nothing usable remains.
20
+ *
21
+ * The quote strip runs BEFORE the collapse, so it anchors on the raw line: a quote
22
+ * sitting next to leading or trailing whitespace survives (`"X" ` → `X"`). That
23
+ * only ever leaves one stray character in the label, and the label is display-only
24
+ * — `title` is what the pipeline reads.
20
25
  */
21
26
  export function sanitizeLabel(raw) {
22
27
  const firstLine = raw.split('\n').find(l => l.trim().length > 0) ?? '';
@@ -1,62 +1,54 @@
1
1
  /**
2
- * Deterministic detector for the F-2 shape: a pi-worker-docs answer that RESTATES a type
3
- * signature or declaration for a USAGE question, without ever saying what the API DOES.
2
+ * Deterministic detector for a pi-worker-docs answer that RESTATES a type signature
3
+ * or declaration for a USAGE question, without ever saying what the API DOES.
4
4
  *
5
- * THE FATAL CASE, from mx5 run 15 (research-cache.json, verbatim):
5
+ * The shape, in one example. Asked "hc factory function signature base url parameter
6
+ * types", a docs child answers that `hc` "accepts a generic type `T` extending
7
+ * `Hono`… and takes two parameters: `baseUrl` of type `Prefix`". Every clause is
8
+ * type-level: it names the parameter's TYPE, and `Prefix` is itself an opaque type
9
+ * variable, while saying nothing about what `baseUrl` MEANS — is it an origin, or a
10
+ * mount prefix? Escalation to search/fetch never fires, because the answer looks
11
+ * complete: it named the very parameter that was asked about. The caller then fills
12
+ * the semantic gap from memory, and a wrong guess about that one word can kill every
13
+ * request the client makes.
6
14
  *
7
- * query : "hc factory function signature base url parameter types exported from hono/client"
8
- * answer: "The `hc` factory function exported from `hono/client` accepts a generic type
9
- * `T` extending `Hono`, an optional string prefix type `Prefix` (defaulting to
10
- * `string`), and takes two parameters: `baseUrl` of type `Prefix` and an optional
11
- * `options` of type `ClientRequestOptions`. It returns a
12
- * `UnionToIntersection<Client<T, Prefix>>`."
15
+ * The lever: when a docs answer for a usage question is ONLY a signature restatement
16
+ * with no behavioural statement, treat it as UNANSWERED so the caller escalates
17
+ * (follow the `@see` pointer, fetch the spec-cited URL) instead of accepting a type
18
+ * as the answer.
13
19
  *
14
- * Every clause is type-level. "`baseUrl` of type `Prefix`" names the parameter's TYPE — and
15
- * `Prefix` is itself an opaque type variable while saying nothing about what `baseUrl`
16
- * MEANS (is it an origin, or a mount prefix?). Escalation to search/fetch never fired
17
- * because the answer looked complete: it named the very parameter asked about. worker:context
18
- * then filled the semantic gap from memory and shipped `hc<AppType>('/api')`, so every request
19
- * went to `/api/api/...` 404 the product's entire API surface was dead (F-2 → F-1).
20
- *
21
- * The lever (PROMPT 2 DO item 1): when a docs answer for a usage question is ONLY a
22
- * signature/declaration restatement with no behavioural statement, treat it as UNANSWERED so
23
- * the caller escalates (follow the `@see` pointer / fetch the spec-cited URL) instead of
24
- * accepting a type as the answer.
25
- *
26
- * ── PRECISION/RECALL TRADEOFF (chosen deliberately; documented per the task) ────────────────
27
- * A FALSE POSITIVE here (flagging a real answer as type-only) forces a needless escalation:
28
- * wall-clock cost against PROMPT 2 invariant 1, which caps added child spawns. A false
29
- * NEGATIVE (missing a type-only answer) merely leaves the pre-existing bug unfixed for that
30
- * one borderline case. So this detector is tuned for HIGH PRECISION on real answers, accepting
31
- * low recall — "better to miss a borderline type-only answer than to flag a real one." Three
32
- * independent gates must ALL hold before an answer is called type-only; any one failing clears
33
- * it. Calibrated against the run-15 corpus: of the 149 valid (non-"unclear") pi-worker-docs
34
- * answers, this rule flags EXACTLY ONE — the recorded `hc` case — and clears the other 148,
35
- * including every legitimate signature answer to an explicit "give me the type/signature"
36
- * question (bun.password.hash, toBuffer, BuildOutput, …). See type-only-answer.test.ts.
20
+ * ── PRECISION OVER RECALL, deliberately ─────────────────────────────────────────
21
+ * A FALSE POSITIVE (flagging a real answer as type-only) forces a needless
22
+ * escalation and costs a child spawn. A false NEGATIVE merely leaves one borderline
23
+ * answer un-escalated. So three independent gates must ALL hold before an answer is
24
+ * called type-only, and any one failing clears it. That is what keeps a legitimate
25
+ * signature answer to an explicit "give me the type" question out.
37
26
  *
38
27
  * THE THREE GATES (all required):
39
- * 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use", "work", "chain",
40
- * "example", "call", "rpc", "mean", or it names a usage concept whose meaning is being
41
- * sought ("base url"). A question that asks only for a TYPE / SIGNATURE / DEFINITION /
42
- * FIELDS is legitimately answered by a signature, so it is NOT gated in. (The recorded hc
43
- * query is signature-shaped but names "base url", the concept whose meaning was needed.)
44
- * 2. NO BEHAVIOURAL CONTENT IN PROSE. The answer must contain no statement of what the API
45
- * DOES: no usage verb ("use/call/pass/import"), no runtime-effect verb ("executes/
46
- * prepends/enables/wraps"), no concrete usage example, no semantic meaning ("means/
47
- * represents/so pass"), no concrete default VALUE or value RANGE ("default of 80", "from
48
- * 1 to 100"). Any one clears. This scan runs over `proseOf(answer)`, NOT the raw answer:
49
- * a verb that is really a method name inside a declaration ("methods route(url, handler)
50
- * and use(...handlers)") is an identifier, not behaviour, and must not clear the answer.
51
- * 3. SIGNATURE RESTATEMENT. The answer must actually be a declaration/signature restatement —
52
- * "of type", "takes N parameters", "accepts", "returns a…", "extends", "interface",
53
- * "declare const/function". Without this it is not type-only, it is just terse prose.
28
+ * 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use",
29
+ * "work", "chain", "example", "call", "rpc", "mean" or name a usage concept
30
+ * whose meaning is being sought ("base url"). A question asking only for a
31
+ * TYPE / SIGNATURE / DEFINITION is legitimately answered by a signature, so it
32
+ * is NOT gated in. (The `hc` query above is signature-shaped but names "base
33
+ * url", the concept whose meaning was needed.)
34
+ * 2. NO BEHAVIOURAL CONTENT IN PROSE. The answer must contain no statement of what
35
+ * the API DOES: no usage verb ("use/call/pass/import"), no runtime-effect verb
36
+ * ("executes/prepends/enables/wraps"), no concrete example, no semantic meaning
37
+ * ("means/represents/so pass"), no concrete default VALUE or range ("default of
38
+ * 80", "from 1 to 100"). Any one clears. This scan runs over `proseOf(answer)`,
39
+ * NOT the raw answer: a verb that is really a method name inside a declaration
40
+ * ("methods route(url, handler) and use(...handlers)") is an identifier, not
41
+ * behaviour, and must not clear the answer.
42
+ * 3. SIGNATURE RESTATEMENT. The answer must actually be a declaration restatement
43
+ * "of type", "takes N parameters", "accepts", "returns a…", "extends",
44
+ * "interface", "declare const/function". Without this it is not type-only, it
45
+ * is just terse prose.
54
46
  *
55
- * An explicit "unclear from this package/page" is NOT type-only — it is the HONEST non-answer,
56
- * already handled by the escalation path (PROMPT 2 DO item 2 escalates BOTH). It is cleared
57
- * here with a distinct reason so the caller can route it through the existing unclear channel.
47
+ * An explicit "unclear from this package/page" is NOT type-only — it is the HONEST
48
+ * non-answer, and it is cleared here with a distinct reason so the caller routes it
49
+ * through the existing unclear channel instead.
58
50
  *
59
- * Pure and side-effect free; unit-tested in type-only-answer.test.ts against real run-15 text.
51
+ * Pure and side-effect free; unit-tested in type-only-answer.test.ts against real text.
60
52
  */
61
53
  /** The verdict, with a human-readable reason for logging and for the escalation channel. */
62
54
  export interface TypeOnlyVerdict {
@@ -73,7 +65,7 @@ export interface TypeOnlyVerdict {
73
65
  * declaration. Without this, a bare type-only answer like
74
66
  * "It has methods route(url, handler) and use(...handlers)."
75
67
  * is wrongly cleared, because `use(...handlers)` matches /\buse\b/ and `handler` matches
76
- * /handle/ — the F-3(a) router-fixture shape. So before scanning for behaviour we remove:
68
+ * /handle/. So before scanning for behaviour we remove:
77
69
  * - `name(args)` call fragments, whose args are identifiers, not prose (this is what
78
70
  * carries the method-name verbs);
79
71
  * - `declare const|function|module|class|namespace …` declaration lines.
@@ -1,62 +1,54 @@
1
1
  /**
2
- * Deterministic detector for the F-2 shape: a pi-worker-docs answer that RESTATES a type
3
- * signature or declaration for a USAGE question, without ever saying what the API DOES.
2
+ * Deterministic detector for a pi-worker-docs answer that RESTATES a type signature
3
+ * or declaration for a USAGE question, without ever saying what the API DOES.
4
4
  *
5
- * THE FATAL CASE, from mx5 run 15 (research-cache.json, verbatim):
5
+ * The shape, in one example. Asked "hc factory function signature base url parameter
6
+ * types", a docs child answers that `hc` "accepts a generic type `T` extending
7
+ * `Hono`… and takes two parameters: `baseUrl` of type `Prefix`". Every clause is
8
+ * type-level: it names the parameter's TYPE, and `Prefix` is itself an opaque type
9
+ * variable, while saying nothing about what `baseUrl` MEANS — is it an origin, or a
10
+ * mount prefix? Escalation to search/fetch never fires, because the answer looks
11
+ * complete: it named the very parameter that was asked about. The caller then fills
12
+ * the semantic gap from memory, and a wrong guess about that one word can kill every
13
+ * request the client makes.
6
14
  *
7
- * query : "hc factory function signature base url parameter types exported from hono/client"
8
- * answer: "The `hc` factory function exported from `hono/client` accepts a generic type
9
- * `T` extending `Hono`, an optional string prefix type `Prefix` (defaulting to
10
- * `string`), and takes two parameters: `baseUrl` of type `Prefix` and an optional
11
- * `options` of type `ClientRequestOptions`. It returns a
12
- * `UnionToIntersection<Client<T, Prefix>>`."
15
+ * The lever: when a docs answer for a usage question is ONLY a signature restatement
16
+ * with no behavioural statement, treat it as UNANSWERED so the caller escalates
17
+ * (follow the `@see` pointer, fetch the spec-cited URL) instead of accepting a type
18
+ * as the answer.
13
19
  *
14
- * Every clause is type-level. "`baseUrl` of type `Prefix`" names the parameter's TYPE — and
15
- * `Prefix` is itself an opaque type variable while saying nothing about what `baseUrl`
16
- * MEANS (is it an origin, or a mount prefix?). Escalation to search/fetch never fired
17
- * because the answer looked complete: it named the very parameter asked about. worker:context
18
- * then filled the semantic gap from memory and shipped `hc<AppType>('/api')`, so every request
19
- * went to `/api/api/...` 404 the product's entire API surface was dead (F-2 → F-1).
20
- *
21
- * The lever (PROMPT 2 DO item 1): when a docs answer for a usage question is ONLY a
22
- * signature/declaration restatement with no behavioural statement, treat it as UNANSWERED so
23
- * the caller escalates (follow the `@see` pointer / fetch the spec-cited URL) instead of
24
- * accepting a type as the answer.
25
- *
26
- * ── PRECISION/RECALL TRADEOFF (chosen deliberately; documented per the task) ────────────────
27
- * A FALSE POSITIVE here (flagging a real answer as type-only) forces a needless escalation:
28
- * wall-clock cost against PROMPT 2 invariant 1, which caps added child spawns. A false
29
- * NEGATIVE (missing a type-only answer) merely leaves the pre-existing bug unfixed for that
30
- * one borderline case. So this detector is tuned for HIGH PRECISION on real answers, accepting
31
- * low recall — "better to miss a borderline type-only answer than to flag a real one." Three
32
- * independent gates must ALL hold before an answer is called type-only; any one failing clears
33
- * it. Calibrated against the run-15 corpus: of the 149 valid (non-"unclear") pi-worker-docs
34
- * answers, this rule flags EXACTLY ONE — the recorded `hc` case — and clears the other 148,
35
- * including every legitimate signature answer to an explicit "give me the type/signature"
36
- * question (bun.password.hash, toBuffer, BuildOutput, …). See type-only-answer.test.ts.
20
+ * ── PRECISION OVER RECALL, deliberately ─────────────────────────────────────────
21
+ * A FALSE POSITIVE (flagging a real answer as type-only) forces a needless
22
+ * escalation and costs a child spawn. A false NEGATIVE merely leaves one borderline
23
+ * answer un-escalated. So three independent gates must ALL hold before an answer is
24
+ * called type-only, and any one failing clears it. That is what keeps a legitimate
25
+ * signature answer to an explicit "give me the type" question out.
37
26
  *
38
27
  * THE THREE GATES (all required):
39
- * 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use", "work", "chain",
40
- * "example", "call", "rpc", "mean", or it names a usage concept whose meaning is being
41
- * sought ("base url"). A question that asks only for a TYPE / SIGNATURE / DEFINITION /
42
- * FIELDS is legitimately answered by a signature, so it is NOT gated in. (The recorded hc
43
- * query is signature-shaped but names "base url", the concept whose meaning was needed.)
44
- * 2. NO BEHAVIOURAL CONTENT IN PROSE. The answer must contain no statement of what the API
45
- * DOES: no usage verb ("use/call/pass/import"), no runtime-effect verb ("executes/
46
- * prepends/enables/wraps"), no concrete usage example, no semantic meaning ("means/
47
- * represents/so pass"), no concrete default VALUE or value RANGE ("default of 80", "from
48
- * 1 to 100"). Any one clears. This scan runs over `proseOf(answer)`, NOT the raw answer:
49
- * a verb that is really a method name inside a declaration ("methods route(url, handler)
50
- * and use(...handlers)") is an identifier, not behaviour, and must not clear the answer.
51
- * 3. SIGNATURE RESTATEMENT. The answer must actually be a declaration/signature restatement —
52
- * "of type", "takes N parameters", "accepts", "returns a…", "extends", "interface",
53
- * "declare const/function". Without this it is not type-only, it is just terse prose.
28
+ * 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use",
29
+ * "work", "chain", "example", "call", "rpc", "mean" or name a usage concept
30
+ * whose meaning is being sought ("base url"). A question asking only for a
31
+ * TYPE / SIGNATURE / DEFINITION is legitimately answered by a signature, so it
32
+ * is NOT gated in. (The `hc` query above is signature-shaped but names "base
33
+ * url", the concept whose meaning was needed.)
34
+ * 2. NO BEHAVIOURAL CONTENT IN PROSE. The answer must contain no statement of what
35
+ * the API DOES: no usage verb ("use/call/pass/import"), no runtime-effect verb
36
+ * ("executes/prepends/enables/wraps"), no concrete example, no semantic meaning
37
+ * ("means/represents/so pass"), no concrete default VALUE or range ("default of
38
+ * 80", "from 1 to 100"). Any one clears. This scan runs over `proseOf(answer)`,
39
+ * NOT the raw answer: a verb that is really a method name inside a declaration
40
+ * ("methods route(url, handler) and use(...handlers)") is an identifier, not
41
+ * behaviour, and must not clear the answer.
42
+ * 3. SIGNATURE RESTATEMENT. The answer must actually be a declaration restatement
43
+ * "of type", "takes N parameters", "accepts", "returns a…", "extends",
44
+ * "interface", "declare const/function". Without this it is not type-only, it
45
+ * is just terse prose.
54
46
  *
55
- * An explicit "unclear from this package/page" is NOT type-only — it is the HONEST non-answer,
56
- * already handled by the escalation path (PROMPT 2 DO item 2 escalates BOTH). It is cleared
57
- * here with a distinct reason so the caller can route it through the existing unclear channel.
47
+ * An explicit "unclear from this package/page" is NOT type-only — it is the HONEST
48
+ * non-answer, and it is cleared here with a distinct reason so the caller routes it
49
+ * through the existing unclear channel instead.
58
50
  *
59
- * Pure and side-effect free; unit-tested in type-only-answer.test.ts against real run-15 text.
51
+ * Pure and side-effect free; unit-tested in type-only-answer.test.ts against real text.
60
52
  */
61
53
  import { isAbstention } from '../workers/abstention.js';
62
54
  /**
@@ -181,7 +173,7 @@ function firstMatch(text, patterns) {
181
173
  * declaration. Without this, a bare type-only answer like
182
174
  * "It has methods route(url, handler) and use(...handlers)."
183
175
  * is wrongly cleared, because `use(...handlers)` matches /\buse\b/ and `handler` matches
184
- * /handle/ — the F-3(a) router-fixture shape. So before scanning for behaviour we remove:
176
+ * /handle/. So before scanning for behaviour we remove:
185
177
  * - `name(args)` call fragments, whose args are identifiers, not prose (this is what
186
178
  * carries the method-name verbs);
187
179
  * - `declare const|function|module|class|namespace …` declaration lines.
@@ -1,40 +1,34 @@
1
1
  /**
2
2
  * unfailable-command — is this shell command's exit status DESTROYED by its own
3
- * construction? (nexttask 19C)
3
+ * construction?
4
4
  *
5
5
  * WHY THIS EXISTS. `recheckAcceptDebts` may auto-close an accepted debt on exactly
6
6
  * one piece of evidence: the debt named a VERIFY command, that command was re-run,
7
- * and it exited ZERO (accept-debt.ts "the debt named a command, the command was
8
- * run, and it passed"). `isStorableCommand` used to filter only on length and
9
- * control characters, so nothing asked whether a ZERO exit could ever mean
10
- * anything. Sixteen stored-eligible VERIFY lines in the corpus on this box cannot
11
- * exit non-zero no matter what the tree contains:
7
+ * and it exited ZERO (accept-debt.ts). Filtering the stored command on length and
8
+ * control characters alone never asks whether a ZERO exit could mean anything. Three
9
+ * shapes make it meaningless:
12
10
  *
13
- * C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"` 15 ← both
14
- * branches that can be LAST are echoes, so the status is echo's: 0.
15
- * A `bun -e "console.assert(…)"` 1measured
16
- * in both runtimes: `console.assert(1===2,'X')` prints and exits 0.
17
- * B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …` 1 ← `$?` is
18
- * tail's status, not tsc's.
19
- *
20
- * IAR1 (CMake / C++ / OBS plugin — no database, no frontend, no HTTP server)
21
- * carries 11 of the 16; one of its tasks is SEVEN consecutive `test -f … && echo
22
- * "PASS" || echo "FAIL"` lines standing in for a build verification.
11
+ * C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"` ← both branches
12
+ * that can run LAST are echoes, so the status is echo's: 0.
13
+ * A `bun -e "console.assert(…)"` ← `console.assert` prints and continues; the
14
+ * process still exits 0, in bun and in node alike.
15
+ * B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …` ← `$?` is tail's
16
+ * status, not tsc's.
23
17
  *
24
18
  * THE VERDICT IS A REFUSAL, NOT A CLAIM. An unfailable command is not stored, so
25
19
  * the debt stays OPEN and surfaced — the strictly smaller claim. Nothing here can
26
20
  * close a debt, fail a gate, or edit a spec.
27
21
  *
28
22
  * DECIDED ON SHELL SHAPE, NEVER ON THE VERB. `grep -q …` and `ctest …` set a real
29
- * status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and
30
- * is untouched. Naming verbs is the mistake nexttask 3 already paid for
31
- * (command-shrink's guard compared NAMES) and 16B re-bought.
23
+ * status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and is
24
+ * untouched. A rule keyed on command NAMES would have to know every checker that
25
+ * exists, and would still miss the shape — the same mistake command-shrink's guard
26
+ * made by comparing names.
32
27
  *
33
- * OUT OF SCOPE BY DESIGN: bare `|| true`. skip-escape.ts:11-19 records the FP
34
- * measurement of 45 `||` uses in the historical VERIFY blocks exactly one was a
35
- * real skip-escape; a blanket `|| true` rule is ~90% false positives (teardown,
36
- * setup, negative tests). `rm -rf build || true` classifies CAN-FAIL here and must
37
- * keep doing so.
28
+ * OUT OF SCOPE BY DESIGN: bare `|| true`. As skip-escape.ts explains, most `||`
29
+ * uses are teardown, setup or a negative test rather than an escape, so a blanket
30
+ * rule would be almost all false positives. `rm -rf build || true` classifies
31
+ * CAN-FAIL here and must keep doing so.
38
32
  *
39
33
  * THREE OUTCOMES, and `unknown` is a first-class answer: a shape this cannot
40
34
  * decide is never guessed at, it is left alone (which is today's behaviour).
@@ -1,40 +1,34 @@
1
1
  /**
2
2
  * unfailable-command — is this shell command's exit status DESTROYED by its own
3
- * construction? (nexttask 19C)
3
+ * construction?
4
4
  *
5
5
  * WHY THIS EXISTS. `recheckAcceptDebts` may auto-close an accepted debt on exactly
6
6
  * one piece of evidence: the debt named a VERIFY command, that command was re-run,
7
- * and it exited ZERO (accept-debt.ts "the debt named a command, the command was
8
- * run, and it passed"). `isStorableCommand` used to filter only on length and
9
- * control characters, so nothing asked whether a ZERO exit could ever mean
10
- * anything. Sixteen stored-eligible VERIFY lines in the corpus on this box cannot
11
- * exit non-zero no matter what the tree contains:
7
+ * and it exited ZERO (accept-debt.ts). Filtering the stored command on length and
8
+ * control characters alone never asks whether a ZERO exit could mean anything. Three
9
+ * shapes make it meaningless:
12
10
  *
13
- * C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"` 15 ← both
14
- * branches that can be LAST are echoes, so the status is echo's: 0.
15
- * A `bun -e "console.assert(…)"` 1measured
16
- * in both runtimes: `console.assert(1===2,'X')` prints and exits 0.
17
- * B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …` 1 ← `$?` is
18
- * tail's status, not tsc's.
19
- *
20
- * IAR1 (CMake / C++ / OBS plugin — no database, no frontend, no HTTP server)
21
- * carries 11 of the 16; one of its tasks is SEVEN consecutive `test -f … && echo
22
- * "PASS" || echo "FAIL"` lines standing in for a build verification.
11
+ * C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"` ← both branches
12
+ * that can run LAST are echoes, so the status is echo's: 0.
13
+ * A `bun -e "console.assert(…)"` ← `console.assert` prints and continues; the
14
+ * process still exits 0, in bun and in node alike.
15
+ * B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …` ← `$?` is tail's
16
+ * status, not tsc's.
23
17
  *
24
18
  * THE VERDICT IS A REFUSAL, NOT A CLAIM. An unfailable command is not stored, so
25
19
  * the debt stays OPEN and surfaced — the strictly smaller claim. Nothing here can
26
20
  * close a debt, fail a gate, or edit a spec.
27
21
  *
28
22
  * DECIDED ON SHELL SHAPE, NEVER ON THE VERB. `grep -q …` and `ctest …` set a real
29
- * status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and
30
- * is untouched. Naming verbs is the mistake nexttask 3 already paid for
31
- * (command-shrink's guard compared NAMES) and 16B re-bought.
23
+ * status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and is
24
+ * untouched. A rule keyed on command NAMES would have to know every checker that
25
+ * exists, and would still miss the shape — the same mistake command-shrink's guard
26
+ * made by comparing names.
32
27
  *
33
- * OUT OF SCOPE BY DESIGN: bare `|| true`. skip-escape.ts:11-19 records the FP
34
- * measurement of 45 `||` uses in the historical VERIFY blocks exactly one was a
35
- * real skip-escape; a blanket `|| true` rule is ~90% false positives (teardown,
36
- * setup, negative tests). `rm -rf build || true` classifies CAN-FAIL here and must
37
- * keep doing so.
28
+ * OUT OF SCOPE BY DESIGN: bare `|| true`. As skip-escape.ts explains, most `||`
29
+ * uses are teardown, setup or a negative test rather than an escape, so a blanket
30
+ * rule would be almost all false positives. `rm -rf build || true` classifies
31
+ * CAN-FAIL here and must keep doing so.
38
32
  *
39
33
  * THREE OUTCOMES, and `unknown` is a first-class answer: a shape this cannot
40
34
  * decide is never guessed at, it is left alone (which is today's behaviour).
@@ -125,8 +119,8 @@ function hasPipeline(seg) {
125
119
  * EVERY remaining operator: `&&` skips what follows when the status is non-zero,
126
120
  * `||` skips it when the status is zero. A chain that mixes the two after `c_i`
127
121
  * therefore always runs on past it. For `A && B || C`: A is never terminal (the
128
- * `||` picks C up after A fails), B is terminal when it succeeds, C is terminal —
129
- * so the status is always an echo's, which is the run-21 shape.
122
+ * `||` picks C up after A fails), B is terminal when it succeeds, and C is
123
+ * terminal — so if B and C are both echoes the status is always an echo's.
130
124
  */
131
125
  function terminalIndices(ops, n) {
132
126
  const out = [];
@@ -167,7 +161,7 @@ function isPureEcho(cmd) {
167
161
  return !splitTopLevel(cmd, ['>>', '>']).ops.length;
168
162
  }
169
163
  /**
170
- * RULE A — a `console.assert` check. Measured, not assumed, in both runtimes:
164
+ * RULE A — a `console.assert` check. Run it yourself in either runtime:
171
165
  *
172
166
  * $ bun -e "console.assert(1===2,'X'); console.log('end')"; echo $? → 0
173
167
  * $ node -e "console.assert(1===2,'X'); console.log('end')"; echo $? → 0