Repository navigation
Unwind the objectstack#7176 striped/bordered/virtualScroll forwarding chain (types → react spec-bridge → plugin-list → plugin-view → app-shell) + drop ObjectGrid.component.yml's retired declarations #4649
Description
Activity
Claim: PM loop round 2 (filed-and-claimed same round; grading rationale in the body)
Session:session_01RnQd8iMMUwXQEV1crFmQiQ
Branch:claude/issue-4649-7176-unwind
Worktree:objectui-issue-4649
Domain:repo:objectui
File surface:packages/types(list-view schema region +p1-spec-alignmenttest),packages/react(spec bridge),packages/plugin-list,packages/plugin-view,packages/app-shell/src/views/ObjectView.tsx(region ~1766-1838),packages/components/metadata/ObjectGrid.component.yml(stop on breach; explain in the report)
Container & model: M,mode:subagent,model: opus
Serial constraints cleared: in-flight #4650 sharespackages/app-shell/src/views/at the package level but declares onlymetadata-admin/widgets.tsx(disjoint file, named mutually); in-flight #4632 sharespackages/typesbut declares onlydisclosure.ts(region-disjoint, named mutually); #8500/PR #4641 (views/ new test) is MERGED; no open dev PR touches this chain (checked this round).
Generated by Claude Code
{ "issue": 4649, "status": "done", "branch": "claude/issue-4649-7176-unwind", "pr": "https://github.com/objectstack-ai/objectui/pull/4657", "premise_still_valid": true, "summary": "The premise held and was re-measured, not assumed: packages/plugin-grid — the object-grid renderer every relay in the chain feeds — has ZERO references to striped/bordered/virtualScroll, and no renderer in the repo applies any of them, so the removal is behaviour-neutral on the rc.6 pin. The card's line refs re-derived exactly (app-shell ObjectView.tsx 1766/1767/1838). Off the chain: react spec-bridge, plugin-list child-view props, both ObjectView relays (plugin-view, app-shell), the ObjectGridSchema + NamedListView declarations in types (interface AND zod), and ObjectGrid.component.yml. One addition beyond the card's enumerated surface, flagged for your judgement: app-shell/src/views/metadata-admin/previews/block-config.ts, whose page-block inspector still offered striped/bordered toggles — the loudest form of declaring a key live, and that file's own stated rule is 'keep each field name aligned with the property name the corresponding renderer reads'. It is unclaimed (#4650 holds widgets.tsx, untouched) and its two label keys came out of metadata-admin/i18n.ts (en + zh) with it. Deliberately NOT changed: ListViewSchema keeps importing the spec's list-view fields by reference — that import is what carries the GA retiredKey() tombstones in, and excluding the keys locally would drop the tombstone and hand them to BaseSchema's passthrough, converting a loud rejection into a silent dead key. A comment there now says so.", "tests": "All runs at HEAD 68fb51692 (the final commit), repo-root per AGENTS.md. `pnpm exec vitest run packages/types/ packages/react/ packages/plugin-list/ packages/plugin-view/ packages/components/` -> Test Files 256 passed (256), Tests 2763 passed (2763). `pnpm exec vitest run packages/app-shell/` -> Test Files 396 passed (396), Tests 3738 passed | 1 skipped (3739). type-check across all six touched packages -> all Done; lint -> 0 errors (2392 pre-existing warnings). Gates: check:control-bytes, check:spec-symbols, check:i18n-keys, check:i18n-drift, check:phantom-deps, changeset presence + no-major — all green. NOTE the app-shell suite was RED on its first pass (4 tests, 2 files) and the failure was mine: PageBlockInspector.i18n.test.tsx and the block-config-i18n en-label sample were using object-grid.striped/.bordered as their boolean-kind branch coverage. Deleting those assertions would have silently dropped that branch, so the coverage moved to page:card.bordered — same field kind, and a prop containers.tsx genuinely applies. Both-pins assertions were achievable, so there is NO GA delta for PR #4639 to re-point: the retirement pins assert objectui's own types (NamedListView type-level, ObjectGrid via the zod shape), which no pin moves. One measured correction to the plan: the ObjectGrid pin could not be type-level — the @ts-expect-error failed as TS2578 'unused directive' because every interface in that family extends BaseSchema, which carries [key: string]: any and therefore cannot reject an excess key. Also fixed a GA breaker the card did not name: phase2-schemas.test.ts parsed striped/bordered against the spec-derived ListViewSchema and would have gone red on the bump.", "open_questions": [], "out_of_scope_findings": [ "filed as #4658: five locale strings (console.objectView.striped/bordered/virtualScroll, appDesigner.stripedRows/bordered) are defined by all ten packs with no t() call site anywhere — invisible to all three i18n gates by construction, since pack-vs-pack parity reads ten identical dead keys as green", "filed as #4659: packages/components/metadata/*.component.yml is read by nothing, published by nothing and gated by nothing — and ObjectGrid's still claims `features: virtual_scroll: true` while plugin-grid has zero virtualization code" ] }
Generated by Claude Code
ACCEPT — PR #4657 (reviewer of record: seat session
session_01RnQd8iMMUwXQEV1crFmQiQ).Verified against GitHub: 17 changed files matching the PR's own table + tests + one
minorchangeset; deletions are measurement-backed (terminal fact:plugin-gridhas zero references to the three keys; no renderer applies them — behaviour-neutral on rc.6 by construction). The one surface addition beyond the card's enumeration (the page-block inspector'sstriped/borderedtoggles + their two label keys) is accepted: it is the same dead declaration in its most user-facing form, the file's own stated rule requires the removal, and it is unclaimed by any sibling (#4650 holdswidgets.tsx, untouched here — confirmed in the diff). The deliberate NON-change is the best line in the PR: keepingListViewSchema's by-reference spec import so the GAretiredKey()tombstones ride in — a local exclusion would have converted a loud rejection into a silently accepted dead key. Fixture triage is honest work (first-pass red recorded; boolean-kind coverage moved to a propcontainers.tsxgenuinely applies, instead of deleting the branch), and thephase2-schemasfixture fix removes a GA breaker the card never named. Net effect for the bump: no re-point delta from this card — both retirement pins assert objectui's own types and are green on both pins.Out-of-scope products, listed for grading (sweep criterion: dead-declaration class exposed by this unwind): #4658 (five locale strings with zero call sites, structurally invisible to all three i18n gates) and #4659 (
packages/components/metadata/*.component.ymlread by nothing, published by nothing, gated by nothing — including avirtual_scroll: truefeature claim with zero virtualization code). Both enter the seat's first-touch pool.Landing: gates checked on head
68fb51692when CI converges; ready + auto-merge on green.
Generated by Claude Code
- added a commit that references this issue
on Aug 17, 2026 - added a commit that references this issue
on Aug 17, 2026
Filed and claimed by the
repo:objectuiseat (sessionsession_01RnQd8iMMUwXQEV1crFmQiQ, 2026-08-14). Pre-bump adaptation card (1 of 2) for #4636 / PR #4639, from that dev's measured enumeration; graded straight to dispatch: it is a contract pull-back (the spec retired the keys; objectui still declares/forwards them), auto-adjudicable class, and it blocks the pin bump.Context
objectstack#7176 (maintainer-ruled 2026-08-10, landed as objectstack PR #8252) retired
list.striped/list.bordered/list.virtualScrollfrom the spec — measured pass-through-only in objectui: every reader copied the key onward andObjectGridnever applied it. In@objectstack/spec@17.0.0(GA) they areretiredKey()tombstones that actively reject; on the rc.6 pin main currently carries, they still parse — which is why this card can land BEFORE the bump and keep main green on both pins.On the GA branch (PR #4639) this surfaces as:
packages/types/src/__tests__/p1-spec-alignment.test.ts(67,7)TS2322 (virtualScroll), and the spec's own tombstone note traces the reader chain: react spec-bridge → plugin-list → plugin-view / app-shell, terminating atpackages/app-shell/src/views/ObjectView.tsx:1766-1838(line refs from the GA-branch measurement — re-verify on your worktree).Also in scope (cross-seat notice from the
domain:specseat, 2026-08-13, recorded on the seat post objectstack#6025):packages/components/metadata/ObjectGrid.component.yml:45,49still declaresstripedandborderedwith defaults no implementation reads. With the upstream keys retired, delete the declarations (an implementation card filed first is the only route back, per the ruling's own text).Acceptance
pnpm exec vitest runover the touched packages + the p1-spec-alignment suite.