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
@@ -10,7 +10,7 @@
10
10
  import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync } from 'node:fs';
11
11
  import { join } from 'node:path';
12
12
  import { driverDir, ensureDriverDir } from '../../shared/driver-dir.mjs'; //
13
- import { riskTier, TONE_TIER, regenIndex, regenSurfaces, auditRouteFor, markReportRouteFor } from './index.mjs';
13
+ import { riskTier, TONE_TIER, regenIndex, regenSurfaces, auditRouteFor, markReportRouteFor, reportRouteFor } from './index.mjs';
14
14
  import { runKnockoutLint, deliveryFlagLines } from '../predelivery-lint.mjs';
15
15
  import { note } from '../log.mjs';
16
16
  import { addSheet } from './xlsx.mjs';
@@ -68,9 +68,13 @@ export const knockoutStatement = (framework, marks) =>
68
68
  // 11pt, no <!DOCTYPE>, no <head>, no <meta charset> — and they rendered a Depth 2 report as a grey
69
69
  // spreadsheet with the register hit-counts the customer paid for buried in a table cell. The report now
70
70
  // renders through publish/render-knockout.mjs in the product's own design language, off the same shared
71
- // stylesheet and brand tokens as the clearance report. Internal working material (the purple staff notes,
72
- // the model's registerEstimate) is not stripped from the report — it is not IN the report; it lives in
73
- // the audit workbook, which is what an internal artifact is for.
71
+ // stylesheet and brand tokens as the clearance report.
72
+ //
73
+ // THE REVIEWER'S NOTES ARE ON THE REPORT SINCE 2026-09-07 (owner ruling, tracker issue 274). This
74
+ // paragraph used to end "internal working material (the purple staff notes, the model's registerEstimate)
75
+ // is not IN the report; it lives in the audit workbook". That is now true of `registerEstimate` only: the
76
+ // notes render on the page, labelled, and the workbook keeps its copy. See render-knockout.mjs's header
77
+ // for the ruling and reviewerNotesBlock for the shape.
74
78
 
75
79
  // ── The workbook: the skill's three sheet names + columns, plus the conditional sheets below ────────
76
80
  // ── ONE DRILL-THROUGH KEY: `<MARK> #<ordinal>`, per mark ──────────────────────────────────────
@@ -250,9 +254,11 @@ export async function buildKnockoutWorkbook(findings, receipts, outPath, registe
250
254
  // ── The email: a COVER NOTE. Headline band, one line per mark, the report link. Nothing else. ────────
251
255
  // The report is the deliverable and the email points at it — the same doctrine the clearance lane
252
256
  // follows. The old `delivery.email === 'table'` overlay inlined the full review table into the mail
253
- // body, and it inlined the INTERNAL variant: purple staff notes and the model's register estimate went
254
- // out over the wire to whoever the mail reached. A second rendering of the findings in a second dialect
255
- // is also a second thing to keep true. Per-lawyer client formatting is drafted by the assistant from the
257
+ // body, which put the findings in front of whoever the mail reached rather than whoever opened the
258
+ // report, and made a second rendering of them in a second dialect a second thing to keep true.
259
+ // (That overlay's other charge, that it shipped an INTERNAL variant, no longer describes anything: the
260
+ // 2026-09-07 ruling put the reviewer's notes on the one report. The reason above is the load-bearing one
261
+ // and it is unaffected — the mail stays a cover note.) Per-lawyer client formatting is drafted by the assistant from the
256
262
  // run's report-data.json, not by a template knob in here.
257
263
  // `reports` is publishKnockout's own list — `[{mark, url}]`, one per published document — and
258
264
  // `auditUrl` is composed by the publisher from the pool URL it already holds. Neither is derived here.
@@ -358,6 +364,12 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
358
364
  let registerRecords = null;
359
365
  try { registerRecords = JSON.parse(readFileSync(driverDir(runDir, 'register-records.json'), 'utf8')); }
360
366
  catch { registerRecords = null; }
367
+ // The owner lookups this run made (tracker issue 276), read the same tolerant way as the records above:
368
+ // an archived run that predates the lane has no file, and its cards then render exactly as they were
369
+ // delivered. The source line the report prints comes from HERE, not from anything the seat typed.
370
+ let ownerChecks = [];
371
+ try { ownerChecks = JSON.parse(readFileSync(driverDir(runDir, 'owner-checks.json'), 'utf8')).checks ?? []; }
372
+ catch { ownerChecks = []; }
361
373
 
362
374
  // ── — THIS LANE HAD NO RECORD-ORIGIN LOGIC AT ALL ─────────────────────────────────────────────
363
375
  //
@@ -473,12 +485,22 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
473
485
  // "every audit link we have ever emailed died at the front door, silently". It came back here twice:
474
486
  // once as string surgery on the report URL, once as this function, and both spelled a pool path.
475
487
  //
476
- // A SINGLE MARK KEEPS THE LEGACY SHAPE. `<runId>/report.html` is what the rewrite exists for, it is
477
- // the address in every knockout email already sent, and it resolves. Changing a link that works to
478
- // match one that did not is how the next one of these gets written.
488
+ // A SINGLE MARK USED TO KEEP THE LEGACY SHAPE, on the reasoning that `<runId>/report.html` is what the
489
+ // rewrite exists for and that it resolves. THAT IS FALSE ON PRODUCTION (tracker issue 289) and the
490
+ // paragraph is kept, corrected, because its warning is still the right instinct and only its premise
491
+ // was wrong.
492
+ //
493
+ // Settled by the account owner against the live deployment, signed in as a delivered run's own owner:
494
+ // the emailed link returned the portal application's own `{"error":"not_found"}` — the app answered, so
495
+ // no rewrite touched the path — while the portal's own link for that run opened. The edge block this
496
+ // reasoning rests on is not in this repository, and the transcription of it in the test tree describes
497
+ // a host at the moment somebody wrote it down, not production today.
498
+ //
499
+ // The warning it ends with — changing a link that works to match one that did not — is why this was
500
+ // checked against the live thing before being changed rather than after.
479
501
  const origin = poolUrl ? String(poolUrl).replace(/\/$/, '') : null;
480
502
  const reportUrlFor = (slug) => !origin ? null
481
- : single ? `${origin}/${runId}/report.html`
503
+ : single ? reportRouteFor(origin, runId)
482
504
  : markReportRouteFor(origin, runId, slug);
483
505
  // — resolved once for the whole publish, off the same two sources the clearance
484
506
  // publisher uses (frozen sidecar, then roster; either marks, neither un-marks).
@@ -512,7 +534,7 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
512
534
  };
