Skip to content

docs(api): catalog the /meta unrecognised-type-spelling refusal (#9193) - #9245

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-9193-meta-spelling-refusal-catalog
Aug 17, 2026
Merged

docs(api): catalog the /meta unrecognised-type-spelling refusal (#9193)#9245
os-project-manager merged 1 commit into
mainfrom
claude/issue-9193-meta-spelling-refusal-catalog

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#9193

metaUrlSpellingRefusal's envelope — INVALID_REQUEST / 400 / "not a recognised spelling" — ships on the wire and was documented nowhere in content/docs/**. A caller that sent a declined spelling got a status and a code it could not look up. This adds the catalog entry, plus a pointer from the Metadata API page.

Docs-only. No changeset; skip-changeset applied.

What the refusal actually declines — measured, not paraphrased

The card warned this entry could be born wrong in two ways. Both were checked against origin/main @ 7ff5aa294 before a word was written.

It is a MISSPELLING refusal, not a PLURAL refusal. Probed live against the built @objectstack/spec (dist/shared/index.mjs), not read off a card:

viewes REFUSE {"declared":"view","hint":"views"}
objectes REFUSE {"declared":"object","hint":"objects"}
capabilitys REFUSE {"declared":"capability","hint":"capabilities"}
fieldes REFUSE {"declared":"field","hint":"fields"}
views null fold-> view
objects null fold-> object
translations null fold-> translation
fields null fold-> field
fieldz null fold-> fieldz [unmintable]
theme null fold-> theme

Recognised plurals fold and are served. What is refused is a spelling that resolves to no type at all while reaching for a type the platform declares. The entry says exactly that, and carries a callout making the non-claim explicit — this is the premise corrected at #9180 comment 5310461296, and the entry is written to that correction rather than to the ruling's original framing.

The refusal is genuinely wire-reachable, which the entry's example depends on: the :type path parameter matches any string, and deps.errorFromThrown passes the thrown code/status through (packages/runtime/src/http-dispatcher.ts:764). INVALID_REQUEST is registered to @objectstack/metadata-protocol in ERROR_CODE_LEDGER, so it is not demoted to declaredCode. The example body is the shape buildApiError actually emits — { success: false, error: { code, message, httpStatus } } — rather than a sketch of the EnhancedApiError schema.

⭐ The entry states no verb count, deliberately

I re-derived the count instead of inheriting "nine": every call site of canonicalizeMetaRequestType, which is the function holding the refusal.

Nine on current origin/maingetMetaItems, getMetaItem, getMetaItemLayered, getMetaItemCached, saveMetaItem, publishMetaItem, rollbackMetaItem, diffMetaItem, deleteMetaItem. The card's inherited figure happens to be right today.

And it is already stale in flight. PR #9191 is open (draft, not merged as of this writing) and routes auditMetaItem, historyMetaItem and findReferencesToMeta through the same boundary — taking it to twelve the moment it lands. Writing "nine" would have shipped a sentence with a known expiry date.

So the entry hard-codes no count, per the #9175 lesson: a prose sentence stating a count is a declared-vs-enforced pair with no enforcement. Nothing here needs the number — a caller looking up a code needs the cause, the correction and the retry verdict, none of which are per-verb. This is the cheaper phrasing and the more accurate one.

One accuracy trap avoided while writing it: translations and fields are recognised spellings, but they do not fold on the three unrouted verbs today (that is precisely the #9157 defect). So the entry quantifies over no verbs at all — it says recognised plurals are folded at the boundary, and illustrates with views and objects, which fold everywhere. A sentence saying "on every verb" would have been false.

Scope

Findings filed, not fixed

Verification — all at 586e4cb21 (final commit)

Gates derived with node scripts/pm/dispatch-gates.mjs against the actual changed paths, then re-run after the final commit:

check:nul-bytes PASS
check:doc-anchors PASS
check:role-word PASS
check:docs-redirects PASS
check:error-status-conformance PASS
check:docs-audit-scope PASS
check:empty-state (spec) PASS
check:liveness (spec) PASS
check:strictness-ledger (spec) PASS
check:variant-docs (spec) PASS

check:doc-anchors is not named by the derivation — added because the diff introduces a cross-page fragment link. It is the gate that actually verifies the new anchor resolves (241 internal #fragment link(s) ... all resolve to a real heading), so the link was confirmed by a gate rather than by slug guesswork. check:error-status-conformance and check:docs-audit-scope are the two the derivation matched on error-catalog.mdx specifically.

The pinned spelling contract was run as the premise check before any edit: packages/spec/src/shared/metadata-url-spelling.test.ts — 20 passed.

⚠️The docs-drift advisory is structurally silent here and that is not evidence of correctness.scripts/docs-audit/affected-docs.mjs derives affected pages from changed package sources; this diff changes no package, so it reports 0 docs ... across 0 changed package(s) and prints no "what this run could not see" section. For a docs-only diff it has nothing to say in either direction.


Generated by Claude Code

The `metaUrlSpellingRefusal` envelope — `INVALID_REQUEST` / 400 / "not a
recognised spelling" — ships on the wire and was documented nowhere in
`content/docs/**`. A caller that hit it got a status and a code it could not
look up. Adds the catalog entry, plus a pointer from the Metadata API page.
Measured on origin/main rather than inherited: the refusal declines a
MISSPELLING of a declared type (`viewes` for `view`), not a plural —
recognised plurals fold to the canonical singular and are served. The entry
states no verb count, because a prose count is a declared-vs-enforced pair
with no enforcement.
Fixes#9193
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y26DJEHSBhhAQ6wwfsHNza
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 17, 2026
@os-project-manageros-project-manager added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed documentation Improvements or additions to documentation size/s labels Aug 17, 2026 — with Claude
@os-project-manager
os-project-manager marked this pull request as ready for review August 17, 2026 06:15
@os-project-manager
os-project-manager added this pull request to the merge queueAug 17, 2026
Merged via the queue into main with commit 2abb66bAug 17, 2026
31 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-9193-meta-spelling-refusal-catalog branch August 17, 2026 06:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The /meta spelling refusal is documented NOWHERE — nine verbs have thrown it since #7894 and error-catalog.mdx has no entry

2 participants

@os-project-manager@claude