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.
- package/.env.example +82 -1
- package/.nvmrc +1 -1
- package/CONTRIBUTING.md +3 -3
- package/INSTALL.md +64 -58
- package/README.md +11 -16
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/bin/brandowner.mjs +1 -1
- package/bin/clearotron.mjs +26 -4
- package/bin/connect.mjs +2 -2
- package/bin/example.mjs +31 -11
- package/bin/grant.mjs +3 -3
- package/bin/key.mjs +1 -1
- package/bin/onboard.mjs +252 -136
- package/bin/start.mjs +176 -33
- package/bin/stop.mjs +65 -3
- package/bin/update.mjs +7 -7
- package/bin/uspto-sync.mjs +1 -1
- package/build-info.json +2 -2
- package/demo/full-country-search/run/_driver/framework.json +1 -1
- package/demo/global-preliminary-search/run/_driver/framework.json +1 -1
- package/demo/knockout-search/run/_driver/framework.json +1 -1
- package/demo/multi-country-focus-search/run/_driver/framework.json +1 -1
- package/docs/DELIVERY.md +6 -2
- package/docs/E2E.md +5 -5
- package/docs/PORTAL.md +2 -2
- package/docs/README.md +5 -4
- package/docs/SECURITY.md +17 -0
- package/docs/architecture/01-product-overview.md +2 -2
- package/docs/architecture/02-architecture.md +2 -2
- package/docs/architecture/04-configuration-reference.md +8 -3
- package/docs/architecture/05-config-governance.md +52 -5
- package/docs/architecture/05-customer-profiles.md +2 -2
- package/docs/architecture/06-operations-runbook.md +13 -1
- package/docs/architecture/09-security-and-data.md +1 -1
- package/docs/configuration.md +4 -3
- package/docs/decisions/0004-documentation-structure.md +1 -1
- package/driver/CHANGELOG.md +121 -1
- package/driver/README.md +2 -2
- package/driver/ask-ledger.mjs +3 -3
- package/driver/authority-trees.mjs +1 -1
- package/driver/call-capture.mjs +1 -1
- package/driver/card-frame.mjs +1 -1
- package/driver/case-law-ledger.mjs +1 -1
- package/driver/claim-liveness.mjs +1 -1
- package/driver/common-law-receipts.mjs +2 -2
- package/driver/commonlaw-carry.mjs +1 -1
- package/driver/config-inventory.mjs +1 -1
- package/driver/config-staleness.mjs +1 -1
- package/driver/connotation-search.mjs +12 -12
- package/driver/contract-audit.mjs +5 -5
- package/driver/contract-dictation-registry.mjs +4 -4
- package/driver/contract-dictation.mjs +2 -2
- package/driver/contract-e3-backlog.mjs +6 -6
- package/driver/contract-vocabulary.mjs +3 -3
- package/driver/corrections-feedforward.mjs +1 -1
- package/driver/coverage-form-io.mjs +2 -2
- package/driver/coverage-form.mjs +4 -4
- package/driver/coverage-ledger.mjs +3 -3
- package/driver/coverage-union.mjs +1 -1
- package/driver/declination-call.mjs +35 -3
- package/driver/declination-duty.mjs +1 -1
- package/driver/deliver-trigger.sh +3 -3
- package/driver/deploy-live-run-guard.mjs +6 -2
- package/driver/dev-portal.mjs +3 -3
- package/driver/disposition-call.mjs +4 -4
- package/driver/disposition-tool.mjs +4 -4
- package/driver/disposition-union.mjs +2 -2
- package/driver/doc-constants.mjs +1 -1
- package/driver/door-gates.mjs +2 -2
- package/driver/doubt-selection.mjs +2 -2
- package/driver/drainer-identity.mjs +1 -1
- package/driver/driver.config.mjs +64 -12
- package/driver/e2e-rounds.mjs +2 -2
- package/driver/effort-model.mjs +2 -2
- package/driver/engine/anthropic-agent.mjs +24 -24
- package/driver/engine/auth.mjs +1 -1
- package/driver/engine/cli-version.mjs +103 -0
- package/driver/engine/common.mjs +1 -1
- package/driver/engine/deny-authority-write.mjs +1 -1
- package/driver/engine/jx-turn.mjs +1 -1
- package/driver/engine/mcp/clarivate-server.mjs +1 -1
- package/driver/engine/mcp/corsearch-server.mjs +1 -1
- package/driver/engine/mcp/declination-server.mjs +1 -1
- package/driver/engine/mcp/dispositions-server.mjs +1 -1
- package/driver/engine/mcp/euipo-server.mjs +1 -1
- package/driver/engine/mcp/fetch-server.mjs +1 -1
- package/driver/engine/mcp/free-tier-server.mjs +2 -2
- package/driver/engine/mcp/gather-config.mjs +11 -11
- package/driver/engine/mcp/perplexity-server.mjs +1 -1
- package/driver/engine/mcp/recording-server.mjs +8 -4
- package/driver/engine/mcp/signa-server.mjs +1 -1
- package/driver/engine/mcp/uspto-local-server.mjs +1 -1
- package/driver/engine/openai-agent.mjs +2 -2
- package/driver/engine-build.mjs +2 -2
- package/driver/enqueue-schema.mjs +10 -10
- package/driver/enqueue.mjs +1 -1
- package/driver/envelope-settle.mjs +1 -1
- package/driver/evidence-claim-invariant.mjs +2 -2
- package/driver/feedback-store.mjs +1 -1
- package/driver/findings-model.mjs +60 -10
- package/driver/flag-snapshot.mjs +20 -0
- package/driver/floor-duty.mjs +1 -1
- package/driver/form-neighbourhood.mjs +1 -1
- package/driver/framework.mjs +2 -2
- package/driver/gateway.mjs +45 -23
- package/driver/grounds-grammar.mjs +1 -1
- package/driver/hit-list.mjs +1 -1
- package/driver/jurisdiction-systems.mjs +1 -1
- package/driver/jx-lanes.mjs +1 -1
- package/driver/jx-units.mjs +1 -1
- package/driver/jx.mjs +3 -3
- package/driver/knockout-assess-record.mjs +5 -1
- package/driver/narrative-refutation-record.mjs +3 -3
- package/driver/numeric-setting.mjs +1 -1
- package/driver/owner-use-check.mjs +184 -0
- package/driver/package.json +4 -4
- package/driver/party-facts.mjs +2 -2
- package/driver/phase0.mjs +2 -2
- package/driver/pipeline-knockout.mjs +52 -4
- package/driver/pipeline.mjs +180 -67
- package/driver/placement-diff.mjs +2 -2
- package/driver/placement-form.mjs +4 -4
- package/driver/placement-union.mjs +1 -1
- package/driver/plain-register.mjs +120 -0
- package/driver/portal-access.mjs +1 -1
- package/driver/portal-acks.mjs +1 -1
- package/driver/portal-config-view.mjs +42 -3
- package/driver/portal-families.mjs +1 -1
- package/driver/portal-local-auth.mjs +1 -1
- package/driver/portal-report.mjs +7 -7
- package/driver/portal-service.mjs +41 -22
- package/driver/portal-upstream.mjs +2 -2
- package/driver/predelivery-lint.mjs +149 -11
- package/driver/prelim-variants-record.mjs +2 -2
- package/driver/profile-page.html +11 -3
- package/driver/profile-selection.mjs +1 -1
- package/driver/profile-service.mjs +6 -6
- package/driver/profiles/README.md +3 -3
- package/driver/profiles.mjs +145 -13
- package/driver/progress.mjs +6 -6
- package/driver/provider-usage.mjs +1 -1
- package/driver/publish/demo-marking.mjs +1 -1
- package/driver/publish/index.mjs +49 -8
- package/driver/publish/knockout.mjs +42 -14
- package/driver/publish/parse.mjs +4 -4
- package/driver/publish/publish-inputs.mjs +2 -2
- package/driver/publish/register-presence.mjs +1 -1
- package/driver/publish/render-knockout.mjs +646 -144
- package/driver/publish/render.mjs +2 -2
- package/driver/publish/report-data.mjs +13 -3
- package/driver/queue-watch-probe.mjs +1 -1
- package/driver/queue-watch-verdict.mjs +1 -1
- package/driver/recall-reconciliation.mjs +1 -1
- package/driver/recipe-service.mjs +1 -1
- package/driver/record-carry.mjs +5 -5
- package/driver/recording-agreement.mjs +3 -3
- package/driver/reference-score.mjs +7 -7
- package/driver/reference-strip-signatures.mjs +20 -0
- package/driver/refusal-bound.mjs +3 -3
- package/driver/register-availability.mjs +2 -2
- package/driver/register-count.mjs +1 -1
- package/driver/register-grant-vocabulary.mjs +2 -2
- package/driver/register-plan.mjs +8 -8
- package/driver/register-records.mjs +2 -2
- package/driver/registry-fidelity.mjs +3 -3
- package/driver/remedy-accounting.mjs +1 -1
- package/driver/repair-composers.mjs +2 -2
- package/driver/repair-digest.mjs +3 -3
- package/driver/repairs.mjs +6 -6
- package/driver/replay-archive.mjs +2 -0
- package/driver/report-card-record.mjs +2 -2
- package/driver/result-noun-fields.mjs +10 -3
- package/driver/run-economics.mjs +2 -2
- package/driver/run-integrity.mjs +1 -1
- package/driver/runner.mjs +22 -22
- package/driver/scope-rules.mjs +1 -1
- package/driver/search-policy.mjs +5 -5
- package/driver/skeptic-search.mjs +1 -1
- package/driver/skills/blind-frame/SKILL.md +2 -2
- package/driver/skills/case-law-citation/SKILL.md +2 -2
- package/driver/skills/knockout-assess/SKILL.md +94 -4
- package/driver/skills/matter-frame/SKILL.md +6 -6
- package/driver/skills/matter-frame/watchlist-reference.md +2 -2
- package/driver/skills/prelim-common-law/SKILL.md +1 -1
- package/driver/skills/prelim-search/SKILL.md +3 -3
- package/driver/skills/prelim-search/report-prose.md +82 -0
- package/driver/skills/prelim-search/risk-framework-demo.manifest.json +1 -1
- package/driver/skills/prelim-search/risk-framework-triage.manifest.json +1 -1
- package/driver/skills/prelim-search/risk-framework.manifest.json +1 -1
- package/driver/skills/prelim-search/synthesis-rules.md +1 -1
- package/driver/skills/prelim-search/template-formatting.md +1 -1
- package/driver/skills/prelim-search/templates/email/generic.md +1 -1
- package/driver/skills/prelim-search/worked-examples.md +1 -1
- package/driver/skills/prelim-variants/SKILL.md +5 -5
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +55 -4
- package/driver/stages.mjs +101 -44
- package/driver/stray-artifacts.mjs +2 -2
- package/driver/suite-census.json +275 -65
- package/driver/synthesis-record.mjs +1 -1
- package/driver/systemd/clearotron-client-mcp.service +1 -1
- package/driver/systemd/clearotron-portal.service +1 -1
- package/driver/systemd/render-units.mjs +1 -1
- package/driver/tokens.mjs +1 -1
- package/driver/tool-calls.mjs +1 -1
- package/driver/turnaround-bands.mjs +1 -1
- package/driver/unit-file-drift.mjs +1 -1
- package/driver/unit-inventory.mjs +297 -80
- package/driver/unit-state-verdict.mjs +20 -12
- package/driver/verify-knockout.mjs +10 -2
- package/driver/verify.mjs +13 -13
- package/driver/whatif-memo-run.mjs +72 -9
- package/driver/whatif-memo.mjs +19 -1
- package/driver/whatif-queue.mjs +1 -1
- package/driver/whatif-worker.mjs +1 -1
- package/examples/README.md +2 -2
- package/examples/grants.example.json +6 -7
- package/mcp-server/CHANGELOG.md +6 -0
- package/mcp-server/README.md +3 -3
- package/mcp-server/http-server.mjs +44 -1
- package/mcp-server/key-socket.mjs +184 -0
- package/mcp-server/lib/audit-view.mjs +69 -2
- package/mcp-server/lib/brief.mjs +15 -0
- package/mcp-server/lib/driver.mjs +7 -1
- package/mcp-server/lib/events.mjs +1 -1
- package/mcp-server/lib/http-handler.mjs +1 -1
- package/mcp-server/lib/knockout.mjs +435 -0
- package/mcp-server/lib/ops.mjs +4 -4
- package/mcp-server/lib/options.mjs +1 -1
- package/mcp-server/lib/plan.mjs +1 -1
- package/mcp-server/lib/runs.mjs +1 -1
- package/mcp-server/lib/scrub.mjs +2 -2
- package/mcp-server/lib/whatif.mjs +5 -5
- package/mcp-server/mint-token.mjs +1 -1
- package/mcp-server/package.json +2 -2
- package/mcp-server/packs/ops/EXAMPLES.md +2 -2
- package/mcp-server/server.mjs +77 -12
- package/package.json +30 -12
- package/portal-ui/dist/assets/{index-Ct3iQtZ2.css → index-1ziUJX1E.css} +43 -2
- package/portal-ui/dist/assets/{index-BUGgiYtF.js → index-CEYvXdqH.js} +226 -49
- package/portal-ui/dist/index.html +2 -2
- package/portal-ui/package.json +1 -1
- package/providers/_shared/enumerate.mjs +1 -1
- package/providers/_shared/ledger-path.mjs +3 -3
- package/providers/_shared/ledger.mjs +1 -1
- package/providers/_shared/result-shape.mjs +3 -3
- package/providers/_shared/term-shape.mjs +2 -2
- package/providers/corsearch/src/core.js +1 -1
- package/providers/jx-subclass/BUILDING.md +1 -1
- package/providers/oauth-mcp-bridge/CHANGELOG.md +6 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
- package/providers/uspto-local/src/index-store.js +2 -2
- package/scripts/README.md +1 -1
- package/scripts/added-reference-check.mjs +29 -1
- package/scripts/authority-boundary-probe.mjs +1 -1
- package/scripts/backfill-started-at.mjs +1 -1
- package/scripts/citation-line-check.mjs +124 -5
- package/scripts/compare.mjs +2 -2
- package/scripts/contract-dictation-scan.mjs +2 -2
- package/scripts/dead-names.mjs +1 -1
- package/scripts/drain-preflight.mjs +5 -5
- package/scripts/e2e-unread-terminals.mjs +1 -1
- package/scripts/e2e.mjs +8 -8
- package/scripts/env-audit.mjs +7 -7
- package/scripts/env-classify.mjs +206 -18
- package/scripts/freeze-example-run.mjs +3 -3
- package/scripts/head-arrived-gated.mjs +1 -1
- package/scripts/headless-page.mjs +51 -2
- package/scripts/live-surface-check.mjs +129 -19
- package/scripts/main-health.mjs +1 -1
- package/scripts/merge-presence-check.mjs +3 -3
- package/scripts/mint-suite-census.mjs +6 -6
- package/scripts/nightly-notice.mjs +1 -3
- package/scripts/preinstall-node-check.mjs +24 -0
- package/scripts/reconcile-runs.mjs +1 -1
- package/scripts/release-await-cut.mjs +6 -4
- package/scripts/release-version-pr-checks.mjs +1 -1
- package/scripts/release-version.mjs +2 -2
- package/scripts/render-check.mjs +66 -7
- package/scripts/report-frame-check.mjs +1 -1
- package/scripts/report-screenshot.mjs +1 -1
- package/scripts/revisit-render-check.mjs +1 -1
- package/scripts/score.mjs +4 -4
- package/scripts/strip-tracker-citations.mjs +139 -0
- package/scripts/test-run.mjs +19 -3
- package/scripts/third-party-notices.mjs +3 -3
- package/scripts/travelling-predicates.mjs +3 -3
- package/scripts/unexecuted-asserts.mjs +2 -2
- package/scripts/verify-publishable.mjs +2 -2
- package/scripts/write-up-form-census.mjs +1 -1
- package/shared/access-audience.mjs +1 -1
- package/shared/anon-overlay.mjs +3 -3
- package/shared/brand.mjs +13 -13
- package/shared/citation-scan.mjs +1 -1
- package/shared/client-door.mjs +7 -7
- package/shared/customer-store.mjs +1 -1
- package/shared/driver-dir.mjs +1 -1
- package/shared/env-aliases.mjs +0 -48
- package/shared/env-local.mjs +1 -1
- package/shared/identifier-scan.mjs +3 -3
- package/shared/invocation.mjs +29 -1
- package/shared/names-in-force.mjs +4 -0
- package/shared/node-floor.mjs +97 -0
- package/shared/product-owned-names.mjs +1 -1
- package/shared/register-selection.mjs +1 -1
- package/shared/scope.mjs +5 -5
- package/shared/server-units.mjs +4 -4
- package/shared/staff-domain.mjs +154 -0
- package/shared/store-in-repo.mjs +25 -4
- package/shared/suite-census.mjs +4 -4
- package/shared/tty-style.mjs +1 -1
- package/shared/uspto-index-size.mjs +1 -1
- package/shared/vacuous-pass.mjs +1 -1
- package/skills/clearotron-account/SKILL.md +42 -13
- package/skills/clearotron-ops/SKILL.md +1 -1
- package/driver/recipes/README.md +0 -49
- package/driver/skills/prelim-search/risk-framework-aurora.manifest.json +0 -19
- package/driver/skills/prelim-search/risk-framework-aurora.md +0 -77
- package/driver/skills/prelim-search/risk-framework-zephyr.manifest.json +0 -14
- package/driver/skills/prelim-search/risk-framework-zephyr.md +0 -33
- package/driver/skills/prelim-search/worked-examples-aurora.md +0 -10
- package/driver/skills/prelim-search/worked-examples-zephyr.md +0 -10
- package/driver/systemd/prelim-driver.path +0 -69
- package/driver/systemd/prelim-driver.service +0 -86
- package/driver/systemd/prelim-driver.timer +0 -14
- package/driver/systemd/prelim-outbox.path +0 -27
- package/driver/systemd/prelim-outbox.service +0 -37
- package/driver/systemd/prelim-outbox.timer +0 -21
- package/node_modules/exceljs/README_zh.md +0 -2878
- package/node_modules/exceljs/dist/LICENSE +0 -22
- package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
- package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
- package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
- package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
- package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
- package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
- package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
- package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
- package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
- package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
- package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
- package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
- package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
- package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
- package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
- package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
- package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
- package/node_modules/exceljs/dist/es5/index.js +0 -15
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
- package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
- package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
- package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
- package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
- package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
- package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
- package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
- package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.js +0 -59900
- package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
- package/node_modules/exceljs/dist/exceljs.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
- package/scripts/ai-page-render-check.mjs +0 -532
- package/scripts/clearances-render-check.mjs +0 -480
- package/scripts/composer-render-check.mjs +0 -1027
- package/scripts/deploy-test.sh +0 -309
- package/scripts/home-render-check.mjs +0 -526
- package/scripts/portal-lifecycle-check.mjs +0 -639
package/driver/profiles.mjs
CHANGED
|
@@ -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
|
-
//
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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:
|
|
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
|
|
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 —
|
|
892
|
-
*
|
|
893
|
-
* (that would delete true conflicts from a delivered
|
|
894
|
-
* profile name in the applicant string
|
|
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);
|
package/driver/progress.mjs
CHANGED
|
@@ -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
|
|
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;
|
|
444
|
-
const pending = s.sendPending === true ? " — 📮 SEND PENDING (email/WhatsApp NOT yet out — run
|
|
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
|
|
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
|
|
517
|
-
const md = `#
|
|
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("
|
|
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
|
-
*
|
|
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
|
package/driver/publish/index.mjs
CHANGED
|
@@ -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
|
|
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 —
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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" (
|
|
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.
|
|
72
|
-
//
|
|
73
|
-
//
|
|
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,
|
|
254
|
-
//
|
|
255
|
-
//
|
|
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
|
|
477
|
-
//
|
|
478
|
-
//
|
|
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 ?
|
|
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
|
package/driver/publish/parse.mjs
CHANGED
|
@@ -225,11 +225,11 @@ export function stripTelemetry(md) {
|
|
|
225
225
|
.join('\n');
|
|
226
226
|
}
|
|
227
227
|
|
|
228
|
-
// ──
|
|
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.
|
|
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
|
|
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
|
-
// ──
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|