Uh oh!
There was an error while loading. Please reload this page.
docs(api): teach the singular /meta/:type spelling as the canonical one (#10078) - #10337
Merged
os-elon merged 1 commit intoAug 20, 2026
Merged
Conversation
… one (#10078) `metadata-api.mdx` taught the plural as a co-equal address ("singular or plural -- `object` and `objects` address the same type", "both forms exist in the wild"). The 2026-08-17 re-weigh of the #9180 ruling scopes step 3 to internal spelling correction across the self-owned repos: the direction ("singular is the only canonical spelling") stands, and our own docs stop teaching the plural as an equal alternative. The boundary fold stays exactly as it is -- undocumented, and not a documented promise. Nothing here changes what the API accepts or refuses; this page stops advertising a tolerance, which is the whole of the change. Part of #10078
os-elon
marked this pull request as ready for review
August 20, 2026 16:59
Uh oh!
There was an error while loading. Please reload this page.
os-elon
deleted the
claude/issue-10078-meta-spelling-internal-corrections
branch
August 20, 2026 17:43
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #10078 — the docs half only. The SDK half stopped at the card's own trip-wire; the measurement is below.
What changed
content/docs/api/metadata-api.mdx— theGET /meta/:typeparameter row and the paragraph under it. It taught the plural as a co-equal address:It now teaches the singular as the spelling, and explains why the plurals elsewhere in this API (a collection of records, a manifest key) do not carry across to a
/metatype segment.Per the 2026-08-17 re-weigh of the #9180 ruling (comment 5311434183), verbatim and untranslated: 「② 照原样做;只需要修正 objectstack objectui cloud 中错误的写法。」 Step ③ is internal spelling correction only.
⛔ The boundary fold is untouched and stays undocumented. Nothing here changes what the API accepts or refuses. The page stops advertising a tolerance; the tolerance itself is exactly as it was, and this PR adds no promise about it in either direction.
Why the SDK half (site 1) is not in this PR
The card's trip-wire, verbatim: "If any slice of your diff turns out to change what a request is answered with (not merely what we emit or teach), STOP and report the fork — that slice belongs at the
claude-fable-5floor and is not this card."Site 1 asked the client SDK's variable-typed item routes to normalize toward singular. Measured on this branch, folding the emitted
:typesegment does change what a request is answered with — and, on the write door, where a row lands. The REST/metadoors decide the organization scope from the raw URL spelling (organizationIdForMetaRead/organizationIdForMetaWrite, whosedeclaresOrgOverridefolds through the manifest mapPLURAL_TO_SINGULAR), while the protocol boundary folds through the complete URL map. For two spellings the two maps disagree:Executed against the built
@objectstack/metadata-coreand@objectstack/spec/meta-spellingon this branch, not read off the source.So an SDK that normalized
translationstotranslationbefore emitting would move an org-active caller from the env-wide row to the org-scoped row on reads, and would land asaveItemon an org-scoped row where it lands env-wide today. That is the accept/serve half of the boundary, not the emit half — the trip-wire's stop condition exactly. Filed separately as a defect in its own right (it is the #7894 class one layer down: the plural is a door around the singular's gate) and reported to the PM for re-tiering.Two things follow, and both are deliberate:
stringparameter is a public-surface break). A conditional type that rejects only a literal plural argument would be right-shaped and would emit no runtime bytes at all, but it needsMETA_URL_TO_SINGULARto expose literal key types — apackages/specchange, outside the claim's declared surface, and a hand-copied key list in the client would violate the derived-never-hand-written rule the map exists to enforce.Also measured and left alone:
GET /meta/:type/:name/publishedfalls back tosvc.getPublished(type, name)with the raw segment after its layered lookup misses, andlistDraftsdeliberately applies no fold (it matches the draft row's storedtype). Both are named in the filed defect.Not touched
/meta/objects/:name/state/:field, which step ② of #9180 retires #10178's two sites —content/docs/protocol/objectql/state-machine.mdx:126andskills/objectstack-automation/SKILL.md:281. The docs sweep reached both;skills/**is a governed surface and cannot ride a normal PR, and the sub-issue owns them. Stopped at the boundary.content/docs/releases/**— release-owned, read-only. Release pages naming the plural stay as they are.packages/client/src/index.ts—getLegalNextStatesalready spells the segmentobjectafter Retire the plural/meta/objects/:name/state/:fieldregistration: SDK moves to the singular twin, the collision's registration-order pin is deleted (step ② of the #9180 ruling) #10077; nothing here re-touches it.Gates
Re-derived with
node scripts/pm/dispatch-gates.mjs(no path arguments) against the real change set at88c09c986, and every family it named was run. All green, quoting each gate's own verdict line:check:cross-package-test-inputsOK: 12 package(s) read outside themselves, all declaredcheck:doc-anchors252 internal #fragment link(s) across 399 source file(s) all resolve to a real headingcheck:docs-audit-scopedocs-accuracy-audit scope is in sync with content/docs/: 180 hand-written doc(s)check:docs-redirectsOK (apps/docs/redirects.mjs: 92 entries …)check:published-readme-links152 outbound link(s) across 60 published markdown file(s)check:role-wordOK, no new occurrences of the reserved wordcheck:empty-stateall classified (1 closed, 2 open, 4 output, 9 scope)check:livenessevery governed-type property … is classifiedcheck:strictness-ledger61 file(s) across 5 triaged director(ies)check:variant-docs18 discriminated union(s) — 8 governed, 10 exemptnode scripts/check-cross-package-test-inputs.mjsOK: 12 package(s) read outside themselvescheck:slot-lookup(named at dispatch, not by the re-derivation)ratchet holds: 107 unswept site(s) in 25 file(s), none newscripts/docs-audit/check-affected-docs.mjs(same)The re-derivation named no family the dispatch brief had not, and named two fewer (
check:slot-lookup,check-affected-docs.mjs) because the diff no longer touchespackages/**; both were run anyway.pnpm lint— narrowed, and the narrowing provably excludes nothing. eslint's configured population ineslint.config.mjsis**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}; this PR's one changed file is.mdx. Run directly at the file, eslint answersFile ignored because no matching configuration was supplied.(--format json, one result,errorCount: 0) — so the repo-wide run can produce no finding attributable to this diff. CI runs the full farm regardless.No changeset: docs-only, releases nothing —
skip-changeset.Generated by Claude Code