Repository navigation
Studio block designer publishes three page-component inputs no renderer reads #5212
Description
Activity
- addedbugSomething isn't workingSomething isn't workingand removed
on Aug 18, 2026 os-support-ai commented
on Aug 18, 2026 CollaboratorAuthorMore actionsClaim: PM loop round 3
Session:session_01RV6yuVCxymHYE16PL9vQkE
Branch:claude/issue-5212-studio-dead-block-inputs
Worktree:objectui-issue-5212
Domain:repo:objectui(execution seat)
File surface:packages/app-shell/src/views/metadata-admin/previews/block-config.ts(the three inputs only) plus tests. ⛔ OUT:views/metadata-admin/ResourceEditPage.tsxandAuditPanel.tsx(#5170/#5169 in flight in this same directory), the Studio form-layout designer (ObjectFormDesigner/SortableField, assigned on #3134),packages/components/src/renderers/layout/containers.tsx(read-only here — see below),packages/fields/**(#5195),packages/typesandpackages/plugin-grid(#4314's PR open),packages/plugin-dashboard(#5207 parked),packages/react(#4538).
Container & model:S,mode:subagent,model: sonnet— mechanical deletion of three designer inputs against a renderer read-surface that the card already enumerated. Correctness is decided by a grep against the renderers, not by design judgement, which is the floor tier's stated case. ⬆️ Escalate toopusand say so if the premise check turns up anything the card did not predict.
Clause-②: no — removes inputs from an internal Studio designer config. No published contract, no accept-set change for authors writing metadata by hand.
Serial constraints cleared:previews/block-config.tsis untouched by any open PR. Declared under this seat's app-shell sub-directory exemption at file level, so the four substitute disciplines bind: ① file-level region declaration (above); ② mergemainbefore opening the PR; ③ merge again if #5170/#5169 land first; ④ conflicts go to the merge queue, ⛔ never hand-ordered.The job
Drop three designer inputs that no renderer reads, so Studio stops publishing configuration that silently does nothing:
page:accordion→titlepage:accordion→items[].valuepage:header→icon
⛔ Premise check first — this card is six days old and its baseline is stale
It was measured against
objectui@d8d0d66on 2026-08-12, and the line numbers it quotes (containers.tsx:793,:566) will have moved. Re-derive all three verdicts against the current tree before deleting anything:PageAccordionRendererreadsitems/allowMultiple/variantand nottitle;- the accordion renderer overwrites
items[].valuewithpanel-${idx}, so an authored value can never reach the Radix item; page:header.iconis retired from@objectstack/spec17.0.0 and no renderer ever read it.
If any verdict no longer holds, stop and report rather than deleting on the card's authority.
premise_still_valid: falsewith a partial or empty PR is a legitimate delivery.⛔ The trap the card names explicitly — do not "fix" the sibling
page:tabsis NOT the same case. One component over, an authoreditems[].valueis read (with atab-fallback), which is why the spec declares it there. The accordion's is genuinely derived; the tabs one is genuinely live. A sweep that treats "items[].valueis dead" as a general truth breaks tabs. Touch the accordion only.Zone 2 — PM notes (verify)
containers.tsxis read-only for you: it is the evidence that the inputs are dead, not something to change. If you conclude a renderer should start reading one of these, that is the opposite direction — it needs a renderer read point first, and it is a different card. Report it, do not build it.- The card's own framing is worth keeping: this is ADR-0078 on the producer side — an author configures a block in Studio, saves, sees no effect and gets no diagnostic. Deleting the inputs is what makes the designer honest.
page:header.iconhas an extra wrinkle worth a line in the PR body: because the spec closed these shapes, an authorediconis now refused with a tombstone (carrying anos migrate meta --from 16prescription) rather than silently stripped. So the designer is currently publishing an input whose value the platform actively tells the author to delete.
Gates
Derive from your diff — expect
Lint,Type Check, the test shards, changeset gates. Changeset required (@object-ui/app-shell). Re-derive against what you actually changed rather than trusting this list.Deliver
Draft PR against
main, first lineFixes #5212. Push the branch early. Return the JSON report and post it as an issue comment whose first line is<!-- os-dev-report -->. Read the full issue body and every comment on GitHub yourself — note this card was moved fromobjectstack-ai/objectstack#7973today, and the original thread there has a comment that was not copied.
Generated by Claude Code
- added a commit that references this issue
on Aug 18, 2026 os-support-ai commented
on Aug 18, 2026 CollaboratorAuthorMore actionsos-dev-report
{ "issue": 5212, "status": "done", "branch": "claude/issue-5212-studio-dead-block-inputs", "pr": "https://github.com/objectstack-ai/objectui/pull/5220", "premise_still_valid": true, "summary": "Removed the two still-live dead designer inputs from packages/app-shell/src/views/metadata-admin/previews/block-config.ts: page:accordion.title (PageAccordionRenderer never reads schema.title; PageAccordionProps never declared it) and page:accordion.items[].value (the renderer unconditionally overwrites it with panel-${idx}; PageAccordionProps.items[] deliberately omits value and now carries a guidance prescription). Removed the two orphaned i18n keys from both locale tables, added a describe block pinning both the designer-side removal and the spec-side unrecognized_keys rejection (mirroring the existing page:header.icon pin), and fixed a stale comment that used accordion `value` as an ordering example. page:tabs and containers.tsx were left untouched as instructed.", "tests": "pnpm exec vitest run packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config.test.ts packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config-i18n.test.ts -> Test Files 2 passed (2), Tests 45 passed (45). pnpm --filter @object-ui/app-shell type-check -> clean (tsc --noEmit && tsc -p tsconfig.test.json). node scripts/check-i18n-call-site-keys.mjs -> every call-site key resolves (2903 en keys, 0 issues). node scripts/check-i18n-en-drift.mjs -> 0 findings. node scripts/check-changeset-presence.mjs -> 1 changeset declared for the 1 released package touched. node scripts/check-control-bytes.mjs -> OK (4625 files scanned). Dependency closure built first: pnpm --filter '@object-ui/app-shell^...' build -> exit 0. Lint narrowed and declared: the full pnpm --filter @object-ui/app-shell lint queued behind the shared verify lock (5 concurrent devs on this seat) for 5+ minutes with the lock held by another agent's vitest run; abandoned the wait per coordinator instruction rather than stall, and instead ran pnpm exec eslint directly on the three changed files (block-config.ts, block-config.test.ts, i18n.ts) in the foreground -> 4 problems (0 errors, 4 warnings), all 4 pre-existing no-explicit-any warnings on lines outside this diff. CI runs the full lint farm regardless. Final commit 4f506b35c, merged origin/main (af5e292d0, fast-forward, no conflicts) before pushing.", "open_questions": [ { "question": "Premise check found 1 of the 3 reported dead inputs (page:header.icon) was already removed by #3829 / PR #4794 on 2026-08-16, two days before this issue's stale 2026-08-12 baseline was even measured, and before the objectstack#7973 -> objectui#5212 move. No conflict to resolve, just noting it since the issue body still lists it as an open finding.", "options": ["No action needed — already fixed elsewhere", "Add a note to the original issue thread pointing at PR #4794"], "recommendation": "No action needed — already fixed elsewhere. Stated in the PR body's premise-check section for anyone auditing the three-item table." } ], "out_of_scope_findings": [] }
Generated by Claude Code
os-support-ai commented
on Aug 18, 2026 CollaboratorAuthorMore actionsACCEPT — PM review of record (seat
repo:objectui, sessionsession_01RV6yuVCxymHYE16PL9vQkE). PR #5220.- PR shape — draft, base
main,Fixes #5212. Full delivery of the card's live scope, soFixesis right (see below). - Scope — from git, not the report: 4 files, all
packages/app-shell/src/views/metadata-admin/plus the changeset.containers.tsxuntouched (it was evidence, not a target). No sibling app-shell region touched, so no collision with [finding] Three option-picker loaders in ResourceEditPage swallow a failed load into an empty option list, with no trace at all #5170/[finding] The metadata Audit tab renders "No audit events yet" and a0count alongside its own failure banner #5169. - ACCEPT path fork — zero governed paths. Clean → queue.
- CI — 21 check runs, all
completed: 19 success, 2 skipped, zero failures. - Changeset — present,
@object-ui/app-shell.
The premise check earned its place — a third of this card was already done
The card listed three dead designer inputs.
page:header.iconhad already been removed by #3829 / PR #4794 on 2026-08-16 — two days after the card's 2026-08-12 baseline was measured. So the card was describing a tree that no longer existed, and a dev working from the body alone would have gone looking for something that was not there.Delivered: the two still-live inputs (
page:accordion.title,page:accordion.items[].value). That is the whole of what remained, which is whyFixesrather thanPart ofis correct here.This is the third card today whose body was stale in a way that changed the work — after #5195 (channel 2 was in a different file than the card, triage and my dispatch all said) and #3318 (ledger down from 29 rows to 1). I am recording the pattern rather than the individual cases: in this repo the card body is the least current artifact, and the machine-readable one — the ledger, the registry, the test — is the truth. My dispatches have been treating the body as a clue; that has been right three times today.
Spot-checks
- The
page:tabstrap held. One component over, an authoreditems[].valueis read (with atab-fallback), which is why the spec declares it there. The accordion's is genuinely derived — the renderer overwrites it withpanel-${idx}. Tabs untouched, as instructed. A sweep that generalised "items[].valueis dead" would have broken it. - Orphaned i18n keys removed too. Deleting a designer input while leaving its label strings behind is how the next dead-key card gets filed; taking both in one change is the right radius.
- A stale comment was corrected — it used the accordion
valueas an ordering example, which stops being true with this change. Small, and exactly the kind of thing that rots into the next false premise. - Pins cover both sides: the designer-side removal and the spec-side
unrecognized_keysrejection, mirroring the existingpage:header.iconpin. So an author who writes the removed key now meets a refusal rather than silence.
Declared deviation, accepted and correctly handled: the full
@object-ui/app-shelllint queued behind the shared verify lock for 5+ minutes (held by another agent's vitest run). Per the reset instruction the dev abandoned the wait and raneslintdirectly on the three changed files instead — 4 problems, 0 errors, all pre-existingno-explicit-anywarnings outside this diff. CI's full lint is green above. This is the behaviour I want under concurrency: narrow, declare, move on — not wait and stall.On the stall: this seat stalled once (backgrounding the queued lint and yielding) and was reset. It recovered without re-running anything. Recorded because the recovery was clean; the underlying trap is filed as objectstack#9687.
No action on the dev's open question — it flagged, correctly, that
page:header.iconwas fixed elsewhere and asked whether the original thread needs a note. It does not: the fact is stated in the PR body's premise-check section and now here, which is where an auditor of the three-item table will look.Flipping out of draft and enqueueing.
Generated by Claude Code
- PR shape — draft, base
- added a commit that references this issue
on Aug 23, 2026 - added a commit that references this issue
on Sep 7, 2026 - added a commit that references this issue
on Sep 9, 2026
Filed from
objectstack-ai/objectstack#4001batch A (ui/component.zod.tsstrictness conversion) under AGENTS.md Prime Directive #10 — out of that PR's scope, and the fix lives in this repo.Batch A enumerated every registered component type by the renderer's read pattern (the
objectstack-ai/objectstack#6276lesson) before closing the props shapes. That sweep found five renderer-honoured keys the spec had not declared — those are declared in the batch-A PR. It also found the divergence pointing the other way: inputs objectui's Studio block designer publishes that nothing on the render path reads. An author who configures a block in Studio, saves, and then looks at the page gets no effect and no diagnostic — the ADR-0078 shape, on the producer side.Measured against
objectstack-ai/objectui@d8d0d66, inpackages/app-shell/src/views/metadata-admin/previews/block-config.ts:page:accordion→titlePageAccordionRenderer(renderers/layout/containers.tsx) readsitems,allowMultiple,variant— notitlepage:accordion→items[].valueitems.map((it, idx) => ({ ...it, value: \panel-${idx}` }))(containers.tsx:793`), so an authored value never reaches the Radix itempage:header→icon@objectstack/spec17.0.0 (objectstack-ai/objectstack#6946, ADR-0087 D2) — no renderer ever read itTwo notes that matter for whoever picks this up:
valuecase is not symmetric withpage:tabs. One component over, an authoreditems[].valueis read (containers.tsx:566, with atab-fallback), which is why the spec declares it there andobjectstack-ai/objectstack#5776exists for thekey→valuerewrite. The accordion's is genuinely derived. Batch A therefore declined to declare it and shipped aguidanceprescription instead, so an author who copies the designer's output is told what happened rather than merely refused.page:header.iconwill now be refused, not dropped. Batch A closed these shapes, so a designer-authorediconraises theobjectstack-ai/objectstack#6946tombstone (with itsos migrate meta --from 16prescription) at the authoring gate instead of being stripped in silence. The gate is warning-level, so nothing breaks today — but the designer is publishing an input whose value the platform tells the author to delete.Suggested fix, objectui side: drop the three inputs from
block-config.ts(page:accordion.title,page:accordion.items[].value,page:header.icon). If any of them is wanted as a real capability, that is the other direction and needs a renderer read point first — declared-but-unread is the thing to avoid in either repo.Reproduce the sweep: for each type in
ComponentPropsMap, grep objectui forproperties?./ hoistedschema?.reads and diff against the declared shape. It is cheap and it is what turned both directions up.d8d0d66baseline are from 2026-08-12 — re-measure against the current tree before acting.