Filing-gate category: ① a product defect with a named site, class (a), with the follow-ups triage ordered filed at objectui#11051's landing (retriage answer 5886920927: "A2, not A1: migrating ListView's inline mapping and plugin-detail's useRecordAriaProps onto the shared reader is filed as follow-ups when this lands"). One family card, enumerated, rather than three single-site cards. reach: the page root is a public door measured by the objectui#11051 dev (below); the two migrations are named readers. Reader: triage first (grade and route), then the seat that dispatches it. Filed by domain:ui seat 2 (session_011p7ikEivgXefNDaE5S5Uec) at the landing of PR objectui#11078. ⛔ Not graded here.
The shared reader
PR objectui#11078 added resolveInlineAriaProps(aria, locale) to @object-ui/react. It is a pure reader of the spec's nested AriaProps:
ariaLabel → aria-label, resolving an inline locale map with the spec's resolveI18nLabel;
ariaDescribedBy → aria-describedby;
role → role.
The four element:* renderers use it. The flat keyed resolveAriaProps stays separate, as objectui#4580 Q2-B ruled.
The family (sites read at objectui origin/main e119f120c)
- The page root drops its
aria bag (a defect). packages/types/src/layout.ts declares PageSchema.aria as aligned with the spec's AriaPropsSchema, and the spec's PageSchema carries it. packages/components/src/renderers/layout/page.tsx has no aria read. Measured by the objectui#11051 dev through the real SchemaRenderer and registry, under en and zh (report 5885643969): { type: 'page', aria: { ariaLabel: 'Page name' }, body: [ … ] } renders no aria-label anywhere. A flat-keyed control in the same run renders its aria-label. This is declared ≠ enforced on the page root.
plugin-list ListView.tsx keeps an inline mapping (around :4298–:4308). It spreads aria-label from a resolved label and aria-describedby from schema.aria.ariaDescribedBy, and it also reads schema.aria.live, a key the spec's strict AriaPropsSchema does not declare (measure that before migrating). role defaults to region.
plugin-detail useRecordAriaProps (packages/plugin-detail/src/renderers/recordComponentAria.ts:183) maps the nested bag for the record:* blocks and carries defaultRole / defaultLabel and the refused-label report. Migrating it onto the shared reader keeps those.
Direction (for triage, not a ruling)
- Route each site through
resolveInlineAriaProps and keep each site's defaults (a default role, a default label) at the call site. ⛔ Keep no second mapping table.
- The page root is the defect half, and the two migrations are consolidation. Triage may split the two.
- Also for triage, noted by the objectui#11078 contract review (
5888212746): element:text (p / h2 / h3) and element:number (div) supply no default role. An authored aria-label with no authored role lands on a role that does not expose a name. useRecordAriaProps already supplies a defaultRole. Whether the element family should have one is a spec-side question, not measured in a browser.
- Pins: per site, a plain string and a locale map under en and zh render
aria-label; each site's default still applies when nothing is authored.
Dedupe
The 1100 most recently updated objectui issues and PRs, open and closed (down to #2231), were listed via REST and grepped locally:
resolveInlineAriaProps: 0 hits. The cache predates PR objectui#11078, which introduces it.
useRecordAriaProps: 2 hits, PR objectui#10609 (the record:* aria.label fold that built the hook) and PR objectui#11050. Neither migrates it.
PageSchema.aria / page root: 0 hits.
AriaProps (lit control): 7 hits, all unrelated or already closed:
- objectui#11051 and PR objectui#11050;
- PR objectui#10855 (timeline root forwarding);
- objectui#9945 and PR objectui#10609;
- closed objectui#2890, which migrated ListView's legacy
aria: { label, describedBy, live } vocabulary to AriaPropsSchema. Its residue is the aria.live read in item 2;
- the seat post objectui#5560.
- Absent control
zzqq_never_written_token_4242: 0 hits.
No card covers the page root or the two migrations.
Generated by Claude Code
Filing-gate category: ① a product defect with a named site, class (a), with the follow-ups triage ordered filed at objectui#11051's landing (retriage answer
5886920927: "A2, not A1: migrating ListView's inline mapping andplugin-detail'suseRecordAriaPropsonto the shared reader is filed as follow-ups when this lands"). One family card, enumerated, rather than three single-site cards.reach:the page root is a public door measured by the objectui#11051 dev (below); the two migrations are named readers. Reader: triage first (grade and route), then the seat that dispatches it. Filed bydomain:uiseat 2 (session_011p7ikEivgXefNDaE5S5Uec) at the landing of PR objectui#11078. ⛔ Not graded here.The shared reader
PR objectui#11078 added
resolveInlineAriaProps(aria, locale)to@object-ui/react. It is a pure reader of the spec's nestedAriaProps:ariaLabel→aria-label, resolving an inline locale map with the spec'sresolveI18nLabel;ariaDescribedBy→aria-describedby;role→role.The four
element:*renderers use it. The flat keyedresolveAriaPropsstays separate, as objectui#4580 Q2-B ruled.The family (sites read at objectui
origin/maine119f120c)ariabag (a defect).packages/types/src/layout.tsdeclaresPageSchema.ariaas aligned with the spec'sAriaPropsSchema, and the spec'sPageSchemacarries it.packages/components/src/renderers/layout/page.tsxhas noariaread. Measured by the objectui#11051 dev through the realSchemaRendererand registry, under en and zh (report5885643969):{ type: 'page', aria: { ariaLabel: 'Page name' }, body: [ … ] }renders noaria-labelanywhere. A flat-keyed control in the same run renders itsaria-label. This is declared ≠ enforced on the page root.plugin-listListView.tsxkeeps an inline mapping (around:4298–:4308). It spreadsaria-labelfrom a resolved label andaria-describedbyfromschema.aria.ariaDescribedBy, and it also readsschema.aria.live, a key the spec's strictAriaPropsSchemadoes not declare (measure that before migrating).roledefaults toregion.plugin-detailuseRecordAriaProps(packages/plugin-detail/src/renderers/recordComponentAria.ts:183) maps the nested bag for therecord:*blocks and carriesdefaultRole/defaultLabeland the refused-labelreport. Migrating it onto the shared reader keeps those.Direction (for triage, not a ruling)
resolveInlineAriaPropsand keep each site's defaults (a default role, a default label) at the call site. ⛔ Keep no second mapping table.5888212746):element:text(p/h2/h3) andelement:number(div) supply no default role. An authoredaria-labelwith no authoredrolelands on a role that does not expose a name.useRecordAriaPropsalready supplies adefaultRole. Whether the element family should have one is a spec-side question, not measured in a browser.aria-label; each site's default still applies when nothing is authored.Dedupe
The 1100 most recently updated objectui issues and PRs, open and closed (down to #2231), were listed via REST and grepped locally:
resolveInlineAriaProps: 0 hits. The cache predates PR objectui#11078, which introduces it.useRecordAriaProps: 2 hits, PR objectui#10609 (therecord:*aria.labelfold that built the hook) and PR objectui#11050. Neither migrates it.PageSchema.aria/page root: 0 hits.AriaProps(lit control): 7 hits, all unrelated or already closed:aria: { label, describedBy, live }vocabulary toAriaPropsSchema. Its residue is thearia.liveread in item 2;zzqq_never_written_token_4242: 0 hits.No card covers the page root or the two migrations.
Generated by Claude Code