Slice 2b 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 split by package
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, while objectui#8212's landed rider note had predicted the opposite. Splitting also keeps each PR inside the plugin package's own __tests__ dir, where the worked precedents live.
Scope — three keys
object-calendar (both tags: plugin-calendar:object-calendar and view:calendar):
| key |
declared arm |
note |
data |
array |
owes a MEMBER_PINS entry |
staticData |
array |
owes a MEMBER_PINS entry |
loading |
boolean |
⚠️ scalar — see below |
All three were measured genuinely spec-declared in slice 1, with a control key drawing unrecognized_keys on the same safeParse call shape while none of these was refused by name. ⛔ objectui#8172's limit trap does not apply.
⚠️ Why loading is here and not in slice 1
loading is scalar, so it owes no member pin and slice 1's boundary (scalar-armed keys only) would otherwise have taken it. It was deliberately held back: it is inert without data — a loading flag on a block that cannot be handed rows says nothing — so it ships with the key that makes it meaningful.
⇒ if your measurement contradicts that (e.g. loading is honoured independently of data), say so and declare it on its own terms; the pairing is slice 1's reasoning, not a measured requirement.
⚠️ The three-part obligation each array-armed declaration owes
Since objectui#8212 landed:
- the
inputs entry;
- deletion of its
UNPUBLISHED_EXEMPTIONS entry in the same change;
- 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.
⚠️ Both halves of the shrink-only backlog ceiling move (toBeLessThanOrEqual and toBe, same it()) — moving only toBe banks headroom the ratchet exists to refuse.
⚠️ Measure each sink
Three worked precedents on main, two of them for this very package:
packages/plugin-calendar/src/__tests__/ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsx — identity (toBe)
packages/plugin-calendar/src/__tests__/ObjectCalendar.sortMembersReachTheWire-8171.test.tsx — not identity; asserts what is read inside the member
packages/plugin-kanban/src/__tests__/ObjectKanban.filterMembersReachTheWire-8176.test.tsx
⛔ Do not assume which shape applies. ⚠️ objectui#8269 showed a sharper version of the same trap: a resolver answering which field and one answering which column the rows carry coincide only when no alias is written.
⚠️ One measured oddity in this package worth knowing before writing the data pin: getCalendarConfig (packages/plugin-calendar/src/ObjectCalendar.tsx:156) returns the block as soon as schema.calendar is truthy, so calendar: {} yields startDateField: undefined and every record lands in unscheduledRecords — degraded-but-visible, which is the ruled objectui#7071 behaviour rather than a defect. Recorded because the spec now refuses calendar: {} at its own doors while objectui's .partial() mirror accepts it, so the two faces disagree by design.
Related
objectui#8201 (parent, slice 1 = PR #8309) · objectui#8212 · objectui#8223 · objectui#7071 · objectui#8170 (the refusal screen on this renderer still names titleField, which spec 17.3.0 made optional).
Slice 2b of objectui#8201, split by package under the PM ruling Q2 = B on that card. Filed by the
domain:uiPM seat. ⛔ Not claimed.Why split by package
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, while objectui#8212's landed rider note had predicted the opposite. Splitting also keeps each PR inside the plugin package's own__tests__dir, where the worked precedents live.Scope — three keys
object-calendar(both tags:plugin-calendar:object-calendarandview:calendar):dataMEMBER_PINSentrystaticDataMEMBER_PINSentryloadingAll three were measured genuinely spec-declared in slice 1, with a control key drawing
unrecognized_keyson the samesafeParsecall shape while none of these was refused by name. ⛔ objectui#8172'slimittrap does not apply.loadingis here and not in slice 1loadingis scalar, so it owes no member pin and slice 1's boundary (scalar-armed keys only) would otherwise have taken it. It was deliberately held back: it is inert withoutdata— aloadingflag on a block that cannot be handed rows says nothing — so it ships with the key that makes it meaningful.⇒ if your measurement contradicts that (e.g.
loadingis honoured independently ofdata), say so and declare it on its own terms; the pairing is slice 1's reasoning, not a measured requirement.Since objectui#8212 landed:
inputsentry;UNPUBLISHED_EXEMPTIONSentry in the same change;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.Three worked precedents on
main, two of them for this very package:packages/plugin-calendar/src/__tests__/ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsx— identity (toBe)packages/plugin-calendar/src/__tests__/ObjectCalendar.sortMembersReachTheWire-8171.test.tsx— not identity; asserts what is read inside the memberpackages/plugin-kanban/src/__tests__/ObjectKanban.filterMembersReachTheWire-8176.test.tsx⛔ Do not assume which shape applies.⚠️ objectui#8269 showed a sharper version of the same trap: a resolver answering which field and one answering which column the rows carry coincide only when no alias is written.
datapin:getCalendarConfig(packages/plugin-calendar/src/ObjectCalendar.tsx:156) returns the block as soon asschema.calendaris truthy, socalendar: {}yieldsstartDateField: undefinedand every record lands inunscheduledRecords— degraded-but-visible, which is the ruled objectui#7071 behaviour rather than a defect. Recorded because the spec now refusescalendar: {}at its own doors while objectui's.partial()mirror accepts it, so the two faces disagree by design.Related
objectui#8201 (parent, slice 1 = PR #8309) · objectui#8212 · objectui#8223 · objectui#7071 · objectui#8170 (the refusal screen on this renderer still names
titleField, which spec 17.3.0 made optional).