Uh oh!
There was an error while loading. Please reload this page.
feat(spec): retire page.components[].responsive (ADR-0049 D2) and repair the four redirect texts (#11027) - #11685
Conversation
…air the four redirect texts (#11027) The last carrier of the ResponsiveConfig layout block measured dead across both repos (zero callers of useResponsiveConfig / ResponsiveProtocol), so the key is a retiredKey() tombstone and the orphaned value schemas (ResponsiveConfigSchema, the two breakpoint maps, BreakpointName) leave with it. Every shipped text that prescribed the key as the live alternative — the #4876 widget tombstone, the generated references, the upgrade-guide prose, the protocol-17 migration rationale, the conversion summary, and the dashboard liveness note — is corrected to point at responsiveStyles (ADR-0065). ADR-0087: retired-key + retired-def entries under protocol 18 and the page-component-responsive-removed conversion, wired into the step-18 chain. Co-Authored-By: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 26 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 4 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 5c2b11c952316dd067f4cac974ab0ac219504160 && git checkout 5c2b11c952316dd067f4cac974ab0ac219504160
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin ffbb7a100bc02679f8f38029612135e6a0ef7ff1 d9bb37b2828dcbff2f6f62ebdbda514a42667add && git checkout -B drift-repro ffbb7a100bc02679f8f38029612135e6a0ef7ff1 && git merge --no-ff d9bb37b2828dcbff2f6f62ebdbda514a42667add
node scripts/docs-audit/affected-docs.mjs --json ffbb7a100bc02679f8f38029612135e6a0ef7ff1
|
…ls/** is a governed surface One governed-path hit forks the whole PR to human-merge-only (AGENTS.md Prime Directive #14: a mixed diff is not a proportion question). The regenerated skill-reference line moves to its own PR, which lands only after this retirement — until then check:skill-refs reads the committed line as stale against this branch's sources by design. Part of #11027 Co-Authored-By: Claude <noreply@anthropic.com>
…the governed-surface split check:skill-refs byte-compares the committed index against a fresh render of this tree's own sources, so the generator-owned line must ride the source PR: split out, it left this branch (and would have left main, between the two landings) red on that gate. Regenerated with gen:skill-refs, verified in sync. Part of #11027 Co-Authored-By: Claude <noreply@anthropic.com>
Uh oh!
There was an error while loading. Please reload this page.
Fixes#11027
Maintainer ruling (2026-08-22, 「同意所有」 item 11, recorded in comment 5380752244): B — retire
page.components[].responsive(ADR-0049 D2) and repair the four author-facing redirect texts in the same change. Playbook:spec-property-retirement.What this does
page.components[].responsivewas the LAST carrier of theResponsiveConfigper-breakpoint LAYOUT block — and the destination four shipped texts prescribed, verbatim, as the live alternative after #4876 retired its widget sibling. The card's two-repo census (tsc-probe methodology, positive + negative controls) measured the claim false: objectui's two complete implementations of the contract (useResponsiveConfig,ResponsiveProtocol) have zero callers, nothing reads.responsiveoff a page component, objectui's ownBaseSchemanever declared the key, and zero authored instances exist. So:retiredKey()atpage.zod.ts(the spec:DashboardWidgetSchema.responsive按断点建模 —— objectui#3173 维护者已裁决;目标 17.0.0 正式版,带回退条款 #4876/enforce-or-remove: DashboardWidgetSchema 的 5 个 dead 键(#4956 下钻首次给出裁决) #5010 family route; PageComponentSchema is strict, and the tombstone is what makes the refusal a prescription instead of "unrecognized key"). Prescription points atresponsiveStyles(ADR-0065) with the CSS translations.ResponsiveConfigSchema,BreakpointColumnMapSchema,BreakpointOrderMapSchemaandBreakpointName(+ their types) are removed: no other authorable carrier existed, and an exported value schema with no consumer reads as a capability (refactor(spec)!: remove the plugin sandboxing / integrity / approval config that never existed (#3896 follow-up) #3950; thePerformanceConfigSchemaprecedent recorded in the same file). Declared as fourRETIRED_DEFS_BY_MAJOR[18]entries.StyleMapSchema/ResponsiveStylesSchema(the live ADR-0065 channel) are untouched, with an explicit control pin.dashboard.zod.tsspec:DashboardWidgetSchema.responsive按断点建模 —— objectui#3173 维护者已裁决;目标 17.0.0 正式版,带回退条款 #4876 tombstone prescription — now records the correction and points atresponsiveStyles; its pin test asserts the corrected text.content/docs/references/ui/dashboard.mdx) — regenerated from 1.docs/protocol-upgrade-guide.md— regenerated from the corrected protocol-17 rationale + conversion summary.migrations/registry.tsprotocol-17 rationale prose (os migrate meta --from 16output) — dated CORRECTED sentence.DashboardWidgetSchema.responsive按断点建模 —— objectui#3173 维护者已裁决;目标 17.0.0 正式版,带回退条款 #4876 conversionsummary(copied verbatim intospec-changes.json+ the upgrade-guide table), theliveness/dashboard.jsonwidgets.responsive note,content/docs/ui/pages.mdx,content/docs/protocol/objectui/layout-dsl.mdx(theBreakpointColumnMapSchemareference card and theresponsive.hiddenOnsentence), and the fifth subtle site —responsive.zod.ts'shidden → hiddenOnalias curation justified byuseResponsiveConfig's return shape — leaves with the schema that hosted it.ResponsiveStylesSchema'scolumns/hiddenOn/orderguidance now names the retirement and gives the CSS that IS applied, instead of prescribing the dead sibling key.ui/PageComponent:responsive(protocol 18), D2 conversionpage-component-responsive-removed(mapPageComponents+stripKeys,retiredFromLoadPath: true, disjoint fixture covering the region-level and nested-container positions), wired into the step-18 chain with rationale.page.test.ts); the ADR-0122 iso-pin ledger rebalances 837 → 833 with a history entry.@objectstack/specminor (launch-window convention: breaking rides minor;scripts/check-changeset-no-major.mjspasses), with FROM → TO and the retirement kit.Note on the
skills/**hunk (split attempted and withdrawn)skills/objectstack-ui/references/_index.md(one regenerated line — the file's headline changes when the retired family leavesresponsive.zod.ts) was briefly split out to #11696 under the governed-surface one-hit rule, at the PM's instruction. The PM withdrew that instruction aftercheck:skill-refswent red on the split head — the gate byte-compares the committed index against a fresh render of the tree's own sources, so a generator-owned hunk cannot be green on either side of a split, and main would sit red between the two landings. The line is back in this PR (restored atd9bb37b2,check:skill-refsverified in sync locally); #11696 is closed. For the maintainer at landing time: with this generatedskills/**path in the diff, Prime Directive #14 as written still makes this PR human-merge-only unless the generated-artifact exception is extended to cover it (the exact #9866 shape that produced the.claude/workflows/docs-accuracy-audit.jsexception).Ratchet readings (route: whole-def deletion + one tombstoned key — the readings match the route)
authorable-surface/ui.json: −16 rows (the three defs' keys) +ui/PageComponent:responsive→… [RETIRED]. Deleted deliberately; the authorable-surface 的 tombstone 门禁可被手编基线绕过 —— 删掉基线行就删掉了证据(#4638 / #4643 已两次这样过绿) #4650 deletion gate verified each againstRETIRED_DEFS_BY_MAJOR[18].json-schema.manifest/ui.json: −4 keys — the gate fired first demanding the deliberate deletion + def registration (the authorable-surface 的 tombstone 门禁可被手编基线绕过 —— 删掉基线行就删掉了证据(#4638 / #4643 已两次这样过绿) #4650 path-3 self-evidence for the def-deletion route).api-surface/ui.json/export-origins/ui.json: −7 exports each.spec-changes.json/ upgrade guide: the corrected spec:DashboardWidgetSchema.responsive按断点建模 —— objectui#3173 维护者已裁决;目标 17.0.0 正式版,带回退条款 #4876 summary only — step-18 entries project at the major cut (verified: no existing step-18 conversion projects yet either).Liveness-ledger disposition (recorded, not drilled)
The walk drills ONE level through explicit
children;page.components[]sits two levels down (regions[].components[]) and no ledger file anywhere nestschildren, so no walked coordinate for this key can exist. Drillingpage/regionsone level would classify only region keys and leavecomponentsa NEW invisible blanket (the #4956 shape recursed, and worse than the recorded gap). Disposition:page/regionsstays RECORDED inundrilled-containers.baseline.json(the gap for the other ~12 component keys is real and stays visible); the retirement's machine-checked record is the authorable-surface[RETIRED]row +RETIRED_KEYS_BY_MAJOR[18](the #5898 aging clock) + the D2 conversion;page.jsoncarries a dated prose record in_noteand theregionsrow so a future driller inherits the verdict.Verification record
@objectstack/specbuild (tscsweep = tombstone channel)@objectstack/spectestsd9bb37b2)pnpm check:i18n(root; no form inputs existed for the key, bundles unchanged)EXIT=0captured explicitly)packages/lint(2271 tests) · CLImigrate-meta.e2e(14, replays the new conversion + idempotence) ·qa/dogfoodexpression-conformance (3) ·examples/app-showcasetsc + tests (362)check:react-declaration-parityThe third leg (premise check, per the ruling)
#11029 (cloud census,
repo:cloud) is still OPEN with no reading posted as of 2026-08-24. The ruling converts the cloud leg into a premise check: if the cloud greps surface a real consumer before landing, this PR stops and the card gets a report instead. Recorded status: pending, zero consumers surfaced so far. Whoever assembles the train: re-read #11029 before merge.Landing train — PARKS AS DRAFT
Per the #10986 rule and the claim comment (5394270160): this PR ships together with objectui#4773's fix (the two dead consumer implementations +
MobileComponentConfig) and the console pin bump, or not at all — and after #11029's cloud reading returns zero. Removing the spec exports before the objectui half lands would breakResponsiveProtocol'sSpecResponsiveConfigimport at the next pin bump, which is exactly why the train exists. Train assembly is the PM/maintainer's coordination item; this PR stays draft until the train is assembled.Out of scope (deliberate)
docs/adr/**(constraint) and dated audit/analysis records (docs/audits/2026-07-…ledger.mdrow,docs/notes/airtable-dashboard-analysis.mdx, ADR-0021's dashboard sketch) — historical measurements, left as records; the generated counts companion regenerated.content/docs/releases/**— untouched (repo rule); the changeset is the release-notes input.🤖 Generated with Claude Code
https://claude.ai/code/session_013Uia4VoGZrEQpskAy1Dq8j