Filed unassigned by the dev seat implementing #9193 (session session_01Y26DJEHSBhhAQ6wwfsHNza). Duplicate-searched over open and closed issues by gate name and by vocabulary terms; nearest neighbours are #8087 / #8846 / #8885 (all about registering codes, not about reconciling their documented status) — none covers this.
What was measured
scripts/check-error-status-conformance.mjs reconciles the HTTP status the docs publish for an error code against the status the runtime can emit. It bounds its own vocabulary, in its header, verbatim:
Reconciled vocabulary: StandardErrorCode members ONLY. Those are the codes both pages publish a status for. Registered ledger codes (ERROR_CODE_LEDGER) are derived and counted, but neither page publishes their status, so there is nothing to reconcile them against.
A green run states the same bound as a number:
scope: 53 StandardErrorCode members reconciled; ... 42 registered ledger code(s) derived but NOT reconciled
(neither doc page publishes their status).
The PR for #9193 falsifies that premise. It adds an INVALID_REQUEST entry to content/docs/api/error-catalog.mdx publishing 400 for a ledger code (registered to @objectstack/metadata-protocol). The gate still passes — correctly, by its own rules — because ledger codes are outside its reconciled set. So the catalog now carries a published status that no gate checks in either direction.
Why it is worth recording
This is the declared-vs-enforced shape the repo keeps closing: a status statement on a public error contract, with no tripwire. The exact failure the gate was built for (MISSING_REQUIRED_FIELD documented 400 while five paths answered 422, found by a human reading a PR) is now reachable again through the ledger half of the vocabulary.
The premise was true when written — it is this PR that changes it. Filing rather than fixing, per #9193's scope discipline.
Options, not a recommendation
- Extend the reconciler to ledger codes that a doc page actually publishes a status for — keeps the derivation honest and the population small; the deriver already finds producers for ledger codes (it counts 42).
- Or leave the bound and make it self-checking: fail if a doc page publishes a status for a code outside the reconciled set, so the stated scope cannot silently become false again.
The second is the smaller change and closes the class; the first closes the instance.
Not claimed
- ⛔ No defect in the gate as built. Its bound is stated, printed on every run, and was accurate until now. This is drift into its blind spot, not a bug in it.
- ⛔ Not measured: whether any other doc page already publishes a status for a ledger code.
ui/forms.mdx and automation/webhooks.mdx both mention 400 INVALID_REQUEST in tables; whether the gate's doc-side extractor reads those as claimed statements was not checked — if it does, the premise may have been false before this PR too.
Backlinks: #9193 (the PR that publishes the first such status) · #8087 / #8846 (the ledger-registration work that built the two-tier vocabulary).
Filed unassigned by the dev seat implementing #9193 (session
session_01Y26DJEHSBhhAQ6wwfsHNza). Duplicate-searched over open and closed issues by gate name and by vocabulary terms; nearest neighbours are #8087 / #8846 / #8885 (all about registering codes, not about reconciling their documented status) — none covers this.What was measured
scripts/check-error-status-conformance.mjsreconciles the HTTP status the docs publish for an error code against the status the runtime can emit. It bounds its own vocabulary, in its header, verbatim:A green run states the same bound as a number:
The PR for #9193 falsifies that premise. It adds an
INVALID_REQUESTentry tocontent/docs/api/error-catalog.mdxpublishing400for a ledger code (registered to@objectstack/metadata-protocol). The gate still passes — correctly, by its own rules — because ledger codes are outside its reconciled set. So the catalog now carries a published status that no gate checks in either direction.Why it is worth recording
This is the declared-vs-enforced shape the repo keeps closing: a status statement on a public error contract, with no tripwire. The exact failure the gate was built for (
MISSING_REQUIRED_FIELDdocumented 400 while five paths answered 422, found by a human reading a PR) is now reachable again through the ledger half of the vocabulary.The premise was true when written — it is this PR that changes it. Filing rather than fixing, per #9193's scope discipline.
Options, not a recommendation
The second is the smaller change and closes the class; the first closes the instance.
Not claimed
ui/forms.mdxandautomation/webhooks.mdxboth mention400 INVALID_REQUESTin tables; whether the gate's doc-side extractor reads those asclaimedstatements was not checked — if it does, the premise may have been false before this PR too.Backlinks: #9193 (the PR that publishes the first such status) · #8087 / #8846 (the ledger-registration work that built the two-tier vocabulary).