This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Repository navigation
Commit d73d987
feat(types)!: retire object-grid's resizableColumns on both faces and stop ObjectGrid reading it (part of objectui#6152, round 7) (#11955)
Part of #6152 (round 7)
The card stays open for its later rounds, which triage booked as
separate PRs: the 17.7.0 member moves (`operations`,
`conditionalFormatting`, `filter`) and `ObjectCalendarSchema.calendar`'s
`.passthrough()`. Neither is in this PR.
Clause-②: no
This round narrows and widens nothing. It retires `object-grid`'s
`resizableColumns`, which `@objectstack/spec` 17.7.0 already refuses, so
it owes one at-tier contract review before the queue.
## What changed: the four strokes the seat scoped
The seat answered (card comment `5957903936`) that `resizable` is
canonical and `resizableColumns` retires with no window, once the spec
half was installable. `@objectstack/spec` 17.7.0 retired the key in
`ComponentPropsMap['object-grid']` (objectstack#21445), and objectui
resolves 17.7.0 since objectui#11717.
1. **TypeScript face.** `ObjectGridSchema.resizableColumns` is `?:
never`, following the package's convention for a retired member (the
`defaultSort` precedent on the same interface). The `@deprecated` tag
points at `resizable`, which is `properties.resizable` on an authored
node.
2. **Flat zod mirror.** The flat `ObjectGridSchema` in
`@object-ui/types/zod` declares `resizableColumns:
retirementTombstone(...)`. Its one-string message, the
`OBJECT_GRID_RESIZABLE_COLUMNS_RETIRED` constant beside the
objectui#11068 constants, names `properties.resizable`. It sits next to
`defaultSort`'s tombstone. The `object-view` `table` slot keeps its own
refusal, which `.extend`s over this member, just as it does for the five
keys objectui#11068 retired on the grid.
3. **Renderer.** `ObjectGrid` hands `DataTable` `resizableColumns:
schema.resizable ?? true`. The `?? schema.resizableColumns` fallback is
gone. The `object-grid` registration's `resizable` input description no
longer calls the old spelling a fallback. The registration's header
comment now names `resizableColumns` beside `defaultSort` as a spelling
that left by tombstone, not by exemption.
4. **Ledger.** The `objectql.zod.ts#ObjectGridSchema` entry leaves
`UnmirroredDeclared`. Its one key was retired, and a tombstone is a
mirrored member, so the entry went with it, as `PaginationSchema`'s did.
The entry's docblock is rewritten as the departed-entry comment its
neighbours use and keeps the entry's history. Every pinned prose figure
moved and gained its history sentence: the header bullet, the split's
SPEC-DERIVED line, the totals line and its narrative, both ledger
docstrings, and the cross-ledger union sentence. The objectui#7279,
#7733, #8222 and #8243 pins derive the new figures and are green:
`UnmirroredDeclared` 4 entries / 5 keys, 2 / 3 spec-derived and 2 / 2
local, with a union of 9. No `KnownDrift`, `RuntimeOnlyDeclared`,
`WiderThanDeclared` or `MirroredUndeclared` row moved.
`SPEC_DERIVED_PAIRS` keeps `ObjectGridSchema`, because its membership
comes from the mirror's spec references, which did not change.
## What moves for a reader of the published packages
- **Did not move: the authored door.** `{ "type": "object-grid",
"properties": { "resizableColumns": false } }` and the flat spelling on
the node were already refused by name before this change, through the
spec row and `flatPropRefusals`. That holds on the tolerant face, the
strict face and `safeValidateSchema`, and the round-7 pin re-measures
all three.
- **Narrowed: `@object-ui/types`.** The TypeScript member now refuses
any value. The exported flat `ObjectGridSchema` mirror refuses the key
at the key with `invalid_type`, where `BaseSchema`'s `.passthrough()`
used to keep it unexamined.
- **Changed behaviour: `@object-ui/plugin-grid`.** A grid node that
still carries `resizableColumns` gets the default, resizable columns.
`resizableColumns: false` no longer removes the resize handles. A
tree-scoped search found no producer that writes the key on an
`object-grid` (see Measurements).
- **Changeset.** `.changeset/6152-resizable-columns-retired.md` bumps
`@object-ui/types` and `@object-ui/plugin-grid` `minor` (the fixed
group's version policy) and states the break.
## Measurements before editing (the dispatch's mechanism assumptions)
- **H1, the sites: held,** on base `19a7348`, which is the dispatch's
`f1781be` plus one app-shell commit. The one renderer read is the `??
schema.resizableColumns` fallback in `ObjectGrid`. The registration
names the spelling in the `resizable` input's description and in the
header comment. The flat mirror did not carry the key, and the `table`
slot refused it by name.
- **H2, the install surface already refuses it: held** on the installed
`@objectstack/spec` 17.7.0.
`ComponentPropsMap['object-grid'].safeParse({ resizableColumns: true })`
fails with `invalid_type` at `resizableColumns` and the retired-key
message naming `resizable`. The lit control `{ resizable: true }`
parses, and the strictness control (an unknown key) fails with
`unrecognized_keys`. So the local tombstone refuses nothing the
installed protocol accepts. The round-7 pin re-reads this against the
installed package.
- **H3, the pins that flip: partly held.** The round-6 test
"`resizableColumns` is NOT mirrored: its route is open, and the parity
ledger keeps it" flips in place into the retired assertion: the key is a
member, and `true` and `false` are each refused at the key. Two other
pins do not flip, because they pin the `table` slot's own refusal, which
this round leaves standing:
- the round-6 test "`table.navigation` and `table.resizableColumns` stay
withheld, refused by name";
- `object-view-slot-key-lists.test.ts`'s `alias` row.
Their docstrings now record that the grid itself tombstones the key
since round 7. No assertion was deleted.
- **Fixture sweep, by the rule's consumer radius (the whole
repository).** Zero tracked JSON, Markdown or MDX documents write
`resizableColumns` on an `object-grid`; a control search for `resizable`
finds 11. The one consumer test that writes the key past the type is
plugin-view's table-relay test, which writes it to prove it is withheld;
it is green. `DataTableSchema.resizableColumns` is a different block's
own key and is untouched, as the claim requires.
## Tests and gates
Run from the worktree root with repo-relative paths. Every build, suite,
type-check and ablation went through `os-verify-lock.sh`. Each exit code
was captured before any pipe.
- **Build.** `turbo run build --concurrency=2` over
`check-doc-snippet-types --build-filter`: `Tasks: 35 successful, 35
total`. The dist was checked after the build:
- `packages/types/dist/objectql.d.ts` carries `resizableColumns?:
never`;
- the plugin-grid bundle reads `resizableColumns: e.resizable ?? !0` and
has 0 hits for the old fallback.
- **Type-checks,** both scripts echoed in the log, exit 0, 0 `error TS`:
- `pnpm --filter @object-ui/types type-check` (`tsc --noEmit && tsc -p
tsconfig.examples.json && tsc -p tsconfig.test.json`);
- `pnpm --filter @object-ui/plugin-grid type-check` (`tsc --noEmit &&
tsc -p tsconfig.test.json`).
`--listFilesOnly` shows both test projects include the touched and new
test files.
- **Suites,** with `--maxWorkers=2`:
- `vitest run packages/types/`: `Test Files 360 passed (360)`, `Tests
9624 passed (9624)`.
- `vitest run packages/plugin-grid/
apps/console/src/__tests__/registry-inputs-spec-parity.test.ts`: `Test
Files 195 passed (195)`, `Tests 2077 passed (2077)`. A verbose re-run of
the two named files read 255 console-parity tests and the 4 new grid
tests, each passing.
- plugin-view's `ObjectView.tableSlotRelay-10976.test.tsx`: 7 passed.
- **Gates at the final head `06db65a6`,** all exit 0:
- `check-changeset-presence` ("9 source file(s) of 2 released package(s)
changed, and this change declares 1 changeset(s)"), `changeset:check`,
`check:changeset-claims` ("No pending changeset names a file this change
touches"; a search of pending changesets for `resizableColumns` and for
ledger figures also found nothing), `check:pending-changeset-literals`;
- `check:new-line-citations` ("0 new citation(s)"),
`check:control-bytes`, `check:spec-symbols`, `check:test-path-roots`,
`check:unreferenced-sources`, `check:handler-key-reads`,
`check:vi-mock-specifiers`, `check-type-check-coverage` ("43/43");
- `check-governed-queue-guard --test` over the 10 paths: NOT GOVERNED.
- **Doc and skill gates,** run on the built closure at `4a1feb41`, all
exit 0:
- `check:skill-examples`;
- `check:doc-types`;
- `check:doc-snippets` ("784 of 784 block(s) judged, 0 failed");
- `check:doc-examples`;
- `check:readme-exports`;
- `check:component-surface-parity` (report-only);
- `check:prompt-keys`;
- `check:designer-field-key-parity`.
`06db65a6` changes only the plugin-grid pin's cast, which no doc gate
reads.
- **Lint, a declared narrowing.** `eslint --no-inline-config --format
json` judged all 9 changed TS files and ignored none: 1 error and 261
warnings. No message sits on an added line once the pin's `any` was
replaced by a cast through `unknown` (`06db65a6`). The one error is the
inline-disabled `react-hooks/static-components` line in `ObjectGrid`'s
empty-state icon, which this diff does not touch. Invariance:
`eslint.config.js` declares no `parserOptions.project` or
`projectService` (no type-aware linting), so this diff cannot move a
verdict in an untouched file. The repo-wide `pnpm lint` is CI's.
## Reverse verification
Predictions were written to scratch before each run. Each mutation ran
through objectstack's `scripts/ablation-replace.mjs` (wrap mode) on
committed HEAD `06db65a6`, inside a harness with a `trap` restore on
absolute paths. Every leg was restored and proven: blob equal to the
HEAD blob, `git diff HEAD` 0 bytes, porcelain 0 lines. No leg needed a
dist step: every subject resolves to source through relative imports.
- **A1, put the renderer's fallback read back** (anchor x1 to x0, blob
`2ec85adb` to `ed7482d6`). The plugin-grid pin read `1 failed | 3
passed`, exactly the predicted row: "`resizableColumns: false` alone is
not read", `expected +0 to be 2`.
- **A2, delete the mirror's tombstone member** (blob `59edcee7` to
`ece13ddb`).
- `tsc -p tsconfig.test.json` exited 2 with exactly one `TS2322`,
`"objectql.zod.ts#ObjectGridSchema"` not assignable to `never`, at
`assertionUnmirroredMatchesLedger`.
- vitest read `4 failed | 159 passed`, as predicted: the three mirror
rows of the round-7 pin and the flipped round-6 test. Every
authored-door and slot row stayed green, and so did
`object-view-slot-key-lists` and the parity runtime pins.
- **A3, re-declare the TypeScript member as `boolean`** (blob `b1d0a398`
to `1caaa5d4`). `tsc -p tsconfig.test.json` exited 2 with the three
predicted errors:
- `TS2578`, the round-7 `@ts-expect-error` now unused;
- `TS2344` at `assertionResizableColumnsIsRetiredOnTheInterface`;
- `TS2322` at `assertionDriftMatchesLedger` (the mirror's `never`
against a declared `boolean`).
The first A3 attempt timed out in the lock queue (exit 99) before `tsc`
ran. Its restore was proven, and it was re-run under the same slot.
## NOT MEASURED
- `check:sdui-registration-pins`. It weighs registrations in a built
console, and this diff adds and removes no registration; only one
input's description text changed.
- The full `pnpm test` farm and the repo-wide `pnpm lint`. Both are
CI's.
- The plugin-view and plugin-list suites beyond the relay test. No
producer passes `resizableColumns` to `ObjectGrid` (the tree-scoped
search above), and `ObjectView` withholds it by construction.
- The at-tier contract record. The seat owes it on the landing head.
## Acceptance notes
- **Prose repair inside the claimed file.**
`zod-mirror-parity.test.ts`'s paragraph listing which cross-ledger
figures are pinned spelled their values as digits (`13`, both `8`s).
Those digits had gone stale before this round, while the pinned ones
moved. Because this round moves the same figures, the paragraph now
names them by role, not by digit.
- **The registry-parity comment is now historical.** `apps/console`'s
`registry-inputs-spec-parity.test.ts` comment on the harvested
`object-grid.resizableColumns` row ends "Retiring the renderer's own
read of the old spelling is objectui#6152's." That read is retired here,
so the sentence is now history. It is outside this round's surface and
was left as is. Carrier: the next PR that touches that file.
- **Slot-scoped docs stay accurate.**
`content/docs/plugins/plugin-view.mdx`, `packages/plugin-view/README.md`
and the `ObjectView` relay comment still call `resizableColumns` a
legacy alias the `table` slot withholds (write `resizable`). That stays
true, because the slot's own refusal is unchanged.
## Deviations, declared
- Commit trailers are AGENTS.md's model-free pair (`Claude-Session` plus
`Co-authored-by: Claude`), not the harness reminder's model-named line.
- This footer is the dispatch contract's session-URL form.
Session: `https://claude.ai/code/session_01DBZ9bntPZ7VKyQNtJeNsgw`
---
_Generated by [Claude
Code](https://claude.ai/code/session_01DBZ9bntPZ7VKyQNtJeNsgw)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 1c51e97 commit d73d987
10 files changed
Lines changed: 365 additions & 75 deletions
File tree
- .changeset
- packages
- plugin-grid/src
- __tests__
- types/src
- __tests__
- zod
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5431 | 5431 | | |
5432 | 5432 | | |
5433 | 5433 | | |
5434 | | - | |
| 5434 | + | |
| 5435 | + | |
| 5436 | + | |
| 5437 | + | |
| 5438 | + | |
5435 | 5439 | | |
5436 | 5440 | | |
5437 | 5441 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
211 | 211 | | |
212 | 212 | | |
213 | 213 | | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
214 | 217 | | |
215 | 218 | | |
216 | 219 | | |
| |||
298 | 301 | | |
299 | 302 | | |
300 | 303 | | |
301 | | - | |
| 304 | + | |
302 | 305 | | |
303 | 306 | | |
304 | 307 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
152 | 152 | | |
153 | 153 | | |
154 | 154 | | |
155 | | - | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
156 | 161 | | |
157 | 162 | | |
158 | 163 | | |
| |||
163 | 168 | | |
164 | 169 | | |
165 | 170 | | |
166 | | - | |
| 171 | + | |
| 172 | + | |
167 | 173 | | |
168 | 174 | | |
169 | 175 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
27 | | - | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
28 | 30 | | |
29 | 31 | | |
30 | 32 | | |
| |||
92 | 94 | | |
93 | 95 | | |
94 | 96 | | |
95 | | - | |
96 | | - | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
97 | 106 | | |
98 | 107 | | |
99 | 108 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
0 commit comments