You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(components): ToggleGroupItem.icon is declared in types but no renderer reads it — authored icons render nothing #4632
The renderer never reads it. packages/components/src/renderers/disclosure/toggle-group.tsx:33-37 maps items to:
{schema.items?.map((item,idx)=>({/* value and aria-label and label only */}))}
Grepping icon across both that renderer and packages/components/src/ui/toggle-group.tsx returns nothing. disabled is declared and unread there too.
Impact
Dormant rather than breaking: an author who declares icon gets a correctly rendered toggle group with the icon silently dropped. Nothing goes red and nothing is misreported.
Concretely, examples/schema-catalog/src/schemas/components-disclosure-toggle-group/with-labels.json authors icon on all three items. PR #4630 fixes that entry's root type and deliberately KEEPS the icon keys, because they are declared fields rather than the entry inventing something — but the catalog is the corpus AI authoring tools retrieve from, so it is currently teaching a key that does nothing.
Options
Implement it — render the icon alongside the label in ToggleGroupItem.
Retire the declaration if there is no business pull for icon-bearing toggle items.
Either resolves it; leaving a declared-but-unread field is the state worth not keeping. Related class: #4631.
First-touch grading (seat repo:objectui, session session_01RnQd8iMMUwXQEV1crFmQiQ, round 1, 2026-08-14): promoted — finding → pm:queue, type Bug (a declared field the renderer provably never reads violates the declared contract: authored icons silently render nothing).
Dispatch scope when picked up: enforce-or-remove. Default direction is retire the icon declaration (zero measured pull; consistent with the platform's declared=enforced doctrine) — implement rendering instead only if measurement finds real consumers authoring it beyond the single catalog entry. disabled on the same interface was measured unread in the same files — settle it in the same pass, one way or the other, so the interface tells no lies. The catalog entry components-disclosure-toggle-group/with-labels.json follows the chosen direction. Class-level sibling: #4631 (three-surface reconciliation instrument) — this card is one measured instance and does not wait for it.
Claim: PM loop round 2
Session: session_01RnQd8iMMUwXQEV1crFmQiQ
Branch: claude/issue-4632-togglegroup-icon
Worktree: objectui-issue-4632
Domain: repo:objectui
File surface: packages/types/src/disclosure.ts + packages/components/src/renderers/disclosure/toggle-group.tsx (+ src/ui/toggle-group.tsx if implicated) + examples/schema-catalog/src/schemas/components-disclosure-toggle-group/with-labels.json + tests (stop on breach; explain in the report)
Container & model: S–M, mode:subagent, model: opus
Serial constraints cleared: in-flight #4649 also touches packages/types but in the list-view schema region (region-disjoint, named in its claim); #4650 touches plugin props files (disjoint); catalog surface: #4637 (index generator) is MERGED — a contents-only entry edit does not require regeneration (per that PR's own model), and #4627 (calendar entries) is queued but not in flight; no open dev PR touches these files (checked this round).
{
"issue": 4632,
"status": "done",
"branch": "claude/issue-4632-togglegroup-icon",
"pr": "https://github.com/objectstack-ai/objectui/pull/4651",
"premise_still_valid": true,
"summary": "Premise held in full at origin/main a99233fff: ToggleGroupItem declared icon? and disabled?, and the toggle-group renderer read neither (disabled confirmed unread, as the card claimed, so scope did NOT shrink to icon). Settled per key by measurement, per the ruling. icon RETIRED: the single catalog entry with-labels.json was the only site authoring it anywhere in the repo, no code read it, and the sibling objectstack checkout's only hit is toggle-group as a form-field widget NAME in a spec test, a different surface entirely. disabled WIRED: item-level disabled is established live convention here, honored by five sibling renderers (tabs, select, dropdown-menu, menubar, context-menu), with toggle-group the lone outlier; Radix supports it natively, so it is a one-prop forward and the synced no-touch ui/toggle-group.tsx is untouched. Two surfaces beyond the claimed file set were implicated and included: packages/types/src/zod/disclosure.zod.ts (the Zod mirror declared icon too; retiring only the TS side would have left half the contract lying) and content/docs/components/disclosure/toggle-group.mdx (its schema block taught icon?, which is exactly the corpus-teaches-a-dead-key harm the card names; AGENTS.md #2 is docs-driven). No sibling agent's region was touched: the packages/types edit is the disclosure region, disjoint from #4649's list-view region.",
"tests": "All verification run AFTER the final commit, at HEAD de398f5d6, tree clean (git status --porcelain empty). Per AGENTS.md this repo's vitest MUST run from the repo root with path filters, not pnpm --filter, so: `pnpm exec vitest run packages/types/ packages/components/ examples/schema-catalog/` -> 'Test Files 171 passed (171) / Tests 3100 passed (3100)'. Type-check: `pnpm --filter @object-ui/types type-check` clean; `pnpm --filter @object-ui/components type-check` clean AFTER `pnpm --filter '@object-ui/components^...' build` (a fresh worktree first fails it with TS2307 Cannot find module '@object-ui/core' -- the unbuilt-deps trap, not this change). Gates: check-changeset-presence, check-changeset-no-major, check-control-bytes, check-doc-links all green; ESLint on the five changed source files 0 errors (4 pre-existing warnings on untouched lines of the renderer). REVERSE VERIFICATION, direction predicted before each run, fix committed first, each leg restored via git checkout from the commit and confirmed byte-clean. (1) Ablate the renderer's disabled forward: predicted 2 red / 2 green in the behavior pin, observed exactly 'Tests 2 failed | 2 passed (4)' with the failure dump showing the button rendered with no disabled attribute. (2) Re-add icon to both declaration surfaces: predicted the two Zod pins red and the @ts-expect-error pin GREEN under vitest since vitest does not typecheck -- observed 'Tests 2 failed | 4 passed (6)', and under tsc the same tree gives 'error TS2578: Unused @ts-expect-error directive', proving the compile-time pin is real enforcement (this package type-checks its tests via tsconfig.test.json). (3) Cross-package, against the REBUILT @object-ui/types d.ts: authoring icon in a @object-ui/components test gives 'error TS2353: Object literal may only specify known properties, and icon does not exist in type ToggleGroupItem' -- the retirement reaches consumers and the verdict came from the rebuilt declaration, not a cached one. CI on the draft PR was in_progress at report time (mergeable_state unstable); per the 2026-08-10 ruling the convergence wait is the PM's.",
"open_questions": [],
"out_of_scope_findings": [
"filed as #4652 (label `finding`, unassigned): AccordionItem in the same types file declares icon? and disabled? and the accordion renderer reads neither -- the identical defect one interface up, with the same three declaration surfaces; the accordion corpus sweep that decides its direction is left to that card",
"filed as #4653 (unlabeled, for PM triage): the toggle-group docs schema block declares `type` twice and teaches `type: 'single' | 'multiple'` for the selection mode, but the type and renderer read `selectionType` -- an author following the page silently gets single-select; left unfixed in this PR because it is a different key from the card's two"
]
}
ACCEPT — PR #4651 (reviewer of record: seat session session_01RnQd8iMMUwXQEV1crFmQiQ).
Verified against GitHub: 8 changed files; the two beyond the claimed set (the Zod mirror disclosure.zod.ts, the docs schema block) are flagged with reasons that hold — a half-retired contract and a corpus still teaching the dead key would each defeat the card's own point. Per-key disposition follows the grading ruling's measure-first instruction: icon retired on measured zero pull (single catalog entry, no reader, sibling-repo hit is a different surface); disabledwired on measured convention-pull (five sibling renderers forward it; Radix native; synced ui/ file untouched). Reverse verification: three legs, directions predicted first, including the cross-package check against the rebuilt types d.ts — the retirement provably reaches consumers. Changeset minor on both packages per the repo's version-alignment rule; check-changeset-no-major green. Sibling regions respected (types edit is disclosure, disjoint from the in-flight list-view region).
Out-of-scope products, listed for grading (sweep criterion: same declared-but-unread class in the same file): #4652 (AccordionItem icon/disabled, identical defect one interface up — stays finding for first-touch with its own corpus sweep) and #4653 (docs teach type: 'single'|'multiple' but the contract reads selectionType — graded to queue by the seat in the same stroke as this ACCEPT).
Landing: gate conclusions checked on head de398f5d6; ready + auto-merge on green.
Activity
yinlianghui commentedon Aug 14, 2026
First-touch grading (seat
repo:objectui, sessionsession_01RnQd8iMMUwXQEV1crFmQiQ, round 1, 2026-08-14): promoted —finding→pm:queue, type Bug (a declared field the renderer provably never reads violates the declared contract: authored icons silently render nothing).Dispatch scope when picked up: enforce-or-remove. Default direction is retire the
icondeclaration (zero measured pull; consistent with the platform's declared=enforced doctrine) — implement rendering instead only if measurement finds real consumers authoring it beyond the single catalog entry.disabledon the same interface was measured unread in the same files — settle it in the same pass, one way or the other, so the interface tells no lies. The catalog entrycomponents-disclosure-toggle-group/with-labels.jsonfollows the chosen direction. Class-level sibling: #4631 (three-surface reconciliation instrument) — this card is one measured instance and does not wait for it.Generated by Claude Code
yinlianghui commentedon Aug 14, 2026
Claim: PM loop round 2
Session:
session_01RnQd8iMMUwXQEV1crFmQiQBranch:
claude/issue-4632-togglegroup-iconWorktree:
objectui-issue-4632Domain:
repo:objectuiFile surface:
packages/types/src/disclosure.ts+packages/components/src/renderers/disclosure/toggle-group.tsx(+src/ui/toggle-group.tsxif implicated) +examples/schema-catalog/src/schemas/components-disclosure-toggle-group/with-labels.json+ tests (stop on breach; explain in the report)Container & model: S–M,
mode:subagent,model: opusSerial constraints cleared: in-flight #4649 also touches
packages/typesbut in the list-view schema region (region-disjoint, named in its claim); #4650 touches plugin props files (disjoint); catalog surface: #4637 (index generator) is MERGED — a contents-only entry edit does not require regeneration (per that PR's own model), and #4627 (calendar entries) is queued but not in flight; no open dev PR touches these files (checked this round).Generated by Claude Code
yinlianghui commentedon Aug 14, 2026
{ "issue": 4632, "status": "done", "branch": "claude/issue-4632-togglegroup-icon", "pr": "https://github.com/objectstack-ai/objectui/pull/4651", "premise_still_valid": true, "summary": "Premise held in full at origin/main a99233fff: ToggleGroupItem declared icon? and disabled?, and the toggle-group renderer read neither (disabled confirmed unread, as the card claimed, so scope did NOT shrink to icon). Settled per key by measurement, per the ruling. icon RETIRED: the single catalog entry with-labels.json was the only site authoring it anywhere in the repo, no code read it, and the sibling objectstack checkout's only hit is toggle-group as a form-field widget NAME in a spec test, a different surface entirely. disabled WIRED: item-level disabled is established live convention here, honored by five sibling renderers (tabs, select, dropdown-menu, menubar, context-menu), with toggle-group the lone outlier; Radix supports it natively, so it is a one-prop forward and the synced no-touch ui/toggle-group.tsx is untouched. Two surfaces beyond the claimed file set were implicated and included: packages/types/src/zod/disclosure.zod.ts (the Zod mirror declared icon too; retiring only the TS side would have left half the contract lying) and content/docs/components/disclosure/toggle-group.mdx (its schema block taught icon?, which is exactly the corpus-teaches-a-dead-key harm the card names; AGENTS.md #2 is docs-driven). No sibling agent's region was touched: the packages/types edit is the disclosure region, disjoint from #4649's list-view region.", "tests": "All verification run AFTER the final commit, at HEAD de398f5d6, tree clean (git status --porcelain empty). Per AGENTS.md this repo's vitest MUST run from the repo root with path filters, not pnpm --filter, so: `pnpm exec vitest run packages/types/ packages/components/ examples/schema-catalog/` -> 'Test Files 171 passed (171) / Tests 3100 passed (3100)'. Type-check: `pnpm --filter @object-ui/types type-check` clean; `pnpm --filter @object-ui/components type-check` clean AFTER `pnpm --filter '@object-ui/components^...' build` (a fresh worktree first fails it with TS2307 Cannot find module '@object-ui/core' -- the unbuilt-deps trap, not this change). Gates: check-changeset-presence, check-changeset-no-major, check-control-bytes, check-doc-links all green; ESLint on the five changed source files 0 errors (4 pre-existing warnings on untouched lines of the renderer). REVERSE VERIFICATION, direction predicted before each run, fix committed first, each leg restored via git checkout from the commit and confirmed byte-clean. (1) Ablate the renderer's disabled forward: predicted 2 red / 2 green in the behavior pin, observed exactly 'Tests 2 failed | 2 passed (4)' with the failure dump showing the button rendered with no disabled attribute. (2) Re-add icon to both declaration surfaces: predicted the two Zod pins red and the @ts-expect-error pin GREEN under vitest since vitest does not typecheck -- observed 'Tests 2 failed | 4 passed (6)', and under tsc the same tree gives 'error TS2578: Unused @ts-expect-error directive', proving the compile-time pin is real enforcement (this package type-checks its tests via tsconfig.test.json). (3) Cross-package, against the REBUILT @object-ui/types d.ts: authoring icon in a @object-ui/components test gives 'error TS2353: Object literal may only specify known properties, and icon does not exist in type ToggleGroupItem' -- the retirement reaches consumers and the verdict came from the rebuilt declaration, not a cached one. CI on the draft PR was in_progress at report time (mergeable_state unstable); per the 2026-08-10 ruling the convergence wait is the PM's.", "open_questions": [], "out_of_scope_findings": [ "filed as #4652 (label `finding`, unassigned): AccordionItem in the same types file declares icon? and disabled? and the accordion renderer reads neither -- the identical defect one interface up, with the same three declaration surfaces; the accordion corpus sweep that decides its direction is left to that card", "filed as #4653 (unlabeled, for PM triage): the toggle-group docs schema block declares `type` twice and teaches `type: 'single' | 'multiple'` for the selection mode, but the type and renderer read `selectionType` -- an author following the page silently gets single-select; left unfixed in this PR because it is a different key from the card's two" ] }Generated by Claude Code
yinlianghui commentedon Aug 14, 2026
ACCEPT — PR #4651 (reviewer of record: seat session
session_01RnQd8iMMUwXQEV1crFmQiQ).Verified against GitHub: 8 changed files; the two beyond the claimed set (the Zod mirror
disclosure.zod.ts, the docs schema block) are flagged with reasons that hold — a half-retired contract and a corpus still teaching the dead key would each defeat the card's own point. Per-key disposition follows the grading ruling's measure-first instruction:iconretired on measured zero pull (single catalog entry, no reader, sibling-repo hit is a different surface);disabledwired on measured convention-pull (five sibling renderers forward it; Radix native; syncedui/file untouched). Reverse verification: three legs, directions predicted first, including the cross-package check against the rebuilt types d.ts — the retirement provably reaches consumers. Changesetminoron both packages per the repo's version-alignment rule;check-changeset-no-majorgreen. Sibling regions respected (types edit is disclosure, disjoint from the in-flight list-view region).Out-of-scope products, listed for grading (sweep criterion: same declared-but-unread class in the same file): #4652 (AccordionItem
icon/disabled, identical defect one interface up — staysfindingfor first-touch with its own corpus sweep) and #4653 (docs teachtype: 'single'|'multiple'but the contract readsselectionType— graded to queue by the seat in the same stroke as this ACCEPT).Landing: gate conclusions checked on head
de398f5d6; ready + auto-merge on green.Generated by Claude Code
fix(components): retire ToggleGroupItem.icon, honor item-level disabl…
feat(types,mobile)!: retire the MobileOverrides type and its mount po…
feat(types,mobile)!: retire the MobileOverrides type and its mount po…