⛔ 分级与路由(domain:* / priority:* / type)属分诊,本卡由执行席 domain:spec 不带分级立卡。⛔ Filed unassigned.
Surfaced as finding F2 of the at-tier contract review of PR #16879 (card #16649), rated non-blocking by that reviewer and deliberately not ridden on that PR.
The defect
PR #16879 registers fourteen door: 'none' error codes in ERROR_CODE_LEDGER under the #16404 ruling ("every code that ships in dist is registered there, door or no door"). Three source comments elsewhere in the tree still assert the pre-ruling position — that these codes are deliberately not wire vocabulary — and each is now false. Locate by text, ⛔ not by line number:
| file |
the false claim |
packages/core/src/service-not-registered.ts |
"deliberately NOT wire vocabulary … dispatcher-error-vocabulary.ts classifies it door: 'none' / boot-refusal … a registration question for #8846's ledger, not something to start doing at a door" |
packages/core/src/plugin-contract.ts |
the same sentence |
packages/drivers/driver-sql/src/dialect-emission-refusal.ts |
"That is the test the ledger applies (the class MONGODB_MULTI_TENANT_UNSUPPORTED was UNregistered for failing …)" |
Two of the three name codes PR #16879 registers (SERVICE_NOT_REGISTERED, PLUGIN_CONTRACT_VIOLATION); the third cites, as its worked example of the rule, the very code that PR reverses (MONGODB_MULTI_TENANT_UNSUPPORTED, unregistered by #8035, re-registered under #16404).
⚠️ Also now stale in all three: the boot-refusal classification they point at. PR #16879 ratchets all fourteen of those rows out of dispatcher-error-vocabulary.ts, taking that class from 14 rows to 0, so a reader who follows the pointer finds nothing.
⭐ Why this is worth a card
The ledger's own driver-sql row comment was corrected inside PR #16879. The source comment that states the same rule was not — because it lives in a different package and folding it in would have extended a packages/spec diff into @objectstack/core and @objectstack/driver-sql src for comment-only edits. ⇒ The tree now states the rule two ways, and the authoritative one is the ledger.
The harm direction is the one this family keeps producing: an author or agent reading service-not-registered.ts learns that registering the code is "not something to start doing" — after it has been done, by a maintainer-approved ruling. That is a confident false statement about the tree at the exact point a reader decides whether to act.
Shape of a fix (⛔ prose only — the ruling is settled and stays)
The reviewer supplied a replacement shape; recorded, not mandated:
Registered in ERROR_CODE_LEDGER under <owner> (#16649, under the #16404 door-or-no-door rule); door: 'none' on this tree — <existing reachability sentence>; if a transport ever answers with it, error.code carries this spelling.
⛔ Do not change behaviour. No code, no registration, no gate. Each of the three keeps its existing reachability sentence — those readings were re-measured by the review and are true (none of the fourteen reaches an HTTP door on this tree). Only the "not wire vocabulary" justification and the dangling boot-refusal pointer are false.
✅ Ordering — discharged 2026-09-08T14:19:35Z. This card's premise was conditional on PR #16879 merging; it merged at that time (613bfbd3d), verified on origin/main: the ledger carries 321 code entries (was 307 ⇒ +14) and verdict: 'boot-refusal' rows are now 0. ⇒ all three comments are false as of now, and this card is live.
⛔ It is deliberately not given a Blocked-by: line. Its parent card #16649 remains open for its own second half (widen the gate's spec-face refusal to every published package; retire the boot-refusal verdict), so a directive pointing at #16649 would hold this card long after its actual precondition was met. ⚠️ Checked with the repo's own directiveValues from scripts/pm/check-half-states.mjs rather than by eye: the earlier inline mention was inside backticks mid-sentence and the predicate returned [], so no machine directive was ever set — the sentence was prose, and only the prose needed correcting.
Dedup
Whole domain:spec lane enumerated to the last page at 2026-09-08T12:31Z — 141 returned against totalCount 141, a complete enumeration rather than a sample — and no open card covers these three comments.
⚠️ Limit of that check, stated rather than hidden: two of the three files are under packages/core and packages/drivers, which are domain:engine territory, so a duplicate filed in that lane would not appear in a domain:spec enumeration. ⛔ Keyword search was not used as the control: search_issues returns total_count: 0 for camelCase identifiers in this repo (recorded on #16779), and the discriminating terms here are SERVICE_NOT_REGISTERED-style constants and file paths.
⚠️ Routing note for triage, ⛔ not a routing decision by this seat: the fix lands in packages/core (×2) and packages/drivers/driver-sql (×1) — none of it in packages/spec — so by the anchoring rule (the domain is where the fix lands) this is probably not domain:spec, despite being surfaced by a packages/spec review. This seat ⛔ does not write domain:*.
Refs: PR #16879 (where F2 was found; the verdict is comment 5586239164) · #16649 (the registering card) · #16404 (the ruling) · #8035 (the reversed decision).
Generated by Claude Code
⛔ 分级与路由(
domain:*/priority:*/type)属分诊,本卡由执行席domain:spec不带分级立卡。⛔ Filed unassigned.Surfaced as finding F2 of the at-tier contract review of PR #16879 (card #16649), rated non-blocking by that reviewer and deliberately not ridden on that PR.
The defect
PR #16879 registers fourteen
door: 'none'error codes inERROR_CODE_LEDGERunder the #16404 ruling ("everycodethat ships indistis registered there, door or no door"). Three source comments elsewhere in the tree still assert the pre-ruling position — that these codes are deliberately not wire vocabulary — and each is now false. Locate by text, ⛔ not by line number:packages/core/src/service-not-registered.tsdispatcher-error-vocabulary.tsclassifies itdoor: 'none'/boot-refusal… a registration question for #8846's ledger, not something to start doing at a door"packages/core/src/plugin-contract.tspackages/drivers/driver-sql/src/dialect-emission-refusal.tsMONGODB_MULTI_TENANT_UNSUPPORTEDwas UNregistered for failing …)"Two of the three name codes PR #16879 registers (
SERVICE_NOT_REGISTERED,PLUGIN_CONTRACT_VIOLATION); the third cites, as its worked example of the rule, the very code that PR reverses (MONGODB_MULTI_TENANT_UNSUPPORTED, unregistered by #8035, re-registered under #16404).boot-refusalclassification they point at. PR #16879 ratchets all fourteen of those rows out ofdispatcher-error-vocabulary.ts, taking that class from 14 rows to 0, so a reader who follows the pointer finds nothing.⭐ Why this is worth a card
The ledger's own
driver-sqlrow comment was corrected inside PR #16879. The source comment that states the same rule was not — because it lives in a different package and folding it in would have extended apackages/specdiff into@objectstack/coreand@objectstack/driver-sqlsrc for comment-only edits. ⇒ The tree now states the rule two ways, and the authoritative one is the ledger.The harm direction is the one this family keeps producing: an author or agent reading
service-not-registered.tslearns that registering the code is "not something to start doing" — after it has been done, by a maintainer-approved ruling. That is a confident false statement about the tree at the exact point a reader decides whether to act.Shape of a fix (⛔ prose only — the ruling is settled and stays)
The reviewer supplied a replacement shape; recorded, not mandated:
⛔ Do not change behaviour. No code, no registration, no gate. Each of the three keeps its existing reachability sentence — those readings were re-measured by the review and are true (none of the fourteen reaches an HTTP door on this tree). Only the "not wire vocabulary" justification and the dangling
boot-refusalpointer are false.✅ Ordering — discharged 2026-09-08T14:19:35Z. This card's premise was conditional on PR #16879 merging; it merged at that time (
613bfbd3d), verified onorigin/main: the ledger carries 321 code entries (was 307 ⇒ +14) andverdict: 'boot-refusal'rows are now 0. ⇒ all three comments are false as of now, and this card is live.⛔ It is deliberately not given a⚠️ Checked with the repo's own
Blocked-by:line. Its parent card #16649 remains open for its own second half (widen the gate's spec-face refusal to every published package; retire theboot-refusalverdict), so a directive pointing at #16649 would hold this card long after its actual precondition was met.directiveValuesfromscripts/pm/check-half-states.mjsrather than by eye: the earlier inline mention was inside backticks mid-sentence and the predicate returned[], so no machine directive was ever set — the sentence was prose, and only the prose needed correcting.Dedup
Whole
domain:speclane enumerated to the last page at 2026-09-08T12:31Z — 141 returned againsttotalCount141, a complete enumeration rather than a sample — and no open card covers these three comments.packages/coreandpackages/drivers, which aredomain:engineterritory, so a duplicate filed in that lane would not appear in adomain:specenumeration. ⛔ Keyword search was not used as the control:search_issuesreturnstotal_count: 0for camelCase identifiers in this repo (recorded on #16779), and the discriminating terms here areSERVICE_NOT_REGISTERED-style constants and file paths.packages/core(×2) andpackages/drivers/driver-sql(×1) — none of it inpackages/spec— so by the anchoring rule (the domain is where the fix lands) this is probably notdomain:spec, despite being surfaced by apackages/specreview. This seat ⛔ does not writedomain:*.Refs: PR #16879 (where F2 was found; the verdict is comment
5586239164) · #16649 (the registering card) · #16404 (the ruling) · #8035 (the reversed decision).Generated by Claude Code