@mjasnikovs/pi-task 0.38.29 → 0.38.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/dist/config/config.d.ts +70 -70
  2. package/dist/config/config.js +26 -35
  3. package/dist/config/extension-list.d.ts +6 -5
  4. package/dist/config/extension-list.js +3 -2
  5. package/dist/config/reasoning-args.d.ts +9 -7
  6. package/dist/config/reasoning-args.js +12 -10
  7. package/dist/config/reasoning.d.ts +44 -105
  8. package/dist/config/reasoning.js +27 -704
  9. package/dist/config/register.d.ts +34 -48
  10. package/dist/config/register.js +41 -51
  11. package/dist/config/tool-list.d.ts +16 -16
  12. package/dist/config/tool-list.js +1 -1
  13. package/dist/index.js +2 -0
  14. package/dist/remote/bridge.d.ts +19 -10
  15. package/dist/remote/bridge.js +3 -2
  16. package/dist/remote/broadcast.js +3 -1
  17. package/dist/remote/events.js +12 -11
  18. package/dist/remote/history.d.ts +1 -1
  19. package/dist/remote/protocol.d.ts +6 -3
  20. package/dist/remote/protocol.js +2 -1
  21. package/dist/remote/push.d.ts +16 -16
  22. package/dist/remote/push.js +27 -27
  23. package/dist/remote/register.d.ts +3 -3
  24. package/dist/remote/register.js +17 -19
  25. package/dist/remote/server.d.ts +9 -8
  26. package/dist/remote/server.js +15 -14
  27. package/dist/remote/session-state.d.ts +5 -4
  28. package/dist/remote/session-state.js +8 -5
  29. package/dist/remote/sw.d.ts +7 -6
  30. package/dist/remote/sw.js +7 -6
  31. package/dist/remote/tailscale.d.ts +4 -2
  32. package/dist/remote/tailscale.js +4 -2
  33. package/dist/remote/ui-highlight.js +6 -5
  34. package/dist/remote/ui-render.js +4 -4
  35. package/dist/remote/ui-script.js +24 -24
  36. package/dist/remote/ui-styles.d.ts +1 -1
  37. package/dist/remote/ui-styles.js +10 -13
  38. package/dist/remote/ui-tools.js +9 -6
  39. package/dist/shared/child-extensions.d.ts +29 -17
  40. package/dist/shared/child-extensions.js +29 -17
  41. package/dist/shared/child-output.d.ts +30 -24
  42. package/dist/shared/child-output.js +25 -17
  43. package/dist/shared/child-process.d.ts +47 -40
  44. package/dist/shared/child-process.js +50 -59
  45. package/dist/shared/command-watchdog.d.ts +85 -16
  46. package/dist/shared/command-watchdog.js +115 -21
  47. package/dist/shared/fs-text.d.ts +16 -10
  48. package/dist/shared/fs-text.js +16 -10
  49. package/dist/shared/git-runner.d.ts +25 -25
  50. package/dist/shared/git-runner.js +25 -25
  51. package/dist/shared/leaked-tool-call.d.ts +17 -11
  52. package/dist/shared/leaked-tool-call.js +23 -15
  53. package/dist/shared/model-endpoint.d.ts +29 -16
  54. package/dist/shared/model-endpoint.js +33 -21
  55. package/dist/shared/pi-invocation.d.ts +7 -4
  56. package/dist/shared/pi-invocation.js +12 -7
  57. package/dist/shared/pkg-version.d.ts +13 -5
  58. package/dist/shared/pkg-version.js +13 -5
  59. package/dist/shared/reasoning-capability.d.ts +35 -24
  60. package/dist/shared/reasoning-capability.js +35 -24
  61. package/dist/shared/stream-watchdog.d.ts +60 -44
  62. package/dist/shared/stream-watchdog.js +62 -45
  63. package/dist/task/accept-debt.d.ts +41 -43
  64. package/dist/task/accept-debt.js +73 -65
  65. package/dist/task/api-synthesis.d.ts +24 -21
  66. package/dist/task/api-synthesis.js +32 -26
  67. package/dist/task/apis-contract.d.ts +32 -64
  68. package/dist/task/apis-contract.js +32 -64
  69. package/dist/task/artifact-closure.d.ts +27 -13
  70. package/dist/task/artifact-closure.js +95 -67
  71. package/dist/task/auto-commit.d.ts +46 -35
  72. package/dist/task/auto-commit.js +51 -38
  73. package/dist/task/auto-io.d.ts +45 -25
  74. package/dist/task/auto-io.js +57 -29
  75. package/dist/task/auto-orchestrator.d.ts +26 -24
  76. package/dist/task/auto-orchestrator.js +192 -165
  77. package/dist/task/auto-prompts.d.ts +36 -24
  78. package/dist/task/auto-prompts.js +40 -26
  79. package/dist/task/autofix-ledger.d.ts +27 -25
  80. package/dist/task/autofix-ledger.js +29 -26
  81. package/dist/task/batch-test-task.d.ts +20 -12
  82. package/dist/task/batch-test-task.js +67 -60
  83. package/dist/task/boot-probe.d.ts +60 -44
  84. package/dist/task/boot-probe.js +91 -72
  85. package/dist/task/cancel-input.d.ts +30 -16
  86. package/dist/task/cancel-input.js +20 -11
  87. package/dist/task/cancel-points.d.ts +27 -20
  88. package/dist/task/cancel-points.js +30 -22
  89. package/dist/task/child-runner.d.ts +124 -55
  90. package/dist/task/child-runner.js +298 -90
  91. package/dist/task/child-status.d.ts +23 -16
  92. package/dist/task/child-status.js +23 -16
  93. package/dist/task/clamp-output.js +12 -5
  94. package/dist/task/command-run.d.ts +31 -28
  95. package/dist/task/command-run.js +44 -35
  96. package/dist/task/command-shrink.d.ts +25 -18
  97. package/dist/task/command-shrink.js +37 -31
  98. package/dist/task/command-watchdog.d.ts +9 -6
  99. package/dist/task/command-watchdog.js +21 -15
  100. package/dist/task/context-attribution.d.ts +34 -26
  101. package/dist/task/context-attribution.js +34 -26
  102. package/dist/task/context-silence.d.ts +39 -29
  103. package/dist/task/context-silence.js +35 -25
  104. package/dist/task/context-usage.d.ts +16 -9
  105. package/dist/task/context-usage.js +16 -9
  106. package/dist/task/contracts.d.ts +8 -4
  107. package/dist/task/contracts.js +25 -17
  108. package/dist/task/coverage-loop.d.ts +22 -18
  109. package/dist/task/coverage-loop.js +35 -30
  110. package/dist/task/critique-probes.d.ts +13 -14
  111. package/dist/task/critique-probes.js +50 -39
  112. package/dist/task/debug-log.d.ts +13 -5
  113. package/dist/task/debug-log.js +32 -20
  114. package/dist/task/decompose-fidelity.d.ts +11 -9
  115. package/dist/task/decompose-fidelity.js +38 -33
  116. package/dist/task/decompose-granularity.d.ts +41 -38
  117. package/dist/task/decompose-granularity.js +41 -38
  118. package/dist/task/deep-render-check.d.ts +22 -14
  119. package/dist/task/deep-render-check.js +40 -31
  120. package/dist/task/dropped-input.d.ts +12 -7
  121. package/dist/task/dropped-input.js +5 -2
  122. package/dist/task/enforce-attribution.d.ts +38 -47
  123. package/dist/task/enforce-attribution.js +46 -52
  124. package/dist/task/enforce-guidelines.d.ts +31 -20
  125. package/dist/task/enforce-guidelines.js +32 -21
  126. package/dist/task/enrichment.d.ts +7 -2
  127. package/dist/task/enrichment.js +26 -14
  128. package/dist/task/env-notes.d.ts +16 -7
  129. package/dist/task/env-notes.js +48 -31
  130. package/dist/task/env-template-closure.d.ts +4 -4
  131. package/dist/task/env-template-closure.js +42 -34
  132. package/dist/task/external-context.d.ts +28 -21
  133. package/dist/task/external-context.js +17 -12
  134. package/dist/task/failure-classifier.d.ts +4 -5
  135. package/dist/task/failure-classifier.js +30 -8
  136. package/dist/task/file-inventory.d.ts +15 -11
  137. package/dist/task/file-inventory.js +25 -22
  138. package/dist/task/final-gate-fix.d.ts +74 -86
  139. package/dist/task/final-gate-fix.js +97 -116
  140. package/dist/task/final-gate-progress.d.ts +29 -46
  141. package/dist/task/final-gate-progress.js +40 -51
  142. package/dist/task/final-gate.d.ts +64 -97
  143. package/dist/task/final-gate.js +192 -199
  144. package/dist/task/fix-child.d.ts +21 -27
  145. package/dist/task/fix-child.js +21 -27
  146. package/dist/task/foreign-path.d.ts +6 -5
  147. package/dist/task/foreign-path.js +0 -0
  148. package/dist/task/frozen-conflict.d.ts +9 -10
  149. package/dist/task/frozen-conflict.js +61 -64
  150. package/dist/task/frozen-path-guard.d.ts +35 -14
  151. package/dist/task/frozen-path-guard.js +56 -39
  152. package/dist/task/gate-child.d.ts +27 -28
  153. package/dist/task/gate-child.js +36 -35
  154. package/dist/task/gate-deps.d.ts +34 -27
  155. package/dist/task/gate-deps.js +169 -159
  156. package/dist/task/gate-tally.d.ts +77 -80
  157. package/dist/task/gate-tally.js +65 -68
  158. package/dist/task/git-state-guard.d.ts +15 -11
  159. package/dist/task/git-state-guard.js +76 -66
  160. package/dist/task/impl-widget.d.ts +25 -16
  161. package/dist/task/impl-widget.js +27 -17
  162. package/dist/task/implementation-guards.d.ts +26 -0
  163. package/dist/task/implementation-guards.js +177 -0
  164. package/dist/task/implementation-thinking.d.ts +33 -31
  165. package/dist/task/implementation-thinking.js +5 -6
  166. package/dist/task/implementation-turn.d.ts +39 -31
  167. package/dist/task/implementation-turn.js +41 -28
  168. package/dist/task/inline-markdown.d.ts +20 -7
  169. package/dist/task/inline-markdown.js +15 -6
  170. package/dist/task/launch-config-gap.js +25 -39
  171. package/dist/task/launch-contract.d.ts +18 -21
  172. package/dist/task/launch-contract.js +28 -30
  173. package/dist/task/launch-manifest.d.ts +6 -2
  174. package/dist/task/launch-manifest.js +35 -34
  175. package/dist/task/ledger.js +16 -14
  176. package/dist/task/lint-fix.d.ts +6 -8
  177. package/dist/task/lint-fix.js +67 -69
  178. package/dist/task/loop-detector.d.ts +27 -8
  179. package/dist/task/loop-detector.js +38 -14
  180. package/dist/task/mid-run-input.d.ts +17 -15
  181. package/dist/task/mid-run-input.js +17 -15
  182. package/dist/task/orchestrator.d.ts +24 -28
  183. package/dist/task/orchestrator.js +89 -66
  184. package/dist/task/orientation.d.ts +18 -23
  185. package/dist/task/orientation.js +24 -31
  186. package/dist/task/owned-freeze-conflict.d.ts +21 -20
  187. package/dist/task/owned-freeze-conflict.js +52 -85
  188. package/dist/task/owned-freeze-reassign.d.ts +40 -60
  189. package/dist/task/owned-freeze-reassign.js +41 -61
  190. package/dist/task/parsers.d.ts +4 -2
  191. package/dist/task/parsers.js +4 -4
  192. package/dist/task/phases.d.ts +41 -48
  193. package/dist/task/phases.js +196 -252
  194. package/dist/task/plan-io.d.ts +6 -7
  195. package/dist/task/plan-io.js +6 -7
  196. package/dist/task/plan-orchestrator.d.ts +10 -8
  197. package/dist/task/plan-orchestrator.js +14 -10
  198. package/dist/task/plan-prompts.d.ts +6 -5
  199. package/dist/task/plan-prompts.js +6 -5
  200. package/dist/task/plan-readonly.d.ts +4 -5
  201. package/dist/task/plan-readonly.js +4 -5
  202. package/dist/task/plan-rounds.d.ts +17 -29
  203. package/dist/task/plan-rounds.js +21 -34
  204. package/dist/task/plan-session.d.ts +58 -72
  205. package/dist/task/plan-session.js +61 -83
  206. package/dist/task/probe-gaming.d.ts +28 -27
  207. package/dist/task/probe-gaming.js +0 -0
  208. package/dist/task/prohibition-probe.d.ts +14 -16
  209. package/dist/task/prompts.d.ts +3 -4
  210. package/dist/task/prompts.js +17 -26
  211. package/dist/task/qa-transcript.d.ts +15 -22
  212. package/dist/task/qa-transcript.js +15 -21
  213. package/dist/task/question-box.d.ts +17 -13
  214. package/dist/task/question-box.js +19 -15
  215. package/dist/task/question-dedup.d.ts +6 -7
  216. package/dist/task/question-dedup.js +13 -14
  217. package/dist/task/question-dialog.d.ts +22 -32
  218. package/dist/task/question-dialog.js +22 -32
  219. package/dist/task/question-source.d.ts +18 -44
  220. package/dist/task/question-source.js +22 -51
  221. package/dist/task/refuted-constraint.d.ts +11 -31
  222. package/dist/task/refuted-constraint.js +27 -51
  223. package/dist/task/regenerable-artifacts.d.ts +12 -31
  224. package/dist/task/regenerable-artifacts.js +12 -31
  225. package/dist/task/render-check.d.ts +11 -22
  226. package/dist/task/render-check.js +33 -46
  227. package/dist/task/repo-health-check.d.ts +10 -14
  228. package/dist/task/repo-health-check.js +17 -23
  229. package/dist/task/requirements.d.ts +38 -71
  230. package/dist/task/requirements.js +78 -126
  231. package/dist/task/research-fanout-budget.d.ts +51 -88
  232. package/dist/task/research-fanout-budget.js +51 -88
  233. package/dist/task/research-worker.d.ts +29 -39
  234. package/dist/task/research-worker.js +37 -61
  235. package/dist/task/resume-gap.d.ts +14 -15
  236. package/dist/task/root-cause-repair.d.ts +9 -9
  237. package/dist/task/root-cause-repair.js +28 -40
  238. package/dist/task/run-bracket.d.ts +10 -13
  239. package/dist/task/run-end.d.ts +12 -22
  240. package/dist/task/run-end.js +8 -16
  241. package/dist/task/run-final-gate.d.ts +19 -21
  242. package/dist/task/run-final-gate.js +62 -80
  243. package/dist/task/runner-globs.d.ts +12 -13
  244. package/dist/task/runner-globs.js +12 -13
  245. package/dist/task/runner-resolve.d.ts +9 -9
  246. package/dist/task/runner-resolve.js +22 -23
  247. package/dist/task/script-escape.d.ts +10 -12
  248. package/dist/task/script-escape.js +13 -14
  249. package/dist/task/serve-entry.d.ts +1 -1
  250. package/dist/task/serve-entry.js +22 -25
  251. package/dist/task/service-blocks.js +4 -2
  252. package/dist/task/shipped-source.d.ts +11 -29
  253. package/dist/task/shipped-source.js +11 -29
  254. package/dist/task/skip-escape.js +10 -14
  255. package/dist/task/spec-urls.d.ts +26 -65
  256. package/dist/task/spec-urls.js +26 -65
  257. package/dist/task/spec-validation.d.ts +17 -20
  258. package/dist/task/spec-validation.js +17 -20
  259. package/dist/task/stall-detector.d.ts +23 -30
  260. package/dist/task/stall-detector.js +23 -30
  261. package/dist/task/stream-watchdog.d.ts +14 -12
  262. package/dist/task/stream-watchdog.js +14 -12
  263. package/dist/task/substitution-probe.d.ts +17 -20
  264. package/dist/task/substitution-probe.js +17 -20
  265. package/dist/task/task-gates.d.ts +36 -41
  266. package/dist/task/task-gates.js +95 -106
  267. package/dist/task/task-io.d.ts +4 -4
  268. package/dist/task/task-io.js +4 -4
  269. package/dist/task/task-parsers.js +4 -3
  270. package/dist/task/task-provenance.d.ts +2 -2
  271. package/dist/task/task-provenance.js +11 -13
  272. package/dist/task/task-types.d.ts +4 -3
  273. package/dist/task/terminal-outcome.d.ts +14 -16
  274. package/dist/task/terminal-outcome.js +12 -14
  275. package/dist/task/test-assembly.d.ts +13 -20
  276. package/dist/task/test-assembly.js +13 -20
  277. package/dist/task/timings.d.ts +5 -3
  278. package/dist/task/timings.js +5 -3
  279. package/dist/task/title-label.d.ts +9 -4
  280. package/dist/task/title-label.js +9 -4
  281. package/dist/task/type-only-answer.d.ts +44 -52
  282. package/dist/task/type-only-answer.js +44 -52
  283. package/dist/task/unfailable-command.d.ts +18 -24
  284. package/dist/task/unfailable-command.js +21 -27
  285. package/dist/task/unknown-routing.d.ts +10 -4
  286. package/dist/task/unknown-routing.js +10 -4
  287. package/dist/task/user-directives.d.ts +5 -8
  288. package/dist/task/user-directives.js +5 -8
  289. package/dist/task/verify-quality.d.ts +18 -22
  290. package/dist/task/verify-quality.js +45 -46
  291. package/dist/task/verify-reconcile.d.ts +15 -10
  292. package/dist/task/verify-reconcile.js +45 -43
  293. package/dist/task/verify-resolution.d.ts +24 -20
  294. package/dist/task/verify-resolution.js +51 -50
  295. package/dist/task/verify-work.d.ts +59 -66
  296. package/dist/task/verify-work.js +101 -138
  297. package/dist/task/widget.d.ts +15 -14
  298. package/dist/task/widget.js +22 -17
  299. package/dist/task/wiring-claims.d.ts +25 -32
  300. package/dist/task/wiring-claims.js +30 -35
  301. package/dist/task/write-guard.d.ts +39 -39
  302. package/dist/task/write-guard.js +48 -51
  303. package/dist/task/yolo.d.ts +34 -30
  304. package/dist/task/yolo.js +42 -37
  305. package/dist/workers/abstention.d.ts +21 -41
  306. package/dist/workers/abstention.js +27 -48
  307. package/dist/workers/brave-search.d.ts +4 -3
  308. package/dist/workers/brave-search.js +5 -2
  309. package/dist/workers/brave-warning.d.ts +7 -4
  310. package/dist/workers/brave-warning.js +19 -7
  311. package/dist/workers/ddg-search.d.ts +6 -6
  312. package/dist/workers/ddg-search.js +18 -12
  313. package/dist/workers/docs-cache.js +5 -2
  314. package/dist/workers/docs-chunk.d.ts +30 -37
  315. package/dist/workers/docs-chunk.js +37 -41
  316. package/dist/workers/docs-core.d.ts +28 -44
  317. package/dist/workers/docs-core.js +25 -44
  318. package/dist/workers/docs-index.js +4 -3
  319. package/dist/workers/docs-lookup.d.ts +15 -22
  320. package/dist/workers/docs-lookup.js +12 -21
  321. package/dist/workers/docs-project.d.ts +15 -9
  322. package/dist/workers/docs-project.js +17 -10
  323. package/dist/workers/docs-resolve.d.ts +19 -20
  324. package/dist/workers/docs-resolve.js +35 -32
  325. package/dist/workers/docs-retrieve.d.ts +5 -6
  326. package/dist/workers/docs-retrieve.js +18 -15
  327. package/dist/workers/exa-search.d.ts +9 -6
  328. package/dist/workers/exa-search.js +23 -12
  329. package/dist/workers/fetch-core.d.ts +13 -16
  330. package/dist/workers/fetch-core.js +23 -23
  331. package/dist/workers/focused-extractor.d.ts +13 -12
  332. package/dist/workers/focused-extractor.js +27 -19
  333. package/dist/workers/html-clean.js +24 -14
  334. package/dist/workers/http-request.d.ts +28 -20
  335. package/dist/workers/http-request.js +22 -17
  336. package/dist/workers/npm-version.d.ts +28 -11
  337. package/dist/workers/npm-version.js +24 -15
  338. package/dist/workers/phantom-imports.d.ts +15 -12
  339. package/dist/workers/phantom-imports.js +30 -24
  340. package/dist/workers/pi-worker-core.d.ts +65 -96
  341. package/dist/workers/pi-worker-core.js +93 -181
  342. package/dist/workers/pi-worker-docs.d.ts +24 -19
  343. package/dist/workers/pi-worker-docs.js +67 -76
  344. package/dist/workers/pi-worker-fetch.d.ts +7 -3
  345. package/dist/workers/pi-worker-fetch.js +27 -19
  346. package/dist/workers/pi-worker-search.js +12 -8
  347. package/dist/workers/pi-worker.d.ts +9 -4
  348. package/dist/workers/pi-worker.js +21 -14
  349. package/dist/workers/reasoning-warning.d.ts +18 -17
  350. package/dist/workers/reasoning-warning.js +22 -20
  351. package/dist/workers/research-cache.js +50 -78
  352. package/dist/workers/search-core.js +7 -5
  353. package/dist/workers/search-types.d.ts +10 -9
  354. package/dist/workers/search-types.js +9 -8
  355. package/dist/workers/session-hint.d.ts +13 -14
  356. package/dist/workers/session-hint.js +8 -9
  357. package/dist/workers/shared.d.ts +21 -25
  358. package/dist/workers/shared.js +0 -0
  359. package/dist/workers/single-read-extension.d.ts +14 -7
  360. package/dist/workers/single-read-extension.js +14 -7
  361. package/dist/workers/single-read-guard.d.ts +27 -30
  362. package/dist/workers/single-read-guard.js +36 -36
  363. package/dist/workers/typeonly-log.d.ts +12 -9
  364. package/dist/workers/typeonly-log.js +29 -33
  365. package/dist/workers/worker-channels.d.ts +15 -23
  366. package/dist/workers/worker-channels.js +15 -23
  367. package/dist/workers/worker-failure.d.ts +38 -46
  368. package/dist/workers/worker-failure.js +31 -39
  369. package/dist/workers/worker-kill.d.ts +25 -26
  370. package/dist/workers/worker-kill.js +16 -19
  371. package/dist/workers/worker-profiles.d.ts +54 -56
  372. package/dist/workers/worker-profiles.js +63 -39
  373. package/package.json +10 -8
