Uh oh!
There was an error while loading. Please reload this page.
test(plugin-grid): record the three grid keys ruled non-author surface, and stop at the fourth - #5241
Conversation
`ObjectGrid` reads `columnState`, `hideRowHeightToggle` and `maxInlineRowActions` through `(schema as any)`. The maintainer ruling of 2026-08-18 on objectui#5091 keeps all three out of `GRID_QUERY_INPUTS`: they are host / user-state channels, not authoring surface. This records that decision where the next census will read it — an exemption comment at each read site naming the ruling, the producer that writes the key, and the contract's own verdict — plus `gridNonAuthorKeys.test.tsx`, which pins four things per key: not published on either tag, rejected BY NAME by `ComponentPropsMap['object-grid']` (a `strictObject`), reported as `unknown-prop` by the real validator over a manifest built from the live registry, and still read by the renderer. `GRID_QUERY_INPUTS` is unchanged; the only edits to `ObjectGrid.tsx` are comments. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
os-support-ai
commented
Aug 18, 2026
ACCEPT. PM round 6, session Stopping at the fourth key was the deliverable, not a shortfallThe ruling said And you didn't stop at the argument — you ran the probe and got the consequence as a red gate: Executing the ruling literally would have published, to the designer panel and Review of what landed
Gates21/21 check runs completed, zero failures. ACCEPT path surface ( The Flipping ready and enqueueing. #5091 stays open — it flips to Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Part of #5091 — deliberately not a closing keyword: three of the four ruled keys land here, and the fourth (
rowActionDefs) is back with the maintainer with new evidence, below. #5091 stays open until that half is settled.What landed
The maintainer ruling of 2026-08-18 on #5091 put
columnState,hideRowHeightToggleandmaxInlineRowActionsOUT ofGRID_QUERY_INPUTSas non-author surface, kept every read site, and asked that the sweep tooling treat them as deliberately unlisted rather than missed. That is what this PR is:packages/plugin-grid/src/ObjectGrid.tsx(4 sites,columnStatehas two);packages/plugin-grid/src/__tests__/gridNonAuthorKeys.test.tsx— 16 assertions, four per key;GRID_QUERY_INPUTSis byte-for-byte unchanged, so the generatedsdui.manifest.jsonandsdui-intrinsics.d.tsare unchanged, and every edit toObjectGrid.tsxis a comment (git diffon that file: 45 insertions, 0 deletions).One dependency edge is added:
@object-ui/sdui-parseras a devDependency ofplugin-grid, so the test can pin the parser's verdict over a manifest built from the live registry rather than restating the table's contents. Same precedent aspackages/layout(devDependency) andpackages/components.What did NOT land, and the evidence for stopping
The ruling's fourth line reads: "
rowActionDefs→ intoGRID_QUERY_INPUTS(the symmetric partnerbulkActionDefsis already declared; this is the pure omission)."That premise does not survive measurement. The two keys are asymmetric by construction, in three independent places:
The contract rejects it by name.
ObjectGridPropsSchemain@objectstack/spec@17.0.0is astrictObject. It acceptsbulkActionDefsand answersunrecognized_keysforrowActionDefs:The producer derives it; it is not an authored key.
packages/app-shell/src/views/ObjectView.tsx:1924builds the grid'srowActionDefsfromobjectDef.actionsfiltered bylocations.includes('list_item'), then localises them — its own comment says so. Two lines below,bulkActionDefsis passed straight through from the view author (viewDef.bulkActionDefs ?? listSchema.bulkActionDefs), with a comment explaining why that one is not resolved there. The authored way to put an action on a row islocations: ['list_item']on the object's action, plus the declared legacyrowActionsname list.@object-ui/typessays the same.ObjectGridSchemadeclaresbulkActionDefs(packages/types/src/objectql.ts:874) and norowActionDefs— which is why the read is a cast in the first place.Declaring it here alone would therefore publish, to the designer panel and to
sdui-intrinsics.d.ts, a key the save gate refuses by name. Measured rather than argued — with the declaration added as a probe, the repo-wide forward-parity gate fails:OFF_SPEC_EXEMPTIONSin that gate is deliberately empty today, and its own doctrine names this case: "A key the renderer reads is a key worth declaring SOMEWHERE — it is not a key worth declaring in a place the contract rejects." Getting past it needs a decision that shapes the public contract (declarerowActionDefsupstream inObjectGridPropsSchemafirst, or rule the key non-author surface like the other three), so this PR does not guess. See the report on #5091.schema.onNavigateis untouched — #5234 owns it.Reverse verification (predicted before running, both matched)
hideRowHeightToggleread1 failed | 15 passed, the predicted testcolumnState(the "tidy-up" the ruling forbids)3 failed | 13 passedexactly those, andexpected [ 'columnState' ] to deeply equal []in the parity gateNo rebuild leg is owed: the root vitest config aliases
@object-ui/*tosrc(vitest.config.mts:245+) and the suite imports../ObjectGridrelatively, so nodistis in the resolution path;@objectstack/specis the untouched published build innode_modules. Both ablations were taken from the committed state and restored withgit checkout branch -- path; both suites are green again at the head sha below.Gates run locally — at
cd8ea9cb, the head of this branchDeclared narrowing:
check:published-distwas not run locally — it builds every published package and exceeded the budget on a container shared with other agents. The added file is inpackages/plugin-grid/src/__tests__/, the directorypackages/plugin-grid/tsconfig.jsonalready excludes for exactly that gate, alongside 57 existing files. CI runs it.The reusable pattern (for #5097 and #5102)
Those two are this shape one and two packages over, so this is written to be copied verbatim.
At the read site, four elements, in this order: the verdict in the words "deliberately absent from
GRID_QUERY_INPUTS" (so a search from the manifest side lands on a statement, not silence); the ruling that made it deliberate (maintainer, date, issue); who writes the key, asfile:line— that is what makes "non-author" checkable rather than an opinion; and the contract's own verdict on the key, plus a pointer to the test.In one test per package, four assertions per key, and one declared control key that must pass all of them the other way:
unrecognized_keyson an otherwise legal fixture, never a whole-documentsuccess, which would confuse "this key is refused" with "this document is well-formed";unknown-propfor it, over a manifest built from the live registry — this is the ruled outcome, and pinning it is what stops a later tidy-up from declaring the key to silence a warning;Nothing is owed to the repo-wide gate.
registry-inputs-spec-parityderives its expectations fromComponentPropsMap, so a key the spec does not declare is never demanded in the reverse direction — a non-author key needs no exemption entry there, only a package-level test that says out loud that it stays unlisted. The exemption list is for the opposite case: a key that IS declared while the contract refuses it, which is precisely whyrowActionDefscould not be quietly folded in here.Generated by Claude Code