513
535
  const markBand = single ? overall : worstBand(framework, [m]);
514
536
  writeRO(file, renderKnockoutHtml(one, framework, {
515
- runId, overall: markBand, issued, auditFile, probeRan, registerCounts, registerRecords, identity, matter: runId,
537
+ runId, overall: markBand, issued, auditFile, probeRan, registerCounts, registerRecords, ownerChecks, identity, matter: runId,
516
538
  // — an invented mark says so on its own report. Resolved ONCE above the loop:
517
539
  // the answer is a property of the run, and asking per mark would let a multi-mark demo mark some
518
540
  // documents and not others if the roster moved mid-publish.
@@ -528,7 +550,7 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
528
550
  // native-render path has been reading for since before anything wrote it. One per report, so the
529
551
  // native render of a per-mark document is that mark's data and not the batch's.
530
552
  writeRO(dataFile, JSON.stringify(knockoutReportData(one, framework, {
531
- runId, codename, overall: markBand, issued, registerCounts, registerRecords, auditFile, customerKey, matter: runId,
553
+ runId, codename, overall: markBand, issued, registerCounts, registerRecords, ownerChecks, auditFile, customerKey, matter: runId,
532
554
  identity: { ...identity, level: searchPolicy?.level ?? null },
533
555
  url: reportUrlFor(slug),
534
556
  }), null, 2));
@@ -628,7 +650,7 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
628
650
  // WHICH DOCUMENTS THIS RUN PUBLISHED, and for which name. Every reader that has to open,
629
651
  // serve or link a knockout's reports takes the list from here rather than deriving a filename: the
630
652
  // naming rule (one mark ⇒ `report.html`, several ⇒ `report-<slug>.html`) is written ONCE, above, and
631
- // nobody re-implements it. Absent on every pre- meta, which is exactly the run that has one
653
+ // nobody re-implements it. Absent on every pre-change meta, which is exactly the run that has one
632
654
  // report at `report.html` — so a reader that falls back to that name on absence is reading the
633
655
  // archive correctly, not guessing.
634
656
  // — `slug` RIDES. It was destructured away here while being computed twenty lines up, and
@@ -225,11 +225,11 @@ export function stripTelemetry(md) {
225
225
  .join('\n');
226
226
  }
227
227
 
228
- // ── tracker issue 831 — THE CLIENT CUT OF THE AUDIT BLOCK'S CROSS-REFERENCE LINES ────────────────────────────────
228
+ // ── THE CLIENT CUT OF THE AUDIT BLOCK'S CROSS-REFERENCE LINES ────────────────────────────────
229
229
  //
230
230
  // `disposition` is a PLACEMENT key. stages.mjs dictates it as the posture that sets only WHERE a card is
231
231
  // placed and never the band; findings-model's DISPOSITION_GROUP maps it to the section heading the report
232
- // already prints. tracker issue 762 D5 took it off the report's risk chip and tracker issue 833 added the `disposition` KEY to
232
+ // already prints. D5 took it off the report's risk chip and a later change added the `disposition` KEY to
233
233
  // scrubCards' strip list — and the word still reached client principals, because audit-from-spine.mjs
234
234
  // re-encodes it into two OTHER keys that survive an allowlist keyed on names:
235
235
  //
@@ -252,7 +252,7 @@ export function stripTelemetry(md) {
252
252
  // resolved to, and which fragment of a contradicted pair the record supports. Deleting the key deletes the
253
253
  // pointer along with the word.
254
254
  //
255
- // THIS IS NOT THE SUBSTITUTION tracker issue 669 FORBIDS. Nothing here reads arbitrary client prose for a vocabulary.
255
+ // THIS IS NOT THE FORBIDDEN SUBSTITUTION. Nothing here reads arbitrary client prose for a vocabulary.
256
256
  // Each rule is ANCHORED to one position in a grammar THIS ENGINE writes: the disposition token at the head
257
257
  // of `resolution`, and the disposition token inside the `(finding #N, …)` parenthetical the contradiction
258
258
  // line builds. A mark named ADVERSARIAL survives both — it is not at position 0 of a resolution line, and
@@ -290,7 +290,7 @@ export function contradictionResolutionForClient(v) {
290
290
  return String(v).replace(CONTRADICTION_DISPOSITION_RE, '$1)');
291
291
  }
292
292
 
293
- // ── tracker issue 669 — ENGINE_PLAIN AND plainify ARE DELETED ────────────────────────────────────────────────────
293
+ // ── ENGINE_PLAIN AND plainify ARE DELETED ────────────────────────────────────────────────────
294
294
  //
295
295
  // doc-52 put nineteen find-and-replace rules on the rendered client surface. tracker issue 656 is what that cost:
296
296
  // `axis` -> `group` turned "AXIS Bank filed in class 36" into "group Bank filed in class 36" — a report
@@ -19,7 +19,7 @@
19
19
  //
20
20
  // Modelled on mcp-server/lib/coverage.mjs:65-75 (assertValidatorCoverage): a closed partition asserted
21
21
  // at LOAD, so a new store cannot be added without consciously choosing its gating. The failure that
22
- // mechanism exists to prevent is 's — a hand-copied mirror that silently stopped covering an
22
+ // mechanism exists to prevent is the — a hand-copied mirror that silently stopped covering an
23
23
  // artifact and still answered "complete: yes" about a file it never checked.
24
24
 
25
25
  import { existsSync, readFileSync } from "node:fs";
@@ -93,7 +93,7 @@ export const NOT_READ_BY_NAME = {
93
93
  "token-ledger": "the per-recipe token rollup, read through tokens.mjs rollupTokens(runDir) which walks the run's own telemetry; absent ⇒ the meta simply omits the tokens field",
94
94
  };
95
95
 
96
- // Neither of these is a run-side store, and both have been miscounted as one ('s own issue body
96
+ // Neither of these is a run-side store, and both have been miscounted as one (its own issue body
97
97
  // lists audit.md among the stores publishReport reads). They are FUNCTION ARGUMENTS — publishReport is
98
98
  // handed the two contract markdown paths by its caller and reads them from wherever it is told, so an
99
99
  // absent one is the caller's error and already throws. Declared so the source scan can tell "argument"
@@ -2,7 +2,7 @@
2
2
  // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
3
3
  // register-presence.mjs — the audit's queryable store of every live, matter-in-scope enumerated record.
4
4
  //
5
- // THE RULING THIS IMPLEMENTS (, owner 2026-08-31): "YES of course they should be in
5
+ // THE RULING THIS IMPLEMENTS (owner 2026-08-31): "YES of course they should be in
6
6
  // the audit. always. … we don't need to report on them but we need to store them." On the run this was
7
7
  // measured against, 65 live records inside the matter's scope and carrying the client's own dominant
8
8
  // element appeared in NO stored artifact — not the report (correct), and not the audit either (the
@@ -21,10 +21,20 @@
21
21
  // ~60 lines of duplicated document shell, and it is the right price: the alternative is exporting the
22
22
  // shell out of the frozen file, which is a bigger break than the duplication saves.
23
23
  //
24
- // ONE report. There is no client variant and no internal variant. What used
25
- // to render purplethe staff notes and the model's register estimate is not stripped here, it is
26
- // simply NOT PART OF THE REPORT; it lives in the audit workbook, which is where internal working material
27
- // belongs. That removes the whole class of "the wrong link got sent".
24
+ // ONE report. There is no client variant and no internal variant, and that is
25
+ // still the ruleit is what removes the whole class of "the wrong link got sent".
26
+ //
27
+ // WHAT CHANGED, 2026-09-07 (owner ruling, tracker issue 274): the one report now CARRIES the reviewer's
28
+ // notes rather than routing them to the audit workbook alone. The earlier reading of "one report" was
29
+ // that internal working material is simply not part of it; the ruling is that there is one report and the
30
+ // person who ran Clearotron reads it, so holding material back "just adds confusion for where data is
31
+ // lost". Six notes written for the reviewing lawyer on a delivered run reached the spreadsheet and
32
+ // nothing else, which is the measurement behind the ruling.
33
+ //
34
+ // So: the notes render, LABELLED, in report.css's existing `.internal` purple convention (see
35
+ // reviewerNotesBlock) — never merged into the client-voiced body. The workbook keeps them as well; this
36
+ // added a surface and moved none. The model's `registerEstimate` is NOT covered by the ruling and stays
37
+ // off the page.
28
38
  import { readFileSync } from 'node:fs';
29
39
  import { join, dirname } from 'node:path';
30
40
  import { fileURLToPath } from 'node:url';
@@ -118,7 +128,7 @@ function bandStop(framework, band) {
118
128
 
119
129
  const DEGRADED_NOTE = 'Automated research for this name was unavailable — manual verification is recommended before relying on this rating.';
120
130
 
121
- // tracker issue 760 — THE QUALIFIER, IN WORDS. It rendered as a bare grey token under the band chip — `low`, no
131
+ // THE QUALIFIER, IN WORDS. It rendered as a bare grey token under the band chip — `low`, no
122
132
  // label, no border, nothing on the page saying what it qualified. A reader met one word of a private
123
133
  // vocabulary and had to guess whether it described the risk, the confidence or the search.
124
134
  //
@@ -176,6 +186,14 @@ const KO_CSS = `
176
186
  .ko-findev{margin:0;font-size:12.5px;line-height:1.6;word-break:break-word}
177
187
  .ko-count{font-family:var(--mono);font-size:13px;color:var(--ink);margin:0}
178
188
  .ko-degraded{font-size:13px;color:var(--med-tx,#82550A);margin:8px 0 0;font-style:italic}
189
+ /* The reviewer-notes legend. NOT .ko-legend — that name is taken by the framework attribution row
190
+ above, and reusing it would restyle the caption. It names the purple convention report.css already
191
+ draws for .internal, so the colour is stated once and never re-specified. */
192
+ .ko-refnote{margin:0;padding:11px 24px 0;font-size:12px;color:#6a2b6e;font-style:italic}
193
+ /* The notes sit inside a mark's column, so the shared .internal block's bullets keep the column's
194
+ own list indent and do not fight the paragraph above them. */
195
+ .ko-row .internal .ko-bul{margin:0 0 4px}
196
+ .ko-row .internal .ko-bul:last-child{margin-bottom:0}
179
197
  .ko-counts table{width:100%;border-collapse:collapse;font-size:14px}
180
198
  .ko-counts th{text-align:left;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);
181
199
  font-weight:700;padding:14px 24px 8px;border-bottom:1px solid var(--line)}
@@ -248,13 +266,13 @@ function glanceSection(marks, framework, registerCounts) {
248
266
  </div>
249
267
  </div>`;
250
268
  }).join('');
251
- // tracker issue 761 — THE FRAMEWORK IS NAMED BESIDE THE CHIPS IT EXPLAINS. Every `.ko-band` chip below speaks one
269
+ // THE FRAMEWORK IS NAMED BESIDE THE CHIPS IT EXPLAINS. Every `.ko-band` chip below speaks one
252
270
  // word out of a framework's vocabulary, and that framework was named exactly once on this page: in the
253
271
  // footer, under everything it governs. This is ATTRIBUTION AND NOTHING ELSE — the same "Rated under
254
272
  // <name>" the footer prints, moved to where the words it licenses are actually read.
255
273
  //
256
274
  // NO LADDER HERE. Spelling the band scale out beside the chips would be new furniture on a client
257
- // deliverable, and tracker issue 765 rules that a rung buys depth, never furniture. If the knockout reader needs the
275
+ // deliverable, and a rung buys depth, never furniture. If the knockout reader needs the
258
276
  // scale, that is its own decision on its own merits, not a rider on this one.
259
277
  //
260
278
  // No framework ⇒ NOTHING. A run this render was given no manifest for gets no attribution invented for
@@ -637,6 +655,28 @@ const REGISTER_ORDINAL_FLOOR = 900;
637
655
  export const NOT_WEIGHED_LINE = 'Register listing — this card carries no rating of its own';
638
656
  const NOT_WEIGHED = NOT_WEIGHED_LINE;
639
657
 
658
+ /**
659
+ * The register card's basis line, which cannot be written without knowing whether the card is rated.
660
+ *
661
+ * THE TWO RULINGS MEET HERE AND THEY ALMOST CONTRADICTED EACH OTHER ON A CLIENT PAGE. tracker issue
662
+ * 1935 retired a code-owned placeholder because a rating nobody performed must not appear; tracker
663
+ * issue 274 then ruled that the rater's OWN band for a promoted filing must appear, because a filing
664
+ * the rater weighed into the verdict was rendering as though it had not been. Both hold, and they hold
665
+ * over different cards.
666
+ *
667
+ * `band` and `read` are independent fields — the band comes from `registerReads[].band` and the read
668
+ * from its `text` — so a filing the rater banded WITHOUT typing a read is reachable, and the first cut
669
+ * of this rendered the band chip beside the sentence "this card carries no rating of its own". The
670
+ * report would have been contradicting itself in one card, in the client's voice.
671
+ *
672
+ * So: the retired line belongs only to a card with no band. A banded card with no read says nothing
673
+ * rather than something false — the chip and the source tag already say what the card is.
674
+ */
675
+ function basisLine(band, read) {
676
+ if (read) return `<p class="ko-findbasis">${esc(read)}</p>`;
677
+ return band ? '' : `<p class="ko-findbasis">${esc(NOT_WEIGHED)}</p>`;
678
+ }
679
+
640
680
 
641
681
  /**
642
682
  * Which listed filings get pointed at. TWO tests, and both fail OPEN — a filing is promoted unless
@@ -654,7 +694,11 @@ const NOT_WEIGHED = NOT_WEIGHED_LINE;
654
694
  * Neither test is a judgment about the filing. Whether any of it blocks anything is lawyer work this
655
695
  * product does not do — the same line register-records.mjs rule 3 has held since the lane shipped.
656
696
  */
657
- function promotableRecords(entry, mark) {
697
+ // EXPORTED so the pipeline can ask the same question the page asks (tracker issue 276). The owner
698
+ // use-check runs on PROMOTED filings only, and "promoted" has to mean here what it means on the report —
699
+ // a second predicate would let the engine search an owner whose filing the report never shows, or skip
700
+ // one it does.
701
+ export function promotableRecords(entry, mark) {
658
702
  const scope = new Set([...(mark?.classesSearched ?? []), ...(entry?.classes ?? [])]
659
703
  .map(Number).filter(Number.isInteger));
660
704
  return (entry?.records ?? []).filter((r) => {
@@ -728,9 +772,13 @@ function registerCardViews(mark, framework, registerRecords) {
728
772
  * is gone; what tells the two apart on the page is where the finding came from, which is the vocabulary
729
773
  * the clearance reports already use for exactly this.
730
774
  *
731
- * NO BAND CHIP AND NO `bandStop`, still, and for the reason the old note gave: a rung of the run's ladder
732
- * here would be a rating nobody performed. The rail takes --faint so the card reads off the risk ramp
733
- * rather than on it.
775
+ * THE BAND CHIP IS DRAWN ONLY WHEN THE RATER SENT ONE, and that condition is the whole rule. The old note
776
+ * here said "no band chip and no `bandStop`, ever: a rung of the run's ladder would be a rating nobody
777
+ * performed" which was true for as long as nothing could carry the rater's rating of an individual
778
+ * filing. `registerReads[].band` now can (tracker issue 274), so the objection is answered where it was
779
+ * raised: with a band, the rating WAS performed, by the seat, in the framework's own words, and the chip
780
+ * states it. With no band the old rule stands unchanged — --faint rail, no chip, nothing claimed — and
781
+ * that is still what every archived run renders.
734
782
  *
735
783
  * THE LINE UNDER THE STATEMENT DESCRIBES THE CARD, NOT THE RATING. It used to deny
736
784
  * that the rating turned on this filing, which this function has no way to know and which a delivered
@@ -759,28 +807,83 @@ function sourceChips(v) {
759
807
  return `${commonLaw ? '<span class="src cl">Common law</span>' : ''}${register ? '<span class="src reg">Register</span>' : ''}`;
760
808
  }
761
809
 
762
- function registerFindingBlock(v, markIndex, reads = null) {
810
+ // ── THE REVIEWER'S NOTES, ON THE REPORT ─────────────────────────────────────────────────
811
+ //
812
+ // OWNER RULING, 2026-09-07: there is one report and the person who ran Clearotron reads it — keeping
813
+ // this material off the page "just adds confusion for where data is lost". This replaces the earlier
814
+ // split under which the notes went to the audit workbook alone (the header of this file and
815
+ // publish/knockout.mjs carried that rule; both now say what replaced it). The workbook keeps them too:
816
+ // this adds a surface, it does not move one.
817
+ //
818
+ // LABELLED, NEVER MERGED. They render in the established `.internal` purple convention report.css
819
+ // already defines — the same one the clearance report uses for this material — so a reader can see whose
820
+ // voice a line is in. Merging them into the client-voiced body would make the reviewer's asides read as
821
+ // findings about the mark, which is the one way this ruling could produce a worse document.
822
+ const REVIEWER_NOTES_LEGEND = 'Information for your reference/context that likely does not need to be shared with the business is shown in purple.';
823
+
824
+ // The clearance lane's own label, copied rather than re-worded (tracker issue 276). One spelling across
825
+ // both products is the point: a reader who has seen it on a clearance report knows what it means here.
826
+ const USE_CHECK_LABEL = 'Use-check source:';
827
+
828
+ /** The owner lookup covering a filing, joined by recordId. `null` when this run owed that filing none. */
829
+ function ownerCheckFor(ownerChecks, recordId) {
830
+ const id = String(recordId ?? '').trim();
831
+ if (!id) return null;
832
+ return (Array.isArray(ownerChecks) ? ownerChecks : [])
833
+ .find((c) => (Array.isArray(c?.recordIds) ? c.recordIds : []).some((x) => String(x).trim() === id)) ?? null;
834
+ }
835
+
836
+ function reviewerNotesBlock(m) {
837
+ const notes = (Array.isArray(m?.purpleNotes) ? m.purpleNotes : [])
838
+ .map((n) => String(n ?? '').trim()).filter(Boolean);
839
+ if (!notes.length) return '';
840
+ return `<div class="internal">
841
+ <span class="tag">For your reference</span>
842
+ ${notes.map((n) => `<p class="ko-bul">${inlineMd(n)}</p>`).join('')}
843
+ </div>`;
844
+ }
845
+
846
+ function registerFindingBlock(v, markIndex, reads = null, framework = null, ownerChecks = []) {
763
847
  const r = v.record;
764
848
  // — THE RATER'S OWN READ OF THIS FILING, when it recorded one. `registerReads` is
765
849
  // joined to the record store by the validator, so a row that reaches here names a filing this run
766
850
  // actually holds. With no row the neutral line stands, and the neutral line is TRUE: it describes the
767
851
  // card. That is why the field can be optional without the page ever asserting something false.
768
- const read = (Array.isArray(reads) ? reads : [])
769
- .map((x) => ({ id: String(x?.recordId ?? '').trim(), text: String(x?.read ?? '').trim() }))
770
- .find((x) => x.id && x.id === String(r?.recordId ?? '').trim())?.text;
852
+ const row = (Array.isArray(reads) ? reads : [])
853
+ .map((x) => ({ id: String(x?.recordId ?? '').trim(), text: String(x?.read ?? '').trim(), band: String(x?.band ?? '').trim() }))
854
+ .find((x) => x.id && x.id === String(r?.recordId ?? '').trim());
855
+ const read = row?.text;
856
+ // The band rides the SAME row as the read and is independently optional: a read with no band prints
857
+ // exactly as it did before this field existed. The validator has already checked the word against the
858
+ // frozen ladder, so `bandStop` resolves a real stop rather than falling through to a default that would
859
+ // colour an unknown word as though it were rated.
860
+ const band = row?.band || null;
861
+ const stop = band ? bandStop(framework, band) : null;
862
+ // ── WHERE THE OWNER'S TRADE WAS LOOKED UP (tracker issue 276) ──────────────────────────────────
863
+ //
864
+ // The source is the DRIVER'S, joined by this filing's own recordId — never a URL the seat typed. That
865
+ // is the whole reason a reader can trust it: the row exists because the driver made the call, so
866
+ // "asserting a no-result without issuing a query" is not a thing this surface can express.
867
+ //
868
+ // ABSENT ON A RUN THAT OWED NO CHECK, and that silence is correct: no line at all says nothing, while
869
+ // a line reading "no result" on a filing nobody was asked about would claim a search that never ran.
870
+ const useCheck = ownerCheckFor(ownerChecks, r?.recordId);
871
+ const useCheckSource = useCheck?.source ?? null;
771
872
  const meta = [r.owner ? esc(r.owner) : 'proprietor not stated', r.territory ? esc(r.territory) : null]
772
873
  .filter(Boolean).join(' · ');
773
874
  const receipt = isHttpUrl(r.url) ? linkOrText(r.url) : esc(r.recordId ?? 'no record address supplied');
774
875
  return `<div class="card ko-find" data-ko-mark="${Number(markIndex)}" data-ko-ord="${Number(v.ordinal)}">
775
876
  <div class="top">
776
- <div class="rail" style="background:var(--faint)"></div>
877
+ <div class="rail" style="background:var(${stop ?? '--faint'})"></div>
777
878
  <div class="body">
778
879
  <div class="cardhead">
779
- <span class="fnum">${esc(v.ref)}</span><span class="who">${esc(r.mark ?? 'Unnamed filing')}</span><span class="src reg">Register</span>
880
+ <span class="fnum">${esc(v.ref)}</span><span class="who">${esc(r.mark ?? 'Unnamed filing')}</span>${
881
+ band ? `<span class="ko-findband" style="background:var(${stop})">${esc(band)}</span>` : ''}<span class="src reg">Register</span>
780
882
  </div>
781
883
  <p class="ko-findmeta">${meta}</p>
782
884
  <p class="ko-findnet">${esc(v.statement)}</p>
783
- <p class="ko-findbasis">${esc(read || NOT_WEIGHED)}</p>
885
+ ${basisLine(band, read)}
886
+ ${useCheck ? `<p class="ko-findev">${esc(USE_CHECK_LABEL)} ${isHttpUrl(useCheckSource) ? linkOrText(useCheckSource) : esc(useCheckSource)}</p>` : ''}
784
887
  <p class="ko-findev">Register record: ${receipt}</p>
785
888
  </div>
786
889
  </div>
@@ -916,7 +1019,7 @@ function readBlock(m) {
916
1019
  ].filter(Boolean).join('');
917
1020
  }
918
1021
 
919
- function analysisSection(marks, framework, { registerCounts = null, probeRan = false, registerRecords = null } = {}) {
1022
+ function analysisSection(marks, framework, { registerCounts = null, probeRan = false, registerRecords = null, ownerChecks = [] } = {}) {
920
1023
  const cards = marks.map((m, markIndex) => {
921
1024
  const stop = bandStop(framework, m.rating);
922
1025
  const bullets = readBlock(m);
@@ -925,7 +1028,7 @@ function analysisSection(marks, framework, { registerCounts = null, probeRan = f
925
1028
  // under compareKnockoutBlockingPower, so appending them is the ladder's own rule applied to a row
926
1029
  // that has no rung, not a new one invented for the register.
927
1030
  const reg = registerCardViews(m, framework, registerRecords);
928
- const regBlocks = reg.cards.map((v) => registerFindingBlock(v, markIndex, m?.registerReads)).join('');
1031
+ const regBlocks = reg.cards.map((v) => registerFindingBlock(v, markIndex, m?.registerReads, framework, ownerChecks)).join('');
929
1032
  const overflow = reg.promoted > reg.cards.length
930
1033
  ? `<p class="ko-bul">${esc(`${reg.promoted - reg.cards.length} further filing${reg.promoted - reg.cards.length === 1 ? '' : 's'} for this name met the same test — every one of them is in the filings section below.`)}</p>`
931
1034
  : '';
@@ -950,11 +1053,17 @@ function analysisSection(marks, framework, { registerCounts = null, probeRan = f
950
1053
  <div>
951
1054
  ${body || '<p class="ko-bul">No adverse signals recorded for this name on this screen.</p>'}
952
1055
  ${m.degraded ? `<p class="ko-degraded">${esc(DEGRADED_NOTE)}</p>` : ''}
1056
+ ${reviewerNotesBlock(m)}
953
1057
  <p class="ko-reg">${esc(registerLine(m, registerCounts, probeRan, registerRecords, reg.cards))}</p>
954
1058
  </div>
955
1059
  </div>`;
956
1060
  }).join('');
957
- return `<div class="panel ko-glance">${cards}</div>`;
1061
+ // The legend rides the panel and only when a note is actually on it — a standing sentence explaining a
1062
+ // colour no reader can see would be the report describing a convention it did not use.
1063
+ const anyNotes = marks.some((m) => (Array.isArray(m?.purpleNotes) ? m.purpleNotes : [])
1064
+ .some((n) => String(n ?? '').trim()));
1065
+ const legend = anyNotes ? `<p class="ko-refnote">${esc(REVIEWER_NOTES_LEGEND)}</p>` : '';
1066
+ return `<div class="panel ko-glance">${legend}${cards}</div>`;
958
1067
  }
959
1068
 
960
1069
  // The method line names EXACTLY what ran, and its wording is doctrine — with counts on the page, "register
@@ -1114,6 +1223,9 @@ function methodLine(registerCounts, probeRan, { citedFindings = 0, uncitedFindin
1114
1223
  export function renderKnockoutHtml(findings, framework, {
1115
1224
  runId, overall, issued = null, auditFile = null, probeRan = false, registerCounts = null,
1116
1225
  registerRecords = null,
1226
+ // The driver's own record of the owner lookups it ran (tracker issue 276). Defaults to [] so an
1227
+ // archived run that predates the lane renders exactly as it was delivered.
1228
+ ownerChecks = [],
1117
1229
  identity = null, matter = null, homeHref = null, chromeHref = null, depthNote = null,
1118
1230
  // — the run's FROZEN policy, so the scope section states what this run was
1119
1231
  // instructed to do rather than what its artifacts happen to show. Defaults to null, and an archived
@@ -1154,7 +1266,7 @@ export function renderKnockoutHtml(findings, framework, {
1154
1266
  const counts = hasCounts
1155
1267
  ? countsSection(marks, registerCounts)
1156
1268
  : `<div class="panel"><p class="ko-tier">${esc(tierLine)}</p></div>`;
1157
- const analysis = analysisSection(marks, framework, { registerCounts, probeRan, registerRecords });
1269
+ const analysis = analysisSection(marks, framework, { registerCounts, probeRan, registerRecords, ownerChecks });
1158
1270
  const provider = hasCounts ? (registerCounts.providerLabel ?? registerCounts.provider ?? 'the register') : null;
1159
1271
  // The filings appendix renders only when the run produced a listing artifact — never on its absence,
1160
1272
  // and never as an empty table. A knockout with no sidecar publishes exactly the counts-only document.
@@ -1282,7 +1394,7 @@ window.addEventListener('beforeprint',o);})();</script>
1282
1394
  * where the working notes live, and a data file that quietly re-admitted them would reopen exactly the
1283
1395
  * leak this series closed.
1284
1396
  */
1285
- export function knockoutReportData(findings, framework, { runId, codename, overall, issued, identity, registerCounts, registerRecords = null, url, auditFile, customerKey, matter }) {
1397
+ export function knockoutReportData(findings, framework, { runId, codename, overall, issued, identity, registerCounts, registerRecords = null, ownerChecks = [], url, auditFile, customerKey, matter }) {
1286
1398
  const marks = findings?.marks ?? [];
1287
1399
  return {
1288
1400
  schema: 'report-data/1',
@@ -1324,6 +1436,39 @@ export function knockoutReportData(findings, framework, { runId, codename, overa
1324
1436
  classesDriving: m.classesDriving ?? [],
1325
1437
  degraded: Boolean(m.degraded),
1326
1438
  points: m.bullets ?? [],
1439
+ // ── THE ASSESSMENT THE RUN ALREADY WROTE (tracker issue 274) ──────────────────────────────
1440
+ //
1441
+ // Seven keys the assess stage writes into knockout-findings.json reached this file as nothing.
1442
+ // They were not withheld by a rule — no code decided against them; this projection is an explicit
1443
+ // whitelist and nobody had added them, so an assistant drafting from this file could not see the
1444
+ // reasoning behind a rating it was drafting about.
1445
+ //
1446
+ // `assessment` is the sharpest case: publish substitutes it into `batch.executiveSummary` ONLY on
1447
+ // a multi-mark batch, so on a single-mark run — the common knockout — the mark's own opening read
1448
+ // was written, validated, and then dropped by both surfaces at once.
1449
+ //
1450
+ // `purpleNotes` is the reviewer's notes, and it is here by the owner's ruling of 2026-09-07: one
1451
+ // report, read by the person who ran Clearotron, because keeping material off it "just adds
1452
+ // confusion for where data is lost". They are LABELLED on the page rather than merged into the
1453
+ // client-voiced body — see reviewerNotesBlock — so a reader can tell whose voice they are in.
1454
+ assessment: (() => { const t = String(m.assessment ?? '').trim(); return t || null; })(),
1455
+ counterFactors: m.counterFactors ?? [],
1456
+ mitigation: (() => { const t = String(m.mitigation ?? '').trim(); return t || null; })(),
1457
+ // `null`, not `false`, when the rater said nothing: a crowded field is a mitigant the reasoning
1458
+ // turns on, and an unstated one must not read as a stated "no".
1459
+ crowdedField: typeof m.crowdedField === 'boolean' ? m.crowdedField : null,
1460
+ reviewerNotes: m.purpleNotes ?? [],
1461
+ // The proof-of-search rows — the same defensibility record list_searches answers from.
1462
+ negatives: (m.negatives ?? []).map((n) => ({
1463
+ term: n?.term ?? null, source: n?.source ?? null, note: n?.note ?? null,
1464
+ })),
1465
+ // The rater's read of a filing it weighed, keyed by the record id the card prints, so a consumer
1466
+ // can join a read to its filing without matching on prose.
1467
+ registerReads: (m.registerReads ?? []).map((x) => ({
1468
+ recordId: x?.recordId ?? null,
1469
+ read: x?.read ?? null,
1470
+ band: String(x?.band ?? '').trim() || null,
1471
+ })),
1327
1472
  // — the typed finding, ranked, with the reference the report prints. The old key was
1328
1473
  // `evidence[]` and it was `(m.findings ?? []).filter((f) => f?.url)`: a typed finding has no
1329
1474
  // `url`, so this file — the one the assistant drafts client mail from — silently carried zero
@@ -1345,14 +1490,36 @@ export function knockoutReportData(findings, framework, { runId, codename, overa
1345
1490
  // A promoted filing the brief omitted would be the report and the brief disagreeing about
1346
1491
  // what the run found.
1347
1492
  //
1348
- // `band: null` and `shape: 'register'` are the load-bearing fields: a consumer can tell a
1349
- // weighed conflict from a pointed-at filing without parsing prose, and `net` carries the
1350
- // not-weighed sentence so a consumer that reads only `net` still cannot overstate it.
1351
- ...registerCardViews(m, framework, registerRecords).cards.map((v) => ({
1352
- ref: v.ref, ordinal: v.ordinal, name: v.record.mark, owner: v.record.owner, band: null,
1353
- type: 'Register filing', net: `${v.statement} It was ${NOT_WEIGHED}.`, basis: NOT_WEIGHED,
1354
- evidence: v.evidence, shape: 'register',
1355
- })),
1493
+ // `shape: 'register'` is the load-bearing field: a consumer can tell a weighed conflict from a
1494
+ // pointed-at filing without parsing prose.
1495
+ //
1496
+ // `band` AND `basis` NOW CARRY THE RATER'S READ WHEN IT SENT ONE (tracker issue 274). Before
1497
+ // this, both were constants `band: null` and the not-weighed sentence — on every filing of
1498
+ // every run, including runs where the seat had written a full read of that exact filing and the
1499
+ // HTML card was already printing it. The page and this file disagreed, and this file is the one
1500
+ // the MCP brief answers from, so the surface a reader asks "what did you make of that
1501
+ // registration?" was the surface that had dropped the answer.
1502
+ //
1503
+ // The unmatched case is unchanged and must stay that way: no row for this recordId ⇒ `band:
1504
+ // null` and the not-weighed line, which describes the card and claims nothing.
1505
+ ...registerCardViews(m, framework, registerRecords).cards.map((v) => {
1506
+ const row = (Array.isArray(m?.registerReads) ? m.registerReads : [])
1507
+ .find((x) => String(x?.recordId ?? '').trim() && String(x?.recordId ?? '').trim() === String(v.record?.recordId ?? '').trim());
1508
+ const read = String(row?.read ?? '').trim() || null;
1509
+ const band = String(row?.band ?? '').trim() || null;
1510
+ // The driver's own record of where this filing's proprietor was looked up (tracker issue
1511
+ // 276), joined by recordId. `null` where the run owed no check — the same three states the
1512
+ // card has, so a consumer can tell "searched and found nothing" from "never searched".
1513
+ const oc = ownerCheckFor(ownerChecks, v.record?.recordId);
1514
+ return {
1515
+ ref: v.ref, ordinal: v.ordinal, name: v.record.mark, owner: v.record.owner, band,
1516
+ type: 'Register filing',
1517
+ net: read ? v.statement : `${v.statement} It was ${NOT_WEIGHED}.`,
1518
+ basis: read ?? NOT_WEIGHED,
1519
+ useCheckSource: oc?.source ?? null,
1520
+ evidence: v.evidence, shape: 'register',
1521
+ };
1522
+ }),
1356
1523
  ],
1357
1524
  registerCounts: counted?.counts
1358
1525
  ? {
@@ -4,9 +4,19 @@
4
4
  // report-data.json since the one-report collapse; the clearance lane's native-render branch existed in
5
5
  // the portal with NO producer anywhere (B3's "the aspirational path") — this is that producer.
6
6
  //
7
- // Two readers, one file (the knockout doctrine, verbatim): the assistant drafts client-facing mail from
8
- // it, and the portal's native-render path reads it instead of iframing baked HTML. It is the CLIENT CUT
9
- // by construction, not by serve-time stripping:
7
+ // Two readers, one file (the knockout doctrine, as it stood): the assistant drafts client-facing mail
8
+ // from it, and the portal's native-render path reads it instead of iframing baked HTML.
9
+ //
10
+ // THE TWO LANES DIVERGED ON 2026-09-07 AND THIS FILE DID NOT MOVE. The owner ruled (tracker issue 274)
11
+ // that the KNOCKOUT report carries the reviewer's notes, on the ground that one report is read by the
12
+ // person who ran Clearotron and holding material back confuses where data went; render-knockout.mjs
13
+ // projects them under `reviewerNotes`. That ruling was about those notes on that lane. It did not touch
14
+ // what this producer strips — withdrawn findings, verification receipts, `::p::` tails, `[internal]`
15
+ // labels and engine-internal narration are all still cut here, and the guard test still polices them.
16
+ // Do not read the knockout change as licence to relax this list; if the ruling is meant to extend, it
17
+ // extends by being asked, not by inference.
18
+ //
19
+ // It remains the CLIENT CUT by construction, not by serve-time stripping:
10
20
  // • only LIVE findings (a withdrawn finding renders nowhere — it does not exist here either);
11
21
  // • no verification receipts (use_check / own_rights / bears_on — those are the reviewer's evidence
12
22
  // trail and live in the audit workbook), no withdrawn_reason, no quarantine records;