@@ -1,14 +1,12 @@
1
1
  /**
2
2
  * render-check — one headless-browser page load against the booted app's live
3
- * listener, judging whether the client actually RENDERED anything (mx5 runs 8 and
4
- * 11).
3
+ * listener, judging whether the client actually RENDERED anything.
5
4
  *
6
- * The failure class: every "renders without runtime errors" check in the pipeline
7
- * was curl — and curl cannot execute JavaScript. Run 8 shipped an app whose ESM
8
- * bundle was loaded in a classic script tag: HTTP 200 on every route, permanently
9
- * BLANK page, all gates green. Run 11 shipped a router with no <Switch> (the 404
10
- * fallback rendered on every page) invisible to every gate for the same reason.
11
- * The gate's boot check proves a LISTENER exists (run 10); this proves the
5
+ * The failure class: every other "renders without runtime errors" check in the
6
+ * pipeline is curl-shaped (boot-probe.ts says so at its own call site), and curl
7
+ * cannot execute JavaScript. An app whose client bundle throws on load answers
8
+ * HTTP 200 on every route and shows a permanently BLANK page, with every such
9
+ * check green. The gate's boot check proves a LISTENER exists; this proves the
12
10
  * listener serves a page whose client code MOUNTS something.
13
11
  *
14
12
  * Mechanism, deterministic and dependency-free: discover a Chrome-family binary
@@ -16,9 +14,9 @@
16
14
  * only found), load the page once with `--headless --dump-dom` (which executes the
17
15
  * page's JS under a virtual-time budget), and judge the RENDERED body: it must
18
16
  * contain visible text or concrete visual/interactive elements. A blank mount
19
- * point after JS ran is the run-8 class — FAIL with the body's shape. What it
20
- * deliberately does NOT judge: correctness of what rendered (run 11's 404-below-
21
- * login needs app knowledge no generic gate has).
17
+ * point after JS ran is the class — FAIL with the body's shape. What it
18
+ * deliberately does NOT judge: whether what rendered is CORRECT. That needs app
19
+ * knowledge no generic gate has.
22
20
  *
23
21
  * Env-gap contract as everywhere: no browser found, a browser that cannot launch,
24
22
  * or a dump that produced nothing → SKIP with a note (the caller surfaces it as
@@ -46,12 +44,10 @@ function onPath(bin) {
46
44
  }
47
45
  /**
48
46
  * The newest Playwright-cache Chromium, if any — the HEADLESS SHELL preferred over
49
- * the full build. Found, never installed: the cache exists on any box that ever ran
50
- * Playwright browsers (the mx5-class projects install it as their own test
51
- * dependency). The headless shell is purpose-built for `--dump-dom` and returns
52
- * promptly on a network URL where the full system chromium can stall under a
53
- * virtual-time budget (validated live on this box: shell exits 0 in ~1s, full
54
- * chromium times out at 30s on the same http:// URL).
47
+ * the full build. Found, never installed: the cache exists on any box that ever
48
+ * ran Playwright browsers, which many projects install as a test dependency. The
49
+ * headless shell is preferred because it is purpose-built for exactly this — one
50
+ * `--dump-dom` and exit with no browser UI to bring up.
55
51
  */
