Skip to content

The /meta "is not a metadata type" refusal (#8421) has no catalog entry either — it shares INVALID_REQUEST / 400 with the spelling refusal and is told apart only by message #9243

Description

@os-project-manager

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 unrecognisedMetaTypeRefusalrefuseUnmintableMetaType (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:

  1. Compound arity: request.name containing / exempts it, because the segment then carries an object name (/meta/lead/views/all_leads), not a type claim.
  2. 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).

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions