clearotron 0.2.0 → 0.2.2

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 (629) hide show
  1. package/.env.example +105 -0
  2. package/CONTRIBUTING.md +3 -3
  3. package/INSTALL.md +57 -52
  4. package/README.md +2 -1
  5. package/bin/brandowner.mjs +1 -1
  6. package/bin/clearotron.mjs +4 -4
  7. package/bin/connect.mjs +2 -2
  8. package/bin/example.mjs +114 -37
  9. package/bin/grant.mjs +3 -3
  10. package/bin/key.mjs +1 -1
  11. package/bin/onboard.mjs +97 -119
  12. package/bin/start.mjs +29 -25
  13. package/bin/stop.mjs +65 -3
  14. package/bin/update.mjs +7 -7
  15. package/bin/uspto-sync.mjs +1 -1
  16. package/build-info.json +2 -2
  17. package/docs/DELIVERY.md +6 -2
  18. package/docs/RELEASES.md +6 -4
  19. package/docs/architecture/01-product-overview.md +2 -2
  20. package/docs/architecture/02-architecture.md +2 -2
  21. package/docs/architecture/04-configuration-reference.md +7 -4
  22. package/docs/architecture/05-config-governance.md +38 -5
  23. package/docs/architecture/06-operations-runbook.md +13 -1
  24. package/docs/architecture/09-security-and-data.md +1 -1
  25. package/docs/decisions/0004-documentation-structure.md +1 -1
  26. package/driver/CHANGELOG.md +95 -1
  27. package/driver/README.md +2 -2
  28. package/driver/ask-ledger.mjs +72 -4
  29. package/driver/authority-trees.mjs +1 -1
  30. package/driver/call-capture.mjs +1 -1
  31. package/driver/card-frame.mjs +1 -1
  32. package/driver/case-law-ledger.mjs +1 -1
  33. package/driver/claim-liveness.mjs +1 -1
  34. package/driver/common-law-receipts.mjs +1 -1
  35. package/driver/commonlaw-carry.mjs +1 -1
  36. package/driver/config-inventory.mjs +1 -1
  37. package/driver/connotation-search.mjs +12 -12
  38. package/driver/contract-audit.mjs +5 -5
  39. package/driver/contract-dictation-registry.mjs +4 -4
  40. package/driver/contract-dictation.mjs +2 -2
  41. package/driver/contract-e3-backlog.mjs +6 -6
  42. package/driver/contract-vocabulary.mjs +3 -3
  43. package/driver/corrections-feedforward.mjs +1 -1
  44. package/driver/coverage-form-io.mjs +2 -2
  45. package/driver/coverage-form.mjs +4 -4
  46. package/driver/coverage-ledger.mjs +3 -3
  47. package/driver/coverage-union.mjs +1 -1
  48. package/driver/declination-call.mjs +35 -3
  49. package/driver/declination-duty.mjs +1 -1
  50. package/driver/deliver-trigger.sh +3 -3
  51. package/driver/deploy-live-run-guard.mjs +6 -2
  52. package/driver/dev-portal.mjs +1 -1
  53. package/driver/disposition-call.mjs +4 -4
  54. package/driver/disposition-tool.mjs +4 -4
  55. package/driver/disposition-union.mjs +2 -2
  56. package/driver/doc-constants.mjs +1 -1
  57. package/driver/door-gates.mjs +2 -2
  58. package/driver/doubt-selection.mjs +2 -2
  59. package/driver/drainer-identity.mjs +1 -1
  60. package/driver/driver.config.mjs +63 -11
  61. package/driver/e2e-rounds.mjs +2 -2
  62. package/driver/effort-model.mjs +2 -2
  63. package/driver/engine/anthropic-agent.mjs +24 -24
  64. package/driver/engine/auth.mjs +1 -1
  65. package/driver/engine/common.mjs +1 -1
  66. package/driver/engine/deny-authority-write.mjs +1 -1
  67. package/driver/engine/jx-turn.mjs +1 -1
  68. package/driver/engine/mcp/clarivate-server.mjs +1 -1
  69. package/driver/engine/mcp/corsearch-server.mjs +1 -1
  70. package/driver/engine/mcp/declination-server.mjs +1 -1
  71. package/driver/engine/mcp/dispositions-server.mjs +1 -1
  72. package/driver/engine/mcp/euipo-server.mjs +1 -1
  73. package/driver/engine/mcp/fetch-server.mjs +1 -1
  74. package/driver/engine/mcp/free-tier-server.mjs +2 -2
  75. package/driver/engine/mcp/gather-config.mjs +11 -11
  76. package/driver/engine/mcp/perplexity-server.mjs +1 -1
  77. package/driver/engine/mcp/recording-server.mjs +8 -4
  78. package/driver/engine/mcp/signa-server.mjs +1 -1
  79. package/driver/engine/mcp/uspto-local-server.mjs +1 -1
  80. package/driver/engine/openai-agent.mjs +2 -2
  81. package/driver/engine-build.mjs +2 -2
  82. package/driver/enqueue-schema.mjs +2 -2
  83. package/driver/enqueue.mjs +1 -1
  84. package/driver/envelope-settle.mjs +1 -1
  85. package/driver/evidence-claim-invariant.mjs +2 -2
  86. package/driver/findings-model.mjs +8 -8
  87. package/driver/floor-duty.mjs +1 -1
  88. package/driver/form-neighbourhood.mjs +1 -1
  89. package/driver/framework.mjs +1 -1
  90. package/driver/gateway.mjs +28 -23
  91. package/driver/grounds-grammar.mjs +1 -1
  92. package/driver/hit-list.mjs +1 -1
  93. package/driver/jurisdiction-systems.mjs +1 -1
  94. package/driver/jx-lanes.mjs +1 -1
  95. package/driver/jx-units.mjs +1 -1
  96. package/driver/jx.mjs +3 -3
  97. package/driver/knockout-assess-record.mjs +5 -1
  98. package/driver/narrative-refutation-record.mjs +3 -3
  99. package/driver/numeric-setting.mjs +1 -1
  100. package/driver/owner-use-check.mjs +184 -0
  101. package/driver/package.json +2 -2
  102. package/driver/phase0.mjs +1 -1
  103. package/driver/pipeline-knockout.mjs +52 -4
  104. package/driver/pipeline.mjs +215 -63
  105. package/driver/placement-diff.mjs +2 -2
  106. package/driver/placement-form.mjs +4 -4
  107. package/driver/placement-union.mjs +1 -1
  108. package/driver/portal-acks.mjs +1 -1
  109. package/driver/portal-config-view.mjs +2 -2
  110. package/driver/portal-local-auth.mjs +1 -1
  111. package/driver/portal-report.mjs +6 -6
  112. package/driver/portal-service.mjs +15 -15
  113. package/driver/predelivery-lint.mjs +29 -11
  114. package/driver/prelim-variants-record.mjs +2 -2
  115. package/driver/profile-page.html +1 -1
  116. package/driver/profile-selection.mjs +1 -1
  117. package/driver/profile-service.mjs +2 -2
  118. package/driver/profiles.mjs +1 -1
  119. package/driver/progress.mjs +6 -6
  120. package/driver/provider-usage.mjs +1 -1
  121. package/driver/publish/demo-marking.mjs +1 -1
  122. package/driver/publish/index.mjs +47 -6
  123. package/driver/publish/knockout.mjs +36 -14
  124. package/driver/publish/parse.mjs +4 -4
  125. package/driver/publish/publish-inputs.mjs +2 -2
  126. package/driver/publish/register-presence.mjs +1 -1
  127. package/driver/publish/render-knockout.mjs +198 -31
  128. package/driver/publish/report-data.mjs +13 -3
  129. package/driver/publish/seed-pool.mjs +24 -9
  130. package/driver/queue-watch-probe.mjs +1 -1
  131. package/driver/queue-watch-verdict.mjs +1 -1
  132. package/driver/recall-reconciliation.mjs +1 -1
  133. package/driver/recipe-service.mjs +1 -1
  134. package/driver/record-carry.mjs +141 -2
  135. package/driver/recording-agreement.mjs +3 -3
  136. package/driver/reference-score.mjs +59 -9
  137. package/driver/reference-strip-signatures.mjs +68 -0
  138. package/driver/refusal-bound.mjs +3 -3
  139. package/driver/register-availability.mjs +2 -2
  140. package/driver/register-count.mjs +1 -1
  141. package/driver/register-digest-record.mjs +31 -1
  142. package/driver/register-grant-vocabulary.mjs +2 -2
  143. package/driver/register-plan.mjs +8 -8
  144. package/driver/register-records.mjs +2 -2
  145. package/driver/registry-fidelity.mjs +3 -3
  146. package/driver/remedy-accounting.mjs +1 -1
  147. package/driver/repair-composers.mjs +2 -2
  148. package/driver/repair-digest.mjs +3 -3
  149. package/driver/repairs.mjs +7 -7
  150. package/driver/replay-archive.mjs +2 -0
  151. package/driver/report-card-record.mjs +2 -2
  152. package/driver/result-noun-fields.mjs +10 -3
  153. package/driver/run-economics.mjs +2 -2
  154. package/driver/run-integrity.mjs +1 -1
  155. package/driver/runner.mjs +22 -22
  156. package/driver/scope-rules.mjs +1 -1
  157. package/driver/search-policy.mjs +3 -3
  158. package/driver/skeptic-search.mjs +1 -1
  159. package/driver/skills/blind-frame/SKILL.md +1 -1
  160. package/driver/skills/case-law-citation/SKILL.md +2 -2
  161. package/driver/skills/knockout-assess/SKILL.md +10 -4
  162. package/driver/skills/prelim-search/SKILL.md +2 -2
  163. package/driver/skills/prelim-search/template-formatting.md +1 -1
  164. package/driver/skills/prelim-search/templates/email/generic.md +1 -1
  165. package/driver/skills/prelim-search/worked-examples.md +1 -1
  166. package/driver/skills/prelim-variants/SKILL.md +2 -2
  167. package/driver/stage-context.mjs +1 -1
  168. package/driver/stages-knockout.mjs +55 -4
  169. package/driver/stages.mjs +97 -40
  170. package/driver/stray-artifacts.mjs +2 -2
  171. package/driver/suite-census.json +188 -44
  172. package/driver/synthesis-record.mjs +1 -1
  173. package/driver/systemd/clearotron-client-mcp.service +1 -1
  174. package/driver/systemd/clearotron-portal.service +1 -1
  175. package/driver/systemd/render-units.mjs +1 -1
  176. package/driver/tokens.mjs +1 -1
  177. package/driver/tool-calls.mjs +1 -1
  178. package/driver/turnaround-bands.mjs +1 -1
  179. package/driver/unit-file-drift.mjs +1 -1
  180. package/driver/unit-inventory.mjs +121 -61
  181. package/driver/unit-state-verdict.mjs +20 -12
  182. package/driver/verify-knockout.mjs +10 -2
  183. package/driver/verify.mjs +14 -14
  184. package/driver/whatif-memo-run.mjs +46 -5
  185. package/driver/whatif-queue.mjs +1 -1
  186. package/driver/whatif-worker.mjs +1 -1
  187. package/mcp-server/CHANGELOG.md +12 -0
  188. package/mcp-server/README.md +3 -3
  189. package/mcp-server/http-server.mjs +44 -1
  190. package/mcp-server/key-socket.mjs +184 -0
  191. package/mcp-server/lib/audit-view.mjs +69 -2
  192. package/mcp-server/lib/brief.mjs +15 -0
  193. package/mcp-server/lib/driver.mjs +7 -1
  194. package/mcp-server/lib/events.mjs +1 -1
  195. package/mcp-server/lib/http-handler.mjs +1 -1
  196. package/mcp-server/lib/knockout.mjs +435 -0
  197. package/mcp-server/lib/ops.mjs +4 -4
  198. package/mcp-server/lib/options.mjs +1 -1
  199. package/mcp-server/lib/plan.mjs +1 -1
  200. package/mcp-server/lib/runs.mjs +1 -1
  201. package/mcp-server/lib/scrub.mjs +1 -1
  202. package/mcp-server/lib/whatif.mjs +12 -3
  203. package/mcp-server/mint-token.mjs +1 -1
  204. package/mcp-server/package.json +2 -2
  205. package/mcp-server/server.mjs +76 -11
  206. package/package.json +3 -3
  207. package/portal-ui/package.json +1 -1
  208. package/providers/_shared/enumerate.mjs +1 -1
  209. package/providers/_shared/ledger-path.mjs +3 -3
  210. package/providers/_shared/ledger.mjs +1 -1
  211. package/providers/_shared/result-shape.mjs +3 -3
  212. package/providers/_shared/term-shape.mjs +1 -1
  213. package/providers/corsearch/src/core.js +1 -1
  214. package/providers/jx-subclass/BUILDING.md +1 -1
  215. package/providers/oauth-mcp-bridge/CHANGELOG.md +12 -0
  216. package/providers/oauth-mcp-bridge/package.json +1 -1
  217. package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
  218. package/scripts/README.md +1 -1
  219. package/scripts/added-reference-check.mjs +29 -1
  220. package/scripts/ai-page-render-check.mjs +2 -1
  221. package/scripts/authority-boundary-probe.mjs +1 -1
  222. package/scripts/backfill-started-at.mjs +1 -1
  223. package/scripts/citation-line-check.mjs +3 -3
  224. package/scripts/clearances-render-check.mjs +4 -3
  225. package/scripts/compare.mjs +2 -2
  226. package/scripts/composer-render-check.mjs +6 -6
  227. package/scripts/contract-dictation-scan.mjs +2 -2
  228. package/scripts/dead-names.mjs +1 -1
  229. package/scripts/drain-preflight.mjs +5 -5
  230. package/scripts/e2e-unread-terminals.mjs +1 -1
  231. package/scripts/e2e.mjs +8 -8
  232. package/scripts/env-audit.mjs +27 -7
  233. package/scripts/env-classify.mjs +139 -15
  234. package/scripts/freeze-example-run.mjs +3 -3
  235. package/scripts/head-arrived-gated.mjs +1 -1
  236. package/scripts/headless-page.mjs +274 -0
  237. package/scripts/home-render-check.mjs +3 -2
  238. package/scripts/live-surface-check.mjs +92 -19
  239. package/scripts/main-health.mjs +1 -1
  240. package/scripts/merge-presence-check.mjs +3 -3
  241. package/scripts/mint-reference-strip-backlog.mjs +41 -0
  242. package/scripts/mint-suite-census.mjs +6 -6
  243. package/scripts/nightly-notice.mjs +1 -1
  244. package/scripts/portal-lifecycle-check.mjs +3 -3
  245. package/scripts/reconcile-runs.mjs +1 -1
  246. package/scripts/release-await-cut.mjs +101 -11
  247. package/scripts/release-version-pr-checks.mjs +26 -2
  248. package/scripts/release-version.mjs +2 -2
  249. package/scripts/render-check.mjs +66 -7
  250. package/scripts/report-frame-check.mjs +12 -0
  251. package/scripts/report-screenshot.mjs +62 -2
  252. package/scripts/revisit-render-check.mjs +3 -2
  253. package/scripts/score.mjs +18 -4
  254. package/scripts/strip-tracker-citations.mjs +116 -0
  255. package/scripts/test-run.mjs +3 -3
  256. package/scripts/third-party-notices.mjs +3 -3
  257. package/scripts/travelling-predicates.mjs +3 -3
  258. package/scripts/unexecuted-asserts.mjs +2 -2
  259. package/scripts/verify-publishable.mjs +2 -2
  260. package/scripts/write-up-form-census.mjs +1 -1
  261. package/shared/access-audience.mjs +215 -0
  262. package/shared/brand.mjs +13 -13
  263. package/shared/citation-scan.mjs +1 -1
  264. package/shared/client-door.mjs +7 -7
  265. package/shared/driver-dir.mjs +1 -1
  266. package/shared/env-aliases.mjs +0 -48
  267. package/shared/env-local.mjs +1 -1
  268. package/shared/identifier-scan.mjs +3 -3
  269. package/shared/invocation.mjs +1 -1
  270. package/shared/names-in-force.mjs +2 -0
  271. package/shared/product-owned-names.mjs +1 -1
  272. package/shared/register-selection.mjs +1 -1
  273. package/shared/scope.mjs +5 -5
  274. package/shared/server-units.mjs +4 -4
  275. package/shared/store-in-repo.mjs +2 -2
  276. package/shared/suite-census.mjs +4 -4
  277. package/shared/tracked-files.mjs +31 -0
  278. package/shared/tty-style.mjs +1 -1
  279. package/shared/uspto-index-size.mjs +1 -1
  280. package/shared/vacuous-pass.mjs +1 -1
  281. package/skills/clearotron-account/SKILL.md +42 -13
  282. package/driver/systemd/prelim-driver.path +0 -69
  283. package/driver/systemd/prelim-driver.service +0 -86
  284. package/driver/systemd/prelim-driver.timer +0 -14
  285. package/driver/systemd/prelim-outbox.path +0 -27
  286. package/driver/systemd/prelim-outbox.service +0 -37
  287. package/driver/systemd/prelim-outbox.timer +0 -21
  288. package/node_modules/exceljs/README_zh.md +0 -2878
  289. package/node_modules/exceljs/dist/LICENSE +0 -22
  290. package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
  291. package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
  292. package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
  293. package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
  294. package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
  295. package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
  296. package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
  297. package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
  298. package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
  299. package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
  300. package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
  301. package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
  302. package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
  303. package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
  304. package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
  305. package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
  306. package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
  307. package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
  308. package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
  309. package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
  310. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
  311. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
  312. package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
  313. package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
  314. package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
  315. package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
  316. package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
  317. package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
  318. package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
  319. package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
  320. package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
  321. package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
  322. package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
  323. package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
  324. package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
  325. package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
  326. package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
  327. package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
  328. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
  329. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
  330. package/node_modules/exceljs/dist/es5/index.js +0 -15
  331. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
  332. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
  333. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
  334. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
  335. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
  336. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
  337. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
  338. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
  339. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
  340. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
  341. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
  342. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
  343. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
  344. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
  345. package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
  346. package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
  347. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
  348. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
  349. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
  350. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
  351. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
  352. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
  353. package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
  354. package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
  355. package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
  356. package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
  357. package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
  358. package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
  359. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
  360. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
  361. package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
  362. package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
  363. package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
  364. package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
  365. package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
  366. package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
  367. package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
  368. package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
  369. package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
  370. package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
  371. package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
  372. package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
  373. package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
  374. package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
  375. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
  376. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
  377. package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
  378. package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
  379. package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
  380. package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
  381. package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
  382. package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
  383. package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
  384. package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
  385. package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
  386. package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
  387. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
  388. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
  389. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
  390. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
  391. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
  392. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
  393. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
  394. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
  395. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
  396. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
  397. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
  398. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
  399. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
  400. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
  401. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
  402. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
  403. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
  404. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
  405. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
  406. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
  407. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
  408. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
  409. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
  410. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
  411. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
  412. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
  413. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
  414. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
  415. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
  416. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
  417. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
  418. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
  419. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
  420. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
  421. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
  422. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
  423. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
  424. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
  425. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
  426. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
  427. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
  428. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
  429. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
  430. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
  431. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
  432. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
  433. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
  434. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
  435. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
  436. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
  437. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
  438. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
  439. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
  440. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
  441. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
  442. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
  443. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
  444. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
  445. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
  446. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
  447. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
  448. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
  449. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
  450. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
  451. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
  452. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
  453. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
  454. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
  455. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
  456. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
  457. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
  458. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
  459. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
  460. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
  461. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
  462. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
  463. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
  464. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
  465. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
  466. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
  467. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
  468. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
  469. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
  470. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
  471. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
  472. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
  473. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
  474. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
  475. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
  476. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
  477. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
  478. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
  479. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
  480. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
  481. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
  482. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
  483. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
  484. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
  485. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
  486. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
  487. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
  488. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
  489. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
  490. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
  491. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
  492. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
  493. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
  494. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
  495. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
  496. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
  497. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
  498. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
  499. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
  500. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
  501. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
  502. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
  503. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
  504. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
  505. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
  506. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
  507. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
  508. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
  509. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
  510. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
  511. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
  512. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
  513. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
  514. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
  515. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
  516. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
  517. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
  518. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
  519. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
  520. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
  521. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
  522. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
  523. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
  524. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
  525. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
  526. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
  527. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
  528. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
  529. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
  530. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
  531. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
  532. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
  533. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
  534. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
  535. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
  536. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
  537. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
  538. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
  539. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
  540. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
  541. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
  542. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
  543. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
  544. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
  545. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
  546. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
  547. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
  548. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
  549. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
  550. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
  551. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
  552. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
  553. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
  554. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
  555. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
  556. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
  557. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
  558. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
  559. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
  560. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
  561. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
  562. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
  563. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
  564. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
  565. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
  566. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
  567. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
  568. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
  569. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
  570. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
  571. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
  572. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
  573. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
  574. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
  575. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
  576. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
  577. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
  578. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
  579. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
  580. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
  581. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
  582. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
  583. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
  584. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
  585. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
  586. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
  587. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
  588. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
  589. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
  590. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
  591. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
  592. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
  593. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
  594. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
  595. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
  596. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
  597. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
  598. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
  599. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
  600. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
  601. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
  602. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
  603. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
  604. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
  605. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
  606. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
  607. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
  608. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
  609. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
  610. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
  611. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
  612. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
  613. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
  614. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
  615. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
  616. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
  617. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
  618. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
  619. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
  620. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
  621. package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
  622. package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
  623. package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
  624. package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
  625. package/node_modules/exceljs/dist/exceljs.js +0 -59900
  626. package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
  627. package/node_modules/exceljs/dist/exceljs.min.js +0 -45
  628. package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
  629. package/scripts/deploy-test.sh +0 -309
@@ -8,7 +8,7 @@ import "../shared/env-local.mjs"; // side effect: apply <repo>/.env when THIS
8
8
  import "./engine/mcp/http-dispatcher.mjs"; // side effect: raise undici headersTimeout (code-side fetches)
9
9
  import { readFileSync, existsSync, mkdirSync, writeFileSync, renameSync, copyFileSync, readdirSync, rmSync, statSync } from "node:fs";
10
10
  import { createHash } from "node:crypto";
11
- import { join, dirname, basename, resolve } from "node:path"; // resolve: 's resume line must work from any cwd
11
+ import { join, dirname, basename, resolve } from "node:path"; // resolve: the resume line must work from any cwd
12
12
  import { driverDir, driverRel, ensureDriverDir } from "../shared/driver-dir.mjs"; // — one definition of where `_driver/` is
13
13
  import { terminalClampDecision, orderClausesForLede } from "./terminal-clamp.mjs"; // — deliver and clamp, never withhold
14
14
  import { recordSpan } from "./attributed-span.mjs"; // — driver work the decomposition can attribute
@@ -28,7 +28,7 @@ import { engineProvenance } from "./engine-build.mjs"; // —
28
28
  import { preflightEngineTurn } from "./engine/probe.mjs"; // — …and the engine can complete a turn, not merely exist
29
29
  import { rankClusterLegs, verdictDrivingFindings } from "./senior-rights.mjs";
30
30
  import { buildRunContext, deriveSlug, kebab } from "./phase0.mjs";
31
- import { paths, STAGES, axisTier, decideAxes, assertTierSanity, assertEffectiveTier, lines, AGENT_WHATSAPP,
31
+ import { paths, STAGES, axisTier, decideAxes, assertTierSanity, assertEffectiveTier, lines, AGENT_WHATSAPP, whatsappRouting,
32
32
  chainEntries, stageOrdinal, stageInputs, stageOutputs, dependencyOrder, REGISTER_AXES, REGISTER_ENUMERATE_TOOL,
33
33
  buildEscalationFollowup, buildEnvelopeCloseFollowup, buildFrameReopenFollowup,
34
34
  buildFrameReopenRetryMessage, thinkingFor, composeFollowup, stampDispatchBlocks, PROVIDER_META, proseRungDirective, inquiryRungDirective } from "./stages.mjs";
@@ -107,14 +107,15 @@ import { mintCrossCheckDoubts, mintContradictionDoubts, stitchDoubts, applyClosu
107
107
  import { readAcceptedClosures } from "./doubt-closure-tool.mjs";
108
108
  import { CLOSURE_EVIDENCE_FILES } from "./doubt-closure-call.mjs";
109
109
  import { doubtsForClosure, doubtSelectionNote } from "./doubt-selection.mjs"; // doubt-closure selection
110
- import { deriveAsks, applyAskClosure, finalizeOpenHandoffs, summarizeAsks } from "./ask-ledger.mjs"; // PR-6 — every ask ends (2026-07-29)
110
+ import { deriveAsks, applyAskClosure, finalizeOpenHandoffs, summarizeAsks } from "./ask-ledger.mjs";
111
+ import { pendingWhatIf, claimWhatIf, finishWhatIf, whatIfRefusal } from "./whatif-queue.mjs"; // a queued job is settled before its run archives // PR-6 — every ask ends (2026-07-29)
111
112
  import { mintPresenceDoubts } from "./presence-reconciliation.mjs"; // presence-or-reason (2026-07-22 — the unjoined-Sheet-2 leak)
112
113
  import { escalatedAxes } from "./skeptic-record.mjs"; // THE escalation parse — shared with the record_skeptic transport so the rendered shape and this read cannot drift
113
114
  // — every placed candidate ends somewhere a reader can see; the ones that do not are counted by name
114
115
  import { PLACEMENT_CARRY_SCHEMA_VERSION, reconcilePlacementCarry, placementCarryEvent, mintPlacementCarryDoubts, entryUris } from "./placement-carry.mjs";
115
116
  import { FLOOR_DUTY_SCHEMA_VERSION, reconcileFloorDuty, floorDutyEvent, armFloorDuty, floorDutyArmed, floorDutyBlock, floorDutyBlocksSkip } from "./floor-duty.mjs"; // — the era stamp that turns disclosure into a delivery floor
116
117
  import { synthesisDutyForRun } from "./synthesis-record.mjs"; // — the duty checked against the DELIVERED document
117
- import { RECORD_CARRY_SCHEMA_VERSION, traceRecordCarry, parseStageOutcomes, recordCarryEvent, mintRecordCarryDoubts, bandRecordUri, placementIndex, findingUris , silentlyLostFindings } from "./record-carry.mjs";
118
+ import { RECORD_CARRY_SCHEMA_VERSION, traceRecordCarry, parseStageOutcomes, recordCarryEvent, mintRecordCarryDoubts, bandRecordUri, placementIndex, findingUris , silentlyLostFindings, statedDivergenceFindings } from "./record-carry.mjs";
118
119
  import { reconcileSurfaceDuty, surfaceDutyNote } from "./surface-duty.mjs"; // item 3 — silence at the findings surface, read off the rows above
119
120
  import { DISCARD_LEDGER_NAME, seamRows, appendDiscardRows, foldDiscardLedger } from "./record-discard.mjs";
120
121
  import { readDeclinations } from "./declination-tool.mjs"; // — synthesis's own stated declines
@@ -155,9 +156,9 @@ import { foldCaption, foldCardRead } from "./card-budget.mjs";
155
156
  import { carriesOwnFrame, composeCard } from "./card-frame.mjs";
156
157
  import { parseFrameworkManifest, loadFrameworkManifest, frameworkFor, manifestPathFor, DEFAULT_FRAMEWORK } from "./framework.mjs";
157
158
  import { renderScopeLedgerJson, scopeLedgerJsonFromRows, channelsDiagnosis, parseScopeLedgerJson, scopeJurisdictions, droppedVariantFamilies } from "./scope-ledger.mjs";
158
- // qw/cn-scope-honesty — the zh-lane capability tables + the requested-scope resolver, for the plain-prelim
159
+ // qw/cn-scope-honesty — the zh-lane capability tables + the requested-scope resolver, for the plain-clearotron
159
160
  // honesty row/note. jx-lanes.mjs is a PURE zero-import leaf (data + decisions, no env/fs), so a static
160
- // import here costs a plain prelim nothing — the "lazy import" rule below (jx.mjs / jx-units.mjs) guards
161
+ // import here costs a plain clearotron nothing — the "lazy import" rule below (jx.mjs / jx-units.mjs) guards
161
162
  // the lane MACHINERY, not this table. Aliased: scope-ledger.mjs already exports a scopeJurisdictions
162
163
  // (rows → markets); this one is (job, profile) → requested territories, the decideJxLanes precedence.
163
164
  import { JURISDICTION_ADAPTERS, LANGUAGE_LANES, scopeJurisdictions as jxScopeJurisdictions, zhScopeDepthNotes } from "./jx-lanes.mjs";
@@ -1301,7 +1302,7 @@ function readCoverageJudgment(P) {
1301
1302
  // back in `unknown` — carried in `jurisdictions` too (never dropped), but the caller must surface them
1302
1303
  // LOUDLY (a jurisdiction nobody can place must never be a silent row in the machine record).
1303
1304
  // item 13 — `extractSearchedJurisdictions` LIVED HERE AND IS GONE. It ran a two-letter scan over the
1304
- // coverage ledger's prose to decide which territories a run had searched, and 's narrowing (drop
1305
+ // coverage ledger's prose to decide which territories a run had searched, and the narrowing (drop
1305
1306
  // tokens that are not known jurisdiction codes) closed only the half where the junk token was not a real
1306
1307
  // code. The other half cannot be closed by any token list: SA, AG, KG, SL and SE are simultaneously real
1307
1308
  // jurisdiction codes and ordinary European company suffixes, so "… GmbH & Co. KG" reads as Kyrgyzstan and
@@ -1350,7 +1351,7 @@ export const CASE_LAW_TRIGGERS = /watchlist|precedent|case[- ]law|opposition|fam
1350
1351
  // The offering locked with the reviewing lawyer gives the case-law and opposition reading to the Full
1351
1352
  // country search alone, over exactly one country, where it is automatic. Multi-country focus deliberately
1352
1353
  // has no case-law component. `job.caseLaw` is refused at the door and `policy.caseLaw` is set from the
1353
- // product spec, so the REQUESTED path was already confined correctly — and #92's one-territory rule is
1354
+ // product spec, so the REQUESTED path was already confined correctly — and the one-territory rule is
1354
1355
  // enforced at that door.
1355
1356
  //
1356
1357
  // The detector was not. It fires mid-run, after admission, on a run already scoped to however many
@@ -1532,6 +1533,13 @@ function attachProfile(ctx, job, { write = true } = {}) {
1532
1533
  const current = resolveProfile(job);
1533
1534
  if (current && current.key !== sidecar.profileKey)
1534
1535
  runLog(ctx.paths.runDir, { event: "profile-mismatch", sidecar: sidecar.profileKey, resolved: current.key });
1536
+ // THE MATCH IS RECORDED TOO, and that is the point rather than symmetry for its own sake.
1537
+ // `profile-mismatch` existed and its counterpart did not, so "the profile was right" was carried
1538
+ // by the ABSENCE of a row — and an absence cannot tell "it matched" from "the probe never ran"
1539
+ // (it throws below on a broken profiles/ state) or from "this run predates the probe". Three
1540
+ // different facts, one empty grep. The positive row says which.
1541
+ else if (current)
1542
+ runLog(ctx.paths.runDir, { event: "profile-resolved", sidecar: sidecar.profileKey, resolved: current.key });
1535
1543
  } catch (e) {
1536
1544
  runLog(ctx.paths.runDir, { event: "profile-mismatch-probe-failed", error: String(e.message).slice(0, 120) });
1537
1545
  }
@@ -1663,13 +1671,13 @@ export function attachSearchPolicy(ctx, job, { write = true } = {}) {
1663
1671
  try { ctx.searchPolicy = JSON.parse(raw); }
1664
1672
  catch (e) { throw new Error(`_driver/search-policy.json is corrupt (${e.message}) — investigate; the frozen policy is never silently re-derived`); }
1665
1673
  } else if (!write) {
1666
- // pre-spine run read-only (reconstructCtx / legacy resume): implicitly a prelim — the only shape that
1674
+ // pre-spine run read-only (reconstructCtx / legacy resume): implicitly a clearotron — the only shape that
1667
1675
  // existed. It names a RETIRED row on purpose: this branch describes a run that already happened, and
1668
1676
  // RETIRED_POLICIES exists so an archived run re-renders under the name it was sold under. But ONLY
1669
1677
  // for a selector-less job: a selector-carrying job with no frozen sidecar must never be assumed into
1670
1678
  // a clearance (review 2026-07-17 — the crash-reclaim/reconstruct window).
1671
1679
  if (!noSelector)
1672
- throw new Error(`run dir has no frozen search policy but the job names a selector (product=${JSON.stringify(job?.product ?? null)}, recipeKey=${JSON.stringify(job?.recipeKey ?? null)}) — refusing the legacy-implicit prelim assumption; re-dispatch cold so the policy is minted`);
1680
+ throw new Error(`run dir has no frozen search policy but the job names a selector (product=${JSON.stringify(job?.product ?? null)}, recipeKey=${JSON.stringify(job?.recipeKey ?? null)}) — refusing the legacy-implicit clearotron assumption; re-dispatch cold so the policy is minted`);
1673
1681
  ctx.searchPolicy = { schema: 1, level: "prelim", pipeline: "clearance", stageLabel: "Depth 4", components: {}, recipe: null, origins: { level: "legacy-implicit" } };
1674
1682
  } else {
1675
1683
  let resolved;
@@ -1697,7 +1705,7 @@ export function attachSearchPolicy(ctx, job, { write = true } = {}) {
1697
1705
  } catch (e) { resolved = { clarify: `search-policy resolution errored: ${String(e?.message ?? e).slice(0, 160)}` }; }
1698
1706
  // A CLARIFY THROWS. THERE IS NO FAIL-OPEN LEFT, and its deletion is the point.
1699
1707
  //
1700
- // It used to fall open to the literal level `prelim` — stageLabel "Depth 4" — whenever the job named
1708
+ // It used to fall open to the literal level `clearotron` — stageLabel "Depth 4" — whenever the job named
1701
1709
  // no selector and the profile carried no default. Both halves of that condition had rotted: the
1702
1710
  // selector test read the deleted `searchLevel` (so it was true for every job) and the profile test
1703
1711
  // read the deleted `defaultSearchLevel` (so it was undefined for every profile). The branch was
@@ -1763,7 +1771,7 @@ export function attachSearchPolicy(ctx, job, { write = true } = {}) {
1763
1771
  runLog(ctx.paths.runDir, { event: "level-scope-note", note: n });
1764
1772
  }
1765
1773
  // The fold runs on EVERY path through this door — fresh mint, frozen-sidecar resume, legacy
1766
- // implicit prelim (recipeScope null there = no-op) — so every downstream consumer of
1774
+ // implicit clearotron (recipeScope null there = no-op) — so every downstream consumer of
1767
1775
  // job.jurisdictions/classes/platforms sees the scope the preview promised.
1768
1776
  foldRecipeScope(job, ctx.searchPolicy);
1769
1777
  // Phase 2a: "knockout" is now a dispatchable pipeline — the refusal covers only shapes THIS build
@@ -2285,7 +2293,7 @@ function attachRegisterPlan(ctx, { frozenOnly = false } = {}) {
2285
2293
  // Repair-first D, hotfixed 2026-07-06 (The Quiet Trail e2e): the gate now applies the round's own
2286
2294
  // doctrine to itself — A REPAIRABLE CONDITION NEVER TERMINATES A RUN.
2287
2295
  // - `repairable` issues (OR-stack width/name length): log-only from ANY provenance — the executor
2288
- // chunks oversized stacks at runtime (, proven live). The 2026-07-06 failure was exactly this
2296
+ // chunks oversized stacks at runtime (proven live). The 2026-07-06 failure was exactly this
2289
2297
  // gate throwing on a 674-name entry INHERITED byte-identical from a pre-split July-3 store via
2290
2298
  // the recall-monotone extension — a run the executor would have completed.
2291
2299
  // - `unexecutable` issues (empty terms, unknown predicate, non-numeric classes, dangling guards):
@@ -2660,7 +2668,7 @@ function deriveFloorDuty(ctx, r, trigger = null) {
2660
2668
  try { placements = parsePlacementsJson(readFileSync(P.placementModel, "utf8")).placements; }
2661
2669
  catch (e) { return notComputable(`placements.json unparseable: ${String(e?.message ?? e).slice(0, 80)}`); }
2662
2670
  const artifact = reconcileFloorDuty({ floors, placements });
2663
- // The pass's own outcome, beside the rows. 's lesson: a stage that failed or skipped makes every
2671
+ // The pass's own outcome, beside the rows. That lesson: a stage that failed or skipped makes every
2664
2672
  // record it did not reach an UPSTREAM ABSENCE, not a judgment, and a reader blaming the seat for a
2665
2673
  // crash is reading the artifact wrong.
2666
2674
  artifact.pass = { ok: r?.ok === true, skipped: r?.skipped === true };
@@ -2952,7 +2960,7 @@ function recordSynthesisSeam(ctx, r, trigger = null) {
2952
2960
  // say only that synthesis had not delivered it. The sibling seam one stage earlier
2953
2961
  // (`recordDigestSeam`) has read its stage's own output per record since it was written; this one
2954
2962
  // had nothing to read until `record_declination` gave synthesis somewhere to say it.
2955
- // The judgment itself is `seamReasonFor`, pure and next door, so 's guarantee has an arm
2963
+ // The judgment itself is `seamReasonFor`, pure and next door, so the guarantee has an arm
2956
2964
  // that does not need a run directory. This callback is now only the plumbing around it.
2957
2965
  return seamReasonFor(declined, uri);
2958
2966
  },
@@ -3016,7 +3024,7 @@ export function deriveRecordCarry(ctx, trigger, { findings = null } = {}) { //
3016
3024
  // ── THE RECONCILIATION RATCHET ────────────────────────────────────────────────────────────
3017
3025
  //
3018
3026
  // RECORDED ON EVERY RUN, tripping only against the committed floor. Both halves are deliberate:
3019
- // a gate that fires on every current run teaches its reader that red means nothing ('s whole
3027
+ // a gate that fires on every current run teaches its reader that red means nothing (the whole
3020
3028
  // complaint), and a warning that never bites is decoration. The floor is what the contract achieves
3021
3029
  // today, dated and seeded from a delivered round, and it moves UP when the seat-compliance work
3022
3030
  // lands.
@@ -3168,7 +3176,7 @@ function plannedChannelsFor(P) {
3168
3176
 
3169
3177
  // ── part 2 — THE CHANNEL COMPARISON, AT SEARCH-STAGE EXIT ────────────────────────────────────
3170
3178
  //
3171
- // Part 1 shipped the comparison and wired the plan into it (,), and it runs at PUBLISH —
3179
+ // Part 1 shipped the comparison and wired the plan into it (), and it runs at PUBLISH —
3172
3180
  // where the rest of the carry trace is derived, about two hours after the sweep it describes. The issue
3173
3181
  // asked whether plan-vs-executed is knowable earlier. It is: the merged grid has just been written and
3174
3182
  // the spec has been on disk since dispatch, so both inputs exist at this instant and neither changes.
@@ -3423,7 +3431,7 @@ async function runDigest(ctx, opts = {}) {
3423
3431
  // — THE SAME SENTINEL IS THE COVERAGE FORM'S ERA STAMP, AND THE WRITE ORDER IS THE FAIL-CLOSED
3424
3432
  // LEG. `armCoverageForm` stamps `form_required: true` BEFORE `writeCoverageForm` puts the form on
3425
3433
  // disk. Get that order wrong and a failed form write leaves no stamp, the gate never arms, and the run
3426
- // passes having judged nothing — which is 's confirmed blocker (a missing sidecar returns
3434
+ // passes having judged nothing — which is the confirmed blocker (a missing sidecar returns
3427
3435
  // {rows:null,error:null}, the validator finds nothing to judge, and a run with NO ruling artifact is
3428
3436
  // byte-for-byte indistinguishable from a fully ruled one). It is reachable: a full disk fails as
3429
3437
  // "artifact absent", not as a disk error. In this order a failed write leaves a stamp saying a form
@@ -3571,7 +3579,7 @@ async function runDigest(ctx, opts = {}) {
3571
3579
  export function digestDispatchExtra(ctx, { trigger = "fresh", willRun = true, extra = undefined } = {}) {
3572
3580
  const P = ctx.paths;
3573
3581
  let out = extra;
3574
- // — THE COVERAGE FORM BRIEF, replacing 's deferred-slice block (was A8, 2026-07-30).
3582
+ // — THE COVERAGE FORM BRIEF, replacing the deferred-slice block (was A8, 2026-07-30).
3575
3583
  //
3576
3584
  // What stood here composed a prose list of every deferred qid and told the stage each one "must appear
3577
3585
  // VERBATIM in a Coverage-ledger row". The block's own doc block explained why it could not elide any of
@@ -4189,7 +4197,7 @@ async function stageOnce(name, ctx, opts = {}) {
4189
4197
  // path all reach the seat through here, and three separate pre-dispatch writes would be three chances
4190
4198
  // to disagree about what the seat was handed.
4191
4199
  //
4192
- // ORDER MATTERS AND IT IS THE FAIL-CLOSED WAY ROUND ('s lesson): the era stamp lands first, above,
4200
+ // ORDER MATTERS AND IT IS THE FAIL-CLOSED WAY ROUND (the lesson): the era stamp lands first, above,
4193
4201
  // so a form write that fails leaves a stamp saying a form was required and no form to fill — a named,
4194
4202
  // loud state — rather than no stamp at all, which would silently disarm the whole arm on exactly the
4195
4203
  // run it governs.
@@ -4259,7 +4267,7 @@ async function stageOnce(name, ctx, opts = {}) {
4259
4267
  // The carry fills the gap BEHIND them: a cold re-dispatch that would otherwise re-commission the stage
4260
4268
  // from def.message(ctx) and throw away everything the parked cycle achieved.
4261
4269
  // — WHAT THIS RUN HAS ALREADY CORRECTED FOR THIS SEAT. Read from `_driver/<seat>.jsonl`, the
4262
- // same per-attempt record 's acceptance criterion is written against, so the fix and its test
4270
+ // same per-attempt record the acceptance criterion is written against, so the fix and its test
4263
4271
  // bind to one authority. Best-effort by construction: no log, an unreadable log or a damaged line
4264
4272
  // yields an empty list and the followup is byte-identical to what it was before.
4265
4273
  const carry = (opts.followup == null && opts.freshMessage == null && out)
@@ -4651,7 +4659,7 @@ export function buildFailurePacket({ runId, agent, job = {}, failedStage, shortR
4651
4659
  // was healthy and answering, re-triggering now hits the same cap, and "overloaded" points the reader
4652
4660
  // at an availability problem they cannot act on.
4653
4661
  //
4654
- // The owner pre-committed the wording watching indigo-falcon: a cap death is reported as a
4662
+ // The owner pre-committed the wording watching a capped run: a cap death is reported as a
4655
4663
  // SUBSCRIPTION OUTCOME, NEVER AS AN ENGINE FINDING. So this names the cap, states how long the run
4656
4664
  // actually held out before giving up, and says plainly that nothing about the run or the mark
4657
4665
  // produced it.
@@ -4709,7 +4717,7 @@ export function buildFailurePacket({ runId, agent, job = {}, failedStage, shortR
4709
4717
  // `failed: true` and `kind: "run-failed"` (added by both callers) are UNCHANGED on a refusal, and
4710
4718
  // deliberately: they are the packet's ROUTING — "this run delivered nothing, send the no-delivery
4711
4719
  // notice" — and every relay, the outbox and docs/DELIVERY.md are built on them. `refused` is the
4712
- // discriminator beside them, written true OR false on every packet for 's reason: an absent key
4720
+ // discriminator beside them, written true OR false on every packet for the reason: an absent key
4713
4721
  // must not be the only thing separating "not a refusal" from "a packet written before the field
4714
4722
  // existed".
4715
4723
  runId, agent, failed: true, refused,
@@ -4730,8 +4738,8 @@ export function buildFailurePacket({ runId, agent, job = {}, failedStage, shortR
4730
4738
  : `<p>${esc(orderedIs)} for <b>${esc(mark)}</b> FAILED at stage <b>${esc(failedStage)}</b>${priorAttempts ? ` after <b>${priorAttempts} automatic recovery attempt${priorAttempts === 1 ? "" : "s"}</b>` : ""} and NOTHING was delivered.</p><p>${esc(kindLine)}</p><p>The driver reported, verbatim:</p><pre style="white-space:pre-wrap">${esc(reasonVerbatim)}</pre>${detailBlock}${attempted}<p>The run directory is preserved for diagnosis; re-trigger the run when the cause is addressed.</p>`,
4731
4739
  whatsappTo,
4732
4740
  whatsappText: refused
4733
- ? `⛔ Prelim search for ${mark} REFUSED at ${failedStage} [${terminalKind}]: ${shortReason} — nothing was delivered and nothing broke; ${retryHint}.`
4734
- : `❌ Prelim search for ${mark} FAILED at ${failedStage}${priorAttempts ? ` after ${priorAttempts} automatic recovery attempt${priorAttempts === 1 ? "" : "s"}` : ""}${terminalKind ? ` [${terminalKind}]` : ""}: ${shortReason} — nothing was delivered; ${retryHint}.`,
4741
+ ? `⛔ Clearotron search for ${mark} REFUSED at ${failedStage} [${terminalKind}]: ${shortReason} — nothing was delivered and nothing broke; ${retryHint}.`
4742
+ : `❌ Clearotron search for ${mark} FAILED at ${failedStage}${priorAttempts ? ` after ${priorAttempts} automatic recovery attempt${priorAttempts === 1 ? "" : "s"}` : ""}${terminalKind ? ` [${terminalKind}]` : ""}: ${shortReason} — nothing was delivered; ${retryHint}.`,
4735
4743
  markName: job.markName ?? job.name ?? null, failedStage, reason: shortReason,
4736
4744
  reasonVerbatim, failureSignature: sig, failClass, terminalKind, repairs, recoveryAttempts: priorAttempts,
4737
4745
  reasonDetail: detail, reasonQuantity: quantity,
@@ -5137,7 +5145,7 @@ export function projectStageInput(label, absPath) {
5137
5145
  // that receipt, and this is where it becomes readable off the run rather than inferable from a token
5138
5146
  // that no longer names it.
5139
5147
  //
5140
- // WHY IT ALSO FIRES ON THE FAILURE PATH. The two numbers this writes are the ones 's sequencing
5148
+ // WHY IT ALSO FIRES ON THE FAILURE PATH. The two numbers this writes are the ones the sequencing
5141
5149
  // ruling says the boundary gets tuned against — obligations carrying a written disposition that failed
5142
5150
  // to bind, against obligations the model never addressed. Recorded only where the gate PASSED, they
5143
5151
  // would be missing from exactly the runs that need explaining: a run that still goes terminal at
@@ -5175,7 +5183,7 @@ export function connotationAuditSeats(P, runDir) {
5175
5183
  }
5176
5184
 
5177
5185
  // EXPORTED FOR THE SAME REASON `connotationAuditSeats` IS: the seat resolution was testable and the
5178
- // numbers it produces were not, so 's whole point — that the audit READS the verdict ledger — was
5186
+ // numbers it produces were not, so the whole point — that the audit READS the verdict ledger — was
5179
5187
  // asserted only in the pure functions it calls. A wiring that never runs in a test is a wiring nobody has
5180
5188
  // seen work.
5181
5189
  export function recordConnotationAudit(run, P) {
@@ -5184,7 +5192,7 @@ export function recordConnotationAudit(run, P) {
5184
5192
  let didNotBind = 0, neverAddressed = 0, quotesUnbound = 0, recordedQueries = 0;
5185
5193
  // — the three numbers that make "never addressed" falsifiable. `unruledAll` is the TOTAL this
5186
5194
  // audit used to report under `obligationsNeverAddressed`, kept as its own field so the split can
5187
- // never take a headline number to zero without a companion rising to meet it ('s hazard, in the
5195
+ // never take a headline number to zero without a companion rising to meet it (the hazard, in the
5188
5196
  // very number is about).
5189
5197
  let unruledAll = 0, addressedNotDischarged = 0, ledgerCalls = 0, ledgerSeats = 0;
5190
5198
  const refusalReasons = {}; // — the LEDGER's reasons: every refusal and drop recorded
@@ -5288,7 +5296,7 @@ export function recordConnotationAudit(run, P) {
5288
5296
  if (!id || groundsSeen.has(id)) continue;
5289
5297
  groundsSeen.set(id, classifyGroundsNote(r?.note));
5290
5298
  }
5291
- // The two states 's sequencing ruling asks to be counted apart, in the form's vocabulary: a row
5299
+ // The two states the sequencing ruling asks to be counted apart, in the form's vocabulary: a row
5292
5300
  // the seat WROTE that the gate cannot accept (a damaged form — the disposition exists and is
5293
5301
  // readable) against a row it never filled in at all.
5294
5302
  const damaged = conn.filter((v) => v.reason === "form_damaged");
@@ -5355,7 +5363,7 @@ export function recordConnotationAudit(run, P) {
5355
5363
  // The rename is the fix, not a tidy-up. On R5 round 7a30934b the artifact carried
5356
5364
  // `refusalReasons: {}` beside a ledger of 193 refusals over 8 types, because everything had been
5357
5365
  // discharged by the end. Nothing was wrong with the number; the name promised the other population,
5358
- // so an empty map read as "nothing was refused" and took 's acceptance criterion C with it.
5366
+ // so an empty map read as "nothing was refused" and took the acceptance criterion C with it.
5359
5367
  if (foldIntoRunTotals) for (const [reason, n] of Object.entries(ledgerReasonHistogram(ledger)))
5360
5368
  refusalReasons[reason] = (refusalReasons[reason] ?? 0) + n;
5361
5369
  // — the part of that histogram that belongs to no row, kept separately so `refusalReasons`
@@ -5436,7 +5444,7 @@ export function recordConnotationAudit(run, P) {
5436
5444
  unruledRefusalReasons,
5437
5445
  // ITS OWN CARDINALITY, NAMED. The issue that found the empty histogram read
5438
5446
  // `distinctReasons: 14` as its count and concluded the map had been dropped after being counted.
5439
- // It had not: `distinctReasons` is 's SECOND SCALE — distinct executed query SHAPES, from
5447
+ // It had not: `distinctReasons` is the SECOND SCALE — distinct executed query SHAPES, from
5440
5448
  // `connotationReasonKey` over the grid — and has nothing to do with refusal tokens. Two unrelated
5441
5449
  // numbers, one of them named `…Reasons`, one screenful apart. Naming both is the fix for that
5442
5450
  // reading; asserting they agree, which the issue asked for, would assert something false.
@@ -6135,8 +6143,70 @@ function sentinel(runDir, name, obj) {
6135
6143
  atomicWrite(join(runDir, name), JSON.stringify({ ts: new Date().toISOString(), ...obj }, null, 2) + "\n");
6136
6144
  }
6137
6145
 
6146
+ /**
6147
+ * Settle every queued what-if BEFORE the run dir moves into the archive — tracker issue 240.
6148
+ *
6149
+ * A queued job lives under the run directory, and the worker enumerates candidates with `liveRunDirs`,
6150
+ * which skips `archive` outright. So archiving carried a pending job out of the worker's reach: not
6151
+ * claimed, not settled, not refused. The client who asked for it got no answer and no explanation, and
6152
+ * no row anywhere said why. That is an absence reported as nothing at all — the one shape
6153
+ * `whatIfRefusal` exists to prevent.
6154
+ *
6155
+ * BEFORE the rename, deliberately: the settlement is written into the run dir and travels with it, so
6156
+ * the answer is on disk in the archive where the read tool will look for it.
6157
+ *
6158
+ * ✕ THE SENTENCE IS PER KIND, and a memo does not get the stage one. `whatIfRefusal`'s standing
6159
+ * refusal — "this run is delivered or archived, what-if runs on live runs only" — is TRUE of a stage
6160
+ * and FALSE of a memo, which runs on archived evidence by design. Telling a client their memo was
6161
+ * refused because the run is archived would be a false sentence in the one place they go to find out
6162
+ * what happened. A memo is closed on the true reason instead: it was queued before the run archived,
6163
+ * and the drain does not reach an archived run.
6164
+ *
6165
+ * ✕ A JOB ANOTHER WORKER IS ACTIVELY RUNNING IS LEFT ALONE. `pendingWhatIf` returns queued jobs and
6166
+ * claims older than an hour, never a fresh claim, so a live worker's job is not settled underneath it.
6167
+ * A fresh claim at the moment of archiving is a race this does not close, and it is written down
6168
+ * rather than papered over.
6169
+ *
6170
+ * Best-effort throughout: a failure to settle must never stop the archive, because a run that cannot
6171
+ * archive is a much larger problem than a job with no row.
6172
+ */
6173
+ export function settlePendingWhatIfsBeforeArchive(run) {
6174
+ let pending = [];
6175
+ // NOT a silent catch. This function exists because a job went unanswered with no row anywhere; a
6176
+ // failure to enumerate that returned quietly would reproduce exactly that, one level up, and the
6177
+ // archive would still succeed so nothing downstream would look wrong.
6178
+ try { pending = pendingWhatIf(run.runDir); }
6179
+ catch (e) { note(`what-if settle before archive could not enumerate the queue (${String(e?.message ?? e).slice(0, 120)}) — pending jobs may be unanswered`); return; }
6180
+ for (const entry of pending) {
6181
+ try {
6182
+ // CLAIM FIRST, exactly as the worker does. `finishWhatIf` writes the terminal file and does not
6183
+ // remove the `.json`; the claim is what renames it out of the queue. Settling without claiming
6184
+ // writes a `.failed` beside a `.json` that still reads as QUEUED to every reader — the job would
6185
+ // look pending and answered at the same time, which is worse than the silence being fixed here.
6186
+ const job = claimWhatIf(entry);
6187
+ if (!job) continue; // another worker won it, or it vanished — not ours to settle
6188
+ const kind = job?.op?.kind === "memo" ? "memo" : "stage";
6189
+ // ✕ THE SENTENCE IS PER KIND. The standing refusal — "what-if runs on live runs only" — is TRUE
6190
+ // of a stage and FALSE of a memo, which reasons over archived evidence by design. A memo is
6191
+ // closed on the true reason instead.
6192
+ const error = kind === "memo"
6193
+ ? "this what-if was queued before its run was archived, and the drain does not reach an archived run — ask it again against the archived run, which a memo may read"
6194
+ : (whatIfRefusal({ location: "archive", state: run.state ?? null, kind }) ?? "this run is delivered or archived — what-if runs on live runs only");
6195
+ finishWhatIf(run.runDir, entry.id, { ok: false, op: job.op ?? null, error });
6196
+ try { runLog(run.runDir, { event: "whatif-settled-on-archive", id: entry.id, kind, stale: entry.stale }); }
6197
+ catch { /* the row is written; the log line is a convenience and must not undo it */ }
6198
+ } catch (e) {
6199
+ // One job's settlement must not cost the others, or the archive — but it must not be SILENT
6200
+ // either. A swallowed failure here leaves exactly the unanswered job this function exists to
6201
+ // prevent, and the archive still succeeds, so nothing downstream looks wrong.
6202
+ note(`what-if ${entry.id} could not be settled before archive (${String(e?.message ?? e).slice(0, 120)}) — it may be unanswered`);
6203
+ }
6204
+ }
6205
+ }
6206
+
6138
6207
  function archive(run) {
6139
6208
  try {
6209
+ settlePendingWhatIfsBeforeArchive(run);
6140
6210
  mkdirSync(dirname(run.archiveDir), { recursive: true });
6141
6211
  renameSync(run.runDir, run.archiveDir);
6142
6212
  return run.archiveDir;
@@ -6674,7 +6744,7 @@ function injectDeferralCoverage(P, runDir, note) {
6674
6744
  // (findings.json coverage vocabulary calls the field `state`; the register ledger calls the same
6675
6745
  // closed token `status` — one vocabulary, two key names.)
6676
6746
  // — LANE-GENERAL, not zh-hardcoded. LANGUAGE_LANES defines zh, ja and ko; the disclosure was
6677
- // written for zh alone, so a Japan- or Korea-scoped run at plain prelim said NOTHING about the
6747
+ // written for zh alone, so a Japan- or Korea-scoped run at plain clearotron said NOTHING about the
6678
6748
  // Japanese/Korean-script equivalents it had not searched. Silence there is indistinguishable from
6679
6749
  // "there was nothing to search" — the same absence-reads-as-a-pass class as the remedy-term half of
6680
6750
  //, one layer over.
@@ -7055,7 +7125,7 @@ export function fullProseOrdinals(findings) {
7055
7125
  // ADVISORY_KINDS member could never reach a client document at all. The 2026-07-16 comment described the
7056
7126
  // behaviour it shipped with and became stale prose sitting next to code that contradicted it.
7057
7127
  //
7058
- // Owner ruling 2026-08-19 (relayed), on a renewal-deadline example: it renders. 's intent is the
7128
+ // Owner ruling 2026-08-19 (relayed), on a renewal-deadline example: it renders. That intent is the
7059
7129
  // ruled behaviour. The tag is REQUIRED, not decoration — `advisoryLine` interpolates ADVISORY_TAG[a.kind]
7060
7130
  // directly, so a kind that passes the filter without an entry here renders "- **undefined** …" into a
7061
7131
  // client document. Whoever adds a fifth kind adds it in both places, and render.mjs needs the matching
@@ -7123,7 +7193,7 @@ export function buildOnlyYouSection(actions, findings, { nowMs = Date.now(), wit
7123
7193
  //
7124
7194
  // WHAT DOES NOT HOLD, and is not claimed: an ask may still name a party THE RUN NEVER SAW — a
7125
7195
  // supplier, a licensee, a distributor no finding carries. No index built from findings can see it.
7126
- // 's orphan lint is what catches that at delivery, and this is the producer telling the truth
7196
+ // That orphan lint is what catches that at delivery, and this is the producer telling the truth
7127
7197
  // about its own reach instead of covering for it.
7128
7198
  const byOrd = new Map((findings ?? []).filter((f) => f && f.disposition !== "withdrawn").map((f) => [f.ordinal, f]));
7129
7199
  const partyIndex = cardedParties(findings);
@@ -7152,7 +7222,7 @@ export function buildOnlyYouSection(actions, findings, { nowMs = Date.now(), wit
7152
7222
  // Terminal punctuation on the ask BEFORE the subject join. This was written to work around a cut —
7153
7223
  // actYouConditions ended its bound line at the first '.' or ':' before whitespace, and the subject's
7154
7224
  // own "(re:" qualified, so a period-less ask (the synthesis prompt demands one sentence but nothing
7155
- // enforces terminal punctuation) delivered as a mangled "…terms (re". THAT CUT IS GONE (, owner
7225
+ // enforces terminal punctuation) delivered as a mangled "…terms (re". THAT CUT IS GONE (owner
7156
7226
  // ruling 2026-08-10): the conditions box now renders the ask and its subject whole. The punctuation
7157
7227
  // stays because it was always the right output — "Instruct counsel on the joined-script forms (re: X)"
7158
7228
  // reads as one run-on sentence, and the period is what separates the ask from the driver's own note.
@@ -7262,7 +7332,7 @@ export function buildOnlyYouSection(actions, findings, { nowMs = Date.now(), wit
7262
7332
  // senior-eye-review.md through `parseVerdict` and `parseCorrections` — the SHIPPED parsers, the same
7263
7333
  // ones the corrective ladder builds its worklist from — and never asks a model to restate them.
7264
7334
  //
7265
- // ── NOT BLOCKING-ONLY ANY MORE — OWNER DECISION, 2026-08-26 (, T3b) ─────────────
7335
+ // ── NOT BLOCKING-ONLY ANY MORE — OWNER DECISION, 2026-08-26 (T3b) ─────────────
7266
7336
  //
7267
7337
  // This section used to return "" on every verdict but BLOCKING, and the reason it gave was that
7268
7338
  // CONDITIONAL reviews already deliver and their flags already reach the corrective pass. That is true
@@ -7503,7 +7573,7 @@ export function assembleReportMd(P, findings, cardOrdinals, { grouped = [], byRi
7503
7573
  if (fc.fold) folds.push({ ...fc.fold, surface: "overview:caption" });
7504
7574
  }
7505
7575
  // spec 64 — merge the code-built only-you section into the overview's # Actions block. A model-
7506
- // authored "### Only you can close these" (pre- prompt, or drift) is REPLACED wholesale —
7576
+ // authored "### Only you can close these" (pre-change prompt, or drift) is REPLACED wholesale —
7507
7577
  // code wins, so the section can never contradict the register the verdict derives from.
7508
7578
  // PR-9 — same pattern for "### Answers to your instructions": code-built from the findings.json
7509
7579
  // ask_answers register joined to the frozen intake asks; an authored section is replaced wholesale.
@@ -7651,7 +7721,7 @@ export function assembleReportMd(P, findings, cardOrdinals, { grouped = [], byRi
7651
7721
  // that was checked, and nothing made them.
7652
7722
  //
7653
7723
  // FULL TEXT. Nothing on any surface shortens a judgment sentence — the renderer's 240-character fold
7654
- // was deleted with (2026-08-06) and no cap replaced it; the sentence is bounded by 's shape
7724
+ // was deleted with (2026-08-06) and no cap replaced it; the sentence is bounded by the shape
7655
7725
  // contract instead. Whitespace is collapsed only so the value cannot break the one-line `- key:`
7656
7726
  // shape parseCards keys on.
7657
7727
  //
@@ -8066,7 +8136,7 @@ async function pipelineInner(job, opts = {}) {
8066
8136
  // recovery ladder's weather lane exists so a 529 does not spend the defect budget. Refusing there would
8067
8137
  // replace a park that recovers with a terminal failure and a human.
8068
8138
  //
8069
- // GATED like the credential check, not like the binary check, and that is 's ruling rather than
8139
+ // GATED like the credential check, not like the binary check, and that is the ruling rather than
8070
8140
  // this file's: lanes with an injected recordFetcher and explicitly-selected knockout products do not
8071
8141
  // pay for the turn. Both of those lanes DO spawn the engine (preflightEngineBinary's header says so in
8072
8142
  // as many words), so the exemption is narrower than the reasoning that produced it — recorded on the
@@ -8248,7 +8318,7 @@ async function pipelineInner(job, opts = {}) {
8248
8318
  // Search-depth spine — freeze WHICH product shape this run is BEFORE the framework freeze (Phase 2a:
8249
8319
  // the knockout lane selects a different fallback framework, so the dispatch must happen first; the
8250
8320
  // policy freeze reads only ctx.profile). Cold-start mint only, like the profile freeze: a resumed
8251
- // pre-spine run reads as legacy-implicit prelim, never retro-minted.
8321
+ // pre-spine run reads as legacy-implicit clearotron, never retro-minted.
8252
8322
  attachSearchPolicy(ctx, job, { write: !isResume });
8253
8323
  // acceptance 5 — recorded on EVERY run, ungraded included: "which ladder applied" must be a
8254
8324
  // read, never an inference from which product the job asked for.
@@ -8499,7 +8569,7 @@ async function pipelineInner(job, opts = {}) {
8499
8569
  ctx.exclusionSeed = applicantMatchesProfile(ctx.profile, job.customer) ? (ctx.profile.selfExclusionOwners ?? []) : [];
8500
8570
  if (ctx.exclusionSeed.length) runLog(run.runDir, { event: "profile-exclusion-seed", owners: ctx.exclusionSeed.length });
8501
8571
  // On resume, rehydrate the driver-owned notes that must survive a park. (The failover provenance that
8502
- // used to be rehydrated alongside is deleted with the chain, — no run ever carried any.)
8572
+ // used to be rehydrated alongside is deleted with the chain — no run ever carried any.)
8503
8573
  if (isResume) {
8504
8574
  try {
8505
8575
  const prior = JSON.parse(readFileSync(join(run.runDir, "status.json"), "utf8"));
@@ -8527,7 +8597,7 @@ async function pipelineInner(job, opts = {}) {
8527
8597
  // is measured against. Best-effort: a run must never fail because it could not be sized.
8528
8598
  ctx.quote = quoteForJob({ job, profile: ctx.profile, searchPolicy: ctx.searchPolicy });
8529
8599
  if (ctx.quote) runLog(run.runDir, { event: "quote", ...ctx.quote });
8530
- note(`\n=== prelim-driver: ${run.slug} / ${run.date}-${run.codename} (agent=${agent}) ===`);
8600
+ note(`\n=== clearotron-driver: ${run.slug} / ${run.date}-${run.codename} (agent=${agent}) ===`);
8531
8601
 
8532
8602
  try {
8533
8603
  // Phase 0 done in code (slug/codename/run-dir/customer). Phase 1+2 stages:
@@ -8694,7 +8764,7 @@ async function pipelineInner(job, opts = {}) {
8694
8764
  // register candidates for the
8695
8765
  // frozen policy's jxLanes component, folded run-local onto the transliteration-numeric axis so the
8696
8766
  // unit spawn (axis-from-plan below), coverage skeleton, taint chain and clean gates inherit with
8697
- // zero new wiring. Lazy import (a plain prelim never loads jx machinery — byte-identical off);
8767
+ // zero new wiring. Lazy import (a plain clearotron never loads jx machinery — byte-identical off);
8698
8768
  // never-kill inside runJxCandidateFold (a degraded lane logs + receipts, the Latin plan stands).
8699
8769
  if (ctx.searchPolicy?.components?.jxLanes && ctx.registerPlan) {
8700
8770
  const { runJxCandidateFold } = await import("./jx.mjs");
@@ -9370,7 +9440,7 @@ async function pipelineInner(job, opts = {}) {
9370
9440
  // correctly; renaming would churn a documented vocabulary across two producers, a map and a
9371
9441
  // parameter, to fix a field that is not the one lying.
9372
9442
  //
9373
- // So the row gains the result as a SIBLING — 's other remedy — and the push moves below the
9443
+ // So the row gains the result as a SIBLING — the other remedy — and the push moves below the
9374
9444
  // taint re-read so there IS a result to state. `cleared` is the same fact `axesRec[a].status`
9375
9445
  // records two lines down, from this same read.
9376
9446
  if (taintRerunDispatch !== null) {
@@ -11724,7 +11794,7 @@ async function pipelineInner(job, opts = {}) {
11724
11794
  // deliver-conditional floor) keys on actions[]; a v4 emission that omits the field entirely would
11725
11795
  // silently disengage it — the exact CLEAR-despite-conditions bug this ships to fix. Same posture as
11726
11796
  // the schema-downlevel demand above: ONE warm re-demand, only when synthesis actually RAN this turn
11727
- // (a resumed pre- artifact keeps its shape — logged loudly, gates degrade); still-absent
11797
+ // (a resumed pre-change artifact keeps its shape — logged loudly, gates degrade); still-absent
11728
11798
  // after the demand is logged and rides on (deliver-always, the reviewer's actions-unregistered flag
11729
11799
  // and the predelivery coherence lint remain the nets).
11730
11800
  const readActionsPresence = () => {
@@ -12048,7 +12118,7 @@ async function pipelineInner(job, opts = {}) {
12048
12118
  // — what the DECLARED scope was and whether the pass honoured it. Recorded, never refused:
12049
12119
  // a gate here costs a whole extra dispatch on the stage this change exists to make cheaper, and
12050
12120
  // the reviewer is about to read the table anyway — it is better placed than a diff to say
12051
- // whether a knock-on edit was right. `unbound` is 's `cite_unbound` shape one gate over and
12121
+ // whether a knock-on edit was right. `unbound` is the `cite_unbound` shape one gate over and
12052
12122
  // would earn a refusal if it recurs; this round measures whether it does.
12053
12123
  correctionsScope = scopeDrift(rows, preDoc, postDoc);
12054
12124
  atomicWrite(P.correctionsApplied, JSON.stringify({ ts: new Date().toISOString(), verdict,
@@ -12861,7 +12931,7 @@ async function pipelineInner(job, opts = {}) {
12861
12931
  // round carry no _driver/jx-lanes.json at all. On those the writer would reach its absent arm and
12862
12932
  // print "NOT writing one", which reads as a withheld action on a run where absence is simply normal.
12863
12933
  // That is the absent-vs-failed conflation this tranche exists to remove; a lazy import also keeps a
12864
- // plain prelim byte-identical, which is why the sibling sites are shaped this way.
12934
+ // plain clearotron byte-identical, which is why the sibling sites are shaped this way.
12865
12935
  if (ctx.searchPolicy?.components?.jxLanes) {
12866
12936
  try {
12867
12937
  const { stateJxSlices } = await import("./jx.mjs");
@@ -13215,6 +13285,30 @@ async function pipelineInner(job, opts = {}) {
13215
13285
  note(`recall: ${silent.lost.length} position(s) the digest ended as FINDINGS reached no client `
13216
13286
  + `surface and no step said why — ${silent.lost.map((l) => `${l.mark ?? l.uri} (${l.reason})`).join("; ")}`);
13217
13287
  }
13288
+ // ── AND THE STATED CASE, WHICH IS THE ONE THAT REACHED A CLIENT (tracker issue 248) ────────
13289
+ //
13290
+ // Same inputs, same seam, same best-effort contract — a second call rather than a widened first
13291
+ // one, because the sibling's population boundary is deliberate and correct. It covers a
13292
+ // finding-ending followed by SILENCE; this covers one followed by a SENTENCE.
13293
+ //
13294
+ // On a delivered R2 run the sibling logged `checked:5 matched:5 lost:0` — correctly — on a
13295
+ // delivery missing two marks from the lawyer's final list, one rated HIGH. They were dropped with
13296
+ // a reason, so they were outside its population by design. A drop with a reason nobody verifies
13297
+ // is not accounted for; it is unexamined with a paper trail, and that delivery carried 66 of them.
13298
+ const stated = statedDivergenceFindings({
13299
+ reconciliation: safeReadJson(P.recallReconciliation),
13300
+ carryRows: safeReadJson(P.recordCarry)?.rows ?? null,
13301
+ digestFindingUris: recordedFindingUris(P.runDir),
13302
+ });
13303
+ runLog(P.runDir, { event: "stated-divergence-findings", computable: stated.computable,
13304
+ reason: stated.reason, population_empty: stated.population_empty === true,
13305
+ checked: stated.checked, matched: stated.matched, diverged: stated.diverged.length,
13306
+ marks: stated.diverged.map((d) => d.mark).filter(Boolean).slice(0, 10) });
13307
+ if (stated.diverged.length) {
13308
+ note(`recall: ${stated.diverged.length} position(s) the digest ended as FINDINGS are absent from `
13309
+ + "the findings and were dropped with a STATED reason pointing at another artifact — "
13310
+ + stated.diverged.map((d) => `${d.mark ?? d.uri} (${d.reason}${d.cites_artifact ? ` → ${d.cites_artifact.join(", ")}` : ""})`).join("; "));
13311
+ }
13218
13312
  } catch (e) { /* never mask a delivery */ }
13219
13313
  // — the common-law path, and the jx zh slice on the same tracer. `consumed` used to read
13220
13314
  // CLEAROTRON_JX_CONSUME, which decided whether a zh candidate could reach a finding at all: with it
@@ -13486,6 +13580,21 @@ async function pipelineInner(job, opts = {}) {
13486
13580
  const askApplied = applyAskClosure(runAsks, acc.ask, fileTexts, { ts: askTs });
13487
13581
  runAsks = askApplied.asks;
13488
13582
  for (const u of askApplied.unverified) runLog(run.runDir, { event: "ask-closure-unverified", ...u });
13583
+ // Option A (tracker issue 246): a recall ask whose mark is not in the delivered findings
13584
+ // did NOT close. Each one is a mark the run found and the client was not shown, so it is
13585
+ // recorded by name rather than left to be inferred from an ask that merely stayed open.
13586
+ // ✕ NOT written into findings.json here. See the sidecar's own note: a row appended after
13587
+ // the drafting stage would carry no band and no reasoning.
13588
+ for (const c of askApplied.carryIntoFindings ?? [])
13589
+ runLog(run.runDir, { event: "ask-closure-mark-owed", ...c });
13590
+ if (askApplied.carryIntoFindings?.length)
13591
+ writeFileSync(driverDir(run.runDir, "marks-owed-a-finding.json"),
13592
+ JSON.stringify({
13593
+ _provenance: "recall asks that could not close because the mark they found is absent from findings.json — owner ruling 2026-09-07, tracker issue 246 Option A, worded about the MARK",
13594
+ _notWritten: "these are NOT appended to findings.json: a finding carries a band, a net line and a legal position, and a row minted here would carry none of them. The repair belongs where the findings are authored.",
13595
+ count: askApplied.carryIntoFindings.length,
13596
+ marks: askApplied.carryIntoFindings,
13597
+ }, null, 2) + "\n");
13489
13598
  }
13490
13599
  } else {
13491
13600
  note(`doubt-closure failed (non-fatal — the open doubts/asks ship OPEN, as without the stage): ${dc.fail}`);
@@ -13639,7 +13748,7 @@ async function pipelineInner(job, opts = {}) {
13639
13748
  note(`registry-record closure: ${missing.length} cited record(s) absent from the run's set — targeted fetch`);
13640
13749
  const fetcher = opts.recordFetcher ?? defaultRecordFetcher;
13641
13750
  for (const uri of missing) {
13642
- const r = await fetcher(uri, { agentId: "prelim-driver", sessionKey: `${lintPrefix}record-closure`, recordLog: runRecordLogPath(run.runDir) });
13751
+ const r = await fetcher(uri, { agentId: "clearotron-driver", sessionKey: `${lintPrefix}record-closure`, recordLog: runRecordLogPath(run.runDir) });
13643
13752
  if (!r.ok) recordFetchFailures.set(uri, r.cause);
13644
13753
  }
13645
13754
  assembled = assembleRunRecords(run.runDir, lintPrefix); // pick up the closure fetches
@@ -13736,7 +13845,7 @@ async function pipelineInner(job, opts = {}) {
13736
13845
  askAnswers: lintAskAnswers, // PR-9 — present ⇒ the intake-ask check judges the deterministic join, not fuzzy containment
13737
13846
  cardFolds: (() => { try { return JSON.parse(readFileSync(driverDir(run.runDir, "card-folds.json"), "utf8")).folds; } catch { return null; } })(), // PR-9 — fold observability (flag-only)
13738
13847
  extraPlatformNames: ctx.profile?.platforms ?? [], // WS-B: profile marketplaces are run vocabulary
13739
- // tracker issue 134 — the SAME structure the masthead's coverage_line is stamped from
13848
+ // the SAME structure the masthead's coverage_line is stamped from
13740
13849
  // (scope-facts.json, written by writeScopeFacts). Passing the sidecar rather than re-deriving
13741
13850
  // is the point of the issue: the stamped line and the prose check now answer to one searched
13742
13851
  // set, so they cannot state two different answers about what was searched. Absent sidecar ⇒
@@ -14027,7 +14136,7 @@ async function pipelineInner(job, opts = {}) {
14027
14136
  // thousands of lines earlier, at the gate. Nothing re-reads it, so a reviewer that refuses to
14028
14137
  // sign DURING this repair is written to disk and never heard.
14029
14138
  //
14030
- // Measured on `bf21580e` (, round of 2026-08-23): verdict-2 CONDITIONAL at 00:22:11;
14139
+ // Measured on `bf21580e` (round of 2026-08-23): verdict-2 CONDITIONAL at 00:22:11;
14031
14140
  // `delivery-stale-repair` at 00:38:35 naming narrative-refutation; the review landing BLOCKING
14032
14141
  // at 00:52:01; delivered. The narrative printed a registration date of 1 March 2011 against a
14033
14142
  // fetched record reading 25 February 2011 — the reviewer said so, in the document nobody read.
@@ -14563,16 +14672,19 @@ async function pipelineInner(job, opts = {}) {
14563
14672
  conversationId: job.conversationId ?? null, // reply-lane fallback when msgId is not a Graph id
14564
14673
  subject: deliverySubject(emailProductName, job),
14565
14674
  emailBodyHtml: readFileSync(P.emailBody, "utf8"),
14566
- whatsappTo: AGENT_WHATSAPP[agent] ?? null,
14567
- whatsappText: `✅ Prelim search for ${mark}${ref}${vtag} is done. Report: ${published.url}`,
14675
+ // the notice goes to whoever ASKED, with the operator's copy beside it and a
14676
+ // stated reason when no number is held. It used to go to AGENT_WHATSAPP[agent], which is the
14677
+ // operator on every run because every user shares one agent id.
14678
+ ...whatsappRouting(job, agent),
14679
+ whatsappText: `✅ Clearotron search for ${mark}${ref}${vtag} is done. Report: ${published.url}`,
14568
14680
  url: published.url, verdict, markName: job.markName ?? job.name ?? null,
14569
14681
  };
14570
14682
  // A NEW send supersedes any previous one: .sent is PER-SEND idempotence, not per-run-lifetime.
14571
14683
  // A run that terminally failed (notice sent → .sent written) and was then resumed to success
14572
- // would otherwise be SKIPPED by prelim-deliver's .sent guard — the report would never send.
14684
+ // would otherwise be SKIPPED by clearotron-deliver's .sent guard — the report would never send.
14573
14685
  // The stale failure packet goes too, so the run dir tells exactly one delivery story. B4: the
14574
14686
  // per-channel send receipts are per-SEND state exactly like .sent — a stale email receipt from
14575
- // the superseded send would make prelim-deliver skip THIS packet's email, so they reset together.
14687
+ // the superseded send would make clearotron-deliver skip THIS packet's email, so they reset together.
14576
14688
  try { rmSync(join(run.runDir, ".sent")); } catch { /* none */ }
14577
14689
  try { rmSync(driverDir(run.runDir, "send-receipts.json"), { force: true }); } catch { /* none */ }
14578
14690
  try { rmSync(driverDir(run.runDir, "failure.json")); } catch { /* none */ }
@@ -14652,7 +14764,7 @@ async function pipelineInner(job, opts = {}) {
14652
14764
  // lands on "unknown", which buys one recovery park — the run would write `.postponed` and the
14653
14765
  // runner would auto-resume it two minutes later and keep billing.
14654
14766
  // 2. The failure packet would tell them their search BROKE. buildFailurePacket's copy is
14655
- // "❌ Prelim search for X FAILED at Y", pushed to the customer over the outbox. Someone who
14767
+ // "❌ Clearotron search for X FAILED at Y", pushed to the customer over the outbox. Someone who
14656
14768
  // pressed Stop must never be told something went wrong; they already know what happened.
14657
14769
  //
14658
14770
  // Partial work is not deliverable, so nothing is published — but the spend up to this point is
@@ -14834,7 +14946,7 @@ async function pipelineInner(job, opts = {}) {
14834
14946
  // is precisely what `recoveryResumesAt` means. So a weather park writes `recoveryResumesAt` like
14835
14947
  // any other recovery park, still leaves `resetsAt` null, and the record says WHICH lane bought
14836
14948
  // the wait in `recoveryLane` instead of implying a provider clock that does not exist.
14837
- // tracker issue 103 — A CAP PARK IS NOT A STAGE FAILING, and the 2/15/60 ladder cannot survive one.
14949
+ // A CAP PARK IS NOT A STAGE FAILING, and the 2/15/60 ladder cannot survive one.
14838
14950
  // A cap that classifies `rate_limited` already takes the postpone path and waits for its stated
14839
14951
  // reset. One that does NOT lands here, where two things used to go wrong: the provider's own reset
14840
14952
  // hint was dropped even though StageFailure carries it all the way to this site, and the ladder
@@ -14871,7 +14983,7 @@ async function pipelineInner(job, opts = {}) {
14871
14983
  // lane's spend is recomputed from the record rather than from a second counter that could drift
14872
14984
  // (writeRunStatus shallow-merges, so the full array is passed each time).
14873
14985
  // — a PARKED run is the one a reader diagnoses from status.json alone, and this cut at 200
14874
- // and said nothing. `recovering` is not terminal, so it was never covered by 's terminal
14986
+ // and said nothing. `recovering` is not terminal, so it was never covered by the terminal
14875
14987
  // fields; the reader's problem is identical either way — a sentence that stops mid-thought with
14876
14988
  // no key admitting it stopped. Same three fields, same function, so the two cannot drift.
14877
14989
  writeRunStatus(ctx, { state: "recovering", recoveryAttempts: attempt, recoveryMax, failedStage,
@@ -14881,7 +14993,7 @@ async function pipelineInner(job, opts = {}) {
14881
14993
  //: the row carries the park's progress QUANTITY, so the next failure's comparison can see
14882
14994
  // 9 → 6 (converging) where the signature alone shows only "the same defect again". Written
14883
14995
  // unconditionally as number|null — a row that says null means "this failure had no count", which
14884
- // is a different fact from a pre- row that has no such key at all.
14996
+ // is a different fact from a pre-change row that has no such key at all.
14885
14997
  //
14886
14998
  //: `quantityToken` and `classSource` ride beside it, written unconditionally as value|null
14887
14999
  // for the same reason. This row is the ONLY one of the three records here that repair-digest.mjs
@@ -14892,7 +15004,7 @@ async function pipelineInner(job, opts = {}) {
14892
15004
  // half the inputs. It also makes the epoch legible: a row with no `classSource` KEY predates
14893
15005
  // this field and was never measured, which is a different fact from a row that says "no gap".
14894
15006
  recoveryHistory: [...recoveryHistory, { sig: failSig.sig, stage: failedStage, class: failClass, lane, attempt, quantity, quantityToken: failSig.quantityToken ?? null, kindToken: failSig.kindToken ?? null, classSource, ts: new Date().toISOString(),
14895
- // tracker issue 103 — THE SAME FACTS THE RUN LOG ALREADY GETS, in the record that SURVIVES.
15007
+ // THE SAME FACTS THE RUN LOG ALREADY GETS, in the record that SURVIVES.
14896
15008
  // The auto-recovery-parked event below carries capPark/basis/waitMin and says in its own note
14897
15009
  // that a cap has to be legible or nobody can tell a stated reset from our ladder's guess. But
14898
15010
  // run.jsonl is not what the terminal reads: status.json's recoveryHistory is the only record
@@ -14903,7 +15015,7 @@ async function pipelineInner(job, opts = {}) {
14903
15015
  ...(capSchedule ? { capPark: true, recoveryWaitBasis, recoveryWaitMin } : {}) }] });
14904
15016
  rollupStatus(run.studioRoot);
14905
15017
  runLog(run.runDir, { event: "auto-recovery-parked", stage: failedStage, attempt, of: recoveryMax, lane, laneAttempt, laneOf: decision.laneCeiling, recoveryResumesAt, reason: String(reason).slice(0, 200), sig: failSig.sig, class: failClass,
14906
- // tracker issue 103 — a cap park has to be legible in the record, or the next reader diagnosing
15018
+ // a cap park has to be legible in the record, or the next reader diagnosing
14907
15019
  // "why did this wait 21 hours" cannot tell a provider's stated reset from our own ladder guess.
14908
15020
  // Absent on a non-cap park rather than false: a row that says nothing is honest about not having
14909
15021
  // looked, while `capPark: false` would read as "we checked and it was not one".
@@ -15016,7 +15128,7 @@ async function pipelineInner(job, opts = {}) {
15016
15128
  }
15017
15129
  // T5 (J5) — the failure NOTICE rides the SAME guaranteed lane as success delivery: a
15018
15130
  // CODE-authored packet (_driver/failure.json) + sendPending + the outbox wake marker, consumed by
15019
- // the completion-watch → prelim-deliver skill exactly like a delivery packet. This makes the
15131
+ // the completion-watch → clearotron-deliver skill exactly like a delivery packet. This makes the
15020
15132
  // notice failure-independent: no WhatsApp binding, a handoff-mode engine, or a dead ping stage can
15021
15133
  // no longer silence it ( F9: teal-keystone died silently on exactly that). Best-effort —
15022
15134
  // packet-write trouble must never mask the original failure; the .failed sentinel + status.json
@@ -15321,7 +15433,36 @@ function experimentEngineName() {
15321
15433
  catch { return String(process.env.CLEAROTRON_AI ?? "").trim().toLowerCase() || null; }
15322
15434
  }
15323
15435
 
15436
+ /**
15437
+ * A DRAW IS WORK ON THIS BOX, AND THE DEPLOY GUARD HAS TO BE ABLE TO SEE IT.
15438
+ *
15439
+ * `pipeline()` takes a run slot, so a clearance is visible to `deployRefusal` and an hourly deploy defers
15440
+ * over it. A draw is a direct invocation and took nothing, so the guard saw an idle box and a tick could
15441
+ * fast-forward the checkout, reinstall and restart the units under a running experiment. Measured by the
15442
+ * test lane: the only thing protecting a replication was somebody stopping the deploy timer by hand,
15443
+ * which made that hold load-bearing without anyone having decided it should be.
15444
+ *
15445
+ * IT TAKES ITS OWN LOCK, NOT A RUN SLOT. A run slot is admission-controlled against
15446
+ * `maxConcurrentRuns`, so acquiring one here would make a draw WAIT behind clearances and make clearances
15447
+ * wait behind draws — changing what a draw is in order to fix what a guard can see. The `draw` prefix is
15448
+ * a separate namespace in the same directory: the deploy guard counts it, and nothing else does.
15449
+ *
15450
+ * The cap is deliberately far above any real number of concurrent draws, because this lock exists to be
15451
+ * SEEN and never to ration. A draw that blocked here would be a new failure mode in place of an old one.
15452
+ */
15324
15453
  export async function runExperiment(job, opts) {
15454
+ const lock = await acquireSlot({ dir: config.runLockDir, cap: 1024, prefix: "draw" });
15455
+ try {
15456
+ return await runExperimentInner(job, opts);
15457
+ } finally {
15458
+ // Best-effort, like the run slot's own release: the lock reaper covers a process that dies here, and
15459
+ // a stale draw lock with a dead pid does not refuse a deploy — the guard tests liveness.
15460
+ try { releaseSlot(lock); } catch { /* the reaper covers what this misses */ }
15461
+ }
15462
+ }
15463
+
15464
+
15465
+ async function runExperimentInner(job, opts) {
15325
15466
  const name = opts.experiment;
15326
15467
  if (!STAGES[name]) throw new Error(`--experiment: unknown stage "${name}"`);
15327
15468
  // The axis is checked for MEMBERSHIP, not truthiness, and BEFORE reconstructCtx touches the run dir.
@@ -15339,7 +15480,7 @@ export async function runExperiment(job, opts) {
15339
15480
  // against REGISTER_AXES would refuse the two arms this issue exists to make work.
15340
15481
  //
15341
15482
  // So the membership test is kept and made PER STAGE: every stage that takes an axis names its own
15342
- // vocabulary, and a stage that takes none still refuses a stray one — 's guarantee, unchanged,
15483
+ // vocabulary, and a stage that takes none still refuses a stray one — the guarantee, unchanged,
15343
15484
  // over a valid set that is now true for each stage rather than true for one of them.
15344
15485
  const vocab = AXIS_VOCABULARY[name] ?? null;
15345
15486
  if (!vocab && axis !== null)
@@ -15481,6 +15622,17 @@ export async function runExperiment(job, opts) {
15481
15622
  // what RAN.
15482
15623
  engine: experimentEngineName(),
15483
15624
  modelTier: model ?? null,
15625
+ // — THE RATING AUTHORITY THIS ARM RAN UNDER, on the arm's own record.
15626
+ //
15627
+ // `whatIfRun` resolves this correctly and returned it in memory only: nothing in the experiment
15628
+ // directory named the profile it rated under, so a reader coming to the arm tomorrow could not
15629
+ // confirm which framework produced it, and a future regression would be as silent as the one this
15630
+ // was opened on. The frozen sidecar is the authority — never a fresh resolve, which is the mid-run
15631
+ // drift the freeze exists to forbid.
15632
+ //
15633
+ // `null` means the run carries no frozen profile (a legacy run), and it is written rather than
15634
+ // omitted: absent and "there was none" are different facts and only one of them is a defect.
15635
+ ratedUnder: ctx.profile?.profileKey ?? null,
15484
15636
  dispatchTrigger: opts.dispatchTrigger ?? "fresh",
15485
15637
  // — WHICH PASS THIS ARM REPRODUCED, in a word. null on a non-corrective arm;
15486
15638
  // never "dispatched-warm", which is production's alone.
@@ -15800,7 +15952,7 @@ if (isEntrypoint(import.meta.url)) void (async () => {
15800
15952
 
15801
15953
  // — reading the job file used to sit OUTSIDE the try below, so a path typo or a stray comma
15802
15954
  // exited on a raw V8 stack trace: a non-clean exit with no honest message, and the one shape of
15803
- // mistake a first-time reader is likeliest to make. Kept guarded here through 's rebase — the
15955
+ // mistake a first-time reader is likeliest to make. Kept guarded here through the rebase — the
15804
15956
  // pool check above is a separate refusal and must not swallow this one.
15805
15957
  let job;
15806
15958
  try { job = JSON.parse(readFileSync(a.job, "utf8")); }