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/pipeline.mjs
CHANGED
|
@@ -8,7 +8,7 @@ import "../shared/env-local.mjs"; // side effect: apply <repo>/.env when THIS
|
|
|
8
8
|
import "./engine/mcp/http-dispatcher.mjs"; // side effect: raise undici headersTimeout (code-side fetches)
|
|
9
9
|
import { readFileSync, existsSync, mkdirSync, writeFileSync, renameSync, copyFileSync, readdirSync, rmSync, statSync } from "node:fs";
|
|
10
10
|
import { createHash } from "node:crypto";
|
|
11
|
-
import { join, dirname, basename, resolve } from "node:path"; // resolve:
|
|
11
|
+
import { join, dirname, basename, resolve } from "node:path"; // resolve: the resume line must work from any cwd
|
|
12
12
|
import { driverDir, driverRel, ensureDriverDir } from "../shared/driver-dir.mjs"; // — one definition of where `_driver/` is
|
|
13
13
|
import { terminalClampDecision, orderClausesForLede } from "./terminal-clamp.mjs"; // — deliver and clamp, never withhold
|
|
14
14
|
import { recordSpan } from "./attributed-span.mjs"; // — driver work the decomposition can attribute
|
|
@@ -28,7 +28,7 @@ import { engineProvenance } from "./engine-build.mjs"; // —
|
|
|
28
28
|
import { preflightEngineTurn } from "./engine/probe.mjs"; // — …and the engine can complete a turn, not merely exist
|
|
29
29
|
import { rankClusterLegs, verdictDrivingFindings } from "./senior-rights.mjs";
|
|
30
30
|
import { buildRunContext, deriveSlug, kebab } from "./phase0.mjs";
|
|
31
|
-
import { paths, STAGES, axisTier, decideAxes, assertTierSanity, assertEffectiveTier, lines, AGENT_WHATSAPP,
|
|
31
|
+
import { paths, STAGES, axisTier, decideAxes, assertTierSanity, assertEffectiveTier, lines, AGENT_WHATSAPP, whatsappRouting,
|
|
32
32
|
chainEntries, stageOrdinal, stageInputs, stageOutputs, dependencyOrder, REGISTER_AXES, REGISTER_ENUMERATE_TOOL,
|
|
33
33
|
buildEscalationFollowup, buildEnvelopeCloseFollowup, buildFrameReopenFollowup,
|
|
34
34
|
buildFrameReopenRetryMessage, thinkingFor, composeFollowup, stampDispatchBlocks, PROVIDER_META, proseRungDirective, inquiryRungDirective } from "./stages.mjs";
|
|
@@ -107,7 +107,8 @@ import { mintCrossCheckDoubts, mintContradictionDoubts, stitchDoubts, applyClosu
|
|
|
107
107
|
import { readAcceptedClosures } from "./doubt-closure-tool.mjs";
|
|
108
108
|
import { CLOSURE_EVIDENCE_FILES } from "./doubt-closure-call.mjs";
|
|
109
109
|
import { doubtsForClosure, doubtSelectionNote } from "./doubt-selection.mjs"; // doubt-closure selection
|
|
110
|
-
import { deriveAsks, applyAskClosure, finalizeOpenHandoffs, summarizeAsks } from "./ask-ledger.mjs";
|
|
110
|
+
import { deriveAsks, applyAskClosure, finalizeOpenHandoffs, summarizeAsks } from "./ask-ledger.mjs";
|
|
111
|
+
import { pendingWhatIf, claimWhatIf, finishWhatIf, whatIfRefusal } from "./whatif-queue.mjs"; // a queued job is settled before its run archives // PR-6 — every ask ends (2026-07-29)
|
|
111
112
|
import { mintPresenceDoubts } from "./presence-reconciliation.mjs"; // presence-or-reason (2026-07-22 — the unjoined-Sheet-2 leak)
|
|
112
113
|
import { escalatedAxes } from "./skeptic-record.mjs"; // THE escalation parse — shared with the record_skeptic transport so the rendered shape and this read cannot drift
|
|
113
114
|
// — every placed candidate ends somewhere a reader can see; the ones that do not are counted by name
|
|
@@ -155,9 +156,9 @@ import { foldCaption, foldCardRead } from "./card-budget.mjs";
|
|
|
155
156
|
import { carriesOwnFrame, composeCard } from "./card-frame.mjs";
|
|
156
157
|
import { parseFrameworkManifest, loadFrameworkManifest, frameworkFor, manifestPathFor, DEFAULT_FRAMEWORK } from "./framework.mjs";
|
|
157
158
|
import { renderScopeLedgerJson, scopeLedgerJsonFromRows, channelsDiagnosis, parseScopeLedgerJson, scopeJurisdictions, droppedVariantFamilies } from "./scope-ledger.mjs";
|
|
158
|
-
// qw/cn-scope-honesty — the zh-lane capability tables + the requested-scope resolver, for the plain-
|
|
159
|
+
// qw/cn-scope-honesty — the zh-lane capability tables + the requested-scope resolver, for the plain-clearotron
|
|
159
160
|
// honesty row/note. jx-lanes.mjs is a PURE zero-import leaf (data + decisions, no env/fs), so a static
|
|
160
|
-
// import here costs a plain
|
|
161
|
+
// import here costs a plain clearotron nothing — the "lazy import" rule below (jx.mjs / jx-units.mjs) guards
|
|
161
162
|
// the lane MACHINERY, not this table. Aliased: scope-ledger.mjs already exports a scopeJurisdictions
|
|
162
163
|
// (rows → markets); this one is (job, profile) → requested territories, the decideJxLanes precedence.
|
|
163
164
|
import { JURISDICTION_ADAPTERS, LANGUAGE_LANES, scopeJurisdictions as jxScopeJurisdictions, zhScopeDepthNotes } from "./jx-lanes.mjs";
|
|
@@ -887,7 +888,7 @@ function deriveGridSpec(ctx) {
|
|
|
887
888
|
// Deterministic grid contract (robust fix, 2026-06-14): write the EXACT terms × platforms the grid
|
|
888
889
|
// will run as a code-owned spec. The perplexity plugin reads this, runs only these cells, and writes
|
|
889
890
|
// common-law-grid.json ITSELF from the API response — the large grid JSON never round-trips through
|
|
890
|
-
// the model's bounded turn-output (no truncation:
|
|
891
|
+
// the model's bounded turn-output (no truncation: measured on a dense beverages run) and the model never re-types
|
|
891
892
|
// the keys or cells (no drops/mis-keys: NOVA PULSE/marble-anvil). The receipts gate joins against THIS
|
|
892
893
|
// same file, so it can never demand a key the grid did not run. No profile (no dictated platforms) ⇒
|
|
893
894
|
// legacy model-authored path (back-compat; the gate falls back to the prose manifest).
|
|
@@ -917,7 +918,7 @@ function deriveGridSpec(ctx) {
|
|
|
917
918
|
const gridSpecPath = P.gridSpec;
|
|
918
919
|
// #5 — required channels: a NAMED profile's curated platforms are authoritative. The GENERIC fallback
|
|
919
920
|
// derives the channels from the MATTER FRAME's industry/goods reasoning (its "Search channels:" line) so
|
|
920
|
-
// a regulated/B2B matter (
|
|
921
|
+
// a regulated/B2B matter (veterinary pharma, say) searches its real channels (EMA/FDA registers) instead of
|
|
921
922
|
// being forced onto — and invalidated by — consumer storefronts. No static class→channel table: the
|
|
922
923
|
// frame names them the way a lawyer reasons about the vertical, so it generalises to ANY industry. The
|
|
923
924
|
// deterministic grid runs grid-spec.platforms and the receipts gate joins the SAME file, so this is the
|
|
@@ -1301,7 +1302,7 @@ function readCoverageJudgment(P) {
|
|
|
1301
1302
|
// back in `unknown` — carried in `jurisdictions` too (never dropped), but the caller must surface them
|
|
1302
1303
|
// LOUDLY (a jurisdiction nobody can place must never be a silent row in the machine record).
|
|
1303
1304
|
// item 13 — `extractSearchedJurisdictions` LIVED HERE AND IS GONE. It ran a two-letter scan over the
|
|
1304
|
-
// coverage ledger's prose to decide which territories a run had searched, and
|
|
1305
|
+
// coverage ledger's prose to decide which territories a run had searched, and the narrowing (drop
|
|
1305
1306
|
// tokens that are not known jurisdiction codes) closed only the half where the junk token was not a real
|
|
1306
1307
|
// code. The other half cannot be closed by any token list: SA, AG, KG, SL and SE are simultaneously real
|
|
1307
1308
|
// jurisdiction codes and ordinary European company suffixes, so "… GmbH & Co. KG" reads as Kyrgyzstan and
|
|
@@ -1350,7 +1351,7 @@ export const CASE_LAW_TRIGGERS = /watchlist|precedent|case[- ]law|opposition|fam
|
|
|
1350
1351
|
// The offering locked with the reviewing lawyer gives the case-law and opposition reading to the Full
|
|
1351
1352
|
// country search alone, over exactly one country, where it is automatic. Multi-country focus deliberately
|
|
1352
1353
|
// has no case-law component. `job.caseLaw` is refused at the door and `policy.caseLaw` is set from the
|
|
1353
|
-
// product spec, so the REQUESTED path was already confined correctly — and
|
|
1354
|
+
// product spec, so the REQUESTED path was already confined correctly — and the one-territory rule is
|
|
1354
1355
|
// enforced at that door.
|
|
1355
1356
|
//
|
|
1356
1357
|
// The detector was not. It fires mid-run, after admission, on a run already scoped to however many
|
|
@@ -1464,7 +1465,7 @@ export function freezeProfile(p, project = null) {
|
|
|
1464
1465
|
demoData: p.demoData === true,
|
|
1465
1466
|
// BUGFIX 2026-06-19: per-customer reasoning-skill SELECTION must be frozen too. It was missing here, so
|
|
1466
1467
|
// frameworkFor()/workedExamplesFor() (stages.mjs) read the frozen ctx.profile, found no path, and silently
|
|
1467
|
-
// fell back to the firm-neutral DEFAULT for EVERY run —
|
|
1468
|
+
// fell back to the firm-neutral DEFAULT for EVERY run — the profiles' configured frameworks
|
|
1468
1469
|
// were never applied. RAW value (NOT `?? ""`): absent ⇒ undefined ⇒ JSON drops it ⇒ frameworkFor falls back
|
|
1469
1470
|
// to DEFAULT; an empty string would NOT trigger the `?? DEFAULT` and would break the read.
|
|
1470
1471
|
frameworkPath: p.frameworkPath,
|
|
@@ -1489,7 +1490,7 @@ export function freezeProfile(p, project = null) {
|
|
|
1489
1490
|
};
|
|
1490
1491
|
// spec 62 — when the run is under a PROJECT, record which project rated it and the per-field origin map,
|
|
1491
1492
|
// added AFTER the 14-field base so a NO-PROJECT freeze stays byte-identical to a pre-62 sidecar (the
|
|
1492
|
-
//
|
|
1493
|
+
// regression anchor and every existing run's profileSha are preserved; profileShaOf sorts keys,
|
|
1493
1494
|
// so these hash in only when present, making "which project rated this run" verifiable, never asserted).
|
|
1494
1495
|
if (project?.projectKey) {
|
|
1495
1496
|
frozen.projectKey = project.projectKey;
|
|
@@ -1532,6 +1533,13 @@ function attachProfile(ctx, job, { write = true } = {}) {
|
|
|
1532
1533
|
const current = resolveProfile(job);
|
|
1533
1534
|
if (current && current.key !== sidecar.profileKey)
|
|
1534
1535
|
runLog(ctx.paths.runDir, { event: "profile-mismatch", sidecar: sidecar.profileKey, resolved: current.key });
|
|
1536
|
+
// THE MATCH IS RECORDED TOO, and that is the point rather than symmetry for its own sake.
|
|
1537
|
+
// `profile-mismatch` existed and its counterpart did not, so "the profile was right" was carried
|
|
1538
|
+
// by the ABSENCE of a row — and an absence cannot tell "it matched" from "the probe never ran"
|
|
1539
|
+
// (it throws below on a broken profiles/ state) or from "this run predates the probe". Three
|
|
1540
|
+
// different facts, one empty grep. The positive row says which.
|
|
1541
|
+
else if (current)
|
|
1542
|
+
runLog(ctx.paths.runDir, { event: "profile-resolved", sidecar: sidecar.profileKey, resolved: current.key });
|
|
1535
1543
|
} catch (e) {
|
|
1536
1544
|
runLog(ctx.paths.runDir, { event: "profile-mismatch-probe-failed", error: String(e.message).slice(0, 120) });
|
|
1537
1545
|
}
|
|
@@ -1663,13 +1671,13 @@ export function attachSearchPolicy(ctx, job, { write = true } = {}) {
|
|
|
1663
1671
|
try { ctx.searchPolicy = JSON.parse(raw); }
|
|
1664
1672
|
catch (e) { throw new Error(`_driver/search-policy.json is corrupt (${e.message}) — investigate; the frozen policy is never silently re-derived`); }
|
|
1665
1673
|
} else if (!write) {
|
|
1666
|
-
// pre-spine run read-only (reconstructCtx / legacy resume): implicitly a
|
|
1674
|
+
// pre-spine run read-only (reconstructCtx / legacy resume): implicitly a clearotron — the only shape that
|
|
1667
1675
|
// existed. It names a RETIRED row on purpose: this branch describes a run that already happened, and
|
|
1668
1676
|
// RETIRED_POLICIES exists so an archived run re-renders under the name it was sold under. But ONLY
|
|
1669
1677
|
// for a selector-less job: a selector-carrying job with no frozen sidecar must never be assumed into
|
|
1670
1678
|
// a clearance (review 2026-07-17 — the crash-reclaim/reconstruct window).
|
|
1671
1679
|
if (!noSelector)
|
|
1672
|
-
throw new Error(`run dir has no frozen search policy but the job names a selector (product=${JSON.stringify(job?.product ?? null)}, recipeKey=${JSON.stringify(job?.recipeKey ?? null)}) — refusing the legacy-implicit
|
|
1680
|
+
throw new Error(`run dir has no frozen search policy but the job names a selector (product=${JSON.stringify(job?.product ?? null)}, recipeKey=${JSON.stringify(job?.recipeKey ?? null)}) — refusing the legacy-implicit clearotron assumption; re-dispatch cold so the policy is minted`);
|
|
1673
1681
|
ctx.searchPolicy = { schema: 1, level: "prelim", pipeline: "clearance", stageLabel: "Depth 4", components: {}, recipe: null, origins: { level: "legacy-implicit" } };
|
|
1674
1682
|
} else {
|
|
1675
1683
|
let resolved;
|
|
@@ -1697,7 +1705,7 @@ export function attachSearchPolicy(ctx, job, { write = true } = {}) {
|
|
|
1697
1705
|
} catch (e) { resolved = { clarify: `search-policy resolution errored: ${String(e?.message ?? e).slice(0, 160)}` }; }
|
|
1698
1706
|
// A CLARIFY THROWS. THERE IS NO FAIL-OPEN LEFT, and its deletion is the point.
|
|
1699
1707
|
//
|
|
1700
|
-
// It used to fall open to the literal level `
|
|
1708
|
+
// It used to fall open to the literal level `clearotron` — stageLabel "Depth 4" — whenever the job named
|
|
1701
1709
|
// no selector and the profile carried no default. Both halves of that condition had rotted: the
|
|
1702
1710
|
// selector test read the deleted `searchLevel` (so it was true for every job) and the profile test
|
|
1703
1711
|
// read the deleted `defaultSearchLevel` (so it was undefined for every profile). The branch was
|
|
@@ -1763,7 +1771,7 @@ export function attachSearchPolicy(ctx, job, { write = true } = {}) {
|
|
|
1763
1771
|
runLog(ctx.paths.runDir, { event: "level-scope-note", note: n });
|
|
1764
1772
|
}
|
|
1765
1773
|
// The fold runs on EVERY path through this door — fresh mint, frozen-sidecar resume, legacy
|
|
1766
|
-
// implicit
|
|
1774
|
+
// implicit clearotron (recipeScope null there = no-op) — so every downstream consumer of
|
|
1767
1775
|
// job.jurisdictions/classes/platforms sees the scope the preview promised.
|
|
1768
1776
|
foldRecipeScope(job, ctx.searchPolicy);
|
|
1769
1777
|
// Phase 2a: "knockout" is now a dispatchable pipeline — the refusal covers only shapes THIS build
|
|
@@ -2285,7 +2293,7 @@ function attachRegisterPlan(ctx, { frozenOnly = false } = {}) {
|
|
|
2285
2293
|
// Repair-first D, hotfixed 2026-07-06 (The Quiet Trail e2e): the gate now applies the round's own
|
|
2286
2294
|
// doctrine to itself — A REPAIRABLE CONDITION NEVER TERMINATES A RUN.
|
|
2287
2295
|
// - `repairable` issues (OR-stack width/name length): log-only from ANY provenance — the executor
|
|
2288
|
-
// chunks oversized stacks at runtime (
|
|
2296
|
+
// chunks oversized stacks at runtime (proven live). The 2026-07-06 failure was exactly this
|
|
2289
2297
|
// gate throwing on a 674-name entry INHERITED byte-identical from a pre-split July-3 store via
|
|
2290
2298
|
// the recall-monotone extension — a run the executor would have completed.
|
|
2291
2299
|
// - `unexecutable` issues (empty terms, unknown predicate, non-numeric classes, dangling guards):
|
|
@@ -2660,7 +2668,7 @@ function deriveFloorDuty(ctx, r, trigger = null) {
|
|
|
2660
2668
|
try { placements = parsePlacementsJson(readFileSync(P.placementModel, "utf8")).placements; }
|
|
2661
2669
|
catch (e) { return notComputable(`placements.json unparseable: ${String(e?.message ?? e).slice(0, 80)}`); }
|
|
2662
2670
|
const artifact = reconcileFloorDuty({ floors, placements });
|
|
2663
|
-
// The pass's own outcome, beside the rows.
|
|
2671
|
+
// The pass's own outcome, beside the rows. That lesson: a stage that failed or skipped makes every
|
|
2664
2672
|
// record it did not reach an UPSTREAM ABSENCE, not a judgment, and a reader blaming the seat for a
|
|
2665
2673
|
// crash is reading the artifact wrong.
|
|
2666
2674
|
artifact.pass = { ok: r?.ok === true, skipped: r?.skipped === true };
|
|
@@ -2952,7 +2960,7 @@ function recordSynthesisSeam(ctx, r, trigger = null) {
|
|
|
2952
2960
|
// say only that synthesis had not delivered it. The sibling seam one stage earlier
|
|
2953
2961
|
// (`recordDigestSeam`) has read its stage's own output per record since it was written; this one
|
|
2954
2962
|
// had nothing to read until `record_declination` gave synthesis somewhere to say it.
|
|
2955
|
-
// The judgment itself is `seamReasonFor`, pure and next door, so
|
|
2963
|
+
// The judgment itself is `seamReasonFor`, pure and next door, so the guarantee has an arm
|
|
2956
2964
|
// that does not need a run directory. This callback is now only the plumbing around it.
|
|
2957
2965
|
return seamReasonFor(declined, uri);
|
|
2958
2966
|
},
|
|
@@ -3016,7 +3024,7 @@ export function deriveRecordCarry(ctx, trigger, { findings = null } = {}) { //
|
|
|
3016
3024
|
// ── THE RECONCILIATION RATCHET ────────────────────────────────────────────────────────────
|
|
3017
3025
|
//
|
|
3018
3026
|
// RECORDED ON EVERY RUN, tripping only against the committed floor. Both halves are deliberate:
|
|
3019
|
-
// a gate that fires on every current run teaches its reader that red means nothing (
|
|
3027
|
+
// a gate that fires on every current run teaches its reader that red means nothing (the whole
|
|
3020
3028
|
// complaint), and a warning that never bites is decoration. The floor is what the contract achieves
|
|
3021
3029
|
// today, dated and seeded from a delivered round, and it moves UP when the seat-compliance work
|
|
3022
3030
|
// lands.
|
|
@@ -3168,7 +3176,7 @@ function plannedChannelsFor(P) {
|
|
|
3168
3176
|
|
|
3169
3177
|
// ── part 2 — THE CHANNEL COMPARISON, AT SEARCH-STAGE EXIT ────────────────────────────────────
|
|
3170
3178
|
//
|
|
3171
|
-
// Part 1 shipped the comparison and wired the plan into it (
|
|
3179
|
+
// Part 1 shipped the comparison and wired the plan into it (), and it runs at PUBLISH —
|
|
3172
3180
|
// where the rest of the carry trace is derived, about two hours after the sweep it describes. The issue
|
|
3173
3181
|
// asked whether plan-vs-executed is knowable earlier. It is: the merged grid has just been written and
|
|
3174
3182
|
// the spec has been on disk since dispatch, so both inputs exist at this instant and neither changes.
|
|
@@ -3423,7 +3431,7 @@ async function runDigest(ctx, opts = {}) {
|
|
|
3423
3431
|
// — THE SAME SENTINEL IS THE COVERAGE FORM'S ERA STAMP, AND THE WRITE ORDER IS THE FAIL-CLOSED
|
|
3424
3432
|
// LEG. `armCoverageForm` stamps `form_required: true` BEFORE `writeCoverageForm` puts the form on
|
|
3425
3433
|
// disk. Get that order wrong and a failed form write leaves no stamp, the gate never arms, and the run
|
|
3426
|
-
// passes having judged nothing — which is
|
|
3434
|
+
// passes having judged nothing — which is the confirmed blocker (a missing sidecar returns
|
|
3427
3435
|
// {rows:null,error:null}, the validator finds nothing to judge, and a run with NO ruling artifact is
|
|
3428
3436
|
// byte-for-byte indistinguishable from a fully ruled one). It is reachable: a full disk fails as
|
|
3429
3437
|
// "artifact absent", not as a disk error. In this order a failed write leaves a stamp saying a form
|
|
@@ -3571,7 +3579,7 @@ async function runDigest(ctx, opts = {}) {
|
|
|
3571
3579
|
export function digestDispatchExtra(ctx, { trigger = "fresh", willRun = true, extra = undefined } = {}) {
|
|
3572
3580
|
const P = ctx.paths;
|
|
3573
3581
|
let out = extra;
|
|
3574
|
-
// — THE COVERAGE FORM BRIEF, replacing
|
|
3582
|
+
// — THE COVERAGE FORM BRIEF, replacing the deferred-slice block (was A8, 2026-07-30).
|
|
3575
3583
|
//
|
|
3576
3584
|
// What stood here composed a prose list of every deferred qid and told the stage each one "must appear
|
|
3577
3585
|
// VERBATIM in a Coverage-ledger row". The block's own doc block explained why it could not elide any of
|
|
@@ -4189,7 +4197,7 @@ async function stageOnce(name, ctx, opts = {}) {
|
|
|
4189
4197
|
// path all reach the seat through here, and three separate pre-dispatch writes would be three chances
|
|
4190
4198
|
// to disagree about what the seat was handed.
|
|
4191
4199
|
//
|
|
4192
|
-
// ORDER MATTERS AND IT IS THE FAIL-CLOSED WAY ROUND (
|
|
4200
|
+
// ORDER MATTERS AND IT IS THE FAIL-CLOSED WAY ROUND (the lesson): the era stamp lands first, above,
|
|
4193
4201
|
// so a form write that fails leaves a stamp saying a form was required and no form to fill — a named,
|
|
4194
4202
|
// loud state — rather than no stamp at all, which would silently disarm the whole arm on exactly the
|
|
4195
4203
|
// run it governs.
|
|
@@ -4259,7 +4267,7 @@ async function stageOnce(name, ctx, opts = {}) {
|
|
|
4259
4267
|
// The carry fills the gap BEHIND them: a cold re-dispatch that would otherwise re-commission the stage
|
|
4260
4268
|
// from def.message(ctx) and throw away everything the parked cycle achieved.
|
|
4261
4269
|
// — WHAT THIS RUN HAS ALREADY CORRECTED FOR THIS SEAT. Read from `_driver/<seat>.jsonl`, the
|
|
4262
|
-
// same per-attempt record
|
|
4270
|
+
// same per-attempt record the acceptance criterion is written against, so the fix and its test
|
|
4263
4271
|
// bind to one authority. Best-effort by construction: no log, an unreadable log or a damaged line
|
|
4264
4272
|
// yields an empty list and the followup is byte-identical to what it was before.
|
|
4265
4273
|
const carry = (opts.followup == null && opts.freshMessage == null && out)
|
|
@@ -4709,7 +4717,7 @@ export function buildFailurePacket({ runId, agent, job = {}, failedStage, shortR
|
|
|
4709
4717
|
// `failed: true` and `kind: "run-failed"` (added by both callers) are UNCHANGED on a refusal, and
|
|
4710
4718
|
// deliberately: they are the packet's ROUTING — "this run delivered nothing, send the no-delivery
|
|
4711
4719
|
// notice" — and every relay, the outbox and docs/DELIVERY.md are built on them. `refused` is the
|
|
4712
|
-
// discriminator beside them, written true OR false on every packet for
|
|
4720
|
+
// discriminator beside them, written true OR false on every packet for the reason: an absent key
|
|
4713
4721
|
// must not be the only thing separating "not a refusal" from "a packet written before the field
|
|
4714
4722
|
// existed".
|
|
4715
4723
|
runId, agent, failed: true, refused,
|
|
@@ -4730,8 +4738,8 @@ export function buildFailurePacket({ runId, agent, job = {}, failedStage, shortR
|
|
|
4730
4738
|
: `<p>${esc(orderedIs)} for <b>${esc(mark)}</b> FAILED at stage <b>${esc(failedStage)}</b>${priorAttempts ? ` after <b>${priorAttempts} automatic recovery attempt${priorAttempts === 1 ? "" : "s"}</b>` : ""} and NOTHING was delivered.</p><p>${esc(kindLine)}</p><p>The driver reported, verbatim:</p><pre style="white-space:pre-wrap">${esc(reasonVerbatim)}</pre>${detailBlock}${attempted}<p>The run directory is preserved for diagnosis; re-trigger the run when the cause is addressed.</p>`,
|
|
4731
4739
|
whatsappTo,
|
|
4732
4740
|
whatsappText: refused
|
|
4733
|
-
? `⛔
|
|
4734
|
-
: `❌
|
|
4741
|
+
? `⛔ Clearotron search for ${mark} REFUSED at ${failedStage} [${terminalKind}]: ${shortReason} — nothing was delivered and nothing broke; ${retryHint}.`
|
|
4742
|
+
: `❌ Clearotron search for ${mark} FAILED at ${failedStage}${priorAttempts ? ` after ${priorAttempts} automatic recovery attempt${priorAttempts === 1 ? "" : "s"}` : ""}${terminalKind ? ` [${terminalKind}]` : ""}: ${shortReason} — nothing was delivered; ${retryHint}.`,
|
|
4735
4743
|
markName: job.markName ?? job.name ?? null, failedStage, reason: shortReason,
|
|
4736
4744
|
reasonVerbatim, failureSignature: sig, failClass, terminalKind, repairs, recoveryAttempts: priorAttempts,
|
|
4737
4745
|
reasonDetail: detail, reasonQuantity: quantity,
|
|
@@ -5137,7 +5145,7 @@ export function projectStageInput(label, absPath) {
|
|
|
5137
5145
|
// that receipt, and this is where it becomes readable off the run rather than inferable from a token
|
|
5138
5146
|
// that no longer names it.
|
|
5139
5147
|
//
|
|
5140
|
-
// WHY IT ALSO FIRES ON THE FAILURE PATH. The two numbers this writes are the ones
|
|
5148
|
+
// WHY IT ALSO FIRES ON THE FAILURE PATH. The two numbers this writes are the ones the sequencing
|
|
5141
5149
|
// ruling says the boundary gets tuned against — obligations carrying a written disposition that failed
|
|
5142
5150
|
// to bind, against obligations the model never addressed. Recorded only where the gate PASSED, they
|
|
5143
5151
|
// would be missing from exactly the runs that need explaining: a run that still goes terminal at
|
|
@@ -5175,7 +5183,7 @@ export function connotationAuditSeats(P, runDir) {
|
|
|
5175
5183
|
}
|
|
5176
5184
|
|
|
5177
5185
|
// EXPORTED FOR THE SAME REASON `connotationAuditSeats` IS: the seat resolution was testable and the
|
|
5178
|
-
// numbers it produces were not, so
|
|
5186
|
+
// numbers it produces were not, so the whole point — that the audit READS the verdict ledger — was
|
|
5179
5187
|
// asserted only in the pure functions it calls. A wiring that never runs in a test is a wiring nobody has
|
|
5180
5188
|
// seen work.
|
|
5181
5189
|
export function recordConnotationAudit(run, P) {
|
|
@@ -5184,7 +5192,7 @@ export function recordConnotationAudit(run, P) {
|
|
|
5184
5192
|
let didNotBind = 0, neverAddressed = 0, quotesUnbound = 0, recordedQueries = 0;
|
|
5185
5193
|
// — the three numbers that make "never addressed" falsifiable. `unruledAll` is the TOTAL this
|
|
5186
5194
|
// audit used to report under `obligationsNeverAddressed`, kept as its own field so the split can
|
|
5187
|
-
// never take a headline number to zero without a companion rising to meet it (
|
|
5195
|
+
// never take a headline number to zero without a companion rising to meet it (the hazard, in the
|
|
5188
5196
|
// very number is about).
|
|
5189
5197
|
let unruledAll = 0, addressedNotDischarged = 0, ledgerCalls = 0, ledgerSeats = 0;
|
|
5190
5198
|
const refusalReasons = {}; // — the LEDGER's reasons: every refusal and drop recorded
|
|
@@ -5288,7 +5296,7 @@ export function recordConnotationAudit(run, P) {
|
|
|
5288
5296
|
if (!id || groundsSeen.has(id)) continue;
|
|
5289
5297
|
groundsSeen.set(id, classifyGroundsNote(r?.note));
|
|
5290
5298
|
}
|
|
5291
|
-
// The two states
|
|
5299
|
+
// The two states the sequencing ruling asks to be counted apart, in the form's vocabulary: a row
|
|
5292
5300
|
// the seat WROTE that the gate cannot accept (a damaged form — the disposition exists and is
|
|
5293
5301
|
// readable) against a row it never filled in at all.
|
|
5294
5302
|
const damaged = conn.filter((v) => v.reason === "form_damaged");
|
|
@@ -5355,7 +5363,7 @@ export function recordConnotationAudit(run, P) {
|
|
|
5355
5363
|
// The rename is the fix, not a tidy-up. On R5 round 7a30934b the artifact carried
|
|
5356
5364
|
// `refusalReasons: {}` beside a ledger of 193 refusals over 8 types, because everything had been
|
|
5357
5365
|
// discharged by the end. Nothing was wrong with the number; the name promised the other population,
|
|
5358
|
-
// so an empty map read as "nothing was refused" and took
|
|
5366
|
+
// so an empty map read as "nothing was refused" and took the acceptance criterion C with it.
|
|
5359
5367
|
if (foldIntoRunTotals) for (const [reason, n] of Object.entries(ledgerReasonHistogram(ledger)))
|
|
5360
5368
|
refusalReasons[reason] = (refusalReasons[reason] ?? 0) + n;
|
|
5361
5369
|
// — the part of that histogram that belongs to no row, kept separately so `refusalReasons`
|
|
@@ -5436,7 +5444,7 @@ export function recordConnotationAudit(run, P) {
|
|
|
5436
5444
|
unruledRefusalReasons,
|
|
5437
5445
|
// ITS OWN CARDINALITY, NAMED. The issue that found the empty histogram read
|
|
5438
5446
|
// `distinctReasons: 14` as its count and concluded the map had been dropped after being counted.
|
|
5439
|
-
// It had not: `distinctReasons` is
|
|
5447
|
+
// It had not: `distinctReasons` is the SECOND SCALE — distinct executed query SHAPES, from
|
|
5440
5448
|
// `connotationReasonKey` over the grid — and has nothing to do with refusal tokens. Two unrelated
|
|
5441
5449
|
// numbers, one of them named `…Reasons`, one screenful apart. Naming both is the fix for that
|
|
5442
5450
|
// reading; asserting they agree, which the issue asked for, would assert something false.
|
|
@@ -6135,8 +6143,70 @@ function sentinel(runDir, name, obj) {
|
|
|
6135
6143
|
atomicWrite(join(runDir, name), JSON.stringify({ ts: new Date().toISOString(), ...obj }, null, 2) + "\n");
|
|
6136
6144
|
}
|
|
6137
6145
|
|
|
6146
|
+
/**
|
|
6147
|
+
* Settle every queued what-if BEFORE the run dir moves into the archive — tracker issue 240.
|
|
6148
|
+
*
|
|
6149
|
+
* A queued job lives under the run directory, and the worker enumerates candidates with `liveRunDirs`,
|
|
6150
|
+
* which skips `archive` outright. So archiving carried a pending job out of the worker's reach: not
|
|
6151
|
+
* claimed, not settled, not refused. The client who asked for it got no answer and no explanation, and
|
|
6152
|
+
* no row anywhere said why. That is an absence reported as nothing at all — the one shape
|
|
6153
|
+
* `whatIfRefusal` exists to prevent.
|
|
6154
|
+
*
|
|
6155
|
+
* BEFORE the rename, deliberately: the settlement is written into the run dir and travels with it, so
|
|
6156
|
+
* the answer is on disk in the archive where the read tool will look for it.
|
|
6157
|
+
*
|
|
6158
|
+
* ✕ THE SENTENCE IS PER KIND, and a memo does not get the stage one. `whatIfRefusal`'s standing
|
|
6159
|
+
* refusal — "this run is delivered or archived, what-if runs on live runs only" — is TRUE of a stage
|
|
6160
|
+
* and FALSE of a memo, which runs on archived evidence by design. Telling a client their memo was
|
|
6161
|
+
* refused because the run is archived would be a false sentence in the one place they go to find out
|
|
6162
|
+
* what happened. A memo is closed on the true reason instead: it was queued before the run archived,
|
|
6163
|
+
* and the drain does not reach an archived run.
|
|
6164
|
+
*
|
|
6165
|
+
* ✕ A JOB ANOTHER WORKER IS ACTIVELY RUNNING IS LEFT ALONE. `pendingWhatIf` returns queued jobs and
|
|
6166
|
+
* claims older than an hour, never a fresh claim, so a live worker's job is not settled underneath it.
|
|
6167
|
+
* A fresh claim at the moment of archiving is a race this does not close, and it is written down
|
|
6168
|
+
* rather than papered over.
|
|
6169
|
+
*
|
|
6170
|
+
* Best-effort throughout: a failure to settle must never stop the archive, because a run that cannot
|
|
6171
|
+
* archive is a much larger problem than a job with no row.
|
|
6172
|
+
*/
|
|
6173
|
+
export function settlePendingWhatIfsBeforeArchive(run) {
|
|
6174
|
+
let pending = [];
|
|
6175
|
+
// NOT a silent catch. This function exists because a job went unanswered with no row anywhere; a
|
|
6176
|
+
// failure to enumerate that returned quietly would reproduce exactly that, one level up, and the
|
|
6177
|
+
// archive would still succeed so nothing downstream would look wrong.
|
|
6178
|
+
try { pending = pendingWhatIf(run.runDir); }
|
|
6179
|
+
catch (e) { note(`what-if settle before archive could not enumerate the queue (${String(e?.message ?? e).slice(0, 120)}) — pending jobs may be unanswered`); return; }
|
|
6180
|
+
for (const entry of pending) {
|
|
6181
|
+
try {
|
|
6182
|
+
// CLAIM FIRST, exactly as the worker does. `finishWhatIf` writes the terminal file and does not
|
|
6183
|
+
// remove the `.json`; the claim is what renames it out of the queue. Settling without claiming
|
|
6184
|
+
// writes a `.failed` beside a `.json` that still reads as QUEUED to every reader — the job would
|
|
6185
|
+
// look pending and answered at the same time, which is worse than the silence being fixed here.
|
|
6186
|
+
const job = claimWhatIf(entry);
|
|
6187
|
+
if (!job) continue; // another worker won it, or it vanished — not ours to settle
|
|
6188
|
+
const kind = job?.op?.kind === "memo" ? "memo" : "stage";
|
|
6189
|
+
// ✕ THE SENTENCE IS PER KIND. The standing refusal — "what-if runs on live runs only" — is TRUE
|
|
6190
|
+
// of a stage and FALSE of a memo, which reasons over archived evidence by design. A memo is
|
|
6191
|
+
// closed on the true reason instead.
|
|
6192
|
+
const error = kind === "memo"
|
|
6193
|
+
? "this what-if was queued before its run was archived, and the drain does not reach an archived run — ask it again against the archived run, which a memo may read"
|
|
6194
|
+
: (whatIfRefusal({ location: "archive", state: run.state ?? null, kind }) ?? "this run is delivered or archived — what-if runs on live runs only");
|
|
6195
|
+
finishWhatIf(run.runDir, entry.id, { ok: false, op: job.op ?? null, error });
|
|
6196
|
+
try { runLog(run.runDir, { event: "whatif-settled-on-archive", id: entry.id, kind, stale: entry.stale }); }
|
|
6197
|
+
catch { /* the row is written; the log line is a convenience and must not undo it */ }
|
|
6198
|
+
} catch (e) {
|
|
6199
|
+
// One job's settlement must not cost the others, or the archive — but it must not be SILENT
|
|
6200
|
+
// either. A swallowed failure here leaves exactly the unanswered job this function exists to
|
|
6201
|
+
// prevent, and the archive still succeeds, so nothing downstream looks wrong.
|
|
6202
|
+
note(`what-if ${entry.id} could not be settled before archive (${String(e?.message ?? e).slice(0, 120)}) — it may be unanswered`);
|
|
6203
|
+
}
|
|
6204
|
+
}
|
|
6205
|
+
}
|
|
6206
|
+
|
|
6138
6207
|
function archive(run) {
|
|
6139
6208
|
try {
|
|
6209
|
+
settlePendingWhatIfsBeforeArchive(run);
|
|
6140
6210
|
mkdirSync(dirname(run.archiveDir), { recursive: true });
|
|
6141
6211
|
renameSync(run.runDir, run.archiveDir);
|
|
6142
6212
|
return run.archiveDir;
|
|
@@ -6674,7 +6744,7 @@ function injectDeferralCoverage(P, runDir, note) {
|
|
|
6674
6744
|
// (findings.json coverage vocabulary calls the field `state`; the register ledger calls the same
|
|
6675
6745
|
// closed token `status` — one vocabulary, two key names.)
|
|
6676
6746
|
// — LANE-GENERAL, not zh-hardcoded. LANGUAGE_LANES defines zh, ja and ko; the disclosure was
|
|
6677
|
-
// written for zh alone, so a Japan- or Korea-scoped run at plain
|
|
6747
|
+
// written for zh alone, so a Japan- or Korea-scoped run at plain clearotron said NOTHING about the
|
|
6678
6748
|
// Japanese/Korean-script equivalents it had not searched. Silence there is indistinguishable from
|
|
6679
6749
|
// "there was nothing to search" — the same absence-reads-as-a-pass class as the remedy-term half of
|
|
6680
6750
|
//, one layer over.
|
|
@@ -7055,7 +7125,7 @@ export function fullProseOrdinals(findings) {
|
|
|
7055
7125
|
// ADVISORY_KINDS member could never reach a client document at all. The 2026-07-16 comment described the
|
|
7056
7126
|
// behaviour it shipped with and became stale prose sitting next to code that contradicted it.
|
|
7057
7127
|
//
|
|
7058
|
-
// Owner ruling 2026-08-19 (relayed), on a renewal-deadline example: it renders.
|
|
7128
|
+
// Owner ruling 2026-08-19 (relayed), on a renewal-deadline example: it renders. That intent is the
|
|
7059
7129
|
// ruled behaviour. The tag is REQUIRED, not decoration — `advisoryLine` interpolates ADVISORY_TAG[a.kind]
|
|
7060
7130
|
// directly, so a kind that passes the filter without an entry here renders "- **undefined** …" into a
|
|
7061
7131
|
// client document. Whoever adds a fifth kind adds it in both places, and render.mjs needs the matching
|
|
@@ -7123,7 +7193,7 @@ export function buildOnlyYouSection(actions, findings, { nowMs = Date.now(), wit
|
|
|
7123
7193
|
//
|
|
7124
7194
|
// WHAT DOES NOT HOLD, and is not claimed: an ask may still name a party THE RUN NEVER SAW — a
|
|
7125
7195
|
// supplier, a licensee, a distributor no finding carries. No index built from findings can see it.
|
|
7126
|
-
//
|
|
7196
|
+
// That orphan lint is what catches that at delivery, and this is the producer telling the truth
|
|
7127
7197
|
// about its own reach instead of covering for it.
|
|
7128
7198
|
const byOrd = new Map((findings ?? []).filter((f) => f && f.disposition !== "withdrawn").map((f) => [f.ordinal, f]));
|
|
7129
7199
|
const partyIndex = cardedParties(findings);
|
|
@@ -7152,7 +7222,7 @@ export function buildOnlyYouSection(actions, findings, { nowMs = Date.now(), wit
|
|
|
7152
7222
|
// Terminal punctuation on the ask BEFORE the subject join. This was written to work around a cut —
|
|
7153
7223
|
// actYouConditions ended its bound line at the first '.' or ':' before whitespace, and the subject's
|
|
7154
7224
|
// own "(re:" qualified, so a period-less ask (the synthesis prompt demands one sentence but nothing
|
|
7155
|
-
// enforces terminal punctuation) delivered as a mangled "…terms (re". THAT CUT IS GONE (
|
|
7225
|
+
// enforces terminal punctuation) delivered as a mangled "…terms (re". THAT CUT IS GONE (owner
|
|
7156
7226
|
// ruling 2026-08-10): the conditions box now renders the ask and its subject whole. The punctuation
|
|
7157
7227
|
// stays because it was always the right output — "Instruct counsel on the joined-script forms (re: X)"
|
|
7158
7228
|
// reads as one run-on sentence, and the period is what separates the ask from the driver's own note.
|
|
@@ -7262,7 +7332,7 @@ export function buildOnlyYouSection(actions, findings, { nowMs = Date.now(), wit
|
|
|
7262
7332
|
// senior-eye-review.md through `parseVerdict` and `parseCorrections` — the SHIPPED parsers, the same
|
|
7263
7333
|
// ones the corrective ladder builds its worklist from — and never asks a model to restate them.
|
|
7264
7334
|
//
|
|
7265
|
-
// ── NOT BLOCKING-ONLY ANY MORE — OWNER DECISION, 2026-08-26 (
|
|
7335
|
+
// ── NOT BLOCKING-ONLY ANY MORE — OWNER DECISION, 2026-08-26 (T3b) ─────────────
|
|
7266
7336
|
//
|
|
7267
7337
|
// This section used to return "" on every verdict but BLOCKING, and the reason it gave was that
|
|
7268
7338
|
// CONDITIONAL reviews already deliver and their flags already reach the corrective pass. That is true
|
|
@@ -7503,7 +7573,7 @@ export function assembleReportMd(P, findings, cardOrdinals, { grouped = [], byRi
|
|
|
7503
7573
|
if (fc.fold) folds.push({ ...fc.fold, surface: "overview:caption" });
|
|
7504
7574
|
}
|
|
7505
7575
|
// spec 64 — merge the code-built only-you section into the overview's # Actions block. A model-
|
|
7506
|
-
// authored "### Only you can close these" (pre- prompt, or drift) is REPLACED wholesale —
|
|
7576
|
+
// authored "### Only you can close these" (pre-change prompt, or drift) is REPLACED wholesale —
|
|
7507
7577
|
// code wins, so the section can never contradict the register the verdict derives from.
|
|
7508
7578
|
// PR-9 — same pattern for "### Answers to your instructions": code-built from the findings.json
|
|
7509
7579
|
// ask_answers register joined to the frozen intake asks; an authored section is replaced wholesale.
|
|
@@ -7651,7 +7721,7 @@ export function assembleReportMd(P, findings, cardOrdinals, { grouped = [], byRi
|
|
|
7651
7721
|
// that was checked, and nothing made them.
|
|
7652
7722
|
//
|
|
7653
7723
|
// FULL TEXT. Nothing on any surface shortens a judgment sentence — the renderer's 240-character fold
|
|
7654
|
-
// was deleted with (2026-08-06) and no cap replaced it; the sentence is bounded by
|
|
7724
|
+
// was deleted with (2026-08-06) and no cap replaced it; the sentence is bounded by the shape
|
|
7655
7725
|
// contract instead. Whitespace is collapsed only so the value cannot break the one-line `- key:`
|
|
7656
7726
|
// shape parseCards keys on.
|
|
7657
7727
|
//
|
|
@@ -8066,7 +8136,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
8066
8136
|
// recovery ladder's weather lane exists so a 529 does not spend the defect budget. Refusing there would
|
|
8067
8137
|
// replace a park that recovers with a terminal failure and a human.
|
|
8068
8138
|
//
|
|
8069
|
-
// GATED like the credential check, not like the binary check, and that is
|
|
8139
|
+
// GATED like the credential check, not like the binary check, and that is the ruling rather than
|
|
8070
8140
|
// this file's: lanes with an injected recordFetcher and explicitly-selected knockout products do not
|
|
8071
8141
|
// pay for the turn. Both of those lanes DO spawn the engine (preflightEngineBinary's header says so in
|
|
8072
8142
|
// as many words), so the exemption is narrower than the reasoning that produced it — recorded on the
|
|
@@ -8248,7 +8318,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
8248
8318
|
// Search-depth spine — freeze WHICH product shape this run is BEFORE the framework freeze (Phase 2a:
|
|
8249
8319
|
// the knockout lane selects a different fallback framework, so the dispatch must happen first; the
|
|
8250
8320
|
// policy freeze reads only ctx.profile). Cold-start mint only, like the profile freeze: a resumed
|
|
8251
|
-
// pre-spine run reads as legacy-implicit
|
|
8321
|
+
// pre-spine run reads as legacy-implicit clearotron, never retro-minted.
|
|
8252
8322
|
attachSearchPolicy(ctx, job, { write: !isResume });
|
|
8253
8323
|
// acceptance 5 — recorded on EVERY run, ungraded included: "which ladder applied" must be a
|
|
8254
8324
|
// read, never an inference from which product the job asked for.
|
|
@@ -8499,7 +8569,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
8499
8569
|
ctx.exclusionSeed = applicantMatchesProfile(ctx.profile, job.customer) ? (ctx.profile.selfExclusionOwners ?? []) : [];
|
|
8500
8570
|
if (ctx.exclusionSeed.length) runLog(run.runDir, { event: "profile-exclusion-seed", owners: ctx.exclusionSeed.length });
|
|
8501
8571
|
// On resume, rehydrate the driver-owned notes that must survive a park. (The failover provenance that
|
|
8502
|
-
// used to be rehydrated alongside is deleted with the chain
|
|
8572
|
+
// used to be rehydrated alongside is deleted with the chain — no run ever carried any.)
|
|
8503
8573
|
if (isResume) {
|
|
8504
8574
|
try {
|
|
8505
8575
|
const prior = JSON.parse(readFileSync(join(run.runDir, "status.json"), "utf8"));
|
|
@@ -8527,7 +8597,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
8527
8597
|
// is measured against. Best-effort: a run must never fail because it could not be sized.
|
|
8528
8598
|
ctx.quote = quoteForJob({ job, profile: ctx.profile, searchPolicy: ctx.searchPolicy });
|
|
8529
8599
|
if (ctx.quote) runLog(run.runDir, { event: "quote", ...ctx.quote });
|
|
8530
|
-
note(`\n===
|
|
8600
|
+
note(`\n=== clearotron-driver: ${run.slug} / ${run.date}-${run.codename} (agent=${agent}) ===`);
|
|
8531
8601
|
|
|
8532
8602
|
try {
|
|
8533
8603
|
// Phase 0 done in code (slug/codename/run-dir/customer). Phase 1+2 stages:
|
|
@@ -8694,7 +8764,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
8694
8764
|
// register candidates for the
|
|
8695
8765
|
// frozen policy's jxLanes component, folded run-local onto the transliteration-numeric axis so the
|
|
8696
8766
|
// unit spawn (axis-from-plan below), coverage skeleton, taint chain and clean gates inherit with
|
|
8697
|
-
// zero new wiring. Lazy import (a plain
|
|
8767
|
+
// zero new wiring. Lazy import (a plain clearotron never loads jx machinery — byte-identical off);
|
|
8698
8768
|
// never-kill inside runJxCandidateFold (a degraded lane logs + receipts, the Latin plan stands).
|
|
8699
8769
|
if (ctx.searchPolicy?.components?.jxLanes && ctx.registerPlan) {
|
|
8700
8770
|
const { runJxCandidateFold } = await import("./jx.mjs");
|
|
@@ -9370,7 +9440,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
9370
9440
|
// correctly; renaming would churn a documented vocabulary across two producers, a map and a
|
|
9371
9441
|
// parameter, to fix a field that is not the one lying.
|
|
9372
9442
|
//
|
|
9373
|
-
// So the row gains the result as a SIBLING —
|
|
9443
|
+
// So the row gains the result as a SIBLING — the other remedy — and the push moves below the
|
|
9374
9444
|
// taint re-read so there IS a result to state. `cleared` is the same fact `axesRec[a].status`
|
|
9375
9445
|
// records two lines down, from this same read.
|
|
9376
9446
|
if (taintRerunDispatch !== null) {
|
|
@@ -11724,7 +11794,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
11724
11794
|
// deliver-conditional floor) keys on actions[]; a v4 emission that omits the field entirely would
|
|
11725
11795
|
// silently disengage it — the exact CLEAR-despite-conditions bug this ships to fix. Same posture as
|
|
11726
11796
|
// the schema-downlevel demand above: ONE warm re-demand, only when synthesis actually RAN this turn
|
|
11727
|
-
// (a resumed pre- artifact keeps its shape — logged loudly, gates degrade); still-absent
|
|
11797
|
+
// (a resumed pre-change artifact keeps its shape — logged loudly, gates degrade); still-absent
|
|
11728
11798
|
// after the demand is logged and rides on (deliver-always, the reviewer's actions-unregistered flag
|
|
11729
11799
|
// and the predelivery coherence lint remain the nets).
|
|
11730
11800
|
const readActionsPresence = () => {
|
|
@@ -12048,7 +12118,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
12048
12118
|
// — what the DECLARED scope was and whether the pass honoured it. Recorded, never refused:
|
|
12049
12119
|
// a gate here costs a whole extra dispatch on the stage this change exists to make cheaper, and
|
|
12050
12120
|
// the reviewer is about to read the table anyway — it is better placed than a diff to say
|
|
12051
|
-
// whether a knock-on edit was right. `unbound` is
|
|
12121
|
+
// whether a knock-on edit was right. `unbound` is the `cite_unbound` shape one gate over and
|
|
12052
12122
|
// would earn a refusal if it recurs; this round measures whether it does.
|
|
12053
12123
|
correctionsScope = scopeDrift(rows, preDoc, postDoc);
|
|
12054
12124
|
atomicWrite(P.correctionsApplied, JSON.stringify({ ts: new Date().toISOString(), verdict,
|
|
@@ -12861,7 +12931,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
12861
12931
|
// round carry no _driver/jx-lanes.json at all. On those the writer would reach its absent arm and
|
|
12862
12932
|
// print "NOT writing one", which reads as a withheld action on a run where absence is simply normal.
|
|
12863
12933
|
// That is the absent-vs-failed conflation this tranche exists to remove; a lazy import also keeps a
|
|
12864
|
-
// plain
|
|
12934
|
+
// plain clearotron byte-identical, which is why the sibling sites are shaped this way.
|
|
12865
12935
|
if (ctx.searchPolicy?.components?.jxLanes) {
|
|
12866
12936
|
try {
|
|
12867
12937
|
const { stateJxSlices } = await import("./jx.mjs");
|
|
@@ -13221,7 +13291,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
13221
13291
|
// one, because the sibling's population boundary is deliberate and correct. It covers a
|
|
13222
13292
|
// finding-ending followed by SILENCE; this covers one followed by a SENTENCE.
|
|
13223
13293
|
//
|
|
13224
|
-
// On R2
|
|
13294
|
+
// On a delivered R2 run the sibling logged `checked:5 matched:5 lost:0` — correctly — on a
|
|
13225
13295
|
// delivery missing two marks from the lawyer's final list, one rated HIGH. They were dropped with
|
|
13226
13296
|
// a reason, so they were outside its population by design. A drop with a reason nobody verifies
|
|
13227
13297
|
// is not accounted for; it is unexamined with a paper trail, and that delivery carried 66 of them.
|
|
@@ -13678,7 +13748,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
13678
13748
|
note(`registry-record closure: ${missing.length} cited record(s) absent from the run's set — targeted fetch`);
|
|
13679
13749
|
const fetcher = opts.recordFetcher ?? defaultRecordFetcher;
|
|
13680
13750
|
for (const uri of missing) {
|
|
13681
|
-
const r = await fetcher(uri, { agentId: "
|
|
13751
|
+
const r = await fetcher(uri, { agentId: "clearotron-driver", sessionKey: `${lintPrefix}record-closure`, recordLog: runRecordLogPath(run.runDir) });
|
|
13682
13752
|
if (!r.ok) recordFetchFailures.set(uri, r.cause);
|
|
13683
13753
|
}
|
|
13684
13754
|
assembled = assembleRunRecords(run.runDir, lintPrefix); // pick up the closure fetches
|
|
@@ -13775,7 +13845,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
13775
13845
|
askAnswers: lintAskAnswers, // PR-9 — present ⇒ the intake-ask check judges the deterministic join, not fuzzy containment
|
|
13776
13846
|
cardFolds: (() => { try { return JSON.parse(readFileSync(driverDir(run.runDir, "card-folds.json"), "utf8")).folds; } catch { return null; } })(), // PR-9 — fold observability (flag-only)
|
|
13777
13847
|
extraPlatformNames: ctx.profile?.platforms ?? [], // WS-B: profile marketplaces are run vocabulary
|
|
13778
|
-
//
|
|
13848
|
+
// the SAME structure the masthead's coverage_line is stamped from
|
|
13779
13849
|
// (scope-facts.json, written by writeScopeFacts). Passing the sidecar rather than re-deriving
|
|
13780
13850
|
// is the point of the issue: the stamped line and the prose check now answer to one searched
|
|
13781
13851
|
// set, so they cannot state two different answers about what was searched. Absent sidecar ⇒
|
|
@@ -14066,7 +14136,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14066
14136
|
// thousands of lines earlier, at the gate. Nothing re-reads it, so a reviewer that refuses to
|
|
14067
14137
|
// sign DURING this repair is written to disk and never heard.
|
|
14068
14138
|
//
|
|
14069
|
-
// Measured on `bf21580e` (
|
|
14139
|
+
// Measured on `bf21580e` (round of 2026-08-23): verdict-2 CONDITIONAL at 00:22:11;
|
|
14070
14140
|
// `delivery-stale-repair` at 00:38:35 naming narrative-refutation; the review landing BLOCKING
|
|
14071
14141
|
// at 00:52:01; delivered. The narrative printed a registration date of 1 March 2011 against a
|
|
14072
14142
|
// fetched record reading 25 February 2011 — the reviewer said so, in the document nobody read.
|
|
@@ -14563,7 +14633,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14563
14633
|
// ratings (joinFindingToBlock), never the summary's own words.
|
|
14564
14634
|
try { emailVerdictOpts.findings = parseFindingsJsonLenient(readFileSync(P.findings, "utf8"))?.findings ?? undefined; } catch { /* no findings — table falls back to the summary words */ }
|
|
14565
14635
|
// doc 50 — the run's band ladder: the email table colours + sorts by the framework in force's own
|
|
14566
|
-
// vocabulary (
|
|
14636
|
+
// vocabulary (one framework's "Medium", the house's "Moderate", another's five bands) instead of the fixed table.
|
|
14567
14637
|
if (ctx.framework) emailVerdictOpts.bands = ctx.framework.bands.map((b) => ({ label: b.label, tone: b.tone }));
|
|
14568
14638
|
// ONE report (spec 2026-07-30 §6): the cover note is a cover note — verdict, one-line summary, link.
|
|
14569
14639
|
// A10 (addendum, 2026-07-30) NARROWS the old "machine-QC never on the email" rule rather than
|
|
@@ -14602,16 +14672,19 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14602
14672
|
conversationId: job.conversationId ?? null, // reply-lane fallback when msgId is not a Graph id
|
|
14603
14673
|
subject: deliverySubject(emailProductName, job),
|
|
14604
14674
|
emailBodyHtml: readFileSync(P.emailBody, "utf8"),
|
|
14605
|
-
|
|
14606
|
-
|
|
14675
|
+
// — the notice goes to whoever ASKED, with the operator's copy beside it and a
|
|
14676
|
+
// stated reason when no number is held. It used to go to AGENT_WHATSAPP[agent], which is the
|
|
14677
|
+
// operator on every run because every user shares one agent id.
|
|
14678
|
+
...whatsappRouting(job, agent),
|
|
14679
|
+
whatsappText: `✅ Clearotron search for ${mark}${ref}${vtag} is done. Report: ${published.url}`,
|
|
14607
14680
|
url: published.url, verdict, markName: job.markName ?? job.name ?? null,
|
|
14608
14681
|
};
|
|
14609
14682
|
// A NEW send supersedes any previous one: .sent is PER-SEND idempotence, not per-run-lifetime.
|
|
14610
14683
|
// A run that terminally failed (notice sent → .sent written) and was then resumed to success
|
|
14611
|
-
// would otherwise be SKIPPED by
|
|
14684
|
+
// would otherwise be SKIPPED by clearotron-deliver's .sent guard — the report would never send.
|
|
14612
14685
|
// The stale failure packet goes too, so the run dir tells exactly one delivery story. B4: the
|
|
14613
14686
|
// per-channel send receipts are per-SEND state exactly like .sent — a stale email receipt from
|
|
14614
|
-
// the superseded send would make
|
|
14687
|
+
// the superseded send would make clearotron-deliver skip THIS packet's email, so they reset together.
|
|
14615
14688
|
try { rmSync(join(run.runDir, ".sent")); } catch { /* none */ }
|
|
14616
14689
|
try { rmSync(driverDir(run.runDir, "send-receipts.json"), { force: true }); } catch { /* none */ }
|
|
14617
14690
|
try { rmSync(driverDir(run.runDir, "failure.json")); } catch { /* none */ }
|
|
@@ -14691,7 +14764,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14691
14764
|
// lands on "unknown", which buys one recovery park — the run would write `.postponed` and the
|
|
14692
14765
|
// runner would auto-resume it two minutes later and keep billing.
|
|
14693
14766
|
// 2. The failure packet would tell them their search BROKE. buildFailurePacket's copy is
|
|
14694
|
-
// "❌
|
|
14767
|
+
// "❌ Clearotron search for X FAILED at Y", pushed to the customer over the outbox. Someone who
|
|
14695
14768
|
// pressed Stop must never be told something went wrong; they already know what happened.
|
|
14696
14769
|
//
|
|
14697
14770
|
// Partial work is not deliverable, so nothing is published — but the spend up to this point is
|
|
@@ -14873,7 +14946,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14873
14946
|
// is precisely what `recoveryResumesAt` means. So a weather park writes `recoveryResumesAt` like
|
|
14874
14947
|
// any other recovery park, still leaves `resetsAt` null, and the record says WHICH lane bought
|
|
14875
14948
|
// the wait in `recoveryLane` instead of implying a provider clock that does not exist.
|
|
14876
|
-
//
|
|
14949
|
+
// A CAP PARK IS NOT A STAGE FAILING, and the 2/15/60 ladder cannot survive one.
|
|
14877
14950
|
// A cap that classifies `rate_limited` already takes the postpone path and waits for its stated
|
|
14878
14951
|
// reset. One that does NOT lands here, where two things used to go wrong: the provider's own reset
|
|
14879
14952
|
// hint was dropped even though StageFailure carries it all the way to this site, and the ladder
|
|
@@ -14910,7 +14983,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14910
14983
|
// lane's spend is recomputed from the record rather than from a second counter that could drift
|
|
14911
14984
|
// (writeRunStatus shallow-merges, so the full array is passed each time).
|
|
14912
14985
|
// — a PARKED run is the one a reader diagnoses from status.json alone, and this cut at 200
|
|
14913
|
-
// and said nothing. `recovering` is not terminal, so it was never covered by
|
|
14986
|
+
// and said nothing. `recovering` is not terminal, so it was never covered by the terminal
|
|
14914
14987
|
// fields; the reader's problem is identical either way — a sentence that stops mid-thought with
|
|
14915
14988
|
// no key admitting it stopped. Same three fields, same function, so the two cannot drift.
|
|
14916
14989
|
writeRunStatus(ctx, { state: "recovering", recoveryAttempts: attempt, recoveryMax, failedStage,
|
|
@@ -14920,7 +14993,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14920
14993
|
//: the row carries the park's progress QUANTITY, so the next failure's comparison can see
|
|
14921
14994
|
// 9 → 6 (converging) where the signature alone shows only "the same defect again". Written
|
|
14922
14995
|
// unconditionally as number|null — a row that says null means "this failure had no count", which
|
|
14923
|
-
// is a different fact from a pre- row that has no such key at all.
|
|
14996
|
+
// is a different fact from a pre-change row that has no such key at all.
|
|
14924
14997
|
//
|
|
14925
14998
|
//: `quantityToken` and `classSource` ride beside it, written unconditionally as value|null
|
|
14926
14999
|
// for the same reason. This row is the ONLY one of the three records here that repair-digest.mjs
|
|
@@ -14931,7 +15004,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14931
15004
|
// half the inputs. It also makes the epoch legible: a row with no `classSource` KEY predates
|
|
14932
15005
|
// this field and was never measured, which is a different fact from a row that says "no gap".
|
|
14933
15006
|
recoveryHistory: [...recoveryHistory, { sig: failSig.sig, stage: failedStage, class: failClass, lane, attempt, quantity, quantityToken: failSig.quantityToken ?? null, kindToken: failSig.kindToken ?? null, classSource, ts: new Date().toISOString(),
|
|
14934
|
-
//
|
|
15007
|
+
// THE SAME FACTS THE RUN LOG ALREADY GETS, in the record that SURVIVES.
|
|
14935
15008
|
// The auto-recovery-parked event below carries capPark/basis/waitMin and says in its own note
|
|
14936
15009
|
// that a cap has to be legible or nobody can tell a stated reset from our ladder's guess. But
|
|
14937
15010
|
// run.jsonl is not what the terminal reads: status.json's recoveryHistory is the only record
|
|
@@ -14942,7 +15015,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
14942
15015
|
...(capSchedule ? { capPark: true, recoveryWaitBasis, recoveryWaitMin } : {}) }] });
|
|
14943
15016
|
rollupStatus(run.studioRoot);
|
|
14944
15017
|
runLog(run.runDir, { event: "auto-recovery-parked", stage: failedStage, attempt, of: recoveryMax, lane, laneAttempt, laneOf: decision.laneCeiling, recoveryResumesAt, reason: String(reason).slice(0, 200), sig: failSig.sig, class: failClass,
|
|
14945
|
-
//
|
|
15018
|
+
// a cap park has to be legible in the record, or the next reader diagnosing
|
|
14946
15019
|
// "why did this wait 21 hours" cannot tell a provider's stated reset from our own ladder guess.
|
|
14947
15020
|
// Absent on a non-cap park rather than false: a row that says nothing is honest about not having
|
|
14948
15021
|
// looked, while `capPark: false` would read as "we checked and it was not one".
|
|
@@ -15055,7 +15128,7 @@ async function pipelineInner(job, opts = {}) {
|
|
|
15055
15128
|
}
|
|
15056
15129
|
// T5 (J5) — the failure NOTICE rides the SAME guaranteed lane as success delivery: a
|
|
15057
15130
|
// CODE-authored packet (_driver/failure.json) + sendPending + the outbox wake marker, consumed by
|
|
15058
|
-
// the completion-watch →
|
|
15131
|
+
// the completion-watch → clearotron-deliver skill exactly like a delivery packet. This makes the
|
|
15059
15132
|
// notice failure-independent: no WhatsApp binding, a handoff-mode engine, or a dead ping stage can
|
|
15060
15133
|
// no longer silence it ( F9: teal-keystone died silently on exactly that). Best-effort —
|
|
15061
15134
|
// packet-write trouble must never mask the original failure; the .failed sentinel + status.json
|
|
@@ -15360,7 +15433,36 @@ function experimentEngineName() {
|
|
|
15360
15433
|
catch { return String(process.env.CLEAROTRON_AI ?? "").trim().toLowerCase() || null; }
|
|
15361
15434
|
}
|
|
15362
15435
|
|
|
15436
|
+
/**
|
|
15437
|
+
* A DRAW IS WORK ON THIS BOX, AND THE DEPLOY GUARD HAS TO BE ABLE TO SEE IT.
|
|
15438
|
+
*
|
|
15439
|
+
* `pipeline()` takes a run slot, so a clearance is visible to `deployRefusal` and an hourly deploy defers
|
|
15440
|
+
* over it. A draw is a direct invocation and took nothing, so the guard saw an idle box and a tick could
|
|
15441
|
+
* fast-forward the checkout, reinstall and restart the units under a running experiment. Measured by the
|
|
15442
|
+
* test lane: the only thing protecting a replication was somebody stopping the deploy timer by hand,
|
|
15443
|
+
* which made that hold load-bearing without anyone having decided it should be.
|
|
15444
|
+
*
|
|
15445
|
+
* IT TAKES ITS OWN LOCK, NOT A RUN SLOT. A run slot is admission-controlled against
|
|
15446
|
+
* `maxConcurrentRuns`, so acquiring one here would make a draw WAIT behind clearances and make clearances
|
|
15447
|
+
* wait behind draws — changing what a draw is in order to fix what a guard can see. The `draw` prefix is
|
|
15448
|
+
* a separate namespace in the same directory: the deploy guard counts it, and nothing else does.
|
|
15449
|
+
*
|
|
15450
|
+
* The cap is deliberately far above any real number of concurrent draws, because this lock exists to be
|
|
15451
|
+
* SEEN and never to ration. A draw that blocked here would be a new failure mode in place of an old one.
|
|
15452
|
+
*/
|
|
15363
15453
|
export async function runExperiment(job, opts) {
|
|
15454
|
+
const lock = await acquireSlot({ dir: config.runLockDir, cap: 1024, prefix: "draw" });
|
|
15455
|
+
try {
|
|
15456
|
+
return await runExperimentInner(job, opts);
|
|
15457
|
+
} finally {
|
|
15458
|
+
// Best-effort, like the run slot's own release: the lock reaper covers a process that dies here, and
|
|
15459
|
+
// a stale draw lock with a dead pid does not refuse a deploy — the guard tests liveness.
|
|
15460
|
+
try { releaseSlot(lock); } catch { /* the reaper covers what this misses */ }
|
|
15461
|
+
}
|
|
15462
|
+
}
|
|
15463
|
+
|
|
15464
|
+
|
|
15465
|
+
async function runExperimentInner(job, opts) {
|
|
15364
15466
|
const name = opts.experiment;
|
|
15365
15467
|
if (!STAGES[name]) throw new Error(`--experiment: unknown stage "${name}"`);
|
|
15366
15468
|
// The axis is checked for MEMBERSHIP, not truthiness, and BEFORE reconstructCtx touches the run dir.
|
|
@@ -15378,7 +15480,7 @@ export async function runExperiment(job, opts) {
|
|
|
15378
15480
|
// against REGISTER_AXES would refuse the two arms this issue exists to make work.
|
|
15379
15481
|
//
|
|
15380
15482
|
// So the membership test is kept and made PER STAGE: every stage that takes an axis names its own
|
|
15381
|
-
// vocabulary, and a stage that takes none still refuses a stray one —
|
|
15483
|
+
// vocabulary, and a stage that takes none still refuses a stray one — the guarantee, unchanged,
|
|
15382
15484
|
// over a valid set that is now true for each stage rather than true for one of them.
|
|
15383
15485
|
const vocab = AXIS_VOCABULARY[name] ?? null;
|
|
15384
15486
|
if (!vocab && axis !== null)
|
|
@@ -15520,6 +15622,17 @@ export async function runExperiment(job, opts) {
|
|
|
15520
15622
|
// what RAN.
|
|
15521
15623
|
engine: experimentEngineName(),
|
|
15522
15624
|
modelTier: model ?? null,
|
|
15625
|
+
// — THE RATING AUTHORITY THIS ARM RAN UNDER, on the arm's own record.
|
|
15626
|
+
//
|
|
15627
|
+
// `whatIfRun` resolves this correctly and returned it in memory only: nothing in the experiment
|
|
15628
|
+
// directory named the profile it rated under, so a reader coming to the arm tomorrow could not
|
|
15629
|
+
// confirm which framework produced it, and a future regression would be as silent as the one this
|
|
15630
|
+
// was opened on. The frozen sidecar is the authority — never a fresh resolve, which is the mid-run
|
|
15631
|
+
// drift the freeze exists to forbid.
|
|
15632
|
+
//
|
|
15633
|
+
// `null` means the run carries no frozen profile (a legacy run), and it is written rather than
|
|
15634
|
+
// omitted: absent and "there was none" are different facts and only one of them is a defect.
|
|
15635
|
+
ratedUnder: ctx.profile?.profileKey ?? null,
|
|
15523
15636
|
dispatchTrigger: opts.dispatchTrigger ?? "fresh",
|
|
15524
15637
|
// — WHICH PASS THIS ARM REPRODUCED, in a word. null on a non-corrective arm;
|
|
15525
15638
|
// never "dispatched-warm", which is production's alone.
|
|
@@ -15839,7 +15952,7 @@ if (isEntrypoint(import.meta.url)) void (async () => {
|
|
|
15839
15952
|
|
|
15840
15953
|
// — reading the job file used to sit OUTSIDE the try below, so a path typo or a stray comma
|
|
15841
15954
|
// exited on a raw V8 stack trace: a non-clean exit with no honest message, and the one shape of
|
|
15842
|
-
// mistake a first-time reader is likeliest to make. Kept guarded here through
|
|
15955
|
+
// mistake a first-time reader is likeliest to make. Kept guarded here through the rebase — the
|
|
15843
15956
|
// pool check above is a separate refusal and must not swallow this one.
|
|
15844
15957
|
let job;
|
|
15845
15958
|
try { job = JSON.parse(readFileSync(a.job, "utf8")); }
|