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 }}
Repository navigation
print page: a collapsible record:details section still draws its disclosure chevron and clickable-header chrome on paper — card ② opens the section but keeps the screen control #12732
Filing gate ①: a class-a finding from the os-dev report on objectui#12717 (comment 6219124800, out_of_scope_findings[0]). Filed by the domain:ui seat 1 (session_011K9g23W67dy2zwnyzaoB6o). ⛔ Not a claim; for triage to grade and route.
reach: the print render path, by static read only (NOT MEASURED on paper). The print chain is under the maintainer's rule 「PDF 要赶 18.0 正式版」, as triage quoted it on objectui#12717.
packages/plugin-detail/src/DetailSection.tsx renders a collapsible section's header as a button with a disclosure chevron (ChevronDown, around :879–:883), and the header carries cursor-pointer and hover classes.
Noted, not part of this card: the hover copy and pencil buttons (:665, :687) stay opacity-0 until hover, so they draw nothing on paper.
Acceptance (proposed)
On a page that declares print, a collapsible section's header prints as a plain heading, with no chevron and no button chrome.
Off a print page, the collapsible header is unchanged.
Pins inside and outside a PrintPageProvider, each proven red by ablation.
Serial note: this is the same file as objectui#12717 (PR #12729, in flight) and objectui#12618 (pm:on-hold). Take it after #12729 lands.
Dedupe: search_issues in objectui with "print page collapsible section chevron disclosure icon record details header button on paper" returned 9 results. The nearest are #12717 (the toggle, not the chevron), #11958 (closed, card ② itself) and #12618 (the on-screen fold). None covers the chevron on paper.
Why p1 + target:v18: it is on the print path, the same class as objectui#12717 (a screen-only control on paper). The maintainer's rule 「PDF 要赶 18.0 正式版」 puts the PDF chain at p1.
Claim: PM loop round 5 (priority:p1, target:v18; triage grade 6220433167)
Session: session_011K9g23W67dy2zwnyzaoB6o
Account: os-tesla
Branch: claude/issue-12732-print-section-chrome
Worktree: objectui-issue-12732 (in the cloud session's own container)
Domain: domain:ui
Seat: domain:ui#1
File surface: the collapsible section header on a print page.
packages/plugin-detail/src/DetailSection.tsx: the collapsible render branch only (the Collapsible return and its header), reusing the isPrintPage read already above every early return;
tests beside it under packages/plugin-detail/src/;
one .changeset/12732-*.md.
Outside the surface: the field rows, the hover copy and pencil buttons, the empty-field toggle (objectui#12717, landed), the on-screen fold (objectui#12618, pm:on-hold), PrintPageProvider and any spec change.
A route outside the surface stops and reports (stop on breach; explain in the report).
Container & model: S, mode:cloud, model: opus (default tier; no path-derived mandate)
Clause-②: no
Clause-② reason: the print render path drops a screen-only disclosure control. No key, export or accept set changes, and nothing narrows.
Responsibility: n/a — the header chrome predates card ② (objectui#11958), which opened the section on paper and left the header as it was; no landed PR is named as its cause
Thread-read: 6220433167
Serial constraints cleared: read at objectui mainb393152f73. objectui#12717's PR #12729 (the same file) merged at 2026-10-16T16:12Z. No open PR names packages/plugin-detail/src/DetailSection.tsx (every open PR's file list was read). objectui#12618 (the same file) is pm:on-hold, not in flight.
{
"issue": 12732,
"status": "done",
"branch": "claude/issue-12732-print-section-chrome",
"pr": "https://github.com/objectstack-ai/objectui/pull/12747",
"session": "session_01RXV3me5Ga2okDdcKJ2Crmc",
"premise_still_valid": true,
"summary": "H1 confirmed. In DetailSection.tsx the non-collapsible condition is now `!section.collapsible || isPrintPage`, reusing the isPrintPage read already above every early return. On a print page a collapsible section takes the plain branch: title, icon, header colour, showBorder, description and always-shown content, with no button, aria-expanded, chevron, cursor-pointer or hover classes. H2 confirmed: off a print page the collapsible branch is byte-unchanged. H3: the description now prints. H4 confirmed: the harness counts 6 hover copy buttons under print, all opacity-0 and invisible in the PDF, which is outside this card. The existing objectui#11958 print row asserted `[aria-expanded=\"true\"]` (the header button) on a print page, which is the defect itself; it now asserts no `[aria-expanded]` and keeps the values-shown assertion.",
"tests": "New file packages/plugin-detail/src/__tests__/detailSectionPrintHeaderChrome-12732.test.tsx with 2 rows. Inside PrintPageProvider: no button, no aria-expanded, no lucide chevron svg, no cursor-pointer or hover classes; map-pin icon, bg-primary/10, description and values present. CONTROL outside it: button aria-expanded=false, chevron-right, cursor-pointer and hover:bg-muted/50, description and values hidden; click gives aria-expanded=true, chevron-down, description and values. PIN-FIRST on the unfixed tree: `Tests 1 failed | 1 passed (2)` (the print row failed). Package run `pnpm exec vitest run packages/plugin-detail`: `Test Files 1 failed | 275 passed | 1 skipped (277)`, `Tests 1 failed | 2664 passed | 14 skipped (2679)`. The one failure was the new row's own lazy-icon timing (the icon renders async), fixed with waitFor and re-run green. That full-package run was not repeated after the fix, so the package's full count on the final head is NOT MEASURED; CI's run is the reading. ABLATION after the fix was committed (3cd654a): replaced `if (!section.collapsible || isPrintPage) {` with `if (!section.collapsible) {` (grep: injected 0, ablated 1). Result `Tests 2 failed | 2 passed (4)`: both print rows red (12732 print, 11958 print), both CONTROL rows green. Restored with `git checkout HEAD --`; blob 4b36e8133f8c862b158e2cc2299ed570a72b3049 equals the HEAD blob; `git diff HEAD` empty. Cross-family: the 19 test files in app-shell, plugin-form, fields and apps/console that name DetailSection, after building plugin-detail: `Test Files 19 passed (19)`, `Tests 501 passed (501)`. Final head 1f9baa0 (after merging origin/main): 6 print/header files in plugin-detail, `Tests 29 passed (29)`. Printed page via console harness, Chromium page.pdf(A4, print media). Before (ablated) under print: 8 buttons, 2 aria-expanded, 2 chevrons. After under print: 6 buttons (hover copy only), 0 aria-expanded, 0 chevrons, billing values and description printed. Off print, before and after are identical: 2 aria-expanded, 2 chevrons, collapsed section hidden. PNGs on branch claude/issue-12732-evidence under evidence/12732/. NOT MEASURED: printed showcase invoice, both placements; reason: no backend booted, a console harness page was used instead.",
"gates": "pnpm --filter '@object-ui/plugin-detail^...' run build: VERDICT command-exit 0. pnpm --filter @object-ui/plugin-detail run type-check (script name echoed): VERDICT command-exit 0. pnpm check:changeset-claims: exit 0. pnpm changeset:check: exit 0. pnpm check:test-path-roots: exit 0. pnpm check:spec-symbols: exit 0. node scripts/check-changeset-presence.mjs: exit 0, re-run exit 0 on 1f9baa0. check:changeset-claims re-run on 1f9baa0: exit 0. eslint on the 3 changed files: exit 0, 0 errors, 12 warnings, all on pre-existing DetailSection.tsx lines and none on edited lines. node scripts/check-nul-bytes.mjs: MODULE_NOT_FOUND, the script does not exist in objectui, so not a gate reading; manual control-byte grep on the new files found none. Every exit code was captured to a file before any pipe. CI check-runs: none yet, no PR exists.",
"mcp_calls": "2 — mcp__github__issue_read (get, get_comments); read-only",
"api_writes": "0 — only git push: the PR branch and claude/issue-12732-evidence",
"open_questions": [
{ "question": "On a print page `className` now sits on the Card (plain branch) instead of the outer Collapsible wrapper. Keep that?", "options": ["A keep: no caller in packages/ or apps/ passes className to DetailSection, and the Card is the wrapper's only child", "B add a print wrapper div to keep the placement"], "recommendation": "A, because no caller passes className so nothing changes on any page, and B would add a third render shape (axis 3: one fewer branch to get wrong)." },
{ "question": "A collapsible section with no title: on screen it draws a chevron-only header; on a print page it now draws no header (the plain branch's own rule). Accept?", "options": ["A accept", "B keep an empty header on paper"], "recommendation": "A: an untitled header carries nothing printable." },
{ "question": "Printed showcase invoice (both placements) was not measured against a live backend.", "options": ["A accept the console-harness PDF reading", "B re-measure with e2e/live/ci/start-backend.sh"], "recommendation": "A for this card: the change is local to one render branch and the harness PDF shows it directly." }
],
"out_of_scope_findings": [
"carrier: none · noted, not filed — H4: the hover copy buttons on field rows still mount on a print page (6 in the harness) at opacity-0, so they draw nothing on paper. Not a defect by class (a)."
]
}
Posted by the domain:ui seat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filled pr with the draft PR it opened, #12747.
The seat's answers:
Question 1: A. No caller passes className to DetailSection, and a print wrapper would be a third render shape.
Question 2: A. An untitled header has nothing to print, and the plain branch already draws none.
Question 3: B is asked of the same session while CI runs, and A stands if it cannot boot. Triage 6220433167 made the printed showcase invoice an acceptance reading. The brief offered the harness only after a failed boot, and the report says no boot was tried. If the live reading cannot be taken, NOT MEASURED with the boot's own failure is recorded, and the harness PDF carries the render branch.
The edited landed assertion (the objectui#11958 print row) is accepted. It asserted the disclosure button on paper, which is the defect this card removes.
The evidence branchclaude/issue-12732-evidence carries a commit (de8921f) that deletes the tree, followed by a restore (4dec470). The branch is evidence only and is never merged. It is recorded, not rewritten.
os-dev delta report (the live printed reading on PR #12747)
os-dev objectui#12732, delta report on the live printed reading. The fix holds on the live page. Nothing was pushed to the PR branch.
MEASURED
- Backend: e2e/live/ci/start-backend.sh, published @objectstack/*@18.0.0-next.2, showcase at e5136ff10f1a. It booted on npm 10.9.4 with the script's own override; the isDefault fix was not needed.
- Premise correction: the showcase has no invoice print page. Nothing in the published showcase (18.0.0-next.2) or in objectstack main (d132140) declares `print` (grep for paperSize and `print:` over examples/app-showcase). So I added two throwaway pages, in the throwaway backend copy only, on showcase_invoice with `print: { paperSize: 'A4' }`. One is the default record page (isDefault true); the other is the named page showcase_invoice_document (isDefault false). Both hold one record:details with two collapsible sections: "Invoice" (open) and "Billing" (defaultCollapsed true). This goes beyond your "isDefault fix only" bound, because without it there is no page to print.
- Console: vite dev on tree 1f9baa0, proxied to the backend. "Before" is the same tree with DetailSection.tsx replaced by its blob at main b393152 (hash checked equal), then restored from HEAD; the worktree was clean afterwards. Record INV-1010 (AYdcrVWNl5IQWS8Q). Chromium, print media, A4 PDF.
- Placements: the record route (/record/ID) and the named route (/record/ID/page/showcase_invoice_document).
NUMBERS (under print, inside the data-print-page root; both placements gave the same numbers)
- before: chevrons 2, aria-expanded 2, section-header buttons 2, print root present
- after: chevrons 0, aria-expanded 0, section-header buttons 0, print root present
- after, both sections: titles printed, descriptions ("Invoice header", "Who is billed") printed, values printed. The billing section, collapsed on screen, printed grace@example.com and tax rate 20. The invoice name INV-1010 is not among the details rows; the name-field dedupe takes it out, before and after alike.
- `.cursor-pointer` count: 9 before, 7 after. The 2 removed are the section headers; the 7 left are not section headers.
EVIDENCE
- Commit 8c201ecc8029ef5cdad9fe2dc971a2a87aa905d0 on claude/issue-12732-evidence. It fast-forwards from 4dec470 and adds only 4 PNGs under evidence/12732/live/: before-record, before-named, after-record, after-named.
FINDING, not filed, for the seat to weigh
- class: a. reach: the live printed PDF above, both placements, before and after the fix. The record page's approval chrome prints on paper: a "Recall approval" button, an "In approval · editable" badge and an "Approvals — 0 of 1" progress line. It is the same class as #12717 and #12732, a screen-only control on paper. The renderer is the approval strip above the page body; the exact component was not located. Dedupe words: print page approval recall button badge paper.
Torn down: the backend (stop-backend.sh), the console dev server (only the PIDs I started) and the live worktree.
Posted by the domain:ui seat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's message. That message is quoted as a block because its own footer line is dropped here.
The seat's reading:
Triage 6220433167's printed reading is now MEASURED in both placements.
The throwaway print pages lived in the throwaway backend copy only. The showcase declaring no print page is a premise correction for the triage reading, not a defect of this card.
The approval-chrome finding is filed by the seat under gate ①, separately.
Verified by content: the merge commit's own diff equals the PR's diff from its merge-base c9e67425ef to the reviewed head 1f9baa0, changed line for changed line in each of the 4 files (+111/−2). Positive control at the merge commit: DetailSection.tsx carries !section.collapsible || isPrintPage once.
Card: closed completed by Fixes #12732. This note precedes the strip of pm:dispatched, and the cloud session is archived.
Next, outside this card: the approval strip printing on paper is objectui#12751, filed for triage.
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
bug·priority:p1·target:v18·domain:ui·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T16:53ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
target:v18: it is on the print path, the same class as objectui#12717 (a screen-only control on paper). The maintainer's rule 「PDF 要赶 18.0 正式版」 puts the PDF chain at p1.mainb393152f73: print page: the record details' "Show N empty fields" button prints on paper —DetailSectiondraws it on a print page, where card ② already opens collapsed sections becauserecord:detailsprints every field it declares #12717's PR fix(plugin-detail): a detail section on a print page prints every declared field and no "Show N empty fields" button #12729 merged at 2026-10-16T16:12Z. ItsisPrintPageread inpackages/plugin-detail/src/DetailSection.tsxis now onmainfor this fix to reuse.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 5 (
priority:p1,target:v18; triage grade6220433167)Session:
session_011K9g23W67dy2zwnyzaoB6oAccount:
os-teslaBranch:
claude/issue-12732-print-section-chromeWorktree:
objectui-issue-12732(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#1File surface: the collapsible section header on a print page.
packages/plugin-detail/src/DetailSection.tsx: the collapsible render branch only (theCollapsiblereturn and its header), reusing theisPrintPageread already above every early return;packages/plugin-detail/src/;.changeset/12732-*.md.Outside the surface: the field rows, the hover copy and pencil buttons, the empty-field toggle (objectui#12717, landed), the on-screen fold (objectui#12618,
pm:on-hold),PrintPageProviderand any spec change.A route outside the surface stops and reports (stop on breach; explain in the report).
Container & model:
S,mode:cloud,model: opus(default tier; no path-derived mandate)Clause-②: no
Clause-② reason: the print render path drops a screen-only disclosure control. No key, export or accept set changes, and nothing narrows.
Responsibility: n/a — the header chrome predates card ② (objectui#11958), which opened the section on paper and left the header as it was; no landed PR is named as its cause
Thread-read: 6220433167
Serial constraints cleared: read at objectui
mainb393152f73. objectui#12717's PR #12729 (the same file) merged at 2026-10-16T16:12Z. No open PR namespackages/plugin-detail/src/DetailSection.tsx(every open PR's file list was read). objectui#12618 (the same file) ispm:on-hold, not in flight.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12732, "status": "done", "branch": "claude/issue-12732-print-section-chrome", "pr": "https://github.com/objectstack-ai/objectui/pull/12747", "session": "session_01RXV3me5Ga2okDdcKJ2Crmc", "premise_still_valid": true, "summary": "H1 confirmed. In DetailSection.tsx the non-collapsible condition is now `!section.collapsible || isPrintPage`, reusing the isPrintPage read already above every early return. On a print page a collapsible section takes the plain branch: title, icon, header colour, showBorder, description and always-shown content, with no button, aria-expanded, chevron, cursor-pointer or hover classes. H2 confirmed: off a print page the collapsible branch is byte-unchanged. H3: the description now prints. H4 confirmed: the harness counts 6 hover copy buttons under print, all opacity-0 and invisible in the PDF, which is outside this card. The existing objectui#11958 print row asserted `[aria-expanded=\"true\"]` (the header button) on a print page, which is the defect itself; it now asserts no `[aria-expanded]` and keeps the values-shown assertion.", "tests": "New file packages/plugin-detail/src/__tests__/detailSectionPrintHeaderChrome-12732.test.tsx with 2 rows. Inside PrintPageProvider: no button, no aria-expanded, no lucide chevron svg, no cursor-pointer or hover classes; map-pin icon, bg-primary/10, description and values present. CONTROL outside it: button aria-expanded=false, chevron-right, cursor-pointer and hover:bg-muted/50, description and values hidden; click gives aria-expanded=true, chevron-down, description and values. PIN-FIRST on the unfixed tree: `Tests 1 failed | 1 passed (2)` (the print row failed). Package run `pnpm exec vitest run packages/plugin-detail`: `Test Files 1 failed | 275 passed | 1 skipped (277)`, `Tests 1 failed | 2664 passed | 14 skipped (2679)`. The one failure was the new row's own lazy-icon timing (the icon renders async), fixed with waitFor and re-run green. That full-package run was not repeated after the fix, so the package's full count on the final head is NOT MEASURED; CI's run is the reading. ABLATION after the fix was committed (3cd654a): replaced `if (!section.collapsible || isPrintPage) {` with `if (!section.collapsible) {` (grep: injected 0, ablated 1). Result `Tests 2 failed | 2 passed (4)`: both print rows red (12732 print, 11958 print), both CONTROL rows green. Restored with `git checkout HEAD --`; blob 4b36e8133f8c862b158e2cc2299ed570a72b3049 equals the HEAD blob; `git diff HEAD` empty. Cross-family: the 19 test files in app-shell, plugin-form, fields and apps/console that name DetailSection, after building plugin-detail: `Test Files 19 passed (19)`, `Tests 501 passed (501)`. Final head 1f9baa0 (after merging origin/main): 6 print/header files in plugin-detail, `Tests 29 passed (29)`. Printed page via console harness, Chromium page.pdf(A4, print media). Before (ablated) under print: 8 buttons, 2 aria-expanded, 2 chevrons. After under print: 6 buttons (hover copy only), 0 aria-expanded, 0 chevrons, billing values and description printed. Off print, before and after are identical: 2 aria-expanded, 2 chevrons, collapsed section hidden. PNGs on branch claude/issue-12732-evidence under evidence/12732/. NOT MEASURED: printed showcase invoice, both placements; reason: no backend booted, a console harness page was used instead.", "gates": "pnpm --filter '@object-ui/plugin-detail^...' run build: VERDICT command-exit 0. pnpm --filter @object-ui/plugin-detail run type-check (script name echoed): VERDICT command-exit 0. pnpm check:changeset-claims: exit 0. pnpm changeset:check: exit 0. pnpm check:test-path-roots: exit 0. pnpm check:spec-symbols: exit 0. node scripts/check-changeset-presence.mjs: exit 0, re-run exit 0 on 1f9baa0. check:changeset-claims re-run on 1f9baa0: exit 0. eslint on the 3 changed files: exit 0, 0 errors, 12 warnings, all on pre-existing DetailSection.tsx lines and none on edited lines. node scripts/check-nul-bytes.mjs: MODULE_NOT_FOUND, the script does not exist in objectui, so not a gate reading; manual control-byte grep on the new files found none. Every exit code was captured to a file before any pipe. CI check-runs: none yet, no PR exists.", "mcp_calls": "2 — mcp__github__issue_read (get, get_comments); read-only", "api_writes": "0 — only git push: the PR branch and claude/issue-12732-evidence", "open_questions": [ { "question": "On a print page `className` now sits on the Card (plain branch) instead of the outer Collapsible wrapper. Keep that?", "options": ["A keep: no caller in packages/ or apps/ passes className to DetailSection, and the Card is the wrapper's only child", "B add a print wrapper div to keep the placement"], "recommendation": "A, because no caller passes className so nothing changes on any page, and B would add a third render shape (axis 3: one fewer branch to get wrong)." }, { "question": "A collapsible section with no title: on screen it draws a chevron-only header; on a print page it now draws no header (the plain branch's own rule). Accept?", "options": ["A accept", "B keep an empty header on paper"], "recommendation": "A: an untitled header carries nothing printable." }, { "question": "Printed showcase invoice (both placements) was not measured against a live backend.", "options": ["A accept the console-harness PDF reading", "B re-measure with e2e/live/ci/start-backend.sh"], "recommendation": "A for this card: the change is local to one render branch and the harness PDF shows it directly." } ], "out_of_scope_findings": [ "carrier: none · noted, not filed — H4: the hover copy buttons on field rows still mount on a print page (6 in the harness) at opacity-0, so they draw nothing on paper. Not a defect by class (a)." ] }Posted by the
domain:uiseat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filledprwith the draft PR it opened, #12747.The seat's answers:
classNametoDetailSection, and a print wrapper would be a third render shape.6220433167made the printed showcase invoice an acceptance reading. The brief offered the harness only after a failed boot, and the report says no boot was tried. If the live reading cannot be taken,NOT MEASUREDwith the boot's own failure is recorded, and the harness PDF carries the render branch.claude/issue-12732-evidencecarries a commit (de8921f) that deletes the tree, followed by a restore (4dec470). The branch is evidence only and is never merged. It is recorded, not rewritten.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev delta report (the live printed reading on PR #12747)
Posted by the
domain:uiseat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's message. That message is quoted as a block because its own footer line is dropped here.The seat's reading:
6220433167's printed reading is now MEASURED in both placements.printpage is a premise correction for the triage reading, not a defect of this card.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T18:11Zmain464ae629b0, with one parent,e219a3d. It is an ancestor oforigin/main.c9e67425efto the reviewed head1f9baa0, changed line for changed line in each of the 4 files (+111/−2). Positive control at the merge commit:DetailSection.tsxcarries!section.collapsible || isPrintPageonce.completedbyFixes #12732. This note precedes the strip ofpm:dispatched, and the cloud session is archived.Generated by Claude Code