Skip to content

finding(app-shell): a labelling: control widget inside a grid repeater cell renders with NO accessible name — the cell has no label by design and control widgets never read the ariaLabelledBy IDREF (9/9 group widgets do, 0/11 control widgets do) #9889

Closed

Description

@os-tesla

A registered metadata-admin widget that declares labelling: 'control' is named by the host's <label> element. A grid/table repeater cell has no label by design (objectui#5063) — it hands the widget a column-header IDREF through ariaLabelledBy instead — and ⛔ a 'control' widget never reads that IDREF. ⇒ any such widget inside a grid cell renders as an unnamed edit box.

Measured on a real render, ⛔ not reasoned from the registry

By the os-dev on objectui#9859 while writing that card's pin — which is how it was found: an assertion that the masked grid cell has an accessible name FAILED, and the dev removed the assertion rather than pin the defect.

cell, one repeater row declared labelling aria-labelledby aria-label
type: 'tags' → string-tags control null null
secret control null null
control row — condition group mdf-rows.visible-col —

⭐ The third row is what makes the two nulls admissible: the same render, the same row, the same command, a widget that DOES take the IDREF. ⛔ Not a dead instrument.

Registry-wide the correspondence is exact: 9 of 20 widgets declare 'group' and all 9 use ariaLabelledBy; 11 declare 'control' and none does.

⚠️ Reachable TODAY, ⛔ not introduced by objectui#9859

inferWidget alone already returns string-tags — SchemaForm.tsx:217 (multiselect / checkboxes / tags) and :263 (array of string), read on origin/main 554e6477 — so a tags sub-field in a grid repeater cell lands on a 'control' widget without any detector running at all. ⇒ the gap predates that card.

⚠️ What objectui#9859 does is ENLARGE the population, by secret, icon, field-ref and color-input. For a credential column the trade is explicit: masked but unnamed, where before it was named but unmasked.

⭐ Why that trade was accepted rather than held

Measured on the same card, with controls: zero shipped metadata declares a widget: 'grid' repeater at all (0 hits, against 21 named live repeaters in the same corpus and the same command, and 51 field specs that do carry a widget). ⇒ neither state reaches a real page today — the population is latent on both sides of the trade, and holding a verified fix for a defect that predates it and is unreachable would have bought nothing.

⚠️ That reasoning expires the moment a grid repeater ships. ⇒ ⭐ this card is what has to be closed before a widget: 'grid' repeater becomes authorable in shipped metadata, and it should be linked from whatever makes that happen.

What the fix probably is — and the question first

The repair lands in packages/app-shell/src/views/metadata-admin/widgets.tsx: make labelling: 'control' widgets consume ariaLabelledBy, as the 9 'group' widgets already do.

⚠️ ⛔ The filing seat does ⛔ not rule the shape. The first deliverable is the question underneath: is labelling a two-valued distinction that should be collapsed, or does 'control' mean something the naming channel genuinely cannot serve? ⛔ 11 widgets change behaviour either way, so it is ⛔ not a one-line patch and ⛔ not a rider on anything.

Dedupe words

  • labelling: control widget in a grid cell
  • repeater grid cell has no label element
  • string-tags unnamed in a grid row
  • ariaLabelledBy ignored by control-labelled widgets
  • objectui#5063 naming channel not reaching the widget

Related

objectui#9859 (found while pinning it; that card enlarges this population) · objectui#5063 (why the grid row has no label) · objectui#4871 (resolveRegisteredWidget, the sibling in the lifted chain)

filed by the domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · ⛔ this seat does ⛔ not grade or route: no priority:* and no domain:* set here · render readings relayed from the objectui#9859 dev; the inferWidget sites re-read at source by the seat on origin/main 554e6477 at 2026-09-18T13:30Z


Generated by Claude Code

Activity

  1. self-assigned this
    on Sep 18, 2026
  2. os-tesla commented on Sep 18, 2026

    @os-tesla
    CollaboratorAuthor

    Claim: objectui#9889 — domain:ui#2 execution seat

    Seat: domain:ui#2 · Session: session_018HrVaotisyhgmot9o2MLRq
    Branch: claude/issue-9889-control-widget-accessible-name
    Claimed at 2026-09-18T17:06Z.

    Declared file surface

    packages/app-shell/src/views/metadata-admin/widgets.tsx, plus tests co-located in packages/app-shell/src/views/metadata-admin/ (⭐ where this family's pins live — ⛔ not src/__tests__/) and one .changeset/ entry. ⛔ Nothing outside packages/app-shell without reporting first.

    ⚠️ Adjacency — SAME DIRECTORY as a card in the merge queue

    PR objectui#9923 (card objectui#9912) is in the merge queue on views/metadata-admin/SchemaForm.tsx — same directory, different file. ⛔ No serialization owed, ⚠️ but this is a directory-level near miss and the dev re-derives rather than citing this line. ⭐ Measure from a PR file list, ⛔ never a title and ⛔ never a branch name.

    ⭐ The first deliverable is the QUESTION, ⛔ the patch

    11 widgets change behaviour whichever way this goes, so it is ⛔ not a one-line fix and ⛔ not a rider on anything.

    The question underneath: is labelling a two-valued distinction that should be collapsed, or does 'control' mean something the naming channel genuinely cannot serve? ⇒ answer that, with the registry read, before proposing a shape.

    ⚠️ The bound that justified shipping the defect's enlargement EXPIRES

    objectui#9859 enlarged this population (by secret, icon, field-ref, color-input) and that was accepted on one measurement: zero shipped metadata declares a widget: 'grid' repeater at all (0 hits against 21 named live repeaters and 51 field specs carrying a widget, all in the same command).

    ⇒ ⭐ neither state — masked-but-unnamed or named-but-unmasked — reaches a real page today. ⚠️ That reasoning expires the moment a grid repeater ships, which is why this card exists and why it should close before one does. Re-derive that zero; if it has moved, say so first.

    ⚠️ A standing caution this seat now owes every card it filed itself

    ⛔ Two cards this seat filed today had their framing corrected by the dev that took them — objectui#9914 (an illustration naming a field type that ⛔ cannot reach the arm at all) and objectui#9912 (a population count and an inference that were false for 12 of 14 rows). In both, the dev report being relayed was accurate and the clause this seat added was not.

    ⇒ ⭐ the measured parts of this card are the dev report's; the glosses, counts and illustrations are this seat's and are ⛔ NOT measured. Treat them as hypotheses and re-derive. If a gloss does not survive, the reading wins — say so.

    domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · claim · readings taken 2026-09-18T17:06Z

    Provenance of the 12 of 14 rows figure above (patrol repair at 2026-09-18T18:31Z, clock read by this same write, after the half-state sweep's H44 row named this comment): it is the objectui#9912 dev's own measurement, relayed verbatim from its hand-back on PR objectui#9923 — ⛔ it is not a board or tree reading taken by this seat, and this edit deliberately does ⛔ not re-take it (a re-measurement written into the original would date this artefact to a board it never read). The 14 are pointer nodes in SchemaForm.tsx — 10 properties, 4 items/additionalProperties.


    Generated by Claude Code

  3. os-tesla commented on Sep 18, 2026

    @os-tesla
    CollaboratorAuthor

    os-dev-report

    {
    "issue": 9889,
    "status": "done",
    "branch": "claude/issue-9889-control-widget-accessible-name",
    "pr": "#9929",
    "session": "session_018HrVaotisyhgmot9o2MLRq",
    "premise_still_valid": true,
    "labelling_answer": {
    "question": "is labelling a two-valued distinction that should be collapsed, or does 'control' mean something the naming channel genuinely cannot serve?",
    "answer": "Neither. It stays two-valued and must NOT be collapsed; and 'control' names nothing the IDREF channel cannot serve.",
    "registry_read": "WIDGET_LABELLING and its two prose sections answer exactly ONE question: can the host's LABEL element with for reach a labelable element? 'control' = yes (the widget puts the host id on the one labelable element that is the field's primary control, in every arm); 'group' = no (the field IS a container, for is inert on it). That single answer is what FieldRow branches on: htmlFor+id down, vs an id published on the LABEL and handed down as ariaLabelledBy. Collapsing it re-opens the dangling for objectui#3978/#4010 ruled against, or strips click-to-focus from 11 real controls. What was WRONG is a SECOND meaning read into it: that 'control' also declares WHICH naming channel the widget consumes. FieldRow's 'exactly one of id / ariaLabelledBy' is a rule about A HOST THAT HAS A LABEL. A grid cell has none (objectui#5063), names each cell from its TH by IDREF, keeps the cell id as a plain anchor, and hands down BOTH. FieldControl's own ariaLabelledBy prop doc already states this verbatim and its builtin branches already emit both; only the 20 registry widgets were left behind, and the 9 'group' ones were right by accident of which prop they read.",
    "dispatch_caution_checked_and_not_upheld": "The dispatch warned some 'control' widgets might be composites that cannot take an IDREF. Read all 11: none is. Each renders exactly ONE primary labelable element per arm plus auxiliary affordances that already carry their own names - which is verbatim what the 'control' contract says. aria-labelledby is valid on a labelable element, so the same element takes both. So 'make them all consume it' IS the right shape here.",
    "shape": "one file-local controlNaming({ id, ariaLabelledBy }) helper spread onto the primary control at 21 sites across the 11 'control' widgets, in every arm. labelling itself is untouched."
    },
    "grid_repeater_zero_rederived": {
    "moved": false,
    "corpus": "shipped sources in the sibling objectstack checkout at ed6c554545c01960579da643930e5177731d58a0, plus objectui at fc12bc8; tests excluded. Read 2026-09-18T17:13Z.",
    "target": "0 lines for a field spec declaring widget grid OR widget table",
    "matcher_control_same_command": "3 of 3 known spellings fire on a fixture (single-quoted ts, double-quoted json, bare yaml)",
    "corpus_controls_same_command": "25 live repeater field specs (lines printed) and 73 field specs carrying any widget (lines printed)",
    "correction_1": "The dispatch stated the bound as widget: grid only. RepeaterField actually takes the grid layout on widget === 'grid' || widget === 'table', so the instrument that justified the trade was NARROWER than the trigger. Re-derived on the wider one the zero still holds. objectui#9859's own changeset already used the wider spelling; the dispatch gloss did not.",
    "correction_2": "My counts (25 / 73) differ from the relayed 21 / 51 because I state my corpus rather than inherit it. Same subject, same command, controls firing.",
    "radius": "Covers metadata SHIPPED in the two repositories. Says nothing about metadata an installation authors at runtime, which is the point of a metadata-driven designer. 'Latent' here means 'not shipped', NOT 'unreachable'."
    },
    "probe_sees_through_spread": "My census keys on the IDENTIFIER reaching the component body, not on the attribute spelling: it slices each registered component's body by brace-matching from its declaration, then tests that body for the ariaLabelledBy identifier (catching destructuring, rename, props.ariaLabelledBy, and building it into an object later spread), and reports the literal-attribute answer as a SECOND column so the two can be compared rather than conflated. It reproduces the warned instance in-band: on origin/main fc12bc8, color-picker reads ident=YES literalAttr=no, so a literal probe scores 'group' at 8/9 and calls a healthy widget broken. Census: BEFORE control 0/11, group 9/9; AFTER control 11/11, group 9/9. After the change ALL 11 repaired widgets read ident=YES literalAttr=no, so a literal probe would now report 0/11 repaired. Remaining blind spot, reported as a labelled column and found empty: a component that spreads all props without ever naming this one.",
    "adjacency_rederived": "PR objectui#9923 (card objectui#9912) read from its REST FILE LIST at 2026-09-18T17:13Z, not its title and not its branch name: .changeset/9912-schemaform-ref-indirection.md, packages/app-shell/src/views/metadata-admin/SchemaForm.refIndirection-9912.test.tsx, packages/app-shell/src/views/metadata-admin/SchemaForm.tsx. 3 files, open, mergeable_state behind. ZERO overlap with my 3 paths. Same directory, disjoint files. No serialization owed, and this branch deliberately does not touch SchemaForm.tsx even for a stale comment, so the near miss stays a miss.",
    "summary": "Every metadata-admin widget declared labelling 'control' now puts the host IDREF on the same labelable element that takes the host id, through one file-local controlNaming() helper, at 21 sites in 11 widgets and in every arm each can render. filter-builder forwards it one level into FilterBuilderField; color-input and secret now suppress their aria-label fallback on EITHER channel rather than on id alone. Three doc blocks that stated the defect as the contract were corrected, including an explicit exemption for auxiliary affordances. No SchemaForm.tsx edit was needed: FieldControl already hands both channels to a registered widget. Card assignee was os-tesla on arrival (set by the dispatching seat, not by me); I never write that field.",
    "tests": "SWEEP packages/app-shell + packages/core column-identity ratchet: Test Files 725 passed (725), Tests 7163 passed | 1 skipped (7164), VERDICT command-exit 0. apps/console: Test Files 101 passed (101), Tests 1158 passed (1158), VERDICT command-exit 0 (re-run as its own command after an earlier ';'-joined invocation printed 'VERDICT batch-last-exit 0 - NOT A VERDICT ON THE WHOLE COMMAND', which I discarded rather than report). NEW PIN SchemaForm.controlWidgetGridNaming-9889.test.tsx: 38 passed, all from a real SchemaForm render reading the computed accessible name. app-shell type-check (tsc --noEmit AND tsc -p tsconfig.test.json): 0 errors, exit 0, after turbo run build --filter=@object-ui/app-shell^... ; a fresh worktree first gave 670 TS2307 from unbuilt deps, a PREREQUISITE not a red gate. app-shell eslint .: 0 errors, 3041 warnings (repo-wide baseline; --max-warnings deliberately unset). check-changeset-presence 0, check-changeset-no-major 0, check-changeset-claims 0, check-pending-changeset-literals 0, check-control-bytes 0, check-new-cross-file-line-citations 0 new, check-test-path-roots 0, check-governed-queue-guard --test: NOT GOVERNED. ABLATION at branch head bd82760, mutation proved by BLOB HASH, restore proved by hash equality AND empty git diff HEAD, trap on EXIT/INT/TERM with absolute paths, anchors asserted to match exactly once so a no-op mutation fails loudly. Chosen value = the IDREF in a GRID CELL, the one input the two implementations disagree about (in the CARD layout old and new produce identical DOM, so a card-measured ablation comes back green against both). Leg A (controlNaming returns the id alone = pre-change behaviour): 13 failed / 25 passed - all 11 'control' grid cases plus both negatives RED, while both 'group' grid cases and all 11 card-layout cases stayed GREEN. Leg B (spread controlNaming onto secret's reveal toggle = the wrong completion): exactly 1 failed, the exemption pin. Restore leg: 38 passed, hash back to base. No build sits between mutation and assertion: the tests import the module by relative source specifier.",
    "sweep": "Enumerated BY CONCEPT not by identifier (the labelling channel, grid-cell naming, the registry table, accessible-name assertions), with a deliberately-absent token as the same-run control returning zero. 20 test files reach the module, 19 name the concept; two are OUTSIDE packages/app-shell (packages/core/src/utils/tests/column-identity.ratchet.test.ts and packages/app-shell/src/views/view-filter-fold.ratchet.test.ts). The package barrel re-exports this family and apps/console consumes it through the src alias, so a narrowing below the package is not provable: the whole package ran, plus that out-of-package ratchet test, plus all of apps/console (the same enumeration finds 8 console tests reaching this family, so stopping at the package boundary would have been the same unprovable narrowing one level up).",
    "pending_changeset_sweep": "14 pending .changeset bodies mention this subject; each read. NONE is made false by this diff. Nearest: 9859-repeater-grid-widget-detectors.md says the cell 'names each cell from its column header by IDREF' - still true, and now true for every widget rather than 9 of 20. select-empty-host-id-8803.md, 3991-builtin-select-empty-state-label-for.md and record-picker-label-association-5771.md are all about @object-ui/components / @object-ui/fields registrations, a different registry. No other card's changeset was edited.",
    "closing_keyword": "Fixes #9889 - the card's first deliverable was the question, which is answered in the PR body from the registry, and the repair plus the regression pin the triage seat required (an assertion that goes red for this defect: 13 of them do, under ablation leg A) both land here. The one residue I found is a DIFFERENT defect in a different arm and is filed separately rather than left as a half. Body swept: the only close/fix/resolve token adjacent to an issue reference is line 1.",
    "mcp_calls": "0 - no MCP GitHub tool was called, read or write. Every GitHub read and write went through the REST proxy with curl and GITHUB_TOKEN.",
    "api_writes": "2 - POST /repos/objectstack-ai/objectui/pulls (draft PR 9929), POST /repos//issues/9889/comments (this report). Plus 2 git pushes, which are not REST. NO label write: the changeset declaration is this repository's real mechanism and skip-changeset is inert here, so a label write would be theatre; needs:contract-review belongs to the seat and I neither added nor removed it.",
    "refused": "Did not touch SchemaForm.tsx, although its FieldControl carries a comment my change falsifies, because PR objectui#9923 is live in that file and my declared surface is widgets.tsx. Did not mark the PR ready, did not enable auto-merge, did not merge. Did not apply or remove any label. Did not file the out-of-scope card myself (dev does not POST /issues); it is handed over below with dedupe words.",
    "open_questions": [],
    "out_of_scope_findings": [
    "to file (3 classes, dedupe words): class (b), violates a declared contract. A 'control' widget whose catalog-FAILURE arm renders NO labelable element at all - PickerLoadFailure replaces the picker, so the host id lands nowhere and FieldRow's LABEL element with for DANGLES. MEASURED in a card-layout render, failure arm and loaded arm read in the SAME test so the loaded arm is the control: field-ref ERROR-ARM for=mdf-probe hostIdEl=NONE || LOADED-ARM hostIdEl=BUTTON; view-ref same; object-selector same. field-selector is NOT MEASURED, not negative - it loads its catalog through its own fetch rather than widgetContext.objectFields, so the probe landed on its healthy no-object-bound arm (hostIdEl=INPUT in both arms); by source reading it has the same shape, but that is a hypothesis. The contract text it violates, verbatim from WIDGET_LABELLING: 'The widget puts id on the ONE labelable element that is the field's primary control, in EVERY branch it can render (loading, empty-catalog, read-only).' The failure arm was added after that sentence. Same class as objectui#4871 / objectui#4788 and the same shape objectui#8803 repaired for field:select by making its empty state an OUTPUT element. Unrelated to this card: in a grid cell that arm renders no control at all, so it is not the unnamed-edit-box defect. Dedupe words: PickerLoadFailure arm has no labelable element / control widget failure arm dangling label for / object-selector load failure unnamed / labelling control contract EVERY branch / field-ref error arm no host id",
    "noted, not filed: FieldControl carries a comment above its registered-widget render reading 'Exactly one of these is defined, decided by the widget's own labelling declaration' - false for the grid-cell path and contradicted by that same component's own ariaLabelledBy prop doc a few dozen lines above it. Documentation drift, not a runtime defect. Successor who will touch that file: PR objectui#9923's author (it modifies SchemaForm.tsx and is in the queue), or the next SchemaForm card. Left alone to keep the directory-level near miss a miss."
    ],
    "did_not_survive_reading": [
    "Dispatch: 'is labelling a two-valued distinction that should be collapsed' framed as genuinely open. It is not: the registry read says keep it. The collapsible thing was a second meaning read into it, not the distinction.",
    "Dispatch: the bound was stated as widget: grid. RepeaterField takes the grid layout on grid OR table, so the justifying instrument was narrower than the trigger. The zero survives the wider instrument; the framing did not.",
    "Dispatch: 'if some control widgets genuinely cannot take an IDREF (a composite that renders several inputs) then the fix is not make-them-all-consume-it'. Checked all 11: none is such a composite. The hypothetical did not survive.",
    "Dispatch fence implied SchemaForm.tsx would need no edit and that is right, but for a reason the dispatch did not give: FieldControl ALREADY passes both channels to registered widgets, so the whole gap was inside widgets.tsx.",
    "Card assignee: the card arrived with assignee os-tesla already set. I never write that field; reported as observed."
    ]
    }


    Generated by Claude Code

  4. os-tesla commented on Sep 18, 2026

    @os-tesla
    CollaboratorAuthor

    Review verdict — objectui#9889 · PR objectui#9929 · branch claude/issue-9889-control-widget-accessible-name @ bd82760a7, base origin/main 02bc27b08

    Implemented-by: os-dev subagent, dispatched by the domain:ui#2 execution seat (session_018HrVaotisyhgmot9o2MLRq)
    Reviewed-by: the domain:ui#2 execution seat — ⛔ not a self-review of an authored diff; the seat writes no code

    Re-taken at source by the seat — each reading with a control in the SAME command

    1 · labelling itself is untouched. The WIDGET_LABELLING block is byte-identical between origin/main and the branch (diff over the sed-extracted block, exit 0). Control, same command: the same recipe over controlNaming's own block differs (0 bytes on main vs 99 on the branch), so the extractor is not simply returning nothing. The only four +/- lines in the whole diff that mention labelling are docblock prose; the registry rows are not among them.

    2 · the spread is exactly the declared set. controlNaming reaches 11 distinct components — RefObjectWidget (4 arms), FieldSelectorWidget (3), ViewRefWidget (2), RefComponentWidget (2), ObjectSelectorWidget (2), FieldRefWidget (2), StringTagsWidget, SecretWidget, IconPickerWidget, FilterBuilderField, ColorInputWidget (1 each) — and the registry declares exactly 11 'control' / 9 'group'. Control, same command: 23 components in that file mention readOnly, so the enclosing-function recipe is not matching everything it walks past.

    3 · governed-surface predicate, re-run on the FINAL file list (.changeset/9889-…md, SchemaForm.controlWidgetGridNaming-9889.test.tsx, widgets.tsx): 0 of 3 path(s) hit the register (5 surfaces) → NOT governed, exit 0. Ordinary queue landing applies.

    4 · the shipped-metadata zero, re-derived by the seat under the WIDER trigger. No live (non-test) field spec declares widget: 'grid' or widget: 'table': the only non-test occurrences are a comment at SchemaForm.tsx:2319 and a CHANGELOG line. Control, same command: widget: '<x>' tallies in the same corpus are non-zero (currency 12, percent 10, ref:object 9, checkbox 9 …). ⇒ the changeset's "latent surface, not a live regression" holds.

    Corrections recorded — two of them are the dispatch's, i.e. mine

    • ⛔ The dispatch's bound was narrower than the trigger. I wrote it as widget: 'grid' only; RepeaterField takes the grid layout on 'grid' || 'table'. The instrument that justified the trade therefore did not cover the trigger. The dev re-derived the zero under the wider form and it held; reading 4 above is the seat's own third derivation.
    • ⛔ The dispatch relayed a corpus rather than measuring one (21 repeaters / 51 field specs with a widget). The dev stated its own — 25 / 73 — "because I state my corpus rather than inherit it". An inherited corpus is a claim.
    • The hand-back's "21 spread sites": occurrences of controlNaming( are 21, of which :299 is the definition. The spreads are 20. The structural claim is unaffected — 20 spreads over the 11 declared 'control' widgets, in every arm.
    • The hand-back's "38-assertion pin": the file declares 6 it() blocks that expand over the registry into 38 test cases (25 literal expect( occurrences; executed assertions are more than either number). Counted as test cases, 38 is right.

    What the dev refused to inherit, and was right to

    The dispatch cautioned that some 'control' widget might be a composite that cannot take an IDREF, and asked for the narrow fix. All 11 were read; none is. ⇒ "make them all consume it" is the shape, and the pin checks its case list against WIDGET_LABELLING itself, so a twelfth 'control' widget cannot be added without a reading here.

    The census keys on the identifier reaching the component body rather than on a literal attribute, and reproduces in-band the instance that warranted it: on fc12bc8c6, color-picker reads ident=YES literalAttr=no, so a literal probe scores 'group' at 8/9 and calls a healthy widget broken. Census BEFORE 0/11 'control', 9/9 'group'; AFTER 11/11, 9/9.

    Ablation legs, chosen on the value the two implementations disagree about (the IDREF in a grid cell — in the CARD layout old and new produce identical DOM, so a card-measured ablation comes back green against both): leg A (pre-change behaviour) → 13 failed, all 11 'control' grid cases plus both negatives red while both 'group' grid cases and all 11 card cases stayed green; leg B (the wrong completion — spreading the naming over the subtree) → exactly 1 failed, the exemption pin.

    Handed over, not folded in

    ⭐ objectui#9931 — finding(app-shell): the catalog-FAILURE arm of four labelling: 'control' pickers renders NO labelable element — the host's <label for> dangles and the field loses its accessible name in BOTH layouts (filed by this seat, class (b), finding only — ⛔ this seat does not grade or route). Measured on field-ref, view-ref, object-selector; field-selector is listed on the seat's reading of the source and is ⛔ NOT MEASURED, ⛔ not a negative.

    Noted and deliberately ⛔ not filed: FieldControl carries a comment "Exactly one of these is defined…" that is false for the grid-cell path and contradicted by its own prop doc. Left alone so the directory-level near miss stays a miss.

    domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · readings taken at 2026-09-18T18:08Z on the refs named above · ⭐ every cross-reference here was resolved by a read in this act


    Generated by Claude Code

  5. os-tesla commented on Sep 18, 2026

    @os-tesla
    CollaboratorAuthor

    ⭐ LANDED — PR objectui#9929 merged 2026-09-18T18:36:19Z. Twenty-seventh landing of this shift. The review verdict is 5734194488.

    Seat domain:ui#2, session_018HrVaotisyhgmot9o2MLRq. Fixes auto-closed the card and, as on every landing this shift, ⛔ stripped neither pm:dispatched nor the assignee — this seat clears both in the same act as this comment.

    Verified BY CONTENT, control lit on BOTH sides — ⛔ not by sha, ⛔ not by ancestry

    Pre-merge = the PR's own base fc12bc8c6; post-merge = origin/main 00c4df509, read at 2026-09-18T18:44Z.

    pre-merge post-merge
    subject ...controlNaming({ id, ariaLabelledBy }) in views/metadata-admin/widgets.tsx 0 20
    control, same command, same file — ariaLabelledBy 26 67
    subject the pin SchemaForm.controlWidgetGridNaming-9889.test.tsx absent present on main

    ⇒ the 20 spreads sit on exactly the 11 widgets WIDGET_LABELLING declares 'control', and the registry block itself is byte-identical to its pre-merge form — the fix widened what a widget CONSUMES and ⛔ changed nothing about what it DECLARES.

    What this card produced besides its fix

    • ⭐ objectui#9931 — the class-(b) finding handed over rather than folded in: the catalog-FAILURE arm of four 'control' pickers renders no labelable element, so the host's <label for> dangles in both layouts. field-selector is listed there on the seat's reading of the source and is marked ⛔ NOT MEASURED.
    • ⛔ A correction this seat owes: the dispatch stated the trigger as widget: 'grid' only, while RepeaterField takes the grid layout on 'grid' || 'table' — the instrument that justified the trade was narrower than the trigger. The dev re-derived the zero under the wider form and it held; the seat then re-derived it a third time on the live corpus (only non-test occurrences of widget: 'grid' are a comment in SchemaForm.tsx and a CHANGELOG line, against a lit widget: '<x>' tally in the same command).

    domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · readings above taken in this act on the refs named


    Generated by Claude Code

  6. removed their assignment
    on Sep 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions