clearotron 0.2.1 → 0.2.3

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 (676) hide show
  1. package/.env.example +82 -1
  2. package/.nvmrc +1 -1
  3. package/CONTRIBUTING.md +3 -3
  4. package/INSTALL.md +64 -58
  5. package/README.md +11 -16
  6. package/THIRD-PARTY-NOTICES.md +1 -1
  7. package/bin/brandowner.mjs +1 -1
  8. package/bin/clearotron.mjs +26 -4
  9. package/bin/connect.mjs +2 -2
  10. package/bin/example.mjs +31 -11
  11. package/bin/grant.mjs +3 -3
  12. package/bin/key.mjs +1 -1
  13. package/bin/onboard.mjs +252 -136
  14. package/bin/start.mjs +176 -33
  15. package/bin/stop.mjs +65 -3
  16. package/bin/update.mjs +7 -7
  17. package/bin/uspto-sync.mjs +1 -1
  18. package/build-info.json +2 -2
  19. package/demo/full-country-search/run/_driver/framework.json +1 -1
  20. package/demo/global-preliminary-search/run/_driver/framework.json +1 -1
  21. package/demo/knockout-search/run/_driver/framework.json +1 -1
  22. package/demo/multi-country-focus-search/run/_driver/framework.json +1 -1
  23. package/docs/DELIVERY.md +6 -2
  24. package/docs/E2E.md +5 -5
  25. package/docs/PORTAL.md +2 -2
  26. package/docs/README.md +5 -4
  27. package/docs/SECURITY.md +17 -0
  28. package/docs/architecture/01-product-overview.md +2 -2
  29. package/docs/architecture/02-architecture.md +2 -2
  30. package/docs/architecture/04-configuration-reference.md +8 -3
  31. package/docs/architecture/05-config-governance.md +52 -5
  32. package/docs/architecture/05-customer-profiles.md +2 -2
  33. package/docs/architecture/06-operations-runbook.md +13 -1
  34. package/docs/architecture/09-security-and-data.md +1 -1
  35. package/docs/configuration.md +4 -3
  36. package/docs/decisions/0004-documentation-structure.md +1 -1
  37. package/driver/CHANGELOG.md +121 -1
  38. package/driver/README.md +2 -2
  39. package/driver/ask-ledger.mjs +3 -3
  40. package/driver/authority-trees.mjs +1 -1
  41. package/driver/call-capture.mjs +1 -1
  42. package/driver/card-frame.mjs +1 -1
  43. package/driver/case-law-ledger.mjs +1 -1
  44. package/driver/claim-liveness.mjs +1 -1
  45. package/driver/common-law-receipts.mjs +2 -2
  46. package/driver/commonlaw-carry.mjs +1 -1
  47. package/driver/config-inventory.mjs +1 -1
  48. package/driver/config-staleness.mjs +1 -1
  49. package/driver/connotation-search.mjs +12 -12
  50. package/driver/contract-audit.mjs +5 -5
  51. package/driver/contract-dictation-registry.mjs +4 -4
  52. package/driver/contract-dictation.mjs +2 -2
  53. package/driver/contract-e3-backlog.mjs +6 -6
  54. package/driver/contract-vocabulary.mjs +3 -3
  55. package/driver/corrections-feedforward.mjs +1 -1
  56. package/driver/coverage-form-io.mjs +2 -2
  57. package/driver/coverage-form.mjs +4 -4
  58. package/driver/coverage-ledger.mjs +3 -3
  59. package/driver/coverage-union.mjs +1 -1
  60. package/driver/declination-call.mjs +35 -3
  61. package/driver/declination-duty.mjs +1 -1
  62. package/driver/deliver-trigger.sh +3 -3
  63. package/driver/deploy-live-run-guard.mjs +6 -2
  64. package/driver/dev-portal.mjs +3 -3
  65. package/driver/disposition-call.mjs +4 -4
  66. package/driver/disposition-tool.mjs +4 -4
  67. package/driver/disposition-union.mjs +2 -2
  68. package/driver/doc-constants.mjs +1 -1
  69. package/driver/door-gates.mjs +2 -2
  70. package/driver/doubt-selection.mjs +2 -2
  71. package/driver/drainer-identity.mjs +1 -1
  72. package/driver/driver.config.mjs +64 -12
  73. package/driver/e2e-rounds.mjs +2 -2
  74. package/driver/effort-model.mjs +2 -2
  75. package/driver/engine/anthropic-agent.mjs +24 -24
  76. package/driver/engine/auth.mjs +1 -1
  77. package/driver/engine/cli-version.mjs +103 -0
  78. package/driver/engine/common.mjs +1 -1
  79. package/driver/engine/deny-authority-write.mjs +1 -1
  80. package/driver/engine/jx-turn.mjs +1 -1
  81. package/driver/engine/mcp/clarivate-server.mjs +1 -1
  82. package/driver/engine/mcp/corsearch-server.mjs +1 -1
  83. package/driver/engine/mcp/declination-server.mjs +1 -1
  84. package/driver/engine/mcp/dispositions-server.mjs +1 -1
  85. package/driver/engine/mcp/euipo-server.mjs +1 -1
  86. package/driver/engine/mcp/fetch-server.mjs +1 -1
  87. package/driver/engine/mcp/free-tier-server.mjs +2 -2
  88. package/driver/engine/mcp/gather-config.mjs +11 -11
  89. package/driver/engine/mcp/perplexity-server.mjs +1 -1
  90. package/driver/engine/mcp/recording-server.mjs +8 -4
  91. package/driver/engine/mcp/signa-server.mjs +1 -1
  92. package/driver/engine/mcp/uspto-local-server.mjs +1 -1
  93. package/driver/engine/openai-agent.mjs +2 -2
  94. package/driver/engine-build.mjs +2 -2
  95. package/driver/enqueue-schema.mjs +10 -10
  96. package/driver/enqueue.mjs +1 -1
  97. package/driver/envelope-settle.mjs +1 -1
  98. package/driver/evidence-claim-invariant.mjs +2 -2
  99. package/driver/feedback-store.mjs +1 -1
  100. package/driver/findings-model.mjs +60 -10
  101. package/driver/flag-snapshot.mjs +20 -0
  102. package/driver/floor-duty.mjs +1 -1
  103. package/driver/form-neighbourhood.mjs +1 -1
  104. package/driver/framework.mjs +2 -2
  105. package/driver/gateway.mjs +45 -23
  106. package/driver/grounds-grammar.mjs +1 -1
  107. package/driver/hit-list.mjs +1 -1
  108. package/driver/jurisdiction-systems.mjs +1 -1
  109. package/driver/jx-lanes.mjs +1 -1
  110. package/driver/jx-units.mjs +1 -1
  111. package/driver/jx.mjs +3 -3
  112. package/driver/knockout-assess-record.mjs +5 -1
  113. package/driver/narrative-refutation-record.mjs +3 -3
  114. package/driver/numeric-setting.mjs +1 -1
  115. package/driver/owner-use-check.mjs +184 -0
  116. package/driver/package.json +4 -4
  117. package/driver/party-facts.mjs +2 -2
  118. package/driver/phase0.mjs +2 -2
  119. package/driver/pipeline-knockout.mjs +52 -4
  120. package/driver/pipeline.mjs +180 -67
  121. package/driver/placement-diff.mjs +2 -2
  122. package/driver/placement-form.mjs +4 -4
  123. package/driver/placement-union.mjs +1 -1
  124. package/driver/plain-register.mjs +120 -0
  125. package/driver/portal-access.mjs +1 -1
  126. package/driver/portal-acks.mjs +1 -1
  127. package/driver/portal-config-view.mjs +42 -3
  128. package/driver/portal-families.mjs +1 -1
  129. package/driver/portal-local-auth.mjs +1 -1
  130. package/driver/portal-report.mjs +7 -7
  131. package/driver/portal-service.mjs +41 -22
  132. package/driver/portal-upstream.mjs +2 -2
  133. package/driver/predelivery-lint.mjs +149 -11
  134. package/driver/prelim-variants-record.mjs +2 -2
  135. package/driver/profile-page.html +11 -3
  136. package/driver/profile-selection.mjs +1 -1
  137. package/driver/profile-service.mjs +6 -6
  138. package/driver/profiles/README.md +3 -3
  139. package/driver/profiles.mjs +145 -13
  140. package/driver/progress.mjs +6 -6
  141. package/driver/provider-usage.mjs +1 -1
  142. package/driver/publish/demo-marking.mjs +1 -1
  143. package/driver/publish/index.mjs +49 -8
  144. package/driver/publish/knockout.mjs +42 -14
  145. package/driver/publish/parse.mjs +4 -4
  146. package/driver/publish/publish-inputs.mjs +2 -2
  147. package/driver/publish/register-presence.mjs +1 -1
  148. package/driver/publish/render-knockout.mjs +646 -144
  149. package/driver/publish/render.mjs +2 -2
  150. package/driver/publish/report-data.mjs +13 -3
  151. package/driver/queue-watch-probe.mjs +1 -1
  152. package/driver/queue-watch-verdict.mjs +1 -1
  153. package/driver/recall-reconciliation.mjs +1 -1
  154. package/driver/recipe-service.mjs +1 -1
  155. package/driver/record-carry.mjs +5 -5
  156. package/driver/recording-agreement.mjs +3 -3
  157. package/driver/reference-score.mjs +7 -7
  158. package/driver/reference-strip-signatures.mjs +20 -0
  159. package/driver/refusal-bound.mjs +3 -3
  160. package/driver/register-availability.mjs +2 -2
  161. package/driver/register-count.mjs +1 -1
  162. package/driver/register-grant-vocabulary.mjs +2 -2
  163. package/driver/register-plan.mjs +8 -8
  164. package/driver/register-records.mjs +2 -2
  165. package/driver/registry-fidelity.mjs +3 -3
  166. package/driver/remedy-accounting.mjs +1 -1
  167. package/driver/repair-composers.mjs +2 -2
  168. package/driver/repair-digest.mjs +3 -3
  169. package/driver/repairs.mjs +6 -6
  170. package/driver/replay-archive.mjs +2 -0
  171. package/driver/report-card-record.mjs +2 -2
  172. package/driver/result-noun-fields.mjs +10 -3
  173. package/driver/run-economics.mjs +2 -2
  174. package/driver/run-integrity.mjs +1 -1
  175. package/driver/runner.mjs +22 -22
  176. package/driver/scope-rules.mjs +1 -1
  177. package/driver/search-policy.mjs +5 -5
  178. package/driver/skeptic-search.mjs +1 -1
  179. package/driver/skills/blind-frame/SKILL.md +2 -2
  180. package/driver/skills/case-law-citation/SKILL.md +2 -2
  181. package/driver/skills/knockout-assess/SKILL.md +94 -4
  182. package/driver/skills/matter-frame/SKILL.md +6 -6
  183. package/driver/skills/matter-frame/watchlist-reference.md +2 -2
  184. package/driver/skills/prelim-common-law/SKILL.md +1 -1
  185. package/driver/skills/prelim-search/SKILL.md +3 -3
  186. package/driver/skills/prelim-search/report-prose.md +82 -0
  187. package/driver/skills/prelim-search/risk-framework-demo.manifest.json +1 -1
  188. package/driver/skills/prelim-search/risk-framework-triage.manifest.json +1 -1
  189. package/driver/skills/prelim-search/risk-framework.manifest.json +1 -1
  190. package/driver/skills/prelim-search/synthesis-rules.md +1 -1
  191. package/driver/skills/prelim-search/template-formatting.md +1 -1
  192. package/driver/skills/prelim-search/templates/email/generic.md +1 -1
  193. package/driver/skills/prelim-search/worked-examples.md +1 -1
  194. package/driver/skills/prelim-variants/SKILL.md +5 -5
  195. package/driver/stage-context.mjs +1 -1
  196. package/driver/stages-knockout.mjs +55 -4
  197. package/driver/stages.mjs +101 -44
  198. package/driver/stray-artifacts.mjs +2 -2
  199. package/driver/suite-census.json +275 -65
  200. package/driver/synthesis-record.mjs +1 -1
  201. package/driver/systemd/clearotron-client-mcp.service +1 -1
  202. package/driver/systemd/clearotron-portal.service +1 -1
  203. package/driver/systemd/render-units.mjs +1 -1
  204. package/driver/tokens.mjs +1 -1
  205. package/driver/tool-calls.mjs +1 -1
  206. package/driver/turnaround-bands.mjs +1 -1
  207. package/driver/unit-file-drift.mjs +1 -1
  208. package/driver/unit-inventory.mjs +297 -80
  209. package/driver/unit-state-verdict.mjs +20 -12
  210. package/driver/verify-knockout.mjs +10 -2
  211. package/driver/verify.mjs +13 -13
  212. package/driver/whatif-memo-run.mjs +72 -9
  213. package/driver/whatif-memo.mjs +19 -1
  214. package/driver/whatif-queue.mjs +1 -1
  215. package/driver/whatif-worker.mjs +1 -1
  216. package/examples/README.md +2 -2
  217. package/examples/grants.example.json +6 -7
  218. package/mcp-server/CHANGELOG.md +6 -0
  219. package/mcp-server/README.md +3 -3
  220. package/mcp-server/http-server.mjs +44 -1
  221. package/mcp-server/key-socket.mjs +184 -0
  222. package/mcp-server/lib/audit-view.mjs +69 -2
  223. package/mcp-server/lib/brief.mjs +15 -0
  224. package/mcp-server/lib/driver.mjs +7 -1
  225. package/mcp-server/lib/events.mjs +1 -1
  226. package/mcp-server/lib/http-handler.mjs +1 -1
  227. package/mcp-server/lib/knockout.mjs +435 -0
  228. package/mcp-server/lib/ops.mjs +4 -4
  229. package/mcp-server/lib/options.mjs +1 -1
  230. package/mcp-server/lib/plan.mjs +1 -1
  231. package/mcp-server/lib/runs.mjs +1 -1
  232. package/mcp-server/lib/scrub.mjs +2 -2
  233. package/mcp-server/lib/whatif.mjs +5 -5
  234. package/mcp-server/mint-token.mjs +1 -1
  235. package/mcp-server/package.json +2 -2
  236. package/mcp-server/packs/ops/EXAMPLES.md +2 -2
  237. package/mcp-server/server.mjs +77 -12
  238. package/package.json +30 -12
  239. package/portal-ui/dist/assets/{index-Ct3iQtZ2.css → index-1ziUJX1E.css} +43 -2
  240. package/portal-ui/dist/assets/{index-BUGgiYtF.js → index-CEYvXdqH.js} +226 -49
  241. package/portal-ui/dist/index.html +2 -2
  242. package/portal-ui/package.json +1 -1
  243. package/providers/_shared/enumerate.mjs +1 -1
  244. package/providers/_shared/ledger-path.mjs +3 -3
  245. package/providers/_shared/ledger.mjs +1 -1
  246. package/providers/_shared/result-shape.mjs +3 -3
  247. package/providers/_shared/term-shape.mjs +2 -2
  248. package/providers/corsearch/src/core.js +1 -1
  249. package/providers/jx-subclass/BUILDING.md +1 -1
  250. package/providers/oauth-mcp-bridge/CHANGELOG.md +6 -0
  251. package/providers/oauth-mcp-bridge/package.json +1 -1
  252. package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
  253. package/providers/uspto-local/src/index-store.js +2 -2
  254. package/scripts/README.md +1 -1
  255. package/scripts/added-reference-check.mjs +29 -1
  256. package/scripts/authority-boundary-probe.mjs +1 -1
  257. package/scripts/backfill-started-at.mjs +1 -1
  258. package/scripts/citation-line-check.mjs +124 -5
  259. package/scripts/compare.mjs +2 -2
  260. package/scripts/contract-dictation-scan.mjs +2 -2
  261. package/scripts/dead-names.mjs +1 -1
  262. package/scripts/drain-preflight.mjs +5 -5
  263. package/scripts/e2e-unread-terminals.mjs +1 -1
  264. package/scripts/e2e.mjs +8 -8
  265. package/scripts/env-audit.mjs +7 -7
  266. package/scripts/env-classify.mjs +206 -18
  267. package/scripts/freeze-example-run.mjs +3 -3
  268. package/scripts/head-arrived-gated.mjs +1 -1
  269. package/scripts/headless-page.mjs +51 -2
  270. package/scripts/live-surface-check.mjs +129 -19
  271. package/scripts/main-health.mjs +1 -1
  272. package/scripts/merge-presence-check.mjs +3 -3
  273. package/scripts/mint-suite-census.mjs +6 -6
  274. package/scripts/nightly-notice.mjs +1 -3
  275. package/scripts/preinstall-node-check.mjs +24 -0
  276. package/scripts/reconcile-runs.mjs +1 -1
  277. package/scripts/release-await-cut.mjs +6 -4
  278. package/scripts/release-version-pr-checks.mjs +1 -1
  279. package/scripts/release-version.mjs +2 -2
  280. package/scripts/render-check.mjs +66 -7
  281. package/scripts/report-frame-check.mjs +1 -1
  282. package/scripts/report-screenshot.mjs +1 -1
  283. package/scripts/revisit-render-check.mjs +1 -1
  284. package/scripts/score.mjs +4 -4
  285. package/scripts/strip-tracker-citations.mjs +139 -0
  286. package/scripts/test-run.mjs +19 -3
  287. package/scripts/third-party-notices.mjs +3 -3
  288. package/scripts/travelling-predicates.mjs +3 -3
  289. package/scripts/unexecuted-asserts.mjs +2 -2
  290. package/scripts/verify-publishable.mjs +2 -2
  291. package/scripts/write-up-form-census.mjs +1 -1
  292. package/shared/access-audience.mjs +1 -1
  293. package/shared/anon-overlay.mjs +3 -3
  294. package/shared/brand.mjs +13 -13
  295. package/shared/citation-scan.mjs +1 -1
  296. package/shared/client-door.mjs +7 -7
  297. package/shared/customer-store.mjs +1 -1
  298. package/shared/driver-dir.mjs +1 -1
  299. package/shared/env-aliases.mjs +0 -48
  300. package/shared/env-local.mjs +1 -1
  301. package/shared/identifier-scan.mjs +3 -3
  302. package/shared/invocation.mjs +29 -1
  303. package/shared/names-in-force.mjs +4 -0
  304. package/shared/node-floor.mjs +97 -0
  305. package/shared/product-owned-names.mjs +1 -1
  306. package/shared/register-selection.mjs +1 -1
  307. package/shared/scope.mjs +5 -5
  308. package/shared/server-units.mjs +4 -4
  309. package/shared/staff-domain.mjs +154 -0
  310. package/shared/store-in-repo.mjs +25 -4
  311. package/shared/suite-census.mjs +4 -4
  312. package/shared/tty-style.mjs +1 -1
  313. package/shared/uspto-index-size.mjs +1 -1
  314. package/shared/vacuous-pass.mjs +1 -1
  315. package/skills/clearotron-account/SKILL.md +42 -13
  316. package/skills/clearotron-ops/SKILL.md +1 -1
  317. package/driver/recipes/README.md +0 -49
  318. package/driver/skills/prelim-search/risk-framework-aurora.manifest.json +0 -19
  319. package/driver/skills/prelim-search/risk-framework-aurora.md +0 -77
  320. package/driver/skills/prelim-search/risk-framework-zephyr.manifest.json +0 -14
  321. package/driver/skills/prelim-search/risk-framework-zephyr.md +0 -33
  322. package/driver/skills/prelim-search/worked-examples-aurora.md +0 -10
  323. package/driver/skills/prelim-search/worked-examples-zephyr.md +0 -10
  324. package/driver/systemd/prelim-driver.path +0 -69
  325. package/driver/systemd/prelim-driver.service +0 -86
  326. package/driver/systemd/prelim-driver.timer +0 -14
  327. package/driver/systemd/prelim-outbox.path +0 -27
  328. package/driver/systemd/prelim-outbox.service +0 -37
  329. package/driver/systemd/prelim-outbox.timer +0 -21
  330. package/node_modules/exceljs/README_zh.md +0 -2878
  331. package/node_modules/exceljs/dist/LICENSE +0 -22
  332. package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
  333. package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
  334. package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
  335. package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
  336. package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
  337. package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
  338. package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
  339. package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
  340. package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
  341. package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
  342. package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
  343. package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
  344. package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
  345. package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
  346. package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
  347. package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
  348. package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
  349. package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
  350. package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
  351. package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
  352. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
  353. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
  354. package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
  355. package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
  356. package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
  357. package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
  358. package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
  359. package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
  360. package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
  361. package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
  362. package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
  363. package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
  364. package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
  365. package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
  366. package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
  367. package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
  368. package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
  369. package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
  370. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
  371. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
  372. package/node_modules/exceljs/dist/es5/index.js +0 -15
  373. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
  374. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
  375. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
  376. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
  377. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
  378. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
  379. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
  380. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
  381. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
  382. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
  383. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
  384. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
  385. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
  386. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
  387. package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
  388. package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
  389. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
  390. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
  391. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
  392. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
  393. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
  394. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
  395. package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
  396. package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
  397. package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
  398. package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
  399. package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
  400. package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
  401. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
  402. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
  403. package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
  404. package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
  405. package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
  406. package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
  407. package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
  408. package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
  409. package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
  410. package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
  411. package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
  412. package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
  413. package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
  414. package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
  415. package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
  416. package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
  417. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
  418. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
  419. package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
  420. package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
  421. package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
  422. package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
  423. package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
  424. package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
  425. package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
  426. package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
  427. package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
  428. package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
  429. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
  430. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
  431. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
  432. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
  433. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
  434. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
  435. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
  436. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
  437. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
  438. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
  439. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
  440. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
  441. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
  442. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
  443. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
  444. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
  445. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
  446. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
  447. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
  448. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
  449. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
  450. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
  451. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
  452. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
  453. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
  454. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
  455. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
  456. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
  457. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
  458. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
  459. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
  460. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
  461. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
  462. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
  463. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
  464. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
  465. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
  466. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
  467. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
  468. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
  469. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
  470. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
  471. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
  472. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
  473. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
  474. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
  475. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
  476. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
  477. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
  478. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
  479. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
  480. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
  481. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
  482. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
  483. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
  484. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
  485. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
  486. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
  487. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
  488. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
  489. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
  490. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
  491. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
  492. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
  493. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
  494. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
  495. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
  496. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
  497. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
  498. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
  499. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
  500. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
  501. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
  502. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
  503. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
  504. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
  505. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
  506. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
  507. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
  508. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
  509. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
  510. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
  511. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
  512. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
  513. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
  514. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
  515. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
  516. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
  517. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
  518. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
  519. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
  520. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
  521. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
  522. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
  523. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
  524. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
  525. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
  526. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
  527. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
  528. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
  529. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
  530. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
  531. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
  532. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
  533. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
  534. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
  535. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
  536. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
  537. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
  538. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
  539. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
  540. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
  541. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
  542. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
  543. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
  544. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
  545. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
  546. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
  547. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
  548. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
  549. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
  550. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
  551. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
  552. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
  553. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
  554. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
  555. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
  556. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
  557. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
  558. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
  559. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
  560. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
  561. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
  562. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
  563. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
  564. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
  565. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
  566. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
  567. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
  568. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
  569. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
  570. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
  571. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
  572. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
  573. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
  574. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
  575. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
  576. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
  577. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
  578. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
  579. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
  580. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
  581. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
  582. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
  583. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
  584. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
  585. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
  586. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
  587. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
  588. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
  589. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
  590. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
  591. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
  592. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
  593. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
  594. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
  595. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
  596. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
  597. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
  598. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
  599. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
  600. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
  601. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
  602. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
  603. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
  604. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
  605. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
  606. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
  607. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
  608. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
  609. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
  610. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
  611. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
  612. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
  613. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
  614. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
  615. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
  616. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
  617. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
  618. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
  619. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
  620. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
  621. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
  622. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
  623. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
  624. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
  625. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
  626. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
  627. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
  628. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
  629. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
  630. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
  631. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
  632. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
  633. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
  634. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
  635. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
  636. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
  637. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
  638. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
  639. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
  640. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
  641. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
  642. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
  643. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
  644. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
  645. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
  646. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
  647. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
  648. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
  649. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
  650. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
  651. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
  652. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
  653. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
  654. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
  655. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
  656. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
  657. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
  658. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
  659. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
  660. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
  661. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
  662. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
  663. package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
  664. package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
  665. package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
  666. package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
  667. package/node_modules/exceljs/dist/exceljs.js +0 -59900
  668. package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
  669. package/node_modules/exceljs/dist/exceljs.min.js +0 -45
  670. package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
  671. package/scripts/ai-page-render-check.mjs +0 -532
  672. package/scripts/clearances-render-check.mjs +0 -480
  673. package/scripts/composer-render-check.mjs +0 -1027
  674. package/scripts/deploy-test.sh +0 -309
  675. package/scripts/home-render-check.mjs +0 -526
  676. package/scripts/portal-lifecycle-check.mjs +0 -639
@@ -4,7 +4,7 @@
4
4
  //
5
5
  // One git-owned JSON file per customer under profiles/ — hand-authored, PR-reviewed, onboarded one
6
6
  // customer at a time. generic.json is the universal fallback and MUST exist;
7
- // aurora.json reproduces today's behavior exactly (the regression anchor). Every field shipped
7
+ // one test-suite profile reproduces today's behavior exactly (the regression anchor). Every field shipped
8
8
  // here has working machinery behind it — parked knobs live in profiles/README.md, not in the files.
9
9
  //
10
10
  // Resolution is FORWARDER-DOMAIN ONLY: the profile describes WHO ASKS US (the
@@ -143,10 +143,10 @@ export const SAFE_GRID_CELLS = 98;
143
143
  // A DENSE marketplace profile (long retail URLs + many listings per cell — e.g. beverages/supplements on
144
144
  // Amazon/GNC/iHerb) makes each grid cell ~5-10x heavier in OUTPUT BYTES than a sparse gaming-store cell, so
145
145
  // the cell-count budget above (calibrated on sparse stores) overflows the worker's output channel and the
146
- // verbatim stdout transcription truncates mid-JSON (Zephyr KINETIC, 2026-06-14: ~21 dense cells ≈ 20KB cut
146
+ // verbatim stdout transcription truncates mid-JSON (measured on a dense beverages profile, 2026-06-14: ~21 dense cells ≈ 20KB cut
147
147
  // the ledger unparseable). A dense profile gets a much smaller cell budget so each grid call's stdout stays
148
148
  // well under that ceiling (a 7-platform dense profile ⇒ floor 8 ⇒ batchSize 2 ⇒ ≤16 cells/call). The
149
- // gaming/Aurora budget is unchanged (default density = sparse).
149
+ // gaming budget is unchanged (default density = sparse).
150
150
  export const DENSE_GRID_CELLS = 16;
151
151
 
152
152
  // The two values a profile may hold, as a LIST rather than as a phrase repeated at each site.
@@ -238,6 +238,9 @@ export const KNOWN_PROFILE_KEYS = [
238
238
  // queue was a cost bomb the run-slot cap doesn't stop. Visible, git-tracked profile config (never a
239
239
  // hidden env var); enforced at the runner's admission chokepoint for BOTH doors (email + portal).
240
240
  "runCaps",
241
+ // AN ACCOUNT THE SUITE USES AND NO INSTALL OFFERS. `testFixture: true` keeps a profile in the tree,
242
+ // under its own name, and out of every roster this module resolves — see loadProfiles.
243
+ "testFixture",
241
244
  // THIS RECORD IS FICTION. `demoData: true` marks a profile as demo data, and a
242
245
  // real clearance refuses to start under it — at the runner's admission wall, so no door can miss it.
243
246
  //
@@ -276,6 +279,12 @@ export const CUSTOMER_ONLY_KEYS = [
276
279
  // may trigger (allowedRecipes) nor re-declare its jx deepening policy — both are the same
277
280
  // rating-authority-adjacent discipline as frameworkPath, one notch out.
278
281
  "allowedRecipes", "jxPolicy",
282
+ // WHETHER AN ACCOUNT IS OFFERED AT ALL is the account's own fact, and a project overlay must not touch
283
+ // it in either direction. Un-marking would put a test account into a customer's picker through an
284
+ // overlay nobody reviewed as identity; marking would hide a real account from its own owner. Same
285
+ // reasoning as `demoData` one notch out — that one decides whether fiction may spend money, this one
286
+ // decides whether it is visible, and neither is a project's to decide.
287
+ "testFixture",
279
288
  // Admission caps bind the ACCOUNT: a project widening its own caps would hollow the customer's.
280
289
  "runCaps",
281
290
  // Provenance binds the ACCOUNT and cannot be overlaid in either direction: a project marking a real
@@ -305,6 +314,7 @@ export const FIELD_CONSUMERS = {
305
314
  allowedRecipes: { file: "search-policy.mjs", symbol: "allowedRecipes" }, // entitlement gate on the resolved search selection
306
315
  jxPolicy: { file: "pipeline.mjs", symbol: "jxPolicy" }, // frozen into the run sidecar for the Stage-1.5 lanes (resume-safe)
307
316
  demoData: { file: "runner.mjs", symbol: "demoData" }, // the admission wall refuses a real clearance on demo data
317
+ testFixture: { file: "profiles.mjs", symbol: "loadProfiles" }, // never offered by a resolved roster; the suite asks for it by name
308
318
  runCaps: { file: "runner.mjs", symbol: "runCaps" }, // admission caps at claimAndPrep (queued + monthly, both doors)
309
319
  };
310
320
 
@@ -644,7 +654,7 @@ function readProfilesLayer(dir) {
644
654
  *
645
655
  * `dir` names the OVERLAY, not the whole store: passing it keeps the bundled set underneath, which is
646
656
  * what makes an empty store a working install. Pass `dir: null` for the bundled set alone. */
647
- export function loadProfiles({ dir, force = false } = {}) {
657
+ export function loadProfiles({ dir, force = false, includeTestFixtures, includeDemo } = {}) {
648
658
  // — LAYERING APPLIES ONLY TO THE ENV-RESOLVED STORE, and that boundary is deliberate.
649
659
  //
650
660
  // `dir` OMITTED => resolve the deployment's store, overlay over base. `dir` PASSED => that directory
@@ -659,7 +669,10 @@ export function loadProfiles({ dir, force = false } = {}) {
659
669
  const explicit = dir !== undefined;
660
670
  const overlay = explicit ? null : PROFILES_OVERLAY_DIR;
661
671
  const baseDir = explicit ? (dir || PROFILES_BASE_DIR) : PROFILES_BASE_DIR;
662
- const cacheKey = `${overlay ?? ""} :: ${baseDir}`;
672
+ // EVERY DIMENSION THAT CHANGES THE ANSWER IS IN THE KEY. A cache keyed on the directory alone
673
+ // serves the demo's roster to the next caller that did not ask for it, which is the defect this
674
+ // gate exists to prevent, arriving from inside.
675
+ const cacheKey = `${overlay ?? ""} :: ${baseDir} :: ${includeTestFixtures ?? "env"} :: ${process.env.CLEAROTRON_TEST_FIXTURE_PROFILES ?? ""} :: ${includeDemo ?? "env"} :: ${process.env.CLEAROTRON_DEMO_PROFILES ?? ""}`;
663
676
  if (cache && !force && cache.key === cacheKey) return cache.profiles;
664
677
 
665
678
  // FAIL LOUD ON AN UNREADABLE OVERLAY, the same ruling as the doctrine tree's. existsSync() answers
@@ -675,7 +688,7 @@ export function loadProfiles({ dir, force = false } = {}) {
675
688
  // chosen. driver/test/pool-admin-reassign.test.mjs asserts "with CLEAROTRON_CUSTOMERS_DIR unset it REFUSES
676
689
  // rather than validating against the demo roster", and mcp-server's roster boot check counts the
677
690
  // configured roster exactly. Layering the whole bundled set underneath a configured store would put
678
- // aurora/petcary/zephyr into every deployment's roster: a typo'd customer key would be checked
691
+ // the three test accounts into every deployment's roster: a typo'd customer key would be checked
679
692
  // against demo fixtures, and a boot check that says "N customers" would count ours among theirs.
680
693
  //
681
694
  // `generic` is different in kind from the rest of that directory. It is not a demo customer — it is
@@ -683,6 +696,84 @@ export function loadProfiles({ dir, force = false } = {}) {
683
696
  // is the one file whose absence makes an empty store a refusal, so that is the only one that falls
684
697
  // through. Everything else in a deployment's roster is the deployment's own.
685
698
  const profiles = overlay ? readProfilesLayer(overlay) : readProfilesLayer(baseDir);
699
+
700
+ // ── A TEST FIXTURE IS PRESENT AND NEVER OFFERED ─────────────────────────────────────────────────
701
+ //
702
+ // An outside user installed this product and their brand-owner picker offered three of our test
703
+ // accounts. The picker was not wrong: it listed the roster, and the roster was the bundled directory.
704
+ //
705
+ // `package.json` already excludes those files, and that exclusion works — the published tarball
706
+ // carries two profiles. It protects ONE route. `INSTALL.md` documents `git clone && npm install` as a
707
+ // first-class way in, and on that route nothing is excluded, the checkout IS the bundled directory,
708
+ // and every fixture loads. A packaging rule cannot answer a question the loader is asked.
709
+ //
710
+ // So the loader answers it. A profile marked `testFixture` is refused from the roster this returns, on
711
+ // every route, whether it was excluded from a tarball or not — and the suite asks for it by name.
712
+ //
713
+ // TWO FLAGS, TWO QUESTIONS, AND THE SECOND ONE'S ANSWER CHANGED. `testFixture` marks visibility:
714
+ // a suite fixture is never offered. `demoData` marks provenance: the account is fiction and the
715
+ // admission wall refuses a real clearance under it. This file argued that `demoData` must leave its
716
+ // account LISTABLE, because the demo needed to show it — true until the owner ruled otherwise on
717
+ // 2026-09-08. A fresh install now resolves `generic` alone, and the demo asks for its own account
718
+ // when it runs, so the demo account is refused here too. The flags stay separate because the
719
+ // questions are: a fixture is never shown to anybody, a demo account is shown to the demo.
720
+ //
721
+ // ONE ROSTER, NOT TWO. The tested set and the resolvable set are now the same files with a flag,
722
+ // rather than five profiles the suite exercises against two a customer receives. That disjoint pair is
723
+ // the defect this module's own header narrates from 2026-07-19, and a packaging-only fix recreates it.
724
+ //
725
+ // THE SUITE ASKS ONCE, BY ENVIRONMENT, RATHER THAN AT NINETY-FOUR CALL SITES. Most of the checks that
726
+ // need a fixture do not call this function — they exercise code that calls it, so there is no argument
727
+ // to pass. `scripts/test-run.mjs` sets the variable for every child, which keeps the ask visible in
728
+ // one place and OFF everywhere else, including any process that merely imports this module.
729
+ //
730
+ // That leaves the tested roster larger than the resolved one, which is the disjoint-roster shape this
731
+ // module's header narrates and the reason a packaging-only fix was refused. What makes it one roster
732
+ // rather than two is `a-clean-install-offers-generic-alone`: it names both sides — every file
733
+ // in the directory, and exactly what a resolved roster returns — so the difference between them is
734
+ // asserted rather than assumed, and adding a fixture without marking it reds that check.
735
+ //
736
+ // AN EXPLICIT ARGUMENT BEATS THE ENVIRONMENT, and the distinction is `undefined` rather than falsiness.
737
+ // The suite sets the variable for every child, so a check asking for the RESOLVED roster — the one a
738
+ // customer gets — would otherwise be handed the suite's own. Two of this change's own arms failed that
739
+ // way before this line: they asked for what an install offers and were told what the suite runs with.
740
+ const asked = includeTestFixtures !== undefined
741
+ ? includeTestFixtures
742
+ : String(process.env.CLEAROTRON_TEST_FIXTURE_PROFILES ?? "").trim() === "1";
743
+ if (!asked) for (const [k, p] of [...profiles]) if (p?.testFixture === true) profiles.delete(k);
744
+
745
+ // THE DEMO ACCOUNT IS NOT PART OF A FRESH INSTALL EITHER — owner ruling, 2026-09-08: a clean install
746
+ // resolves `generic` and nothing else, and the demo brings its own account when somebody runs it.
747
+ // Nobody should have to clean demo material out of an environment they just created.
748
+ //
749
+ // Same shape as the gate above and for the same reason: the packaging exclusion cannot answer this,
750
+ // because `git clone && npm install` is a documented route on which the checkout IS the bundled
751
+ // directory. The loader answers it on every route.
752
+ const askedDemo = includeDemo !== undefined
753
+ ? includeDemo
754
+ : String(process.env.CLEAROTRON_DEMO_PROFILES ?? "").trim() === "1";
755
+
756
+ // — AND IT GATES THE LAYER, NOT THE FLAG. The ruling is about the demo account this PRODUCT bundles.
757
+ // A deployment that put a `demoData` account in its OWN configured store chose to have it: that is an
758
+ // operator's decision about their own roster, and the admission wall still refuses a real clearance
759
+ // under it, so nothing is spent. Gating on the flag alone would have reached into a configured store
760
+ // and deleted an account nobody asked us to hide — the test deployment has one. When an overlay is
761
+ // configured this loader reads that store and not the bundled directory, so the question is which
762
+ // directory was actually read — NOT whether an overlay was set. An explicit `dir` pointing at a
763
+ // configured store leaves `overlay` null while reading somebody's own roster, and `!overlay` would
764
+ // have called that bundled and gated it.
765
+ const bundled = (overlay ?? baseDir) === PROFILES_BASE_DIR;
766
+ //
767
+ // THE MORE SPECIFIC FLAG DECIDES. Every shipped profile but `generic` carries `demoData`, the three
768
+ // suite fixtures included, so a demo gate applied to all of them would swallow a roster somebody had
769
+ // explicitly asked for: `includeTestFixtures: true` would return `generic` alone, silently, and a
770
+ // check that asks for its own fixtures would pass having exercised nothing. That is the same vacuous
771
+ // green two of this loader's own checks produced before the argument beat the environment. A fixture's
772
+ // visibility is answered by its own gate above; this one answers only for accounts that are demo data
773
+ // and nothing more specific.
774
+ if (!askedDemo && bundled) {
775
+ for (const [k, p] of [...profiles]) if (p?.demoData === true && p?.testFixture !== true) profiles.delete(k);
776
+ }
686
777
  if (overlay && !profiles.has("generic")) {
687
778
  const base = readProfilesLayer(baseDir);
688
779
  if (base.has("generic")) profiles.set("generic", base.get("generic"));
@@ -742,6 +833,32 @@ export function resolveProfile(job, { profiles = loadProfiles() } = {}) {
742
833
  const PROJECTS_SUBDIR = "projects";
743
834
  let projectCache = null;
744
835
 
836
+
837
+ /**
838
+ * Is `key` a profile that exists in one of these roots and is marked as a test fixture?
839
+ *
840
+ * Read from the FILE rather than from the roster, deliberately: the roster handed to the projects walk
841
+ * is the resolved one, which has already dropped every fixture — so asking it cannot tell "a fixture
842
+ * whose projects are beside it" from "a project directory whose customer is gone". Those want different
843
+ * answers and the file is the only place that still holds the difference.
844
+ */
845
+ function readProfileFlag(roots, key, flag) {
846
+ for (const root of roots) {
847
+ const f = join(root, `${key}.json`);
848
+ if (!existsSync(f)) continue;
849
+ try { return JSON.parse(readFileSync(f, "utf8"))?.[flag] === true; } catch { return false; }
850
+ }
851
+ return false;
852
+ }
853
+
854
+ const isTestFixtureKey = (roots, key) => readProfileFlag(roots, key, "testFixture");
855
+
856
+ /** Is this project directory's customer an account the DEMO brings, rather than one this install has?
857
+ * Read from the FILE for the same reason as the fixture check beside it: the roster handed to this walk
858
+ * has already dropped the account, so asking the roster cannot tell "the demo's, and hidden" from "the
859
+ * customer is gone", and the second is an authoring error that must still hard-fail. */
860
+ const isDemoKey = (roots, key) => readProfileFlag(roots, key, "demoData");
861
+
745
862
  /** Load every profiles/projects/<customer>/<slug>.json → Map("<customer>/<slug>" → overlay). Each overlay is
746
863
  * validated in SPARSE mode (PROJECT_KEYS optional, customer-only keys rejected) and carries its lifted-out
747
864
  * `projectName` (default = slug) + optional sibling `<slug>.context.md`. A project directory under an unknown
@@ -778,8 +895,22 @@ export function loadProjects({ dir, profiles, force = false } = {}) {
778
895
  for (const ent of readdirSync(projDir, { withFileTypes: true })) {
779
896
  if (!ent.isDirectory()) continue; // only <customer>/ subdirs participate; a stray file is ignored
780
897
  const ck = ent.name;
781
- if (!roster.has(ck))
898
+ // A PROJECT UNDER A TEST FIXTURE IS SKIPPED, NOT A FAULT. The refusal below is right and stays: a
899
+ // project directory with no customer is a typo or a half-deleted account, and resolving it silently
900
+ // would attach an overlay to nothing. But a fixture's own projects are in the same checkout as the
901
+ // fixture, and the roster no longer offers the fixture — so on a clone install this refusal would
902
+ // fire on the product's own files and stop the process at load. Skipped by reading the fixture
903
+ // marker from the file, because the roster this walk was handed is the one that already dropped it.
904
+ if (!roster.has(ck)) {
905
+ if (isTestFixtureKey(roots, ck)) continue;
906
+ // AND THE DEMO'S OWN PROJECTS, for the identical reason. `profiles/projects/demo-brand-owner/`
907
+ // ships, and since a fresh install stopped resolving that account this walk met a project whose
908
+ // customer it could not see — a HARD startup failure, from the product's own files, on every
909
+ // clean install. Caught by the arm below, not by review; it is the third time this shape has been
910
+ // found in this loader.
911
+ if (isDemoKey(roots, ck)) continue;
782
912
  throw new Error(`profiles/projects/${ck}/: no customer profile "${ck}" — a project must live under a known customer (add profiles/${ck}.json first)`);
913
+ }
783
914
  const cdir = join(projDir, ck);
784
915
  for (const f of readdirSync(cdir).filter((n) => n.endsWith(".json")).sort()) {
785
916
  const slug = f.replace(/\.json$/, "");
@@ -845,7 +976,7 @@ export function resolveEffectiveProfile(job, { profiles = loadProfiles(), projec
845
976
  //
846
977
  // The customer's platforms are CLIENT-MANDATED — the account asked for those marketplaces to be
847
978
  // searched, and a project may add to that instruction but never revoke it. Replace semantics meant a
848
- // project that stated its own marketplaces silently DELETED the customer's: the Aurora Interactive account
979
+ // project that stated its own marketplaces silently DELETED the customer's: one test account
849
980
  // names 7 games storefronts, its console-ecosystem project names 9 mostly-retail sites, and every run
850
981
  // of that project searched the 9 — dropping store.epicgames.com, itch.io, apps.microsoft.com and
851
982
  // mobygames.com. The report still read as clean coverage, because the sweep faithfully covered the
@@ -882,16 +1013,17 @@ export function resolveEffectiveProfile(job, { profiles = loadProfiles(), projec
882
1013
  //
883
1014
  // Attached here rather than threaded through four call sites because this is the one place that KNOWS
884
1015
  // — every caller that resolves a profile now carries its provenance whether or not it thought to ask,
885
- // and 's hand-bridge at the §B2 door (`{...profile, origins }`) becomes a no-op rather than the
1016
+ // and the hand-bridge at the §B2 door (`{...profile, origins }`) becomes a no-op rather than the
886
1017
  // only correct call site. The sibling stays in the return for the callers that read it directly.
887
1018
  return { profile: { ...profile, origins }, projectKey: overlay.projectKey, projectName: overlay.projectName, origins };
888
1019
  }
889
1020
 
890
1021
  /** The self-exclusion gate: a profile's selfExclusionOwners[]
891
- * may only inject when the job's APPLICANT is the profile's customer — an aurora-interactive.example-forwarded
892
- * search for a third-party applicant must NOT classify Aurora-owned conflicts as own rights
893
- * (that would delete true conflicts from a delivered clearance). Word-boundary containment of the
894
- * profile name in the applicant string ("Aurora Interactive" ⊂ "Aurora Interactive Ltd"), never fuzzy. */
1022
+ * may only inject when the job's APPLICANT is the profile's customer — a search forwarded from a
1023
+ * customer's own domain, but asking about a THIRD-PARTY applicant, must not classify that
1024
+ * customer's conflicts as own rights (that would delete true conflicts from a delivered
1025
+ * clearance). Word-boundary containment of the profile name in the applicant string
1026
+ * ("Foxglade Interactive" ⊂ "Foxglade Interactive Ltd"), never fuzzy. */
895
1027
  export function applicantMatchesProfile(profile, customer) {
896
1028
  const n = (s) => String(s ?? "").toLowerCase().replace(/[^a-z0-9 ]+/g, " ").replace(/\s+/g, " ").trim();
897
1029
  const c = n(customer);
@@ -8,7 +8,7 @@
8
8
  // 1. <runDir>/status.json — the machine-readable per-run truth (travels into the archive on
9
9
  // success, since the run-dir is renamed there).
10
10
  // 2. <studioRoot>/STATUS.md — a human-readable rollup of recent runs, newest-first, the ONE file
11
- // the prelim-status skill reads to answer "where is it at?".
11
+ // the clearotron-status skill reads to answer "where is it at?".
12
12
  //
13
13
  // Both writes are atomic (temp + rename) and idempotent — status is DERIVED from the current run, never
14
14
  // blindly incremented — so the resumable pipeline can re-drive a run without corrupting either file.
@@ -440,15 +440,15 @@ export function lineFor(s) {
440
440
  // 2026-07-04 incident: STATUS.md showed marble-spire as plain "delivered" and VENZY as plain
441
441
  // "FAILED" while BOTH still had their email/WhatsApp queued (sendPending) behind a wedged outbox
442
442
  // lane — so the heartbeat completion-watch read the rollup, saw nothing pending, and stood down.
443
- // The rollup now carries the send state loudly; prelim-deliver flips sendPending:false on send.
444
- const pending = s.sendPending === true ? " — 📮 SEND PENDING (email/WhatsApp NOT yet out — run prelim-deliver)" : "";
443
+ // The rollup now carries the send state loudly; clearotron-deliver flips sendPending:false on send.
444
+ const pending = s.sendPending === true ? " — 📮 SEND PENDING (email/WhatsApp NOT yet out — run clearotron-deliver)" : "";
445
445
  if (s.state === "delivered") {
446
446
  const v = s.verdict ? ` (${s.verdict})` : "";
447
447
  return `- ${head} — delivered${v}${s.url ? ` — ${s.url}` : ""}${pending}`;
448
448
  }
449
449
  if (s.state === "failed") {
450
450
  const at = s.failedStage ?? s.lastStage ?? stepTxt;
451
- return `- ${head} — ⚠️ FAILED at ${at}${s.reason ? ` — ${trunc(s.reason)}` : ""}${pending ? " — 📮 FAILURE NOTICE PENDING (run prelim-deliver)" : ""}`;
451
+ return `- ${head} — ⚠️ FAILED at ${at}${s.reason ? ` — ${trunc(s.reason)}` : ""}${pending ? " — 📮 FAILURE NOTICE PENDING (run clearotron-deliver)" : ""}`;
452
452
  }
453
453
  if (s.state === "recovering") {
454
454
  // 2026-07-04 production doctrine: a recoverable failure AUTO-RESUMES — the report is still owed.
@@ -513,8 +513,8 @@ export function rollupStatus(studioRoot) {
513
513
  .sort((a, b) => String(b.updatedAt ?? "").localeCompare(String(a.updatedAt ?? "")))
514
514
  .slice(0, MAX_RUNS);
515
515
  const agent = agentFromStudioRoot(studioRoot);
516
- const body = runs.length ? runs.map(lineFor).join("\n") : "_No prelim searches running or recently finished._";
517
- const md = `# Prelim-search status — ${agent}\n_updated ${nowISO()}_\n\n${body}\n`;
516
+ const body = runs.length ? runs.map(lineFor).join("\n") : "_No clearotron searches running or recently finished._";
517
+ const md = `# Clearotron-search status — ${agent}\n_updated ${nowISO()}_\n\n${body}\n`;
518
518
  atomicWrite(join(studioRoot, "STATUS.md"), md);
519
519
  } catch { /* never throw */ }
520
520
  }
@@ -48,7 +48,7 @@ export const KINDS = ["search", "record_fetch", "image", "phoneme", "batch_scree
48
48
  // The gateway namespaces the driver's --session-key as `agent:<agentId>:<key>` before it reaches the
49
49
  // plugin (confirmed on the first live run: sessionKey = `agent:clawdi:prelim-<slug>-<codename>-…`). Strip
50
50
  // that leading `agent:<id>:` namespace so the run prefix anchors at the real start of the caller's key —
51
- // otherwise a bare startsWith("prelim-…") matches nothing.
51
+ // otherwise a bare startsWith("clearotron-…") matches nothing.
52
52
  function stripGatewayNs(s) {
53
53
  return typeof s === "string" ? s.replace(/^agent:[^:]+:/, "") : "";
54
54
  }
@@ -74,7 +74,7 @@ export function resolveDemoData({
74
74
  /**
75
75
  * The demonstration note for a MARKDOWN surface.
76
76
  *
77
- * 's acceptance 3 asks for the banner on "the grouped knockout page … the one a
77
+ * That acceptance 3 asks for the banner on "the grouped knockout page … the one a
78
78
  * reader opens first". THAT PAGE DOES NOT EXIST: `knockout.mjs` states in its own header that a
79
79
  * multi-mark run "writes no `report.html` AT ALL — the documents are `report-<slug>.html`, one per
80
80
  * mark", and that `report.md` "is the ONLY file that names every mark together". It is also written
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
3
- // Pure-code publish step for the prelim-driver: takes a finished run's two contract markdown files
3
+ // Pure-code publish step for the clearotron-driver: takes a finished run's two contract markdown files
4
4
  // (report.md + audit.md, written by the report-synthesis / audit-emit stages) and renders + writes the
5
5
  // delivery artifacts into the pool (`config.poolRoot`, which since has NO default — unset refuses),
6
6
  // then regenerates the index.
@@ -463,7 +463,7 @@ export function regenIndex(poolDir) {
463
463
  // Do NOT chmod the customer dirs: they inherit the set-gid pool group (an explicit dir chmod here was the
464
464
  // 2026-06-02→-06-08 Caddy-403 bug — see the publishReport comment). Only the index FILES get 0o640.
465
465
  // The page heading speaks the customer's DISPLAY name (profile .name), never the internal key slug —
466
- // "Trademark clearance — aurora" read as an internal id on a client-facing page. Best-effort: profiles
466
+ // "Trademark clearance — foxglade" read as an internal id on a client-facing page. Best-effort: profiles
467
467
  // unreadable ⇒ fall back to the filter label (the runs' client string) ⇒ the key (displayOf, built above).
468
468
  for (const [key, crs] of byCustomer) {
469
469
  // LEAK-#9 fail-closed: NEVER emit a client-facing customer/generic/index.html. 'generic' is the shared
@@ -702,7 +702,7 @@ export async function publishReport({ runId, codename, reportMd, auditMd, findin
702
702
  let findings = [], coverage = [], contextNotes = [], quarantined = [], findingsError = null, coverageJudgment = null, markAssessment = null, actionsRegister = null, askAnswers = null, correctionsDoc = null, fourAnswers = null;
703
703
  // — the DECLARED findings contract version, threaded to the renderer so the grouped
704
704
  // reasoned-negative section fires only on a v6 record. Stays null on the lenient/error paths: fail
705
- // closed, an unknown version renders the pre- section.
705
+ // closed, an unknown version renders the pre-change section.
706
706
  let findingsSchemaVersion = null;
707
707
  // — THE STORES THIS PUBLISH DID NOT FIND. Declared in publish/publish-inputs.mjs, read through
708
708
  // its three-state helper, and recorded onto meta.clientGate below. Before this list existed an absent
@@ -981,7 +981,7 @@ export async function publishReport({ runId, codename, reportMd, auditMd, findin
981
981
  // `gateViolations` — those are LOGGED for observability but never a reason to drop the download. (An earlier
982
982
  // version made the gate fatal, so a legitimately-sparse run — e.g. no bound Class — silently lost its Excel.)
983
983
  // The run's REPORT IDENTITY, off the same registry row that chose its machinery. The FROZEN policy
984
- // sidecar names WHICH level ran; the registry names what that level is called TODAY (, one
984
+ // sidecar names WHICH level ran; the registry names what that level is called TODAY (one
985
985
  // numbering system — reportIdentityFor is registry-first, sidecar label only for a level the registry
986
986
  // no longer knows). So a republished pre-renumber run renders under the current scale, deliberately.
987
987
  // A run with no sidecar (every run older than the level registry) yields undefined and renders
@@ -1189,7 +1189,10 @@ export async function publishReport({ runId, codename, reportMd, auditMd, findin
1189
1189
 
1190
1190
  const total = skipRegen ? null : regenIndex(poolRoot);
1191
1191
  if (!skipRegen) await regenSurfaces(poolRoot);
1192
- const url = poolUrl ? `${String(poolUrl).replace(/\/$/, '')}/${runId}/report.html` : null;
1192
+ // THE PORTAL ROUTE, not the pool's directory layout (tracker issue 289). This was
1193
+ // `<origin>/<runId>/report.html` — where the documents sit on disk, which is not an application route.
1194
+ // Composed rather than spelled here so the report link is built the same way the audit link always was.
1195
+ const url = reportRouteFor(poolUrl, runId);
1193
1196
  return { runId, auditFile, counts, total, url, poolRunDir, auditError, findingsError, customerKey: customerKey || 'generic', clientGate };
1194
1197
  }
1195
1198
 
@@ -1241,7 +1244,21 @@ export function accessNoteHtml(font, domain = config.accessDomain) {
1241
1244
  * the edge's own legacy-report regexp character for character, so this function admits exactly the URLs the
1242
1245
  * deployment admits and no others.
1243
1246
  */
1244
- const REPORT_PATH_RE = /^\/([A-Za-z0-9][A-Za-z0-9._-]{0,180})\/report\.html$/;
1247
+ // ── TWO SHAPES, AND THE SECOND ONE IS HISTORY (tracker issue 289) ────────────────────────────────────
1248
+ //
1249
+ // The block quoted above describes an edge rewrite that IS NOT IN FORCE ON PRODUCTION. Settled by the
1250
+ // account owner against the live deployment, signed in as a delivered run's own owner: the emailed link
1251
+ // returned the portal application's own `{"error":"not_found"}` — the app answered, so nothing rewrote
1252
+ // the path ahead of it — while the portal's own link for that same run opened. The prose above, and the
1253
+ // notes in portal-service.mjs and publish/knockout.mjs that lean on it, describe a config that does not
1254
+ // live in this repository and were transcribed when it was true somewhere. A transcription is a claim
1255
+ // about a host at the moment somebody wrote it down, not a fact about the host today.
1256
+ //
1257
+ // So reports are addressed at the portal route now (reportRouteFor), and this pattern keeps matching the
1258
+ // LEGACY shape as well for one reason: `auditUrlFor` derives the workbook link by parsing the report URL,
1259
+ // and an archived run re-published from its stored legacy URL must not silently lose its audit link. The
1260
+ // two alternatives are read in one place so a future reader cannot fix one and miss the other.
1261
+ const REPORT_PATH_RE = /^\/(?:portal\/report\/([A-Za-z0-9][A-Za-z0-9._-]{0,180})\/?|([A-Za-z0-9][A-Za-z0-9._-]{0,180})\/report\.html)$/;
1245
1262
 
1246
1263
  // The run id as the edge and the portal both spell it: one path segment, no separators, no traversal.
1247
1264
  // Same character class as REPORT_PATH_RE's capture and as portal-service's own slug gate, because a
@@ -1261,6 +1278,29 @@ export function auditRouteFor(origin, runId) {
1261
1278
  return `${String(origin).replace(/\/$/, '')}/portal/report/${runId}/audit.xlsx`;
1262
1279
  }
1263
1280
 
1281
+ /**
1282
+ * THE REPORT'S ROUTE, from an origin and a run id (tracker issue 289).
1283
+ *
1284
+ * The delivered link used to be the pool's directory layout pasted behind the public origin —
1285
+ * `<origin>/<runId>/report.html` — which is where the documents sit on disk and is not an application
1286
+ * route. It resolved only where an edge rewrite happened to claim it, and on production no such rewrite
1287
+ * is in force: the emailed link returned the portal's own `{"error":"not_found"}` for the run's OWN
1288
+ * owner. Every delivered report on both lanes carried it, on all three surfaces that quote the URL.
1289
+ *
1290
+ * Composed here, beside auditRouteFor and markReportRouteFor, so the three links a delivery carries are
1291
+ * built by three functions with one idea of where the portal lives. That is the property worth having:
1292
+ * the audit link has been correct throughout precisely because it was composed against the route instead
1293
+ * of derived from the file layout, and this makes the report link the same kind of thing.
1294
+ *
1295
+ * A link the portal will refuse is worse than none, so an unconfigured origin or a run id that is not a
1296
+ * single clean path segment yields null — the same posture auditRouteFor takes, and the caller already
1297
+ * treats null as "no link on any surface".
1298
+ */
1299
+ export function reportRouteFor(origin, runId) {
1300
+ if (!origin || !runId || !RUN_SEGMENT_RE.test(String(runId))) return null;
1301
+ return `${String(origin).replace(/\/$/, '')}/portal/report/${runId}/`;
1302
+ }
1303
+
1264
1304
  /**
1265
1305
  * ONE MARK'S DOCUMENT in a batch, at the address the portal serves it from.
1266
1306
  *
@@ -1292,7 +1332,8 @@ export function auditUrlFor(reportUrl, auditFile) {
1292
1332
  let u;
1293
1333
  try { u = new URL(String(reportUrl)); } catch { return null; }
1294
1334
  const m = REPORT_PATH_RE.exec(u.pathname);
1295
- return m ? auditRouteFor(u.origin, m[1]) : null;
1335
+ // Group 1 is the portal shape, group 2 the legacy one — exactly one of them matches.
1336
+ return m ? auditRouteFor(u.origin, m[1] ?? m[2]) : null;
1296
1337
  }
1297
1338
 
1298
1339
  /**
@@ -1385,7 +1426,7 @@ export const RISK_TIERS = [
1385
1426
  [/LOW/, { bg: '#4472C4', fg: '#fff', label: 'LOW', txt: '#2f55a4' }],
1386
1427
  ];
1387
1428
  // doc 50 — the run's band LADDER (from opts.bands / meta.framework.bands): per-run vocabulary with the
1388
- // same template palette keyed by TONE, so "Moderate" (house) and "Medium" (zephyr) both colour correctly
1429
+ // same template palette keyed by TONE, so "Moderate" (house) and "Medium" (a customer ladder) both colour correctly
1389
1430
  // and a 5-band matrix framework (incl. "Low") lands on the same ramp. Set per compose; null = legacy.
1390
1431
  let EMAIL_BANDS = null;
1391
1432
  export const TONE_TIER = {
@@ -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,18 @@ 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 = []; }
373
+ // The request the run was given, read the same tolerant way as the sidecars above and for the same
374
+ // reason (tracker issue 331 A.1). It is what "About this request" states; a run archived before the
375
+ // sidecar existed has none, and its page renders exactly as it was delivered.
376
+ let instructedScope = null;
377
+ try { instructedScope = JSON.parse(readFileSync(driverDir(runDir, 'instructed-scope.json'), 'utf8')); }
378
+ catch { instructedScope = null; }
361
379
 
362
380
  // ── — THIS LANE HAD NO RECORD-ORIGIN LOGIC AT ALL ─────────────────────────────────────────────
363
381
  //
@@ -473,12 +491,22 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
473
491
  // "every audit link we have ever emailed died at the front door, silently". It came back here twice:
474
492
  // once as string surgery on the report URL, once as this function, and both spelled a pool path.
475
493
  //
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.
494
+ // A SINGLE MARK USED TO KEEP THE LEGACY SHAPE, on the reasoning that `<runId>/report.html` is what the
495
+ // rewrite exists for and that it resolves. THAT IS FALSE ON PRODUCTION (tracker issue 289) and the
496
+ // paragraph is kept, corrected, because its warning is still the right instinct and only its premise
497
+ // was wrong.
498
+ //
499
+ // Settled by the account owner against the live deployment, signed in as a delivered run's own owner:
500
+ // the emailed link returned the portal application's own `{"error":"not_found"}` — the app answered, so
501
+ // no rewrite touched the path — while the portal's own link for that run opened. The edge block this
502
+ // reasoning rests on is not in this repository, and the transcription of it in the test tree describes
503
+ // a host at the moment somebody wrote it down, not production today.
504
+ //
505
+ // The warning it ends with — changing a link that works to match one that did not — is why this was
506
+ // checked against the live thing before being changed rather than after.
479
507
  const origin = poolUrl ? String(poolUrl).replace(/\/$/, '') : null;
480
508
  const reportUrlFor = (slug) => !origin ? null
481
- : single ? `${origin}/${runId}/report.html`
509
+ : single ? reportRouteFor(origin, runId)
482
510
  : markReportRouteFor(origin, runId, slug);
483
511
  // — resolved once for the whole publish, off the same two sources the clearance
484
512
  // publisher uses (frozen sidecar, then roster; either marks, neither un-marks).
@@ -512,7 +540,7 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
512
540
  };
513
541
  const markBand = single ? overall : worstBand(framework, [m]);
514
542
  writeRO(file, renderKnockoutHtml(one, framework, {
515
- runId, overall: markBand, issued, auditFile, probeRan, registerCounts, registerRecords, identity, matter: runId,
543
+ runId, overall: markBand, issued, auditFile, probeRan, registerCounts, registerRecords, ownerChecks, instructedScope, identity, matter: runId,
516
544
  // — an invented mark says so on its own report. Resolved ONCE above the loop:
517
545
  // the answer is a property of the run, and asking per mark would let a multi-mark demo mark some
518
546
  // documents and not others if the roster moved mid-publish.
@@ -528,7 +556,7 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
528
556
  // native-render path has been reading for since before anything wrote it. One per report, so the
529
557
  // native render of a per-mark document is that mark's data and not the batch's.
530
558
  writeRO(dataFile, JSON.stringify(knockoutReportData(one, framework, {
531
- runId, codename, overall: markBand, issued, registerCounts, registerRecords, auditFile, customerKey, matter: runId,
559
+ runId, codename, overall: markBand, issued, registerCounts, registerRecords, ownerChecks, auditFile, customerKey, matter: runId,
532
560
  identity: { ...identity, level: searchPolicy?.level ?? null },
533
561
  url: reportUrlFor(slug),
534
562
  }), null, 2));
@@ -628,7 +656,7 @@ export async function publishKnockout({ runId, codename, runDir, findings, plan,
628
656
  // WHICH DOCUMENTS THIS RUN PUBLISHED, and for which name. Every reader that has to open,
629
657
  // serve or link a knockout's reports takes the list from here rather than deriving a filename: the
630
658
  // 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
659
+ // nobody re-implements it. Absent on every pre-change meta, which is exactly the run that has one
632
660
  // report at `report.html` — so a reader that falls back to that name on absence is reading the
633
661
  // archive correctly, not guessing.
634
662
  // — `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