Skip to content

finding(plugin-form): DrawerForm's two section arms still resolve the collapse pair without the objectui#9780 ruling — the unblocker its own comment names has now landed in the spec #10216

Description

@os-support-ai

立卡门 ① — a defect with a named producer and a now-satisfied unblocker.

finding — filed by the domain:spec execution seat on objectstack-ai/objectstack (session session_013RDBh5DqXd2xnLwvHLgLFr, seat 1), under the multi-repo rule that the seat accepting an upstream PR files the consumer-side follow-up. ⛔ Ungraded and unrouted — domain:*, type and priority belong to this repo's triage. Not claimed.

Blocked-by: objectstack-ai/objectstack#19736

⚠️ That blocker is already satisfied — which is the whole point of this card, and why it is filed now rather than held.

⛔ The line above is deliberately bare and line-leading. It is a machine-greppable reverse index, and the repo's own ratchet reads it as /^\s*(?:>\s*)?(?:[-*+]\s+)??(?:Blocked-by|…):/— leading space, a blockquote, a bullet or a backtick are allowed, **bold is not**. This card was filed with the key wrapped in` and mid-sentence, which matches nothing; the unlock scan would never have seen it. Corrected in place by the filing seat.

The defect, measured on this repo's current main

main at 0cf2d6644bdb, which is newer than the objectstack pin (.objectui-sha = 87af769e9a3ee28ace099fdd653d3ebd79fe82e2), so this is ⛔ not an artifact of pin lag:

file line behaviour
packages/plugin-form/src/DrawerForm.tsx :645, :713 pushes collapsible: section.collapsible alone
packages/plugin-form/src/ObjectForm.tsx :1554 Boolean(section.collapsible) || Boolean(section.collapsed) — applies the ruling

⇒ On the drawer arms, a section authored collapsed: true with no collapsible beside it renders permanently closed with nothing on the page that reopens it — the exact defect objectui#9780 measured, still live on this surface while ObjectForm honours the ruling.

⚠️ This is NOT a duplicate of objectui#9780 — that card is closed, and its fix was deliberately scoped

objectui#9780 is closed as completed, by merged PR objectui#9968 («a section declared collapsed installs its disclosure control»). That fix landed on the ObjectForm default arm and deliberately left the drawer arms alone. DrawerForm.tsx:632-635 says so in its own words and names its unblocker verbatim:

push reads section.collapsible alone, so objectui#9780's «collapsed implies collapsible» — applied on the default arm — [is unchanged] on purpose; converging it is the collapsed / collapsible decision.

⭐ That decision is now published, which is what makes this actionable today

The maintainer ruled it on objectui#9780 (comment 5729750150, 2026-09-18, letter A, 「其他同意」): «collapsible: false with collapsed: true is the same contradiction and resolves the same way (collapsed wins, toggle present)». Letters B (refuse the combination at the declaration face) and C (a console.warn) were REFUSED, which is why the remedy is renderer-side and why no lint rule exists.

objectstack-ai/objectstack#19736 publishes that ruling as contract text on FormSectionSchema (packages/spec/src/ui/view.zod.ts), describing both keys and stating explicitly that the implication is a renderer rule and ⛔ not a parse fold — measured: {collapsed: true} parses to {collapsible: false, collapsed: true} verbatim, safeParseAsync agreeing. So the renderer cannot delegate this to parse; each arm resolves it from the declaration itself, exactly as ObjectForm.tsx:1554 does.

That PR carries an at-tier contract-review PASS and is armed for the merge queue. ⇒ the fence this card sits behind is discharged.

Producer

Any hand-authored drawer form view, plus the metadata designer. ⭐ And it is the shape an AI writing metadata hits most easily: «collapsed by default» is a natural intent, collapsed: true is its most natural spelling, and written alone it is exactly the broken one.

Dedupe — query and hit counts, including closed

Suggested shape, ⛔ not a ruling

Converge the two drawer arms onto the same resolution ObjectForm.tsx:1554 uses. ⚠️ Note :689 (const isCollapsed = section.collapsible ? … : …) reads the pair a second time on the same arm — re-derive both sites rather than patching the push alone, and ⚠️ re-read the line numbers above against main before editing: they are this seat's reading of 0cf2d6644bdb and this repo moves.


Generated by Claude Code

Activity

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions