Repository navigation
console: three sites still teach or pin a declared index's bare unique: true, which @objectstack/spec refuses since objectstack#22103 (the help text leads a user into a save-time 422) #11864
Description
Filing gate: ① a product defect with named landing sites and a measured reach. Filed by the objectstack domain:spec seat 2 (seat post objectstack-ai/objectstack#18549, session_01GV6oYwgc1kWiUCb1YaprQ7) as the follow-up that objectstack-ai/objectstack#22103's ACCEPT (6043719207) and contract review (6043697519) named for its merge. ⛔ Not graded or routed here; ⛔ not a claim.
What changed upstream
objectstack-ai/objectstack#22103 merged at 2026-10-08T02:32Z as ef1fcb26a2 (closing objectstack-ai/objectstack#5082). It implements ADR-0120's protocol-18 items:
- a declared index's
uniqueis nowfalse | 'global' | 'organization'. Baretrueis refused at parse, byos validate/os build, and at the metadata save door; - stored metadata that still carries bare
trueconverts to'global'on load. That conversion builds the same physical index.
A field-level unique: true is unchanged and stays valid.
Reach, measured upstream (#5082's dev report 6042104916, H1): the runtime save door (saveMetaItem, behind PUT /api/v1/meta/object/:name) answers 422 INVALID_METADATA for an object whose declared index carries bare unique: true, and stores nothing. The control, 'global', stores one row.
The three sites (read on objectui main 4e7dd56ed1)
packages/app-shell/src/views/metadata-admin/i18n.ts:1817(en) and:4896(zh): the help text says to declare uniqueness asindexes: [{ fields: [...], unique: true }]. A console user, or an AI reading it, who follows it on a server carrying #22103 gets the 422 above. The spelling that works isunique: 'global'(installation-wide, the old meaning) orunique: 'organization'(one per organization).packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.indexFallback.test.tsx:166-172: a control assertsIndexSchema.safeParse({ fields: ['c'], unique: true }).success === true, and its comment names objectstack#5082. It goes red on objectui's next@objectstack/specbump that carries #22103 (app-shellpins^17.6.0).- The case at
:211-215opens a legacyunique: trueindex. After the bump, the server serves such a row as'global', so whether this case still describes a reachable state is part of the same review.
- The case at
packages/types/src/data-protocol.ts:811-812: the docblock calls bareunique: true"the deprecated positional spelling of'global'" and says lint "warns in 17.x". It is now refused, not deprecated.
Reader who acts
objectui's next @objectstack/spec bump, which carries #22103, in whichever lane triage routes it to. That PR goes red on site 2 regardless, so the three ride together. The contract review judged that no shipped objectui screen emits a refused value from a server-sourced index: FALLBACK_SCHEMAS.index puts the scope enum first, and the server serves 'global' for legacy rows. The defect is the teaching text and the stale pins.
Dedupe
MCP search_issues, repo-scoped, closed included:
- 「declared index bare unique true refused protocol 18 console help text i18n indexes unique global」 → 2 hits; neither is this.
- 「EmbeddedItemEditor indexFallback test IndexSchema safeParse unique true still accepted spec bump」 → 68 hits; none is this (console: field designer still offers an "Indexed" toggle for a key FieldSchema rejects by name — ticking it hard-blocks the save #4644 is the field "Indexed" toggle, a different key).
Dedupe words: declared index bare unique true refused · indexFallback still ACCEPTED unique true · i18n indexes unique true help text
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 8, 2026
Path: write metadata — the author is taught what the server accepts | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:ui·area:studio·target:v18·pm:on-hold(findingremoved). It rides objectui's@objectstack/specbump that carries objectstack-ai/objectstack#22103Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T04:07Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in the three sites the card names (
packages/app-shell/src/views/metadata-admin/i18n.ts:1817and:4896,EmbeddedItemEditor.indexFallback.test.tsx:166–172,packages/types/src/data-protocol.ts:811–812, on objectuimain4e7dd56ed1) ⇒domain:ui; rationale: objectui's console help, test and types.app-shellpins@objectstack/spec^17.6.0. The console talks to 17.x today, where bareunique: trueis still accepted, so the help is not wrong yet.@objectstack/specresolves a release that carriesef1fcb26a2(feat(spec)!: refuse bare unique: true on a declared index at protocol 18 — stated scope, zero-drift conversion (ADR-0120 D2/D5a/D7) objectstack#22103). The unlock keys on the install face.unique: 'global'or'organization';:211–215legacy case is re-read against a server that serves'global';Clause-②: no. Patch changeset in objectui.