clearotron 0.4.1-beta.0 → 0.4.1-beta.2
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/THIRD-PARTY-NOTICES.md +1 -1
- package/bin/README.md +1 -1
- package/bin/clearotron.mjs +2 -0
- package/bin/mcp.mjs +80 -0
- package/bin/start.mjs +14 -1
- package/build-info.json +2 -2
- package/demo/README.md +1 -1
- package/docs/architecture/04-configuration-reference.md +0 -1
- package/docs/architecture/06-operations-runbook.md +4 -3
- package/docs/architecture/08-development-guide.md +3 -1
- package/driver/CHANGELOG.md +17 -0
- package/driver/citation-census.json +3 -3
- package/driver/compare.mjs +1 -1
- package/driver/contract-audit.mjs +6 -6
- package/driver/contract-dictation-registry.mjs +1 -1
- package/driver/contract-e3-backlog.mjs +17 -16
- package/driver/contract-vocabulary.mjs +138 -125
- package/driver/declination-call.mjs +5 -1
- package/driver/dev-portal.mjs +2 -1
- package/driver/engine/mcp/codex-config.mjs +7 -2
- package/driver/engine/mcp/gather-config.mjs +4 -0
- package/driver/engine/mcp/recording-server.mjs +1 -1
- package/driver/engine/mcp/supplemental.mjs +26 -1
- package/driver/engine/openai-agent.mjs +13 -3
- package/driver/findings-model.mjs +80 -13
- package/driver/flag-snapshot.mjs +2 -1
- package/driver/foreign-record-links.mjs +50 -0
- package/driver/frame-diff-model.mjs +1 -1
- package/driver/gateway.mjs +4 -4
- package/driver/jx.mjs +1 -1
- package/driver/knockout-review-record.mjs +55 -1
- package/driver/named-band.mjs +2 -0
- package/driver/owner-screen.mjs +7 -4
- package/driver/package.json +1 -1
- package/driver/pipeline-knockout.mjs +14 -12
- package/driver/pipeline.mjs +118 -20
- package/driver/portal-service.mjs +5 -4
- package/driver/products.mjs +1 -1
- package/driver/profiles.mjs +4 -3
- package/driver/publish/publish-inputs.mjs +2 -2
- package/driver/publish/xlsx.mjs +1 -1
- package/driver/register-count.mjs +2 -2
- package/driver/register-coverage.mjs +1 -1
- package/driver/register-plan.mjs +13 -2
- package/driver/result-noun-fields.mjs +3 -3
- package/driver/scope-rules.mjs +2 -2
- package/driver/stage-context.mjs +9 -0
- package/driver/stages-knockout.mjs +6 -5
- package/driver/stages.mjs +23 -23
- package/driver/suite-census.json +97 -31
- package/driver/synthesis-record.mjs +14 -5
- package/driver/verify.mjs +1 -1
- package/mcp-server/CHANGELOG.md +8 -0
- package/mcp-server/CONNECT.md +9 -3
- package/mcp-server/demo-mode.mjs +10 -0
- package/mcp-server/lib/runs.mjs +7 -1
- package/mcp-server/lib/scrub.mjs +1 -1
- package/mcp-server/package.json +1 -1
- package/mcp-server/packs/README.md +1 -1
- package/mcp-server/server.mjs +16 -2
- package/package.json +3 -2
- package/portal-ui/package.json +3 -3
- package/providers/_shared/count.mjs +5 -1
- package/providers/_shared/enumerate.mjs +66 -21
- package/providers/_shared/execute-plan.mjs +13 -4
- package/providers/oauth-mcp-bridge/CHANGELOG.md +8 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/signa/src/capabilities.js +15 -0
- package/providers/signa/src/core.js +55 -26
- package/scripts/e2e-first-time.mjs +3 -3
- package/scripts/env-audit.mjs +3 -2
- package/scripts/freeze-example-run.mjs +8 -8
- package/scripts/mcp-registry-listing.mjs +199 -0
- package/scripts/mint-plugin-folder.mjs +65 -0
- package/scripts/release-version.mjs +44 -0
- package/scripts/score.mjs +1 -1
- package/shared/register-floor.mjs +19 -0
- package/shared/trigger-lane.mjs +1 -1
- package/skills/clearotron-ops/SKILL.md +81 -24
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// failure vocabulary are a closed partition. Arm 1 of that partition — "a validator can emit a token no
|
|
7
7
|
// element declaration accounts for" — needs an inventory of what the validators can actually emit. This
|
|
8
8
|
// module is that inventory, and it is the audit object: every entry names its emitting site, so a reader
|
|
9
|
-
// checks a row by opening one file at one
|
|
9
|
+
// checks a row by opening one file at one function.
|
|
10
10
|
//
|
|
11
11
|
// ── WHY THIS IS A CHECKED-IN CENSUS AND NOT A REGEX OVER `fail(` ────────────────────────────────────
|
|
12
12
|
//
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
// several times that, because EIGHT sites build the token dynamically and hand back a string the
|
|
16
16
|
// extractor never sees:
|
|
17
17
|
//
|
|
18
|
-
// D1 verify.mjs
|
|
18
|
+
// D1 verify.mjs connotationDispositionFail fail(`connotation_${reason}:…`) — reason is a member of CALL_REASON_SET
|
|
19
19
|
// D2 verify.mjs fail(String(e.message)) — parseFindingsJson throws token-first
|
|
20
20
|
// D3 verify.mjs:1237 checkJson: fail(String(e.message)) — FIVE parsers reach this one site
|
|
21
21
|
// D4 verify.mjs parseCoverageLedgerJson, same shape
|
|
22
|
-
// D5 verify.mjs
|
|
23
|
-
// D6 verify.mjs
|
|
24
|
-
// D7 verify.mjs
|
|
25
|
-
// D8 verify.mjs
|
|
22
|
+
// D5 verify.mjs validators.registerFindings fail(`${unaccounted[0].token}:…`) — token minted in a DATA ROW
|
|
23
|
+
// D6 verify.mjs validators.registerFindings fail(`${violations[0].token}…`) — findUnexecutedCleanClaims() in register-plan.mjs
|
|
24
|
+
// D7 verify.mjs validators.registerFindings fail(`${v2[0].token}${detail}…`) — findUnverifiedIncompleteCleanClaims() in register-plan.mjs
|
|
25
|
+
// D8 verify.mjs validators.caseLaw fail(caseLawLedgerFail(…)) — token built in case-law-ledger.mjs:211 caseLawLedgerFail
|
|
26
26
|
//
|
|
27
27
|
// A partition built on the 60 tokens a regex CAN see would run green while blind to the rest, which is
|
|
28
28
|
// worse than having no E2 at all: it certifies a partition it never checked. So the census is authored
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
//
|
|
41
41
|
// ── PER-STAGE, NEVER GLOBAL ─────────────────────────────────────────────────────────────────────────
|
|
42
42
|
//
|
|
43
|
-
// `too_short` and `missing` come from the shared nonEmpty()
|
|
43
|
+
// `too_short` and `missing` come from the shared helpers nonEmpty() and needs() in verify.mjs, and are
|
|
44
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.
|
|
@@ -58,58 +58,58 @@ const CL = ["common-law", "common-law-half"];
|
|
|
58
58
|
* The census. One row per emitting site-group:
|
|
59
59
|
* token — the literal token, or the family prefix when `family` is set
|
|
60
60
|
* stages — the stages that can emit it (per-stage, never global)
|
|
61
|
-
* site — file
|
|
61
|
+
* site — the emitter's file and the symbol(s) that raise the token, so a row is checkable by opening it
|
|
62
62
|
* family — when set, `token` is a prefix and this names where the family is minted
|
|
63
63
|
* dynamic — the D-number of the dynamic site, when the token is built rather than written
|
|
64
64
|
*/
|
|
65
65
|
export const VOCABULARY = [
|
|
66
66
|
// ── the shared helpers: one token, many stages, different owners per stage ─────────────────────────
|
|
67
|
-
{ token: "too_short", stages: ALL_STAGES.filter((s) => !["blind-frame", "doubt-closure", "narrative-refutation"].includes(s)), site: "driver/verify.mjs
|
|
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,
|
|
67
|
+
{ token: "too_short", stages: ALL_STAGES.filter((s) => !["blind-frame", "doubt-closure", "narrative-refutation"].includes(s)), site: "driver/verify.mjs nonEmpty" },
|
|
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 needs, needsSectionsLabeled" },
|
|
69
69
|
|
|
70
70
|
// ── common-law / common-law-half ───────────────────────────────────────────────────────────────────
|
|
71
|
-
{ token: "declared_unavailable", stages: CL, site: "driver/verify.mjs" },
|
|
72
|
-
{ token: "grid_spec_unreadable", stages: CL, site: "driver/verify.mjs
|
|
73
|
-
{ token: "grid_ledger_missing", stages: CL, site: "driver/verify.mjs commonLawMeaningSeat" },
|
|
74
|
-
{ token: "grid_ledger_unparseable", stages: CL, site: "driver/verify.mjs
|
|
75
|
-
{ token: "connotation_query_unrecorded", stages: ["common-law-half"], site: "driver/verify.mjs" },
|
|
76
|
-
{ token: "profile_unparseable", stages: ["common-law"], site: "driver/verify.mjs" },
|
|
77
|
-
{ token: "grid_join_missing", stages: CL, site: "driver/verify.mjs
|
|
78
|
-
{ token: "platform_identity_error", stages: CL, site: "driver/verify.mjs
|
|
79
|
-
{ token: "platforms_missing", stages: CL, site: "driver/verify.mjs
|
|
80
|
-
{ token: "connotation_search_missing", stages: ["common-law"], site: "driver/verify.mjs" },
|
|
81
|
-
{ token: "receipts_short", stages: ["common-law"], site: "driver/verify.mjs" },
|
|
82
|
-
{ token: "half_path_unrecognized", stages: ["common-law-half"], site: "driver/verify.mjs
|
|
83
|
-
{ token: "no_coverage_status_row", stages: [...CL, "register-digest"], site: "driver/verify.mjs
|
|
71
|
+
{ token: "declared_unavailable", stages: CL, site: "driver/verify.mjs declaredUnavailableGate" },
|
|
72
|
+
{ token: "grid_spec_unreadable", stages: CL, site: "driver/verify.mjs commonLawMeaningSeat, commonLawEvidence, commonLawHalfEvidence" },
|
|
73
|
+
{ token: "grid_ledger_missing", stages: CL, site: "driver/verify.mjs commonLawMeaningSeat, commonLawEvidence, commonLawHalfEvidence" },
|
|
74
|
+
{ token: "grid_ledger_unparseable", stages: CL, site: "driver/verify.mjs commonLawMeaningSeat, commonLawEvidence, commonLawHalfEvidence" },
|
|
75
|
+
{ token: "connotation_query_unrecorded", stages: ["common-law-half"], site: "driver/verify.mjs commonLawMeaningSeat" },
|
|
76
|
+
{ token: "profile_unparseable", stages: ["common-law"], site: "driver/verify.mjs commonLawEvidence" },
|
|
77
|
+
{ token: "grid_join_missing", stages: CL, site: "driver/verify.mjs commonLawEvidence, commonLawHalfEvidence" },
|
|
78
|
+
{ token: "platform_identity_error", stages: CL, site: "driver/verify.mjs commonLawEvidence, commonLawHalfEvidence" },
|
|
79
|
+
{ token: "platforms_missing", stages: CL, site: "driver/verify.mjs commonLawEvidence, commonLawHalfEvidence" },
|
|
80
|
+
{ token: "connotation_search_missing", stages: ["common-law"], site: "driver/verify.mjs commonLawEvidence" },
|
|
81
|
+
{ token: "receipts_short", stages: ["common-law"], site: "driver/verify.mjs commonLawEvidence" },
|
|
82
|
+
{ token: "half_path_unrecognized", stages: ["common-law-half"], site: "driver/verify.mjs commonLawHalfEvidence" },
|
|
83
|
+
{ token: "no_coverage_status_row", stages: [...CL, "register-digest"], site: "driver/verify.mjs validators.registerFindings" },
|
|
84
84
|
// B — `connotation_form_unparseable` and `connotation_form_untouched` are GONE: they
|
|
85
85
|
// were states only a hand-authored document could be in, and the form path is deleted (ruling
|
|
86
86
|
// 2026-08-17). Their subject matter is carried by the call tokens under the D1 family row below.
|
|
87
|
-
{ token: "connotation_form_damaged", stages: CL, site: "driver/verify.mjs" },
|
|
88
|
-
{ token: "connotation_", stages: CL, site: "driver/verify.mjs", family: "driver/connotation-search.mjs CONNOTATION_FORM_REASONS", dynamic: "D1" },
|
|
89
|
-
{ token: "connotation_quote_unbound", stages: CL, site: "driver/verify.mjs" },
|
|
87
|
+
{ token: "connotation_form_damaged", stages: CL, site: "driver/verify.mjs connotationDispositionFail" },
|
|
88
|
+
{ token: "connotation_", stages: CL, site: "driver/verify.mjs connotationDispositionFail", family: "driver/connotation-search.mjs CONNOTATION_FORM_REASONS", dynamic: "D1" },
|
|
89
|
+
{ token: "connotation_quote_unbound", stages: CL, site: "driver/verify.mjs connotationDispositionFail" },
|
|
90
90
|
|
|
91
91
|
// ── synthesis ──────────────────────────────────────────────────────────────────────────────────────
|
|
92
|
-
{ token: "framework_manifest_unreadable", stages: ["synthesis"], site: "driver/verify.mjs
|
|
93
|
-
{ token: "framework_manifest_missing_for_v4", stages: ["synthesis"], site: "driver/verify.mjs
|
|
94
|
-
{ token: "framework_method_unreadable", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
95
|
-
{ token: "finding_use_check_source_missing", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
96
|
-
{ token: "finding_own_rights_source_missing", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
97
|
-
{ token: "finding_basis_source_missing", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
98
|
-
{ token: "finding_use_check_missing", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
99
|
-
{ token: "intake_ask_unanswered", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
100
|
-
{ token: "ratified_form_unread", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
101
|
-
{ token: "coverage_recommendation", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
102
|
-
{ token: "coverage_gap_unexplained", stages: ["synthesis"], site: "driver/verify.mjs" },
|
|
103
|
-
{ token: "finding", stages: ["synthesis"], site: "driver/verify.mjs", family: "driver/findings-model.mjs (token-first throws; `finding_*` and `findings_*`)", dynamic: "D2" },
|
|
92
|
+
{ token: "framework_manifest_unreadable", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling, checkClientSummaryJoin" },
|
|
93
|
+
{ token: "framework_manifest_missing_for_v4", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling, checkClientSummaryJoin" },
|
|
94
|
+
{ token: "framework_method_unreadable", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling" },
|
|
95
|
+
{ token: "finding_use_check_source_missing", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling" },
|
|
96
|
+
{ token: "finding_own_rights_source_missing", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling" },
|
|
97
|
+
{ token: "finding_basis_source_missing", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling" },
|
|
98
|
+
{ token: "finding_use_check_missing", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling" },
|
|
99
|
+
{ token: "intake_ask_unanswered", stages: ["synthesis"], site: "driver/verify.mjs validators.narrative" },
|
|
100
|
+
{ token: "ratified_form_unread", stages: ["synthesis"], site: "driver/verify.mjs validators.narrative" },
|
|
101
|
+
{ token: "coverage_recommendation", stages: ["synthesis"], site: "driver/verify.mjs validators.narrative" },
|
|
102
|
+
{ token: "coverage_gap_unexplained", stages: ["synthesis"], site: "driver/verify.mjs validators.narrative" },
|
|
103
|
+
{ token: "finding", stages: ["synthesis"], site: "driver/verify.mjs checkFindingsSibling", family: "driver/findings-model.mjs (token-first throws; `finding_*` and `findings_*`)", dynamic: "D2" },
|
|
104
104
|
|
|
105
105
|
// ── register-digest ────────────────────────────────────────────────────────────────────────────────
|
|
106
106
|
// The per-record accounting family, raised at the EXIT as well as at the call. The call-time refusal
|
|
107
107
|
// is scoped to the batch it judges, which is what lets a dense band be recorded at all; the exit gate
|
|
108
108
|
// is where that is paid for, because once any batch is accepted a document exists and half a band is
|
|
109
109
|
// the same SHAPE as a whole one. All three are armed by the era stamp, so an archived run raises none.
|
|
110
|
-
{ token: "registerdigest_unaccounted_records", stages: ["register-digest"], site: "driver/verify.mjs, and driver/register-digest-record.mjs at the call" },
|
|
111
|
-
{ token: "registerdigest_accounting_unreadable", stages: ["register-digest"], site: "driver/verify.mjs — driver-written, not a model defect" },
|
|
112
|
-
{ token: "registerdigest_model_missing", stages: ["register-digest"], site: "driver/verify.mjs — driver-written, not a model defect" },
|
|
110
|
+
{ token: "registerdigest_unaccounted_records", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings, and driver/register-digest-record.mjs acceptRegisterDigest at the call" },
|
|
111
|
+
{ token: "registerdigest_accounting_unreadable", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings — driver-written, not a model defect" },
|
|
112
|
+
{ token: "registerdigest_model_missing", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings — driver-written, not a model defect" },
|
|
113
113
|
// ── THE TYPED TRANSPORT'S OWN FAMILY (conversion 11) ──────────────────────────────────────────────
|
|
114
114
|
//
|
|
115
115
|
// These are raised by `register-digest-record.mjs` at the ACCEPTANCE BOUNDARY, not by verify.mjs, and
|
|
@@ -118,50 +118,50 @@ export const VOCABULARY = [
|
|
|
118
118
|
// them, and nothing here changes behaviour. What changes is that the census can now see the family,
|
|
119
119
|
// which is the point of listing the module: a family the tripwire cannot read can grow a member no
|
|
120
120
|
// row covers, and nobody finds out.
|
|
121
|
-
{ token: "registerdigest_uri_missing", stages: ["register-digest"], site: "driver/register-digest-record.mjs — every row joins to a band record by its uri" },
|
|
122
|
-
{ token: "registerdigest_uri_unknown", stages: ["register-digest"], site: "driver/register-digest-record.mjs — a uri this run's band does not carry" },
|
|
123
|
-
{ token: "registerdigest_flag_reason_missing", stages: ["register-digest"], site: "driver/register-digest-record.mjs — the judgment the row exists to carry" },
|
|
124
|
-
{ token: "registerdigest_verify_invalid", stages: ["register-digest"], site: "driver/register-digest-record.mjs — one bare token of yes/no" },
|
|
125
|
-
{ token: "registerdigest_drop_reason_missing", stages: ["register-digest"], site: "driver/register-digest-record.mjs — a drop with no stated reason is a silent recall loss" },
|
|
126
|
-
{ token: "registerdigest_drop_ground_invalid", stages: ["register-digest"], site: "driver/register-digest-record.mjs — the closed ground token" },
|
|
127
|
-
{ token: "registerdigest_drop_ground_contradicted", stages: ["register-digest"], site: "driver/register-digest-record.mjs — the ground contradicts this run's own screen verdict" },
|
|
128
|
-
{ token: "registerdigest_instructed_incomplete", stages: ["register-digest"], site: "driver/register-digest-record.mjs — every instructed check carries ask AND answer" },
|
|
129
|
-
{ token: "registerdigest_adjudication_invalid", stages: ["register-digest"], site: "driver/register-digest-record.mjs — one bare token of ADOPTED/OVERRODE" },
|
|
130
|
-
{ token: "registerdigest_adjudication_incomplete", stages: ["register-digest"], site: "driver/register-digest-record.mjs — an override quotes the reason it contradicts" },
|
|
131
|
-
{ token: "registerdigest_nothing_judged", stages: ["register-digest"], site: "driver/register-digest-record.mjs — a digest that ends no record has not read the band" },
|
|
121
|
+
{ token: "registerdigest_uri_missing", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — every row joins to a band record by its uri" },
|
|
122
|
+
{ token: "registerdigest_uri_unknown", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — a uri this run's band does not carry" },
|
|
123
|
+
{ token: "registerdigest_flag_reason_missing", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — the judgment the row exists to carry" },
|
|
124
|
+
{ token: "registerdigest_verify_invalid", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — one bare token of yes/no" },
|
|
125
|
+
{ token: "registerdigest_drop_reason_missing", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — a drop with no stated reason is a silent recall loss" },
|
|
126
|
+
{ token: "registerdigest_drop_ground_invalid", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — the closed ground token" },
|
|
127
|
+
{ token: "registerdigest_drop_ground_contradicted", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — the ground contradicts this run's own screen verdict" },
|
|
128
|
+
{ token: "registerdigest_instructed_incomplete", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — every instructed check carries ask AND answer" },
|
|
129
|
+
{ token: "registerdigest_adjudication_invalid", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — one bare token of ADOPTED/OVERRODE" },
|
|
130
|
+
{ token: "registerdigest_adjudication_incomplete", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — an override quotes the reason it contradicts" },
|
|
131
|
+
{ token: "registerdigest_nothing_judged", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — a digest that ends no record has not read the band" },
|
|
132
132
|
// The batching members, added with the batched accounting itself.
|
|
133
|
-
{ token: "registerdigest_batch_unknown", stages: ["register-digest"], site: "driver/register-digest-record.mjs — a batch number this run's split does not hold" },
|
|
134
|
-
{ token: "registerdigest_double_counted", stages: ["register-digest"], site: "driver/register-digest-record.mjs — a record ended under one batch cannot be ended under another" },
|
|
135
|
-
{ token: "registerdigest_model_write_failed", stages: ["register-digest"], site: "driver/register-digest-record.mjs — driver-written: the accumulator was lost mid-batch" },
|
|
136
|
-
{ token: "coverage_form_damaged", stages: ["register-digest"], site: "driver/verify.mjs" },
|
|
137
|
-
{ token: "coverage_form_engine_vocabulary", stages: ["register-digest"], site: "driver/verify.mjs" },
|
|
138
|
-
{ token: "coverage_form_axis_invalid", stages: ["register-digest"], site: "driver/verify.mjs" },
|
|
139
|
-
{ token: "coverage_no_status", stages: ["register-digest"], site: "driver/verify.mjs" },
|
|
140
|
-
{ token: "coverage_form_missing", stages: ["register-digest"], site: "driver/verify.mjs" },
|
|
141
|
-
{ token: "coverage_form_empty", stages: ["register-digest"], site: "driver/verify.mjs" },
|
|
133
|
+
{ token: "registerdigest_batch_unknown", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — a batch number this run's split does not hold" },
|
|
134
|
+
{ token: "registerdigest_double_counted", stages: ["register-digest"], site: "driver/register-digest-record.mjs acceptRegisterDigest — a record ended under one batch cannot be ended under another" },
|
|
135
|
+
{ token: "registerdigest_model_write_failed", stages: ["register-digest"], site: "driver/register-digest-record.mjs recordRegisterDigest — driver-written: the accumulator was lost mid-batch" },
|
|
136
|
+
{ token: "coverage_form_damaged", stages: ["register-digest"], site: "driver/verify.mjs coverageFormFail" },
|
|
137
|
+
{ token: "coverage_form_engine_vocabulary", stages: ["register-digest"], site: "driver/verify.mjs coverageFormFail" },
|
|
138
|
+
{ token: "coverage_form_axis_invalid", stages: ["register-digest"], site: "driver/verify.mjs coverageFormFail" },
|
|
139
|
+
{ token: "coverage_no_status", stages: ["register-digest"], site: "driver/verify.mjs coverageFormFail" },
|
|
140
|
+
{ token: "coverage_form_missing", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings" },
|
|
141
|
+
{ token: "coverage_form_empty", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings" },
|
|
142
142
|
{ token: "coverage_status_offenum", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings" },
|
|
143
|
-
{ token: "coverage_deferred_unaccounted", stages: ["register-digest"], site: "driver/verify.mjs
|
|
144
|
-
{ token: "coverage_clean_unexecuted", stages: ["register-digest"], site: "driver/verify.mjs
|
|
145
|
-
{ token: "coverage_clean_skipped", stages: ["register-digest"], site: "driver/verify.mjs
|
|
146
|
-
{ token: "coverage_clean_unverified_incomplete", stages: ["register-digest"], site: "driver/verify.mjs
|
|
147
|
-
{ token: "coverage_clean_tainted", stages: ["register-digest"], site: "driver/verify.mjs" },
|
|
148
|
-
{ token: "coverage_ledger_", stages: ["register-digest"], site: "driver/verify.mjs", family: "driver/coverage-ledger.mjs
|
|
149
|
-
{ token: "coverage_key_unknown", stages: ["register-digest"], site: "driver/verify.mjs", family: "driver/coverage-ledger.mjs", dynamic: "D4" },
|
|
150
|
-
{ token: "coverage_axis_", stages: ["register-digest"], site: "driver/verify.mjs", family: "driver/coverage-ledger.mjs", dynamic: "D4" },
|
|
151
|
-
{ token: "coverage_status_invalid", stages: ["register-digest"], site: "driver/verify.mjs", family: "driver/coverage-ledger.mjs", dynamic: "D4" },
|
|
152
|
-
{ token: "coverage_classes_invalid", stages: ["register-digest"], site: "driver/verify.mjs", family: "driver/coverage-ledger.mjs", dynamic: "D4" },
|
|
153
|
-
{ token: "plan_execution_unreadable", stages: ["register-digest", "narrative-refutation"], site: "driver/verify.mjs
|
|
143
|
+
{ token: "coverage_deferred_unaccounted", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/register-plan.mjs findUnaccountedDeferredSlices — token on a data row", dynamic: "D5" },
|
|
144
|
+
{ token: "coverage_clean_unexecuted", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/register-plan.mjs findUnexecutedCleanClaims", dynamic: "D6" },
|
|
145
|
+
{ token: "coverage_clean_skipped", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/register-plan.mjs findUnexecutedCleanClaims", dynamic: "D6" },
|
|
146
|
+
{ token: "coverage_clean_unverified_incomplete", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/register-plan.mjs findUnverifiedIncompleteCleanClaims", dynamic: "D7" },
|
|
147
|
+
{ token: "coverage_clean_tainted", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings" },
|
|
148
|
+
{ token: "coverage_ledger_", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/coverage-ledger.mjs parseCoverageLedgerJson (token-first throws)", dynamic: "D4" },
|
|
149
|
+
{ token: "coverage_key_unknown", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/coverage-ledger.mjs parseCoverageLedgerJson", dynamic: "D4" },
|
|
150
|
+
{ token: "coverage_axis_", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/coverage-ledger.mjs parseCoverageLedgerJson", dynamic: "D4" },
|
|
151
|
+
{ token: "coverage_status_invalid", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/coverage-ledger.mjs parseCoverageLedgerJson", dynamic: "D4" },
|
|
152
|
+
{ token: "coverage_classes_invalid", stages: ["register-digest"], site: "driver/verify.mjs validators.registerFindings", family: "driver/coverage-ledger.mjs parseCoverageLedgerJson", dynamic: "D4" },
|
|
153
|
+
{ token: "plan_execution_unreadable", stages: ["register-digest", "narrative-refutation"], site: "driver/verify.mjs validators.registerFindings, validators.seniorEyeReview" },
|
|
154
154
|
|
|
155
155
|
// ── matter-frame / clearance-variants / blind-frame / frame-diff ──────────────────────────────────────
|
|
156
|
-
{ token: "stagecontracts_invalid", stages: ["matter-frame", "clearance-variants", "placement-inquiry", "case-law"], site: "driver/verify.mjs
|
|
157
|
-
{ token: "meaning_angles_missing", stages: ["matter-frame"], site: "driver/verify.mjs" },
|
|
158
|
-
{ token: "frame_scope_missing", stages: ["matter-frame"], site: "driver/verify.mjs
|
|
159
|
-
{ token: "variantmodel_romanization_missing", stages: ["clearance-variants"], site: "driver/verify.mjs" },
|
|
160
|
-
{ token: "variantmodel_family_incomplete", stages: ["clearance-variants"], site: "driver/verify.mjs" },
|
|
161
|
-
{ token: "variantmodel_term_markup", stages: ["clearance-variants"], site: "driver/verify.mjs" },
|
|
162
|
-
{ token: "variantmodel_missing", stages: ["clearance-variants"], site: "driver/verify.mjs
|
|
156
|
+
{ token: "stagecontracts_invalid", stages: ["matter-frame", "clearance-variants", "placement-inquiry", "case-law"], site: "driver/verify.mjs validators.matterContext, validators.variantManifest, validators.placement, validators.caseLaw" },
|
|
157
|
+
{ token: "meaning_angles_missing", stages: ["matter-frame"], site: "driver/verify.mjs validators.matterContext" },
|
|
158
|
+
{ token: "frame_scope_missing", stages: ["matter-frame"], site: "driver/verify.mjs validators.matterContext" },
|
|
159
|
+
{ token: "variantmodel_romanization_missing", stages: ["clearance-variants"], site: "driver/verify.mjs validators.variantManifest" },
|
|
160
|
+
{ token: "variantmodel_family_incomplete", stages: ["clearance-variants"], site: "driver/verify.mjs validators.variantManifest" },
|
|
161
|
+
{ token: "variantmodel_term_markup", stages: ["clearance-variants"], site: "driver/verify.mjs validators.variantManifest" },
|
|
162
|
+
{ token: "variantmodel_missing", stages: ["clearance-variants"], site: "driver/verify.mjs validators.variantManifest" },
|
|
163
163
|
// Recovered during E2 authoring, absent from the draft census: variant-manifest.json is strict-parsed
|
|
164
|
-
// through checkSiblingJson
|
|
164
|
+
// through checkSiblingJson() → checkJson() in verify.mjs, so the WHOLE variantmodel_* family
|
|
165
165
|
// reaches clearance-variants, not just the four literal tokens above.
|
|
166
166
|
// CONVERSION 3 widened this family's SOURCE without widening its prefix. `acceptClearanceVariants` raises
|
|
167
167
|
// `variantmodel_scope_layer_invalid`, `_scope_status_invalid`, `_scope_item_missing` and `_scope_pipe`
|
|
@@ -173,8 +173,8 @@ export const VOCABULARY = [
|
|
|
173
173
|
// `fail(` / `throw new Error(` / `=>` string literals, and every record module returns
|
|
174
174
|
// `{ok: false, reason}` instead — measured, all four extract ZERO tokens. So this row is authored, not
|
|
175
175
|
// extracted, and nothing re-derives it if the module grows a member. Filed as.
|
|
176
|
-
{ token: "variantmodel_", stages: ["clearance-variants"], site: "driver/verify.mjs
|
|
177
|
-
{ token: "blindframe_", stages: ["blind-frame"], site: "driver/verify.mjs blindFrame → checkJson", family: "driver/blind-frame-model.mjs", dynamic: "D3" },
|
|
176
|
+
{ token: "variantmodel_", stages: ["clearance-variants"], site: "driver/verify.mjs validators.variantManifest → checkSiblingJson → checkJson (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" },
|
|
177
|
+
{ token: "blindframe_", stages: ["blind-frame"], site: "driver/verify.mjs validators.blindFrame → checkJson", family: "driver/blind-frame-model.mjs parseBlindFrameModel", dynamic: "D3" },
|
|
178
178
|
// — THE SKEPTIC TRANSPORT FAMILY, WHICH HAD NO ROW AT ALL. Nine tokens minted by acceptSkeptic
|
|
179
179
|
// and not one of them was covered here: the conversion that moved them to the acceptance boundary moved
|
|
180
180
|
// them out of a census that could not read that boundary, so nothing went red. Two of the nine are
|
|
@@ -196,31 +196,31 @@ export const VOCABULARY = [
|
|
|
196
196
|
// the frame never reaches disk. They are declared here for the same reason the two families below are —
|
|
197
197
|
// verify.mjs reaches the module, so a family that could grow a member no row covers must be readable.
|
|
198
198
|
{ token: "matterframe_", stages: ["matter-frame"], site: "driver/matter-frame-record.mjs acceptMatterFrame", family: "driver/matter-frame-record.mjs", dynamic: "D3" },
|
|
199
|
-
{ token: "framediff_model_missing", stages: ["frame-diff"], site: "driver/verify.mjs" },
|
|
200
|
-
{ token: "framediff_", stages: ["frame-diff"], site: "driver/verify.mjs
|
|
199
|
+
{ token: "framediff_model_missing", stages: ["frame-diff"], site: "driver/verify.mjs validators.frameDiff" },
|
|
200
|
+
{ token: "framediff_", stages: ["frame-diff"], site: "driver/verify.mjs validators.frameDiff → checkSiblingJson → checkJson", family: "driver/frame-diff-model.mjs", dynamic: "D3" },
|
|
201
201
|
|
|
202
202
|
// ── register-unit ──────────────────────────────────────────────────────────────────────────────────
|
|
203
|
-
{ token: "declared_not_executed", stages: ["register-unit"], site: "driver/verify.mjs" },
|
|
204
|
-
{ token: "tool_timeout", stages: ["register-unit"], site: "driver/verify.mjs
|
|
205
|
-
{ token: "named_band_missing", stages: ["register-unit"], site: "driver/verify.mjs" },
|
|
206
|
-
{ token: "named_band_invalid", stages: ["register-unit"], site: "driver/verify.mjs" },
|
|
207
|
-
{ token: "named_band_collapsed", stages: ["register-unit"], site: "driver/verify.mjs" },
|
|
208
|
-
{ token: "band_block_unplanned", stages: ["register-unit"], site: "driver/verify.mjs" },
|
|
203
|
+
{ token: "declared_not_executed", stages: ["register-unit"], site: "driver/verify.mjs validators.registerUnit" },
|
|
204
|
+
{ token: "tool_timeout", stages: ["register-unit"], site: "driver/verify.mjs validators.registerUnit" },
|
|
205
|
+
{ token: "named_band_missing", stages: ["register-unit"], site: "driver/verify.mjs validators.registerUnit" },
|
|
206
|
+
{ token: "named_band_invalid", stages: ["register-unit"], site: "driver/verify.mjs validators.registerUnit" },
|
|
207
|
+
{ token: "named_band_collapsed", stages: ["register-unit"], site: "driver/verify.mjs validators.registerUnit" },
|
|
208
|
+
{ token: "band_block_unplanned", stages: ["register-unit"], site: "driver/verify.mjs validators.registerUnit" },
|
|
209
209
|
{ token: "named_band_", stages: ["register-unit"], site: "driver/verify.mjs validators.registerUnit", family: "driver/named-band.mjs", dynamic: "D3" },
|
|
210
210
|
|
|
211
211
|
// ── placement-inquiry ──────────────────────────────────────────────────────────────────────────────
|
|
212
|
-
{ token: "placementmodel_missing", stages: ["placement-inquiry"], site: "driver/verify.mjs
|
|
212
|
+
{ token: "placementmodel_missing", stages: ["placement-inquiry"], site: "driver/verify.mjs validators.placement" },
|
|
213
213
|
{ token: "placement_unjudged", stages: ["placement-inquiry"], site: "driver/verify.mjs placementAccountVerdict" },
|
|
214
214
|
{ token: "placement_register_unrendered", stages: ["placement-inquiry"], site: "driver/verify.mjs placementAccountVerdict" },
|
|
215
215
|
{ token: "placement_form_unreadable", stages: ["placement-inquiry"], site: "driver/verify.mjs placementAccountVerdict" },
|
|
216
|
-
{ token: "placement", stages: ["placement-inquiry"], site: "driver/verify.mjs
|
|
216
|
+
{ token: "placement", stages: ["placement-inquiry"], site: "driver/verify.mjs validators.placement → checkSiblingJson → checkJson", family: "driver/placement-model.mjs (`placement_*` and `placements_*`)", dynamic: "D3" },
|
|
217
217
|
|
|
218
218
|
// ── case-law / narrative-refutation ────────────────────────────────────────────────────────────────
|
|
219
219
|
{ token: "caselaw_ledger_missing", stages: ["case-law"], site: "driver/verify.mjs validators.caseLaw" },
|
|
220
|
-
{ token: "caselaw_ledger_unparseable", stages: ["case-law"], site: "driver/verify.mjs" },
|
|
221
|
-
{ token: "caselaw_ledger", stages: ["case-law"], site: "driver/verify.mjs
|
|
222
|
-
{ token: "no_verdict_line", stages: ["narrative-refutation"], site: "driver/verify.mjs" },
|
|
223
|
-
{ token: "plan_audit_missing", stages: ["narrative-refutation"], site: "driver/verify.mjs" },
|
|
220
|
+
{ token: "caselaw_ledger_unparseable", stages: ["case-law"], site: "driver/verify.mjs validators.caseLaw" },
|
|
221
|
+
{ token: "caselaw_ledger", stages: ["case-law"], site: "driver/verify.mjs validators.caseLaw", family: "driver/case-law-ledger.mjs caseLawLedgerFail (census reasons)", dynamic: "D8" },
|
|
222
|
+
{ token: "no_verdict_line", stages: ["narrative-refutation"], site: "driver/verify.mjs validators.seniorEyeReview" },
|
|
223
|
+
{ token: "plan_audit_missing", stages: ["narrative-refutation"], site: "driver/verify.mjs validators.seniorEyeReview" },
|
|
224
224
|
|
|
225
225
|
// ── delivery ───────────────────────────────────────────────────────────────────────────────────────
|
|
226
226
|
// EMPTY SINCE, and that is the finding rather than an omission: the only delivery-side token was
|
|
@@ -228,7 +228,7 @@ export const VOCABULARY = [
|
|
|
228
228
|
// its own send. Delivery is code and a packet now, so there is no stage to emit a delivery token.
|
|
229
229
|
|
|
230
230
|
// ── the gateway wrapper, emittable by EVERY stage and not in verify.mjs at all ─────────────────────
|
|
231
|
-
{ token: "missing_file", stages: ALL_STAGES, site: "driver/gateway.mjs" },
|
|
231
|
+
{ token: "missing_file", stages: ALL_STAGES, site: "driver/gateway.mjs judgeArtifacts" },
|
|
232
232
|
];
|
|
233
233
|
|
|
234
234
|
/**
|
|
@@ -266,7 +266,8 @@ export const ARM1_EXEMPTIONS = [
|
|
|
266
266
|
{
|
|
267
267
|
token: "stagecontracts_invalid",
|
|
268
268
|
stages: ["matter-frame", "clearance-variants", "placement-inquiry", "case-law"],
|
|
269
|
-
|
|
269
|
+
symbol: { file: "driver/verify.mjs", names: ["matterContext"] },
|
|
270
|
+
reason: "The artifact is DRIVER-written (pipeline.mjs recordStageContract → _driver/stage-contracts.json). A corrupt one is a code or filesystem fault, and `validators.matterContext` in verify.mjs 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.",
|
|
270
271
|
},
|
|
271
272
|
// `tool_timeout` was on this list and has been REMOVED: register-unit's tool-written "execute the
|
|
272
273
|
// frozen plan — ONE register_execute_plan call" element declares it, so the token does have an element
|
|
@@ -276,17 +277,20 @@ export const ARM1_EXEMPTIONS = [
|
|
|
276
277
|
{
|
|
277
278
|
token: "missing_file",
|
|
278
279
|
stages: ALL_STAGES,
|
|
279
|
-
|
|
280
|
+
symbol: { file: "driver/gateway.mjs", names: ["judgeArtifacts"] },
|
|
281
|
+
reason: "The gateway's own pre-validation check (judgeArtifacts, inside runStageLadder() in gateway.mjs): the declared output does not exist. It speaks about the DISPATCH, not about any element within the output — every stage can emit it and no element owns it.",
|
|
280
282
|
},
|
|
281
283
|
{
|
|
282
284
|
token: "profile_unparseable",
|
|
283
285
|
stages: ["common-law"],
|
|
284
|
-
|
|
286
|
+
symbol: { file: "driver/verify.mjs", names: ["readRunProfile"] },
|
|
287
|
+
reason: "The run's profile is config the driver loaded before the stage ran (readRunProfile() in verify.mjs). A corrupt profile is a config fault; no element of the common-law contract is about it.",
|
|
285
288
|
},
|
|
286
289
|
{
|
|
287
290
|
token: "framework_manifest_unreadable",
|
|
288
291
|
stages: ["synthesis"],
|
|
289
|
-
|
|
292
|
+
symbol: { file: "driver/verify.mjs", names: ["readRunFramework"] },
|
|
293
|
+
reason: "The rating framework manifest is driver-loaded config (readRunFramework() in verify.mjs). Unreadable = a config/deploy fault, not a defect in anything synthesis was asked to author.",
|
|
290
294
|
},
|
|
291
295
|
{
|
|
292
296
|
token: "framework_method_unreadable",
|
|
@@ -303,12 +307,14 @@ export const ARM1_EXEMPTIONS = [
|
|
|
303
307
|
{
|
|
304
308
|
token: "plan_execution_unreadable",
|
|
305
309
|
stages: ["register-digest", "narrative-refutation"],
|
|
306
|
-
|
|
310
|
+
symbol: { file: "driver/verify.mjs", names: ["registerFindings", "seniorEyeReview"] },
|
|
311
|
+
reason: "The plan-execution receipt is written by the register tool lane, not by either stage (`validators.registerFindings` and `validators.seniorEyeReview` in verify.mjs). Unreadable is a tool/driver fault; both stages are only READERS of it.",
|
|
307
312
|
},
|
|
308
313
|
{
|
|
309
314
|
token: "grid_spec_unreadable",
|
|
310
315
|
stages: ["common-law", "common-law-half"],
|
|
311
|
-
|
|
316
|
+
symbol: { file: "driver/verify.mjs", names: ["commonLawHalfEvidence"] },
|
|
317
|
+
reason: "The grid spec is driver-written (_driver/grid-spec.half-<h>.json), and commonLawHalfEvidence() in verify.mjs makes the ruling in its own failure string: \"(driver-written — this is a bug, not a model defect)\". Corrupt or absent, it is a driver fault.",
|
|
312
318
|
},
|
|
313
319
|
{
|
|
314
320
|
token: "coverage_form_missing",
|
|
@@ -318,20 +324,22 @@ export const ARM1_EXEMPTIONS = [
|
|
|
318
324
|
{
|
|
319
325
|
token: "coverage_form_empty",
|
|
320
326
|
stages: ["register-digest"],
|
|
321
|
-
|
|
327
|
+
symbol: { file: "driver/verify.mjs", names: ["registerFindings"] },
|
|
328
|
+
reason: "`validators.registerFindings` in verify.mjs, same artifact and same verdict in its own string: a form that parsed and carries no rows is \"(driver-written — this is a bug, not a model defect)\".",
|
|
322
329
|
},
|
|
323
330
|
{
|
|
324
331
|
token: "half_path_unrecognized",
|
|
325
332
|
stages: ["common-law-half"],
|
|
326
|
-
|
|
333
|
+
symbol: { file: "driver/verify.mjs", names: ["commonLawHalfEvidence"] },
|
|
334
|
+
reason: "commonLawHalfEvidence() in verify.mjs fires when the seat's own output path does not match common-law-findings.half-<seat>.md. The DRIVER names that path when it spawns the seat, so an unrecognised one is a driver fault and no element of the half's contract is about it.",
|
|
327
335
|
},
|
|
328
336
|
];
|
|
329
337
|
|
|
330
338
|
/**
|
|
331
339
|
* STAGE-UNREACHABLE VALIDATORS — not exemptions, a SCOPE statement.
|
|
332
340
|
*
|
|
333
|
-
* verify.mjs wires four validators no STAGES entry reaches: findings
|
|
334
|
-
* clientSummary
|
|
341
|
+
* verify.mjs wires four validators no STAGES entry reaches: findings, report, audit,
|
|
342
|
+
* clientSummary. They are NOT dead code — replay-archive.mjs:128 replayRun and check() in mcp-server/lib/coverage.mjs
|
|
335
343
|
* index validators[key] dynamically and the MCP server declares `audit` required — but no stage dispatches
|
|
336
344
|
* them, so their tokens are unaccountable BY CONSTRUCTION with respect to a stage partition. The
|
|
337
345
|
* client-summary STAGE was deleted 2026-08-01 (no line to cite: the stage is gone) and its validator outlived it.
|
|
@@ -349,7 +357,7 @@ export const STAGE_UNREACHABLE_VALIDATORS = [
|
|
|
349
357
|
/**
|
|
350
358
|
* `symbol:` — THE ROT-RESISTANT HALF OF A CITATION.
|
|
351
359
|
*
|
|
352
|
-
* Every row in these tables carries a `site:`, and a `site:`
|
|
360
|
+
* Every row in these tables carries a `site:`, and a `site:` was a line number. Measured on 9d6ea0f1
|
|
353
361
|
* across VOCABULARY, ARM1_EXEMPTIONS, TRIPWIRE_OUT_OF_SCOPE and STAGE_UNREACHABLE_VALIDATORS:
|
|
354
362
|
*
|
|
355
363
|
* 90 parseable file:line refs
|
|
@@ -375,6 +383,9 @@ export const STAGE_UNREACHABLE_VALIDATORS = [
|
|
|
375
383
|
*
|
|
376
384
|
* So the arm covers what is anchored, and coverage grows as migration reaches these rows. That is a
|
|
377
385
|
* smaller claim than "the citations are checked", and it is the true one.
|
|
386
|
+
*
|
|
387
|
+
* Since then every VOCABULARY `site:` has been rewritten to name the function or validator that raises
|
|
388
|
+
* its token, with no line number, so an insertion above it can no longer move it.
|
|
378
389
|
*/
|
|
379
390
|
|
|
380
391
|
/**
|
|
@@ -396,18 +407,18 @@ export const TRIPWIRE_OUT_OF_SCOPE = [
|
|
|
396
407
|
{
|
|
397
408
|
token: "no_citations",
|
|
398
409
|
symbol: { file: "driver/case-law-ledger.mjs", names: ["findCaseLawLedgerViolations", "CASE_LAW_ADVISORY_REASONS", "isCaseLawBlocking"] },
|
|
399
|
-
site: "driver/case-law-ledger.mjs
|
|
400
|
-
reason: "ADVISORY, and filtered before the token is built. caseLawLedgerFail() in case-law-ledger.mjs keeps only blocking violations
|
|
410
|
+
site: "driver/case-law-ledger.mjs findCaseLawLedgerViolations, where `no_citations` is minted; CASE_LAW_ADVISORY_REASONS, isCaseLawBlocking",
|
|
411
|
+
reason: "ADVISORY, and filtered before the token is built. caseLawLedgerFail() in case-law-ledger.mjs keeps only blocking violations, 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.",
|
|
401
412
|
},
|
|
402
413
|
{
|
|
403
414
|
token: "accepted_not_folded",
|
|
404
415
|
symbol: { file: "driver/disposition-call.mjs", names: ["CALL_DROPS"] },
|
|
405
|
-
site: "driver/disposition-tool.mjs
|
|
416
|
+
site: "driver/disposition-tool.mjs recordDispositions — where the token is minted, driver/disposition-call.mjs CALL_DROPS",
|
|
406
417
|
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.",
|
|
407
418
|
},
|
|
408
419
|
{
|
|
409
420
|
prefix: "client_",
|
|
410
|
-
site: "driver/verify.mjs
|
|
421
|
+
site: "driver/verify.mjs checkClientSummaryJoin, reached only through validators.clientSummary",
|
|
411
422
|
reason: "Emitted only by validators.clientSummary, which no STAGES entry reaches — the client-summary STAGE was deleted 2026-08-01 (no line to cite: the stage is gone) and its validator outlived it. See STAGE_UNREACHABLE_VALIDATORS.",
|
|
412
423
|
},
|
|
413
424
|
{
|
|
@@ -449,8 +460,8 @@ export const TRIPWIRE_OUT_OF_SCOPE = [
|
|
|
449
460
|
*
|
|
450
461
|
* `mints` is the line that WRITES the code, never the line that mentions it. The census's own citation
|
|
451
462
|
* cannot be used here: it records the first line a pattern matched, and for `no_status` that was the
|
|
452
|
-
* JSDoc `@returns` annotation
|
|
453
|
-
* from a doc comment is a ruling about a sentence.
|
|
463
|
+
* JSDoc `@returns` annotation of findCoverageFormViolations() in coverage-form.mjs, seventeen lines
|
|
464
|
+
* above the mint. A ruling written from a doc comment is a ruling about a sentence.
|
|
454
465
|
*
|
|
455
466
|
* @type {ReadonlyArray<{code:string, mints:string[], rollsUpTo:string[], why:string}>}
|
|
456
467
|
*/
|
|
@@ -470,24 +481,25 @@ export const INNER_CODES = Object.freeze([
|
|
|
470
481
|
{ code: "call_partial", mints: ["driver/connotation-search.mjs:1984"], rollsUpTo: ["connotation_call_partial"],
|
|
471
482
|
why: "As call_never_made — same table, same projection. This is the pair #1211 cites as its worked example: the composite is covered, the bare form reaches no stage." },
|
|
472
483
|
{ code: "quote_unbound", mints: ["driver/connotation-search.mjs:2115"], rollsUpTo: ["connotation_quote_unbound"],
|
|
473
|
-
why: "The ruled-but-unbound row. Projected
|
|
484
|
+
why: "The ruled-but-unbound row. Projected as `unbound` in connotationDispositionFail() in verify.mjs, and reported only once nothing is unruled." },
|
|
474
485
|
{ code: "token_absent", mints: ["driver/connotation-search.mjs:2142"], rollsUpTo: ["connotation_token_absent"],
|
|
475
|
-
why: "#592 split this out of no_ruling. Row-level only — repairs.mjs
|
|
486
|
+
why: "#592 split this out of no_ruling. Row-level only — PROGRESS_TOKENS declared in repairs.mjs says so in as many words: `never a top-level token`." },
|
|
476
487
|
{ code: "cite_absent", mints: ["driver/connotation-search.mjs:2151"], rollsUpTo: ["connotation_cite_absent"],
|
|
477
|
-
why: "#592, as token_absent. repairs.mjs:
|
|
488
|
+
why: "#592, as token_absent. PROGRESS_TOKENS declared in repairs.mjs: `row-level only — never a top-level token`." },
|
|
478
489
|
{ code: "no_ruling", mints: ["driver/connotation-search.mjs:2158"], rollsUpTo: ["connotation_no_ruling"],
|
|
479
490
|
why: "The residual the other two split off from, and it has representatives — see the mint site. Declared as a corrective token at repairs.mjs:308 and in stages.mjs's E1 rows, always namespaced." },
|
|
480
491
|
// THE ONE THAT IS RENAMED, NOT NAMESPACED — and it is the reason this table stores the composite as
|
|
481
492
|
// data rather than deriving it. Every derivation anyone would write is `connotation_` + the code, and
|
|
482
493
|
// for this row that produces `connotation_no_recorded_queries`, which nothing mints and nothing covers.
|
|
483
|
-
// verify.mjs
|
|
484
|
-
// own token and its own remedy, so the projector
|
|
494
|
+
// verify.mjs's block headed "the meaning-sweep failure tokens" states the ruling: a sweep that did not
|
|
495
|
+
// RUN is a canonical-only decision with its own token and its own remedy, so the projector,
|
|
496
|
+
// connotationDispositionFail() in verify.mjs, deliberately does not handle it.
|
|
485
497
|
{ code: "no_recorded_queries", mints: ["driver/connotation-search.mjs:1999"], rollsUpTo: ["connotation_search_missing"],
|
|
486
498
|
why: "RENAMED, not namespaced: verify.mjs emits `connotation_search_missing`. It is excluded from CONNOTATION_FORM_REASONS at connotation-search.mjs for exactly this reason." },
|
|
487
499
|
|
|
488
500
|
// ── case-law-ledger.mjs — ONE token, the codes as census payload ─────────────────────────────────
|
|
489
501
|
//
|
|
490
|
-
// caseLawLedgerFail() in case-law-ledger.mjs
|
|
502
|
+
// caseLawLedgerFail() in case-law-ledger.mjs returns `caselaw_ledger:<census>;<detail>`, and
|
|
491
503
|
// `normalizeFailToken` cuts at the first colon — so the token is `caselaw_ledger` and every code below
|
|
492
504
|
// lives in the payload. The `caselaw_ledger` row already carries `family:
|
|
493
505
|
// "driver/case-law-ledger.mjs caseLawLedgerFail (census reasons)"`, which is this ruling written down before the
|
|
@@ -517,21 +529,22 @@ export const INNER_CODES = Object.freeze([
|
|
|
517
529
|
// `axis_invalid` cause into its own family before counting the rest. A ruling naming only
|
|
518
530
|
// `coverage_no_status` would be true of most `no_status` records and false of the ones that matter most.
|
|
519
531
|
{ code: "no_status", mints: ["driver/coverage-form.mjs:894"], rollsUpTo: ["coverage_no_status", "coverage_form_axis_invalid"],
|
|
520
|
-
why: "Two composites, split on the record's `cause`:
|
|
532
|
+
why: "Two composites, split on the record's `cause`: coverageFormFail() in verify.mjs for cause `axis_invalid`, and the same function for the rest. NOT the `@returns` annotation of findCoverageFormViolations() in coverage-form.mjs — that is the annotation, not the mint." },
|
|
521
533
|
{ code: "engine_vocabulary", mints: ["driver/coverage-form.mjs:884"], rollsUpTo: ["coverage_form_engine_vocabulary"],
|
|
522
|
-
why: "#669 — the seat wrote an engine token into the `reason` sentence that reaches the reader's page. Checked on settled rows too, because a row the seat considers finished is exactly the one whose sentence gets printed. Namespaced
|
|
534
|
+
why: "#669 — the seat wrote an engine token into the `reason` sentence that reaches the reader's page. Checked on settled rows too, because a row the seat considers finished is exactly the one whose sentence gets printed. Namespaced by coverageFormFail() in verify.mjs; the bare code names a row, never a stage." },
|
|
523
535
|
|
|
524
536
|
// ── ONE CODE, TWO MODULES ────────────────────────────────────────────────────────────────────────
|
|
525
537
|
//
|
|
526
538
|
// `form_damaged` is minted in connotation-search.mjs AND coverage-form.mjs and becomes a different
|
|
527
539
|
// token in each lane. The static census records the FIRST site it matched and no more, so its own
|
|
528
540
|
// citation names one of the three mints — which is why `mints` is a list, and why a ruling copied from
|
|
529
|
-
// the census output would have been half a ruling. verify.mjs
|
|
530
|
-
// records: `coverage_form_damaged`, never a bare
|
|
541
|
+
// the census output would have been half a ruling. verify.mjs's block headed "the register coverage-form
|
|
542
|
+
// failure tokens" already states the rule this row records: `coverage_form_damaged`, never a bare
|
|
543
|
+
// `form_damaged`.
|
|
531
544
|
{ code: "form_damaged",
|
|
532
545
|
mints: ["driver/connotation-search.mjs:2004", "driver/connotation-search.mjs:2080", "driver/coverage-form.mjs:876"],
|
|
533
546
|
rollsUpTo: ["connotation_form_damaged", "coverage_form_damaged"],
|
|
534
|
-
why: "Minted in two lanes and namespaced per lane: verify.mjs
|
|
547
|
+
why: "Minted in two lanes and namespaced per lane: connotationDispositionFail() in verify.mjs for the meaning sweep, coverageFormFail() in verify.mjs for the register digest. The namespacing is what keeps them apart — see verify.mjs's block headed \"the register coverage-form failure tokens\"." },
|
|
535
548
|
]);
|
|
536
549
|
|
|
537
550
|
/**
|
|
@@ -202,7 +202,11 @@ export function contradictionFor(reason, row, scope) {
|
|
|
202
202
|
const spec = DECLINATION_REASONS[reason];
|
|
203
203
|
if (!spec || !spec.discretionary) return "";
|
|
204
204
|
const shared = sharedClasses(row?.classes, scope?.classes);
|
|
205
|
-
|
|
205
|
+
// A scope written for a job that named its mark only as `markName` carries the mark as one string, and
|
|
206
|
+
// every run recorded before the writer listed it still does. It is the applied-for mark either way, so it
|
|
207
|
+
// is read as a one-mark list, the way verify-knockout.mjs reads the same field. Read as no list at all,
|
|
208
|
+
// it switched the identical-mark refusal below off on exactly those runs.
|
|
209
|
+
const marks = Array.isArray(scope?.marks) ? scope.marks : (scope?.marks ? [scope.marks] : []);
|
|
206
210
|
|
|
207
211
|
if (isIdenticalToAppliedMark(row?.mark, marks) && isLive(row?.status) && shared.length) {
|
|
208
212
|
return `this record's mark is IDENTICAL to the applied-for mark under the house normalizer, its `
|
package/driver/dev-portal.mjs
CHANGED
|
@@ -380,7 +380,8 @@ export function startPortal({ poolRoot = null, port = 18899, host = "127.0.0.1",
|
|
|
380
380
|
// "knockout" enqueued a job naming no product at all and ran whatever the account default or the
|
|
381
381
|
// request's own territories named — a silent product substitution at a live door, from a control
|
|
382
382
|
// that said otherwise. The menu is gone; refusing the field as well is what stops a stale tab, a
|
|
383
|
-
// bookmarked script or a copied curl from doing it quietly.
|
|
383
|
+
// bookmarked script or a copied curl from doing it quietly.
|
|
384
|
+
// SEARCH_LEVEL_NOT_A_REQUEST declared in products.mjs states the rule.
|
|
384
385
|
//
|
|
385
386
|
// THE SENTENCE IS NO LONGER WRITTEN HERE. This door had the only searchLevel refusal in the
|
|
386
387
|
// system, in its own words — so the same request was refused here and accepted at the other
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// exact server/tool wiring. Two inputs, both produced today by the gateway gather block:
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { dirname, join } from "node:path";
|
|
8
|
-
import { tomlString } from "../../../shared/toml-string.mjs";
|
|
8
|
+
import { tomlString } from "../../../shared/toml-string.mjs"; import { driverDir } from "../../../shared/driver-dir.mjs";
|
|
9
9
|
|
|
10
10
|
// • mcpConfig — the claude-shaped JSON string `{mcpServers:{name:{command,args,env,connectionTimeoutMs?}}}`
|
|
11
11
|
// (buildGatherMcpConfig → JSON.stringify)
|
|
@@ -235,13 +235,18 @@ export function commandEnvToml(withheld = []) {
|
|
|
235
235
|
// this profile never names. Not a refusal of their names inside the temp folder: codex scans a folder
|
|
236
236
|
// before it applies a wildcard refusal there, and in a shared temp folder one entry the account cannot
|
|
237
237
|
// read fails the whole turn (measured, 0.156.1).
|
|
238
|
+
//
|
|
239
|
+
// THE DRIVER'S OWN RECORDS INSIDE THE RUN FOLDER ARE READ-ONLY. `_driver/` holds the run's trace and the
|
|
240
|
+
// files the gates judge from, so a stage's command may read them and never write them. The narrower line
|
|
241
|
+
// wins over the run folder's: measured on codex 0.162.0 with this profile, a write into the run folder
|
|
242
|
+
// succeeded, a read of `_driver/` succeeded, and a write or an append there was refused.
|
|
238
243
|
export const FENCE_PROFILE = "clearotron-stage";
|
|
239
244
|
export function fenceToml({ runDir = null, readRoots = [] } = {}) {
|
|
240
245
|
const key = (p) => tomlString(p);
|
|
241
246
|
const out = [`[permissions.${FENCE_PROFILE}.filesystem]`,
|
|
242
247
|
`":minimal" = "read"`, `":tmpdir" = "write"`, `":slash_tmp" = "write"`];
|
|
243
248
|
for (const r of [...new Set(readRoots.filter(Boolean))]) out.push(`${key(r)} = "read"`);
|
|
244
|
-
if (runDir) out.push(`${key(runDir)} = "write"`);
|
|
249
|
+
if (runDir) out.push(`${key(runDir)} = "write"`, `${key(driverDir(runDir))} = "read"`);
|
|
245
250
|
out.push("", `[permissions.${FENCE_PROFILE}.filesystem.":workspace_roots"]`, `"." = "write"`, "");
|
|
246
251
|
return out;
|
|
247
252
|
}
|
|
@@ -849,6 +849,10 @@ function serverEnv({ sessionKey, agent, runDir, recordAxis }) {
|
|
|
849
849
|
// the server per turn so the acceptance boundary can refuse a payload naming any other index, which
|
|
850
850
|
// turns O3c's measured 224/0 habit into a structure. Absent for every non-fan-out stage.
|
|
851
851
|
if (recordAxis) e.CLEAROTRON_RECORD_AXIS = String(recordAxis);
|
|
852
|
+
// — THE RUN'S REGISTER, so a recording tool gates a record link at the call as verify.mjs gates the
|
|
853
|
+
// saved file (record-origins.mjs). Handed over explicitly: Codex gives a server only its own `env` and
|
|
854
|
+
// the names it forwards, so a value left to inheritance reaches a Claude server and never a Codex one.
|
|
855
|
+
if (process.env.CLEAROTRON_DATABASE) e.CLEAROTRON_DATABASE = process.env.CLEAROTRON_DATABASE;
|
|
852
856
|
// — the ledger paths are RESOLVED HERE and handed to the child explicitly, not forwarded as raw
|
|
853
857
|
// env. Two reasons, and the second is the one that kept this rename parked for months:
|
|
854
858
|
// · the old line was `if (process.env[v]) e[v] = …`, and NO box sets those vars — prod, test and dev
|