Skip to content

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

@yinlianghui

Filed and claimed by the repo:objectui seat (session session_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.virtualScroll from the spec — measured pass-through-only in objectui: every reader copied the key onward and ObjectGrid never applied it. In @objectstack/spec@17.0.0 (GA) they are retiredKey() 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 at packages/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:spec seat, 2026-08-13, recorded on the seat post objectstack#6025): packages/components/metadata/ObjectGrid.component.yml:45,49 still declares striped and bordered with 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

  • No objectui source declares, forwards, types, or tests the three retired keys as live surface; genuinely-invalid-shape refusal assertions (if any pin the tombstone behavior) are kept verbatim.
  • Green on current main (rc.6 pin). State in the PR body which files came off the chain and confirm pnpm exec vitest run over the touched packages + the p1-spec-alignment suite.
  • This is a user-visible authoring-surface removal in published packages ⇒ changeset required.

Activity

  1. self-assigned this
    on Aug 14, 2026
  2. added theissue type on Aug 14, 2026
  3. yinlianghui commented on Aug 14, 2026

    @yinlianghui
    CollaboratorAuthor

    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-alignment test), 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 shares packages/app-shell/src/views/ at the package level but declares only metadata-admin/widgets.tsx (disjoint file, named mutually); in-flight #4632 shares packages/types but declares only disclosure.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

  4. yinlianghui commented on Aug 14, 2026

    @yinlianghui
    CollaboratorAuthor
    {
      "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

  5. yinlianghui commented on Aug 14, 2026

    @yinlianghui
    CollaboratorAuthor

    ACCEPT — PR #4657 (reviewer of record: seat session session_01RnQd8iMMUwXQEV1crFmQiQ).

    Verified against GitHub: 17 changed files matching the PR's own table + tests + one minor changeset; deletions are measurement-backed (terminal fact: plugin-grid has 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's striped/bordered toggles + 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 holds widgets.tsx, untouched here — confirmed in the diff). The deliberate NON-change is the best line in the PR: keeping ListViewSchema's by-reference spec import so the GA retiredKey() 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 prop containers.tsx genuinely applies, instead of deleting the branch), and the phase2-schemas fixture 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.yml read by nothing, published by nothing, gated by nothing — including a virtual_scroll: true feature claim with zero virtualization code). Both enter the seat's first-touch pool.

    Landing: gates checked on head 68fb51692 when CI converges; ready + auto-merge on green.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions