The object-grid page component declares bulkActions, bulkActionDefs AND batchActions, and no reference-integrity rule walks that container for bulk wirings — so a list rendered as a page component sits outside both rules, and batchActions is a spelling neither has ever seen.
The declaration
packages/spec/src/ui/component.zod.ts:2598-2600 gives the object-grid page component all three keys, with the comment that "the renderer reads FIRST".
What walks it
Nothing, for bulk wirings.
⇒ A bulk action wired on an object-grid page component is invisible to both, and the third spelling batchActions is invisible to everything.
⛔ What this card is NOT
⛔ Not a defect introduced by PR #17912, and ⛔ not a request to widen that PR. The tier boundary is pre-existing and consistent — that PR's three tiers are exactly the three its sibling walks, which is the right call for that round. This is the edge of the population, filed so it is written down rather than rediscovered.
⚠️ Explicitly unmeasured: whether this tier is reachable in any shipped app. The schema keys were read; that surface was not censused. Whoever takes this should measure the population before proposing a rule change — a container nothing authors is a different card from one apps use today.
⚠️ Also unmeasured: whether batchActions is live anywhere, or is a legacy spelling the renderer keeps for compatibility. The comment says the renderer reads bulkActions first, which implies the others are fallbacks, but implication is not a reading.
Provenance
Surfaced as R5 by the contract-review round of PR #17912 (card #17319), 2026-09-13T02:2xZ, and deliberately not folded into that PR — widening a clause-② PR to carry an unrelated repair is what the review process exists to prevent.
⛔ Filed bare and ungraded — no domain:*, no priority:*; both are the triage seat's sole production. Type prefilled only.
Duplicate check
Title census over the 600 newest issues and PRs in this repo, 2026-09-13T02:4xZ: batchactions → 0 title hits, alongside bulkactions → 1 (#17319), tier → 7, contract-review → 6. The neighbouring terms fire, so the zero is a reading rather than a dead instrument.
Generated by Claude Code
The object-grid page component declares
bulkActions,bulkActionDefsANDbatchActions, and no reference-integrity rule walks that container for bulk wirings — so a list rendered as a page component sits outside both rules, andbatchActionsis a spelling neither has ever seen.The declaration
packages/spec/src/ui/component.zod.ts:2598-2600gives the object-grid page component all three keys, with the comment that "the renderer reads FIRST".What walks it
Nothing, for bulk wirings.
validate-action-dispatch-contractrule (PR feat(spec,lint): let an action declare its bulk dispatch contract, and refuse a view that wires it the other way #17912, card An action cannot declare whichbulkActionsdispatch contract its body is written for — bare-string fan-out andexecution: 'aggregate'deliver opposite input shapes through one authoring surface #17319) walks three list tiers: viewlist, viewlistViews.*, objectlistViews.*. Page components are not among them.validate-action-name-refs.tsreads onlyproperties.actionNameson page components — the name face, not the bulk face.⇒ A bulk action wired on an object-grid page component is invisible to both, and the third spelling
batchActionsis invisible to everything.⛔ What this card is NOT
⛔ Not a defect introduced by PR #17912, and ⛔ not a request to widen that PR. The tier boundary is pre-existing and consistent — that PR's three tiers are exactly the three its sibling walks, which is the right call for that round. This is the edge of the population, filed so it is written down rather than rediscovered.
batchActionsis live anywhere, or is a legacy spelling the renderer keeps for compatibility. The comment says the renderer readsbulkActionsfirst, which implies the others are fallbacks, but implication is not a reading.Provenance
Surfaced as R5 by the contract-review round of PR #17912 (card #17319), 2026-09-13T02:2xZ, and deliberately not folded into that PR — widening a clause-② PR to carry an unrelated repair is what the review process exists to prevent.
⛔ Filed bare and ungraded — no
domain:*, nopriority:*; both are the triage seat's sole production. Type prefilled only.Duplicate check
Title census over the 600 newest issues and PRs in this repo, 2026-09-13T02:4xZ:
batchactions→ 0 title hits, alongsidebulkactions→ 1 (#17319),tier→ 7,contract-review→ 6. The neighbouring terms fire, so the zero is a reading rather than a dead instrument.Generated by Claude Code