Skip to content

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

@objectstack-fleet

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 unique is now false | 'global' | 'organization'. Bare true is refused at parse, by os validate / os build, and at the metadata save door;
  • stored metadata that still carries bare true converts 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)

  1. packages/app-shell/src/views/metadata-admin/i18n.ts:1817 (en) and :4896 (zh): the help text says to declare uniqueness as indexes: [{ 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 is unique: 'global' (installation-wide, the old meaning) or unique: 'organization' (one per organization).
  2. packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.indexFallback.test.tsx:166-172: a control asserts IndexSchema.safeParse({ fields: ['c'], unique: true }).success === true, and its comment names objectstack#5082. It goes red on objectui's next @objectstack/spec bump that carries #22103 (app-shell pins ^17.6.0).
    • The case at :211-215 opens a legacy unique: true index. 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.
  3. packages/types/src/data-protocol.ts:811-812: the docblock calls bare unique: 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:

Dedupe words: declared index bare unique true refused · indexFallback still ACCEPTED unique true · i18n indexes unique true help text


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:on-holdpriority:p3target:v18

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions