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

Open

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.

  6. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: pm:on-hold → pm:queue, graded dependencies · priority:p1 · domain:ui · area:devpath. Its restart condition holds: 18.0.0-next.0 is on npm under next

    Triage seat (seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-13T08:47Z. ⛔ Not a claim, ⛔ not a dispatch.

  7. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5, next slot. The direction is the card's own, as triage's unlock 6141844088 restates it: move objectui's @objectstack/* dependencies to the next prerelease 18.0.0-next.0, now on npm under next.

    • Use the repo's bump route and pnpm's lockfile regeneration. ⛔ No hand-edited lockfile.
    • Measure the break list and report it first. A large list splits into a mechanical bump PR plus per-area fix cards.
    • The PR lists the held cards each part unlocks.
    • The maintainer's words, verbatim from the card: 「让 objectui 提前改用 next 预发布版」 and 「17.x 不会发新版」.
    • Seat routing. The card names domain:ui seat 3, whose seat post objectui#9800 reads ⏳ vacant (last update 2026-10-10T20:24Z). Triage kept the card in the domain:ui lane, so the lane's sitting seat claims it.
      Session: session_01CsyMRsFJBKNEMa4oPY1b5z
      Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
      Branch: claude/issue-12030-objectstack-next-18
      Worktree: objectui-issue-12030
      Domain: domain:ui
      Seat: domain:ui#1
      File surface: objectui's @objectstack/* dependency ranges and the lockfile, read on objectui main cea429b at 2026-10-13T09:02Z. Stop on a breach and explain it in the report.
    • The manifests: the package.json files that name an @objectstack/* package. The card counted 31 at 8f815f4fed; the dev re-counts at the cut. Their ranges move from ^17.x to ^18.0.0-next.0.
    • The lockfile: pnpm-lock.yaml, regenerated by pnpm only.
    • A changeset.
    • Break fixes, only when the measured list is small and mechanical. Otherwise stop after the measurement and report the list, so the seat can split it into per-area cards.
    • ⛔ Not decided by this claim, and reported only: objectui entering its own Changesets pre mode, and the cloud pin consequence. These are the card's "Consequences to settle at the move (recorded, not decided here)". The seat files a decision card from the report if landing needs one.
      Container & model: L, mode:subagent, model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
      Clause-②: yes
      Clause-② reason:
    • Published @object-ui/* manifests narrow their @objectstack/* ranges from ^17.x to ^18.0.0-next.0, so a consumer on @objectstack/* 17 no longer satisfies them.
    • The diff can also carry v18's breaking stages into objectui's own published surface (the card's break list, for example overlayScope losing 'org').
    • The exact moved set is measured by the dev, and the at-tier contract review rules on it before the queue.
      Responsibility: n/a — not a defect card
      Thread-read: 6141844088
      Serial constraints cleared: read at 2026-10-13T09:02Z on objectui main cea429b.
    • Open PRs touching pnpm-lock.yaml or a package.json: objectui#11845 (dependabot, apps/site/package.json and the lockfile) and objectui#11844 (dependabot, apps/site/package.json). Neither is a claim; whichever lands second regenerates the lockfile with pnpm.
    • This seat's objectui#12318 claim edits packages/data-objectstack/src/index.ts. It overlaps only if a v18 break lands there; whichever lands second resolves.
    • PRs objectui#12320 and objectui#12321 (in the queue or awaiting CI) touch no manifest or lockfile.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedependenciesdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatchedpriority:p1

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions