clearotron 0.2.1 → 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 (622) hide show
  1. package/.env.example +54 -1
  2. package/CONTRIBUTING.md +3 -3
  3. package/INSTALL.md +53 -49
  4. package/bin/brandowner.mjs +1 -1
  5. package/bin/clearotron.mjs +4 -4
  6. package/bin/connect.mjs +2 -2
  7. package/bin/example.mjs +27 -11
  8. package/bin/grant.mjs +3 -3
  9. package/bin/key.mjs +1 -1
  10. package/bin/onboard.mjs +58 -118
  11. package/bin/start.mjs +22 -25
  12. package/bin/stop.mjs +65 -3
  13. package/bin/update.mjs +7 -7
  14. package/bin/uspto-sync.mjs +1 -1
  15. package/build-info.json +2 -2
  16. package/docs/DELIVERY.md +6 -2
  17. package/docs/architecture/01-product-overview.md +2 -2
  18. package/docs/architecture/02-architecture.md +2 -2
  19. package/docs/architecture/04-configuration-reference.md +6 -3
  20. package/docs/architecture/05-config-governance.md +38 -5
  21. package/docs/architecture/06-operations-runbook.md +13 -1
  22. package/docs/architecture/09-security-and-data.md +1 -1
  23. package/docs/decisions/0004-documentation-structure.md +1 -1
  24. package/driver/CHANGELOG.md +65 -1
  25. package/driver/README.md +2 -2
  26. package/driver/ask-ledger.mjs +3 -3
  27. package/driver/authority-trees.mjs +1 -1
  28. package/driver/call-capture.mjs +1 -1
  29. package/driver/card-frame.mjs +1 -1
  30. package/driver/case-law-ledger.mjs +1 -1
  31. package/driver/claim-liveness.mjs +1 -1
  32. package/driver/common-law-receipts.mjs +1 -1
  33. package/driver/commonlaw-carry.mjs +1 -1
  34. package/driver/config-inventory.mjs +1 -1
  35. package/driver/connotation-search.mjs +12 -12
  36. package/driver/contract-audit.mjs +5 -5
  37. package/driver/contract-dictation-registry.mjs +4 -4
  38. package/driver/contract-dictation.mjs +2 -2
  39. package/driver/contract-e3-backlog.mjs +6 -6
  40. package/driver/contract-vocabulary.mjs +3 -3
  41. package/driver/corrections-feedforward.mjs +1 -1
  42. package/driver/coverage-form-io.mjs +2 -2
  43. package/driver/coverage-form.mjs +4 -4
  44. package/driver/coverage-ledger.mjs +3 -3
  45. package/driver/coverage-union.mjs +1 -1
  46. package/driver/declination-call.mjs +35 -3
  47. package/driver/declination-duty.mjs +1 -1
  48. package/driver/deliver-trigger.sh +3 -3
  49. package/driver/deploy-live-run-guard.mjs +6 -2
  50. package/driver/dev-portal.mjs +1 -1
  51. package/driver/disposition-call.mjs +4 -4
  52. package/driver/disposition-tool.mjs +4 -4
  53. package/driver/disposition-union.mjs +2 -2
  54. package/driver/doc-constants.mjs +1 -1
  55. package/driver/door-gates.mjs +2 -2
  56. package/driver/doubt-selection.mjs +2 -2
  57. package/driver/drainer-identity.mjs +1 -1
  58. package/driver/driver.config.mjs +63 -11
  59. package/driver/e2e-rounds.mjs +2 -2
  60. package/driver/effort-model.mjs +2 -2
  61. package/driver/engine/anthropic-agent.mjs +24 -24
  62. package/driver/engine/auth.mjs +1 -1
  63. package/driver/engine/common.mjs +1 -1
  64. package/driver/engine/deny-authority-write.mjs +1 -1
  65. package/driver/engine/jx-turn.mjs +1 -1
  66. package/driver/engine/mcp/clarivate-server.mjs +1 -1
  67. package/driver/engine/mcp/corsearch-server.mjs +1 -1
  68. package/driver/engine/mcp/declination-server.mjs +1 -1
  69. package/driver/engine/mcp/dispositions-server.mjs +1 -1
  70. package/driver/engine/mcp/euipo-server.mjs +1 -1
  71. package/driver/engine/mcp/fetch-server.mjs +1 -1
  72. package/driver/engine/mcp/free-tier-server.mjs +2 -2
  73. package/driver/engine/mcp/gather-config.mjs +11 -11
  74. package/driver/engine/mcp/perplexity-server.mjs +1 -1
  75. package/driver/engine/mcp/recording-server.mjs +8 -4
  76. package/driver/engine/mcp/signa-server.mjs +1 -1
  77. package/driver/engine/mcp/uspto-local-server.mjs +1 -1
  78. package/driver/engine/openai-agent.mjs +2 -2
  79. package/driver/engine-build.mjs +2 -2
  80. package/driver/enqueue-schema.mjs +2 -2
  81. package/driver/enqueue.mjs +1 -1
  82. package/driver/envelope-settle.mjs +1 -1
  83. package/driver/evidence-claim-invariant.mjs +2 -2
  84. package/driver/findings-model.mjs +8 -8
  85. package/driver/floor-duty.mjs +1 -1
  86. package/driver/form-neighbourhood.mjs +1 -1
  87. package/driver/framework.mjs +1 -1
  88. package/driver/gateway.mjs +28 -23
  89. package/driver/grounds-grammar.mjs +1 -1
  90. package/driver/hit-list.mjs +1 -1
  91. package/driver/jurisdiction-systems.mjs +1 -1
  92. package/driver/jx-lanes.mjs +1 -1
  93. package/driver/jx-units.mjs +1 -1
  94. package/driver/jx.mjs +3 -3
  95. package/driver/knockout-assess-record.mjs +5 -1
  96. package/driver/narrative-refutation-record.mjs +3 -3
  97. package/driver/numeric-setting.mjs +1 -1
  98. package/driver/owner-use-check.mjs +184 -0
  99. package/driver/package.json +2 -2
  100. package/driver/phase0.mjs +1 -1
  101. package/driver/pipeline-knockout.mjs +52 -4
  102. package/driver/pipeline.mjs +175 -62
  103. package/driver/placement-diff.mjs +2 -2
  104. package/driver/placement-form.mjs +4 -4
  105. package/driver/placement-union.mjs +1 -1
  106. package/driver/portal-acks.mjs +1 -1
  107. package/driver/portal-config-view.mjs +2 -2
  108. package/driver/portal-local-auth.mjs +1 -1
  109. package/driver/portal-report.mjs +6 -6
  110. package/driver/portal-service.mjs +15 -15
  111. package/driver/predelivery-lint.mjs +28 -10
  112. package/driver/prelim-variants-record.mjs +2 -2
  113. package/driver/profile-page.html +1 -1
  114. package/driver/profile-selection.mjs +1 -1
  115. package/driver/profile-service.mjs +2 -2
  116. package/driver/profiles.mjs +1 -1
  117. package/driver/progress.mjs +6 -6
  118. package/driver/provider-usage.mjs +1 -1
  119. package/driver/publish/demo-marking.mjs +1 -1
  120. package/driver/publish/index.mjs +47 -6
  121. package/driver/publish/knockout.mjs +36 -14
  122. package/driver/publish/parse.mjs +4 -4
  123. package/driver/publish/publish-inputs.mjs +2 -2
  124. package/driver/publish/register-presence.mjs +1 -1
  125. package/driver/publish/render-knockout.mjs +198 -31
  126. package/driver/publish/report-data.mjs +13 -3
  127. package/driver/queue-watch-probe.mjs +1 -1
  128. package/driver/queue-watch-verdict.mjs +1 -1
  129. package/driver/recall-reconciliation.mjs +1 -1
  130. package/driver/recipe-service.mjs +1 -1
  131. package/driver/record-carry.mjs +5 -5
  132. package/driver/recording-agreement.mjs +3 -3
  133. package/driver/reference-score.mjs +7 -7
  134. package/driver/refusal-bound.mjs +3 -3
  135. package/driver/register-availability.mjs +2 -2
  136. package/driver/register-count.mjs +1 -1
  137. package/driver/register-grant-vocabulary.mjs +2 -2
  138. package/driver/register-plan.mjs +8 -8
  139. package/driver/register-records.mjs +2 -2
  140. package/driver/registry-fidelity.mjs +3 -3
  141. package/driver/remedy-accounting.mjs +1 -1
  142. package/driver/repair-composers.mjs +2 -2
  143. package/driver/repair-digest.mjs +3 -3
  144. package/driver/repairs.mjs +6 -6
  145. package/driver/replay-archive.mjs +2 -0
  146. package/driver/report-card-record.mjs +2 -2
  147. package/driver/result-noun-fields.mjs +10 -3
  148. package/driver/run-economics.mjs +2 -2
  149. package/driver/run-integrity.mjs +1 -1
  150. package/driver/runner.mjs +22 -22
  151. package/driver/scope-rules.mjs +1 -1
  152. package/driver/search-policy.mjs +3 -3
  153. package/driver/skeptic-search.mjs +1 -1
  154. package/driver/skills/blind-frame/SKILL.md +1 -1
  155. package/driver/skills/case-law-citation/SKILL.md +2 -2
  156. package/driver/skills/knockout-assess/SKILL.md +10 -4
  157. package/driver/skills/prelim-search/SKILL.md +2 -2
  158. package/driver/skills/prelim-search/template-formatting.md +1 -1
  159. package/driver/skills/prelim-search/templates/email/generic.md +1 -1
  160. package/driver/skills/prelim-search/worked-examples.md +1 -1
  161. package/driver/skills/prelim-variants/SKILL.md +2 -2
  162. package/driver/stage-context.mjs +1 -1
  163. package/driver/stages-knockout.mjs +55 -4
  164. package/driver/stages.mjs +97 -40
  165. package/driver/stray-artifacts.mjs +2 -2
  166. package/driver/suite-census.json +146 -32
  167. package/driver/synthesis-record.mjs +1 -1
  168. package/driver/systemd/clearotron-client-mcp.service +1 -1
  169. package/driver/systemd/clearotron-portal.service +1 -1
  170. package/driver/systemd/render-units.mjs +1 -1
  171. package/driver/tokens.mjs +1 -1
  172. package/driver/tool-calls.mjs +1 -1
  173. package/driver/turnaround-bands.mjs +1 -1
  174. package/driver/unit-file-drift.mjs +1 -1
  175. package/driver/unit-inventory.mjs +121 -61
  176. package/driver/unit-state-verdict.mjs +20 -12
  177. package/driver/verify-knockout.mjs +10 -2
  178. package/driver/verify.mjs +12 -12
  179. package/driver/whatif-memo-run.mjs +46 -5
  180. package/driver/whatif-queue.mjs +1 -1
  181. package/driver/whatif-worker.mjs +1 -1
  182. package/mcp-server/CHANGELOG.md +4 -0
  183. package/mcp-server/README.md +3 -3
  184. package/mcp-server/http-server.mjs +44 -1
  185. package/mcp-server/key-socket.mjs +184 -0
  186. package/mcp-server/lib/audit-view.mjs +69 -2
  187. package/mcp-server/lib/brief.mjs +15 -0
  188. package/mcp-server/lib/driver.mjs +7 -1
  189. package/mcp-server/lib/events.mjs +1 -1
  190. package/mcp-server/lib/http-handler.mjs +1 -1
  191. package/mcp-server/lib/knockout.mjs +435 -0
  192. package/mcp-server/lib/ops.mjs +4 -4
  193. package/mcp-server/lib/options.mjs +1 -1
  194. package/mcp-server/lib/plan.mjs +1 -1
  195. package/mcp-server/lib/runs.mjs +1 -1
  196. package/mcp-server/lib/scrub.mjs +1 -1
  197. package/mcp-server/lib/whatif.mjs +3 -3
  198. package/mcp-server/mint-token.mjs +1 -1
  199. package/mcp-server/package.json +2 -2
  200. package/mcp-server/server.mjs +76 -11
  201. package/package.json +3 -3
  202. package/portal-ui/package.json +1 -1
  203. package/providers/_shared/enumerate.mjs +1 -1
  204. package/providers/_shared/ledger-path.mjs +3 -3
  205. package/providers/_shared/ledger.mjs +1 -1
  206. package/providers/_shared/result-shape.mjs +3 -3
  207. package/providers/_shared/term-shape.mjs +1 -1
  208. package/providers/corsearch/src/core.js +1 -1
  209. package/providers/jx-subclass/BUILDING.md +1 -1
  210. package/providers/oauth-mcp-bridge/CHANGELOG.md +4 -0
  211. package/providers/oauth-mcp-bridge/package.json +1 -1
  212. package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
  213. package/scripts/README.md +1 -1
  214. package/scripts/added-reference-check.mjs +29 -1
  215. package/scripts/ai-page-render-check.mjs +1 -1
  216. package/scripts/authority-boundary-probe.mjs +1 -1
  217. package/scripts/backfill-started-at.mjs +1 -1
  218. package/scripts/citation-line-check.mjs +3 -3
  219. package/scripts/clearances-render-check.mjs +3 -3
  220. package/scripts/compare.mjs +2 -2
  221. package/scripts/composer-render-check.mjs +6 -6
  222. package/scripts/contract-dictation-scan.mjs +2 -2
  223. package/scripts/dead-names.mjs +1 -1
  224. package/scripts/drain-preflight.mjs +5 -5
  225. package/scripts/e2e-unread-terminals.mjs +1 -1
  226. package/scripts/e2e.mjs +8 -8
  227. package/scripts/env-audit.mjs +7 -7
  228. package/scripts/env-classify.mjs +139 -15
  229. package/scripts/freeze-example-run.mjs +3 -3
  230. package/scripts/head-arrived-gated.mjs +1 -1
  231. package/scripts/headless-page.mjs +51 -2
  232. package/scripts/home-render-check.mjs +2 -2
  233. package/scripts/live-surface-check.mjs +92 -19
  234. package/scripts/main-health.mjs +1 -1
  235. package/scripts/merge-presence-check.mjs +3 -3
  236. package/scripts/mint-suite-census.mjs +6 -6
  237. package/scripts/nightly-notice.mjs +1 -1
  238. package/scripts/portal-lifecycle-check.mjs +3 -3
  239. package/scripts/reconcile-runs.mjs +1 -1
  240. package/scripts/release-await-cut.mjs +6 -4
  241. package/scripts/release-version-pr-checks.mjs +1 -1
  242. package/scripts/release-version.mjs +2 -2
  243. package/scripts/render-check.mjs +66 -7
  244. package/scripts/report-frame-check.mjs +1 -1
  245. package/scripts/report-screenshot.mjs +1 -1
  246. package/scripts/revisit-render-check.mjs +1 -1
  247. package/scripts/score.mjs +4 -4
  248. package/scripts/strip-tracker-citations.mjs +116 -0
  249. package/scripts/test-run.mjs +3 -3
  250. package/scripts/third-party-notices.mjs +3 -3
  251. package/scripts/travelling-predicates.mjs +3 -3
  252. package/scripts/unexecuted-asserts.mjs +2 -2
  253. package/scripts/verify-publishable.mjs +2 -2
  254. package/scripts/write-up-form-census.mjs +1 -1
  255. package/shared/access-audience.mjs +1 -1
  256. package/shared/brand.mjs +13 -13
  257. package/shared/citation-scan.mjs +1 -1
  258. package/shared/client-door.mjs +7 -7
  259. package/shared/driver-dir.mjs +1 -1
  260. package/shared/env-aliases.mjs +0 -48
  261. package/shared/env-local.mjs +1 -1
  262. package/shared/identifier-scan.mjs +3 -3
  263. package/shared/invocation.mjs +1 -1
  264. package/shared/names-in-force.mjs +2 -0
  265. package/shared/product-owned-names.mjs +1 -1
  266. package/shared/register-selection.mjs +1 -1
  267. package/shared/scope.mjs +5 -5
  268. package/shared/server-units.mjs +4 -4
  269. package/shared/store-in-repo.mjs +2 -2
  270. package/shared/suite-census.mjs +4 -4
  271. package/shared/tty-style.mjs +1 -1
  272. package/shared/uspto-index-size.mjs +1 -1
  273. package/shared/vacuous-pass.mjs +1 -1
  274. package/skills/clearotron-account/SKILL.md +42 -13
  275. package/driver/systemd/prelim-driver.path +0 -69
  276. package/driver/systemd/prelim-driver.service +0 -86
  277. package/driver/systemd/prelim-driver.timer +0 -14
  278. package/driver/systemd/prelim-outbox.path +0 -27
  279. package/driver/systemd/prelim-outbox.service +0 -37
  280. package/driver/systemd/prelim-outbox.timer +0 -21
  281. package/node_modules/exceljs/README_zh.md +0 -2878
  282. package/node_modules/exceljs/dist/LICENSE +0 -22
  283. package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
  284. package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
  285. package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
  286. package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
  287. package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
  288. package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
  289. package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
  290. package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
  291. package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
  292. package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
  293. package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
  294. package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
  295. package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
  296. package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
  297. package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
  298. package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
  299. package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
  300. package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
  301. package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
  302. package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
  303. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
  304. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
  305. package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
  306. package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
  307. package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
  308. package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
  309. package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
  310. package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
  311. package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
  312. package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
  313. package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
  314. package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
  315. package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
  316. package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
  317. package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
  318. package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
  319. package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
  320. package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
  321. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
  322. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
  323. package/node_modules/exceljs/dist/es5/index.js +0 -15
  324. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
  325. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
  326. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
  327. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
  328. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
  329. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
  330. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
  331. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
  332. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
  333. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
  334. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
  335. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
  336. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
  337. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
  338. package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
  339. package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
  340. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
  341. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
  342. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
  343. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
  344. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
  345. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
  346. package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
  347. package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
  348. package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
  349. package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
  350. package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
  351. package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
  352. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
  353. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
  354. package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
  355. package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
  356. package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
  357. package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
  358. package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
  359. package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
  360. package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
  361. package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
  362. package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
  363. package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
  364. package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
  365. package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
  366. package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
  367. package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
  368. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
  369. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
  370. package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
  371. package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
  372. package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
  373. package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
  374. package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
  375. package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
  376. package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
  377. package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
  378. package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
  379. package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
  380. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
  381. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
  382. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
  383. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
  384. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
  385. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
  386. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
  387. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
  388. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
  389. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
  390. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
  391. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
  392. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
  393. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
  394. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
  395. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
  396. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
  397. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
  398. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
  399. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
  400. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
  401. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
  402. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
  403. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
  404. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
  405. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
  406. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
  407. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
  408. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
  409. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
  410. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
  411. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
  412. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
  413. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
  414. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
  415. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
  416. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
  417. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
  418. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
  419. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
  420. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
  421. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
  422. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
  423. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
  424. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
  425. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
  426. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
  427. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
  428. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
  429. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
  430. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
  431. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
  432. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
  433. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
  434. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
  435. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
  436. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
  437. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
  438. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
  439. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
  440. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
  441. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
  442. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
  443. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
  444. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
  445. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
  446. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
  447. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
  448. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
  449. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
  450. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
  451. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
  452. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
  453. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
  454. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
  455. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
  456. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
  457. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
  458. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
  459. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
  460. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
  461. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
  462. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
  463. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
  464. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
  465. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
  466. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
  467. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
  468. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
  469. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
  470. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
  471. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
  472. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
  473. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
  474. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
  475. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
  476. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
  477. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
  478. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
  479. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
  480. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
  481. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
  482. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
  483. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
  484. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
  485. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
  486. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
  487. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
  488. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
  489. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
  490. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
  491. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
  492. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
  493. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
  494. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
  495. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
  496. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
  497. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
  498. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
  499. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
  500. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
  501. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
  502. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
  503. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
  504. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
  505. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
  506. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
  507. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
  508. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
  509. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
  510. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
  511. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
  512. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
  513. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
  514. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
  515. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
  516. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
  517. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
  518. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
  519. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
  520. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
  521. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
  522. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
  523. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
  524. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
  525. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
  526. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
  527. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
  528. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
  529. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
  530. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
  531. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
  532. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
  533. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
  534. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
  535. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
  536. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
  537. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
  538. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
  539. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
  540. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
  541. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
  542. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
  543. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
  544. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
  545. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
  546. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
  547. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
  548. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
  549. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
  550. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
  551. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
  552. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
  553. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
  554. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
  555. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
  556. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
  557. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
  558. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
  559. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
  560. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
  561. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
  562. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
  563. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
  564. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
  565. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
  566. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
  567. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
  568. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
  569. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
  570. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
  571. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
  572. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
  573. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
  574. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
  575. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
  576. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
  577. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
  578. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
  579. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
  580. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
  581. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
  582. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
  583. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
  584. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
  585. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
  586. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
  587. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
  588. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
  589. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
  590. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
  591. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
  592. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
  593. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
  594. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
  595. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
  596. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
  597. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
  598. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
  599. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
  600. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
  601. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
  602. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
  603. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
  604. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
  605. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
  606. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
  607. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
  608. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
  609. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
  610. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
  611. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
  612. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
  613. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
  614. package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
  615. package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
  616. package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
  617. package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
  618. package/node_modules/exceljs/dist/exceljs.js +0 -59900
  619. package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
  620. package/node_modules/exceljs/dist/exceljs.min.js +0 -45
  621. package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
  622. package/scripts/deploy-test.sh +0 -309
@@ -23,6 +23,11 @@
23
23
  // | recipe-service | — | — | yes | yes |
24
24
  // | portal-service | — | — | yes | NO |
25
25
  //
26
+ // THAT TABLE IS THE 2026-08-11 READING AND IS NOT REFRESHED. Two of its rows name units that no longer
27
+ // exist: `prelim-driver` and `prelim-outbox` were retired with the path-watcher drain posture and their
28
+ // files left the tree once production was rebuilt. They stay in the table because it records what was
29
+ // measured on that date, and a measurement edited to match today is no longer a measurement.
30
+ //
26
31
  // TWO CORRECTIONS TO THE ISSUE ARE BAKED INTO THIS TABLE, and one of them inverts a fix. lists
27
32
  // `profile-service` and `prelim-outbox` under "tracked and never run". That reading comes from the test
28
33
  // box, where neither is installed. PRODUCTION RUNS BOTH — so deleting their tracked files as dead
@@ -52,7 +57,7 @@
52
57
  // each was already in the tree, in `mcp-server/remote/`. The repo's own governance doc names BOTH
53
58
  // directories (`docs/architecture/05-config-governance.md`, tier 2); the guard named one.
54
59
  //
55
- // That is the same defect one layer up from the one this file was built to fix. 's inline array made
60
+ // That is the same defect one layer up from the one this file was built to fix. That inline array made
56
61
  // a unit's membership of the guarantee an omission; the hardcoded directory made a FILE's membership an
57
62
  // omission, and the result was three statements of fact that were false with nothing able to contradict
58
63
  // them. The tracked-file lookup is now a repo-wide walk (driver/unit-files.mjs), and `unitInventoryVerdict`
@@ -70,7 +75,7 @@
70
75
  /** Where a unit is expected to be installed. "none" is a claim, not an absence — see ORPHANED below. */
71
76
  export const BOXES = Object.freeze(["prod", "test", "dev"]);
72
77
 
73
- // ── RESOLVED UNITS (, owner ruling 2026-08-25 — option B) ──────────────────────
78
+ // ── RESOLVED UNITS (owner ruling 2026-08-25 — option B) ──────────────────────
74
79
  //
75
80
  // `resolved: [...]` names tracked files the INSTALLER rewrites before installing. Three units carry
76
81
  // `@NAME@` placeholders because configuration cannot reach them: a `.path` unit reads no environment at
@@ -98,6 +103,13 @@ export const BOXES = Object.freeze(["prod", "test", "dev"]);
98
103
  // 2026-08-26), so the rebuild is the event that releases the files, and until then entry and tree
99
104
  // disagree ON PURPOSE.
100
105
  //
106
+ // THE REBUILD HAPPENED, and the first two entries this field ever carried have gone with their files.
107
+ // Measured on the production install 2026-09-07 (tracker issue 265): seven units, all under the current
108
+ // names, none of the retired ones, with a clearance delivered end to end. `prelim-driver.*` and
109
+ // `prelim-outbox.*` left the tree in the same change that removed their entries. Read the paragraph
110
+ // above as the rule and this one as the event that discharged it — without this line a reader concludes
111
+ // the files are still owed and that their absence is the drift.
112
+ //
101
113
  // Two consumers, so this is not prose: `unitInventoryVerdict` reports a retired unit's absence as
102
114
  // EXPECTED rather than as drift, and a claimed-but-missing tracked file is a fault whatever the
103
115
  // retirement says. That pair is what asks for — absent-and-expected-to-be told
