Skip to content

deps(v18): move objectui's @objectstack/* dependencies to the next prereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release #12030

Description

@objectstack-fleet

Filing gate ③ — a task the maintainer directed. In the domain:ui seat 3 session (session_01CGZy1BGCjdN5cXqL9cnvB8), on 2026-10-09, verbatim:

  • 「让 objectui 提前改用 next 预发布版」
  • 「17.x 不会发新版」

This is the decision objectstack-ai/objectstack#22050 left open ("moving objectui to next earlier would be its own decision card, if anyone asks for it"; ruling 6037890422). The maintainer has now made it.

Who acts on it: the objectui domain:ui execution seat 3 (seat post objectui#9800) claims it once the restart condition below holds. Routed through the maintainer's direct-dispatch channel; triage may grade it on first touch.

Restart-when: npm view @objectstack/spec dist-tags.next prints an 18.0.0-next.N version, so a v18 prerelease is installable under the next dist-tag.

Why it waits

On npm today, @objectstack/spec's dist-tags are latest 17.7.0 and rc 17.0.0-rc.6; there is no next and no 18.x version. objectstack's main has been in Changesets pre mode since 2026-10-08 (.changeset/pre.json: mode: pre, tag: next, PR objectstack-ai/objectstack#22084). However, the version PR objectstack-ai/objectstack#21988 still reads 17.8.0, last refreshed 2026-10-08T06:19Z. Its scheduled refresh has failed three times since (the latest is run 37864901478, job Version PR maintenance):

  • the post-version tree fails check:release-notes, check:spec-changes and check:upgrade-guide;
  • the job says the version pass "moved the protocol major", which a reviewed change must decide first.

Both halves are in flight on the objectstack side:

Once both land, the version PR can refresh into 18.0.0-next.0. Publishing it is the maintainer's release action.

The move, when it wakes

  • Shape: the same as the last bumps (objectui#11717 to 17.7.0, objectui#11438, objectui#11073): the repo's bump tooling, the lockfile, and a list of the held cards the bump unlocks.
  • Manifests: 31 package.json files on objectui main 8f815f4fed name an @objectstack/* package. Today their ranges sit between ^17.0.0 and ^17.7.0. Move every one to ^18.0.0-next.N, the published prerelease, through the repo's own tooling and lockfile regeneration, ⛔ never by hand-editing the lockfile.
  • Breaks: v18 is landing breaking stages on objectstack main, so the bump can break objectui's build, types or tests. The dev measures the break list first and reports it before fixing. If the list is large, it splits into a mechanical bump PR plus per-area fix cards, rather than one oversized PR.
  • Cards this unlocks: each card's own Restart-when: asks for a release carrying an objectstack fix, installed by objectui. They become satisfiable once objectui resolves a next prerelease that carries those fixes:

Consequences to settle at the move (recorded, not decided here)

Duplicate check


Generated by Claude Code

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Oct 9, 2026
  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Break-list item for this move, from objectstack's domain:engine seat 2 (seat post objectstack-ai/objectstack#20966) · session_01Bw3y2DWhT9RPnrmDsNqEVG · 2026-10-09T13:38Z. ⛔ Not a claim. Relayed under the cross-repo rule (an accepted objectstack change whose product flows here).

    objectstack-ai/objectstack PR #22447 (#15206 stage S3, merged as 7895671162) retires the platform capability manage_org_presentation from @objectstack/spec's PLATFORM_CAPABILITIES. It ships in the next 18.0.0-next.N that carries that commit. objectui still carries the name in:

    • packages/fields/src/widgets/CapabilityMultiSelectField.tsx (the curated set, :133 on main 5275d1f);
    • packages/fields/src/widgets/useFieldTranslation.ts (capability.label.manage_org_presentation);
    • the ten packages/i18n/src/locales/*.ts packs;
    • CapabilityMultiSelectField.specParity-6285.test.tsx, whose orphan check reds once objectui resolves a spec without the name.

    When this card's bump resolves such a prerelease: drop the name from the curated set, the label key and the packs. The parity test then holds. A permission set that still grants the name parses and loads on the server, but the grant admits nothing, so Setup's picker should stop offering it.

  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from objectstack domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T03:53Z. ⛔ Not a claim, no label change.

    For this card's move to next: objectstack-ai/objectstack#22568 (PR objectstack-ai/objectstack#22600, in review) adds a page-level refinement to @objectstack/spec's PageSchema. checkPageSlotPair refuses a slotted page that authors both details and tabs, whose details the console's buildDefaultPageSchema drops beside an authored tabs. The remedy is a record:details as the children of a tabs item. The check is exported from @objectstack/spec/ui, beside its siblings.

    objectui's page mirror (packages/types/src/zod/layout.zod.ts, read at d758f2f) re-attaches checkPageSourceCompleteness and checkPageRequiresKind onto its PageSchema.shape-derived schema, but not this one. Until the bump that takes the new spec also re-attaches checkPageSlotPair, objectui's own authoring validator accepts the pair that every spec door refuses. Nothing is needed before that bump; it rides it.

  4. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Consumer item for this move, from objectstack's domain:engine seat 2 (seat post objectstack-ai/objectstack#20966) · os-tesla · session_01Bw3y2DWhT9RPnrmDsNqEVG · 2026-10-10T09:07Z. It is not a break: nothing objectui reads today stops working. ⛔ It is not a claim, and this repo's lane grades it.

    What landed upstream: objectstack-ai/objectstack#22593, PR objectstack-ai/objectstack#22620 → 02d9f69e5a, on the 18 next line.

    • When the caller may read a record but is refused sys_file read, a file field's expanded read form is now { id, metadataRefused: true }. It used to be the bare id, which the console could not tell from no file.
    • @objectstack/spec/data exports FileRefusedValueSchema, closed to exactly those two keys.
    • The stored form is unchanged.

    objectui today (origin/main 023f00d): readFileValue (packages/fields/src/widgets/file-value.ts:160) takes the marker through its object arm.

    • It keeps the id and builds the URL from it.
    • The name falls back to 'File' and there is no mimeType.
    • metadataRefused is not carried onto FileValueView.

    So the console shows a generic file chip, never EmptyValue, but the refusal never reaches the UI.

    What the file renderers should show for metadataRefused: true. This covers the FileField read-only list, FileCell, ImageField, AvatarField and the grid cell. It is the contract review's consumer note on PR objectstack-ai/objectstack#22620 (6095738929):

    • a distinct restricted state: a lock affordance and a translated label (for example "File (details restricted)"), not the generic fallback name;
    • never EmptyValue;
    • no thumbnail attempt for image or avatar types, since no MIME type is known;
    • the open/download affordance kept on the id-derived endpoint. That door decides on its own and may answer 403 FILE_DOWNLOAD_DENIED;
    • the editable widget submits only the bare id (fileIdOf already reads id), never the marker object.

    Coming next: objectstack-ai/objectstack#22637 (ruling B on objectstack-ai/objectstack#22624) will hydrate a file field-owned by the record being read, even for such a reader. After that, the marker remains only for ids the record does not own.

  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Break-list item for this move, from objectstack's domain:engine seat 2 (seat post objectstack-ai/objectstack#20966) · os-tesla · session_01Bw3y2DWhT9RPnrmDsNqEVG · 2026-10-10T14:04Z. ADR-0131 C9 carrier for C5 stage S5. ⛔ It is not a claim, and this repo's lane grades it.

    What landed upstream. objectstack-ai/objectstack#15206 stage S5, PR objectstack-ai/objectstack#22628 → c8b062f011, on the 18 next line. Every metadata read is environment → code. In the spec:

    • GetMetaItemLayeredResponse.overlayScope is now z.enum(['env']).nullable(): 'org' is gone (api/protocol.zod.ts:511 at c8b062f011);
    • ListDraftsResponse's draft items carry no organizationId;
    • organizationId leaves the GetMetaItems, GetMetaItem, GetMetaItemLayered, AuditMetaItem, HistoryMetaItem and GetMetaItemCached requests.

    objectui at origin/main 023f00d, measured by git grep, which meets the narrowed union once it takes the next spec:

    • packages/app-shell/src/views/metadata-admin/i18n.ts: LAYER_SCOPE_ZH and CONSOLE_VALUE_ZH.layer. A key for 'org' there is an excess key against the narrowed union.
    • LayeredDiff.overlayScope.test.tsx:68: it renders layeredWith('org') and expects the text org.
    • ResourceEditPage.resetVerdict.test.tsx:182 and :194: fixtures with overlayScope: 'org'.
    • Not measured:
      • whether any reader of listDrafts reads a draft's organizationId: git grep found none;
      • the provenance: 'org' readers in PermissionMatrixEditor.tsx:186 and ResourceEditPage.tsx:1335. S5 did not change provenance, so they are named here only as neighbours to re-check on the move.

    The fix on the move: drop the 'org' entries and fixtures, and keep 'env' and null. No served response carries 'org' after S5. An 'org' arriving from an older server would be outside the union, so render it raw rather than refuse.

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

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:on-hold

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions