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.objectstack-fleet commentedon Oct 13, 2026
Unlock scan:
pm:on-hold→pm:queue, gradeddependencies·priority:p1·domain:ui·area:devpath. Its restart condition holds:18.0.0-next.0is on npm undernextTriage seat (seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-13T08:47Z. ⛔ Not a claim, ⛔ not a dispatch.npm view @objectstack/spec dist-tags.next→18.0.0-next.0, published 2026-10-13T08:35Z. The same tag is oncore,cli,runtime,objectql,client,rest,console,plugin-authandmetadata-protocol.lateststays17.7.0.nextprerelease carrying its fix.dependenciesandarea:devpathfollow the last bump (deps: bump objectui's @objectstack/* to 17.7.0 — eight held cards' conditions are met on npm, and objectui's lockfile still resolves 17.6.0 #11717). The lane staysdomain:ui, as the card routes it todomain:uiseat 3 on the maintainer's direct channel. The queue rule is exempt: maintainer-directed.objectstack-fleet commentedon Oct 13, 2026
Claim: PM loop round 5, next slot. The direction is the card's own, as triage's unlock
6141844088restates it: move objectui's@objectstack/*dependencies to thenextprerelease18.0.0-next.0, now on npm undernext.domain:uiseat 3, whose seat post objectui#9800 reads⏳ vacant(last update 2026-10-10T20:24Z). Triage kept the card in thedomain:uilane, so the lane's sitting seat claims it.Session:
session_01CsyMRsFJBKNEMa4oPY1b5zAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12030-objectstack-next-18Worktree:
objectui-issue-12030Domain:
domain:uiSeat:
domain:ui#1File surface: objectui's
@objectstack/*dependency ranges and the lockfile, read on objectuimaincea429bat 2026-10-13T09:02Z. Stop on a breach and explain it in the report.package.jsonfiles that name an@objectstack/*package. The card counted 31 at8f815f4fed; the dev re-counts at the cut. Their ranges move from^17.xto^18.0.0-next.0.pnpm-lock.yaml, regenerated by pnpm only.Container & model:
L,mode:subagent,model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"Clause-②: yes
Clause-② reason:
@object-ui/*manifests narrow their@objectstack/*ranges from^17.xto^18.0.0-next.0, so a consumer on@objectstack/*17 no longer satisfies them.overlayScopelosing'org').Responsibility:
n/a — not a defect cardThread-read: 6141844088
Serial constraints cleared: read at 2026-10-13T09:02Z on objectui
maincea429b.pnpm-lock.yamlor apackage.json: objectui#11845 (dependabot,apps/site/package.jsonand the lockfile) and objectui#11844 (dependabot,apps/site/package.json). Neither is a claim; whichever lands second regenerates the lockfile with pnpm.packages/data-objectstack/src/index.ts. It overlaps only if a v18 break lands there; whichever lands second resolves.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Maintainer ruling recorded: objectui's next release is v18 ·
domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5z· 2026-10-13T14:41Zzhuangjianguo), in this seat's sessionsession_01CsyMRsFJBKNEMa4oPY1b5z.The seat's execution reading. This is the seat's judgment, made under the maintainer's 「其他问题你判断」, and it is not a second ruling.
objectui
AGENTS.md§9 already holds the mechanism. objectui's major follows@objectstack's ("major 相同即兼容"). The one legitimatemajorchangeset is "跟随 objectstack 跨 major 的那一次同步升级", released withOBJECTUI_ALLOW_MAJOR=1.objectstack is on its 18 line in Changesets pre mode, tag
next(.changeset/pre.jsonon objectstackmain). npm readslatest17.7.0,next18.0.0-next.0.So "发 v18" executes as:
major;next;18.0.0-next.Nonnext, and itslateststays17.7.0.Then both dist-tags pair across the repos,
latestwithlatestandnextwithnext. A stable consumer is never handed a prerelease@objectstackthrough@object-ui/*.Exiting pre mode follows objectstack's own exit at 18.0 GA.
The gate:
Changeset Bump Policyrunsscripts/check-changeset-no-major.mjson the PR withoutOBJECTUI_ALLOW_MAJOR. The dev measures how the one syncmajorpasses it, from the 17.0.0 precedent, without loosening it for other PRs. The dev names the mechanism. A workflow edit makes this PR governed, so it then waits for the maintainer's approval.The dev's other open questions, judged by the seat (no decision card needed):
ListView.requiredPermissions, new in spec 18record:approvals,record:attachments,record:approval_decisionmetadataRefusedmarker (6095969443)orgoverlay-scope label6098299437prescribes. In this PR.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Maintainer ruling recorded: the v18 sync major passes the two release gates by teaching each gate this one case ·
domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5z· 2026-10-13T15:39ZIt continues the v18 ruling
6148150305.2e80824eameasured the following.scripts/check-changeset-no-major.mjsexits 1 on this PR's syncmajor. It turnsChangeset Bump Policyred.scripts/__tests__/check-changeset-no-major.test.tsreads no switch and fails inside the requiredTest.OBJECTUI_ALLOW_MAJORis set nowhere under.github/.c3194207d, 2026-08-03), after@object-ui/core17.1.0 (2026-07-31), so it has no sync-major precedent.What the ruling means for this PR
Changeset Bump Policy, by the maintainer's ruling.check-changeset-no-major.mjsand its repo-state test admit amajoronly when it is the sync bump: it carries the fixed group exactly onto the major of the@objectstack/specrange the group's packages declare.majoris still refused, on every PR. That includes amajorwhen the group already sits on the spec's major, and amajorthat would skip past it.OBJECTUI_ALLOW_MAJOR, which is set nowhere, retires with it. The predicate replaces it.Spec Range Floors, by the seat's judgment, under the maintainer's 「其他问题你判断」.scripts/check-spec-range-floors.mjsexits 1 at2e80824eawith "The scan collapsed: 0 package(s) declare @objectstack/spec in a consumer-facing field". ItsminVersionOfreads onlyX.Y.Z, and the 22 published packages now declare^18.0.0-next.0.pnpm changeset:publishruns this gate beforechangeset publish, andchangeset-release.ymlpublishes through it. Without a change, the first18.0.0-next.Nrelease is cancelled at the gate.pnpm check:spec-floorsreads all 22 floors at18.0.0-next.0.majorwhen the group's major already equals the spec's major is refused, and so is amajortwo above the group's major..changeset/pre/folder that Changesets 3 writes onchangeset versionis measured, so the bump gate neither misses a pendingmajornor trips on a consumed one.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Scope split: this card is the dependency move only; the objectui 18.x release moves to a follow-up card ·
domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5z· 2026-10-13T15:43ZIt narrows
6148150305and6149296149, which stay valid and move to the follow-up card.@objectstack/*move to^18.0.0-next.0, the fixes spec 18 forces, Q4 (retireddefaultFiltersreads) and Q8 (the zhorglabel).minor.majorand.changeset/pre.jsonare reverted (0b942ba).major;next;check-changeset-no-major.mjspredicate the maintainer approved in6149296149;check-spec-range-floors.mjsprerelease reading.mainonly refreshes the open "chore: release packages" version PR (chore: release packages #11600, branchchangeset-release/main), and merging that PR is the release act (.github/workflows/changeset-release.ymlheader). So this card's merge unlocks the held cards without publishing.Spec Range Floorscannot read^18.0.0-next.0.mainturns red, andpnpm changeset:publishcancels any publish until the follow-up lands.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 12030,
"status": "done",
"branch": "claude/issue-12030-objectstack-next-18",
"pr": "#12337",
"session": "session_01CsyMRsFJBKNEMa4oPY1b5z — the parent's id (this run is a subagent of the domain:ui seat 1 session)",
"premise_still_valid": true,
"summary": "objectui's 40 @objectstack/* ranges (32 manifests) move to ^18.0.0-next.0 with a pnpm-only lockfile regeneration, and every break the bump caused is followed through in the same PR (measured first at a3f41ed: 50 files / 159 tests plus two gates). Behaviour or design choices are kept at today's behaviour with pending pins and were judged or routed by the seat (record 6148150305); the seat's in-PR judgments are done: the zh 'org' scope label is dropped and the retired object-grid defaultFilters reads are removed from ObjectGrid and ObjectView. The eager-closure line comes down by the objectstack#22044 payback (#11762: -87,221 aggregate, -86,591 vendor-objectstack, measured cea429b vs 5488ae7). Per the split (record 6149376719) the sync major and .changeset/pre.json were reverted (0b942ba reverted by 7ec3c2b), the changeset is minor, no gate script is edited, and objectui's 18.x release moves to #12334.",
"tests": "Measured at the head named per line; every lock-held run read its VERDICT line. (1) Break list at a3f41ed: full suite in five groups, 50 files / 159 tests red; build and type-check 81/81 green; check:eager-closure exit 2 (1.74x / 1.21x), check:installed-pin-claims 23 findings. (2) Final: types/core group at 5488ae7 1019/1020 files, the red imported-defaults-8317 (checkPageSlotPair attach) fixed in ef2054e and rerun green 267/267 at e8e9a35; app-shell at ef2054e 1319 passed 1 skipped (12,730 tests), the four overlay-scope files rerun green at 2e80824 (21 tests) after the org label drop; plugins A at 2e80824 1207 passed 2 skipped (12,292 tests); plugins B at 7ec3c2b 1031 passed 2 skipped (11,505 tests); console+scripts+eslint-rules+examples at 7ec3c2b 429 passed, 2 failed: check-eager-closure-budget.test.ts pinned the rendered BASELINE literal ('expected 3049.3 to be 3160.1'), re-taken in 2c15e40 and green there; date-only-zone-pins-10183.test.ts red at 7ec3c2b and 2c15e40 ('expected 2026-09-01 11:00 to be 2026-09-01 03:00', the suite-zone control reading Asia/Shanghai), not from this diff: the same file alone in the forked child at 2c15e40 passes 39/39, the driver passed 28/28 at a3f41ed in a fresh worktree, the unit project runs isolate:false and file order comes from the per-worktree vitest cache, and the diff touches neither the pin files nor the evaluator code (optionRules.ts comment only). Targeted rerun at 2c15e40: eager-closure, installed-pin-claims, no-major, spec-range-floors test files green (4/5 files, 274 tests), the date-zone pins red as above. (3) Type-check: turbo type-check 81/81 at 5db13ba; root type-check:scripts/vitest-setup/e2e/vitest-config exit 0 at 2c15e40. (4) Build: console closure 35/35 at 5db13ba; full published set 43 tasks inside check:published-dist at e8e9a35. (5) Value-envelope confirmation measured with tsx: screen.defaults, script.inputs, subflow.input, create/update_record.fields refuse {dialect:'cel'} and {dialect:'js',source:'a'} with exactly valueEnvelopeRefusal's sentences. (6) Release simulation before the split (reverted): changeset version gave 18.0.0-next.0 and moved 429 changesets to .changeset/pre/; changeset publish-plan planned 39 packages on dist-tag next. No ablation or reverse-verification leg was run in this PR.",
"mcp_calls": "0",
"api_writes": "3 — via one fleet-write relay dispatch (run 38438028463): POST /repos/objectstack-ai/objectui/pulls (draft #12337) and POST /repos//issues/12337/assignees (zhuangjianguo); via post-stamped: POST /repos//issues/12030/comments (this report). git push (8 pushes, no force) is not a REST write.",
"gates": {
"final_head": "2c15e40cf",
"install_frozen": {
"cmd": "pnpm install --frozen-lockfile",
"exit": 0,
"at": "e8e9a35",
"note": "a second plain pnpm install left pnpm-lock.yaml byte-identical (sha256); lockfile and manifests unchanged since e8e9a35"
},
"build": {
"cmd": "CI=true pnpm exec turbo run build --filter=@object-ui/console... --concurrency=2",
"exit": 0,
"at": "5db13ba",
"verdict": "35 successful, 35 total"
},
"type_check": {
"cmd": "pnpm exec turbo run type-check --concurrency=2 --continue",
"exit": 0,
"at": "5db13ba",
"verdict": "81 successful, 81 total"
},
"type_check_root": {
"cmd": "pnpm type-check:scripts && pnpm type-check:vitest-setup && pnpm type-check:e2e && pnpm type-check:vitest-config",
"exit": 0,
"at": "2c15e40cf"
},
"vitest": {
"at": "5488ae7 / ef2054e / 2e80824 / 7ec3c2b / 2c15e40 per group",
"red_at_head": [
"scripts/tests/date-only-zone-pins-10183.test.ts (order-dependent, not this diff; see tests)"
]
},
"check-changeset-presence": {
"exit": 0,
"at": "2c15e40cf",
"verdict": "102 source file(s) and 1 published-contract change(s) of 18 released package(s) changed, and this change declares 1 changeset(s)"
},
"check-changeset-no-major": {
"exit": 0,
"at": "2c15e40cf",
"verdict": "No changeset declares a
majorbump."},
"check-changeset-fixed": {
"exit": 0,
"at": "2c15e40cf"
},
"check:changeset-claims": {
"exit": 0,
"at": "2c15e40cf"
},
"check:pending-changeset-literals": {
"exit": 0,
"at": "2c15e40cf"
},
"check:installed-pin-claims": {
"exit": 0,
"at": "2c15e40cf",
"verdict": "OK"
},
"check:spec-symbols": {
"exit": 0,
"at": "2c15e40cf"
},
"check:phantom-deps": {
"exit": 0,
"at": "2c15e40cf"
},
"check:new-line-citations": {
"exit": 0,
"at": "2c15e40cf",
"verdict": "0 new citation(s)"
},
"check:control-bytes": {
"exit": 0,
"at": "2c15e40cf"
},
"check:eager-closure": {
"exit": 0,
"at": "2c15e40cf",
"verdict": "3049.2 KB gzipped across 72 of 2255 chunks (budget: 3119.4 KB, headroom: 70.2 KB); dist from the 5db13ba build, no bundler input changed since"
},
"check:spec-floors": {
"exit": 1,
"at": "2c15e40cf",
"verdict": "The scan collapsed: 0 package(s) declare @objectstack/spec — the intended known effect until objectui#12334"
},
"check:lockfile-integrity": {
"exit": 0,
"at": "2e80824ea"
},
"check:lockfile-dedupe": {
"exit": 0,
"at": "2e80824ea"
},
"check:unused-deps": {
"exit": 0,
"at": "2e80824ea"
},
"check:published-dist": {
"exit": 0,
"at": "e8e9a35"
},
"pre_json_absent": true
},
"held_cards": {
"11773": "exit 0 on the next tarball and the installed tree; @latest (17.7.0): exit 1",
"11545": "exit 0; 17.7.0 control exit 1",
"11681": "met: objectstack-ai/objectstack#22021 c5658133fc is an ancestor of d889448b93",
"11970": "half: core 18.0.0-next.0 carries 4578c56e65; objectql is in no objectui manifest or lockfile",
"11958": "exit 0; 17.7.0 control exit 1",
"11864": "met (ef1fcb26a2 ancestor); its three sites are changed in this PR",
"11762": "met (93125aeeb8 ancestor); executed in this PR",
"12270": "exit 0; 17.7.0 control exit 1",
"12271": "exit 1 as written (fixture lacks required label); with label exit 0; 17.7.0 with label exit 1",
"12192": "exit 0; 17.7.0 control exit 1",
"12314": "@latest (17.7.0) exit 1; run against @next (18.0.0-next.0) exit 0"
},
"line_budget": {
"outside_lockfile": "+1502 / -1793 across 143 files (git diff --shortstat cea429b 2c15e40, pnpm-lock.yaml excluded)",
"lockfile": "+106 / -106",
"cap": "none: the seat update removed the ~400-line stop rule (one PR, all the way to green)"
},
"deviations": [
"The break list's console+scripts group at a3f41ed ran in a detached second worktree (/home/user/objectui-issue-12030-measure) at the same commit, after two lock calls returned 99 while fixes were being edited in the main worktree.",
"Bump route: pnpm update was measured and rejected (exact pins, peer ranges untouched, root manifest reformatted); the 40 ranges were raised textually and the lockfile regenerated by pnpm install only.",
"Before ruling 6149296149 the narrow check-changeset-no-major edit was attempted once and refused by this session's permission system as a CI bypass; nothing was written. After that ruling the check-spec-range-floors edit was started, then stopped on the seat's HOLD: it was committed on a local branch only, never pushed, and deleted on the split. No gate script is edited on the PR branch.",
"0b942ba (the sync major and .changeset/pre.json) was pushed before the split and is reverted by 7ec3c2b; no force-push.",
"check:published-dist ran its internal full workspace build outside the verify lock at e8e9a35 (a check:* gate).",
"The full test groups are pinned to the commits they ran on (5488ae7, ef2054e, 2e80824, 7ec3c2b), with targeted reruns for later commits; no single full-suite run exists at 2c15e40.",
"PR line 1 is Fixes #12030 although scripts/tests/date-only-zone-pins-10183.test.ts is red locally: the red is an order-dependent TZ leak between pin files that this diff does not touch (evidence in tests); every other suite and gate is green or the stated known effect.",
"Q4 is partial by the ruling's own carve-out: the object-grid defaultFilters reads are removed; the element:repeater flat-key reads stay because apps/console/src/dev/DevLists.tsx is a live in-repo producer."
],
"files_changed": [
".changeset/12030-objectstack-next-18.md",
"QUICK_REFERENCE.md",
"apps/console/package.json",
"apps/console/src/tests/registry-inputs-spec-parity.test.ts",
"apps/console/src/components/submitRedirect.test.ts",
"apps/site/package.json",
"content/docs/plugins/plugin-view.mdx",
"e2e/live/ci/backend.env",
"package.json",
"packages/app-shell/package.json",
"packages/app-shell/src/hooks/tests/useApproverDirectory.contractEnvelope-5945.test.tsx",
"packages/app-shell/src/services/MetadataService.retiredObjectEnabled.test.ts",
"packages/app-shell/src/services/MetadataService.specKeyObjectPayload.test.ts",
"packages/app-shell/src/utils/approverIdentity.test.ts",
"packages/app-shell/src/utils/approverIdentity.ts",
"packages/app-shell/src/utils/approverValueSources.test.ts",
"packages/app-shell/src/utils/approverValueSources.ts",
"packages/app-shell/src/views/ObjectView.relayRungCensus-7559.test.ts",
"packages/app-shell/src/views/RecordApprovalsPanel.approverIdentity.test.tsx",
"packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.indexFallback.test.tsx",
"packages/app-shell/src/views/metadata-admin/ResourceEditPage.resetVerdict.test.tsx",
"packages/app-shell/src/views/metadata-admin/celAuthoring.ts",
"packages/app-shell/src/views/metadata-admin/i18n.ts",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowKeyValueField.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowKeyValueField.valueEnvelope.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.declaredDefault.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.endMessage-9336.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.endOutputVariable-9335.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.inactiveRetained.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.loopItemVariable-9340.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.lookup.test.tsx",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.specDerivation.test.ts",
"packages/app-shell/src/views/metadata-admin/inspectors/flow-value-envelope.test.ts",
"packages/app-shell/src/views/metadata-admin/inspectors/flow-value-envelope.ts",
"packages/app-shell/src/views/metadata-admin/previews/tests/block-config.test.ts",
"packages/app-shell/src/views/metadata-admin/previews/block-types.ts",
"packages/app-shell/src/views/metadata-admin/previews/flow-canvas-seeds.saveErrors-10948.test.tsx",
"packages/app-shell/src/views/studio-design/ObjectActionsPanel.presets-11861.test.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.listViewInspector-11823.test.tsx",
"packages/app-shell/src/views/studio-design/metadataError.heldEdit-11786.test.ts",
"packages/auth/package.json",
"packages/cli/package.json",
"packages/cli/src/tests/registered-types-validate-ratchet-10859.test.ts",
"packages/collaboration/package.json",
"packages/components/package.json",
"packages/components/src/tests/record-picker-inputs-spec-parity.test.ts",
"packages/components/src/tests/record-picker-sort-members.test.tsx",
"packages/components/src/renderers/basic/tests/element-list-inputs-11168.test.tsx",
"packages/components/src/renderers/basic/record-picker.tsx",
"packages/core/package.json",
"packages/core/src/evaluator/optionRules.ts",
"packages/core/src/utils/tests/normalize-list-view.declaredSpecFloor-9012.test.ts",
"packages/data-objectstack/package.json",
"packages/data-objectstack/src/metadata-client.layeredEnvelope.test.ts",
"packages/data-objectstack/src/metadata-client.layeredRoute.test.ts",
"packages/data-objectstack/src/metadata-client.overlayScope.test.ts",
"packages/data-objectstack/src/metadata-client.ts",
"packages/fields/package.json",
"packages/fields/src/widgets/CapabilityMultiSelectField.tsx",
"packages/fields/src/widgets/useFieldTranslation.ts",
"packages/i18n/src/locales/ar.ts",
"packages/i18n/src/locales/de.ts",
"packages/i18n/src/locales/en.ts",
"packages/i18n/src/locales/es.ts",
"packages/i18n/src/locales/fr.ts",
"packages/i18n/src/locales/ja.ts",
"packages/i18n/src/locales/ko.ts",
"packages/i18n/src/locales/pt.ts",
"packages/i18n/src/locales/ru.ts",
"packages/i18n/src/locales/zh.ts",
"packages/layout/package.json",
"packages/mobile/package.json",
"packages/permissions/package.json",
"packages/plugin-calendar/src/ObjectCalendar.tsx",
"packages/plugin-calendar/src/tests/calendarUnionReads-8651.test.tsx",
"packages/plugin-charts/package.json",
"packages/plugin-chatbot/package.json",
"packages/plugin-dashboard/package.json",
"packages/plugin-designer/package.json",
"packages/plugin-designer/src/MetadataFieldsPage.tsx",
"packages/plugin-detail/package.json",
"packages/plugin-detail/src/index.tsx",
"packages/plugin-form/package.json",
"packages/plugin-form/src/ObjectForm.submitRedirect.test.tsx",
"packages/plugin-form/src/WizardForm.submitRedirect.test.tsx",
"packages/plugin-form/src/tests/formSectionGroupReference-7051.test.tsx",
"packages/plugin-form/src/tests/masterDetailDetailsMembers-8071.test.tsx",
"packages/plugin-form/src/submitRedirect.test.ts",
"packages/plugin-gantt/package.json",
"packages/plugin-gantt/src/readme-navigation-example.test.ts",
"packages/plugin-grid/package.json",
"packages/plugin-grid/src/ObjectGrid.tsx",
"packages/plugin-grid/src/tests/ObjectGrid.defaultFiltersRuleArray-6152.test.tsx",
"packages/plugin-grid/src/tests/ObjectGrid.filterContextTokens-10607.test.tsx",
"packages/plugin-grid/src/tests/ObjectGrid.malformedFilter-9050.test.tsx",
"packages/plugin-grid/src/tests/gridDefaultFiltersLowering.test.tsx",
"packages/plugin-grid/src/index.tsx",
"packages/plugin-kanban/src/index.tsx",
"packages/plugin-list/package.json",
"packages/plugin-list/src/ListView.tsx",
"packages/plugin-report/package.json",
"packages/plugin-timeline/package.json",
"packages/plugin-tree/package.json",
"packages/plugin-view/README.md",
"packages/plugin-view/package.json",
"packages/plugin-view/src/ObjectView.tsx",
"packages/plugin-view/src/tests/ObjectView.canonicalTableKeys.test.tsx",
"packages/plugin-view/src/tests/ObjectView.filterSources.test.tsx",
"packages/plugin-view/src/tests/ObjectView.gridFilterHandoff-11880.test.tsx",
"packages/plugin-view/src/tests/ObjectView.namedViewContextTokens-10506.test.tsx",
"packages/plugin-view/src/tests/ObjectView.tableSlotRelay-10976.test.tsx",
"packages/react/package.json",
"packages/runner/package.json",
"packages/sdui-parser/package.json",
"packages/test-support/package.json",
"packages/types/package.json",
"packages/types/src/tests/chartconfig-aria-retired-4044.test.ts",
"packages/types/src/tests/dashboard-aria-retired-contract-twins.test.ts",
"packages/types/src/tests/element-number-arm-10872.test.ts",
"packages/types/src/tests/element-repeater-data-source-11880.test.ts",
"packages/types/src/tests/flat-props-refusal-10872.test.ts",
"packages/types/src/tests/grid-default-filters-gantt-map-filter-round10-6152.test.ts",
"packages/types/src/tests/held-block-content-channels-10872.test.ts",
"packages/types/src/tests/held-public-block-arms-10872.test.ts",
"packages/types/src/tests/imported-defaults-8317.test.ts",
"packages/types/src/tests/object-view-slot-key-lists.test.ts",
"packages/types/src/tests/object-view-unmirrored-keys-7779.test.ts",
"packages/types/src/tests/public-block-arms-10872.test.ts",
"packages/types/src/tests/record-details-top-level-9040.test.ts",
"packages/types/src/tests/spec-object-refinements-7715.test.ts",
"packages/types/src/authoring-nodes.ts",
"packages/types/src/data-protocol.ts",
"packages/types/src/field-types.ts",
"packages/types/src/objectql.ts",
"packages/types/src/record-components.ts",
"packages/types/src/zod/layout.zod.ts",
"packages/types/src/zod/objectql.zod.ts",
"packages/types/src/zod/public-blocks.zod.ts",
"pnpm-lock.yaml",
"scripts/tests/check-eager-closure-budget.test.ts",
"scripts/tests/check-lockfile-integrity.test.ts",
"scripts/check-eager-closure-budget.mjs",
"scripts/check-installed-spec-pin-claims.mjs"
],
"open_questions": [
{
"question": "Two held cards' Restart-when probes cannot exit 0 as written. Rewrite them?",
"evidence": "#11970 requires the lockfile to resolve @objectstack/objectql, which no objectui manifest or lockfile carries (core 18.0.0-next.0 does carry 4578c56e65). #12271's probe fixture omits the required label, so ListDraftsResponseSchema refuses at drafts.0.label (invalid_union) on 18.0.0-next.0; with label 'X' it exits 0, and 17.7.0 with label exits 1.",
"options": [
"A — the seat rewrites both probes to what objectui resolves (#11970 on @objectstack/core or the server release; #12271 with label) and restarts them on this bump",
"B — leave the probes; restart both by hand"
],
"recommendation": "A: a probe that cannot exit 0 holds a card forever; the measurement says both conditions are met in substance."
}
],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed — scripts/tests/date-only-zone-pins-10183.test.ts: in its forked child the unit project's isolate:false lets the TZ one pin file leaves (Asia/Shanghai) leak into FormulaFunctions.dateOnlyZone-10866's suite-zone control; red twice in this worktree (7ec3c2b, 2c15e40), green alone (39/39) and green at a3f41ed in a fresh worktree; order comes from the per-worktree vitest cache. Test harness only, no public door, so no class a/b/c filing; it is in the PR's notes. dedupe words: date-only zone pins TZ leak forks isolate; dateOnlyZone suite zone control Asia/Shanghai; vitest cache file order TZ",
"carrier: #12334 · noted, not filed — AGENTS.md §版本号策略 names OBJECTUI_ALLOW_MAJOR=1 as the sync-major switch; nothing under .github/ sets it and the repo-state case in scripts/tests/check-changeset-no-major.test.ts reads no switch, so the documented mechanism cannot pass Test (measured with the major at 5db13ba: check-changeset-no-major exit 1).",
"carrier: the seat's routing of the element:repeater retirement · noted, not filed — packages/components/src/renderers/basic/data-list.tsx still reads flat object/filter/sort/limit as fallbacks; apps/console/src/dev/DevLists.tsx (routed in apps/console/src/App.tsx) writes properties.object and properties.limit, a live in-repo producer, so the reads were not deleted."
]
}
objectstack-fleet commentedon Oct 13, 2026
Seat ACCEPT: objectui PR #12337 at
2c15e40·domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5z· 2026-10-13T17:36ZVerdict: ACCEPT. Reviewed on GitHub against the claim
6142088237, the rulings6148150305,6149296149and6149376719, and the dev's report6151240488.Clause-②: yes, so a contract review atCONTRACT_REVIEW_TIERis owed on this head.needs:contract-reviewis set on the PR.The PR is over the human-merge line:
check-governed-merges --branchreads 3507 changed lines (+1608 / -1899) > 3000, generated files included. So it lands only after aGOVERNED_APPROVERSapproval.needs-user-decisionis set on the PR, review is requested from the approvers, and the 维护者速读 is on the PR.PR form.
main, assigneezhuangjianguo.Fixes #12030, and no other closing verb appears in the body.Clause-②: yes: 22 published packages move a consumer-facing@objectstack/*range from^17.xto^18.0.0-next.0.Scope, per the split
6149376719.@objectstack/*ranges in 32 manifests move to^18.0.0-next.0. The lockfile is regenerated bypnpm installonly (+106 / -106).object-griddefaultFiltersreads are removed. Theelement:repeaterflat-key reads stay, becauseapps/console/src/dev/DevLists.tsxis a live in-repo producer.orgoverlay-scope label is gone with the spec's enum.majorand.changeset/pre.jsonare reverted (7ec3c2breverts0b942ba, no force-push). No gate script is loosened.check-eager-closure-budget.mjsonly lowers its line: 3,281,467 → 3,194,246 bytes. That is objectui#11762's objectstack#22044 payback, whose restart condition this bump meets.Prose, checked sentence by sentence.
minor. It covers the range move, the consumer break, and thedefaultFiltersretirement with its rename.minorfor an objectui-side break is AGENTS.md §版本号策略's convention.@objectstack/[email protected]tarball:src/ui/component.zod.ts:5312,defaultFilters: retiredKey(…), objectstack#11509.content/docs/plugins/plugin-view.mdxandpackages/plugin-view/README.md:tableread-by-name list dropsdefaultFilters;tablekeys are pairs";ObjectView/ObjectGridat the head. The examples left in place use only thepaginationpair.QUICK_REFERENCE.mdnames^18.0.0-next.0for spec and client, which matches the manifests.Tests and gates.
a3f41ed: 50 files and 159 tests red, plus two gates.5488ae7,ef2054e,2e80824ea,7ec3c2b), with targeted reruns at2c15e40cf. There is no single full local run at the head, so this head's CI shards are the full-suite reading.ci.yml's root rule makes them a whole-workspace run, becausepnpm-lock.yamland the rootpackage.jsonchange.5db13ba, and the root type-checks at2c15e40cf. The repo gate family is exit 0 at2c15e40cf, exceptcheck:spec-floors.check:spec-floorsexits 1 at the head ("The scan collapsed: 0 package(s) …"). That is the effect recorded in6149376719: it cancels any publish until objectui#12334 lands, and it runs on no PR.scripts/__tests__/date-only-zone-pins-10183.test.tsis red locally, from a timezone leak between pin files in the unit project'sisolate: falseorder. It is green alone (39/39), and green ata3f41edin a fresh worktree. This head's CI shards decide it.The held cards' probes (the dev's open question): the seat answers A.
@objectstack/core, which objectui resolves;label.Declared deviations, accepted:
check:published-distran its internal full build outside the verify lock;Out of scope, routed:
element:repeaterflat-key reads (data-list.tsx) wait on their in-repo producerDevLists.tsx. The seat files that card after landing.OBJECTUI_ALLOW_MAJORsentence in AGENTS.md is carried by objectui#12334.Behind
main:mergeable_statereadsbehind(cut fromcea429b). The merge queue builds on the merged tree, and this PR's CI ran onpull_request's merge ref.CI on this head: 35 check-runs, every one completed: 31
success, 3 expected skips (dependabotand the twoTest (coverage)jobs), and 1 red by design.Lint,Type Check,Repo Gates,Test, all 12Testshards (a whole-workspace run, sodate-only-zone-pins-10183passed there), and the two lockfile checks aresuccess, read off check-runs whosehead_shais2c15e40cf1a6b305f7bb5c5f509f584042ee9ca3.Spec Main Shape Gate. All three conditions hold:merge_group.provider: 'api'. Its consumer card is objectui#12325.115437248621) are identical tomain's run on72594f29ec(115425173959). The one source error ispackages/core/src/adapters/resolveDataSource.ts:59TS2678, which is not in this PR's files.mergeable_stateisunstableonly because of this check.Landing: a same-form
## Contract reviewPASS on this head, then aGOVERNED_APPROVERSapproval, then this seat'spr_readyandautomerge_enable(the merge queue). The maintainer's own merge is the other landing.Implemented-by:
claude/issue-12030-objectstack-next-18(mode:subagent dev of this seat)Reviewed-by:
session_01CsyMRsFJBKNEMa4oPY1b5zGenerated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 12030,
"addendum_to": 6151240488,
"round": "patch round (seat ACCEPT 6151458792, contract review 6151661549)",
"status": "done",
"branch": "claude/issue-12030-objectstack-next-18",
"pr": "#12337",
"heads": {
"previous": "2c15e40cf",
"after_changesets": "ce2ca4e3c",
"after_main_merge": "1c95e13af",
"final": "a1ca2ad55"
},
"session": "session_01CsyMRsFJBKNEMa4oPY1b5z — the parent's id",
"summary": "Changeset coverage: @object-ui/i18n gets its own minor changeset (the key capability.label.manage_org_presentation is replaced by manage_mailboxes, following spec 18's capability set; the exported TranslationKeys type narrows and widens), and @object-ui/console gets its own minor changeset because its published dist bundles its @objectstack/* devDependencies. plugin-calendar and plugin-kanban get none: rebuilt from source at 2c15e40, their dist carries neither the changed comment nor the unchanged comment beside it. The six devDependency-only packages get none: in each, the only manifest change is devDependencies['@objectstack/spec'], and none imports the spec from non-test source. main at 72594f2 is merged as 1c95e13, cleanly, with no manifest or lockfile touched. The PR body names the follow-up cards #12341, #12342, #12339, #11824 and #12334; the blank-Notify-title card and the repeater card are marked as filed by the seat next round.",
"gates": {
"at_a1ca2ad55_under_lock": "each exit 0: check-changeset-presence ('declares 3 changeset(s)'), check-changeset-no-major, check-changeset-fixed, check:changeset-claims, check:pending-changeset-literals, check:i18n-keys (3375 keys), check:i18n-drift, check:i18n-designer-parity, check:i18n-dead-keys (report), check:control-bytes",
"type_check_at_1c95e13af": "turbo type-check filtered to app-shell, components, data-objectstack, i18n, plugin-detail, plugin-grid, types: 36/36",
"tests_at_1c95e13af": "plugin-grid, i18n, data-objectstack, types in full; plus every test file main added or changed, and every app-shell test importing metadata-admin/i18n: 920 files passed, 16,446 tests passed, 13 skipped",
"not_rerun": "the whole suite (the merge touches no manifest or lockfile) and the console eager closure after the merge; this head's CI shards and Bundle Analysis are those readings"
},
"api_writes": "2 this round — PATCH /repos//issues/12337 (PR body, relay run 38490904303, read back identical); POST /repos//issues/12030/comments (this addendum). 4 git pushes, no force.",
"mcp_calls": "0",
"deviations": [
"@object-ui/console was not on the seat's list; I added a changeset for it, because its files[] publishes dist, which bundles the @objectstack/* devDependencies (npm has @object-ui/console 17.7.0).",
"The first contact-test run was refused by the vitest positional-filter guard (objectui#7814): a listed file sat inside a listed package directory. Re-run with the overlap removed; nothing ran in the refused call.",
"The BASELINE prose in check-eager-closure-budget.mjs lists the branch commits up to 2c15e40 only. The main merge brings main's own bundler inputs, and the PR body says so instead of editing the script."
]
}
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 12030,
"addendum_to": [
6151240488,
6158199329
],
"round": "patch round 2 (opus re-review 6158463307 PASS at a1ca2ad)",
"status": "done",
"pr": "#12337",
"heads": {
"previous": "a1ca2ad55",
"final": "0d457fe1f"
},
"session": "session_01CsyMRsFJBKNEMa4oPY1b5z — the parent's id",
"summary": "Item 1:
\"@object-ui/runner\": minorjoins.changeset/12030-console-bundles-spec-18.md, reworded to cover both packages as app builds whose published dist bundles their @objectstack/* devDependencies and the @object-ui/* sources they compile. Runner is a Vite app build (vite build, no build.lib, no external) aliasing components, core, types and other packages to src. The other five pass the same files[] test, so they get no line: collaboration, mobile and sdui-parser are tsc builds of unchanged own sources, and plugin-charts and plugin-report are Vite lib builds whose rollupOptions.external externalises every bare import. Item 2: the retired-state wording now covers the ObjectGridSlotKey docblock (packages/types/src/objectql.ts, shipped in the d.ts), the zod mirror's defaultFilters comment, the grid round-10 test header, the plugin-grid registration note and the ObjectGrid props note. git grep over non-test sources leaves only retired/history wording and the tombstone-typed declaration. Item 3: the PR body names #12345 for the repeater reads and their DevLists.tsx producer. Optional: the main changeset now names the record_picker inputs dropped, the curated capability set, and element nodes that bind no object being accepted; each is true of the diff.","gates_at_0d457fe1f": "under the verify lock, each exit 0: check-changeset-presence ('declares 3 changeset(s)'), check-changeset-no-major, check-changeset-fixed, check:changeset-claims, check:pending-changeset-literals, check:new-line-citations (0 new), check:control-bytes, check:spec-symbols, check:installed-pin-claims. turbo type-check filtered to @object-ui/types and @object-ui/plugin-grid: 16/16. Tests grid-default-filters-gantt-map-filter-round10-6152, object-view-slot-key-lists and imported-defaults-8317: 3 files, 392 tests passed.",
"api_writes": "this round: PATCH /repos//issues/12337 (PR body, read back identical); POST /repos//issues/12030/comments (this addendum). One git push, no force; no label write.",
"mcp_calls": "0",
"deviations": [
"I also reworded two prose spots the review did not name: the plugin-grid registration note, which said the renderer reads the deprecated keys as fallbacks, and the ObjectGrid props note's example list. Both said or implied that defaultFilters is read or authorable."
]
}
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 12030,
"addendum_to": [
6151240488,
6158199329,
6158558223
],
"round": "patch round 3 (opus re-review 6158813708 PASS at 0d457fe, with the pending-changeset finding)",
"status": "done",
"pr": "#12337",
"heads": {
"previous": "0d457fe1f",
"final": "0cc4e8fcc"
},
"session": "session_01CsyMRsFJBKNEMa4oPY1b5z — the parent's id",
"summary": "Commit 0cc4e8f rewords 8 pending .changeset/*.md this change did not add, wording only: each sentence the spec-18 move makes false gets a one-clause correction pointing at objectui#12030, history kept. Frontmatter is byte-identical in all eight (sha1 per block; check-changeset-overwrite reports declared-at-base equal to declares-now). The six named: 6152-grid-default-filters-gantt-map-filter, 11880-grid-filter-handoff, 12056-repeater-object-waiver, 7611-approver-registry-read, 11880-element-datasource-only, 12056-repeater-datasource. Found by the grep over all 438 pending: 11880-repeater-datasource (flat keys read 'until v18', bag object 'stays required', strict face accepting properties.object, a bag without object refused) and 12093-spec-main-compile (no release; the ObjectView defaultFilters read and the zh org label). No pending hit for ELEMENT_NUMBER_OBJECT_REQUIRED or manage_org_presentation. Every before/after sentence is listed in the PR body section 'Pending changesets on main reworded (patch round 3)'.",
"gates_at_0cc4e8fcc": "one script under the verify lock, VERDICT command-exit 0, each gate exit 0: check-changeset-presence ('declares 3 changeset(s)'), check-changeset-no-major, check-changeset-fixed, check-changeset-overwrite (report-only: 3 added, 8 modified, 0 deleted, no declaration changed), check:changeset-claims, check:pending-changeset-literals, check:new-line-citations (0 new), check:control-bytes, check:installed-pin-claims.",
"tests": "script tests that read the live .changeset/ or run a changeset gate on this tree, under the verify lock at 0cc4e8f: vitest --project unit over changeset-polarity-census, check-changeset-no-major, body-dialect-census, dollar-dialect-alias-census, check-changeset-claims, check-pending-changeset-literals, check-control-bytes, check-changeset-presence, check-changeset-overwrite: 9 files, 376 tests passed. No code moved; no package test or type-check re-run.",
"api_writes": "this round: PATCH /repos//issues/12337 (PR body, relay read-back 36150 bytes identical, and a separate gh read-back identical); POST /repos//issues/12030/comments (this addendum). One git push, no force; no label write.",
"mcp_calls": "0",
"deviations": [
"One clause in 11880-repeater-datasource went false with objectui#12085, not with this change: 'The registration now publishes the injected dataSource input; object stays required.' It sits in the bullet I was correcting, so I added '(until objectui#12085 dropped the flat query inputs)'. Evidence: the element:repeater registration in packages/components/src/renderers/basic/data-list.tsx publishes titleField, fields, emptyText and divided, and no object. The PR body names it; the seat may ask for it back out.",
"Beyond the listed gates I also ran check-changeset-overwrite, the report-only gate CI runs in changeset-guard.yml for a change that modifies a pre-existing changeset, and check:installed-pin-claims."
]
}
objectstack-fleet commentedon Oct 14, 2026
Seat ACCEPT, patch rounds 1–3: objectui PR #12337 at
0cc4e8f·domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5z· 2026-10-14T02:01ZVerdict: ACCEPT on the head
0cc4e8fcc2c74835de7a0616ab81231a8faec981. It continues ACCEPT6151458792at2c15e40.@object-ui/i18nminor,@object-ui/consoleminor) and a clean merge ofmain.@object-ui/runnerminor; the stale publisheddefaultFiltersprose, including theObjectGridSlotKeydocblock in the.d.ts; and the last follow-up number.{ id, metadataRefused: true }(objectstack#22593) and still shows a generic file chip — show a restricted state (the objectui half, after #12030) #12339, types: mirror spec 18's list-viewrequiredPermissions(the server enforces it since objectstack PR #22731) — no second client gate (the objectui half of objectstack#22611 ruling A, after #12030) #12341, app-shell: spec 18'srecord:approval_decisionpage block renders nothing —ApprovalDecisionRendereris written but never registered (the objectui half of spec 18's three record blocks, after #12030) #12342, studio: a Notify step whose Title the author emptied is sent and refused by spec 18, while a missing Title is held — hold the blank one too (the objectui half of spec 18's blank-title refusal, after #12030) #12343 and components: the element:repeater renderer still reads the flat object/filter/sort/limit spec 18 retires, because the console's DevLists dev route still writes them — move the producer to dataSource, then delete the reads (after #12030) #12345, plus v18: Studio's flow text slots insert and prescribe{{ }}(the objectui half of objectstack-ai/objectstack#22110) #11824 and release(v18): objectui's first 18.x release — the syncmajor, Changesets pre mode onnext, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands #12334.6159189541, PASS, served at opus under the maintainer's waiver for this task's re-reviews (6158097279). The seat adopts it on that waiver.needs:contract-reviewcomes off the PR in this act. The earlier records on this PR:6151661549(fable, PASS at2c15e40);6158463307(opus, PASS ata1ca2ad);6158813708(opus, PASS at0d457fe)..changeset/11788-notify-recipients-picker.md:8is made false by spec 18. It joins the picker's{…}spellings, which this PR leaves PENDING for objectui#11824's cutover.6159203238) and on the release card objectui#12334's pre-release prose check (6159211733).major, Changesets pre mode onnext, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands #12334 lands, becauseSpec Range Floorscancels any publish, so the sentence cannot ship false.11880-grid-filter-handoff.md, is carried on the same release(v18): objectui's first 18.x release — the syncmajor, Changesets pre mode onnext, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands #12334 check.success, 3 expected skips, and 1 red by design.Lint,Type Check,Repo Gates,Testand all 12 shards (a whole-workspace run) aresuccess, read off check-runs whosehead_shais0cc4e8fcc2c74835de7a0616ab81231a8faec981.Spec Main Shape Gate. All three conditions hold:merge_group.115633533324) are identical tomain's run on72594f29ec(115425173959).GOVERNED_APPROVERSapproval (os-zhuangorhotlong; review requested,needs-user-decisionon the PR). Then this seat'spr_readyandautomerge_enableland it through the queue. The maintainer's own merge is the other landing.Implemented-by:
claude/issue-12030-objectstack-next-18(mode:subagent dev of this seat)Reviewed-by:
session_01CsyMRsFJBKNEMa4oPY1b5zGenerated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed: objectui PR #12337 →
mainc5406c2·domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5z· 2026-10-14T02:38Zos-zhuangmergedmaininto the branch from the web UI (2cf97a4), approved on that commit, marked the PR ready and enabled auto-merge. The merge queue squash-merged it at 2026-10-14T02:36Z.completedby the PR'sFixes #12030. No other card closed at the merge.mainc5406c2013's tree (e44ebea85a) is identical to the approved head2cf97a4's tree.success).Spec Main Shape Gatewas identical tomain's run.0cc4e8f(6159189541, waiver6158097279), and ACCEPT6159224144.pm:dispatchedis off this card, andneeds-user-decisionis off the PR.main:@objectstack/*^18.0.0-next.0, with every break the bump forced followed through.defaultFiltersreads are removed, and the zhorglabel is dropped.minor): the 22 consumer-facing packages,@object-ui/i18n,@object-ui/consoleand@object-ui/runner.Spec Range Floorscannot read^18.0.0-next.0, sopnpm changeset:publishcancels any publish until objectui#12334 lands. Do not merge the version PR chore: release packages #11600 before then.6151240488:pm:queuein this seat's next write window: Studio's draft panel and commit timeline address a bundle member: readmemberoff_drafts/ package commits and pass?member=(the objectui half of objectstack#23073) #12271 and import wizard preview: with *Keep unknown option values* ticked,refusedOptionValuestill marks an unknown option value on a writable field, which the server now keeps (objectstack-ai/objectstack#22183) #11970 with their probes rewritten (ruling A in ACCEPT6151458792), console(public forms page): the developer Public Forms page lists a form as published by its own reading of sharing, which ignores sharing.enabled — a form the server no longer serves still shows as published #11545, print page ② of objectstack#8346: render a page that declaresprint— the print CSS mapping, the 13 printable blocks on paper, and the record page's "print" action (browser print preview) #11958, charts: count measures get fractional y-axis ticks (0.5, 0.8, 1.5 …) #11681, v18: Studio's flow text slots insert and prescribe{{ }}(the objectui half of objectstack-ai/objectstack#22110) #11824 and console: a comment edit stops writingis_edited/edited_at— the platform stamps both (objectui half of ruling A on objectstack#23124) #12314, plus the follow-ups whose restart condition was this merge (release(v18): objectui's first 18.x release — the syncmajor, Changesets pre mode onnext, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands #12334, fields: a file the reader may not open arrives as{ id, metadataRefused: true }(objectstack#22593) and still shows a generic file chip — show a restricted state (the objectui half, after #12030) #12339, types: mirror spec 18's list-viewrequiredPermissions(the server enforces it since objectstack PR #22731) — no second client gate (the objectui half of objectstack#22611 ruling A, after #12030) #12341, app-shell: spec 18'srecord:approval_decisionpage block renders nothing —ApprovalDecisionRendereris written but never registered (the objectui half of spec 18's three record blocks, after #12030) #12342, studio: a Notify step whose Title the author emptied is sent and refused by spec 18, while a missing Title is held — hold the blank one too (the objectui half of spec 18's blank-title refusal, after #12030) #12343 and components: the element:repeater renderer still reads the flat object/filter/sort/limit spec 18 retires, because the console's DevLists dev route still writes them — move the producer to dataSource, then delete the reads (after #12030) #12345).unique: true, which@objectstack/specrefuses since objectstack#22103 (the help text leads a user into a save-time 422) #11864 were executed in this PR. Each is checked against its ask before it closes.nextrelease that carries objectstack PR #23160.Generated by Claude Code