@@ -110,7 +122,8 @@ export const UNIT_INVENTORY = Object.freeze([
110
122
  // rather than the day it first runs, because a unit file no entry claims is exactly what this file
111
123
  // exists to make impossible — and a mechanism that installs itself is the easiest kind to ship
112
124
  // undeclared.
113
- unit: "clearotron-deploy", runsOn: [],
125
+ unit: "clearotron-deploy", runsOn: ["test"],
126
+ measured: "2026-09-07, test box: the timer and its service are installed under ~/.config/systemd/user/ and the service has run — see /home/testuser/deploy/autodeploy.log. The timer's ARMED state is not part of this claim; a lane may hold it, and a hold is recorded in the deploy log rather than inferred from ActiveState.",
114
127
  tracked: ["clearotron-deploy.service", "clearotron-deploy.timer"],
115
128
  note: "the install's own updater. Ships tracked, runs nowhere yet.",
116
129
  orphanReason: "SHIPPED AND PLACED ON NO BOX YET, which is a THIRD kind of orphan and not either of "
@@ -121,30 +134,6 @@ export const UNIT_INVENTORY = Object.freeze([
121
134
  + "\"not compared\" row that reads like a fault and is not one. It goes on with "
122
135
  + "`systemctl --user enable --now clearotron-deploy.timer` once bin/onboard.mjs has written both files.",
123
136
  },
124
- {
125
- unit: "prelim-driver", runsOn: ["prod", "test"],
126
- tracked: ["prelim-driver.service", "prelim-driver.path", "prelim-driver.timer"],
127
- resolved: ["prelim-driver.path"], // option B — see RESOLVED below
128
- retired: {
129
- ruled: "2026-08-26, restated 2026-08-31",
130
- filesStayUntil: "prod",
131
- why: "the path-watcher/timer drain posture is retired (tracker issue 1863): the built-in worker "
132
- + "is the product's drain, and a hosted deployment gets ONE plain service unit invoking the "
133
- + "entrypoint directly rather than a oneshot woken by a timer and a queue glob. Absence on any "
134
- + "box is now the EXPECTED direction rather than drift. The replacement is deliberately not "
135
- + "named here — a pointer outlives the file it points at, which is why `supersedes:` was "
136
- + "removed from this file once already; the pinned background list is where the current drain "
137
- + "is stated, and it is code rather than prose.",
138
- },
139
- note: "the driver itself — the one unit the drift check has always been able to compare. "
140
- + "SETTLED (tracker issue 1888, measured on the owner's fresh production install 2026-08-31): "
141
- + "the documented install creates NO units at all — not even the unit directory — and a knockout "
142
- + "delivered end to end without them, so units are the hosted-deployment OPT-IN step, never the "
143
- + "install's output. Absent on a box is the install's normal state; present means someone ran the "
144
- + "hosted step there. `runsOn` lists exactly the boxes MEASURED to carry it, which is why absence "
145
- + "anywhere else is not drift — the earlier expectation that the .path unit ships with the install "
146
- + "was the wrong half of the disagreement.",
147
- },
148
137
  {
149
138
  // ── `tracked` WAS A CLAIM ABOUT A FILE THAT HAS NEVER EXISTED (tracker issue 175) ──────────────
150
139
  //
@@ -175,7 +164,7 @@ export const UNIT_INVENTORY = Object.freeze([
175
164
  // it loaded no EnvironmentFile and so had no `${VAR}` systemd could expand. The owner's one-config-
176
165
  // per-server-box ruling gives it `EnvironmentFile=%h/.env` like every other service, which makes the
177
166
  // checkout path an ordinary systemd expansion and leaves no placeholder to render.
178
- note: "LIVE ON PRODUCTION. #685's body lists it as never run; that is true of the test box only. "
167
+ note: "LIVE ON PRODUCTION. an earlier record lists it as never run; that is true of the test box only. "
179
168
  + "Was a TEMPLATE unit carrying CF Access values inline; generic since tracker issue 1925.",
180
169
  },
181
170
  {
@@ -185,7 +174,8 @@ export const UNIT_INVENTORY = Object.freeze([
185
174
  // say "the repo ships this, nothing runs it, and here is the decision it waits on" — orphans are
186
175
  // REPORTED, never a fault, for exactly this case. It becomes `["prod"]` in the change that DEPLOYS
187
176
  // it, against a fresh enumeration, which is the ratchet working rather than being edited around.
188
- unit: "clearotron-portal", runsOn: [], tracked: ["clearotron-portal.service"],
177
+ unit: "clearotron-portal", runsOn: ["test"], tracked: ["clearotron-portal.service"],
178
+ measured: "2026-09-07, test box, `systemctl --user show` with a working user bus: ActiveState=active, UnitFileState=enabled, fragment under ~/.config/systemd/user/.",
189
179
  note: "NEW, tracker issue 1925, SHIPPED BUT NOT YET DEPLOYED. The portal had NO unit at all — it "
190
180
  + "and the MCP face are the two children bin/start.mjs supervises, and neither ran under systemd, "
191
181
  + "so a hosted deployment kept them alive with a hand launcher and `clearotron start` had nothing "
@@ -201,7 +191,8 @@ export const UNIT_INVENTORY = Object.freeze([
201
191
  {
202
192
  // Same as clearotron-portal above: shipped, running nowhere, declared as an orphan rather than
203
193
  // asserting a production state no enumeration has ever shown.
204
- unit: "clearotron-mcp-face", runsOn: [], tracked: ["clearotron-mcp-face.service"],
194
+ unit: "clearotron-mcp-face", runsOn: ["test"], tracked: ["clearotron-mcp-face.service"],
195
+ measured: "2026-09-07, test box, `systemctl --user show` with a working user bus: ActiveState=active, UnitFileState=enabled, fragment under ~/.config/systemd/user/.",
205
196
  note: "NEW, tracker issue 1925, SHIPPED BUT NOT YET DEPLOYED. The engine door the portal calls over "
206
197
  + "MCP; the other of the two processes that had no unit.",
207
198
  orphanReason: "THE ENGINE DOOR THE PORTAL CALLS, shipped with no box carrying it yet. Same kind as "
@@ -218,7 +209,7 @@ export const UNIT_INVENTORY = Object.freeze([
218
209
  // are then enabled like anything else. This one is shipped and DELIBERATELY NOT INSTALLED BY ANY
219
210
  // INSTALL PATH — `clearotron start` neither installs nor starts it, and a rebuild must not either.
220
211
  //
221
- // ── IT INSTALLS WITH THE PRODUCT SINCE 2026-09-03 (, settled point 2) ────────
212
+ // ── IT INSTALLS WITH THE PRODUCT SINCE 2026-09-03 (settled point 2) ────────
222
213
  //
223
214
  // Until then it was an orphan BY DESIGN: `clearotron connect` installed and started it on demand,
224
215
  // because starting it turned on client-account access and a unit that came up with everything else
@@ -229,7 +220,8 @@ export const UNIT_INVENTORY = Object.freeze([
229
220
  // So it is now an orphan of the FIRST kind, awaiting a box, exactly like the portal and the engine
230
221
  // door beside it: it is in SERVER_INSTALL_SET, and it leaves this list on the day a measured
231
222
  // enumeration of a box shows it running.
232
- unit: "clearotron-client-mcp", runsOn: [], tracked: ["clearotron-client-mcp.service"],
223
+ unit: "clearotron-client-mcp", runsOn: ["test"], tracked: ["clearotron-client-mcp.service"],
224
+ measured: "2026-09-07, test box, `systemctl --user show` with a working user bus: ActiveState=active, UnitFileState=enabled, fragment under ~/.config/systemd/user/.",
233
225
  note: "tracker issue 1976, and INSTALLED WITH THE PRODUCT since tracker issue 2148. The client door "
234
226
  + "— the one surface that accepts an account-scoped key, and a separate process from the engine "
235
227
  + "door, which refuses one outright.",
@@ -246,7 +238,8 @@ export const UNIT_INVENTORY = Object.freeze([
246
238
  // supervises the portal, the engine door and this worker; 1925 shipped units for the first two.
247
239
  // Written as part of retiring the path-watcher posture, because retiring `prelim-driver.*` without
248
240
  // it leaves a hosted box healthy-looking and draining nothing.
249
- unit: "clearotron-worker", runsOn: [], tracked: ["clearotron-worker.service"],
241
+ unit: "clearotron-worker", runsOn: ["test"], tracked: ["clearotron-worker.service"],
242
+ measured: "2026-09-07, test box, `systemctl --user show` with a working user bus: ActiveState=active, UnitFileState=enabled, fragment under ~/.config/systemd/user/.",
250
243
  note: "NEW, tracker issue 1863. The drain, as one plain service unit invoking the entrypoint "
251
244
  + "directly (owner ruling 2026-08-31). Ships tracked, runs nowhere yet — production takes it at "
252
245
  + "its rebuild, which is the same event that lets the retired units' files leave the tree.",
@@ -256,21 +249,8 @@ export const UNIT_INVENTORY = Object.freeze([
256
249
  + "alternatives, and running both puts a second claimant on one queue.",
257
250
  },
258
251
  {
259
- unit: "prelim-outbox", runsOn: ["prod"],
260
- tracked: ["prelim-outbox.service", "prelim-outbox.path", "prelim-outbox.timer"],
261
- retired: {
262
- ruled: "2026-08-31",
263
- filesStayUntil: "prod",
264
- why: "the timer retires with the watcher it backstopped, by name in the ruling. That watcher also "
265
- + "carried the last dead OpenClaw literal in the tree. Channel delivery is the "
266
- + "integrator's (INSTALL.md §9), so retiring these takes away nothing the product promises — "
267
- + "the worked example moves into the document rather than being deleted with them.",
268
- },
269
- note: "LIVE ON PRODUCTION (path and timer active-waiting). Was absent from the health check's unit "
270
- + "list, so its drift was never checked despite being tracked.",
271
- },
272
- {
273
- unit: "trademark-portal", runsOn: ["prod", "test"], tracked: null,
252
+ unit: "trademark-portal", runsOn: ["prod"],
253
+ measured: "2026-09-07, test box: LoadState=not-found. No unit of this name exists there. The `test` claim was inherited from before the rename to clearotron-* and was never remeasured; the `prod` claim is left alone because production was NOT measured here.", tracked: null,
274
254
  untrackedReason: "the deployed copy carries real Cloudflare Access team/AUD/domain values inline. "
275
255
  + "A tracked file would be the placeholder TEMPLATE, merged by hand after a "
276
256
  + "diff — writing one carelessly replaces working auth with placeholders that look configured.",
@@ -281,11 +261,13 @@ export const UNIT_INVENTORY = Object.freeze([
281
261
  supersededName: "portal-service.service (deleted, owner-ruled 2026-08-14)",
282
262
  },
283
263
  {
284
- unit: "trademark-ops-mcp", runsOn: ["prod", "test"], tracked: null,
264
+ unit: "trademark-ops-mcp", runsOn: ["prod"],
265
+ measured: "2026-09-07, test box: LoadState=not-found. No unit of this name exists there. The `test` claim was inherited from before the rename to clearotron-* and was never remeasured; the `prod` claim is left alone because production was NOT measured here.", tracked: null,
285
266
  untrackedReason: "same CF Access inline-values shape as the portal it serves.",
286
267
  },
287
268
  {
288
- unit: "client-mcp", runsOn: ["prod", "test"], tracked: ["client-mcp.service"],
269
+ unit: "client-mcp", runsOn: ["prod"],
270
+ measured: "2026-09-07, test box: LoadState=not-found. No unit of this name exists there. The `test` claim was inherited from before the rename to clearotron-* and was never remeasured; the `prod` claim is left alone because production was NOT measured here.", tracked: ["client-mcp.service"],
289
271
  note: "TRACKED, in mcp-server/remote/ — this entry said it had no file, and the file was there. It is "
290
272
  + "a banner-marked TEMPLATE, so the live copy differing from it is the arrangement, not drift. "
291
273
  + "#1147 ADDED THE TEST BOX (2026-08-18): the client surface ran nowhere but production, so the test "
@@ -415,13 +397,21 @@ export const UNIT_INVENTORY = Object.freeze([
415
397
  + "checkout's bridge, not this clone's.",
416
398
  },
417
399
  {
418
- unit: "trademark-test-deploy", runsOn: ["test"], tracked: null,
400
+ unit: "trademark-test-deploy", runsOn: [],
401
+ measured: "2026-09-07, test box: LoadState=not-found. The hourly deploy runs as clearotron-deploy.timer, which has its own entry; this name is what that one used to be called.", tracked: null,
402
+ // AN EMPTY runsOn OWES A REASON, and this one is a supersession rather than an orphan: the hourly
403
+ // deploy still runs on the test box, under the name `clearotron-deploy`, which has its own entry and
404
+ // its own measurement. This name is what that unit used to be called. It is kept rather than deleted
405
+ // because the unit FILE is still tracked and an inventory of what ships should account for every
406
+ // tracked file — deleting the entry would make the file unaccounted for, which is the ratchet this
407
+ // file exists to keep shut.
408
+ orphanReason: "SUPERSEDED, NOT RETIRED — the hourly deploy of the test instance runs as `clearotron-deploy`, measured active there on 2026-09-07. This entry is the pre-rename name for the same job, so it runs on no box under THIS name and the boxes moved to the entry that replaced it. The tracked file stays until production is rebuilt, which is the same disposition the other retired units carry.",
419
409
  untrackedReason: "the hourly --ff-only deploy of the TEST instance. It exists on the test box only "
420
410
  + "and by design: production never auto-deploys, so a tracked file shipped to both would be a unit "
421
411
  + "production must be trusted never to enable.",
422
412
  },
423
413
  // register-ledger-prune is DELIBERATELY not listed, and the sequence is worth keeping because the
424
- // row was right until the moment it was wrong. 's nightly rotation was retired in code by:
414
+ // row was right until the moment it was wrong. That nightly rotation was retired in code by:
425
415
  // bin/register-ledger-prune.mjs is deleted, record bodies now live in each run's own directory and
426
416
  // are purged with the run, so there is no global file left to rotate. The row stayed here on
427
417
  // purpose while the TIMER was still installed on the test box — dropping it first would have made
@@ -489,6 +479,11 @@ export const ACCOUNTED_FILES = Object.freeze(
489
479
  */
490
480
  export function unitInventoryVerdict({
491
481
  live = [], files = [], collisions = [], filesError = null, box = null, probe = { ok: true },
482
+ // INJECTED so the retirement branch can be PLANTED. `retired:` has no members today — the two it
483
+ // carried left with their files — so `absentByRetirement` and the line it feeds are unreachable
484
+ // against the real table, and a branch nothing exercises is a branch that will not fire the next
485
+ // time somebody retires a unit. That is this file's own failure mode pointed at itself.
486
+ inventory = UNIT_INVENTORY,
492
487
  } = {}) {
493
488
  if (!probe.ok) {
494
489
  return { state: "skip", undeclared: [], orphaned: [], absent: [], misdeclared: [],
@@ -496,7 +491,7 @@ export function unitInventoryVerdict({
496
491
  + "A failure to look is not a finding about the deployment." };
497
492
  }
498
493
  const base = (u) => String(u).replace(/\.(service|timer|path|socket|target|mount|slice)$/, "");
499
- const known = new Set(UNIT_INVENTORY.map((u) => u.unit));
494
+ const known = new Set(inventory.map((u) => u.unit));
500
495
  const liveBases = [...new Set(live.map(base))];
501
496
 
502
497
  const undeclared = liveBases.filter((u) => !known.has(u)).sort();
@@ -506,7 +501,20 @@ export function unitInventoryVerdict({
506
501
  // reason attached, and the difference is the whole point of writing the reasons down.
507
502
  const accounted = new Set(ACCOUNTED_FILES);
508
503
  const unaccountedFiles = files.filter((f) => !accounted.has(f)).sort();
509
- const orphaned = UNIT_INVENTORY.filter((u) => u.runsOn.length === 0).map((u) => u.unit).sort();
504
+ const orphaned = inventory.filter((u) => u.runsOn.length === 0).map((u) => u.unit).sort();
505
+
506
+ // RUNNING HERE, DECLARED TO RUN NOWHERE. The defect the rename to clearotron-* left behind: the new
507
+ // units shipped WITH entries, those entries kept `runsOn: []`, and the pre-rename names kept the
508
+ // boxes. Every arm scoped to CHECKED_UNITS — which filters on a NON-EMPTY runsOn — therefore asked
509
+ // systemd about sixteen names that mostly named nothing and reported "0 active; 16 at rest", while
510
+ // four services ran under names no entry claimed. Measured on the test box 2026-09-07.
511
+ //
512
+ // This needs NO knowledge of which box it is running on, which is what makes it the right shape: an
513
+ // entry saying a unit runs on no box is contradicted by that unit running HERE, wherever here is.
514
+ // The mirror — declared for a box and absent from it — cannot be judged without a box identity this
515
+ // tree does not carry, and is reported as information rather than as a verdict.
516
+ const orphanSet = new Set(orphaned);
517
+ const runningButDeclaredNowhere = liveBases.filter((u) => orphanSet.has(u)).sort();
510
518
 
511
519
  // THE RATCHET THAT MAKES THIS FILE'S OWN DEFECT UNREPRESENTABLE. An entry with no tracked file states
512
520
  // a fact about the tree, and until the lookup went repo-wide it was a fact nothing could check —
@@ -514,7 +522,7 @@ export function unitInventoryVerdict({
514
522
  // is why writing one is dangerous" while the tracked file sat one directory over. A reader asking what
515
523
  // configuration the client door runs was told, with confidence, to look at nothing.
516
524
  const trackedNames = new Set(files);
517
- const misdeclared = UNIT_INVENTORY
525
+ const misdeclared = inventory
518
526
  .filter((u) => !u.tracked)
519
527
  .filter((u) => ["service", "timer", "path"].some((s) => trackedNames.has(`${u.unit}.${s}`)))
520
528
  .map((u) => u.unit).sort();
@@ -529,7 +537,7 @@ export function unitInventoryVerdict({
529
537
  // It matters now because the retirement above deletes unit files on a schedule set by production's
530
538
  // rebuild rather than by this PR, so entry and tree are deliberately going to disagree for a while,
531
539
  // and the disagreement must be the kind that gets reported rather than the kind that is invisible.
532
- const claimedAbsent = files.length === 0 || filesError ? [] : UNIT_INVENTORY
540
+ const claimedAbsent = files.length === 0 || filesError ? [] : inventory
533
541
  .flatMap((u) => (u.tracked ?? []).map((f) => ({ unit: u.unit, file: f })))
534
542
  .filter((c) => !trackedNames.has(c.file))
535
543
  .map((c) => `${c.file} (claimed by ${c.unit})`).sort();
@@ -538,16 +546,16 @@ export function unitInventoryVerdict({
538
546
  // reporting every production unit missing on a dev box is a false alarm, and it would train a reader
539
547
  // to skim this check. But an arm that did not run is not an arm that passed — this file's whole
540
548
  // thesis — so an unnameable box is STATED rather than silently skipped.
541
- // ABSENT-AND-EXPECTED-TO-BE vs ABSENT-AND-SHOULD-NOT-BE (, criterion 3). A retired
549
+ // ABSENT-AND-EXPECTED-TO-BE vs ABSENT-AND-SHOULD-NOT-BE (criterion 3). A retired
542
550
  // unit that is gone from a box is the ruling taking effect, not drift; reporting it as a fault trains
543
551
  // a reader to skim the arm that would have caught a real one. Both are still REPORTED — the
544
552
  // distinction is which of them is a fault.
545
553
  const declaredHere = (u) => box && u.runsOn.includes(box) && !liveBases.includes(u.unit);
546
554
  const absent = box
547
- ? UNIT_INVENTORY.filter((u) => declaredHere(u) && !u.retired).map((u) => u.unit).sort()
555
+ ? inventory.filter((u) => declaredHere(u) && !u.retired).map((u) => u.unit).sort()
548
556
  : [];
549
557
  const absentByRetirement = box
550
- ? UNIT_INVENTORY.filter((u) => declaredHere(u) && u.retired).map((u) => u.unit).sort()
558
+ ? inventory.filter((u) => declaredHere(u) && u.retired).map((u) => u.unit).sort()
551
559
  : [];
552
560
  const boxLine = box ? "" : " The box could not be named, so 'declared here and not running' was NOT "
553
561
  + "checked — that half did not run, which is not the same as passing.";
@@ -572,6 +580,11 @@ export function unitInventoryVerdict({
572
580
  + "A unit nothing declares is compared against nothing and reported by nothing — add it to "
573
581
  + "driver/unit-inventory.mjs, tracked or with the reason it is not.");
574
582
  }
583
+ if (runningButDeclaredNowhere.length) {
584
+ faults.push(`${runningButDeclaredNowhere.join(", ")} — ${runningButDeclaredNowhere.length} unit(s) are `
585
+ + `RUNNING on this box while their inventory entry declares runsOn: [], so every check scoped to `
586
+ + `the declared list is judging a population that excludes them`);
587
+ }
575
588
  if (misdeclared.length) {
576
589
  faults.push(`${misdeclared.length} entr(y/ies) claim NO tracked file while a unit file of that name is `
577
590
  + `in the tree: ${misdeclared.join(", ")}. The entry is not merely incomplete, it is false — and a `
@@ -618,8 +631,8 @@ export function unitInventoryVerdict({
618
631
  return {
619
632
  state: "pass", undeclared, orphaned, absent, misdeclared, claimedAbsent, absentByRetirement,
620
633
  message: `${liveBases.length} live unit(s), all declared; `
621
- + `${UNIT_INVENTORY.filter((u) => u.tracked).length} entr(y/ies) tracked, `
622
- + `${UNIT_INVENTORY.filter((u) => u.runsOn.length && !u.tracked).length} live-and-untracked BY DECLARATION `
634
+ + `${inventory.filter((u) => u.tracked).length} entr(y/ies) tracked, `
635
+ + `${inventory.filter((u) => u.runsOn.length && !u.tracked).length} live-and-untracked BY DECLARATION `
623
636
  + `with a stated reason.${retiredLine}${orphanLine}${boxLine}${filesLine}`,
624
637
  };
625
638
  }
@@ -641,6 +654,53 @@ export function unitInventoryVerdict({
641
654
  * @param {string|null} raw the value `systemctl show -p WorkingDirectory` printed
642
655
  * @returns {{path: string|null, prefixes: string, why: string|null}}
643
656
  */
657
+ /**
658
+ * Which checkout is a unit actually serving — and which piece of evidence said so.
659
+ *
660
+ * A unit can be attributed two ways and they are not equally good.
661
+ *
662
+ * `WorkingDirectory` is a DECLARATION. It is what the unit file asks for, and it is frequently not a
663
+ * checkout at all: a unit written as `WorkingDirectory=~` reports `!/home/<user>`, which resolves to a
664
+ * home directory that is not a git tree, and the unit then drops out of the comparison entirely. That is
665
+ * not a rare shape — it is what a unit looks like when its author put the checkout in `ExecStart=`
666
+ * instead, which is the normal thing to do, because systemd cannot expand a variable in
667
+ * `WorkingDirectory=` and can in `ExecStart=`.
668
+ *
669
+ * The RUNNING COMMAND LINE is an OBSERVATION: the absolute path the live process was actually started
670
+ * with. So it wins, and that order is the point rather than a preference. The incident this comparison
671
+ * exists for is a deployment that served its portal from one clone while running its runner from
672
+ * another — and in that state the declaration and the process disagree, with the process telling the
673
+ * truth. Preferring the declaration would take the wrong side of exactly the case the check is for.
674
+ *
675
+ * WHEN BOTH RESOLVE AND DISAGREE, that IS the finding, and it is returned rather than quietly resolved:
676
+ * a unit whose declared tree and running tree differ has been repointed since it started, and it is
677
+ * serving the older one until something restarts it.
678
+ *
679
+ * PURE — the caller does the reading (systemd, the unit file, the process table) and this decides.
680
+ *
681
+ * @param {object} a
682
+ * @param {string|null} a.declaredTree a git tree resolved from `WorkingDirectory`, or null
683
+ * @param {string|null} a.runningTree a git tree resolved from the live process's argv, or null
684
+ * @param {string|null} a.declaredWhy why the declaration gave nothing, if it gave nothing
685
+ * @param {string|null} a.runningWhy why the process gave nothing, if it gave nothing
686
+ * @returns {{clone: string|null, source: string|null, disagreement: string|null, why: string|null}}
687
+ */
688
+ export function unitClone({ declaredTree = null, runningTree = null, declaredWhy = null, runningWhy = null } = {}) {
689
+ const norm = (p) => String(p ?? "").replace(/\/+$/, "") || null;
690
+ const declared = norm(declaredTree);
691
+ const running = norm(runningTree);
692
+ const disagreement = declared && running && declared !== running
693
+ ? `the unit declares ${declared} and its running process was started from ${running} — it is serving the second until something restarts it`
694
+ : null;
695
+ if (running) return { clone: running, source: "the running command line", disagreement, why: null };
696
+ if (declared) return { clone: declared, source: "WorkingDirectory", disagreement, why: null };
697
+ // BOTH REASONS, never the first one that came to hand. A caller that reports only "no WorkingDirectory"
698
+ // sends the next reader to fix a unit file when the process table was the half that could not be read.
699
+ const parts = [declaredWhy, runningWhy].filter(Boolean);
700
+ return { clone: null, source: null, disagreement: null,
701
+ why: parts.length ? parts.join("; and ") : "neither the unit's WorkingDirectory nor its running command line named a checkout" };
702
+ }
703
+
644
704
  export function unitWorkingDirectory(raw) {
645
705
  const s = String(raw ?? "").trim();
646
706
  if (!s) return { path: null, prefixes: "", why: "the unit reported no WorkingDirectory" };
@@ -14,9 +14,9 @@
14
14
  //
15
15
  // Anything that is neither `active` nor `inactive` is a fault. `prelim-driver` is a `Type=oneshot` fired
16
16
  // by a 90-second timer, so EVERY drain passes through `activating` — and `activating` landed in that
17
- // list. The filter tolerated the oneshot at rest and failed it for working. deploy-test.sh gates the
18
- // hourly test-instance deploy on this script's exit code, so a deploy that happened to land inside a
19
- // drain window reported the instance unhealthy and exited 1 on a deployment that was fine.
17
+ // list. The filter tolerated the oneshot at rest and failed it for working. The hourly test-instance
18
+ // deploy gates on this script's exit code, so a deploy that happened to land inside a drain window
19
+ // reported the instance unhealthy and exited 1 on a deployment that was fine.
20
20
  //
21
21
  // The bug is not the enumeration — was right to give this three outcomes instead of two. The bug is
22
22
  // INVERSE ENUMERATION over an incomplete vocabulary: listing the two states you have seen and calling
@@ -39,7 +39,7 @@
39
39
  // The ruling on says "starting and stopping are both tolerated for a one-shot". That is descriptive
40
40
  // of the case that was observed, not a restriction: the issue's own Scope section carries no unit-type
41
41
  // qualifier, the arm has never been unit-type-aware, and it already tolerates `inactive` for everything.
42
- // It is also the wrong place to draw the line — deploy-test.sh RESTARTS the long-running services
42
+ // It is also the wrong place to draw the line — the hourly deploy RESTARTS the long-running services
43
43
  // immediately before running this check, so `trademark-portal=activating` is the same race with a
44
44
  // different unit, and a oneshot-only fix would leave it standing. The unit's Type is still carried into
45
45
  // the message so a reader can tell a oneshot mid-fire from a service mid-restart.
@@ -56,16 +56,16 @@
56
56
  //
57
57
  // ── what this module deliberately does NOT touch: the zero-check ────────────────────────────────
58
58
  //
59
- // 's Scope is one paragraph and it names one thing — the state vocabulary. So the FAULT branch is
60
- // the only branch whose behaviour changes. 's separate guard, "0 active is not a pass", keeps
59
+ // That Scope is one paragraph and it names one thing — the state vocabulary. So the FAULT branch is
60
+ // the only branch whose behaviour changes. That separate guard, "0 active is not a pass", keeps
61
61
  // origin/main's predicate (`ActiveState === "active"`, literally) and origin/main's message.
62
62
  //
63
63
  // This is not caution for its own sake. An earlier draft of this fix also widened the count to treat
64
64
  // transitional units as up, on the reasoning that a oneshot mid-fire is "not nothing". The consequence:
65
65
  // {5 services activating, 3 inactive} returned `pass` with a message that began "0 active" — a green
66
- // tick on the deploy's final gate having confirmed that ZERO services were running. deploy-test.sh
66
+ // tick on the deploy's final gate having confirmed that ZERO services were running. The hourly deploy
67
67
  // restarts the long-running services immediately before running this check, so that is the ordinary
68
- // shape of the box, not a corner. Widening a count to make a message read better is how a guard dies.
68
+ // shape of the instance, not a corner. Widening a count to make a message read better is how a guard dies.
69
69
 
70
70
  /** The six documented ActiveState values of systemd 255, mapped to what the check must do about them. */
71
71
  export const ACTIVE_STATE_MEANING = Object.freeze({
@@ -134,19 +134,27 @@ export function unitsActiveVerdict({ units, probe }) {
134
134
  // CHANGES NOTHING HERE. The count below is origin/main's, predicate and message unchanged:
135
135
  // `active`, literally, and nothing else. An earlier draft of this fix widened it to count
136
136
  // transitional units as up, which defeated this guard outright — {5 activating, 3 inactive} then
137
- // returned `pass` with a message that began "0 active", on the deploy's FINAL gate, on a box where
138
- // deploy-test.sh has just restarted every long-running service. 's Scope names one thing, the
137
+ // returned `pass` with a message that began "0 active", on the deploy's FINAL gate, on an instance
138
+ // where the hourly deploy has just restarted every long-running service. Scope names one thing, the
139
139
  // state vocabulary of the FAULT branch above. Transitional units are named in the messages here so
140
140
  // they are never swallowed; they are counted as up nowhere.
141
+ // A unit this inventory declares can be absent from THIS box for a legitimate reason: the inventory
142
+ // spans prod and test, so on the test box every prod-only entry reports `LoadState=not-found`. So the
143
+ // count is INFORMATION in the message and never a verdict of its own — a warn here would fire on every
144
+ // run of the test box and be ignored by the second week. The finding that matters is the mirror of it
145
+ // and lives in unitInventoryVerdict: a unit RUNNING here whose entry claims it runs on no box.
146
+ const absentHere = (units ?? []).filter((u) => u.load === "not-found").length;
147
+ const notHere = absentHere ? `; ${absentHere} declared unit(s) do not exist on this box` : "";
148
+
141
149
  const activeCount = (units ?? []).filter((u) => u.active === "active").length;
142
150
  const alsoSeen = (by.transitional.length ? `; ${by.transitional.length} starting or stopping — ${by.transitional.map(label).join(", ")}` : "")
143
151
  + (by["at-rest"].length ? `; ${by["at-rest"].length} at rest` : "");
144
152
 
145
153
  if (activeCount === 0)
146
154
  return { state: "skip", message: "systemd --user answered and reported 0 active units — nothing was probed, "
147
- + `which is not the same as nothing being wrong${alsoSeen}` };
155
+ + `which is not the same as nothing being wrong${alsoSeen}${notHere}` };
148
156
 
149
- return { state: "pass", message: `${activeCount} active`
157
+ return { state: "pass", message: `${activeCount} active${notHere}`
150
158
  + (by.transitional.length ? `; ${by.transitional.length} starting or stopping — ${by.transitional.map(label).join(", ")}, which is a unit doing its job, not a fault` : "")
151
159
  + (by["at-rest"].length ? `; ${by["at-rest"].length} at rest` : "") };
152
160
  }
@@ -442,7 +442,7 @@ export const validators = {
442
442
  // — the register reads and the per-finding weighed lists, both joined to the store.
443
443
  if (m.registerReads !== undefined && m.registerReads !== null) {
444
444
  if (!Array.isArray(m.registerReads))
445
- return { ok: false, reason: `mark "${m.name}": registerReads must be an ARRAY of { recordId, read } rows, or omitted entirely` };
445
+ return { ok: false, reason: `mark "${m.name}": registerReads must be an ARRAY of { recordId, read, band? } rows, or omitted entirely` };
446
446
  const held = registerRecordIdsFor(runDir, m.name);
447
447
  for (const row of m.registerReads) {
448
448
  const id = String(row?.recordId ?? "").trim();
@@ -451,6 +451,14 @@ export const validators = {
451
451
  if (!read) return { ok: false, reason: `mark "${m.name}": registerReads row "${id}" has an empty read. Omit the row rather than sending an empty one: a filing with no read keeps the card's neutral line, which is true` };
452
452
  if (!held.has(id))
453
453
  return { ok: false, reason: `mark "${m.name}": registerReads cites "${id}", which is not a record this run holds for that mark. The id must be copied from the filings you were handed — the driver joins it against the store and never takes your word for it` };
454
+ // The band is OPTIONAL and, when present, is the same closed vocabulary the mark's own rating
455
+ // uses — the card prints it as this filing's rating, so a word outside the frozen ladder would
456
+ // put a chip on the page in a dialect the framework does not define. Absence stays free: a read
457
+ // with no band prints the read and no chip, which is what every run before this one produced.
458
+ if (row?.band != null && String(row.band).trim()) {
459
+ if (ladder.length && bandIdx(ladder, row.band) < 0)
460
+ return { ok: false, reason: `knockout_band_unknown:${m.name}: registerReads row "${id}" carries band "${row.band}", which is not in the frozen ladder (${ladder.join(" / ")}) — rate the filing in the framework's own vocabulary, or omit the band and let the read stand alone` };
461
+ }
454
462
  }
455
463
  }
456
464
  for (const f of (Array.isArray(m.findings) ? m.findings : [])) {
@@ -490,7 +498,7 @@ export const validators = {
490
498
  // THE TYPED RECORD. findings-model.mjs owns the shape; this is where it becomes a GATE.
491
499
  // Unconditional — no shape sniffing: this validator only ever reads a chunk THIS run's assess turn
492
500
  // just wrote, so a "looks like the old shape, validate it loosely" arm could only ever be a way to
493
- // skip the check. A resumed run holding a pre- chunk file fails here and re-asks the turn
501
+ // skip the check. A resumed run holding a pre-change chunk file fails here and re-asks the turn
494
502
  // (pipeline-knockout.mjs koStage logs stage-stale and re-runs), which is the correct outcome: the
495
503
  // report renders `net`/`basis`/`evidence[]` and a prose row cannot fill them.
496
504
  //
package/driver/verify.mjs CHANGED
@@ -146,7 +146,7 @@ function nonEmpty(content, min = MIN) {
146
146
  * The obvious fix — emit the failing marker INSTEAD of the label — silently breaks the corrective hints.
147
147
  * `correctionHint` branches on the label text (`gateway.mjs:2181` on `findings+ledger`, `:2188` on
148
148
  * `negative-results|coverage-ledger|audit-trail|findings-heading`), so a renamed token would fall through
149
- * to a generic hint. 's comment records that arm being removed once already on a reading that was
149
+ * to a generic hint. That comment records that arm being removed once already on a reading that was
150
150
  * true for only one lane, and put back. Appending keeps every existing matcher matching — they all test
151
151
  * substrings — and gives the seat the one word it was missing.
152
152
  *
@@ -289,7 +289,7 @@ const COMMONLAW_UNAVAILABLE_RE = /(perplexity|marketplace research|common.?law (
289
289
  // Deliberately NOT done: loosening the honesty vocabulary. The prose is correct and stays.
290
290
  //
291
291
  // Driver-bug tokens are never masked. `half_path_unrecognized` says the DRIVER called this validator
292
- // with a path it does not own; "write NO findings file" is the wrong remedy for that, and pre- the
292
+ // with a path it does not own; "write NO findings file" is the wrong remedy for that, and pre-change the
293
293
  // path guard returned before the regex was ever reached. Keep it that way.
294
294
  const VETO_NEVER_MASKS = new Set(["half_path_unrecognized"]);
295
295
 
@@ -651,7 +651,7 @@ export function parseVerdict(content) {
651
651
  * `UPSTREAM_STALE_REPAIR["narrative-refutation"]` re-runs the reviewer at DELIVERY time, long after the
652
652
  * verdict gate. Its caller re-reads what the repaired stage wrote — findings.json, the case-law layer —
653
653
  * but not `senior-eye-review.md`, which is the one artifact that stage authors. So the reviewer could
654
- * refuse to sign at 00:52 and the run would deliver on the verdict it settled at 00:22 (,
654
+ * refuse to sign at 00:52 and the run would deliver on the verdict it settled at 00:22 (
655
655
  * `bf21580e`, 2026-08-23: a registration date contradicting the fetched record reached the client).
656
656
  *
657
657
  * ONE DIRECTION ONLY, and that is deliberate. This returns the file's verdict when it is STRICTER than
@@ -683,7 +683,7 @@ export function verdictHardenedTo(carried, reviewMd) {
683
683
  // The two guards must not share a POLICY and they still do not: what separates them is which sections
684
684
  // they read, and whether a bullet under a flag is that flag's body. Whether a line is a list item at
685
685
  // all is NOT policy — and while each walk carried its own copy of that answer, the copies drifted.
686
- // taught one of them to see `**1.` and left the other on the pre- pattern, so the walk whose
686
+ // taught one of them to see `**1.` and left the other on the pre-change pattern, so the walk whose
687
687
  // job is to decide whether to DISCARD a review quietly became the stricter of the two.
688
688
  //
689
689
  // Restating the marker in a second place is what made that possible, so it is stated once here. Both
@@ -692,7 +692,7 @@ export function verdictHardenedTo(carried, reviewMd) {
692
692
  // The trailing `\*{0,2}` is the bold CLOSER: reviewers write both `**1. [kind: …]** text` (bold around
693
693
  // the marker and its tokens) and `**1.** text` (bold around the marker alone). The second counted ZERO
694
694
  // on both walks — consistently, so it is not the asymmetry above, but it is the same defect wearing a
695
- // different style, and 's criterion says a bold-numbered flag must count. It cannot swallow prose:
695
+ // different style, and the criterion says a bold-numbered flag must count. It cannot swallow prose:
696
696
  // a single letter or digit must still be followed by its own `.` or `)`, so `**Note.** …` matches nothing.
697
697
  const LIST_MARKER = String.raw`(?:\*{0,2})(?:[-*•]|\d+[.)]|[A-Za-z][.)])(?:\*{0,2})\s+`;
698
698
  const LIST_LINE_RE = new RegExp(`^${LIST_MARKER}\\S`);
@@ -819,7 +819,7 @@ function parseOn(line) {
819
819
  // deferrals`, `Headline, re-derived independently`, `Grounded profiles` and the plan audit.
820
820
  //
821
821
  // THE HEADLESS FALLBACK IS DELIBERATE AND IT IS NOT A DENYLIST IN DISGUISE. A review with NO corrections
822
- // heading anywhere still has corrections — 's fixture is exactly that, and 's writes them under
822
+ // heading anywhere still has corrections — the fixture is exactly that, and the writes them under
823
823
  // `## Corrections`. So: if the document names a corrections section, ONLY that section is read; if it
824
824
  // names none, the whole document is read as before. The fallback cannot reopen this defect, because it
825
825
  // only applies to documents that have no section structure to get wrong.
@@ -840,7 +840,7 @@ export const NOT_A_CORRECTIONS_SECTION_RE =
840
840
  //
841
841
  // THE FAILURE IS SILENT IN THE WORST DIRECTION. An unreadable flag does not error — it is simply not
842
842
  // there, and every downstream count agrees with itself about a document it never read. Both directions
843
- // of 's lesson apply at the LINE level too: too permissive publishes noise as grounds, too strict
843
+ // of the lesson apply at the LINE level too: too permissive publishes noise as grounds, too strict
844
844
  // drops the grounds entirely.
845
845
  //
846
846
  // SCOPE OF THE WIDENING, MEASURED RATHER THAN ASSUMED. Across the 28 distinct reviews on both scratch
@@ -874,7 +874,7 @@ export const opensWithKind = (content) => /^\[kind:/i.test(String(content ?? "")
874
874
  * matched and the whole document was skipped". The allowlist fails closed on purpose, and a guard that
875
875
  * fails closed silently is how a real defect reads as a clean run.
876
876
  *
877
- * `named: false` is not a fault — it is the headless document 's fixture is built from, and the walk
877
+ * `named: false` is not a fault — it is the headless document the fixture is built from, and the walk
878
878
  * falls back to the whole document. It is reported so a caller can tell the two apart.
879
879
  *
880
880
  * PURE.
@@ -918,7 +918,7 @@ export function parseCorrections(reviewMd) {
918
918
  // underneath as `- "…"` bullets. Those are evidence FOR a correction, not five more corrections,
919
919
  // and counting them is how five quoted excerpts became five of the published grounds of a BLOCKING
920
920
  // verdict. A review that writes its flags as BULLETS never trips this — no numbered flag is ever
921
- // seen, so every bullet stays a flag, which is 's contract and 's fail-safe both intact.
921
+ // seen, so every bullet stays a flag, which is the contract and the fail-safe both intact.
922
922
  // ORDER MATTERS: ask "is this enumerated" FIRST. `**2. [kind: …]` begins with an asterisk, so a
923
923
  // bullet test run before the enumerated test swallows every flag after the first as the first
924
924
  // one's body.
@@ -1023,7 +1023,7 @@ export function findReviewerCoherenceFlags(md) {
1023
1023
  // divergent arms of one requirement. They are three different contracts:
1024
1024
  // · commonLawStructural (LIVE) — the common-law findings' prose Coverage ledger still carries these
1025
1025
  // tokens, and this floor still polices it.
1026
- // · registerFindings' UNSTAMPED arm (ARCHIVE-ONLY since M6) — judges pre- archived replays
1026
+ // · registerFindings' UNSTAMPED arm (ARCHIVE-ONLY since M6) — judges pre-change archived replays
1027
1027
  // whose seats hand-wrote the prose table. No live run reaches it; replay verdicts get quoted, so
1028
1028
  // it stays.
1029
1029
  // · register-digest's LIVE path carries the same three tokens as VALUES through the
@@ -1957,7 +1957,7 @@ export const validators = {
1957
1957
  // So the old floor and the new gate are armed by the SAME condition, and it is this one:
1958
1958
  // stamped ⇒ the driver wrote a form, the seat was told not to write a table, and the form is the
1959
1959
  // whole coverage judgement (below).
1960
- // unstamped ⇒ every pre- check applies unchanged, and stages.mjs — reading THIS SAME STAMP —
1960
+ // unstamped ⇒ every pre-change check applies unchanged, and stages.mjs — reading THIS SAME STAMP —
1961
1961
  // tells the seat to write the prose table. The two cannot disagree about which
1962
1962
  // document the run owes.
1963
1963
  //
@@ -1967,7 +1967,7 @@ export const validators = {
1967
1967
  // digest and before it — so NO LIVE RUN reaches here unstamped, and stages.mjs no longer has a
1968
1968
  // second arm to tell a seat to write the prose table. The prose floor below, and the prose-era
1969
1969
  // joins it feeds (findUnaccountedDeferredSlices, findUnverifiedIncompleteCleanClaims), are
1970
- // therefore DEAD FOR LIVE RUNS and LOAD-BEARING FOR REPLAY: an archived pre- run carries no
1970
+ // therefore DEAD FOR LIVE RUNS and LOAD-BEARING FOR REPLAY: an archived pre-change run carries no
1971
1971
  // stamp at all, and its coverage verdict is judged by exactly this arm.
1972
1972
  //
1973
1973
  // DO NOT DELETE THEM AS DEAD CODE. Removing them does not change any live run's answer; it changes