Uh oh!
There was an error while loading. Please reload this page.
refactor(spec)!: retire pass-through-only list-view keys striped/bordered/virtualScroll (ADR-0049, #7176) - #8252
Conversation
…ered/virtualScroll (ADR-0049, #7176) Maintainer ruling 2026-08-10: every measured reader copies the key forward and ObjectGrid, where the chains end, never applies any of the three — copy-without-apply is dead in effect. retiredKey() tombstones on ListViewSchema (radiating into ObjectListViewSchema), ADR-0087 D2 conversion view-list-passthrough-keys-removed + D3 chain step + six RETIRED_KEYS_BY_MAJOR[17] entries, ledger rows flipped to dead with the retirement note, form inputs pruned, docs updated, changeset with FROM->TO. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0123k4cam2jEAkPmbJeoaY3r
… test Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0123k4cam2jEAkPmbJeoaY3r
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 2 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
…ire-list-passthrough-keys
Uh oh!
There was an error while loading. Please reload this page.
…view-level retirement PR #8252 landed while this branch was open, retiring the pass-through-only list-view virtualScroll under ADR-0049. The replacement section pointed at that key as the real switch; it is no longer authorable (zero entries across the whole authorable surface). Re-pointed at the view's pagination block, matching the wording widget-contract.mdx now carries. Refs #8251
Fixes#7176
Retires
list.striped/list.bordered/list.virtualScrollfrom the view.json list face under ADR-0049 enforce-or-remove, executing the maintainer ruling of 2026-08-10 (issue comment 5236139723): every measured reader copies the key forward and none applies it — copy-without-apply is dead in effect. Per the ruling, if objectui wants any of the three as real behavior, that is an implementation card filed first, and the key stays retired pending it.Note for the PM:#7132 closes as absorbed when this lands (its three remaining citation-repair rows are these keys; the ledger rows now carry the retirement verdict).
Route:
retiredKey()tombstones — the playbook fork, justifiedAll three are parseable authorable keys on a live schema face today, so plain deletion would trade one silent no-op for another.
ListViewSchemaalready carries the #3896responsive/performancetombstones, soretiredKey()on this exact face is the proven house route: the key stays declared (the strict container does not report it as unknown),tsctypes itnever, and the parse rejects any authored value with the prescription itself — why the key never did anything, the one-line fix, and the pinnedos migrate meta --from 16sentence.The kit
packages/spec/src/ui/view.zod.ts): three tombstones beside thePOST /data/sharing/rules绕过SharingRuleSchema:criteria缺失或拼错静默变成"共享该对象全部记录",与 ADR-0049 "never seeded as a permissive match-all" 直接冲突 #3896 pair, with the in-schema comment naming the measured forwarding chains. The tombstones radiate intoObjectListViewSchema(an.omit().extend()copy), so the authorable surface moves by exactly six[RETIRED]marks —ui/ListView:*andui/ObjectListView:*— each registered per key inRETIRED_KEYS_BY_MAJOR[17]via six entry files undermigrations/entries/retired-keys/.view-list-passthrough-keys-removed(toMajor: 17,retiredFromLoadPath: true) strips the keys fromlistand namedlistViewsslots via the sharedstripKeyswalker (idempotent by construction); wired intoMIGRATIONS_BY_MAJOR[17].conversionIdswith the step rationale extended. Fixture is disjoint from every other entry's keys and passes the live-window load path untouched.liveness/view.json): the three rows fliplive→deadwith the house REMOVED note — thelivegrade was the card's finding (pass-through citations); the rows stay becauseretiredKeykeeps the keys in the walked shape (the rls.priority precedent).state-counts.mdregenerated.view.form.tsloses thestriped/borderedinputs (the UI half of false compliance);virtualScrollnever had one. i18n bundles regenerated in merge mode (4 metadata-forms files).packages/lint/src/lint-liveness-properties.test.tsnow pins the non-warn for all three (the strict parse owns them).view.test.ts): per-key negative asserting the prescription substance, a shared pin on#7176+ the pinned migrate sentence, byte-identical acceptance of the live siblings (resizable/rowHeight/selection/paginationcompared withtoStrictEqual), a no-resurrection positive, and anObjectListViewSchemarejection pin.content/docs/protocol/objectui/widget-contract.mdx's Performance section stops pointing authors atview.virtualScroll— that pointer was installed this same unreleased major (thewidget-contract-performanceconfigchangeset) and aimed at a switch nothing read.content/docs/references/ui/view.mdxregenerated with the[REMOVED]rows.content/docs/releases/untouched.@objectstack/specmajor with the FROM → TO table and the retirement kit; carries the markeradr-0087: registered view-list-passthrough-keys-removed.Census (in-repo authored usage)
Near-zero, as the card predicted (no appliers measured, and almost no authors): zero authored usages in
examples/**,apps/**, platform fixtures and skills. The only spellings found were fourview.test.tsfixtures — re-judged individually per the triage discipline: the "grid features" fixture pinned partly the deleted limb (re-shaped onto surviving keysresizable/compactToolbar); three real-world fixtures merely spelled the keys (re-spelled without them).packages/lint/src/validate-react-page-props.test.ts'sstriped={true}fixture is untouched on purpose — it tests a NON-contract React prop with no near match, and the keys were never in the react-blocks contract (verified: zero hits inreact-blocks.contract.jsonbefore and after).Different surfaces deliberately not touched:
dashboard.widgets[].options.striped(an open renderer bag, its own contract),ui/PageCardProps:bordered(live page-card key), DetailSection'svirtualScrollcomponent prop (objectui-internalVirtualScrollOptions).Verification (all local, exit codes captured)
@objectstack/specsuite: 387 files / 10203 tests — one first-run failure was this PR's own new pin test (regex casing vs the prescription), fixed;view.test.tsre-run 245/245,pnpm typecheckclean.check:generated13/13 up to date; retirement loop all PASS:check:liveness,check:empty-state,check:authorable-surface,check:docs,check:api-surface,check:spec-changes,check:upgrade-guide,check:skill-refs,check:skill-docs,check:skill-examples,check:migration-registry; the seven not-run source audits run as one group:check:template-manifests,check:variant-docs,check:exported-any,check:dual-source-exports,check:scripts-typecheckall PASS.check:adr-anchors,check:changeset-gate-self-tests,check:cross-package-test-inputs,check:docs-audit-scope,check:i18n,check:merge-driver,check:release-body,check:spec-parsed-alias,check:nul-bytes,check:adr-0087-registrationall PASS;check:doc-formula-expressionslives inpackages/lint(not the repo root the dispatch assumed) and PASSES there.@objectstack/spec): metadata-protocol 75 files / 1100 tests PASS; rest 105 files / 1756 tests PASS; dogfood 103 files / 716 passed, 3 skipped; CLImigrate-meta.e2e12/12 (chain replay + idempotence); examples validate ×3 (app-crm / app-showcase / app-todo) all PASS;@objectstack/linttests + typecheck PASS.striped: trueto aListView-typed literal against the rebuiltdist/*.d.tsfailstsc(Type 'true' is not assignable to type 'undefined'); the sibling control probe withresizable: truecompiles clean against the same dist — proving the narrowing is in the rebuilt declarations, not a cached copy. The parse-channel red is pinned by the new tests.Ratchet visibility (route-appropriate readings)
authorable-surface/ui.jsonmoves by exactly the six[RETIRED]marks;api-surface/is byte-identical (key-level narrowing is invisible to a reference-printing snapshot — the expected reading for the tombstone route, no orphaned value schema exists here since all three keys are bare booleans);json-schema.manifest/unchanged (no def added or removed). One PM mechanism assumption partially falsified:gen:schemano longer rewritesauthorable-surface.base.jsonas a side effect — since #5358 it reports anchor/baseline divergence as an informational line and re-anchoring is its own deliberate command; nothing needed reverting, andcheck:authorable-surfaceis green with the lagging baseRev.Cross-repo residue (report only, no objectui edits)
objectui's
packages/components/metadata/ObjectGrid.component.yml:45,49still declaresstriped/borderedwith defaults — a declaration its implementation never reads (already noted in #7132). For the objectui seat to prune; nothing in this PR touches that repo.Out-of-scope finding
Filed #8251:
layout-dsl.mdxteaches section-levelvirtualScroll/itemHeight/lazy/renderStrategykeys that exist on no schema (flagged in the 2026-06 docs-accuracy audit followups but never filed).Generated by Claude Code