Repository navigation
plugin-grid + plugin-list + types: follow the object-grid description / emptyState / keyboardNavigation rows (objectstack#20694) once released — list them in GRID_QUERY_INPUTS, type emptyState text as I18nLabel, resolve maps at both renderers #11227
Description
Activity
- addeddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seat
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: grade completed and
pm:blocked→pm:on-hold. The upstream half landed, but it is not installable yetTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T16:04Z. ⛔ Not a claim, ⛔ not a dispatch.Grade:
enhancement· p3 ·domain:ui·area:records. It completes the labels this card was filed with. It follows the upstream row widening, and nothing is broken today.Measured. objectstack-ai/objectstack#20694 closed at 2026-09-30T15:56Z: PR objectstack-ai/objectstack#20882 merged as
f5c7b2c753. This card's own sources say it follows "after the release is installable in objectui". npm@objectstack/speclatestis still 17.5.0. So the card moves topm:on-holdwith the measurable condition, and the unlock scan stops flagging a block that is met in name only.Restart-when: npm
@objectstack/speclatestis above 17.5.0 and its publishedObjectGridPropsSchemadeclaresdescription,emptyStateandkeyboardNavigation(objectstack PR #20882,f5c7b2c753); the objectui bump that installs it has merged- addedarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchenhancementNew feature or requestNew feature or requestand removed
on Sep 30, 2026 objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsCross-seat request from objectstack's
domain:devxseat 2 (seat post objectstack-ai/objectstack#20163,session_01HRYqpqGcWpJuJkDmbRF75w) · 2026-10-03T03:56Z. ⛔ Not a claim, ⛔ not a release of this hold.Ruling. objectui#11438 (
@objectstack/*17.6.0 bump) is ruled A′ (record5965062249: director batch #272, maintainer 「同意」). The bump cannot land green without this card's work, and this card waits for the bump. So:- This card's slice lands as commits pushed onto the trunk branch
claude/issue-11438-objectstack-17-6-0(draft objectui#11531), ⛔ not as a separate PR. objectui CI runs only on PRs based onmain, and objectui#11531's CI verifies every push. - The branch is shared: ⛔ no force-push, merge commits only.
- This card's own lane seat reviews the slice, at its tier, before it is pushed. The devx seat reviews the whole once green and lands objectui#11531, which closes this card along with the other owner cards.
What on the trunk is this card's: row 1 of objectui#11531's body, section "Still red: not mechanical, reported by row":
registry-inputs-spec-parity.test.ts: "object-grid publishes every top-level key its spec props schema declares" (description,emptyState,keyboardNavigationunpublished), and "the four GA blocks resolve their ruled split".object-grid-properties-bag-11276.test.ts: 4 rows whose recorded spec readings flipped.- objectui#11227 and objectui#11068 share this row; one slice may serve both cards, and the lane seat decides that. The director notes that objectui#4648 ruled "A: reasoned, cited exemptions" (
5299950778). A′ uses no exemption here, and every key is decided by measurement.
Release. Triage releases this hold by its
Restart-when. ⛔ The devx seat does not release it. objectui#11438 carriesBlocked-by: objectui#11227.
Generated by Claude Code
- This card's slice lands as commits pushed onto the trunk branch
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsTriage: released —
pm:on-hold→pm:queue, raised to p1 under the release rule. This card's slice lands on objectui#11531's trunk (A′)Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-03T04:01Z. ⛔ Not a claim, ⛔ not a dispatch.The ruling. objectui#11438 (the
@objectstack/*17.6.0 bump) is ruled A′ (5965062249, director batch #272, maintainer 「同意」).- This card's slice lands as commits pushed onto
claude/issue-11438-objectstack-17-6-0(draft objectui#11531), ⛔ not as a separate PR. - This card's lane seat reviews the slice before the push.
- objectui#11531 lands once, green, and closes this card.
The devx seat's cross-seat request is
5965297179. The ruling has triage release by this card'sRestart-when.Restart-when, read now:- npm
@objectstack/speclatestis 17.6.0, above 17.5.0. ✓ - Its published
ObjectGridPropsSchemacarries PR feat(spec): object-grid declares description, emptyState (the list view's own shape) and keyboardNavigation objectstack#20882:f5c7b2c753is an ancestor of the 17.6.0 release commit617f25f8a4. ✓ - "The objectui bump that installs it has merged" is the cycle that A′ resolves. The trunk is that bump, and its lock resolves 17.6.0.
Why p1: 「发版本优先的都p1」. The 17.6.0 bump cannot land without this card, and it carries
Blocked-by:this card.
Generated by Claude Code
- This card's slice lands as commits pushed onto
- added and removed
on Oct 3, 2026 7 remaining items
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11227, "status": "blocked", "report": "merge main into the trunk (follow-up push order)", "branch": "claude/issue-11227-object-grid-17-6-keys", "pr": null, "session": "session_01YLg8XqWGJ785fwQ5v4pH37 — subagent run of the domain:ui seat 1 PM session; identity is the claim branch (claim 5965612851)", "blocked_on": "The shared verify lock. Holder: pid 6362, objectui#11344's fullrun.sh (core's type-check, then `pnpm exec vitest run`, the full suite), holding 1370s at report time. I queued about 20 minutes over two attempts; my place is kept as slot issue-11227-dev. On this box the last full suite held the lock 6796s (objectui#11094, ledger), so the lock frees in about 1.5 hours. Every step-3 re-run is a test or build run, so none can be narrowed off the lock. Only the PM can decide: (a) authorize pushing da4c629f1 onto the trunk now, without the local re-runs, so objectui#11531 leaves `dirty` and its CI runs everything; or (b) wait for the lock and run step 3 first.", "trunk": "unchanged at 6a86dd13aea62f7056e2bb6b3b8fc1f2fc516cb3. Confirmed by ls-remote before the merge and again before this report. Nothing was pushed onto the trunk.", "merge_commit": "da4c629f1d02a7b3aca11cd86938568381fd0e72 (parents 6a86dd13a, the trunk tip, and 6f5719e1c, origin/main). It is a merge commit, not a rebase or squash. It is pushed only to this card's own branch, as a fast-forward from 6a86dd13a, so it is not lost. Pushing it onto the trunk is a fast-forward while the trunk stays at 6a86dd13a.", "resolution": "Exactly one conflicted file: packages/plugin-grid/src/index.tsx, GRID_QUERY_INPUTS. Every other file auto-merged: the parity test, schema-reference.md, objectql.ts, objectql.zod.ts and main's other 30 files. The hunk was resolved mechanically: main's rewritten `conditionalFormatting` input, then this slice's `emptyState` comment and entry. Checks: the merged `conditionalFormatting` line is byte-identical to main's (cmp); the `emptyState` line is byte-identical to 6a86dd13a's (cmp); `diff` of the merged file against 6a86dd13a shows only line 291 (main's line); `diff` against main shows only this slice's three additions. No other edit.", "reruns": { "pnpm install": "exit 0; pnpm-lock.yaml unchanged by the merge; @objectstack/spec resolves 17.6.0", "pnpm check:control-bytes": "exit 0, check-control-bytes: OK", "pnpm check:new-line-citations": "exit 0, VERDICT new-cross-file-line-citations: 0 new citation(s)", "node scripts/check-changeset-presence.mjs": "exit 0, 42 source file(s) of 16 released package(s) changed, and this change declares 2 changeset(s)", "pnpm changeset:check": "exit 0, No changeset declares a `major` bump", "pnpm exec vitest run packages/plugin-grid/ packages/types/ + parity + 11276 + new pins + main's ListView.storedRuleDialect-11533": "NOT MEASURED: never acquired the verify lock (two VERDICT queue-timeout exit 99); see blocked_on", "pnpm turbo run build --filter='@object-ui/plugin-grid^...' then the types and plugin-grid type-checks": "NOT MEASURED: same reason", "main's new grid/types tests named by `git diff --stat 6a86dd13a HEAD`": "gridRowDecorationMembers-8071, grid-list-view-conditional-formatting-11533, export-options-spec-parity, spec-expression-wire-slots-10946, unmirrored-declared-round6-6152: all inside the queued run above, NOT MEASURED" }, "pr_11531": "head still 6a86dd13a, mergeable_state still `dirty`, 0 check-runs, because the trunk was not pushed", "mcp_calls": "0 — no MCP GitHub tool was called", "api_writes": "1 — POST /repos/objectstack-ai/objectui/issues/11227/comments (this report, post-stamped.mjs). Not REST: 1 git push, da4c629f1 to claude/issue-11227-object-grid-17-6-keys (fast-forward). No trunk push, no PR body edit, no objectui#11068 file touched.", "deviations": [ "Pushed the merge commit to this card's own branch, not the trunk, so a decision for (a) or (b) can pick it up without redoing the merge. The original push order permitted pushing this branch in the merge case.", "The worktree is removed after this report (node_modules deleted; `git worktree remove` without --force). The merge commit lives at the branch tip da4c629f1." ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11227, "status": "done", "report": "ruling (a): the merge commit fast-forwarded onto the trunk", "branch": "claude/issue-11227-object-grid-17-6-keys", "pr": null, "session": "session_01YLg8XqWGJ785fwQ5v4pH37 — subagent run of the domain:ui seat 1 PM session; identity is the claim branch (claim 5965612851)", "trunk_before": "6a86dd13aea62f7056e2bb6b3b8fc1f2fc516cb3 (ls-remote, just before the push)", "pushed": "da4c629f1d02a7b3aca11cd86938568381fd0e72 onto claude/issue-11438-objectstack-17-6-0 as a fast-forward (git push printed 6a86dd13a..da4c629f1). It was pushed from a temporary detached worktree, removed right after; /home/user/objectui's working tree was not touched. No force.", "read_back": "gh api repos/objectstack-ai/objectui/branches/claude%2Fissue-11438-objectstack-17-6-0 --jq .commit.sha answers da4c629f1d02a7b3aca11cd86938568381fd0e72", "merge": "da4c629f1 = Merge origin/main (6f5719e1c) into the trunk. One hunk in packages/plugin-grid/src/index.tsx was resolved mechanically: main's `conditionalFormatting` line verbatim, then this slice's `emptyState` entry. Byte checks are in comment 5967232082.", "pr_11531": "head da4c629f1d02a7b3aca11cd86938568381fd0e72 (draft); mergeable_state `blocked`, no longer `dirty`; 44 check-runs started on da4c629f1 at the first read after the push: 38 in_progress, 2 queued, 1 success, 3 skipped. CI convergence is the seat's to read.", "local_reruns": "NOT MEASURED, superseded by objectui#11531's CI under ruling (a). The queued lock slot issue-11227-dev was left to expire without running: the lock has no release switch, and a parked place blocks nobody.", "mcp_calls": "0 — no MCP GitHub tool was called", "api_writes": "1 — POST /repos/objectstack-ai/objectui/issues/11227/comments (this report, post-stamped.mjs). Not REST: 1 git push (the trunk fast-forward). No PR body edit." }
Generated by Claude Code
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsTrunk CI reading after this card's slice (
domain:uiseat 1,session_01YLg8XqWGJ785fwQ5v4pH37, 2026-10-03T08:52Z). objectui#11531's CI on the trunk headda4c629f1(this card's slice6a86dd13a, plus themainmerge) completed: 45 check-runs, 35success, 3skipped, 7failure. The 7 failures are theTestaggregate and six shards.The failing assertions, read from each shard's annotations, are exactly the rows still owed. Nothing else is red:
- This card's family (row 1): only the two
registry-inputs-spec-parityrows reading['keyboardNavigation']. They wait for objectui#11068's reader (seat ruling5966896905). The fourobject-grid-properties-bag-11276rows are green. - Row 3 (objectui#11334,
domain:spec):dashboard-widget-metric-measure-door-8894,spec-object-refinements-7715andWidgetConfigPanel.measureDoor-8894. - Row 4 (objectui#11094, contract PASS, being pushed next):
ValueDataSource.astFilterVocabulary,.dollarFilterVocabulary,.filterLogicConformance-8513,filter-source-merge,FilterConditionField.operatorsandreadme-filter-operator-table. - Row 5 (objectui#11344, in progress):
actionKeys.pin.
This card stays open and
pm:dispatcheduntil objectui#11531 lands. It closes this card along with the other owner cards.
Generated by Claude Code
- This card's family (row 1): only the two
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsTrunk finding on this card's slice:
@object-ui/types'@objectstack/specfloor is too low. The director dispatches the floor commit onto the trunk · director seat, summon #32,session_016tKoy8NJa35Yih1FdzrVmn· 2026-10-03T12:07Z. ⛔ Not a claim: this seat's claim stands, and nothing else on this card moves.- The defect. Since
4ac6be76f,packages/types/src/objectql.tsimportsEmptyStatefrom@objectstack/spec/ui, so the published types of@object-ui/typesread that export.@object-ui/typesdeclares"@objectstack/spec": "^17.5.0"underdependencies.EmptyState/EmptyStateSchemais absent at@objectstack/spec@17.5.0:git grepoverpackages/spec/srcfinds 0 files there. It is present at@objectstack/spec@17.6.0, inui/view.zod.ts.- So a 17.5.0 resolution inside the declared range breaks the package.
- Found by objectui#10813's dev (report
5968977150, out-of-scope finding 1) and re-measured by this seat.
- Why it matters for landing 17.6.0. objectui#11531's PR CI does not run this gate:
spec-range-floors.ymlruns on schedule and onmainpushes to its own paths. Butpnpm changeset:publishrunscheck-spec-range-floors.mjsbeforechangeset publish, so the first objectui release after the bump would be refused.- objectui#11531's B3 gives a floor to the card that first imports such an export, which is this card.
- The contract review
5967010652judged the type faces and did not read the range.
- The fix, dispatched by this seat under A″ (
5968177777). This seat's sibling card objectui#11344 holds its only subagent slot.- Branch
claude/issue-11227-types-spec-floor-17-6, cut from the trunk tipbebd7ecdf. - Measure first: run
check:spec-floorsover a fully built trunk, and raise exactly the floors it names (expected:@object-ui/typesonly). - Run
pnpm installso only those importers'specifier:lines move, with the resolved17.6.0unchanged. - Add one changeset naming the raised floor and the 17.6.0 export it reads.
- It lands on the trunk as a fast-forward after this seat's ACCEPT. ⛔ No PR, ⛔ no force.
- Branch
- No conflict with objectui#11344's rework. That rework raises
coreandtypesto^17.6.0. Whichever lands second makes the same edit to thetypesline, so a merge of the two is clean.
Generated by Claude Code
- The defect. Since
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 (takeover of the p1 release slice, ruling A″)
Session:session_01FjqrwXPfSMkSfkKYDSRkN2
Account:os-zhuang(the seat's linked user asGET /useranswers it; the card's assignee after this act)
Branch:claude/issue-11227-object-grid-17-6-keys(continued, not re-cut; headda4c629f1)
Worktree: none in this container. The slice is already on the trunk, so no dev is dispatched by this seat.
Domain:domain:ui
Seat:domain:ui#1
File surface: unchanged from claim5965612851. This takeover adds no file. The director's@object-ui/typesfloor commit (5969006500, branchclaude/issue-11227-types-spec-floor-17-6) is the director's dispatch, not this claim's.
Container & model:S,mode:subagent,model: opus(default judgment tier;dispatch-gates --tier --repo objectstack-ai/objectuiprinted "no path-derived mandate" forpackages/plugin-grid/src/index.tsxandpackages/types/src/objectql.ts)
Clause-②: yes
Why yes: carried from5965612851.emptyStatewidens to I18nLabel on both faces andGRID_QUERY_INPUTSpublishes keys; the at-tier record is PASS5967010652.
Thread-read: 5969006500
Serial constraints cleared: the slice is on the trunk. Family 1'skeyboardNavigationis with objectui#11068 (the director's,5968139578). The floor commit is the director's (5969006500). Nothing else of this seat is in flight.Release: claim
5965612851,session_01YLg8XqWGJ785fwQ5v4pH37(os-elon-musk). Reason: that session is out of tokens. Provenance: the maintainer, in this session's chat (session_01FjqrwXPfSMkSfkKYDSRkN2), verbatim 「前任没有 token了,你继续。」. Destination: the same seat, this session.Handover record: the old branch's last pushed sha is
da4c629f1d02a7b3aca11cd86938568381fd0e72. That is the reviewed slice6a86dd13aplus a merge ofmain, on the trunk since 08:37Z. Status: partial ACCEPT5966896905, contract PASS5967010652, slice on the trunk. The director's floor commit is owed before objectui#11531 can release. What remains for this seat is to follow objectui#11531 to MERGED, verify by content onmain, and close this card.
Generated by Claude Code
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11227,
"status": "done",
"branch": "claude/issue-11227-types-spec-floor-17-6",
"pr": null,
"session": "session_016tKoy8NJa35Yih1FdzrVmn — subagent run under ruling A″; this is the parent director seat's harness-stamped id",
"premise_still_valid": true,
"summary": "Raised @object-ui/types' declared @objectstack/spec floor from ^17.5.0 to ^17.6.0 under dependencies. It is the one floor check:spec-floors names on a full build of the trunk tip bebd7ec. The slice is commit 6b8a0ed on bebd7ec. On the PM's order, the moved trunk tip 13f07dd (the row-5 booking: actionKeys.pin.test.ts and .changeset/11344-row5-booking-17-6.md only, disjoint from this surface) was merged in as merge commit 56fe66b (parents 6b8a0ed and 13f07dd; no rebase, no force). The reported head is 56fe66b, a fast-forward of 13f07dd (merge-base --is-ancestor 13f07dd HEAD answered exit 0), pushed to the card branch only, with no PR and no trunk push. Diff 13f07dd..56fe66b is exactly the three files below. Three files: packages/types/package.json (one line); pnpm-lock.yaml (only the packages/types importer's specifier: line moves, ^17.5.0 to ^17.6.0; the resolved version stays 17.6.0(ai@7.0.65(zod@4.6.5)) and no other resolution moves); and .changeset/11227-types-spec-floor-17-6.md, which declares '@object-ui/types': patch and names the raised floor and the two 17.6.0 exports the published artifacts read (EmptyState in the types, EmptyStateSchema in the zod mirror, both from @objectstack/spec/ui). Bump level: the dispatch names check-changeset-bump-policy, which exists in neither objectui nor objectstack. objectui's CI job titled Changeset Bump Policy runs scripts/check-changeset-no-major.mjs (no major; green). Within that, patch follows the repo's own floor-only precedents: .changeset/5793-spec-range-floors.md says outright 'The change is to the declared floor only, which is why it is scored patch rather than minor', and 6361-spec-floor-17-2-0, 9012-core-spec-floor and 10864-app-shell-spec-floor are all patch. The fixed group already carries '@object-ui/types': minor on the trunk (11227-object-grid-17-6-keys.md), so the level moves no release. @object-ui/core was not touched: the gate does not name it on this tree. The worktree /home/user/objectui-issue-11227-floor was removed after the first push, recreated from the branch for the merge, and removed again after the merged run (node_modules first, then git worktree remove, which succeeded without force both times); the pushed branch is the deliverable.",
"tests": "BASELINE on the unchanged trunk tip bebd7ec. Full build through os-verify-lock (pnpm build --concurrency=2, NODE_OPTIONS=--max-old-space-size=4096): 'Tasks: 43 successful, 43 total', VERDICT command-exit 0, held 301s. Then pnpm check:spec-floors returned EXIT=1, verbatim: '❌ 2 finding(s) across 1 published package(s):' / '@object-ui/types [floor-too-low] packages/types/dist/objectql.d.ts referencesEmptyStatefrom @objectstack/spec/ui, which @objectstack/spec@17.5.0 does not export' / '@object-ui/types [floor-too-low] packages/types/dist/zod/index.zod.js referencesEmptyStateSchemafrom @objectstack/spec/ui, which @objectstack/spec@17.5.0 does not export' / '@object-ui/types → "@objectstack/spec": "^17.6.0"'. Scope line: 'Inspected 21 of 39 published package(s) — 2388 artifact file(s), 488 of them carrying a @objectstack/spec reference ..., 435 (subpath, symbol) pair(s) judged.' The four extra no-artifact findings objectui#10813's dev saw on a partial build did NOT appear on the full build. AFTER, at head 6b8a0ed (every run below came after the final commit): pnpm check:spec-floors EXIT=0, '✅ Every consumer-facing @objectstack/spec floor carries the symbols its package's artifact references.', with the same scope line (21 of 39, 2388 files, 435 pairs), so the green does not come from a smaller scan. Lockfile Integrity Check: node scripts/check-lockfile-integrity.mjs --base-ref bebd7ec EXIT=0 'VERDICT clean — no @objectstack/* identity moved backward and no package gained a copy.' (1773 = 1773 resolutions); the same run against current main 6f5719e is EXIT=0 clean. Lockfile Dedupe Check: the bare node scripts/check-lockfile-dedupe.mjs (hard verdict, not --report-only) EXIT=0 'VERDICT deduped —pnpm dedupewould collapse nothing in this lockfile.' Lockfile diff: exactly one line, '- specifier: ^17.5.0' / '+ specifier: ^17.6.0' under importers packages/types dependencies @objectstack/spec; the version line is unchanged. Changeset gates: check-changeset-no-major EXIT=0 'No changeset declares a major bump'. check-changeset-presence --base bebd7ec EXIT=0 ('3 file(s) changed, 0 of them published source ..., 0 of them a manifest whose published contract moved ..., 1 changeset(s) added'): a dependencies range is not one of the eight contract fields, so presence owes nothing, and the changeset is the dispatch's Clause-② narrowing declaration. check-pending-changeset-literals EXIT=0. check-changeset-claims --base bebd7ec --head HEAD EXIT=0 (report-only): the self-contradiction reading is green on the new changeset. It flagged three existing changesets (5793, 6361, 7122) for naming pnpm-lock.yaml; each was read, their lockfile sentences describe their own bump moments, and this one-specifier change does not falsify them. check-changeset-overwrite --base bebd7ec EXIT=0 '1 changeset(s) added, 0 modified'. check-changeset-fixed EXIT=0. Manifest gates: check:phantom-deps EXIT=0, check:unused-deps EXIT=0, check:installed-pin-claims EXIT=0, check-control-bytes EXIT=0, plus a grep -naP control-byte self-scan of the three files with 0 hits. Tests that read live manifests, run under os-verify-lock: vitest run on scripts/tests/check-spec-range-floors.test.ts, doc-version-claims.test.ts, quick-reference-current-release-4143.test.ts and check-lockfile-integrity.test.ts: 'Test Files 4 passed (4)', 'Tests 88 passed (88)'. No source changed, so no package typecheck or unit suite is owed. The @object-ui/types dist was not rebuilt after the edit, because a dependency range is not an input to its build. The gate list was derived by hand from the package.json check:* scripts and from the workflows whose paths match package.json, pnpm-lock.yaml or .changeset (objectui has no dispatch-gates derivation script). NOT MEASURED locally, CI-owned: the full ci.yml, lint.yml, performance-budget.yml and live-e2e.yml runs. No ablation: none was asked, and the change adds no guard. MERGED HEAD 56fe66b (after merging 13f07dd): a fresh full build through os-verify-lock, 'Tasks: 43 successful, 43 total', VERDICT command-exit 0, held 311s. pnpm check:spec-floors EXIT=0 '✅ Every consumer-facing @objectstack/spec floor carries the symbols its package's artifact references.' with the same scope line (21 of 39, 2388 files, 488, 435 pairs). check-lockfile-integrity --base-ref 13f07dd EXIT=0 'VERDICT clean'. Bare check-lockfile-dedupe EXIT=0 'VERDICT deduped'. Lockfile diff 13f07dd..56fe66b: still only the one specifier line. Changeset gates against --base 13f07dd: no-major 0, presence 0, pending-changeset-literals 0, claims 0 (same three pre-existing pnpm-lock.yaml mentions, same reading), overwrite 0 '1 changeset(s) added, 0 modified', control-bytes 0.",
"mcp_calls": "0",
"api_writes": "1 — POST repos//issues/11227/comments (this report), through scripts/pm/post-stamped.mjs and the fleet-write relay. Also 3 git pushes to the card branch: the empty-branch write probe, then 6b8a0ed, then the merge 56fe66b. A git push is not a REST write. No labels, no claim, no PR.",
"open_questions": [],
"out_of_scope_findings": [
"class: b · reach: exception: release-text · evidence: the trunk's pending .changeset/11438-objectstack-17-6-bump.md says 'No declared range moves: every@objectstack/*range already admits 17.6.0, andcheck:spec-floorsfinds no floor that has to rise.' That was true when d73f74e wrote it (2026-10-02T23:57Z). It went false when 4ac6be7 (2026-10-03T05:13Z) made @object-ui/types read EmptyState, and once this slice lands a declared range does move. check:changeset-claims cannot see it, because the paragraph names no file in backticks, and the paragraph publishes verbatim into the CHANGELOG at the next release. Fix shape (prose only, front matter untouched): every other @objectstack/* range already admits 17.6.0, and @object-ui/types raises its floor to ^17.6.0 in objectui#11227's own changeset. It is outside this slice's file surface, so it was not touched · carrier: the director or trunk owner who fast-forwards this slice onto claude/issue-11438-objectstack-17-6-0 · dedupe words: 11438 changeset no declared range moves, spec floor 17.6.0, check:spec-floors claim"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsAddendum to the
os-dev-reporton this card (comment 5969159437): the trunk changeset's range sentence is corrected · objectui#11227 floor slice, subagent of the director seatsession_016tKoy8NJa35Yih1FdzrVmn. The director amended the file surface to carry the report's one out-of-scope finding.- New head
0507d6716, one commit on56fe66bbe, pushed toclaude/issue-11227-types-spec-floor-17-6only, with no force. It is still a fast-forward of the trunk tip13f07dd0f:merge-base --is-ancestoranswered exit 0. - The edit. It changes one prose sentence of
.changeset/11438-objectstack-17-6-bump.md. The front matter is byte-identical: the md5 of lines 1 to 5 is the same before and after. No other file changed.- Before: "No declared range moves: every
@objectstack/*range already admits 17.6.0, andcheck:spec-floorsfinds no floor that has to rise." - After: "One declared range moves:
@object-ui/typesraises its@objectstack/specfloor to^17.6.0in objectui#11227's own changeset, because its published types readEmptyState/EmptyStateSchema, which 17.5.0 does not export. Every other@objectstack/*range already admits 17.6.0 and stays as it was, andcheck:spec-floorsnames no other floor that has to rise." - One wording deviation from the fix shape. The old
^17.5.0range also admitted 17.6.0. It had to rise because it also admitted 17.5.0, which lacks the exports. "Every other range already admits 17.6.0" alone would imply that thetypesrange did not, so the sentence says the other ranges "stay as they were".
- Before: "No declared range moves: every
- Gates on
0507d6716, with--base 13f07dd0f:check-changeset-no-major: EXIT 0.check-changeset-presence: EXIT 0, "no changeset is owed".check-pending-changeset-literals: EXIT 0.check-changeset-claims: EXIT 0, report-only. The self-contradiction reading is green over both touched changesets. It again lists the same three older changesets (5793, 6361, 7122) for namingpnpm-lock.yaml, and the reading of them has not changed.check-changeset-overwrite: EXIT 0, report-only, "1 added, 1 modified". The modified file is this deliberate correction, and its declarations are identical at base and now (components, i18n and console, all patch). That is the gate's own case 2, "correcting a declaration on purpose".check-control-bytes: EXIT 0.
Generated by Claude Code
- New head
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsContract review
Served-tier:
CONTRACT_REVIEW_TIER
Head-sha:0507d67167a1eaf29ca0635fdecc6afe708fc209
Local-runs: noneThis is the contract review of objectui#11227's
@objectstack/specfloor slice, the director's floor commit from5969006500. Read on 2026-10-03.What was reviewed
- Branch
claude/issue-11227-types-spec-floor-17-6at0507d6716. The diff13f07dd0f..0507d6716has 3 commits (6b8a0ed96, the merge56fe66bbe, and0507d6716), 4 files, +21 / −3. 13f07dd0fis the trunk tip of objectui#11531 (claude/issue-11438-objectstack-17-6-0; the PR is open and draft at that head).merge-base --is-ancestor 13f07dd0f 0507d6716holds, so this head lands on the trunk as a fast-forward.- The trunk moved from the dev's cut point
bebd7ecdfto13f07dd0fby two files only:.changeset/11344-row5-booking-17-6.mdandactionKeys.pin.test.ts. Both are disjoint from this slice.
Inputs
- Card objectui#11227's comments from
5969006500on: the director's finding, the takeover claim5969154976, the dev report5969159437and its addendum5969180989. - The diff.
- objectstack's
@objectstack/spec@17.5.0and@objectstack/spec@17.6.0tags. - objectui#11531's PR body, the B3 section only.
There are no check-runs. This is a branch with no PR. It lands on objectui#11531's trunk by fast-forward, and that PR's CI then runs. So every gate result in the dev report and the addendum is the dev's local run, read as a claim and tested against the diff below.
- One gap matters:
spec-range-floors.ymlhas nopull_requesttrigger. It runs onworkflow_dispatch, a nightly schedule, andmainpushes to its own two paths. So objectui#11531's PR CI will not re-derive this floor. The first mechanical re-check is the nightly run aftermainmoves, orpnpm changeset:publish, which runscheck-spec-range-floors.mjsbeforechangeset publish.
Method. Nothing was built, run or re-run. The reads were
git diff,git show,git grepandgit log,gh api, and onegit merge-tree --write-treefor ③.2. That last one computes a merge in the object store; it checks nothing out and moves no ref.① Derived judgments
-
@object-ui/typesdoes read both exports from@objectstack/spec/uiin its published code, and^17.6.0is the correct floor.- TS types.
packages/types/src/objectql.tsimportsEmptyState as SpecEmptyState(line 168) inside theimport type { … } from '@objectstack/spec/ui'block (lines 131 to 182).ObjectGridSchema.emptyState?: SpecEmptyState(line 1442) puts it in the published d.ts. That file is reachable from the.entry. - Zod mirror.
packages/types/src/zod/objectql.zod.tsimportsEmptyStateSchema as SpecEmptyStateSchema(line 77) from@objectstack/spec/uiand uses it at line 712 (emptyState: stripImportedDefaults(SpecEmptyStateSchema)). It ships through the./zodexport (dist/zod/index.zod.js), which is the file the dev's gate run named. - Absent at 17.5.0.
git grep -wforEmptyStateorEmptyStateSchemaoverpackages/spec/srcat the 17.5.0 tag finds 0 hits. - Present at 17.6.0.
ui/view.zod.tsdefinesexport const EmptyStateSchema(line 1756) andexport type EmptyState(line 7200).ui/index.tsre-exports./view.zod, andpackage.jsonmaps./ui, so both are reachable from the subpath the package imports. - No lower publish carries them. objectstack's tags hold no 17.5.x patch between
@objectstack/spec@17.5.0and@objectstack/spec@17.6.0. Acrosspackages/spec/src, only 43 export names exist at 17.6.0 that did not exist at 17.5.0, andEmptyStateandEmptyStateSchemaare two of them. - These imports reached the trunk in
4ac6be76f, which is an ancestor of13f07dd0f. So the floor-too-low defect is real on the trunk tip, and this slice closes it.
- TS types.
-
No other published package on the trunk tip reads a 17.6.0-only export. This is a spot-check by reading, not a gate run.
- Which packages. 21 published packages declare
@objectstack/specin a consumer-facing field: 20 independenciesand@object-ui/plugin-listas a peer. That matches the dev's "Inspected 21 of 39 published package(s)". - Which symbols. I derived the 43 export names new at 17.6.0 by diffing the
exportdeclarations andexport { … }lists in non-testpackages/spec/srcbetween the two tags. - The search. I grepped those names, whole word, over non-test
packages/*/srcandapps/*/srcat the head. 11 files hit. Outsidetypes, all 9 are false positives:Picklistas UI text in app-shell, plugin-designer and plugin-detail;EmptyStateSchemainside comments inplugin-grid/src/index.tsxandplugin-list/src/ListView.tsx;- in
components/src/custom/view-states.tsx, a local re-export,DataEmptyState as EmptyState.
- No spec import among them. None of the 9 imports anything from
@objectstack/spec.4ac6be76fadded no@objectstack/specimport to plugin-grid's or plugin-list's published source. - Subpath changes. The subpath barrels changed in
data/index.ts(filter-lowering, picklist, inline-grid-columns), in the root index, and in a new./migrationssubpath. Theuibarrel did not change. The one@objectstack/spec/migrationsimport is inplugin-dashboard/src/__tests__/DatasetWidget.unrenderedMeasures-8894.test.tsx, a test file. That agrees with objectui#11531's B3. - Result. This agrees with the dev's full-build
check:spec-floors, read as a claim: it named@object-ui/typesonly, with two findings, and was green after the edit with the same scope line. - Boundary of the spot-check. It reads export names only. Like the gate, it does not see a 17.6.0-only member of an export that already existed at 17.5.0, and it does not track a symbol that moved between subpaths. That limit belongs to the instrument, not to this slice. Nothing was widened.
- Which packages. 21 published packages declare
-
pnpm-lock.yaml: exactly the one importerspecifier:line moves, and the resolved version does not.- The lockfile diff is +1 / −1, at line 2861 under
importers:→packages/types→dependencies→'@objectstack/spec':specifier: ^17.5.0→specifier: ^17.6.0. - The
version: 17.6.0(ai@7.0.65(zod@4.6.5))line below it is unchanged context. No package or snapshot key moves. - This is consistent with the dev's integrity claim ("VERDICT clean", 1773 = 1773 resolutions) and dedupe claim ("VERDICT deduped"). Nothing a consumer installs today differs.
- The lockfile diff is +1 / −1, at line 2861 under
-
The manifest edit matches.
packages/types/package.jsonhas one line:dependencies["@objectstack/spec"]goes from^17.5.0to^17.6.0.zodand everything else are untouched. -
The prose correction to
.changeset/11438-objectstack-17-6-bump.mdis true, and its front matter is unchanged.- Front matter. Lines 1 to 5 hash identically at
13f07dd0fand0507d6716(md5898072789cf44e49f078820287e55aab). They still read components, i18n and console, allpatch. The numstat is +1 / −1, on line 7 only. - The old sentence was false on the trunk tip. "No declared range moves …
check:spec-floorsfinds no floor that has to rise" stopped being true once4ac6be76flanded (item 1). It would have published verbatim into the CHANGELOG. - The new sentence checks out, clause by clause:
- "One declared range moves:
@object-ui/typesraises its@objectstack/specfloor to^17.6.0" is true at this head (item 4). - "in objectui#11227's own changeset" is true:
.changeset/11227-types-spec-floor-17-6.mddeclares it. - "which 17.5.0 does not export" is true (item 1).
- "Every other
@objectstack/*range already admits 17.6.0 and stays as it was": every other range in everypackage.jsonat the head is a caret 17.x floor at or below 17.5.0, so it admits 17.6.0. That is 38 ranges: 22 at^17.0.0, 2 at^17.1.0, 2 at^17.3.0, 1 at^17.4.0and 11 at^17.5.0. The diff moves no other manifest. - "
check:spec-floorsnames no other floor" agrees with item 2.
- "One declared range moves:
- Precision note, not a ground. The sentence says "its published types read
EmptyState/EmptyStateSchema". Strictly,EmptyStateSchemais read by the published zod mirror. The new 11227 changeset states this exactly ("its published zod mirror readsEmptyStateSchema").
- Front matter. Lines 1 to 5 hash identically at
-
The new
.changeset/11227-types-spec-floor-17-6.mdis true sentence by sentence.- The member typed by reference is line 1442.
- The mirror is line 712.
- "Neither export exists in … 17.5.0" is item 1.
- "the lockfile already resolves … 17.6.0 for this specifier" is item 3.
pnpm check:spec-floorsexists asnode scripts/check-spec-range-floors.mjsin the rootpackage.json.- "the range now refuses
@objectstack/spec17.5.0" is to be read as "no longer admits". It is adependenciesrange, so a consumer holding 17.5.0 gets a nested 17.6.0 fortypes, not an install failure. The sentence is not false.
-
The commits are clean.
- The merge
56fe66bbehas parents6b8a0ed96and13f07dd0f, and6b8a0ed96still sits onbebd7ecdf. So the trunk was merged in, not rebased onto. - The trailers carry
Claude-SessionandCo-authored-by: Claudeand no model name. - The dev's changeset-gate claims match the diff: overwrite "1 added, 1 modified", and presence "no changeset is owed", because
dependenciesis not one of the eight contract fields.
- The merge
② Semver level
'@object-ui/types': patchis allowed.-
AGENTS.md's no-major rule (lines 268 to 273): "changeset 里不要声明
major", and objectui's own breaking changes are markedminor. Apatchdeclares no major.check-changeset-no-majorenforces this mechanically, and the dev reports EXIT 0 on both heads. -
Precedent. Every floor-only raise pending on the trunk tip is
patch:5793-spec-range-floors.md(plugin-detail): "The change is to the declared floor only, which is why it is scoredpatchrather thanminor";6361-spec-floor-17-2-0.md(core, data-objectstack);9012-core-spec-floor.md(core);10864-app-shell-spec-floor.md(app-shell).
5793 has exactly this shape: a published reference to an export the declared floor lacks, so the old range was "a claim the package could not honour", with the lockfile unmoved.
-
No released version moves with the level.
@object-ui/typesis in thefixedgroup of.changeset/config.json, and the trunk already carries'@object-ui/types': minorin.changeset/11227-object-grid-17-6-keys.md. The group releases atminoreither way.
-
- The
Clause-②: yes (narrowing)arm is right.yes. A consumer-facing install range on a published package narrows, and that is a contract move on its own. It is the same reading the objectui#11344 delta record5969179064gave its two floor raises.(narrowing)is the correct arm of the closed pair. The set of spec versionstypesadmits shrinks from 17.5.0-and-up to 17.6.0-and-up, and nothing widens.- Why
patchstill fits. objectstack's AGENTS.md tiesyesto at leastminorand calls(narrowing)BREAKING. That is objectstack's changeset rule. objectui's AGENTS.md has no Clause-② level mapping. objectui has no ADR-0087 registration gate, and its gates read no arm. On the merits, the narrowing removes no working configuration: a 17.5.0 resolution was already broken, because the d.ts names an export 17.5.0 lacks. Sopatchas a bug fix to a dishonest range is consistent. Even under objectstack's coupling, the fixed group already lands atminor, so the difference would be in the label only.
③ Boundary flags
-
The dev's wording deviation in the 11438 sentence is accepted.
- The suggested fix shape was "every other
@objectstack/*range already admits 17.6.0". On its own, that implies thetypesrange did not admit 17.6.0, which is false:^17.5.0admits it. The range had to rise because it also admitted 17.5.0. - The committed text pairs "One declared range moves … because … 17.5.0 does not export" with "Every other … range … stays as it was". So the contrast is moved versus unmoved, not admits versus does not admit. That is more accurate than the fix shape.
- A trivial note on the addendum. Its paraphrase says the other ranges "stay as they were". The committed text, which the addendum's own "After" quote reproduces verbatim, says "stays as it was". The meaning is the same.
- The suggested fix shape was "every other
-
objectui#11344 against this slice: a clean merge, with an identical edit.
- objectui#11344's head is
89b21dafd(merge-basec9121f92fwith this head). It editspackages/types/package.jsonto a blob byte-identical to this head's (cd87cc801on both sides). Its lockfile hunk at thepackages/typesimporter is the same one-linespecifier:move. - Its other floor edits are disjoint:
packages/core/package.jsonand thepackages/coreimporter around lockfile line 1193. - It touches neither changeset this slice touches.
git merge-tree --write-tree 0507d6716 89b21dafdexits 0 with no conflicted paths. The merged tree keeps thecd87cc801manifest andspecifier: ^17.6.0on both importers.- The same holds against
main. The property holds against any base where thetypesline reads^17.5.0, andmain(6f5719e1c) does. So the landing order, objectui#11531 first and then objectui#11344, merges cleanly whichever way objectui#11531 is merged. - One semantic note for objectui#11344's landing PR, not a ground here. Once objectui#11344 lands,
@object-ui/core's floor also moves to^17.6.0, through objectui#11344's own changeset and for its own member (outcomeMessages). The 11438 sentence's "Every other … range … stays as it was" describes the 17.6.0 bump itself, and stays true as a statement about that bump. But if both publish in one release, a CHANGELOG reader sees the two side by side. If that PR wants the release text airtight, scoping the 11438 sentence to "the bump itself" is that PR's call.
- objectui#11344's head is
-
Gate-family claims and the release path.
- The dev's local claims are consistent with the diff:
check:spec-floorsred to green with an unchanged scope line, lockfile integrity and dedupe, and the changeset gates. - None of them is a check-run. objectui#11531's CI is the first real run on this head, and it does not include the floor scan (see above). That is not a defect of this slice, but the floor claim remains the dev's until the nightly or publish-path run.
- The dev's local claims are consistent with the diff:
Implemented-by:
claude/issue-11227-types-spec-floor-17-6
Reviewed-by:session_016tKoy8NJa35Yih1FdzrVmnVERDICT: PASS
- Branch
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actions✅ ACCEPT: the
@object-ui/typesfloor slice at branch head0507d6716(a fast-forward of the trunk tip13f07dd0f); the push onto the trunk is ordered in this act · 2026-10-03T12:39ZDirector seat, summon #32,
session_016tKoy8NJa35Yih1FdzrVmn, the dispatcher of this slice (5969006500). ⛔ Not a claim:domain:ui#1's claim5969154976holds this card, and its own claim names this floor commit as the director's. Reviewed against the pushed commits.- The diff
13f07dd0f..0507d6716: 4 files, +21 / −3.packages/types/package.json:@objectstack/specgoes^17.5.0→^17.6.0.- One lockfile
specifier:line moves. The resolved17.6.0does not. - A new
patchchangeset. - The trunk changeset's range sentence is corrected, with its front matter byte-identical.
- Measured by the dev, consistent with the diff:
- a full-build
check:spec-floorsnamed exactly@object-ui/types(EmptyState,EmptyStateSchema), and was green after the edit with the same scope line; - the lockfile integrity and dedupe checks are clean;
- the changeset gates pass.
- a full-build
- The at-tier contract review is PASS on this head (record on this card).
- Push: a fast-forward of the trunk
claude/issue-11438-objectstack-17-6-0from13f07dd0fto0507d6716; ⛔ no force. objectui#11531's PR CI does not run the floor scan, so the floor reading stays the dev's until the nightly run or the publish path runs it.
Generated by Claude Code
- The diff
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsLanded and verified by content: closed
completedby objectui#11531's merge ·domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-03T13:28Z.-
The merge: PR objectui#11531 →
6158e4c93onmain, at 2026-10-03T13:14Z. Its closing lines name this card (Fixes #11227). -
Content check (objectui
origin/main6158e4c93against its first parent6f5719e1c):mainparent GRID_QUERY_INPUTSlists'emptyState'(plugin-grid/src/index.tsx)1 0 EmptyStatenamed intypes/src/objectql.ts5 0 resolveInlineI18nLabelinObjectGrid.tsx10 8 @object-ui/types@objectstack/specrange^17.6.0^17.5.0The last row is the director's floor commit (ACCEPT
5969251316, contract PASS5969247701). -
Trail: the slice
6a86dd13a(partial ACCEPT5966896905, contract PASS5967010652). Family 1'skeyboardNavigationwent with objectui#11068. -
pm:dispatchedis removed in the same act.domain:ui,area:records, the type and the priority stay.
Generated by Claude Code
-
- added a commit that references this issue
on Oct 7, 2026
Blocked-by: objectstack-ai/objectstack#20694
The objectui half of objectstack-ai/objectstack#20694, filed by the
domain:specexecution seat 1 (objectstack-ai/objectstack#6017,session_018fxqvRJW12TaHC7DUQ89Y6) at that card's ACCEPT. ⛔ Not a claim.Two sources:
ComponentPropsMap['object-grid'](ObjectGridPropsSchema) declares neitherdescriptionnoremptyState, which objectui'sObjectGridreads once objectui#11130 lands objectstack#20694 comment5897622232): "After the release is installable in objectui, its follow-up lists all three inGRID_QUERY_INPUTS(the parity gate's reverse direction)."5914228301). The spec keeps oneemptyStateshape with I18nLabel members, and the renderers catch up.What changes upstream
PR objectstack-ai/objectstack#20882 widens
ComponentPropsMap['object-grid'](ObjectGridPropsSchema):description:I18nLabelSchema.optional().emptyState: the list view's own shape, held by reference as the newly exportedEmptyStateSchema(strict{ title?, message?, icon? };titleandmessageare I18nLabel).keyboardNavigation:z.boolean().optional(), with the describe prefixed[EXPERIMENTAL — not enforced]because nothing reads it.The row still refuses every key it does not declare.
What objectui carries today (at objectstack's pin
db11afd4967c; re-measure at claim)GRID_QUERY_INPUTSlists none of the three (packages/plugin-grid/src/index.tsx:237).packages/plugin-grid/README.md:227says why: the list "may only declare keys the upstream protocol'sobject-gridrow accepts, and that row declares neither today". So an authoredemptyStateis reported asunknown-prop. Once the release is installable,descriptionandemptyStatejoin the list.keyboardNavigationhas no reader at the pin. Its reader is objectui#11068's BUILD. The same README (:163-166) says the list is "what the renderer reads", and the list feeds the designer panel. So the seat's reading is thatkeyboardNavigationjoins in the change that lands its reader, or after it, and not before. This card's claimant or objectui triage confirms that.stringwhere the spec says I18nLabel. Two places:ObjectGridSchema.emptyState(packages/types/src/objectql.ts:1282) and its zod twin (packages/types/src/zod/objectql.zod.ts:392-399) declaretitleandmessageas plain strings. The twin follows the spec, not the other way round (triage5897622232: "⛔ Not a second shape"), so both widen to I18nLabel.objectql.ts:2725) carries the same string members. It widens in the same change as theListViewrenderer fix below.emptyState.titleor.message:ObjectGrid.tsx:6241-6242passes both toDataEmptyStateunresolved. React throws on an object child ("Objects are not valid as a React child", measured by the objectstack dev on React 19.2.8 withrenderToString).plugin-list/src/ListView.tsx:5112and:5114guard withtypeof === 'string', so a map silently falls back to the default text.descriptionalready uses (ObjectGrid.tsx:5677):resolveInlineI18nLabel(value, displayLocale), applied to both members at both sites.emptyStatein objectstack'sexamples/**andpackages/platform-objectsis a plain string. Until this lands, the objectstack changeset tells authors to write strings onobject-grid.Unlock
The installable
@objectstack/specthat objectui's lockfile resolves exportsEmptyStateSchema, andObjectGridPropsSchemaaccepts{ emptyState: { title: { en: 'x' } } }. A cross-repo unlock is the install face, not the upstream merge.Dedupe: two
search_issuesqueries on objectstack-ai/objectui:The nearest is objectui#11068 (open). It holds
keyboardNavigation's BUILD and the retirements, and none of this card's three items. #11148 (a Studio label map shown as "[object Object]") and #3426 (ListView and ObjectGrid titles bypassing i18n) are closed and name other sites.