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
package/bin/start.mjs CHANGED
@@ -75,7 +75,7 @@
75
75
  // long-lived engine credential is written to disk by a command whose job is to show you the product.
76
76
 
77
77
  import { envLocalPath, envFileRead } from "../shared/env-local.mjs"; // side effect: apply this install's .env when THIS file is the CLI entry (never on library import)
78
- import { systemdFailure, systemdSaid, CAPTURE_STDERR } from "../shared/systemd-failure.mjs"; // tracker issue 203 — a refusal, not a stack trace
78
+ import { systemdFailure, systemdSaid, CAPTURE_STDERR } from "../shared/systemd-failure.mjs"; // a refusal, not a stack trace
79
79
  import { writeSecretFile } from "../shared/secret-file.mjs"; // one atomic write for every file holding credentials, and it creates the directory
80
80
  // — ONE AUTHORITY for what a clearance needs from its environment, used twice
81
81
  // below: to COMPOSE the units' environment and to GUARD it before this command reports success. The
@@ -129,7 +129,10 @@ import { isEntrypoint } from "../shared/is-entrypoint.mjs"; // — one entry-p
129
129
  import { productIdentity } from "../shared/product-identity.mjs"; // AGPL §13 — one answer, three surfaces
130
130
  import { pinEnvAll } from "../shared/env-aliases.mjs"; // — a pin that names one spelling has set nothing that wins
131
131
  import { BRAND } from "../shared/brand.mjs"; // — the installer's own name, from the tenant seam
132
- import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; // tracker issue 160 — never serve a bundle older than its sources
132
+ import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; // never serve a bundle older than its sources
133
+ // ONE CLASSIFIER FOR WHAT A STAFF RULE ADMITS, shared with the setup wizard. Two copies of this
134
+ // judgement would be a wizard that asks about one rule and a launcher that writes another.
135
+ import { classifyStaffDomain, staffDomainRefusal, staffGrantSentence } from "../shared/staff-domain.mjs";
133
136
 
134
137
  const REPO = join(dirname(fileURLToPath(import.meta.url)), "..");
135
138
  const ENV_PATH = envLocalPath({ repoRoot: REPO }); // resolved, never composed: one resolver, so moving this file later is one line
@@ -321,7 +324,7 @@ export function portsForFlag(portFlag, ports, env = {}) {
321
324
  /**
322
325
  * Where the grants file is, for a command that is NOT the supervisor.
323
326
  *
324
- * — bb8's F13. `start` injects CLEAROTRON_ACCESS_FILE into the environment of
327
+ * — found in review. `start` injects CLEAROTRON_ACCESS_FILE into the environment of
325
328
  * the services it supervises (see the child env below) and never persists it, so the door finds the
326
329
  * roster and every sibling CLI in the operator's own shell does not. `clearotron grant` then refused
327
330
  * with "Set CLEAROTRON_ACCESS_FILE" — a variable nothing writes — and enrolling a client had no working
@@ -366,6 +369,11 @@ export function installPaths(base) {
366
369
  };
367
370
  }
368
371
 
372
+ /** A staff rule this command will not build. Carries the sentence the operator reads, and why. */
373
+ export class StaffDomainRefused extends Error {
374
+ constructor(domain, message) { super(message); this.name = "StaffDomainRefused"; this.domain = domain; }
375
+ }
376
+
369
377
  /**
370
378
  * The one address that signs in, and the staff domain derived from it.
371
379
  *
@@ -374,10 +382,61 @@ export function installPaths(base) {
374
382
  * it safe here and would not be safe on a hosted instance. Without it the sign-in succeeds and every
375
383
  * page 403s, because signing in is not being enrolled (portal-access.mjs decides that, and it is
376
384
  * deliberately blind to which door you came through).
385
+ *
386
+ * ── AND THAT PARAGRAPH IS ONLY TRUE OF `<account>@localhost` ─────────────────────────────────────────
387
+ *
388
+ * "admits exactly that address and nobody else" is a property of the DOMAIN, not of the mode. It holds
389
+ * for `localhost`. It does not hold for a domain other people have addresses at: the rule this line
390
+ * produces from `alex@a-firm.example-tld` says *anyone at that domain*, the settings page then reports
391
+ * it back in those words, and on a deployment where identity arrives from an external login system the
392
+ * domain is the whole of the check. Nobody was asked, and there is nothing on the box recording that a
393
+ * grant was made.
394
+ *
395
+ * So the derivation now refuses the domains that can never be a staff rule — a webmail provider, a
396
+ * documentation domain — and hands anything wider than one machine back to the caller to state and
397
+ * confirm. `shared/staff-domain.mjs` is the one classifier, shared with the setup wizard, so the
398
+ * question the wizard asks and the rule this command builds cannot drift apart.
399
+ *
400
+ * An UNPARSEABLE address still returns `""`, and that is not the same answer as a refusal: nothing was
401
+ * classified, so nothing was decided. The caller already refuses a non-address one line earlier.
377
402
  */
378
403
  export function staffDomainFor(email) {
379
404
  const at = String(email ?? "").lastIndexOf("@");
380
- return at > 0 ? String(email).slice(at + 1).toLowerCase() : "";
405
+ const domain = at > 0 ? String(email).slice(at + 1).toLowerCase() : "";
406
+ if (!domain) return "";
407
+ const refusal = staffDomainRefusal(domain);
408
+ if (refusal) throw new StaffDomainRefused(domain, refusal);
409
+ return domain;
410
+ }
411
+
412
+ /**
413
+ * What to say when the derived domain is a real one — wider than this machine, and never assumed.
414
+ *
415
+ * A REFUSAL RATHER THAN A PROMPT, and the reason is that this command has no reader. `start` runs from
416
+ * a script, from `--background`, and from a service manager as often as from a terminal; a question
417
+ * asked there either hangs or is answered by whatever happens to be on stdin. Every other decision on
418
+ * this boundary already refuses instead — an unset access file, a multi-`@` identity, local mode off
419
+ * loopback — so this is the idiom the rest of the door speaks.
420
+ *
421
+ * The consent itself lives where a person is definitionally present: `clearotron install` asks for the
422
+ * address, shows this same sentence, and writes the answer down as an explicit `PORTAL_STAFF_DOMAINS`.
423
+ * After that the `||` above this call short-circuits and the derivation is never reached again.
424
+ */
425
+ export function wideStaffDomainRefusal({ user, domain, envPath }) {
426
+ return `${user} would make every address at ${domain} an administrator of this install.\n`
427
+ + "\n"
428
+ + ` The rule that would be written is: ${staffGrantSentence(domain, { staffLabel: `${BRAND.name} staff` })}\n`
429
+ + "\n"
430
+ + " That is a grant to a group, and this command will not make one on your behalf. Pick the one\n"
431
+ + " that is true here:\n"
432
+ + "\n"
433
+ + ` · only you use this machine — start without --user, or use ${String(user).slice(0, String(user).lastIndexOf("@"))}@localhost.\n`
434
+ + ` The rule is then this machine and nobody else, and nothing is granted to anyone.\n`
435
+ + ` · your colleagues at ${domain} should all be administrators — say so once, in writing:\n`
436
+ + ` PORTAL_STAFF_DOMAINS=${domain}\n`
437
+ + ` in ${envPath}, or in the environment. The settings page then names that file as where the\n`
438
+ + " rule came from, so whoever reads it later can undo it.\n"
439
+ + ` · run \`${invocationPrefix()}clearotron install\`, which asks for the address and this question with it.`;
381
440
  }
382
441
 
383
442
  /**
@@ -424,9 +483,12 @@ const unitTypeOf = (u) => {
424
483
  // cost is the admission cap: counts are serial per queue while queues drain concurrently, so two
425
484
  // claimers can overshoot a per-account cap by a bounded one per queue. A bounded overshoot is not a
426
485
  // reason to leave a retired unit running when disarming it is one call.
427
- export const BACKGROUND_RETIRED = Object.freeze([
428
- "prelim-driver.service", "prelim-driver.timer", "prelim-driver.path",
429
- ]);
486
+ // EMPTY, AND KEPT RATHER THAN DELETED. The retired path-watcher/timer units it named are gone from the
487
+ // tree, so naming them here would describe files this repo does not ship — which is exactly what the
488
+ // "every retired unit is a unit this repo actually ships" check refuses. The export stays because the
489
+ // next retirement wants somewhere to go, and an empty list is a statement that nothing is currently
490
+ // retired-but-shipped.
491
+ export const BACKGROUND_RETIRED = Object.freeze([]);
430
492
 
431
493
  export const BACKGROUND_EXCLUDED = Object.freeze({
432
494
  // ── `clearotron-client-mcp.service` LEFT THIS TABLE ON 2026-09-03, AND SAYING SO IS THE POINT ────
@@ -436,7 +498,7 @@ export const BACKGROUND_EXCLUDED = Object.freeze({
436
498
  // that included it would have made that consent meaningless. That reasoning was right under that
437
499
  // ruling and the exclusion was not an oversight.
438
500
  //
439
- // The owner superseded it knowingly (, settled point 2): the door auto-starts with
501
+ // The owner superseded it knowingly (settled point 2): the door auto-starts with
440
502
  // the product and the per-account key is the gate. It is now in SERVER_INSTALL_SET — which IS
441
503
  // BACKGROUND_UNITS — and the pin/exclusion partition means it cannot be in both, so the row is gone
442
504
  // rather than reworded. `--background` writes its settings from `enablePlan` before installing it.
@@ -447,12 +509,6 @@ export const BACKGROUND_EXCLUDED = Object.freeze({
447
509
  // because production runs them today and deleting them would remove the only tracked description of a
448
510
  // live service. An exclusion reason is required to be a sentence, and the true sentence is that the
449
511
  // unit is going — not that a workstation should not start it.
450
- "prelim-driver.service": "RETIRED with the path-watcher/timer drain posture (owner ruling 2026-08-26, restated 2026-08-31) — clearotron-worker.service is the drain, and this file survives only until production's rebuild",
451
- "prelim-driver.timer": "RETIRED with prelim-driver.service — the 90s pull the worker's --watch replaces",
452
- "prelim-driver.path": "RETIRED with prelim-driver.service — the queue watcher whose glob a documented install never writes",
453
- "prelim-outbox.service": "the delivery outbox drains toward real clients — a production lane, not something a workstation should start by default",
454
- "prelim-outbox.path": "the outbox watcher — excluded with its service",
455
- "prelim-outbox.timer": "the outbox sweep — excluded with its service",
456
512
  "profile-service.service": "the portal constructs the profile service IN-PROCESS (driver/portal-service.mjs); the standalone unit is the separate-editor deployment shape and running both double-serves the store",
457
513
  });
458
514
 
@@ -622,7 +678,7 @@ if (isMain) {
622
678
  const argv = process.argv.slice(2);
623
679
  const say = (s = "") => process.stdout.write(`${s}\n`);
624
680
  const err = (s) => process.stderr.write(`${s}\n`);
625
- // Flipped at the first state-changing act ('s third criterion): a refusal AFTER
681
+ // Flipped at the first state-changing act (the third criterion): a refusal AFTER
626
682
  // writes must say what survives and that re-running is safe — the reader's only question at that
627
683
  // moment, and one the screen never answered while the writes sat above the port probe.
628
684
  let wroteState = false;
@@ -780,6 +836,10 @@ if (isMain) {
780
836
  // bound anywhere else in any mode. Sign-in is untouched — the demo signs in like any first start, and
781
837
  // the portal mints and prints its passphrase exactly as it does for a real one.
782
838
  const DEMO = argv.includes("--demo");
839
+ // THE DEMO BRINGS ITS OWN ACCOUNT. A fresh install resolves `generic` and nothing else (owner
840
+ // ruling, 2026-09-08), so the demo account is refused from the roster unless somebody asked for it.
841
+ // Asked here, once and visibly, rather than at each site that happens to read a roster.
842
+ if (DEMO) process.env.CLEAROTRON_DEMO_PROFILES ??= "1";
783
843
  // ── `--port` MOVES EVERY DOOR IT OPENS (tracker issue 166) ───────────────────────────────────────
784
844
  //
785
845
  // It used to move ONE of the three. `resolvePorts` reads three independent variables with three
@@ -815,16 +875,47 @@ if (isMain) {
815
875
  run: (cmd, args) => spawnSync(cmd, args, { cwd: REPO, stdio: "inherit", shell: process.platform === "win32" }).status ?? 1,
816
876
  });
817
877
 
818
- // Nobody is asked for this. A local install has one user, this machine already knows their name, and
819
- // the address never leaves the machine — `--user` is there for a reader who wants their real one, and
820
- // whatever is resolved here is written to `.env` so the question is never put twice.
878
+ // The ADDRESS is not asked for here: a local install has one user, this machine already knows their
879
+ // name, and the address never leaves the machine — `--user` is there for a reader who wants their real
880
+ // one, and whatever is resolved here is written to `.env` so the question is never put twice. What IS
881
+ // asked for, and used not to be, is the staff rule the address implies once it is a real one; that is
882
+ // the block below the address, and `clearotron install` is where the question is actually put.
821
883
  let whoami = "user";
822
884
  try { whoami = userInfo().username || "user"; } catch { /* a container with no passwd entry */ }
