Slice 2a of objectui#8201, split by package under the PM ruling Q2 = B on that card. Filed by the domain:ui PM seat. ⛔ Not claimed.
Why this is its own card rather than the back half of one PR
Each member pin has to be measured at its own sink, and objectui#8223 proved how easily a sink is assumed wrong: its sort pin could never have been an identity pin, because convertSortToQueryParams builds a new map — and objectui#8212's landed rider note had predicted the opposite. Six sinks in one PR is exactly the size that invites an assumed identity pin.
Splitting by package also keeps each PR inside the plugin package's own __tests__ dir, where all three worked precedents already live.
Scope — four keys, all array/object-armed
object-kanban (both tags: plugin-kanban:object-kanban and view:kanban):
| key |
declared arm |
data |
array |
cardFields |
array |
grouping |
z.unknown() |
conditionalFormatting |
z.unknown() |
All four were measured genuinely spec-declared in slice 1 — a control key drew unrecognized_keys on the same safeParse call shape while none of these was refused by name, so "the spec declares it" is a verdict here, not a vacuous read. ⛔ objectui#8172's limit trap does not apply to any of them.
⛔ Out of scope: object-kanban.quickAdd — ruled a premature carve-out on objectui#8201 (Q1 = A), citing objectui#8285 as its owner. Its entry is rewritten, not deleted, and the ceiling drops accordingly. Whether that rides in this PR or its own is the dev's call; say which.
⚠️ The three-part obligation each declaration owes
Since objectui#8212 landed, declaring an array/object-armed key owes:
- the
inputs entry;
- deletion of its
UNPUBLISHED_EXEMPTIONS entry in the same change (the stale check reddens otherwise);
- a
MEMBER_PINS entry — ⛔ never a member-pin exemption. MEMBER_PIN_EXEMPTION_CEILING stays 62; an assertion pins four keys by name so a fifth cannot ride that headroom.
⚠️ And both halves of the shrink-only backlog ceiling move (toBeLessThanOrEqual and toBe, same it()). Moving only toBe banks headroom the ratchet exists to refuse — objectui#8223 hit exactly that.
⚠️ Measure each sink; do NOT assume the pin's shape
Three worked precedents, all on main:
packages/plugin-calendar/src/__tests__/ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsx
packages/plugin-kanban/src/__tests__/ObjectKanban.filterMembersReachTheWire-8176.test.tsx
packages/plugin-calendar/src/__tests__/ObjectCalendar.sortMembersReachTheWire-8171.test.tsx
The two filter pins assert the authored value reaches the wire BY IDENTITY (toBe). sort does not. ⚠️ A sharper version of the same trap cost a near-miss on objectui#8269: a resolver answering which field and one answering which column the rows carry (alias ?? field) coincide only when no alias is written. Be explicit about which question each pin asserts.
⭐ Note carried from slice 1: the spec rows for grouping and conditionalFormatting are z.unknown() — exactly like filter and sort. So, as the two landed MEMBER_PINS entries already say, the spec side cannot supply the member contract and the wire (or the read site) is the whole of it.
Related
objectui#8201 (parent, slice 1 = PR #8309) · objectui#8212 (the gate that created the obligation) · objectui#8186 · objectui#8223 · objectui#8285 (quickAdd) · objectui#8308 (the cardTitle/titleField || vs ?? divergence slice 1 surfaced — not this card's, but it touches the same registration).
Slice 2a of objectui#8201, split by package under the PM ruling Q2 = B on that card. Filed by the
domain:uiPM seat. ⛔ Not claimed.Why this is its own card rather than the back half of one PR
Each member pin has to be measured at its own sink, and objectui#8223 proved how easily a sink is assumed wrong: its
sortpin could never have been an identity pin, becauseconvertSortToQueryParamsbuilds a new map — and objectui#8212's landed rider note had predicted the opposite. Six sinks in one PR is exactly the size that invites an assumed identity pin.Splitting by package also keeps each PR inside the plugin package's own
__tests__dir, where all three worked precedents already live.Scope — four keys, all array/object-armed
object-kanban(both tags:plugin-kanban:object-kanbanandview:kanban):datacardFieldsgroupingz.unknown()conditionalFormattingz.unknown()All four were measured genuinely spec-declared in slice 1 — a control key drew
unrecognized_keyson the samesafeParsecall shape while none of these was refused by name, so "the spec declares it" is a verdict here, not a vacuous read. ⛔ objectui#8172'slimittrap does not apply to any of them.⛔ Out of scope:
object-kanban.quickAdd— ruled a premature carve-out on objectui#8201 (Q1 = A), citing objectui#8285 as its owner. Its entry is rewritten, not deleted, and the ceiling drops accordingly. Whether that rides in this PR or its own is the dev's call; say which.Since objectui#8212 landed, declaring an array/object-armed key owes:
inputsentry;UNPUBLISHED_EXEMPTIONSentry in the same change (the stale check reddens otherwise);MEMBER_PINSentry — ⛔ never a member-pin exemption.MEMBER_PIN_EXEMPTION_CEILINGstays 62; an assertion pins four keys by name so a fifth cannot ride that headroom.toBeLessThanOrEqualandtoBe, sameit()). Moving onlytoBebanks headroom the ratchet exists to refuse — objectui#8223 hit exactly that.Three worked precedents, all on
main:packages/plugin-calendar/src/__tests__/ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsxpackages/plugin-kanban/src/__tests__/ObjectKanban.filterMembersReachTheWire-8176.test.tsxpackages/plugin-calendar/src/__tests__/ObjectCalendar.sortMembersReachTheWire-8171.test.tsxThe two⚠️ A sharper version of the same trap cost a near-miss on objectui#8269: a resolver answering which field and one answering which column the rows carry (
filterpins assert the authored value reaches the wire BY IDENTITY (toBe).sortdoes not.alias ?? field) coincide only when no alias is written. Be explicit about which question each pin asserts.⭐ Note carried from slice 1: the spec rows for
groupingandconditionalFormattingarez.unknown()— exactly likefilterandsort. So, as the two landedMEMBER_PINSentries already say, the spec side cannot supply the member contract and the wire (or the read site) is the whole of it.Related
objectui#8201 (parent, slice 1 = PR #8309) · objectui#8212 (the gate that created the obligation) · objectui#8186 · objectui#8223 · objectui#8285 (
quickAdd) · objectui#8308 (thecardTitle/titleField||vs??divergence slice 1 surfaced — not this card's, but it touches the same registration).