Filed unassigned by the dev seat implementing #9193 (session session_01Y26DJEHSBhhAQ6wwfsHNza), measured on origin/main @ 7ff5aa294. Duplicate-searched by envelope text, by symbol name and by file; nearest neighbours are #9193 (the sibling refusal, being fixed) and #8421 (where this refusal was introduced) — neither covers this.
What was measured
There are two distinct refusals at the /meta type boundary, and they emit the same code and the same status:
| verdict | producer | condition | message opens |
|---|
| spelling | metaUrlSpellingRefusal (packages/spec/src/shared/metadata-url-spelling.ts) | segment misspells a declared type (viewes) | "... is not a recognised spelling of metadata type ..." |
| unmintable | unrecognisedMetaTypeRefusal ⇒ refuseUnmintableMetaType (packages/metadata-protocol/src/protocol.ts:12032) | segment is not a metadata type at all (fieldz) | "... is not a metadata type." |
Both throw code = 'INVALID_REQUEST', status = 400. Verified live against the built @objectstack/spec: unrecognisedMetaTypeRefusal('fieldz') and ('address') both return a verdict, while metaUrlSpellingRefusal returns null for both.
#9193's PR documents the spelling refusal only. It names this one in a single disambiguation line — enough that the new entry is not false — but this refusal has no entry of its own: no Fix, no Retry, and no statement of the two exemptions that decide whether it fires at all.
Why the exemptions are the load-bearing part
refuseUnmintableMetaType is not a pure function of the type segment. It returns early — i.e. the request is served — in two cases a caller cannot infer from the message:
- Compound arity:
request.name containing / exempts it, because the segment then carries an object name (/meta/lead/views/all_leads), not a type claim. - Pre-existing namespace: if
sys_metadata already carries rows under that type key, the write proceeds.
So the same segment can be refused on one deployment and served on another, depending on stored state. That is exactly the kind of thing a caller can only discover by hitting it — the discovery mechanism #9193 exists to remove.
It is also write-scoped: it runs on the mint door, not on reads.
Not claimed
Lands in content/docs/api/error-catalog.mdx, in the Metadata API Errors (/meta) section #9193's PR adds.
Backlinks: #9193 (sibling refusal, PR in flight) · #8421 (where this refusal was introduced) · #8586 (what made it statically answerable).
Filed unassigned by the dev seat implementing #9193 (session
session_01Y26DJEHSBhhAQ6wwfsHNza), measured onorigin/main@7ff5aa294. Duplicate-searched by envelope text, by symbol name and by file; nearest neighbours are #9193 (the sibling refusal, being fixed) and #8421 (where this refusal was introduced) — neither covers this.What was measured
There are two distinct refusals at the
/metatype boundary, and they emit the samecodeand the samestatus:metaUrlSpellingRefusal(packages/spec/src/shared/metadata-url-spelling.ts)viewes)unrecognisedMetaTypeRefusal⇒refuseUnmintableMetaType(packages/metadata-protocol/src/protocol.ts:12032)fieldz)Both throw
code = 'INVALID_REQUEST',status = 400. Verified live against the built@objectstack/spec:unrecognisedMetaTypeRefusal('fieldz')and('address')both return a verdict, whilemetaUrlSpellingRefusalreturnsnullfor both.#9193's PR documents the spelling refusal only. It names this one in a single disambiguation line — enough that the new entry is not false — but this refusal has no entry of its own: no
Fix, noRetry, and no statement of the two exemptions that decide whether it fires at all.Why the exemptions are the load-bearing part
refuseUnmintableMetaTypeis not a pure function of the type segment. It returns early — i.e. the request is served — in two cases a caller cannot infer from the message:request.namecontaining/exempts it, because the segment then carries an object name (/meta/lead/views/all_leads), not a type claim.sys_metadataalready carries rows under that type key, the write proceeds.So the same segment can be refused on one deployment and served on another, depending on stored state. That is exactly the kind of thing a caller can only discover by hitting it — the discovery mechanism #9193 exists to remove.
It is also write-scoped: it runs on the mint door, not on reads.
Not claimed
/metatype name that is not a plural of anything still mints a namespace —PUT /meta/fieldz/xanswers 200 #8421 argued its scoping carefully. Only its documentation is absent./metaspelling refusal is documented NOWHERE — nine verbs have thrown it since #7894 anderror-catalog.mdxhas no entry #9193 because it shares that envelope's code. The class — wire-visible refusals with no catalog entry — remains unmeasured, as The/metaspelling refusal is documented NOWHERE — nine verbs have thrown it since #7894 anderror-catalog.mdxhas no entry #9193 already noted./metaspelling refusal is documented NOWHERE — nine verbs have thrown it since #7894 anderror-catalog.mdxhas no entry #9193. That PR stands on its own; this is the sibling entry it deliberately did not absorb.Lands in
content/docs/api/error-catalog.mdx, in theMetadata API Errors (/meta)section #9193's PR adds.Backlinks: #9193 (sibling refusal, PR in flight) · #8421 (where this refusal was introduced) · #8586 (what made it statically answerable).