clearotron 0.3.2-beta.8 → 0.3.2-beta.9
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 +34 -3
- package/CONTRIBUTING.md +8 -8
- package/INSTALL.md +6 -6
- package/SECURITY.md +3 -3
- package/bin/brandowner.mjs +3 -3
- package/bin/framework-preflight.mjs +1 -1
- package/bin/start.mjs +18 -4
- package/build-info.json +2 -2
- package/docs/DELIVERY.md +2 -1
- package/docs/INTAKE.md +1 -1
- package/docs/ONBOARDING.md +1 -1
- package/docs/architecture/03-run-lifecycle.md +6 -6
- package/docs/architecture/04-configuration-reference.md +6 -3
- package/docs/architecture/05-config-governance.md +6 -1
- package/docs/architecture/05-customer-profiles.md +2 -2
- package/docs/architecture/06-operations-runbook.md +3 -3
- package/docs/architecture/08-development-guide.md +6 -6
- package/docs/configuration.md +5 -5
- package/docs/decisions/0003-credential-model.md +1 -1
- package/docs/writing-standard.md +4 -0
- package/driver/CHANGELOG.md +48 -0
- package/driver/README.md +3 -3
- package/driver/binding-layers.mjs +1 -1
- package/driver/citation-census.json +3 -3
- package/driver/{prelim-variants-record.mjs → clearance-variants-record.mjs} +24 -24
- package/driver/common-law-receipts.mjs +2 -2
- package/driver/company-bundle.mjs +3 -3
- package/driver/compose-read.mjs +8 -14
- package/driver/consumption-ledger.mjs +2 -2
- package/driver/contract-arm2-baseline.json +2 -3
- package/driver/contract-dictation-registry.mjs +19 -19
- package/driver/contract-e3-backlog.mjs +19 -19
- package/driver/contract-e3-baseline.json +14 -14
- package/driver/contract-vocabulary.mjs +24 -17
- package/driver/deliver-trigger.sh +16 -16
- package/driver/demo-container.mjs +3 -3
- package/driver/dev-portal.mjs +3 -3
- package/driver/disposition-call.mjs +1 -1
- package/driver/doubt-ledger.mjs +2 -2
- package/driver/drainer-identity.mjs +34 -8
- package/driver/driver.config.mjs +95 -45
- package/driver/engine/mcp/README.md +1 -1
- package/driver/engine/mcp/dispositions-server.mjs +3 -3
- package/driver/engine/mcp/gather-config.mjs +9 -9
- package/driver/engine/mcp/perplexity-server.mjs +2 -2
- package/driver/engine/mcp/recording-server.mjs +5 -5
- package/driver/enqueue-schema.mjs +6 -2
- package/driver/findings-model.mjs +5 -2
- package/driver/flag-snapshot.mjs +6 -3
- package/driver/form-neighbourhood.mjs +54 -7
- package/driver/framework.mjs +4 -4
- package/driver/gateway.mjs +12 -6
- package/driver/jx-lanes.mjs +2 -2
- package/driver/jx-units.mjs +1 -1
- package/driver/jx.mjs +30 -2
- package/driver/knockout-review-record.mjs +56 -4
- package/driver/known-conflicts.mjs +1 -1
- package/driver/named-band.mjs +1 -33
- package/driver/ordinary-words.mjs +51 -0
- package/driver/outbox-backoff.mjs +31 -16
- package/driver/package.json +1 -1
- package/driver/partial-payload-baseline.json +2 -2
- package/driver/phase0.mjs +3 -3
- package/driver/pipeline-knockout.mjs +5 -5
- package/driver/pipeline.mjs +206 -68
- package/driver/placement-form.mjs +77 -1
- package/driver/placement-model.mjs +1 -1
- package/driver/portal-report.mjs +92 -5
- package/driver/portal-service.mjs +34 -8
- package/driver/portal-upstream.mjs +1 -1
- package/driver/preserve-merge.mjs +3 -3
- package/driver/product-rows.mjs +2 -2
- package/driver/products.mjs +1 -1
- package/driver/profiles/README.md +3 -3
- package/driver/profiles/demo-brand-owner.json +2 -2
- package/driver/profiles.mjs +55 -17
- package/driver/progress.mjs +18 -8
- package/driver/provider-usage.mjs +8 -8
- package/driver/publish/index.mjs +110 -5
- package/driver/publish/knockout.mjs +29 -4
- package/driver/publish/pool-admin.mjs +1 -1
- package/driver/publish/publish-inputs.mjs +18 -2
- package/driver/publish/render-knockout.mjs +115 -24
- package/driver/publish/render.mjs +153 -34
- package/driver/publish/search-depth.mjs +133 -4
- package/driver/publish/templates/report.css +60 -3
- package/driver/publish/xlsx.mjs +8 -1
- package/driver/queue-order.mjs +2 -2
- package/driver/recording-agreement.mjs +1 -1
- package/driver/reference-score.mjs +1 -1
- package/driver/register-count.mjs +50 -5
- package/driver/register-coverage.mjs +67 -0
- package/driver/register-grant-vocabulary.mjs +1 -1
- package/driver/register-plan.mjs +19 -2
- package/driver/registry-fidelity.mjs +3 -3
- package/driver/repair-composers.mjs +1 -1
- package/driver/repair-contract.mjs +1 -1
- package/driver/replay-archive.mjs +6 -6
- package/driver/report-overview-record.mjs +2 -2
- package/driver/run-requirements.mjs +3 -3
- package/driver/runner.mjs +2 -2
- package/driver/scope-facts.mjs +20 -5
- package/driver/scope-ledger.mjs +5 -5
- package/driver/search-policy.mjs +22 -12
- package/driver/skills/README.md +15 -15
- package/driver/skills/blind-frame/SKILL.md +2 -2
- package/driver/skills/case-law-citation/SKILL.md +4 -4
- package/driver/skills/case-law-citation/sources/eurlex.md +1 -1
- package/driver/skills/{prelim-common-law → clearance-common-law}/SKILL.md +22 -22
- package/driver/skills/{prelim-common-law → clearance-common-law}/perplexity-prompts.md +1 -1
- package/driver/skills/{prelim-register → clearance-register}/SKILL.md +10 -10
- package/driver/skills/{prelim-register → clearance-register}/digest.md +2 -2
- package/driver/skills/{prelim-register → clearance-register}/providers/README.md +1 -1
- package/driver/skills/{prelim-register → clearance-register}/providers/clarivate.md +37 -35
- package/driver/skills/{prelim-register → clearance-register}/providers/corsearch.md +20 -11
- package/driver/skills/{prelim-register → clearance-register}/providers/signa.md +5 -5
- package/driver/skills/{prelim-register → clearance-register}/register-recipes.md +3 -3
- package/driver/skills/{prelim-register → clearance-register}/status-rules.md +2 -2
- package/driver/skills/{prelim-register → clearance-register}/stealth-filer-indicators.md +1 -1
- package/driver/skills/{prelim-register → clearance-register}/unit.md +2 -2
- package/driver/skills/{prelim-search → clearance-search}/SKILL.md +31 -31
- package/driver/skills/{prelim-search → clearance-search}/delivery-contract.md +1 -1
- package/driver/skills/{prelim-search → clearance-search}/phase2-execution.md +18 -18
- package/driver/skills/{prelim-search → clearance-search}/synthesis-rules.md +7 -7
- package/driver/skills/{prelim-variants → clearance-variants}/SKILL.md +18 -18
- package/driver/skills/{prelim-variants → clearance-variants}/transliteration-scripts.md +5 -5
- package/driver/skills/frame-diff/SKILL.md +1 -1
- package/driver/skills/knockout-assess/SKILL.md +10 -7
- package/driver/skills/matter-frame/SKILL.md +3 -3
- package/driver/skills/narrative-refutation/SKILL.md +9 -9
- package/driver/skills/placement-inquiry/SKILL.md +5 -5
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +4 -4
- package/driver/stages.mjs +53 -53
- package/driver/status-snapshot.mjs +2 -2
- package/driver/suite-census.json +218 -92
- package/driver/surface-exit-verdict.mjs +58 -0
- package/driver/systemd/README.md +2 -2
- package/driver/systemd/clearotron-worker.service +1 -1
- package/driver/terminal-clamp.mjs +2 -0
- package/driver/usage-ledger.mjs +1 -1
- package/driver/variant-manifest-model.mjs +4 -4
- package/driver/verify-knockout.mjs +27 -0
- package/driver/verify.mjs +67 -6
- package/driver/whatif-queue.mjs +1 -1
- package/driver/wordlists/en.txt +63906 -0
- package/mcp-server/CHANGELOG.md +4 -0
- package/mcp-server/README.md +1 -1
- package/mcp-server/lib/README.md +1 -1
- package/mcp-server/lib/options.mjs +8 -7
- package/mcp-server/lib/plan.mjs +18 -2
- package/mcp-server/lib/runs.mjs +1 -1
- package/mcp-server/lib/usage.mjs +3 -3
- package/mcp-server/lib/whatif.mjs +1 -1
- package/mcp-server/package.json +1 -1
- package/mcp-server/server.mjs +3 -0
- package/package.json +12 -11
- package/portal-ui/dist/assets/{index-CVOIvdhc.css → index-CtvwLCti.css} +207 -3
- package/portal-ui/dist/assets/{index-6jzO9HiX.js → index-EVaSo5-g.js} +1459 -482
- package/portal-ui/dist/index.html +2 -2
- package/portal-ui/package.json +1 -1
- package/providers/README.md +1 -1
- package/providers/_shared/enumerate.mjs +6 -6
- package/providers/_shared/execute-plan.mjs +3 -3
- package/providers/_shared/ledger.mjs +119 -5
- package/providers/_shared/provider-text.mjs +2 -2
- package/providers/_shared/screen.mjs +2 -2
- package/providers/_shared/script-form.mjs +3 -3
- package/providers/_shared/territory-codes.mjs +23 -3
- package/providers/clarivate/README.md +1 -1
- package/providers/clarivate/src/capabilities.js +12 -12
- package/providers/clarivate/src/core.js +37 -43
- package/providers/corsearch/README.md +1 -1
- package/providers/corsearch/src/capabilities.js +5 -5
- package/providers/corsearch/src/core.js +3 -3
- package/providers/oauth-mcp-bridge/CHANGELOG.md +4 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/perplexity/src/core.js +1 -1
- package/providers/signa/README.md +1 -1
- package/providers/signa/src/capabilities.js +42 -49
- package/providers/signa/src/core.js +106 -29
- package/providers/uspto-local/src/sync.js +1 -1
- package/scripts/README.md +1 -0
- package/scripts/ask-ai-render-check.mjs +127 -1
- package/scripts/authority-boundary-probe.mjs +4 -4
- package/scripts/backfill-started-at.mjs +2 -2
- package/scripts/census-merge-driver.mjs +33 -2
- package/scripts/citation-anchor-report.mjs +181 -0
- package/scripts/dead-names.mjs +1 -1
- package/scripts/deprecate-below.mjs +66 -8
- package/scripts/drain-preflight.mjs +1 -1
- package/scripts/e2e.mjs +174 -0
- package/scripts/env-audit.mjs +27 -0
- package/scripts/env-classify.mjs +20 -2
- package/scripts/freeze-example-run.mjs +20 -10
- package/scripts/live-surface-check.mjs +124 -41
- package/scripts/markdown-link-check.mjs +1 -1
- package/scripts/merge-shape-check.mjs +242 -0
- package/scripts/mint-names-in-force.mjs +5 -5
- package/scripts/mint-offered-territories.mjs +72 -0
- package/scripts/mint-public-residue.mjs +2 -2
- package/scripts/mint-reference-strip-backlog.mjs +2 -2
- package/scripts/mint-suite-census.mjs +75 -2
- package/scripts/mint-writing-standard-backlog.mjs +2 -2
- package/scripts/purge-runs.mjs +7 -7
- package/scripts/reconcile-runs.mjs +2 -2
- package/scripts/release-approve-parked.mjs +20 -2
- package/scripts/release-await-cut.mjs +120 -1
- package/scripts/release-note-required.mjs +76 -8
- package/scripts/report-header-render-check.mjs +164 -0
- package/shared/brand.mjs +27 -0
- package/shared/connect-clients.mjs +39 -11
- package/shared/env-aliases.mjs +1 -1
- package/shared/identifier-scan.mjs +65 -9
- package/shared/identifier-sentinels.mjs +22 -0
- package/shared/names-in-force.mjs +3 -1
- package/shared/offered-territories.json +738 -0
- package/shared/pre-rename-spellings.mjs +53 -0
- package/shared/reference-guard-classes.mjs +40 -2
- package/shared/stdio-connect.mjs +39 -4
- package/shared/tree-commit.mjs +48 -0
- /package/driver/skills/{prelim-register → clearance-register}/providers/euipo.md +0 -0
- /package/driver/skills/{prelim-register → clearance-register}/providers/free-tier.md +0 -0
- /package/driver/skills/{prelim-register → clearance-register}/providers/uspto-local.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/field-doctrine-pharma.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/firm-wide-reasoning.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/report-prose.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-demo.manifest.json +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-demo.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-triage.manifest.json +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-triage.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework.manifest.json +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/template-formatting.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/templates/email/generic.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/templates/search-request-form.html +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/worked-examples-demo.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/worked-examples.md +0 -0
|
@@ -101,17 +101,17 @@ export const E3_DATA_INPUT_EXEMPTIONS = [
|
|
|
101
101
|
];
|
|
102
102
|
|
|
103
103
|
export const E3_BACKLOG = [
|
|
104
|
-
// ──
|
|
104
|
+
// ── clearance-variants: FOUR ROWS RETIRED BY CONVERSION 3 ──────────────────────────────────────────
|
|
105
105
|
//
|
|
106
106
|
// Two `literal-json-skeleton` and two `exactly-these-keys`, all four stamped "NOTHING ON THE PLAN
|
|
107
107
|
// REMOVES THIS". The conversion removed them:
|
|
108
108
|
//
|
|
109
109
|
// stages.mjs:922 the dispatch dictated variant-manifest.json key by key and enum by enum;
|
|
110
|
-
// `
|
|
110
|
+
// `record_clearance_variants`'s schema IS that shape now, so the key-set and
|
|
111
111
|
// enum families are unreachable from a typed call rather than caught after
|
|
112
112
|
// the file is written.
|
|
113
113
|
// stages.mjs:774-808 the same skeleton's category enum, same fate.
|
|
114
|
-
//
|
|
114
|
+
// clearance-variants SKILL.md the `### Scope ledger` markdown table and its column contract. The rows
|
|
115
115
|
// arrive typed; the driver renders the table AND serialises
|
|
116
116
|
// scope-ledger.json from them through one shared function.
|
|
117
117
|
//
|
|
@@ -185,14 +185,14 @@ export const E3_BACKLOG = [
|
|
|
185
185
|
// it one: authored once in renderConnotationObligations, and reaching the seat through the perplexity
|
|
186
186
|
// MCP server (driver/engine/mcp/perplexity-server.mjs:111) rather than a stage message. Three rows
|
|
187
187
|
// pointing at one block would fabricate two authored sites the surface does not have.
|
|
188
|
-
where: "driver/connotation-search.mjs:1480-1493 (
|
|
188
|
+
where: "driver/connotation-search.mjs:1480-1493, renderConnotationObligations() in connotation-search.mjs (delivered to the seat via driver/engine/mcp/perplexity-server.mjs:111 — a TOOL RESPONSE, no longer a stage message)",
|
|
189
189
|
surface: "tool-response",
|
|
190
190
|
// ── (a) THE ORIGINAL SUBJECT WAS DELETED BY DESIGN — DISCHARGED, NOT FAILED ────────────────────
|
|
191
191
|
// The old rows dictated `receipt_id` (an 8-char token the seat copied) and `quote`. Both are gone:
|
|
192
192
|
// receipt_id — M1 LANDED. stages.mjs states it outright: "No seat-facing text displays an id shape
|
|
193
193
|
// any more", and connotation-search.mjs carries " M1, FINISHED" over the retired text. The
|
|
194
194
|
// seat now gives `receipt_index`, a POSITION, and the driver resolves position to id.
|
|
195
|
-
// quote — M2 LANDED. The live field is `anchor` (
|
|
195
|
+
// quote — M2 LANDED. The live field is `anchor` (clearance-common-law/SKILL.md:197).
|
|
196
196
|
// Neither was reworded. Both were removed, and this row is discharged of them.
|
|
197
197
|
//
|
|
198
198
|
// ── (b) THE NEW, NARROWER CLAIM — RE-EVIDENCED for B (the form path is DELETED, ruling
|
|
@@ -209,7 +209,7 @@ export const E3_BACKLOG = [
|
|
|
209
209
|
{
|
|
210
210
|
stage: "common-law",
|
|
211
211
|
kind: "literal-json-skeleton",
|
|
212
|
-
where: "driver/skills/
|
|
212
|
+
where: "driver/skills/clearance-common-law/SKILL.md:123-170",
|
|
213
213
|
surface: "skill-file",
|
|
214
214
|
evidence: "### Format\\n```markdown\\n# Common-law findings — Dawn: Legends of Thornmantle (2026-05-11)\\n\\n## Summary\\n\\n- Perplexity calls executed: 4 …",
|
|
215
215
|
reparsedBy: "driver/publish/audit-from-spine.mjs:14 parseTables → parseSpineFindingBlocks (audit-from-spine.mjs:123) re-parses the common-law finding tables into audit.md",
|
|
@@ -218,7 +218,7 @@ export const E3_BACKLOG = [
|
|
|
218
218
|
{
|
|
219
219
|
stage: "common-law",
|
|
220
220
|
kind: "dictated-line-shape",
|
|
221
|
-
where: "driver/skills/
|
|
221
|
+
where: "driver/skills/clearance-common-law/SKILL.md:192 (restated at driver/skills/clearance-search/synthesis-rules.md:394)",
|
|
222
222
|
surface: "skill-file",
|
|
223
223
|
evidence: "A clean PR/connotation row MUST cite its search — add a `**Connotation-search source:** <URL | \"perplexity_research — no result\">` line.",
|
|
224
224
|
reparsedBy: "driver/connotation-search.mjs — validators.commonLaw rejects a clean claim with no such line (connotation_search_missing); the hint is re-dictated by correctionHint() in gateway.mjs",
|
|
@@ -259,7 +259,7 @@ export const E3_BACKLOG = [
|
|
|
259
259
|
where: "driver/stages.mjs:2253 (the non-supplemental-lane branch)",
|
|
260
260
|
surface: "stage-message",
|
|
261
261
|
evidence: "BAND ARTIFACT (MANDATORY): ALSO write the COMPLETE NAMED BAND for this axis to <path> — a JSON ARRAY, one block per register_enumerate / count-probe call, in the named-band contract: {\"state\":\"enumerated\",\"query\":\"<what was searched>\",\"total_hits\":N,\"records\":[{record_id, mark_text, classes, status,",
|
|
262
|
-
reparsedBy: "driver/named-band.mjs parseNamedBand / bandRecords / bandCrowds / mergeNamedBands (named in driver/skills/
|
|
262
|
+
reparsedBy: "driver/named-band.mjs parseNamedBand / bandRecords / bandCrowds / mergeNamedBands (named in driver/skills/clearance-register/unit.md:60-62); validators.registerUnit",
|
|
263
263
|
removedByMove: "NOTHING ON THE #850 PLAN REMOVES THIS",
|
|
264
264
|
},
|
|
265
265
|
{
|
|
@@ -274,7 +274,7 @@ export const E3_BACKLOG = [
|
|
|
274
274
|
{
|
|
275
275
|
stage: "register-unit",
|
|
276
276
|
kind: "literal-json-skeleton",
|
|
277
|
-
where: "driver/skills/
|
|
277
|
+
where: "driver/skills/clearance-register/unit.md:83-97",
|
|
278
278
|
surface: "skill-file",
|
|
279
279
|
evidence: "Two block shapes (no third):\\n```json\\n[\\n { \"state\":\"enumerated\", \"query\":\"…\", \"total_hits\": 12, \"records\": [ { \"record_id\":\"/mark/eu/018…\", \"mark_text\":\"…\", … } ] },\\n { \"state\":\"incomplete\", \"query\":\"…\", \"total_hits\": 2416, \"fetched\": 1, \"sample\":[ … ], \"reason\":\"…\" }\\n]\\n```",
|
|
280
280
|
reparsedBy: "driver/named-band.mjs parseNamedBand — named in the skill file itself at unit.md:60-62",
|
|
@@ -322,7 +322,7 @@ export const E3_BACKLOG = [
|
|
|
322
322
|
where: "driver/skills/placement-inquiry/SKILL.md:42",
|
|
323
323
|
surface: "skill-file",
|
|
324
324
|
evidence: "Use these section headings, in this order: **Band reconciliation** …, the four placement tiers (**Headline candidates**, **Sheet 2 / register watch**, **Watchlist annex**, **Out-of-scope / filtered**), **Disagreements / flags surfaced to downstream**, **Coverage rulings & open questions** …, and **O",
|
|
325
|
-
reparsedBy: "driver/pipeline.mjs — the PLACEMENT RULINGS TAIL block handed to register-digest is lifted from these named sections (stages.mjs:2559 references it); driver/skills/
|
|
325
|
+
reparsedBy: "driver/pipeline.mjs — the PLACEMENT RULINGS TAIL block handed to register-digest is lifted from these named sections (stages.mjs:2559 references it); driver/skills/clearance-register/digest.md:342-352 re-parses the Disagreements section into its own table",
|
|
326
326
|
removedByMove: "NOTHING ON THE #850 PLAN REMOVES THIS",
|
|
327
327
|
},
|
|
328
328
|
// RETIRED 2026-08-16 — register-digest's no-form arm. M6 DELETED THE DICTATION ON 2026-08-14 AND THIS
|
|
@@ -370,7 +370,7 @@ export const E3_BACKLOG = [
|
|
|
370
370
|
{
|
|
371
371
|
stage: "register-digest",
|
|
372
372
|
kind: "dictated-line-shape",
|
|
373
|
-
where: "driver/skills/
|
|
373
|
+
where: "driver/skills/clearance-register/digest.md:164 (Dominant-element reconciliation — the crowd row's `unit` grammar)",
|
|
374
374
|
surface: "skill-file",
|
|
375
375
|
evidence: "`<axis> / dominant-element crowd (<N> members): <one-line label for the residual class>`",
|
|
376
376
|
reparsedBy: "driver/coverage-ledger.mjs crowdRulingCount reads `<N>` back out of the `unit` cell, and driver/recall-reconciliation.mjs parseCrowdRulings turns it into the residual denominator the delivery gate blocks on",
|
|
@@ -379,7 +379,7 @@ export const E3_BACKLOG = [
|
|
|
379
379
|
{
|
|
380
380
|
stage: "register-digest",
|
|
381
381
|
kind: "exactly-these-keys",
|
|
382
|
-
where: "driver/skills/
|
|
382
|
+
where: "driver/skills/clearance-register/digest.md:233-241",
|
|
383
383
|
surface: "skill-file",
|
|
384
384
|
evidence: "- `axis` — EXACTLY one bare token of: `saturation-probe` / `primary-sweep` / `transliteration-numeric` / `incumbent-class`. **That vocabulary is CLOSED** and a row whose axis is outside it is refused.",
|
|
385
385
|
reparsedBy: "driver/coverage-form.mjs (seat-row contract; SEAT_ROW_CONTRACT rides the accumulator) — and, since the typed-transport conversion, driver/coverage-call.mjs validateCoverageCall refuses an off-vocabulary axis AT CALL TIME (axis_invalid), so the dictation is receiver-checked in the same turn it is obeyed",
|
|
@@ -399,7 +399,7 @@ export const E3_BACKLOG = [
|
|
|
399
399
|
// closed vocabulary sent through the `record_coverage` typed call (the transport conversion, B's
|
|
400
400
|
// pattern). The seat opens no file and writes no table; the dictated shape is the call's own two
|
|
401
401
|
// values, receiver-validated as they arrive.
|
|
402
|
-
where: "driver/skills/
|
|
402
|
+
where: "driver/skills/clearance-register/digest.md:216-218",
|
|
403
403
|
surface: "skill-file",
|
|
404
404
|
evidence: "- `status` — EXACTLY one bare token: `confirmed-clean` / `coverage-limited` / `deferred`. Qualifiers never go in the status; they go in the reason.",
|
|
405
405
|
reparsedBy: "driver/coverage-call.mjs validateCoverageCall (status_invalid at call time) + driver/coverage-form.mjs rowIsSettled via validators.registerFindings; the archived-era prose-table reader (coverage-ledger.mjs parseCoverageLedgerFull) survives for replay only",
|
|
@@ -408,7 +408,7 @@ export const E3_BACKLOG = [
|
|
|
408
408
|
{
|
|
409
409
|
stage: "register-digest",
|
|
410
410
|
kind: "exactly-these-keys",
|
|
411
|
-
where: "driver/skills/
|
|
411
|
+
where: "driver/skills/clearance-register/SKILL.md:198-199",
|
|
412
412
|
surface: "skill-file",
|
|
413
413
|
evidence: "**The status vocabulary is CLOSED: EXACTLY one bare token of: `confirmed-clean` / `coverage-limited` / `deferred`.** Qualifiers never go in a status cell; they go in the reason.",
|
|
414
414
|
reparsedBy: "driver/coverage-form.mjs / driver/coverage-ledger.mjs. Since the typed-transport conversion the STAGE MESSAGE no longer restates the enum; the surviving copies are SKILL.md (here), digest.md:207, the dispatch brief (coverage-form.mjs coverageFormBrief), the record_coverage schema (coverage-server.mjs) and gateway.mjs's repair hints — still one enum spelled at five sites",
|
|
@@ -417,7 +417,7 @@ export const E3_BACKLOG = [
|
|
|
417
417
|
// ── DISCHARGED 2026-08-17 by (skeptic's conversion) ───────────────────────────────────────────
|
|
418
418
|
//
|
|
419
419
|
// It read: stage "skeptic", kind "dictated-line-shape", where
|
|
420
|
-
// "driver/skills/
|
|
420
|
+
// "driver/skills/clearance-search/phase2-execution.md:96-98", evidence "`## Escalation decisions` section the
|
|
421
421
|
// driver parses verbatim: one `ESCALATE: <axis> — <reason>` line per register axis …", reparsedBy
|
|
422
422
|
// "pipeline.mjs (same regex) — **the shape is dictated twice, in the message and in the skill file**",
|
|
423
423
|
// removedByMove "NOTHING ON THE PLAN REMOVES THIS".
|
|
@@ -590,7 +590,7 @@ export const E3_BACKLOG = [
|
|
|
590
590
|
{
|
|
591
591
|
stage: "synthesis",
|
|
592
592
|
kind: "dictated-line-shape",
|
|
593
|
-
where: "driver/stages.mjs:3081 (restated at driver/skills/
|
|
593
|
+
where: "driver/stages.mjs:3081 (restated at driver/skills/clearance-search/synthesis-rules.md:428)",
|
|
594
594
|
surface: "stage-message",
|
|
595
595
|
evidence: "END that finding's actual-use line with a literal \"- **Use-check source:** <result URL | \"perplexity_research — no result\">\" line",
|
|
596
596
|
reparsedBy: "driver/verify.mjs validators.narrative (spec-11 hard reject); the repair hint re-dictates the literal at driver/gateway.mjs:2153",
|
|
@@ -599,7 +599,7 @@ export const E3_BACKLOG = [
|
|
|
599
599
|
{
|
|
600
600
|
stage: "synthesis",
|
|
601
601
|
kind: "dictated-line-shape",
|
|
602
|
-
where: "driver/stages.mjs:3094 (restated at driver/skills/
|
|
602
|
+
where: "driver/stages.mjs:3094 (restated at driver/skills/clearance-search/synthesis-rules.md:475)",
|
|
603
603
|
surface: "stage-message",
|
|
604
604
|
evidence: "END that finding's reasoning with a literal \"- **Own-rights source:** <record URI(s) | \"no applicant-owned registrations in the searched register material\">\" line",
|
|
605
605
|
reparsedBy: "driver/own-rights.mjs:19-22 — \"This module only requires the 'Own-rights source:' line to exist\"; repair hint at driver/gateway.mjs:2361 (the `own_rights_missing` branch; re-verified 2026-08-29 — the old :1736 predated this branch and pointed into the A4 repeat-signature block)",
|
|
@@ -638,7 +638,7 @@ export const E3_BACKLOG = [
|
|
|
638
638
|
where: "driver/stages.mjs:3474",
|
|
639
639
|
surface: "stage-message",
|
|
640
640
|
evidence: "EVERY \"Grounded profile\" section MUST start its body with the line \"- ord: <N>\" naming which finding it grounds (use the ordinal from this list; a profile that grounds no listed finding omits the line)",
|
|
641
|
-
reparsedBy: "driver/publish/parse.mjs:339 parseCaseLawProfiles (\"the optional '- ord: <N>' first body line … gives an EXACT join\"); driver/findings-model.mjs:273 /^-\\s*ord:\\s*(\\d+)\\s*$/m; driver/publish/index.mjs:778 runOrigins",
|
|
641
|
+
reparsedBy: "driver/publish/parse.mjs:339, parseCaseLawProfiles() in parse.mjs (\"the optional '- ord: <N>' first body line … gives an EXACT join\"); driver/findings-model.mjs:273 /^-\\s*ord:\\s*(\\d+)\\s*$/m; driver/publish/index.mjs:778 runOrigins",
|
|
642
642
|
removedByMove: "NOTHING ON THE #850 PLAN REMOVES THIS",
|
|
643
643
|
},
|
|
644
644
|
{
|
|
@@ -822,7 +822,7 @@ export const E3_UNPLANNED = E3_BACKLOG.filter((e) => e.removedByMove === "NOTHIN
|
|
|
822
822
|
* ── TRIAGED 2026-08-16. NOT ONE ROW WAS STALE. ────────────────────────────────────────────
|
|
823
823
|
*
|
|
824
824
|
* All 15 were read against their sites. Every one described a dictation that still exists; what failed was
|
|
825
|
-
* always the QUOTE. Three are re-quoted in this commit and clear:
|
|
825
|
+
* always the QUOTE. Three are re-quoted in this commit and clear: clearance-variants (its evidence was a
|
|
826
826
|
* DESCRIPTION OF the site rather than text FROM it, so no matcher could ever have resolved it),
|
|
827
827
|
* narrative-refutation (the sentence survives; its four kinds moved onto their own bullet lines), and
|
|
828
828
|
* report-card (the dictation moved FILE, into the second path this row already named).
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"exactly-these-keys": 0,
|
|
6
6
|
"dictated-line-shape": 0
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"clearance-variants": {
|
|
9
9
|
"literal-json-skeleton": 0,
|
|
10
10
|
"exactly-these-keys": 0,
|
|
11
11
|
"dictated-line-shape": 0
|
|
@@ -97,12 +97,12 @@
|
|
|
97
97
|
"exactly-these-keys": 0,
|
|
98
98
|
"dictated-line-shape": 1
|
|
99
99
|
},
|
|
100
|
-
"skills/
|
|
100
|
+
"skills/clearance-variants/SKILL.md": {
|
|
101
101
|
"literal-json-skeleton": 0,
|
|
102
102
|
"exactly-these-keys": 0,
|
|
103
103
|
"dictated-line-shape": 1
|
|
104
104
|
},
|
|
105
|
-
"skills/
|
|
105
|
+
"skills/clearance-variants/transliteration-scripts.md": {
|
|
106
106
|
"literal-json-skeleton": 0,
|
|
107
107
|
"exactly-these-keys": 0,
|
|
108
108
|
"dictated-line-shape": 1
|
|
@@ -112,17 +112,17 @@
|
|
|
112
112
|
"exactly-these-keys": 2,
|
|
113
113
|
"dictated-line-shape": 0
|
|
114
114
|
},
|
|
115
|
-
"skills/
|
|
115
|
+
"skills/clearance-common-law/SKILL.md": {
|
|
116
116
|
"literal-json-skeleton": 0,
|
|
117
117
|
"exactly-these-keys": 1,
|
|
118
118
|
"dictated-line-shape": 2
|
|
119
119
|
},
|
|
120
|
-
"skills/
|
|
120
|
+
"skills/clearance-register/SKILL.md": {
|
|
121
121
|
"literal-json-skeleton": 0,
|
|
122
122
|
"exactly-these-keys": 0,
|
|
123
123
|
"dictated-line-shape": 4
|
|
124
124
|
},
|
|
125
|
-
"skills/
|
|
125
|
+
"skills/clearance-register/unit.md": {
|
|
126
126
|
"literal-json-skeleton": 5,
|
|
127
127
|
"exactly-these-keys": 0,
|
|
128
128
|
"dictated-line-shape": 6
|
|
@@ -132,12 +132,12 @@
|
|
|
132
132
|
"exactly-these-keys": 3,
|
|
133
133
|
"dictated-line-shape": 1
|
|
134
134
|
},
|
|
135
|
-
"skills/
|
|
135
|
+
"skills/clearance-register/digest.md": {
|
|
136
136
|
"literal-json-skeleton": 1,
|
|
137
137
|
"exactly-these-keys": 1,
|
|
138
138
|
"dictated-line-shape": 4
|
|
139
139
|
},
|
|
140
|
-
"skills/
|
|
140
|
+
"skills/clearance-search/phase2-execution.md": {
|
|
141
141
|
"literal-json-skeleton": 0,
|
|
142
142
|
"exactly-these-keys": 0,
|
|
143
143
|
"dictated-line-shape": 3
|
|
@@ -147,27 +147,27 @@
|
|
|
147
147
|
"exactly-these-keys": 2,
|
|
148
148
|
"dictated-line-shape": 0
|
|
149
149
|
},
|
|
150
|
-
"skills/
|
|
150
|
+
"skills/clearance-search/synthesis-rules.md": {
|
|
151
151
|
"literal-json-skeleton": 1,
|
|
152
152
|
"exactly-these-keys": 1,
|
|
153
153
|
"dictated-line-shape": 2
|
|
154
154
|
},
|
|
155
|
-
"skills/
|
|
155
|
+
"skills/clearance-search/firm-wide-reasoning.md": {
|
|
156
156
|
"literal-json-skeleton": 0,
|
|
157
157
|
"exactly-these-keys": 0,
|
|
158
158
|
"dictated-line-shape": 0
|
|
159
159
|
},
|
|
160
|
-
"skills/
|
|
160
|
+
"skills/clearance-search/risk-framework.md": {
|
|
161
161
|
"literal-json-skeleton": 0,
|
|
162
162
|
"exactly-these-keys": 0,
|
|
163
163
|
"dictated-line-shape": 0
|
|
164
164
|
},
|
|
165
|
-
"skills/
|
|
165
|
+
"skills/clearance-search/worked-examples.md": {
|
|
166
166
|
"literal-json-skeleton": 0,
|
|
167
167
|
"exactly-these-keys": 0,
|
|
168
168
|
"dictated-line-shape": 1
|
|
169
169
|
},
|
|
170
|
-
"skills/
|
|
170
|
+
"skills/clearance-search/report-prose.md": {
|
|
171
171
|
"literal-json-skeleton": 0,
|
|
172
172
|
"exactly-these-keys": 0,
|
|
173
173
|
"dictated-line-shape": 0
|
|
@@ -182,7 +182,7 @@
|
|
|
182
182
|
"exactly-these-keys": 2,
|
|
183
183
|
"dictated-line-shape": 1
|
|
184
184
|
},
|
|
185
|
-
"skills/
|
|
185
|
+
"skills/clearance-search/delivery-contract.md": {
|
|
186
186
|
"literal-json-skeleton": 0,
|
|
187
187
|
"exactly-these-keys": 1,
|
|
188
188
|
"dictated-line-shape": 1
|
|
@@ -41,13 +41,13 @@
|
|
|
41
41
|
// ── PER-STAGE, NEVER GLOBAL ─────────────────────────────────────────────────────────────────────────
|
|
42
42
|
//
|
|
43
43
|
// `too_short` and `missing` come from the shared nonEmpty()/needs() helpers (verify.mjs:123-133) and are
|
|
44
|
-
// legitimately owned by DIFFERENT elements in matter-frame,
|
|
44
|
+
// legitimately owned by DIFFERENT elements in matter-frame, clearance-variants and frame-diff. A global
|
|
45
45
|
// token→element map sees several owners for one token and "fixes" a partition that was never violated.
|
|
46
46
|
// Every row therefore carries `stages`, and the partition is computed per (token, stage) pair.
|
|
47
47
|
|
|
48
48
|
/** The 16 stages of STAGES in stages.mjs. Kept here so a stage added there fails this file's own test. */
|
|
49
49
|
export const ALL_STAGES = [
|
|
50
|
-
"matter-frame", "
|
|
50
|
+
"matter-frame", "clearance-variants", "blind-frame", "common-law", "common-law-half", "register-unit",
|
|
51
51
|
"placement-inquiry", "register-digest", "skeptic", "frame-diff", "synthesis", "case-law",
|
|
52
52
|
"narrative-refutation", "doubt-closure", "report-overview", "report-card",
|
|
53
53
|
];
|
|
@@ -65,7 +65,7 @@ const CL = ["common-law", "common-law-half"];
|
|
|
65
65
|
export const VOCABULARY = [
|
|
66
66
|
// ── the shared helpers: one token, many stages, different owners per stage ─────────────────────────
|
|
67
67
|
{ token: "too_short", stages: ALL_STAGES.filter((s) => !["blind-frame", "doubt-closure", "narrative-refutation"].includes(s)), site: "driver/verify.mjs:133" },
|
|
68
|
-
{ token: "missing", stages: ["matter-frame", "
|
|
68
|
+
{ token: "missing", stages: ["matter-frame", "clearance-variants", "common-law", "common-law-half", "placement-inquiry", "register-digest", "doubt-closure", "report-overview", "report-card"], site: "driver/verify.mjs, in needs()" },
|
|
69
69
|
|
|
70
70
|
// ── common-law / common-law-half ───────────────────────────────────────────────────────────────────
|
|
71
71
|
{ token: "declared_unavailable", stages: CL, site: "driver/verify.mjs" },
|
|
@@ -151,18 +151,18 @@ export const VOCABULARY = [
|
|
|
151
151
|
{ token: "coverage_classes_invalid", stages: ["register-digest"], site: "driver/verify.mjs", family: "driver/coverage-ledger.mjs", dynamic: "D4" },
|
|
152
152
|
{ token: "plan_execution_unreadable", stages: ["register-digest", "narrative-refutation"], site: "driver/verify.mjs:1496, 1712" },
|
|
153
153
|
|
|
154
|
-
// ── matter-frame /
|
|
155
|
-
{ token: "stagecontracts_invalid", stages: ["matter-frame", "
|
|
154
|
+
// ── matter-frame / clearance-variants / blind-frame / frame-diff ──────────────────────────────────────
|
|
155
|
+
{ token: "stagecontracts_invalid", stages: ["matter-frame", "clearance-variants", "placement-inquiry", "case-law"], site: "driver/verify.mjs:1539 coverageEntryList, 1170, 1366, 1677" },
|
|
156
156
|
{ token: "meaning_angles_missing", stages: ["matter-frame"], site: "driver/verify.mjs" },
|
|
157
157
|
{ token: "frame_scope_missing", stages: ["matter-frame"], site: "driver/verify.mjs:1119" },
|
|
158
|
-
{ token: "variantmodel_romanization_missing", stages: ["
|
|
159
|
-
{ token: "variantmodel_family_incomplete", stages: ["
|
|
160
|
-
{ token: "variantmodel_term_markup", stages: ["
|
|
161
|
-
{ token: "variantmodel_missing", stages: ["
|
|
158
|
+
{ token: "variantmodel_romanization_missing", stages: ["clearance-variants"], site: "driver/verify.mjs" },
|
|
159
|
+
{ token: "variantmodel_family_incomplete", stages: ["clearance-variants"], site: "driver/verify.mjs" },
|
|
160
|
+
{ token: "variantmodel_term_markup", stages: ["clearance-variants"], site: "driver/verify.mjs" },
|
|
161
|
+
{ token: "variantmodel_missing", stages: ["clearance-variants"], site: "driver/verify.mjs:1171 checkFindingsSibling, 1230 checkJson" },
|
|
162
162
|
// Recovered during E2 authoring, absent from the draft census: variant-manifest.json is strict-parsed
|
|
163
163
|
// through checkSiblingJson (verify.mjs:1241) → checkJson (:742), so the WHOLE variantmodel_* family
|
|
164
|
-
// reaches
|
|
165
|
-
// CONVERSION 3 widened this family's SOURCE without widening its prefix. `
|
|
164
|
+
// reaches clearance-variants, not just the four literal tokens above.
|
|
165
|
+
// CONVERSION 3 widened this family's SOURCE without widening its prefix. `acceptClearanceVariants` raises
|
|
166
166
|
// `variantmodel_scope_layer_invalid`, `_scope_status_invalid`, `_scope_item_missing` and `_scope_pipe`
|
|
167
167
|
// at the ACCEPTANCE BOUNDARY — the call is refused in the turn where restating is free, and no manifest
|
|
168
168
|
// reaches disk. They share the prefix deliberately: a seat reading one refused call should not have to
|
|
@@ -172,7 +172,7 @@ export const VOCABULARY = [
|
|
|
172
172
|
// `fail(` / `throw new Error(` / `=>` string literals, and every record module returns
|
|
173
173
|
// `{ok: false, reason}` instead — measured, all four extract ZERO tokens. So this row is authored, not
|
|
174
174
|
// extracted, and nothing re-derives it if the module grows a member. Filed as.
|
|
175
|
-
{ token: "variantmodel_", stages: ["
|
|
175
|
+
{ token: "variantmodel_", stages: ["clearance-variants"], site: "driver/verify.mjs:1171 checkFindingsSibling → 742 (JSON family); driver/clearance-variants-record.mjs acceptClearanceVariants (scope-ledger transport family)", family: "driver/variant-manifest-model.mjs (token-first throws) + driver/clearance-variants-record.mjs", dynamic: "D3" },
|
|
176
176
|
{ token: "blindframe_", stages: ["blind-frame"], site: "driver/verify.mjs blindFrame → checkJson", family: "driver/blind-frame-model.mjs", dynamic: "D3" },
|
|
177
177
|
// — THE SKEPTIC TRANSPORT FAMILY, WHICH HAD NO ROW AT ALL. Nine tokens minted by acceptSkeptic
|
|
178
178
|
// and not one of them was covered here: the conversion that moved them to the acceptance boundary moved
|
|
@@ -209,6 +209,9 @@ export const VOCABULARY = [
|
|
|
209
209
|
|
|
210
210
|
// ── placement-inquiry ──────────────────────────────────────────────────────────────────────────────
|
|
211
211
|
{ token: "placementmodel_missing", stages: ["placement-inquiry"], site: "driver/verify.mjs:1352, 1379" },
|
|
212
|
+
{ token: "placement_unjudged", stages: ["placement-inquiry"], site: "driver/verify.mjs placementAccountVerdict" },
|
|
213
|
+
{ token: "placement_register_unrendered", stages: ["placement-inquiry"], site: "driver/verify.mjs placementAccountVerdict" },
|
|
214
|
+
{ token: "placement_form_unreadable", stages: ["placement-inquiry"], site: "driver/verify.mjs placementAccountVerdict" },
|
|
212
215
|
{ token: "placement", stages: ["placement-inquiry"], site: "driver/verify.mjs:1352 → 742", family: "driver/placement-model.mjs (`placement_*` and `placements_*`)", dynamic: "D3" },
|
|
213
216
|
|
|
214
217
|
// ── case-law / narrative-refutation ────────────────────────────────────────────────────────────────
|
|
@@ -261,7 +264,7 @@ export function normalizeFailToken(raw) {
|
|
|
261
264
|
export const ARM1_EXEMPTIONS = [
|
|
262
265
|
{
|
|
263
266
|
token: "stagecontracts_invalid",
|
|
264
|
-
stages: ["matter-frame", "
|
|
267
|
+
stages: ["matter-frame", "clearance-variants", "placement-inquiry", "case-law"],
|
|
265
268
|
reason: "The artifact is DRIVER-written (pipeline.mjs recordStageContract → _driver/stage-contracts.json). A corrupt one is a code or filesystem fault, and verify.mjs:1095 says so in its own comment. Pinning it on a model element would be the exact inversion #850 forbids — a mechanical failure wearing a model's name.",
|
|
266
269
|
},
|
|
267
270
|
// `tool_timeout` was on this list and has been REMOVED: register-unit's tool-written "execute the
|
|
@@ -387,12 +390,12 @@ export const TRIPWIRE_OUT_OF_SCOPE = [
|
|
|
387
390
|
token: "no_citations",
|
|
388
391
|
symbol: { file: "driver/case-law-ledger.mjs", names: ["findCaseLawLedgerViolations", "CASE_LAW_ADVISORY_REASONS", "isCaseLawBlocking"] },
|
|
389
392
|
site: "driver/case-law-ledger.mjs:179 (minted), :65 CASE_LAW_ADVISORY_REASONS, :67 isCaseLawBlocking",
|
|
390
|
-
reason: "ADVISORY, and filtered before the token is built.
|
|
393
|
+
reason: "ADVISORY, and filtered before the token is built. caseLawLedgerFail() in case-law-ledger.mjs keeps only blocking violations (:196), and `no_citations` is the one member of CASE_LAW_ADVISORY_REASONS — so it cannot appear even in the `caselaw_ledger` census payload, let alone as a token head. It is the honest no-on-point-precedent result the report is allowed to state; failing a run for it would manufacture citations.",
|
|
391
394
|
},
|
|
392
395
|
{
|
|
393
396
|
token: "accepted_not_folded",
|
|
394
397
|
symbol: { file: "driver/disposition-call.mjs", names: ["CALL_DROPS"] },
|
|
395
|
-
site: "driver/disposition-tool.mjs:378
|
|
398
|
+
site: "driver/disposition-tool.mjs:378 recordDispositions — where the token is minted, driver/disposition-call.mjs:192 CALL_DROPS",
|
|
396
399
|
reason: "A DRIVER-FAULT journal code, and the fault is ours. It records that the tool accepted a row the accumulator then did not carry; it is written to the call verdict ledger and reaches a seat only inside a sentence that orders the seat NOT to act (`your answer was valid and this is ours to fix`). A stage refusal built on it would be the driver failing a seat for the driver's own defect, so no stage can emit it by construction rather than by omission.",
|
|
397
400
|
},
|
|
398
401
|
{
|
|
@@ -477,7 +480,7 @@ export const INNER_CODES = Object.freeze([
|
|
|
477
480
|
|
|
478
481
|
// ── case-law-ledger.mjs — ONE token, the codes as census payload ─────────────────────────────────
|
|
479
482
|
//
|
|
480
|
-
//
|
|
483
|
+
// caseLawLedgerFail() in case-law-ledger.mjs (:195) returns `caselaw_ledger:<census>;<detail>`, and
|
|
481
484
|
// `normalizeFailToken` cuts at the first colon — so the token is `caselaw_ledger` and every code below
|
|
482
485
|
// lives in the payload. The `caselaw_ledger` row already carries `family:
|
|
483
486
|
// "driver/case-law-ledger.mjs:204 (census reasons)"`, which is this ruling written down before the
|
|
@@ -551,7 +554,7 @@ export const COVERED_SOURCES = [
|
|
|
551
554
|
// its token-first throw through unchanged, so their families are already covered where they are raised.
|
|
552
555
|
// They are listed anyway, because the cost of listing a module that mints nothing is zero and the cost
|
|
553
556
|
// of the alternative — noticing, one day, that a module started minting — is the whole of this issue.
|
|
554
|
-
"
|
|
557
|
+
"clearance-variants-record.mjs", "skeptic-record.mjs", "frame-diff-record.mjs", "blind-frame-record.mjs",
|
|
555
558
|
// Conversion 4 — and this one MINTS, unlike the two delegating modules above it.
|
|
556
559
|
"report-overview-record.mjs",
|
|
557
560
|
// Conversion 5 — the fan-out transport; it mints its own family including the bound-index refusals.
|
|
@@ -560,6 +563,10 @@ export const COVERED_SOURCES = [
|
|
|
560
563
|
// tripwire must read this module's token literals too. Without it the accounting family could grow a
|
|
561
564
|
// member that no vocabulary row covers and nothing would notice, which is this list's whole subject.
|
|
562
565
|
"register-digest-record.mjs",
|
|
566
|
+
// verify.mjs reaches `placementRenderAccount`, the placement pass's own account of what it recorded, and
|
|
567
|
+
// that module names the parser tokens it sorts rows by. It mints none of its own: every token it carries
|
|
568
|
+
// is placement-model.mjs's, passed through, so the `placement` family row already covers them.
|
|
569
|
+
"placement-form.mjs",
|
|
563
570
|
];
|
|
564
571
|
|
|
565
572
|
/**
|
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
set -u
|
|
23
23
|
|
|
24
24
|
# this fallback chain MIRRORS driver.config.mjs (`outboxDir` = CLEAROTRON_OUTBOX_DIR, else
|
|
25
|
-
# <workspaceRoot>/
|
|
25
|
+
# <workspaceRoot>/clearance-outbox; `workspaceRoot` = CLEAROTRON_WORK_DIR, else $HOME/trademark/workspace).
|
|
26
26
|
# It is a second derivation of the same answer in a language that cannot import the first, so it moves
|
|
27
27
|
# whenever that one does. If they disagree, the driver writes markers where this script never looks and
|
|
28
28
|
# delivery stops with nothing in any log — the shape prelim-outbox.path already has.
|
|
29
|
-
OUTBOX="${CLEAROTRON_OUTBOX_DIR:-${CLEAROTRON_WORK_DIR:-${OPENCLAW_HOME:-$HOME}/trademark/workspace}/
|
|
29
|
+
OUTBOX="${CLEAROTRON_OUTBOX_DIR:-${CLEAROTRON_WORK_DIR:-${OPENCLAW_HOME:-$HOME}/trademark/workspace}/clearance-outbox}"
|
|
30
30
|
OPENCLAW="$(command -v openclaw || echo "${OPENCLAW_HOME:-$HOME}/.npm-global/bin/openclaw")"
|
|
31
31
|
HELPER="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/outbox-backoff.mjs"
|
|
32
32
|
DRAIN_WAIT="${CLEAROTRON_OUTBOX_DRAIN_WAIT:-180}"
|
|
@@ -58,7 +58,7 @@ MSG="The trademark engine's outbox has pending events. Run the clearotron-delive
|
|
|
58
58
|
# below still runs, so a refusal cannot hot-loop the level-triggered .path unit.
|
|
59
59
|
WALL="$(command -v timeout || command -v gtimeout || true)"
|
|
60
60
|
if [ -z "$WALL" ]; then
|
|
61
|
-
echo "
|
|
61
|
+
echo "clearance-outbox: REFUSING TO WAKE — neither timeout(1) nor gtimeout(1) is on PATH, and every" >&2
|
|
62
62
|
echo " courier wake runs under it as an enforced wall (a wake that cannot be killed wedged this" >&2
|
|
63
63
|
echo " lane for 19h on 2026-07-04). NO event has been touched — they are all still pending and" >&2
|
|
64
64
|
echo " will deliver as soon as this is fixed. Install GNU coreutils on this host (Debian/Ubuntu:" >&2
|
|
@@ -70,7 +70,7 @@ fi
|
|
|
70
70
|
|
|
71
71
|
# C5 — deterministic rescan FIRST (cheap: readdir + status.json of unsettled runs only). On a timer fire
|
|
72
72
|
# this is what creates the work; on a marker fire it is a free consistency pass. Failure-tolerant.
|
|
73
|
-
node "$HELPER" rescan || echo "
|
|
73
|
+
node "$HELPER" rescan || echo "clearance-outbox: rescan failed (non-fatal — existing markers still processed)"
|
|
74
74
|
|
|
75
75
|
[ -d "$OUTBOX" ] || exit 0
|
|
76
76
|
shopt -s nullglob
|
|
@@ -89,7 +89,7 @@ for m in "${markers[@]}"; do
|
|
|
89
89
|
if printf '%s' "$a" | grep -qE '^[A-Za-z0-9_-]+$'; then
|
|
90
90
|
by_agent["$a"]+="$m"$'\n'
|
|
91
91
|
else
|
|
92
|
-
echo "
|
|
92
|
+
echo "clearance-outbox: quarantining marker with no routable agent: $m (payload kept)"
|
|
93
93
|
if mkdir -p "$OUTBOX/quarantine"; then mv -f "$m" "$OUTBOX/quarantine/" || true; fi
|
|
94
94
|
fi
|
|
95
95
|
done
|
|
@@ -107,24 +107,24 @@ for agent in "${!by_agent[@]}"; do
|
|
|
107
107
|
# paces the .path re-trigger. Helper failure answers "due" (never lose a delivery).
|
|
108
108
|
gate="$(node "$HELPER" check "$agent" || echo due)"
|
|
109
109
|
if [ "${gate%% *}" = "wait" ]; then
|
|
110
|
-
echo "
|
|
110
|
+
echo "clearance-outbox: $agent in backoff (${gate#wait } s left) — events retained, not waking"
|
|
111
111
|
track_wait "${gate#wait }"
|
|
112
112
|
continue
|
|
113
113
|
fi
|
|
114
114
|
|
|
115
|
-
echo "
|
|
115
|
+
echo "clearance-outbox: waking $agent to run clearotron-deliver"
|
|
116
116
|
# timeout(1) is the enforced wall: the 2026-07-04 incident proved the CLI's own --timeout does not
|
|
117
117
|
# guarantee process EXIT (the agent turn finished; the process idled 19h and wedged the lane).
|
|
118
118
|
# SIGTERM at 840s (inside the unit's TimeoutStartSec budget so the failure is OURS and logged),
|
|
119
119
|
# SIGKILL 30s later. The turn runs server-side to completion either way; since this trigger deletes
|
|
120
120
|
# nothing, a killed wake just leaves the events for the re-fire.
|
|
121
121
|
#
|
|
122
|
-
# FRESH session per wake (was a fixed --session-key
|
|
122
|
+
# FRESH session per wake (was a fixed --session-key clearance-outbox): reusing ONE session meant every
|
|
123
123
|
# re-fire piled onto an ever-growing transcript the model reprocessed each time — that unbounded
|
|
124
124
|
# growth, not the wake count alone, is what turned a stuck marker into $200+/day (2026-07-24/25). A
|
|
125
125
|
# unique key bounds each wake to the skill + this one outbox read. The circuit-breaker in
|
|
126
126
|
# outbox-backoff.mjs (not session history) now owns cross-wake loop detection.
|
|
127
|
-
wake_session="
|
|
127
|
+
wake_session="clearance-outbox-$(date -u +%Y%m%dT%H%M%SZ)-$$-${RANDOM}"
|
|
128
128
|
model_args=()
|
|
129
129
|
[ -n "$WAKE_MODEL" ] && model_args=(--model "$WAKE_MODEL")
|
|
130
130
|
out="$("$WALL" --kill-after=30 840 "$OPENCLAW" agent --agent "$agent" --session-key "$wake_session" "${model_args[@]}" --message "$MSG" --json --timeout 300)"
|
|
@@ -142,21 +142,21 @@ for agent in "${!by_agent[@]}"; do
|
|
|
142
142
|
# is the load-bearing cost stop — it ends the re-fire loop for a marker mark_sent/ack_event can never
|
|
143
143
|
# settle (the 2026-07 runaway class), whatever the cause. Operator notification is integrator-owned:
|
|
144
144
|
# surface stuck deliveries from the audit record / MCP read surface, not from the requester outbox.
|
|
145
|
-
echo "
|
|
145
|
+
echo "clearance-outbox: 🚨 stuck marker(s) for $agent set aside after repeated no-progress wakes — see $OUTBOX/quarantine/STUCK-ALERTS.jsonl"
|
|
146
146
|
track_wait "${verdict#* }"
|
|
147
147
|
;;
|
|
148
148
|
stuck)
|
|
149
149
|
# OK wake that consumed nothing — not a failure, but not progress either. Paced down toward the
|
|
150
150
|
# quarantine threshold instead of hot-refiring every ~3.5min.
|
|
151
|
-
echo "
|
|
151
|
+
echo "clearance-outbox: no delivery progress for $agent — marker retained, paced ${verdict#* }s (circuit-breaker counting toward quarantine)"
|
|
152
152
|
track_wait "${verdict#* }"
|
|
153
153
|
;;
|
|
154
154
|
giveup)
|
|
155
|
-
echo "
|
|
155
|
+
echo "clearance-outbox: wake for $agent failed rc=$rc — fast retries exhausted; sidecar cooldown + rescan timer own this delivery (events retained)"
|
|
156
156
|
track_wait "${verdict#* }"
|
|
157
157
|
;;
|
|
158
158
|
*)
|
|
159
|
-
echo "
|
|
159
|
+
echo "clearance-outbox: wake for $agent failed rc=$rc — events retained, backoff ${verdict#* }s"
|
|
160
160
|
track_wait "${verdict#* }"
|
|
161
161
|
;;
|
|
162
162
|
esac
|
|
@@ -185,8 +185,8 @@ if [ "$woke_ok" = 1 ]; then
|
|
|
185
185
|
sleep 5; waited=$((waited + 5))
|
|
186
186
|
remaining=("$OUTBOX"/*.pending)
|
|
187
187
|
done
|
|
188
|
-
[ ${#remaining[@]} -gt 0 ] || { echo "
|
|
189
|
-
echo "
|
|
188
|
+
[ ${#remaining[@]} -gt 0 ] || { echo "clearance-outbox: drained"; exit 0; }
|
|
189
|
+
echo "clearance-outbox: ${#remaining[@]} event(s) still pending after ${DRAIN_WAIT}s"
|
|
190
190
|
fi
|
|
191
191
|
|
|
192
192
|
# TIGHT-LOOP GUARD (load-bearing): prelim-outbox.path is PathExistsGlob on *.pending — level-triggered,
|
|
@@ -201,7 +201,7 @@ if [ -n "$min_wait" ]; then
|
|
|
201
201
|
[ "$w" -gt "$cap" ] && w="$cap"
|
|
202
202
|
[ "$w" -gt "$budget" ] && w="$budget"
|
|
203
203
|
if [ "$w" -gt 0 ]; then
|
|
204
|
-
echo "
|
|
204
|
+
echo "clearance-outbox: events retained — sleeping ${w}s so the .path re-fire matches the backoff"
|
|
205
205
|
sleep "$w"
|
|
206
206
|
fi
|
|
207
207
|
fi
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
27
27
|
import { tmpdir } from "node:os";
|
|
28
|
-
import { basename, dirname, join, resolve, sep } from "node:path";
|
|
28
|
+
import { basename, dirname, join, resolve, sep } from "node:path"; import { studioDirFor } from "../shared/pre-rename-spellings.mjs";
|
|
29
29
|
|
|
30
30
|
/** The entry file each lane's publisher reads as its source, in the order a child is probed for one. */
|
|
31
31
|
export const ENTRY_FILES = Object.freeze(["report.md", "knockout-findings.json"]);
|
|
@@ -155,7 +155,7 @@ export function publishContainer(root, { repoRoot, tmp = tmpdir() } = {}) {
|
|
|
155
155
|
* The demo published its samples as reports and made no run directory, so the connector its own connect
|
|
156
156
|
* line wires listed nothing: an assistant, one of the demo's three faces, had nothing to explore. Each
|
|
157
157
|
* sample's finished `run/` is copied to the layout the connector walks, under the DEMO'S OWN workspace:
|
|
158
|
-
* `<workspace>/workspace-<agent>/studio/
|
|
158
|
+
* `<workspace>/workspace-<agent>/studio/clearance-search/<slug>/<date>-<codename>/`. Nothing is written
|
|
159
159
|
* anywhere else, so a real install started afterwards sees none of it (the demo is its own install).
|
|
160
160
|
*
|
|
161
161
|
* Copied, never linked: a connector reading a run may write beside it, and `demo/` is tracked. A run
|
|
@@ -176,7 +176,7 @@ export function seedDemoRuns({ workspace, examplesDir, portalOrigin = null }) {
|
|
|
176
176
|
let s;
|
|
177
177
|
try { s = JSON.parse(readFileSync(join(run, "status.json"), "utf8")); } catch { continue; }
|
|
178
178
|
if (!s?.slug || !s?.codename || !s?.date) continue;
|
|
179
|
-
const dir = join(workspace, `workspace-${s.agent || "clawdi"}
|
|
179
|
+
const dir = join(studioDirFor(join(workspace, `workspace-${s.agent || "clawdi"}`)), s.slug, `${s.date}-${s.codename}`);
|
|
180
180
|
if (existsSync(join(dir, "status.json"))) already.push(s.runId);
|
|
181
181
|
else {
|
|
182
182
|
// ONE SAMPLE'S UNREADABLE FILE COSTS THAT SAMPLE ONLY, and is named, never a throw out of the loop.
|
package/driver/dev-portal.mjs
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
import { envFileRead } from "../shared/env-local.mjs"; // side effect: apply this install's .env when THIS file is the CLI entry (never on library import)
|
|
33
33
|
import { createServer, request as httpRequest } from "node:http";
|
|
34
34
|
import { readFileSync, existsSync, statSync, readdirSync, writeFileSync, renameSync, mkdirSync } from "node:fs";
|
|
35
|
-
import { join, resolve, extname, dirname } from "node:path";
|
|
35
|
+
import { join, resolve, extname, dirname } from "node:path"; import { studioDirFor } from "../shared/pre-rename-spellings.mjs";
|
|
36
36
|
import { fileURLToPath } from "node:url";
|
|
37
37
|
import { config } from "./driver.config.mjs";
|
|
38
38
|
import { BRAND } from "../shared/brand.mjs";
|
|
@@ -135,7 +135,7 @@ function readJsonBody(req, maxBytes = 256 * 1024) {
|
|
|
135
135
|
});
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
// Run statuses: every workspace's studio/
|
|
138
|
+
// Run statuses: every workspace's studio/clearance-search/<slug>/<run>/status.json — live runs PLUS the
|
|
139
139
|
// archive (a delivered run moves there on delivery; without it the cockpit shows a run "disappearing"
|
|
140
140
|
// at the exact moment it succeeds — found by the first dev smoke run). Read fresh per request.
|
|
141
141
|
function scanRuns(workspaceRoot) {
|
|
@@ -153,7 +153,7 @@ function scanRuns(workspaceRoot) {
|
|
|
153
153
|
try { names = readdirSync(workspaceRoot); } catch { return out; }
|
|
154
154
|
for (const name of names) {
|
|
155
155
|
if (config.agentIdFromWorkspaceName(name) == null) continue;
|
|
156
|
-
const studio = join(workspaceRoot, name
|
|
156
|
+
const studio = studioDirFor(join(workspaceRoot, name));
|
|
157
157
|
let slugs = [];
|
|
158
158
|
try { slugs = readdirSync(studio); } catch { continue; }
|
|
159
159
|
for (const slug of slugs) {
|
|
@@ -653,7 +653,7 @@ export function validateDispositionCall(rows, recorded, { told = null } = {}) {
|
|
|
653
653
|
// ruling the whole time; what it could not do was copy a fragment that binds. So the missing exit was
|
|
654
654
|
// never from the judgment.
|
|
655
655
|
//
|
|
656
|
-
// AND THE JUDGMENT ALREADY HAS ONE.
|
|
656
|
+
// AND THE JUDGMENT ALREADY HAS ONE. clearance-common-law/SKILL.md dictates it: a row that is on-topic but
|
|
657
657
|
// cannot responsibly be called benign or loaded is ruled `loaded` with the note saying what could not
|
|
658
658
|
// be established, "which is where an unresolved reputational question belongs". Adding a second way
|
|
659
659
|
// to decline a ruling would compete with that, and an easier road past a hard row is the one outcome
|
package/driver/doubt-ledger.mjs
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// by design (the audit is the defensibility record of everything considered). copper-gantry shipped three
|
|
7
7
|
// fragments about ONE mark side by side: an asserted "closest analogue, active nationwide product" block,
|
|
8
8
|
// a direct-search "does NOT appear on the owner's official sites" block, and a prose "requires
|
|
9
|
-
//
|
|
9
|
+
// clearance-register layer cross-check" note that NOTHING parses. The resolutions usually EXIST — in
|
|
10
10
|
// findings.json dispositions/actions, in the coverage ledger, in register-findings answer/watchlist
|
|
11
11
|
// lines — the missing piece was the JOIN back to the fragment that raised the doubt. This module is
|
|
12
12
|
// that join, and nothing more.
|
|
@@ -179,7 +179,7 @@ function twoTokenMatch(sig, candidateText) {
|
|
|
179
179
|
// ── minting: gather cross-check hand-offs ─────────────────────────────────────────────────────────
|
|
180
180
|
// The gather stages are DICTATED (stages.mjs) to record any check they could not perform, on its own
|
|
181
181
|
// line, in EXACTLY this shape. The prefix is exact and the parse is deterministic ON PURPOSE: legacy
|
|
182
|
-
// artifacts (and free prose like "requires
|
|
182
|
+
// artifacts (and free prose like "requires clearance-register layer cross-check" buried in a paragraph —
|
|
183
183
|
// the copper-gantry note nothing parsed) mint NOTHING. Carrying prose doubts is the dictation's job at
|
|
184
184
|
// the source, not a fuzzy parser's job here. A leading list bullet is tolerated (models bullet
|
|
185
185
|
// everything); anything else about the shape is strict, including the em-dash between what and why.
|