Opened by the domain:ui execution-seat PM (session session_01EMrWaQw3XS5DxTHxp4yRyC) out of #4773, which stays as the measurement record. The work has grown a half that card never contained, and its body plus ten comments are a measurement history a removal PR would bury.
⛔ Not dispatchable as filed — the second half below needs a maintainer's ruling.
Where this stands
objectstack#11027 is merged on objectstack main (35e94c96b). packages/spec/src/ui/responsive.zod.ts no longer declares ResponsiveConfigSchema/ResponsiveConfig, BreakpointName, BreakpointColumnMapSchema/BreakpointColumnMap or BreakpointOrderMapSchema/BreakpointOrderMap — a REMOVED — tombstone stands where they were, with RETIRED_DEFS_BY_MAJOR[18] and the protocol-18 conversion. Merged and unreleased, so the discovery point is a lockfile refresh on caret ranges, not a deliberate bump. objectstack's own merged changeset names #4773 as the objectui execution half.
Half 1 — ruled, mechanical, and NOT sufficient on its own
The two implementations objectstack measured at zero callers: useResponsiveConfig (@object-ui/mobile) and ResponsiveProtocol (@object-ui/core). Their deletion is ruled and uncontested.
⛔ Do not dispatch this half alone. Every existing comment on #4773 says "delete the two dead implementations", and a PR that does only that leaves the bump red. That is the whole point of what follows.
Half 2 — unruled, and it reaches LIVE code
Measured on objectui origin/main, verified independently of the report that surfaced it:
| site |
what it imports |
status |
packages/types/src/mobile.ts:19 |
BreakpointName from @objectstack/spec/ui |
re-exported at :32 into @object-ui/types |
packages/layout/src/ResponsiveGrid.tsx:11 |
BreakpointColumnMap, BreakpointOrderMap |
re-exported at :32 |
packages/mobile/src/__tests__/responsive-config-spec-parity.test.ts:53 |
ResponsiveConfigSchema |
a runtime value import, not type-only |
Neither of the first two is dead:
BreakpointName is a chokepoint. Republished into @object-ui/types and consumed by live code — packages/mobile/src/breakpoints.ts:9,12,22,54 (BREAKPOINTS, BREAKPOINT_ORDER, getCurrentBreakpoint), ResponsiveContainer.tsx:10, and the ResponsiveValue<T> generic itself (types/src/mobile.ts:35).
ResponsiveGrid is a registered SDUI component. packages/layout/src/index.ts:206 — ComponentRegistry.register('responsive-grid', ResponsiveGrid, …), with layout:responsive-grid and responsive-grid both in cli/src/utils/known-schema-types.ts, and a test that renders it precisely to prove the key is registered (app-shell-not-a-component-key.test.tsx:166). Its columns input is authorable and reaches resolveColumnClasses(columns) on the render path.
⭐ The retirement's stated ground is measurably overbroad, and that is the decision
The tombstone on responsive.zod.ts gives this as the reason the four types left with the key:
ResponsiveConfigSchema, BreakpointColumnMapSchema, BreakpointOrderMapSchema and the BreakpointName enum had no other authorable carrier and left with the key
The census behind it measured page.components[].responsive and found it inert. That finding is sound. But "no other authorable carrier" is a claim about the whole surface, and objectui has one: responsive-grid's columns is authorable, typed by BreakpointColumnMap, and applied by a resolver on the render path.
⚠️ The tombstone also states the condition for return, in its own words:
The Tailwind-style xs…2xl layout vocabulary returns if and when a renderer implements it — in one change, with the engine (the #4834 rule).
A renderer implements it. That is why this is a ruling and not a repair.
The options
|
what it does |
cost |
| A — re-home in objectui |
declare BreakpointName locally in packages/types, and the column/order maps locally in packages/layout |
⚠️ reverses a recorded, reasoned decision. types/src/mobile.ts carries the reason verbatim: "Bound to the spec rather than re-declared (objectstack#4115): a local union under a spec export's name is read by the next reader as the spec's own definition, so a copy that is correct today is a planted premise tomorrow." Whoever takes A owes that comment an answer, not a deletion. |
| B — widen the retirement into objectui |
retire ResponsiveGrid's columns and the mobile breakpoint hooks too |
⛔ refuted by measurement. It deletes a registered component's authorable input and a resolver that runs on the render path, on no evidence that either is unused. |
| C — take it back to the spec seat |
ask whether the column vocabulary should survive, since the retirement's own return-condition appears already met |
a cross-repo round trip on a merged, maintainer-ruled retirement — but it is the option the tombstone's own text points at |
⛔ This seat is not ruling between A and C. A reverses a recorded decision about published surface; C questions the stated ground of a merged retirement. Either is a maintainer's call. B is off the table on measurement, not on preference.
⚠️ BreakpointOrderMap may be a third case: its own comment in ResponsiveGrid.tsx says it has no read point even there, so it may simply retire rather than be re-homed. That is not the same question as columns, and answering them together would hide it.
What a dispatchable brief needs, once ruled
Both halves in one change, because half 1 alone leaves the bump red. Plus the third site (responsive-config-spec-parity.test.ts:53) — a runtime value import, so it fails differently from the type-only ones and needs its own disposition.
Provenance
The live-code half was found by the os-dev seat working #4773 under a brief that told it to stop and report if the premise had changed. It did, and it was right to; every measurement above was re-verified here against origin/main and objectstack main before this card was written. Related: #4773 (the measurement record) · objectstack#11027 (the merged retirement) · objectstack#11029 (the cloud reading) · #7519 (owns the surviving MobileResponsiveConfig third).
Opened by the
domain:uiexecution-seat PM (sessionsession_01EMrWaQw3XS5DxTHxp4yRyC) out of #4773, which stays as the measurement record. The work has grown a half that card never contained, and its body plus ten comments are a measurement history a removal PR would bury.⛔ Not dispatchable as filed — the second half below needs a maintainer's ruling.
Where this stands
objectstack#11027is merged on objectstackmain(35e94c96b).packages/spec/src/ui/responsive.zod.tsno longer declaresResponsiveConfigSchema/ResponsiveConfig,BreakpointName,BreakpointColumnMapSchema/BreakpointColumnMaporBreakpointOrderMapSchema/BreakpointOrderMap— aREMOVED —tombstone stands where they were, withRETIRED_DEFS_BY_MAJOR[18]and the protocol-18 conversion. Merged and unreleased, so the discovery point is a lockfile refresh on caret ranges, not a deliberate bump. objectstack's own merged changeset names #4773 as the objectui execution half.Half 1 — ruled, mechanical, and NOT sufficient on its own
The two implementations objectstack measured at zero callers:
useResponsiveConfig(@object-ui/mobile) andResponsiveProtocol(@object-ui/core). Their deletion is ruled and uncontested.⛔ Do not dispatch this half alone. Every existing comment on #4773 says "delete the two dead implementations", and a PR that does only that leaves the bump red. That is the whole point of what follows.
Half 2 — unruled, and it reaches LIVE code
Measured on objectui
origin/main, verified independently of the report that surfaced it:packages/types/src/mobile.ts:19BreakpointNamefrom@objectstack/spec/ui:32into@object-ui/typespackages/layout/src/ResponsiveGrid.tsx:11BreakpointColumnMap,BreakpointOrderMap:32packages/mobile/src/__tests__/responsive-config-spec-parity.test.ts:53ResponsiveConfigSchemaNeither of the first two is dead:
BreakpointNameis a chokepoint. Republished into@object-ui/typesand consumed by live code —packages/mobile/src/breakpoints.ts:9,12,22,54(BREAKPOINTS,BREAKPOINT_ORDER,getCurrentBreakpoint),ResponsiveContainer.tsx:10, and theResponsiveValue<T>generic itself (types/src/mobile.ts:35).ResponsiveGridis a registered SDUI component.packages/layout/src/index.ts:206—ComponentRegistry.register('responsive-grid', ResponsiveGrid, …), withlayout:responsive-gridandresponsive-gridboth incli/src/utils/known-schema-types.ts, and a test that renders it precisely to prove the key is registered (app-shell-not-a-component-key.test.tsx:166). Itscolumnsinput is authorable and reachesresolveColumnClasses(columns)on the render path.⭐ The retirement's stated ground is measurably overbroad, and that is the decision
The tombstone on
responsive.zod.tsgives this as the reason the four types left with the key:The census behind it measured
page.components[].responsiveand found it inert. That finding is sound. But "no other authorable carrier" is a claim about the whole surface, and objectui has one:responsive-grid'scolumnsis authorable, typed byBreakpointColumnMap, and applied by a resolver on the render path.A renderer implements it. That is why this is a ruling and not a repair.
The options
BreakpointNamelocally inpackages/types, and the column/order maps locally inpackages/layouttypes/src/mobile.tscarries the reason verbatim: "Bound to the spec rather than re-declared (objectstack#4115): a local union under a spec export's name is read by the next reader as the spec's own definition, so a copy that is correct today is a planted premise tomorrow." Whoever takes A owes that comment an answer, not a deletion.ResponsiveGrid'scolumnsand the mobile breakpoint hooks too⛔ This seat is not ruling between A and C. A reverses a recorded decision about published surface; C questions the stated ground of a merged retirement. Either is a maintainer's call. B is off the table on measurement, not on preference.
BreakpointOrderMapmay be a third case: its own comment inResponsiveGrid.tsxsays it has no read point even there, so it may simply retire rather than be re-homed. That is not the same question ascolumns, and answering them together would hide it.What a dispatchable brief needs, once ruled
Both halves in one change, because half 1 alone leaves the bump red. Plus the third site (
responsive-config-spec-parity.test.ts:53) — a runtime value import, so it fails differently from the type-only ones and needs its own disposition.Provenance
The live-code half was found by the
os-devseat working #4773 under a brief that told it to stop and report if the premise had changed. It did, and it was right to; every measurement above was re-verified here againstorigin/mainand objectstackmainbefore this card was written. Related: #4773 (the measurement record) · objectstack#11027 (the merged retirement) · objectstack#11029 (the cloud reading) · #7519 (owns the survivingMobileResponsiveConfigthird).