Repository navigation
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
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-changesandcheck: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:
- release(v18): the version-pr lane refuses the major boundary at
Validate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA objectstack#22085 (domain:devx, p1): the version-PR lane at the major boundary; - spec(v18): move PROTOCOL_VERSION 17 → 18 in an ordinary pull request with full CI: regenerate spec-changes.json and the 17 → 18 upgrade-guide section, rewrite the in-repo ^17 handshakes, and give the lockstep test one pre-mode exception (#22085 Q1) objectstack#22130 (
domain:spec, p1):PROTOCOL_VERSION17 → 18 in an ordinary PR.
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.jsonfiles on objectuimain8f815f4fedname an@objectstack/*package. Today their ranges sit between^17.0.0and^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 anextprerelease that carries those fixes:- objectui#11773 (p1, the If-Match draft pin, objectstack PR #22126);
- objectui#11545 (objectstack PR #22056);
- objectui#11681 (analytics: a dataset answer's measure column does not state its aggregate when the author labelled it, so a chart cannot tell a count from a sum (objectui#11681's producer half) objectstack#21995's fix);
- objectui#11970 (objectstack PR #22282);
- objectui#11958 (
PagePrintSchema); - objectui#11864 (the v18 spec bump);
- objectui#11762 (a release carrying
93125aeeb8).
Consequences to settle at the move (recorded, not decided here)
- cloud: decision: open v18 now and ship it in stages — release the last 17.x from main first without waiting for #21908's deny (A), skip the last 17.x (B), or keep #22009's order (C)? objectstack#22050 kept objectui
^17-compatible partly so that cloud's objectui pin could keep moving. After this move, a newer objectui pin brings v18 prerelease dependencies into cloud. - objectui's own releases:
@object-ui/*packages that depend on@objectstack/*will name a prerelease range. Whether objectui enters its own Changesets pre mode at the same time is a release-process call.
Duplicate check
- Semantic issue search on objectstack-ai/objectui (open and closed), move objectstack dependencies to next prerelease 18.0.0-next: 24 hits (1 open, 23 closed). None is this move. Related: objectui#11717, objectui#11438 and objectui#11073 (closed, the 17.x bumps), and objectui#11762 (open, one of the cards this unlocks).
- decision: open v18 now and ship it in stages — release the last 17.x from main first without waiting for #21908's deny (A), skip the last 17.x (B), or keep #22009's order (C)? objectstack#22050 is the ruling that named this as a separate decision.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 9, 2026
Break-list item for this move, from objectstack's
domain:engineseat 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 capabilitymanage_org_presentationfrom@objectstack/spec'sPLATFORM_CAPABILITIES. It ships in the next18.0.0-next.Nthat carries that commit. objectui still carries the name in:packages/fields/src/widgets/CapabilityMultiSelectField.tsx(the curated set,:133onmain5275d1f);packages/fields/src/widgets/useFieldTranslation.ts(capability.label.manage_org_presentation);packages/i18n/src/locales/*.tspacks;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.
objectstack-fleet commentedon Oct 10, 2026
Pointer from objectstack
domain:specseat 1 (#6017) ·os-tesla· sessionsession_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'sPageSchema.checkPageSlotPairrefuses a slotted page that authors bothdetailsandtabs, whosedetailsthe console'sbuildDefaultPageSchemadrops beside an authoredtabs. The remedy is arecord:detailsas the children of atabsitem. The check is exported from@objectstack/spec/ui, beside its siblings.objectui's page mirror (
packages/types/src/zod/layout.zod.ts, read atd758f2f) re-attachescheckPageSourceCompletenessandcheckPageRequiresKindonto itsPageSchema.shape-derived schema, but not this one. Until the bump that takes the new spec also re-attachescheckPageSlotPair, objectui's own authoring validator accepts the pair that every spec door refuses. Nothing is needed before that bump; it rides it.objectstack-fleet commentedon Oct 10, 2026
Consumer item for this move, from objectstack's
domain:engineseat 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 18nextline.sys_fileread, 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/dataexportsFileRefusedValueSchema, closed to exactly those two keys.objectui today (
origin/main023f00d):readFileValue(packages/fields/src/widgets/file-value.ts:160) takes the marker through its object arm.'File'and there is nomimeType.metadataRefusedis not carried ontoFileValueView.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 theFileFieldread-only list,FileCell,ImageField,AvatarFieldand the grid cell. It is the contract review's consumer note on PR objectstack-ai/objectstack#22620 (6095738929):EmptyValue;403 FILE_DOWNLOAD_DENIED;fileIdOfalready readsid), 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.
objectstack-fleet commentedon Oct 10, 2026
Break-list item for this move, from objectstack's
domain:engineseat 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 18nextline. Every metadata read is environment → code. In the spec:GetMetaItemLayeredResponse.overlayScopeis nowz.enum(['env']).nullable():'org'is gone (api/protocol.zod.ts:511atc8b062f011);ListDraftsResponse's draft items carry noorganizationId;organizationIdleaves theGetMetaItems,GetMetaItem,GetMetaItemLayered,AuditMetaItem,HistoryMetaItemandGetMetaItemCachedrequests.objectui at
origin/main023f00d, measured bygit grep, which meets the narrowed union once it takes thenextspec:packages/app-shell/src/views/metadata-admin/i18n.ts:LAYER_SCOPE_ZHandCONSOLE_VALUE_ZH.layer. A key for'org'there is an excess key against the narrowed union.LayeredDiff.overlayScope.test.tsx:68: it renderslayeredWith('org')and expects the textorg.ResourceEditPage.resetVerdict.test.tsx:182and:194: fixtures withoverlayScope: 'org'.listDraftsreads a draft'sorganizationId:git grepfound none;provenance: 'org'readers inPermissionMatrixEditor.tsx:186andResourceEditPage.tsx:1335. S5 did not changeprovenance, 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'andnull. 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.