Filed from #16449 (dev seat, session session_01F8SRGcf2eKTK7RRpWCGxwf) as a contract-violation finding under the #16404 ruling, not fixed there because the card's scope was the nine codes measured on its own tree.
The contract text
#16404, decision batch #62, 2026-09-07, option D (maintainer 「同意」), quoted from the ruling comment:
The published contract face for error codes is ERROR_CODE_LEDGER / StandardErrorCode. Every code that ships in dist must be registered there; registering a code is Clause-②: yes, door or no door, because it widens the published face. An unregistered code in dist is a protocol gap to be closed (#16449 registers the nine measured today), not a tier question to be argued per card.
The measured gap (on origin/main at 8341ed21c with the #16449 branch applied)
After #16449 registered its nine, packages/runtime/src/dispatcher-error-vocabulary.ts still carries 14 verdict: 'boot-refusal' rows — codes stamped in a published package's src/, so shipping in that package's dist, and absent from the ledger. Re-derive with node scripts/check-dispatcher-error-vocabulary.mjs --report:
| code |
stamping package |
file |
DUPLICATE_ARTIFACT_OBJECT_NAME |
@objectstack/objectql |
packages/objectql/src/registry.ts |
DUPLICATE_ARTIFACT_PACKAGE |
@objectstack/core |
packages/core/src/artifact-packages.ts |
INVALID_ARTIFACT_PACKAGES |
@objectstack/core |
packages/core/src/artifact-packages.ts |
INVALID_ARTIFACT_PACKAGE_ENTRY |
@objectstack/core |
packages/core/src/artifact-packages.ts |
MEMORY_MULTI_TENANT_UNSUPPORTED |
@objectstack/driver-memory |
packages/drivers/driver-memory/src/memory-tenancy-guard.ts |
MIXED_ARTIFACT_COLLECTION_SHAPE |
@objectstack/runtime |
packages/runtime/src/artifact-collections.ts |
MONGODB_MULTI_TENANT_UNSUPPORTED |
@objectstack/driver-mongodb |
packages/drivers/driver-mongodb/src/mongodb-tenancy-guard.ts (unregistered by #8035 on the pre-ruling reasoning) |
NOT_COMPENSABLE |
@objectstack/core |
packages/core/src/utils/migration-journal.ts |
NO_SUCH_RUN |
@objectstack/core |
packages/core/src/utils/migration-journal.ts |
PLAN_CHANGED |
@objectstack/core |
packages/core/src/utils/migration-journal.ts |
PLUGIN_CONTRACT_VIOLATION |
@objectstack/core |
packages/core/src/plugin-loader.ts |
PREFLIGHT_FAILED |
@objectstack/core |
packages/core/src/utils/migration-journal.ts |
SERVICE_NOT_REGISTERED |
@objectstack/core |
packages/core/src/service-not-registered.ts |
WALLED_MEMBERSHIP_POLICY_UNDECLARED |
@objectstack/plugins/organizations (verify the published name) |
packages/plugins/organizations/src/membership-policy-gate.ts |
Two pending-registration rows are the same gap by a different route and are already tracked elsewhere, listed here only so the census is complete: AMBIGUOUS_METADATA_STEM (packages/metadata, dispatcher door, awaiting the spec lane) and owd_widening_forbidden (plugin-security, REST door, lowercase — the rename-or-keep call of #9460 half 2).
What #16449 already put in place for this card
- The ledger header now carries the ruling as the "Door or no door" rule and the ONE row shape for a
door: 'none' code (a string under the stamping package plus a comment stating status and the reachability reading); the boot-refusal verdict doc in the vocabulary says a row carrying it is a registration owed, not an exemption.
check:dispatcher-error-vocabulary refuses any verdict but foreign-vocabulary / runtime-pinned under packages/spec/src/ (spec-face-unregistered). Widening that refusal to every published package's src/ is the mechanical form of THIS card — once the 14 rows are registered, the spec-only prefix can become the general rule and the boot-refusal verdict retires.
Scope
- Register the 14 under their stamping packages (each
Clause-②: yes on the ruling's authority), one PR or a small batch; each row's comment carries the reachability reading its vocabulary row records today, and the vocabulary rows ratchet out (stale-row) as they land.
- Then widen the gate's spec-face rule to all published packages and retire the
boot-refusal verdict, so the class stays closed repo-wide.
- Per-package changesets:
minor (widening of a published face), no wire body changes on this tree (none of the 14 has a door — that is what boot-refusal records).
Refs #16404 (ruling), #16449 (the first nine), #8035 (the pre-ruling retirement this reverses), ADR-0112.
Filed from #16449 (dev seat, session
session_01F8SRGcf2eKTK7RRpWCGxwf) as a contract-violation finding under the #16404 ruling, not fixed there because the card's scope was the nine codes measured on its own tree.The contract text
#16404, decision batch #62, 2026-09-07, option D (maintainer 「同意」), quoted from the ruling comment:
The measured gap (on
origin/mainat8341ed21cwith the #16449 branch applied)After #16449 registered its nine,
packages/runtime/src/dispatcher-error-vocabulary.tsstill carries 14verdict: 'boot-refusal'rows — codes stamped in a published package'ssrc/, so shipping in that package'sdist, and absent from the ledger. Re-derive withnode scripts/check-dispatcher-error-vocabulary.mjs --report:DUPLICATE_ARTIFACT_OBJECT_NAME@objectstack/objectqlpackages/objectql/src/registry.tsDUPLICATE_ARTIFACT_PACKAGE@objectstack/corepackages/core/src/artifact-packages.tsINVALID_ARTIFACT_PACKAGES@objectstack/corepackages/core/src/artifact-packages.tsINVALID_ARTIFACT_PACKAGE_ENTRY@objectstack/corepackages/core/src/artifact-packages.tsMEMORY_MULTI_TENANT_UNSUPPORTED@objectstack/driver-memorypackages/drivers/driver-memory/src/memory-tenancy-guard.tsMIXED_ARTIFACT_COLLECTION_SHAPE@objectstack/runtimepackages/runtime/src/artifact-collections.tsMONGODB_MULTI_TENANT_UNSUPPORTED@objectstack/driver-mongodbpackages/drivers/driver-mongodb/src/mongodb-tenancy-guard.ts(unregistered by #8035 on the pre-ruling reasoning)NOT_COMPENSABLE@objectstack/corepackages/core/src/utils/migration-journal.tsNO_SUCH_RUN@objectstack/corepackages/core/src/utils/migration-journal.tsPLAN_CHANGED@objectstack/corepackages/core/src/utils/migration-journal.tsPLUGIN_CONTRACT_VIOLATION@objectstack/corepackages/core/src/plugin-loader.tsPREFLIGHT_FAILED@objectstack/corepackages/core/src/utils/migration-journal.tsSERVICE_NOT_REGISTERED@objectstack/corepackages/core/src/service-not-registered.tsWALLED_MEMBERSHIP_POLICY_UNDECLARED@objectstack/plugins/organizations(verify the published name)packages/plugins/organizations/src/membership-policy-gate.tsTwo
pending-registrationrows are the same gap by a different route and are already tracked elsewhere, listed here only so the census is complete:AMBIGUOUS_METADATA_STEM(packages/metadata, dispatcher door, awaiting the spec lane) andowd_widening_forbidden(plugin-security, REST door, lowercase — the rename-or-keep call of #9460 half 2).What #16449 already put in place for this card
door: 'none'code (a string under the stamping package plus a comment statingstatusand the reachability reading); theboot-refusalverdict doc in the vocabulary says a row carrying it is a registration owed, not an exemption.check:dispatcher-error-vocabularyrefuses any verdict butforeign-vocabulary/runtime-pinnedunderpackages/spec/src/(spec-face-unregistered). Widening that refusal to every published package'ssrc/is the mechanical form of THIS card — once the 14 rows are registered, the spec-only prefix can become the general rule and theboot-refusalverdict retires.Scope
Clause-②: yeson the ruling's authority), one PR or a small batch; each row's comment carries the reachability reading its vocabulary row records today, and the vocabulary rows ratchet out (stale-row) as they land.boot-refusalverdict, so the class stays closed repo-wide.minor(widening of a published face), no wire body changes on this tree (none of the 14 has a door — that is whatboot-refusalrecords).Refs #16404 (ruling), #16449 (the first nine), #8035 (the pre-ruling retirement this reverses), ADR-0112.