823
885
  // In a demo the address is the demo's own and is never written anywhere: see the DEMO block above.
824
886
  const user = String(flag("--user", DEMO ? "demo@localhost" : (process.env.PORTAL_LOCAL_USER || `${whoami}@localhost`))).trim().toLowerCase();
825
887
  if (!user.includes("@") || user.indexOf("@") !== user.lastIndexOf("@"))
826
888
  fatal(`--user "${user}" is not a single email address. It is the one identity that signs in here, and the portal refuses a multi-@ identity outright.`);
827
- const staffDomains = process.env.PORTAL_STAFF_DOMAINS || staffDomainFor(user);
889
+ // ── THE STAFF RULE THIS ADDRESS IMPLIES, STATED BEFORE IT IS WRITTEN ──────────────────────────────
890
+ //
891
+ // An explicit `PORTAL_STAFF_DOMAINS` is a decision somebody already made in writing, and it wins
892
+ // untouched — including a domain the classifier would otherwise refuse, because an operator who
893
+ // typed it has said what they mean and this command does not overrule that.
894
+ //
895
+ // Absent one, the rule is DERIVED from the single address, and that derivation is the defect this
896
+ // block exists to close. Three outcomes:
897
+ //
898
+ // `localhost` (or any bare hostname) — one machine, no second person, nothing to ask. Silent, as
899
+ // it has always been. This is the default path and the only
900
+ // one a laptop ever reaches.
901
+ // a webmail or documentation domain — refused by `staffDomainFor` itself; there is no yes that
902
+ // makes it right.
903
+ // any other real domain — refused HERE, with the rule quoted in the words the
904
+ // settings page uses and the three ways out named.
905
+ //
906
+ // BEFORE THIS RUN CHANGES THE BOX, deliberately — it sits above the state-written divide further
907
+ // down, with the units gate, the auth-mode gate and the port probe. A refused start has written no
908
+ // `.env`, minted no secret and placed no unit, so the reader's only question — is my install
909
+ // half-made — has one answer.
910
+ let staffDomains = process.env.PORTAL_STAFF_DOMAINS;
911
+ if (!staffDomains) {
912
+ let derived = "";
913
+ try { derived = staffDomainFor(user); }
914
+ catch (e) { fatal(e.message); }
915
+ if (derived && classifyStaffDomain(derived) === "wide")
916
+ fatal(wideStaffDomainRefusal({ user, domain: derived, envPath: ENV_PATH }));
917
+ staffDomains = derived;
918
+ }
828
919
 
829
920
  say("");
830
921
  say(` ${BRAND.name} ${BRAND.product.toLowerCase()} — local install`);
