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): PageAccordionItem.icon is declared in page:accordion but never read #4721
Measured while implementing #4652. Filed unassigned. Duplicate-searched (keyword + PageAccordionItem + page:accordion + the renderer path): no open issue covers it.
The finding
The identical defect shape as #4632/#4652, in a different component. packages/components/src/renderers/layout/containers.tsx:771-776 declares a local (not exported from @object-ui/types) interface for the page:accordion layout container:
PageAccordionRenderer (same file, lines ~778-838) reads item.label, item.collapsed and item.value/item.children — never item.icon. Grepping icon across the whole renderer body (ComponentRegistry.register('accordion', PageAccordionRenderer, { namespace: 'page', ... })) returns no read.
This is a different component from the one #4652 fixed: page:accordion (namespace page, a layout container registered separately, isContainer: true) vs. ui:accordion / AccordionSchema.items: AccordionItem[] (namespace ui, the disclosure primitive packages/types/src/disclosure.ts declares). Different file, different interface, different registration — out of #4652's declared file surface, so not folded into that PR under the bounded in-place exemption (AGENTS.md-equivalent dispatch discipline: same defect class, different file/claim).
Impact
Dormant, same shape as the sibling findings: an author who declares icon on a page:accordion panel gets a correctly rendered accordion panel with the icon silently dropped. Nothing goes red.
Unmeasured here: whether any catalog entry, docs page, or example app authors icon on a page:accordion item — that sweep is part of taking this card, and decides enforce-or-remove per the established family framing (#4632/#4652).
Options
Enforce-or-remove, decided by measured pull (the #4632/#4652 ruling's framing):
Wire icon — render it alongside item.labelStr in the trigger.
Retire the declaration if the sweep shows no pull.
Related: #4632, #4652, #4631 (three/four-surface reconciliation instrument — here there is no Zod mirror since PageAccordionItem is a page-container-local interface, not a @object-ui/types export, so this may be a two-surface case: local interface + renderer).
Findings triage (first grade, PM session session_01RnQd8iMMUwXQEV1crFmQiQ): PROMOTED — pm:queue (S). Same defect shape as the just-landed AccordionItem settlement, different component and claim (page:accordion's PageAccordionItem.icon in layout/containers.tsx); the #4632 family framing (enforce-or-remove per key by measured pull) inherits. The #4652 dev's sweep already read zero authoring for this key including the sibling checkout — the eventual dispatch re-verifies on its own tree per usual, and the retirement half follows deletion-class discipline at review.
Claiming — PM dispatch. Session: session_01RnQd8iMMUwXQEV1crFmQiQ. Branch: claude/issue-4721-page-accordion-icon. Scope: the graded executor scope — enforce-or-remove on PageAccordionItem.icon per measured pull (the filing dev's sweep read zero authoring including the sibling checkout; re-verify on your own tree), same per-key framing as the AccordionItem settlement that just merged. PR will be Fixes #4721.
{
"issue": 4721,
"status": "done",
"branch": "claude/issue-4721-page-accordion-icon",
"pr": "https://github.com/objectstack-ai/objectui/pull/4728",
"premise_still_valid": true,
"summary": "PageAccordionItem.icon was declared but never read by PageAccordionRenderer (page:accordion, containers.tsx) - premise confirmed. But the issue's own two-surface hypothesis did not hold: the objectstack sibling repo's spec (packages/spec/src/ui/component.zod.ts, PageAccordionProps.items[].icon, added 2026-08-13) already declares icon as legitimate, undeprecated authorable surface - the same schema block explicitly flags the neighboring `value` key as dead but says nothing about icon. Per AGENTS.md #0.1 (fix the renderer when metadata is spec-compliant), disposition is WIRE not retire: the trigger now renders item.icon via LazyIcon, following the page:tabs sibling's established icon convention in the same file. Corpus sweep (catalog/docs/apps/objectstack sibling) still measured zero authoring pull, consistent with the filing issue, but the spec's deliberate declaration outweighs that the same way #4652's `disabled` was wired despite zero pull.",
"tests": "pnpm exec vitest run --maxWorkers=2 packages/components/__tests__/page-accordion-icon.test.tsx: 4/4 passed (new file). pnpm exec vitest run --maxWorkers=2 packages/components/: 130 files / 1116 tests passed. pnpm exec vitest run --maxWorkers=2 apps/console/src/__tests__/registry-inputs-spec-parity.test.ts apps/console/src/__tests__/public-contract.test.ts: 2 files / 64 tests passed. pnpm --filter '@object-ui/components^...' build then pnpm --filter @object-ui/components type-check: clean. pnpm check:phantom-deps, pnpm check:spec-symbols: both green. node scripts/check-control-bytes.mjs, check-changeset-presence.mjs, check-changeset-no-major.mjs: all green. eslint on both changed files: 0 errors, 87 pre-existing no-explicit-any/fast-refresh warnings elsewhere in the file, none on changed lines. Reverse verification (direction predicted before running: icon-asserting tests red, icon-agnostic tests green): committed fix first (e8d5f5b71), ablated the LazyIcon render block, reran page-accordion-icon.test.tsx - observed exactly 2 failed / 2 passed as predicted; restored via `git checkout claude/issue-4721-page-accordion-icon -- packages/components/src/renderers/layout/containers.tsx`, git status --porcelain empty, re-ran green 4/4. All verification quoted above ran AFTER the final commit; HEAD = e8d5f5b71 (git rev-parse --short HEAD), matches the PR body and this report.",
"open_questions": [],
"out_of_scope_findings": []
}
(Corrected marker — the previous comment's <!-- os-dev-report --> marker was
HTML-entity-mangled on post and unusable; this comment supersedes it as the
report of record. No edit-comment tool was available, so this is a fresh
comment rather than an edit of the prior one.)
{
"issue": 4721,
"status": "done",
"branch": "claude/issue-4721-page-accordion-icon",
"pr": "https://github.com/objectstack-ai/objectui/pull/4728",
"premise_still_valid": true,
"summary": "PageAccordionItem.icon was declared but never read by PageAccordionRenderer (page:accordion, containers.tsx) - premise confirmed. But the issue's own two-surface hypothesis did not hold: the objectstack sibling repo's spec (packages/spec/src/ui/component.zod.ts, PageAccordionProps.items[].icon, added 2026-08-13) already declares icon as legitimate, undeprecated authorable surface - the same schema block explicitly flags the neighboring `value` key as dead but says nothing about icon. Per AGENTS.md #0.1 (fix the renderer when metadata is spec-compliant), disposition is WIRE not retire: the trigger now renders item.icon via LazyIcon, following the page:tabs sibling's established icon convention in the same file. Corpus sweep (catalog/docs/apps/objectstack sibling) still measured zero authoring pull, consistent with the filing issue, but the spec's deliberate declaration outweighs that the same way #4652's `disabled` was wired despite zero pull.",
"tests": "pnpm exec vitest run --maxWorkers=2 packages/components/__tests__/page-accordion-icon.test.tsx: 4/4 passed (new file). pnpm exec vitest run --maxWorkers=2 packages/components/: 130 files / 1116 tests passed. pnpm exec vitest run --maxWorkers=2 apps/console/src/__tests__/registry-inputs-spec-parity.test.ts apps/console/src/__tests__/public-contract.test.ts: 2 files / 64 tests passed. pnpm --filter '@object-ui/components^...' build then pnpm --filter @object-ui/components type-check: clean. pnpm check:phantom-deps, pnpm check:spec-symbols: both green. node scripts/check-control-bytes.mjs, check-changeset-presence.mjs, check-changeset-no-major.mjs: all green. eslint on both changed files: 0 errors, 87 pre-existing no-explicit-any/fast-refresh warnings elsewhere in the file, none on changed lines. Reverse verification (direction predicted before running: icon-asserting tests red, icon-agnostic tests green): committed fix first (e8d5f5b71), ablated the LazyIcon render block, reran page-accordion-icon.test.tsx - observed exactly 2 failed / 2 passed as predicted; restored via `git checkout claude/issue-4721-page-accordion-icon -- packages/components/src/renderers/layout/containers.tsx`, git status --porcelain empty, re-ran green 4/4. All verification quoted above ran AFTER the final commit; HEAD = e8d5f5b71 (git rev-parse --short HEAD), matches the PR body and this report.",
"open_questions": [],
"out_of_scope_findings": []
}
Activity
yinlianghui commentedon Aug 15, 2026
Findings triage (first grade, PM session
session_01RnQd8iMMUwXQEV1crFmQiQ): PROMOTED —pm:queue(S). Same defect shape as the just-landed AccordionItem settlement, different component and claim (page:accordion'sPageAccordionItem.iconinlayout/containers.tsx); the #4632 family framing (enforce-or-remove per key by measured pull) inherits. The #4652 dev's sweep already read zero authoring for this key including the sibling checkout — the eventual dispatch re-verifies on its own tree per usual, and the retirement half follows deletion-class discipline at review.Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
Claiming — PM dispatch. Session:
session_01RnQd8iMMUwXQEV1crFmQiQ. Branch:claude/issue-4721-page-accordion-icon. Scope: the graded executor scope — enforce-or-remove onPageAccordionItem.iconper measured pull (the filing dev's sweep read zero authoring including the sibling checkout; re-verify on your own tree), same per-key framing as the AccordionItem settlement that just merged. PR will beFixes #4721.Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
<!-- os-dev-report -->
{ "issue": 4721, "status": "done", "branch": "claude/issue-4721-page-accordion-icon", "pr": "https://github.com/objectstack-ai/objectui/pull/4728", "premise_still_valid": true, "summary": "PageAccordionItem.icon was declared but never read by PageAccordionRenderer (page:accordion, containers.tsx) - premise confirmed. But the issue's own two-surface hypothesis did not hold: the objectstack sibling repo's spec (packages/spec/src/ui/component.zod.ts, PageAccordionProps.items[].icon, added 2026-08-13) already declares icon as legitimate, undeprecated authorable surface - the same schema block explicitly flags the neighboring `value` key as dead but says nothing about icon. Per AGENTS.md #0.1 (fix the renderer when metadata is spec-compliant), disposition is WIRE not retire: the trigger now renders item.icon via LazyIcon, following the page:tabs sibling's established icon convention in the same file. Corpus sweep (catalog/docs/apps/objectstack sibling) still measured zero authoring pull, consistent with the filing issue, but the spec's deliberate declaration outweighs that the same way #4652's `disabled` was wired despite zero pull.", "tests": "pnpm exec vitest run --maxWorkers=2 packages/components/__tests__/page-accordion-icon.test.tsx: 4/4 passed (new file). pnpm exec vitest run --maxWorkers=2 packages/components/: 130 files / 1116 tests passed. pnpm exec vitest run --maxWorkers=2 apps/console/src/__tests__/registry-inputs-spec-parity.test.ts apps/console/src/__tests__/public-contract.test.ts: 2 files / 64 tests passed. pnpm --filter '@object-ui/components^...' build then pnpm --filter @object-ui/components type-check: clean. pnpm check:phantom-deps, pnpm check:spec-symbols: both green. node scripts/check-control-bytes.mjs, check-changeset-presence.mjs, check-changeset-no-major.mjs: all green. eslint on both changed files: 0 errors, 87 pre-existing no-explicit-any/fast-refresh warnings elsewhere in the file, none on changed lines. Reverse verification (direction predicted before running: icon-asserting tests red, icon-agnostic tests green): committed fix first (e8d5f5b71), ablated the LazyIcon render block, reran page-accordion-icon.test.tsx - observed exactly 2 failed / 2 passed as predicted; restored via `git checkout claude/issue-4721-page-accordion-icon -- packages/components/src/renderers/layout/containers.tsx`, git status --porcelain empty, re-ran green 4/4. All verification quoted above ran AFTER the final commit; HEAD = e8d5f5b71 (git rev-parse --short HEAD), matches the PR body and this report.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
os-dev-report
(Corrected marker — the previous comment's
<!-- os-dev-report -->marker wasHTML-entity-mangled on post and unusable; this comment supersedes it as the
report of record. No edit-comment tool was available, so this is a fresh
comment rather than an edit of the prior one.)
{ "issue": 4721, "status": "done", "branch": "claude/issue-4721-page-accordion-icon", "pr": "https://github.com/objectstack-ai/objectui/pull/4728", "premise_still_valid": true, "summary": "PageAccordionItem.icon was declared but never read by PageAccordionRenderer (page:accordion, containers.tsx) - premise confirmed. But the issue's own two-surface hypothesis did not hold: the objectstack sibling repo's spec (packages/spec/src/ui/component.zod.ts, PageAccordionProps.items[].icon, added 2026-08-13) already declares icon as legitimate, undeprecated authorable surface - the same schema block explicitly flags the neighboring `value` key as dead but says nothing about icon. Per AGENTS.md #0.1 (fix the renderer when metadata is spec-compliant), disposition is WIRE not retire: the trigger now renders item.icon via LazyIcon, following the page:tabs sibling's established icon convention in the same file. Corpus sweep (catalog/docs/apps/objectstack sibling) still measured zero authoring pull, consistent with the filing issue, but the spec's deliberate declaration outweighs that the same way #4652's `disabled` was wired despite zero pull.", "tests": "pnpm exec vitest run --maxWorkers=2 packages/components/__tests__/page-accordion-icon.test.tsx: 4/4 passed (new file). pnpm exec vitest run --maxWorkers=2 packages/components/: 130 files / 1116 tests passed. pnpm exec vitest run --maxWorkers=2 apps/console/src/__tests__/registry-inputs-spec-parity.test.ts apps/console/src/__tests__/public-contract.test.ts: 2 files / 64 tests passed. pnpm --filter '@object-ui/components^...' build then pnpm --filter @object-ui/components type-check: clean. pnpm check:phantom-deps, pnpm check:spec-symbols: both green. node scripts/check-control-bytes.mjs, check-changeset-presence.mjs, check-changeset-no-major.mjs: all green. eslint on both changed files: 0 errors, 87 pre-existing no-explicit-any/fast-refresh warnings elsewhere in the file, none on changed lines. Reverse verification (direction predicted before running: icon-asserting tests red, icon-agnostic tests green): committed fix first (e8d5f5b71), ablated the LazyIcon render block, reran page-accordion-icon.test.tsx - observed exactly 2 failed / 2 passed as predicted; restored via `git checkout claude/issue-4721-page-accordion-icon -- packages/components/src/renderers/layout/containers.tsx`, git status --porcelain empty, re-ran green 4/4. All verification quoted above ran AFTER the final commit; HEAD = e8d5f5b71 (git rev-parse --short HEAD), matches the PR body and this report.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code