56
52
  export function playwrightCachedChromium() {
57
53
  const cache = process.env.PLAYWRIGHT_BROWSERS_PATH
@@ -146,17 +142,17 @@ export function judgeRenderedDom(html) {
146
142
  const RENDER_TIMEOUT_MS = 30_000;
147
143
  const VIRTUAL_TIME_BUDGET_MS = 8_000;
148
144
  /**
149
- * A Chrome console line on stderr:
145
+ * A Chrome console line on stderr, as chrome-headless-shell writes it:
150
146
  *
151
- * [11506:11506:0814/090315.702981:INFO:CONSOLE:322] "Uncaught ReferenceError:
152
- * process is not defined", source: http://localhost:8791/main.js (322)
147
+ * [0830/084427.287122:INFO:CONSOLE:1] "Uncaught ReferenceError: process is
148
+ * not defined", source: http://127.0.0.1:8791/boom.html (1)
153
149
  *
154
- * Only the severity and the message survive. The bracketed pid/tid/timestamp
155
- * prefix is DROPPED on purpose: it changes every run, and the failure detail is
156
- * the string `normalizeFailureDetail` compares across autofix attempts. A volatile
157
- * prefix in there would make two runs of the SAME defect look different, which is
158
- * a change to the non-progress classifier's behaviour and 19B may not change any
159
- * verdict, only explain one.
150
+ * Only the severity and the message survive. The bracketed timestamp prefix — some
151
+ * builds prepend a pid/tid pair too, which is why the prefix is matched loosely —
152
+ * is DROPPED on purpose: it changes every run, and the failure detail is the string
153
+ * `normalizeFailureDetail` (final-gate-progress.ts) compares across autofix
154
+ * attempts. A volatile prefix in there would make two runs of the SAME defect look
155
+ * different, silently changing the non-progress classifier's behaviour.
160
156
  */
161
157
  const CONSOLE_LINE_RE = /^\[[^\]]*:(INFO|WARNING|ERROR|VERBOSE\d*):CONSOLE:\d*\]\s*(.*)$/;
162
158
  /** At most this many console lines ride along; the whole block is clamped again. */
@@ -164,17 +160,10 @@ const MAX_CONSOLE_LINES = 12;
164
160
  /**
165
161
  * The page's console output, as captured while the DOM was being rendered.
166
162
  *
167
- * MEASURED on this box (2026-08-14) against the shipped mx5 run-21 bundle, both
168
- * binaries the probe can discover:
169
- *
170
- * /usr/bin/chromium --dump-dom alone → 0 bytes of stderr
171
- * + --enable-logging=stderr --v=0 → 2 CONSOLE
172
- * lines, one of them the cause
173
- * playwright chrome-headless-shell
174
- * → the 2 CONSOLE lines either way
175
- *
176
- * and in ALL FOUR arms stdout was byte-identical at 318 bytes, so the DOM the
177
- * judge reads is untouched by the flags.
163
+ * `--enable-logging=stderr --v=0` is what routes the page's console to stderr.
164
+ * The DOM the judge reads is untouched by those flags: with and without them,
165
+ * `--dump-dom` writes byte-identical stdout on both binaries this probe can
166
+ * discover.
178
167
  */
179
168
  export function parseConsoleLines(stderr) {
180
169
  const out = [];
@@ -196,11 +185,9 @@ export function parseConsoleLines(stderr) {
196
185
  /**
197
186
  * Append the console output to a FAIL detail — and to nothing else.
198
187
  *
199
- * WHY (nexttask 19B; the class 18A opened for repo-health). Run 21's fix child was
200
- * told "the body is EMPTY" and nothing more. It spent 45 minutes on tests, bundler
201
- * config and static serving, read the offending line twice, and moved on. The
202
- * probe was holding the answer the whole time: `Uncaught ReferenceError: process
203
- * is not defined`, at main.js:322.
188
+ * Without it the fix child is told "the body is EMPTY" and nothing more, while the
189
+ * probe was holding the cause the whole time: the page's own
190
+ * `Uncaught ReferenceError`, with the source file and line Chrome already printed.
204
191
  *
205
192
  * Strictly additive by construction: it takes an existing FAIL detail and returns
206
193
  * it with text appended. It cannot turn a PASS into a FAIL, cannot reach
@@ -232,9 +219,9 @@ export function runRenderCheck(url, browser) {
232
219
  '--no-sandbox',
233
220
  '--disable-dev-shm-usage',
234
221
  `--virtual-time-budget=${VIRTUAL_TIME_BUDGET_MS}`,
235
- // Route the page's console to stderr (nexttask 19B). stdout — the DOM
236
- // the judge reads — is byte-identical with and without these; measured
237
- // on both discoverable binaries, see withConsoleEvidence.
222
+ // Route the page's console to stderr. stdout — the DOM the judge
223
+ // reads — is byte-identical with and without these; see
224
+ // parseConsoleLines.
238
225
  '--enable-logging=stderr',
239
226
  '--v=0',
240
227
  '--dump-dom',
@@ -255,7 +242,7 @@ export function runRenderCheck(url, browser) {
255
242
  }
256
243
  const judged = judgeRenderedDom(dom);
257
244
  // The verdict is the judge's, unchanged. Only a FAIL grows: it carries the
258
- // console output the probe already had at the moment it judged (19B).
245
+ // console output the probe already had at the moment it judged.
259
246
  return judged.ok ?
260
247
  { outcome: 'pass', detail: judged.detail }
261
248
  : { outcome: 'fail', detail: withConsoleEvidence(judged.detail, r.stderr ?? '') };
@@ -9,11 +9,10 @@ export interface HealthOutcome {
9
9
  ecosystem: string | null;
10
10
  /**
11
11
  * First lines of the failing command's combined stderr+stdout — captured so a
12
- * FAIL is explainable from artifacts alone. Run-8 F8: five enforce passes were
13
- * discarded on "`bun run lint` exited 2" and the cause was unreproducible
14
- * post-run because only the exit code was recorded (exit 2 is the linter's
15
- * CRASH class; findings exit 1 the captured output is what tells them apart).
16
- * Empty string on pass / skip.
12
+ * FAIL is explainable from artifacts alone. The exit code alone does not say
13
+ * what happened: eslint exits 1 for findings and 2 when it could not run at
14
+ * all (a missing config, say), so "`bun run lint` exited 2" is unreproducible
15
+ * after the fact unless the output was kept. Empty string on pass / skip.
17
16
  */
18
17
  output: string;
19
18
  }
@@ -41,17 +40,14 @@ export type HealthProgress = (command: string) => void;
41
40
  * treated as an environment gap, not a fault.
42
41
  * - A command that ran and exited non-zero → the first such failure is returned.
43
42
  *
44
- * This module owns DISCOVERY and its own output policy; running a command and
45
- * deciding what its ending MEANS is `command-run.ts`'s. It used to own those too —
46
- * `HealthRun`, `classifyHealthRun` and `spawnHealthCommand` were a second statement
47
- * of the gap ladder, with no injectable runner, so every classification case in the
48
- * suite spawned a real shell. `command-run.ts`'s own header notes that this module
49
- * "had solved exactly this shape years earlier" and the gate never adopted it; this
50
- * is the adoption, in the other direction.
43
+ * This module owns DISCOVERY and its own output policy. Running a command and
44
+ * deciding what its ending MEANS is `command-run.ts`'s one statement of the
45
+ * env-gap ladder, with an injectable runner, so a classification case needs no
46
+ * real shell.
51
47
  *
52
48
  * `captureHealthOutput` stays this module's own: 40 lines of a linter's report is a
53
- * real difference from `outputTail`'s 400 characters, and that is a parameter, not a
54
- * thing to unify.
49
+ * real difference from `outputTail`'s 400-character default, and that is a
50
+ * parameter, not a thing to unify.
55
51
  *
56
52
  * `onCommand` lets the caller name the running command in a live status line — the
57
53
  * gate runs this immediately after the implementation turn ends, when the impl
@@ -1,27 +1,24 @@
1
1
  /**
2
2
  * repo-health-check — the deterministic, whole-repo half of the verify gate.
3
3
  *
4
- * The failure this closes (proven on the mx5 run): the verify gate ran only the
5
- * task's OWN composed VERIFY block, and that block is authored per-task by the local
6
- * model so it is inconsistent. Some tasks lint the whole repo, some (TASK_0021)
7
- * ship a VERIFY of `tsc --noEmit` ONLY, with no lint at all. A/B on the live model,
8
- * 5 runs/arm on the real dirty tree: the tsc-only task false-PASSed 5/5 while
9
- * `bun run lint` reported 11 errors. The model gate is only ever as good as the
4
+ * The failure this closes: the task's own composed VERIFY block is authored
5
+ * per-task by a model, so what it covers varies. One task lints the whole repo;
6
+ * the next ships a VERIFY of `tsc --noEmit` and no lint at all, and a lint-only
7
+ * regression then passes its gate. The model gate is only ever as good as the
10
8
  * VERIFY block it happened to be handed.
11
9
  *
12
10
  * This check does NOT depend on that block. It discovers the project's OWN
13
11
  * whole-repo static-analysis command (the one a fresh checkout / CI would run) and
14
12
  * lets its REAL exit code decide — no model, so there is no per-file narrowing and
15
- * no "those errors aren't in my files" gray area. A non-zero exit is a FAIL that the
16
- * caller turns into the existing verify-FAIL outcome (→ the AUTOFIX / ACCEPT /
17
- * dismiss picker; the user decides).
13
+ * no "those errors aren't in my files" gray area. A non-zero exit becomes the
14
+ * verify gate's `repo-health` FAIL (verify-work.ts), which reaches the
15
+ * AUTOFIX / ACCEPT picker in verify-resolution.ts.
18
16
  *
19
17
  * Scope is deliberately STATIC ANALYSIS ONLY (lint / typecheck / clippy / vet), never
20
18
  * `test`, `build`, `run`, or anything that boots a server or needs a database. Those
21
19
  * depend on external services the verify prompt already carves out as an environment
22
- * gap running them here would re-introduce the false-FAIL that once wrongly blamed
23
- * code for a missing DB. Static analysis is hermetic: it needs no network, no service,
24
- * no fixtures, and it is exactly the class of the reported defect.
20
+ * gap, so running them here would blame code for a missing database. Static analysis
21
+ * is hermetic: it needs no network, no service and no fixtures.
25
22
  *
26
23
  * Absence is a PASS, two ways: (1) no recognised manifest at all (a pure-docs or
27
24
  * config-only repo has nothing that can regress); (2) a manifest with no static-check
@@ -78,7 +75,7 @@ export function discoverHealthCommands(cwd) {
78
75
  if (existsSync(path.join(cwd, 'package.json'))) {
79
76
  const s = packageScripts(cwd);
80
77
  const cmds = [];
81
- // Only static-analysis scripts. `lint` commonly chains tsc (as in mx5's
78
+ // Only static-analysis scripts. `lint` commonly chains tsc (as in this
82
79
  // `prettier && eslint && tsc`), so a single `bun run lint` covers both.
83
80
  for (const name of ['lint', 'typecheck']) {
84
81
  if (s[name])
@@ -118,17 +115,14 @@ function noCommandOutcome(ecosystem) {
118
115
  * treated as an environment gap, not a fault.
119
116
  * - A command that ran and exited non-zero → the first such failure is returned.
120
117
  *
121
- * This module owns DISCOVERY and its own output policy; running a command and
122
- * deciding what its ending MEANS is `command-run.ts`'s. It used to own those too —
123
- * `HealthRun`, `classifyHealthRun` and `spawnHealthCommand` were a second statement
124
- * of the gap ladder, with no injectable runner, so every classification case in the
125
- * suite spawned a real shell. `command-run.ts`'s own header notes that this module
126
- * "had solved exactly this shape years earlier" and the gate never adopted it; this
127
- * is the adoption, in the other direction.
118
+ * This module owns DISCOVERY and its own output policy. Running a command and
119
+ * deciding what its ending MEANS is `command-run.ts`'s one statement of the
120
+ * env-gap ladder, with an injectable runner, so a classification case needs no
121
+ * real shell.
128
122
  *
129
123
  * `captureHealthOutput` stays this module's own: 40 lines of a linter's report is a
130
- * real difference from `outputTail`'s 400 characters, and that is a parameter, not a
131
- * thing to unify.
124
+ * real difference from `outputTail`'s 400-character default, and that is a
125
+ * parameter, not a thing to unify.
132
126
  *
133
127
  * `onCommand` lets the caller name the running command in a live status line — the
134
128
  * gate runs this immediately after the implementation turn ends, when the impl
@@ -141,7 +135,7 @@ export async function runRepoHealthCheck(cwd, opts = {}) {
141
135
  const run = opts.run ?? spawnCommand;
142
136
  for (const [bin, args] of cmds) {
143
137
  opts.onCommand?.(`${bin} ${args.join(' ')}`);
144
- // Runner resolution (mx5 run 16): a PATH-stripped environment must not
138
+ // Runner resolution: a PATH-stripped environment must not
145
139
  // silently skip the statics when the runner sits at a known install
146
140
  // location; the resolved dir also rides on PATH for the script chain.
147
141
  const runner = resolveRunner(bin);
@@ -13,16 +13,12 @@ export declare function parseRequirementLines(text: string): RequirementEntry[];
13
13
  * passages from doc-order truncation. */
14
14
  export declare function keepGroundedRequirements(entries: RequirementEntry[], sourceDoc: string): RequirementEntry[];
15
15
  /**
16
- * Bound the list WITHOUT doc-order truncation. Two measured failure shapes drive
17
- * the rule:
18
- * - an eager model extracts 40+ items top-down (every §1 decision row), so a
19
- * plain first-N cap systematically drops the TAIL sections exactly where
20
- * mx5 keeps its testing obligations;
21
- * - "given order" as the tie-break re-creates the same tail bias one level up
22
- * (mx5 run 16, measured live: the model emitted 185 requirements, 178
23
- * grounded — INCLUDING §9's "serves `/api` + static `dist/`", the clause
24
- * whose loss shipped a permanently blank app — and the cap's doc-order fill
25
- * cut all 138 past the cap, every one from the design's tail).
16
+ * Bound the list WITHOUT doc-order truncation. An extractor that works top-down
17
+ * yields more entries than the cap from the doc's early sections alone, so a
18
+ * plain first-N cap drops the TAIL sections wholesale and a spec keeps its
19
+ * testing and deployment obligations at the end. "Given order" as the tie-break
20
+ * re-creates the same bias one level up.
21
+ *
26
22
  * Rule (deterministic priority, not a knob): entries quoting an obligation-
27
23
  * marked passage survive first; the remaining budget is filled ROUND-ROBIN
28
24
  * across the source doc's sections (each section's entries in doc order), so
@@ -32,9 +28,9 @@ export declare function keepGroundedRequirements(entries: RequirementEntry[], so
32
28
  * cannot be located) the fill degrades to the old given-order behavior.
33
29
  */
34
30
  export declare function capRequirements(entries: RequirementEntry[], passages: string[], sourceDoc?: string,
35
- /** A/B seam: `false` reproduces the pre-budget rule, so an offline harness can
36
- * score the shipped rule against the one it replaced without transcribing
37
- * sectionFairFill and letting the copy drift. Production never passes it. */
31
+ /** `false` skips the low-value deprioritisation, so a caller can compare the
32
+ * two fills without transcribing sectionFairFill. Production never passes it
33
+ * auto-orchestrator.ts calls this with three arguments. */
38
34
  deprioritiseLowValue?: boolean): RequirementEntry[];
39
35
  /**
40
36
  * Quotes that pass the grounding guard (verbatim substring of the doc) but state
@@ -46,11 +42,11 @@ export declare function isLowValueQuote(quote: string): boolean;
46
42
  /**
47
43
  * DETERMINISTIC RECALL FLOOR (same medicine as the launch-contract checklist):
48
44
  * paragraphs carrying an obligation marker (word-bounded "required"/"must").
49
- * Extraction recall over a 20KB doc is the weak model's, and it is variance-
50
- * prone measured live, 1 of 5 runs kept 16 quotes with ZERO §10 items. The
51
- * host enumerates the marked passages; the prompt lists their head lines as a
52
- * checklist, and uncoveredPassages() below turns "a marked passage produced no
53
- * quote" into hard evidence for one forced re-extraction.
45
+ * Extraction recall over a long doc is the model's, and it varies run to run, so
46
+ * an entire section can come back with no quotes at all. The host enumerates the
47
+ * marked passages; the prompt lists their head lines as a checklist, and
48
+ * uncoveredPassages() below turns "a marked passage produced no quote" into hard
49
+ * evidence for one forced re-extraction.
54
50
  */
55
51
  export declare function enumerateObligationPassages(doc: string): string[];
56
52
  /** Marked passages none of the kept quotes came from — the hard evidence that
@@ -106,22 +102,23 @@ export declare function readRequirements(cwd: string): Promise<string>;
106
102
  * • `unresolved` — grounded requirements still unmapped after the retry rounds.
107
103
  * • `judgeFlagged` — free-text areas the holistic coverage judge flagged as
108
104
  * uncovered that requirement-extraction never captured as a tracked entry, so
109
- * the grounded channels above are structurally blind to them (mx5 2026-07-16:
110
- * §10's test-infra setup was seen ONLY by the judge and, having no carrier,
111
- * was warned-about then dropped). These are plain strings, not quotes of the
112
- * source; marked distinctly so a task can tell an inferred area from a verbatim
113
- * obligation.
105
+ * the grounded channels above are structurally blind to them: without this
106
+ * channel such an area is warned about once and then dropped. These are plain
107
+ * strings, not quotes of the source; marked distinctly so a task can tell an
108
+ * inferred area from a verbatim obligation.
114
109
  * • `danglingArtifacts` — runtime files the spec references but nothing
115
- * produces (mx5 run 13: the served `index.html` no task, tree entry, or
116
- * build output ever created), still unclaimed by any title at coverage
110
+ * produces (an `index.html` the server serves that no task, tree entry or
111
+ * build output ever creates), still unclaimed by any title at coverage
117
112
  * exhaustion. Deterministically extracted (artifact-closure.ts), so like
118
113
  * judge areas they are host-authored strings, not source quotes.
119
114
  */
120
115
  export declare function appendCarriedRequirements(cwd: string, crossCutting: RequirementEntry[], unresolved?: RequirementEntry[], judgeFlagged?: string[], danglingArtifacts?: string[]): Promise<void>;
121
116
  /**
122
117
  * The read-only block refine/compose receive when carried requirements exist.
123
- * Verbatim content travels with every task (the directive pattern that works),
124
- * and the VERIFY mandate is explicitgoal C rides here.
118
+ * Verbatim content travels with every task the REFINE_PRESERVE_DIRECTIVE
119
+ * pattern in phases.ts, content rather than a pointer and the VERIFY mandate is
120
+ * spelled out, so a mandated verification methodology reaches every applicable
121
+ * task's runnable checks.
125
122
  */
126
123
  export declare function buildRequirementsBlock(requirements: string): string;
127
124
  export interface OwnedRequirement {
@@ -133,7 +130,7 @@ export interface OwnedRequirement {
133
130
  * plan time, and spliced repair tasks shift them). */
134
131
  title: string;
135
132
  /**
136
- * DETACHED (nexttask 2, owned-freeze-reassign.ts): the files this obligation
133
+ * DETACHED: the files this obligation
137
134
  * names that its assigned task FROZE, making it unsatisfiable there. While
138
135
  * set, the entry is owned by nobody — `ownedForTitle` skips it — and `title`
139
136
  * records only where it came from. The next task whose refined prompt shows
@@ -162,50 +159,20 @@ export declare function ownedForTitle(owned: OwnedRequirement[], title: string):
162
159
  * task's obligations and must survive into the spec. */
163
160
  export declare function buildOwnedRequirementsBlock(owned: OwnedRequirement[]): string;
164
161
  /**
165
- * BRACES for the owned channel (the PROMPT-1 pattern): deterministically append
166
- * each owned obligation the composed spec does not already carry as a
167
- * CONSTRAINTS bullet. Measured need (scripts/live-owned-requirement-compose-ab
168
- * .ts, 8 reps/arm on two real run-16 losses): with the belt block alone compose
169
- * folded the clause into CONSTRAINTS/ACCEPTANCE in only 2/8 reps per fixture
170
- * (baseline 0/8) an instruction the model mostly ignores, the PROMPT-4 shape.
171
- * A host-side append cannot be ignored. "Already carries" = the normalised
172
- * quote appears anywhere in the spec — belt-obeying reps aren't double-stated.
173
- * No CONSTRAINTS section (shape-invalid spec) → returned unchanged; this runs
174
- * only on specs the shape gate already accepted.
175
- *
176
- * NOT EXTENDED TO CONSUMER TASKS — REFUTED AT STEP 0, 2026-07-27. The proposal
177
- * was to classify owned requirements INVARIANT (prohibition-shaped) vs
178
- * DELIVERABLE and propagate the INVARIANTs from here to every task whose spec
179
- * names the same symbol/file, because mx5 run 17 gave all three Hono-RPC
180
- * obligations to TASK_0021 (which complied perfectly) while the four CONSUMER
181
- * tasks that never saw them — 0027/0031/0033/0034 — hand-wrote casts and shipped
182
- * 7 dead client call sites. It was not built, for two measured reasons
183
- * (scripts/owned-consumer-generality-step0.ts, re-runnable):
184
- *
185
- * 1. IT DOES NOT GENERALIZE. The task's own kill condition was <20% of a second
186
- * stack's OWNED requirements being prohibition-shaped. IAR1, 8 live
187
- * regenerations of the real plan-time pipeline over its real 10-task list:
188
- * 2/42 pooled = 4.8% (narrow four-phrase reading 1/42 = 2.4%). mx5 itself is
189
- * 7/33 = 21.2% only under the BROAD rule above; under "never/don't/must
190
- * not/do not" it is 2/33 = 6.1%. The structural reason is in accountCoverage
191
- * right here: a prohibition the map leaves NONE is already carried
192
- * cross-cutting to every task, so in the five reps that logged the split 18
193
- * of IAR1's 19 prohibition-shaped requirements were never owner-only in the
194
- * first place. mx5's 7 leaked because the model mapped them to a TASK.
195
- * 2. THE TARGETING RULE MISSES ITS OWN MOTIVATING CASE. Symbol/file relevance
196
- * would not have reached the four violators for the clause they actually
197
- * broke ("If a call isn't fully typed end-to-end via `hc`, fix the route
198
- * chaining/export, don't paper over it…"): its only extractable symbol is
199
- * `chaining/export`, which no consumer spec contains — 0 consumers. Its
200
- * siblings would have reached all four, attaching to 13/41 tasks each; across
201
- * mx5's 33 owned requirements the mean attach rate is 21% of all tasks and
202
- * 5/33 would attach to more than half of them (the task's own I1 trigger).
162
+ * The host-side belt for the owned channel: deterministically append each owned
163
+ * obligation the composed spec does not already carry as a CONSTRAINTS bullet.
164
+ * The injected block alone is an instruction compose can ignore; an append
165
+ * cannot be. "Already carries" = the normalised quote appears anywhere in the
166
+ * spec, so a spec that DID fold the clause in is not double-stated. No
167
+ * CONSTRAINTS section returned unchanged; this runs only on specs the shape
168
+ * gate already accepted.
203
169
  *
204
- * Do not re-open on mx5 evidence alone. A future attempt needs a second stack
205
- * where prohibition-shaped requirements actually land OWNED, and a targeting rule
206
- * that survives a clause whose symbols are prose.
170
+ * Scoped to the OWNING task only. A prohibition the coverage map leaves unowned is
171
+ * already carried cross-cutting to every task by `accountCoverage` above, so the
172
+ * owned channel is not the place to reach a requirement's other readers.
207
173
  */
208
174
  export declare function appendOwnedConstraints(spec: string, owned: OwnedRequirement[]): string;
209
- /** The decompose-prompt ledger block (goal E's belt): the grounded requirement
210
- * list rides into decompose so structure-mirroring can't discharge it. */
175
+ /** The decompose-prompt ledger block: the grounded requirement list rides into
176
+ * decompose so a title list that mirrors the spec's own headings cannot
177
+ * discharge it. */
211
178
  export declare function buildRequirementsLedger(requirements: RequirementEntry[]): string;