You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The #9180 internal-spelling sweep measured CODE only: 4 executable QA-checklist steps still call PUT /api/v1/meta/objects/:name, plus a triage-sized literal residue #11042
Blocked-by: #11930
Restart-when: #11930's PR lands (or its claim is released), freeing packages/spec/src/api
Unlock-action: re-run the cross-domain in-flight check against the then-current domain:spec and domain:cli claims before dispatching — the intersection below is with a declared surface, so it clears when that claim does, not when someone judges it unlikely to bite.
ⓘ PM status block, added 2026-08-25 by the domain:devx @ objectstack seat (session_01UjM2ia8Av1v5NqfqQEQmC6). The three lines above are the machine-readable half of pm:blocked; the reasoning is in the comment below. This is the only change to this body — everything under the rule is the filer's original text, unedited.
Found while re-deriving site 1 of #10078 against merged main (2866d5f97e). Filed rather than fixed: the correction is per-site triage across many files, and most of the population must not be swept.
objectstack | 0 generic; the /meta/objects/:name/state/:field hits are a declared route, not a tolerance | 4 — the client SDK | 41 ✅
That measurement was over code. It did not reach fixture data, checklist data, ledger notes, or docblock examples. The 2026-08-17 re-weigh then scoped step ③ to 「② 照原样做;只需要修正 objectstack objectui cloud 中错误的写法。」 — every incorrect internal spelling — and #10078 carved that into exactly two measured sites. Neither site list covers what is below.
The measurement (merged main2866d5f97e)
Population = the keys of META_URL_TO_SINGULAR (34 spellings), matched as a literal /meta/SPELLING or /metadata/SPELLING path segment across packages apps examples content skills scripts docs:
bucket
sites
files
disposition
CHANGELOG.md
88
10
⛔ frozen history, never edited
test files
69
35
mixed — most are deliberate fold pins
source docblocks/comments
30
12
mixed — some narrate the defect, some teach the plural
source code (non-comment)
4
4
all four are note:/prose STRINGS describing the fold, none emits a URL
docs + data fixtures
13
7
⭐ contains the live ones
⭐ The live ones — executable, and they emit a plural ITEM write
docs/qa/platform-checklist/areas/attachments-storage.json, steps 2, 3, 4 and one in the media block (lines 27, 34, 41, 84):
These are instructions a QA run executes against a real app (the checklist-test skill drives them). So the repo does not merely mention the plural — it tells its own operator to send one, on the write door, in the item arity the ruling's sweep reported as zero for this repo. They answer 200 today only because the boundary fold tolerates them.
Two more that state the plural as the address rather than describing the tolerance:
packages/spec/liveness/object.json:97 — "note": "served on /meta/objects/:name." (the actions property's liveness evidence)
packages/spec/src/api/http-cache.zod.ts:108 — docblock example GET /api/v1/metadata/objects/account
⛔ What must NOT be swept — this is why it is triage, not sed
Deliberate fold pins.meta-plural-i18n.test.ts, meta-audience-plural.test.ts, meta-state-plural-tolerance.test.ts, protocol-publish-canonical-fold.test.ts, rest-server-meta-org-scope-url-spelling.test.ts, protocol.read-verb-canonical-fold.test.ts, protocol.hydrate-overlay-canonical-type.test.ts, protocol-meta-type-canonicalization.test.ts and more: the plural spelling is the fixture. Rewriting it to singular leaves the assertions green while deleting the coverage — the fixture-triage failure mode where a test keeps passing precisely because it no longer exercises anything.
packages/runtime/src/domains/meta.ts:229 — comments the dispatcher route as /metadata/objects/:name/state/:field. The ledgers record a deliberate asymmetry between the REST and dispatcher transports after step 2, so whether this comment is wrong depends on what the dispatcher still mounts. Measure before touching; it is the same question Two docs/skill sites still teach the plural /meta/objects/:name/state/:field, which step ② of #9180 retires #10178 is deciding.
then keep only segments that are keys of META_URL_TO_SINGULAR (packages/spec/src/meta-spelling/meta-url-data.generated.ts).
Suggested shape
Smallest honest slice first: the 4 checklist call strings plus the 3 address-stating notes above — mechanical, answer-preserving (the fold means both spellings answer identically today), and it removes the only place the repo instructs a plural write. The test-file and docblock buckets want their own pass with per-site judgement, and each needs the fixture-triage question asked out loud: is this spelling incidental, or is it the coverage?
Part of #9180 step ③. Found while working #10078; not absorbed into it because it is outside that card's declared file surface.
Blocked-by: #11930
Restart-when: #11930's PR lands (or its claim is released), freeing
packages/spec/src/apiUnlock-action: re-run the cross-domain in-flight check against the then-current
domain:specanddomain:cliclaims before dispatching — the intersection below is with a declared surface, so it clears when that claim does, not when someone judges it unlikely to bite.Found while re-deriving site 1 of #10078 against merged
main(2866d5f97e). Filed rather than fixed: the correction is per-site triage across many files, and most of the population must not be swept.Why this was not visible before
#9180's own sweep table reports, for this repo:
That measurement was over code. It did not reach fixture data, checklist data, ledger notes, or docblock examples. The 2026-08-17 re-weigh then scoped step ③ to 「② 照原样做;只需要修正 objectstack objectui cloud 中错误的写法。」 — every incorrect internal spelling — and #10078 carved that into exactly two measured sites. Neither site list covers what is below.
The measurement (merged
main2866d5f97e)Population = the keys of
META_URL_TO_SINGULAR(34 spellings), matched as a literal/meta/SPELLINGor/metadata/SPELLINGpath segment acrosspackages apps examples content skills scripts docs:CHANGELOG.mdnote:/prose STRINGS describing the fold, none emits a URL⭐ The live ones — executable, and they emit a plural ITEM write
docs/qa/platform-checklist/areas/attachments-storage.json, steps 2, 3, 4 and one in the media block (lines 27, 34, 41, 84):These are instructions a QA run executes against a real app (the
checklist-testskill drives them). So the repo does not merely mention the plural — it tells its own operator to send one, on the write door, in the item arity the ruling's sweep reported as zero for this repo. They answer 200 today only because the boundary fold tolerates them.Two more that state the plural as the address rather than describing the tolerance:
packages/spec/liveness/object.json:97—"note": "served on /meta/objects/:name."(theactionsproperty's liveness evidence)packages/spec/src/api/http-cache.zod.ts:108— docblock exampleGET /api/v1/metadata/objects/accountpackages/client/src/client.hono.test.ts:170—fetch(BASEURL + '/api/v1/meta/objects'), incidental since plugin-hono-server 的 registerStandardEndpoints 静态 discovery 硬编码整张路由表 —— 与 D12 "按注册计算" 的两个真 discovery 面不一致 #4018/feat(plugin-hono-server)!: 删除 CRUD/discovery 便利面 —— 插件回归纯传输适配器(#4073 终点) #4296 (git log -Lconfirms it was picked as "some metadata type", never as a fold pin)⛔ What must NOT be swept — this is why it is triage, not sed
meta-plural-i18n.test.ts,meta-audience-plural.test.ts,meta-state-plural-tolerance.test.ts,protocol-publish-canonical-fold.test.ts,rest-server-meta-org-scope-url-spelling.test.ts,protocol.read-verb-canonical-fold.test.ts,protocol.hydrate-overlay-canonical-type.test.ts,protocol-meta-type-canonicalization.test.tsand more: the plural spelling is the fixture. Rewriting it to singular leaves the assertions green while deleting the coverage — the fixture-triage failure mode where a test keeps passing precisely because it no longer exercises anything.docs/protocol-upgrade-guide.md:455says "The plural spellingPUT /api/v1/meta/fields/{object}.{name}folds onto the singular (meta-plural-url-bypass:PUT /meta/fields/<name>walks around the whole two-tier registry gate — 4 registry types have no entry inPLURAL_TO_SINGULAR#7894) and earns the same refusal — verify it". Correct as written.packages/spec/src/meta-spelling/metadata-url-spelling.ts:43quotesPUT /meta/fields/...to explain the bypass it closed;rest-route-ledger.ts:196andruntime/src/route-ledger.ts:356narrate what [Ruling] The/metatype segment is ALWAYS singular — retire every plural spelling, no exception, in three steps #9180 step 2 retired. All correct as written.content/docs/releases/**— release-owned, read-only (no hits anyway).content/docs/protocol/objectql/state-machine.mdxandskills/objectstack-automation/SKILL.md— owned by Two docs/skill sites still teach the plural/meta/objects/:name/state/:field, which step ② of #9180 retires #10178, in flight. ⛔ Out of scope here, deliberately.packages/runtime/src/domains/meta.ts:229— comments the dispatcher route as/metadata/objects/:name/state/:field. The ledgers record a deliberate asymmetry between the REST and dispatcher transports after step 2, so whether this comment is wrong depends on what the dispatcher still mounts. Measure before touching; it is the same question Two docs/skill sites still teach the plural/meta/objects/:name/state/:field, which step ② of #9180 retires #10178 is deciding.Reproduce
then keep only segments that are keys of
META_URL_TO_SINGULAR(packages/spec/src/meta-spelling/meta-url-data.generated.ts).Suggested shape
Smallest honest slice first: the 4 checklist
callstrings plus the 3 address-stating notes above — mechanical, answer-preserving (the fold means both spellings answer identically today), and it removes the only place the repo instructs a plural write. The test-file and docblock buckets want their own pass with per-site judgement, and each needs the fixture-triage question asked out loud: is this spelling incidental, or is it the coverage?Part of #9180 step ③. Found while working #10078; not absorbed into it because it is outside that card's declared file surface.