@@ -834,7 +925,7 @@ if (isMain) {
834
925
  say(` reports ${paths.pool}`);
835
926
  say(` signs in as ${user}`);
836
927
 
837
- // ── THE PORTS, PROBED BEFORE ANYTHING IS WRITTEN ('s sibling,) ──
928
+ // ── THE PORTS, PROBED BEFORE ANYTHING IS WRITTEN (the sibling,) ──
838
929
  //
839
930
  // This block used to sit in section 4, after the secrets were minted, the data plane created, the
840
931
  // grants file written and an example report seeded. So a box where another copy already held the port
@@ -857,7 +948,7 @@ if (isMain) {
857
948
  s.once("listening", () => s.close(() => resolve(null)));
858
949
  s.listen(port, HOST);
859
950
  });
860
- // ALL THREE DOORS, NOT TWO ( bb8's F11). The client door's port is resolved
951
+ // ALL THREE DOORS, NOT TWO (found in review). The client door's port is resolved
861
952
  // beside the other two, three lines up, and was left out of the loop written for exactly this
862
953
  // principle. So a held client port was discovered AFTER the portal and the engine door had bound: the
863
954
  // run fatalled mid-flight, tore down what it had started, and then did not exit — measured at rc=124
@@ -892,7 +983,7 @@ if (isMain) {
892
983
  continue;
893
984
  }
894
985
  }
895
- // 's wording, not a second copy of it. That helper already distinguishes EADDRINUSE from EACCES
986
+ // That wording, not a second copy of it. That helper already distinguishes EADDRINUSE from EACCES
896
987
  // on a privileged port and from an address this host does not have, and names the way out of each;
897
988
  // the launcher having its own shorter sentence for one of the three would mean a user meets two
898
989
  // different answers to the same question depending on which door refused first.
@@ -960,7 +1051,7 @@ if (isMain) {
960
1051
  catch (e) { fatal(`could not create the grants file at ${paths.grants} (${String(e?.message ?? e)}).`); }
961
1052
  say(` created ${paths.grants} (an empty roster — one staff address, no clients yet)`);
962
1053
  }
963
- // THE REVOCATION LIST, CREATED — not merely named (, bb8's F14).
1054
+ // THE REVOCATION LIST, CREATED — not merely named (found in review).
964
1055
  //
965
1056
  // The door is started with TRADEMARK_MCP_TOKEN_DENYLIST pointing here, and since this branch
966
1057
  // `isRevoked` fails CLOSED on an unreadable file — it refuses the token rather than assuming it was
@@ -1248,7 +1339,7 @@ if (isMain) {
1248
1339
  } catch { /* no file yet — the union is the whole of it */ }
1249
1340
  // ONE COMPOSER for "where do I set these", used by the start-time refusal and by the order-time
1250
1341
  // announcement below it. Two copies of this sentence is how one of them comes to name a file the
1251
- // reader cannot use — which is the whole of tracker issue 202.
1342
+ // reader cannot use.
1252
1343
  const orderRemedy = (homeEnv) => {
1253
1344
  const cliEnv = envFileRead();
1254
1345
  return cliEnv
@@ -1411,7 +1502,7 @@ if (isMain) {
1411
1502
  // deriving the bus at two of them is worse than at none: `enable --now` would succeed against the
1412
1503
  // derived bus while the health read three screens down still asks the bus-less one, so every unit
1413
1504
  // would start and then be reported as not running. Driven into by accident while building
1414
- // tracker issue 203 — "4 of 4 unit(s) did not come up" over four units that had just been enabled.
1505
+ // "4 of 4 unit(s) did not come up" over four units that had just been enabled.
1415
1506
  // Making all five derive it is a real improvement to the install path and is its own change with its
1416
1507
  // own drive, not a side effect of repairing a refusal.
1417
1508
  try { execFileSync("systemctl", ["--user", "daemon-reload"], CAPTURE_STDERR); }
@@ -1471,7 +1562,7 @@ if (isMain) {
1471
1562
  }
1472
1563
  // enable --now on an ALREADY-ACTIVE unit is a no-op, so a refresh would leave the old process
1473
1564
  // running the old files. EVERY long-running unit in the set is restarted, not a hardcoded pair
1474
- // (, Hera's review): the pair here matched the pair the health check used three
1565
+ // (found in review): the pair here matched the pair the health check used three
1475
1566
  // lines down, and carried the same stale justification about "the oneshot and its triggers". There
1476
1567
  // is no oneshot in the set. So a refresh restarted the portal and the engine door onto new code and
1477
1568
  // left the worker and the client door on the old — while the check below now reports all four up,
@@ -1490,7 +1581,7 @@ if (isMain) {
1490
1581
  // reintroduce it through a second door.
1491
1582
  //
1492
1583
  // The restart keeps the port and the key: both live in the unit's environment and the access file,
1493
- // not in the process. That is tracker issue 228's criterion 2, and it is why this is a restart
1584
+ // not in the process. That is why this is a restart rather than a re-place
1494
1585
  // rather than a re-place.
1495
1586
  if (adoptedClientDoor && !backgroundRefresh) {
1496
1587
  try { execFileSync("systemctl", ["--user", "restart", CLIENT_DOOR_UNIT], { stdio: "ignore" }); }
@@ -1499,7 +1590,7 @@ if (isMain) {
1499
1590
 
1500
1591
  // STARTED IS NOT RUNNING (the connect lesson): settle, then read each service's own state.
1501
1592
  //
1502
- // EVERY UNIT THIS FLAG INSTALLS, DERIVED FROM THE SET ( bb8's F15). This checked
1593
+ // EVERY UNIT THIS FLAG INSTALLS, DERIVED FROM THE SET (found in review). This checked
1503
1594
  // a hardcoded PAIR while `enable --now` had just started FOUR. So a client door crash-looping against
1504
1595
  // a held port got no ✗, was never named in the banner, and `start --background` printed its success
1505
1596
  // block and exited 0 over a product that was two-thirds up. The worker was unchecked for the same
@@ -1508,7 +1599,7 @@ if (isMain) {
1508
1599
  // The comment here used to justify the gap: "the oneshot worker and its timer/path are judged by
1509
1600
  // being enabled". That is stale — clearotron-worker.service is `runner.mjs --watch`, Type=simple,
1510
1601
  // Restart=on-failure, and there is no timer or path unit in the install set at all. It described the
1511
- // retired prelim-* units. A stale justification is worse than none: it reads as a decision.
1602
+ // retired clearotron-* units. A stale justification is worse than none: it reads as a decision.
1512
1603
  //
1513
1604
  // Judged by the unit's OWN declared Type rather than by a list kept here, so a oneshot added to the
1514
1605
  // set later is judged correctly instead of being reported as broken for exiting.
@@ -1577,10 +1668,40 @@ if (isMain) {
1577
1668
  // sequence rather than a race between the terminal's signal and ours. It also means the group
1578
1669
  // kill below reaches anything a child spawns, not just the child.
1579
1670
  detached: true,
1580
- stdio: ["ignore", "inherit", "inherit"],
1671
+ // STDERR IS TEED RATHER THAN INHERITED, AND ONLY STDERR.
1672
+ //
1673
+ // These children announce a refusal as one FATAL line on stderr and exit 1. With `inherit` the
1674
+ // parent holds no copy, so the failure message below could only point at output it had never seen —
1675
+ // and on one report that output never reached the reader's terminal at all. It said "its own output
1676
+ // above says why" about a line that was not above, which is worse than saying nothing: it sends
1677
+ // somebody scrolling for a sentence they will not find.
1678
+ //
1679
+ // stdout stays inherited. It carries no refusal — measured: on a refusing door stdout is empty and
1680
+ // stderr holds the whole of it — and leaving it alone keeps the child's terminal detection and any
1681
+ // progress rendering intact. Piping a stream costs the child its TTY, so only the stream that has to
1682
+ // be read is piped.
1683
+ stdio: ["ignore", "inherit", "pipe"],
1581
1684
  env: { ...process.env, ...env },
1582
1685
  });
1583
- const rec = { name, script, child, alive: true };
1686
+ // The last lines of that child's stderr, forwarded on as they arrive so nothing is delayed or
1687
+ // swallowed, and kept so the failure can QUOTE them rather than refer to them.
1688
+ const tail = [];
1689
+ // A CHUNK IS NOT A LINE. `data` arrives on whatever boundary the pipe gives us, so a stream split
1690
+ // mid-sentence would push two half-lines and the quoted last words would reach the reader cut in
1691
+ // half — on precisely the message that exists because they could not see the original. The partial
1692
+ // remainder is held over and completed by the next chunk; whatever is left when the stream ends is
1693
+ // flushed, because a process that dies mid-line still said the thing it was saying.
1694
+ let pending = "";
1695
+ const keep = (line) => { if (line.trim()) tail.push(line); while (tail.length > 12) tail.shift(); };
1696
+ child.stderr?.setEncoding("utf8");
1697
+ child.stderr?.on("data", (chunk) => {
1698
+ process.stderr.write(chunk);
1699
+ const parts = (pending + String(chunk)).split("\n");
1700
+ pending = parts.pop() ?? "";
1701
+ for (const line of parts) keep(line);
1702
+ });
1703
+ child.stderr?.on("end", () => { keep(pending); pending = ""; });
1704
+ const rec = { name, script, child, alive: true, tail };
1584
1705
  children.push(rec);
1585
1706
  child.on("exit", (code, signal) => {
1586
1707
  rec.alive = false;
@@ -1593,7 +1714,7 @@ if (isMain) {
1593
1714
  + ` but nothing is draining the queue now. Start one with:\n node ${script} --watch\n`);
1594
1715
  return;
1595
1716
  }
1596
- err(`\nstart: ${name} (${script}) exited ${signal ? `on ${signal}` : `with code ${code}`} — its own output above says why. Stopping the rest.\n`);
1717
+ err(childExitReport({ name, script, code, signal, tail }));
1597
1718
  void shutdown(1);
1598
1719
  });
1599
1720
  child.on("error", (e) => {
@@ -1601,7 +1722,7 @@ if (isMain) {
1601
1722
  if (stopping) return;
1602
1723
  if (!fatal) {
1603
1724
  err(`\nstart: ${name} (${script}) could not be started: ${String(e?.message ?? e)} — the portal is still up,`
1604
- + ` but the queue will not drain.\n`);
1725
+ + ` but the queue will not be worked.\n`);
1605
1726
  return;
1606
1727
  }
1607
1728
  err(`\nstart: ${name} (${script}) could not be started: ${String(e?.message ?? e)}\n`);
@@ -1864,3 +1985,25 @@ if (isMain) {
1864
1985
  say(" — same product, managed by systemd, and it survives logout.");
1865
1986
  say("");
1866
1987
  }
1988
+
1989
+ /**
1990
+ * What a reader is told when a child this install cannot run without exits.
1991
+ *
1992
+ * QUOTED, NOT POINTED AT. This used to end "its own output above says why" while the parent inherited
1993
+ * the child's stderr and therefore held no copy of it. On one report that output never reached the
1994
+ * reader's terminal at all, so the sentence sent somebody scrolling for a line that was not there —
1995
+ * worse than saying nothing, because it reads as a working instruction.
1996
+ *
1997
+ * An empty tail is reported as an empty tail. A child that exits silently is a finding about the child,
1998
+ * and printing a heading with nothing under it would hide exactly that.
1999
+ *
2000
+ * PURE, and exported, so this can be driven without starting a supervisor — the failure path of a
2001
+ * process manager is the one nobody exercises by hand.
2002
+ */
2003
+ export function childExitReport({ name, script, code, signal, tail = [] }) {
2004
+ const how = signal ? `on ${signal}` : `with code ${code}`;
2005
+ const said = tail.length
2006
+ ? `Its last line${tail.length > 1 ? "s" : ""}:\n${tail.map((l) => ` ${l}`).join("\n")}\n`
2007
+ : "It exited without printing anything, which is itself the thing to report.\n";
2008
+ return `\nstart: ${name} (${script}) exited ${how}. Stopping the rest.\n${said}`;
2009
+ }
package/bin/stop.mjs CHANGED
@@ -19,12 +19,16 @@ import { existsSync, rmSync } from "node:fs";
19
19
  import { join } from "node:path";
20
20
  import { homedir } from "node:os";
21
21
  import { execFileSync } from "node:child_process";
22
+ import { systemdSaid, looksLikeBusFailure, busRemedy, CAPTURE_STDERR } from "../shared/systemd-failure.mjs"; // a stop that could not look must not report that it stopped
22
23
  import { BACKGROUND_UNITS } from "./start.mjs";
23
24
  import { CLIENT_DOOR_UNIT } from "../shared/client-door.mjs";
24
25
  import { invoke } from "../shared/invocation.mjs";
25
26
 
26
27
  const UNIT_DIR = join(homedir(), ".config", "systemd", "user");
27
28
  const say = (s = "") => console.log(s);
29
+ // ON STDERR, because a refusal that scrolls past in the same stream as the success lines is a
30
+ // refusal a script cannot act on and a reader skims (tracker issue 270).
31
+ const err = (s = "") => console.error(s);
28
32
 
29
33
  const argv = process.argv.slice(2);
30
34
  if (argv.includes("--help") || argv.includes("-h")) {
@@ -39,20 +43,76 @@ if (argv.includes("--help") || argv.includes("-h")) {
39
43
  }
40
44
 
41
45
  let found = 0;
46
+ const failures = [];
42
47
  for (const u of BACKGROUND_UNITS) {
43
48
  if (u === CLIENT_DOOR_UNIT) continue; // structurally unreachable (the pin's census forbids it); belt anyway
44
49
  const file = join(UNIT_DIR, u);
45
50
  if (!existsSync(file)) continue;
46
51
  found++;
47
- try { execFileSync("systemctl", ["--user", "disable", "--now", u], { stdio: "ignore" }); } catch { /* already down */ }
52
+ // ── THE STOP IS VERIFIED, AND THE FILE GOES ONLY IF IT WORKED (tracker issue 270) ────────────────
53
+ //
54
+ // This was `catch { /* already down */ }` — a COMMENT standing in for a check. The comment guessed why
55
+ // the call failed, the next line deleted the unit file regardless, and the line after that announced
56
+ // "stopped and removed". Measured on a test box: `disable --now` failed for want of a session bus, all
57
+ // four services stayed up on unchanged pids holding all three ports, three unit files were deleted, and
58
+ // the command exited 0 saying the box ran nothing. The services were then unmanageable — running, with
59
+ // no unit file to stop them by — which is strictly worse than leaving both alone.
60
+ //
61
+ // `is-active` is what decides, not the exit code of the disable, because the exit code is what lied.
62
+ let stopped = false;
63
+ let why = null;
64
+ try {
65
+ execFileSync("systemctl", ["--user", "disable", "--now", u], CAPTURE_STDERR);
66
+ } catch (e) {
67
+ why = systemdSaid(e);
68
+ }
69
+ // ASKED AFTER, WHATEVER THE DISABLE SAID. A disable that reported failure may still have stopped it,
70
+ // and one that reported success may not have — only the state answers.
71
+ try {
72
+ const state = execFileSync("systemctl", ["--user", "is-active", u], { ...CAPTURE_STDERR, stdio: ["ignore", "pipe", "pipe"] });
73
+ stopped = String(state).trim() !== "active";
74
+ } catch (e) {
75
+ // `is-active` exits non-zero for an inactive unit, which is the answer we want — but it exits
76
+ // non-zero for "cannot reach systemd" too, and those must not read the same. The stdout is the
77
+ // discriminator: an unreachable systemd prints nothing there.
78
+ const said = String(e?.stdout ?? "").trim();
79
+ if (said && said !== "active") stopped = true;
80
+ else why = why ?? systemdSaid(e);
81
+ }
82
+
83
+ if (!stopped) {
84
+ // NOT DELETED. A running service with no unit file cannot be stopped by any ordinary means.
85
+ failures.push({ unit: u, why: why ?? "systemd still reports it active" });
86
+ say(` COULD NOT STOP ${u} — its unit file is left in place, so it can still be stopped`);
87
+ continue;
88
+ }
48
89
  try { rmSync(file, { force: true }); } catch { /* already gone */ }
49
90
  say(` stopped and removed ${u}`);
50
91
  }
51
- try { execFileSync("systemctl", ["--user", "daemon-reload"], { stdio: "ignore" }); } catch { /* no user bus */ }
92
+ // THE COMMENT HERE ALREADY NAMED THE CAUSE AND SHRUGGED AT IT. If there is no user bus, the disables
93
+ // above did not happen either — so this is where that is said.
94
+ try {
95
+ execFileSync("systemctl", ["--user", "daemon-reload"], CAPTURE_STDERR);
96
+ } catch (e) {
97
+ const said = systemdSaid(e);
98
+ err(` could not ask systemd to reload its units — ${said}`);
99
+ if (looksLikeBusFailure(said)) err(`\n${busRemedy()}\n`);
100
+ }
52
101
 
53
102
  if (!found) {
54
103
  say(" Nothing was running in the background — no pinned unit is installed on this box.");
55
104
  say(" Nothing to do, and nothing was changed.");
105
+ } else if (failures.length) {
106
+ // THE SENTENCE THAT WAS WRONG. "The background product is stopped and the box runs nothing again" was
107
+ // printed unconditionally — including on the run where four services stayed up. A reader who is told
108
+ // that has no reason to look, which is what made the state unmanageable rather than merely wrong.
109
+ err("");
110
+ err(` ${failures.length} of ${found} service(s) could NOT be stopped, and their unit files are left in place:`);
111
+ for (const f of failures) err(` ${f.unit}: ${f.why}`);
112
+ if (failures.some((f) => looksLikeBusFailure(f.why))) err(`\n${busRemedy()}\n`);
113
+ err(" Nothing was removed for these, so they can still be stopped once systemd can be reached.");
114
+ err(" The box is NOT idle. This exits non-zero.");
115
+ process.exitCode = 1;
56
116
  } else {
57
117
  say("");
58
118
  say(" The background product is stopped and the box runs nothing again — plain `clearotron start`");
@@ -60,4 +120,6 @@ if (!found) {
60
120
  const door = existsSync(join(UNIT_DIR, CLIENT_DOOR_UNIT));
61
121
  if (door) say(` Your assistant connection is untouched and still up; \`${invoke("disconnect")}\` is what closes it and revokes its key.`);
62
122
  }
63
- process.exit(0);
123
+ // NOT A BARE ZERO. A stop that could not stop something sets `exitCode` above, and exiting 0 here would
124
+ // discard it — printing the refusal and then reporting success, which is the shape this change removes.
125
+ process.exit(process.exitCode ?? 0);
package/bin/update.mjs CHANGED
@@ -58,7 +58,7 @@ import { liveRunHolds } from "../driver/deploy-live-run-guard.mjs"; // — one
58
58
  import { isEntrypoint } from "../shared/is-entrypoint.mjs"; // — one entry-point test, all spellings
59
59
  import { readEnvFile } from "./onboard.mjs";
60
60
  import { invoke, invocationPrefix } from "../shared/invocation.mjs"; // — name a command the reader can actually type
61
- import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; // tracker issue 160 — a pull cannot update an untracked bundle
61
+ import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; // a pull cannot update an untracked bundle
62
62
 
63
63
  const REPO = join(dirname(fileURLToPath(import.meta.url)), "..");
64
64
  const ENV_PATH = envLocalPath({ repoRoot: REPO }); // resolved, never composed: one resolver, so moving this file later is one line
@@ -155,7 +155,7 @@ function reportRefusal(risky) {
155
155
  say(" mv <the-path-above> <somewhere-outside>/");
156
156
  say("");
157
157
  say(` then point the variable at the new location in your .env, and run \`${invoke("doctor")}\` to`);
158
- say(" confirm it. This command will not move your files for you: where your own doctrine and");
158
+ say(" confirm it. This command will not move your files for you: where your own instructions and");
159
159
  say(" customer records live is your decision, not a side effect of an upgrade.\n");
160
160
  }
161
161
 
@@ -170,7 +170,7 @@ function reportRefusal(risky) {
170
170
  * update` from inside some other repository must not have that repository answered about.
171
171
  */
172
172
  export function isGitCheckout(repo = REPO, exists = existsSync) {
173
- // NO SPAWN HERE, DELIBERATELY. 's arm requires that update.mjs hold exactly ONE spawn site, so
173
+ // NO SPAWN HERE, DELIBERATELY. That arm requires that update.mjs hold exactly ONE spawn site, so
174
174
  // that one helper owns every command and pins `cwd` — "a later addition inherits whatever directory
175
175
  // the user happened to be standing in". A `git rev-parse` here was that later addition, and the arm
176
176
  // caught it. It is also more than the question needs: a packaged install has no `.git` at all, and a
@@ -276,7 +276,7 @@ export async function update(argv = process.argv.slice(2)) {
276
276
  for (const c of holds.claimed) console.error(` claimed ${c.id} pid ${c.pid ?? "unknown"}`);
277
277
  for (const sl of holds.slots) console.error(` slot ${sl.file} pid ${sl.pid}`);
278
278
  console.error("\n `npm ci` rebuilds node_modules under whatever is running. Nothing was touched.");
279
- console.error(" Wait for the queue to drain, or clear it, and run this again.\n");
279
+ console.error(" Wait for the queue to empty, or clear it, and run this again.\n");
280
280
  return 4;
281
281
  }
282
282
  if (holds.unreadable.length) {
@@ -292,7 +292,7 @@ export async function update(argv = process.argv.slice(2)) {
292
292
  say("\n Configuration store is outside the checkout. Updating the product.");
293
293
  for (const e of entries) say(` ${e.name}=${e.value} (${e.from})`);
294
294
  if (!entries.length) {
295
- say(" Nothing set — this install runs the bundled demo customers and our doctrine. That is a");
295
+ say(" Nothing set — this install runs the bundled demo customers and our instructions. That is a");
296
296
  say(" fine way to start, and it means an upgrade has nothing of yours to land on.");
297
297
  }
298
298
 
@@ -326,7 +326,7 @@ export async function update(argv = process.argv.slice(2)) {
326
326
  //
327
327
  // The point of running it HERE is that a pull is exactly the moment our files move under a user's
328
328
  // overrides. Reported, never judged — an override is a choice, not a fault, and drift is information.
329
- say("\n Doctrine overlay");
329
+ say("\n Custom instructions");
330
330
  try {
331
331
  const report = overlayReport({ baseRoot: config.skillsBaseDir, overlayRoot: config.skillsOverlayDir });
332
332
  for (const line of renderOverlayReport(report, { indent: "" })) say(` ${line}`);
@@ -334,7 +334,7 @@ export async function update(argv = process.argv.slice(2)) {
334
334
  } catch (e) {
335
335
  // An unreadable overlay throws by design. It must not abort the verb after a successful update: the
336
336
  // update DID happen, and exiting nonzero here would tell a script it did not.
337
- console.error(` the doctrine overlay could not be read — ${e.message}`);
337
+ console.error(` the custom instructions could not be read — ${e.message}`);
338
338
  }
339
339
 
340
340
  say("\n Up to date.\n");
@@ -76,7 +76,7 @@ if (!dbPath) die(`no index path. Pass --db, or set USPTO_LOCAL_DB (the same vari
76
76
  //
77
77
  // So the old check demanded 43.8 GB for a build that fits in 17, and INSTALL.md told the reader to
78
78
  // provision 60. On the free tier that is the difference between "I can try this on the disk I have" and
79
- // "I cannot", which is the whole of 's Why.
79
+ // "I cannot", which is the whole of the Why.
80
80
  //
81
81
  // The ratio, the headroom and the arithmetic now live in shared/uspto-index-size.mjs with their
82
82
  // provenance, because the same numbers are what the wizard prints and what INSTALL.md promises, and
package/build-info.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "commit": "df42f25966148479a5a6d34aba3f82c110a1ba43",
3
- "version": "0.2.1"
2
+ "commit": "5c8eca66a5f226dde9e1d01affd63da4eda61bbd",
3
+ "version": "0.2.3"
4
4
  }
@@ -2,7 +2,7 @@
2
2
  "schema_version": 1,
3
3
  "framework_key": "house-default",
4
4
  "title": "Generic default risk framework",
5
- "source_deck": "Generic house default IP Risk Assessment Framework.pptx (Privileged & Confidential), completed by the reviewing lawyer 2026-08-31; supersedes the 2026-07-05 transcription (doc 50), which was partial",
5
+ "source_deck": "Cordillera house risk framework, authored in-house and reviewed by counsel; 2026-08-31 revision",
6
6
  "entity_label": "the company",
7
7
  "bands": [
8
8
  {
@@ -2,7 +2,7 @@
2
2
  "schema_version": 1,
3
3
  "framework_key": "house-default",
4
4
  "title": "Generic default risk framework",
5
- "source_deck": "Generic house default IP Risk Assessment Framework.pptx (Privileged & Confidential), completed by the reviewing lawyer 2026-08-31; supersedes the 2026-07-05 transcription (doc 50), which was partial",
5
+ "source_deck": "Cordillera house risk framework, authored in-house and reviewed by counsel; 2026-08-31 revision",
6
6
  "entity_label": "the company",
7
7
  "bands": [
8
8
  {
@@ -2,7 +2,7 @@
2
2
  "schema_version": 1,
3
3
  "framework_key": "house-triage",
4
4
  "title": "House knockout triage ladder (Stage 0)",
5
- "source_deck": "Ported from the interactive knockout-searches skill's 5-tier rating system (SKILL.md rating table + calibration rules), doc 50 shape",
5
+ "source_deck": "Cordillera house triage scale for knockout screening, authored in-house; five rating tiers",
6
6
  "entity_label": "the client",
7
7
  "bands": [
8
8
  {
@@ -2,7 +2,7 @@
2
2
  "schema_version": 1,
3
3
  "framework_key": "house-default",
4
4
  "title": "Generic default risk framework",
5
- "source_deck": "Generic house default IP Risk Assessment Framework.pptx (Privileged & Confidential), completed by the reviewing lawyer 2026-08-31; supersedes the 2026-07-05 transcription (doc 50), which was partial",
5
+ "source_deck": "Cordillera house risk framework, authored in-house and reviewed by counsel; 2026-08-31 revision",
6
6
  "entity_label": "the company",
7
7
  "bands": [
8
8
  {