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
Setup list header at 1024 px: the description keeps its line and three header actions fold to a primary plus ⋯ #12705
Walked on objectui main efa9cb4fa at 1024 px, Setup › Users (/apps/setup/sys_user): the header draws the icon tile, "Users", the Identity chip, then the description cut to "User accounts f…", then Import · Invite User · Create User · ⋯. The three labelled actions take the description's width. Audit Logs with one action keeps its full description.
Target
At a header width where the actions and the description do not both fit, the actions fold first: the primary action stays labelled, the others go into the ⋯ menu above Share / Delete; the description keeps one full line (ellipsis only after the actions are folded).
At 1280 px and wider nothing changes.
The same rule on the console page header everywhere it is mounted (object lists, dashboards, Setup pages).
File surface
packages/app-shell/src/layout/PageHeader.tsx (the actions cluster and its fold), tests beside.
Acceptance
Tests: three actions at a 600 px header render one labelled + ⋯; the description text is complete.
Screenshots on the temporary branch claude/console-home-login-design-20261016 of objectstack-ai/objectui (commit 0f4e3f4ee, never merged): r4-users-list-header.jpg.
Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 fourth review: objectui main efa9cb4fa, HotCRM 4f82b815 on platform 18.0.0-next.2, the vite console on :5180 against objectstack dev on :4001, the maintainer's browser pane at 1024 × 768 (dark, en). The maintainer asked for every finding to be filed on the repository it belongs to, verbatim: 「全部立卡,平台问题到 objectui,审计日志核查到 objectstack,HotCRM 转化流程到 hotcrm。」
Claim: PM loop round 3 (priority:p2; filed by the epic PM session from the 2026-10-16 fourth review, on the maintainer's 「全部立卡,平台问题到 objectui…」)
Session: session_01SJn1GEkrbbBQkhGC26wEDw
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12705-header-actions-fold
Worktree: objectui-issue-12705 (in the cloud session's own container)
Domain: domain:ui
Seat: domain:ui#4
File surface: packages/app-shell/src/layout/PageHeader.tsx (the actions cluster and its fold), the header's callers only where the fold needs them to say which action is primary (packages/app-shell/src/views/ObjectView.tsx header row, the Setup pages that pass actions), tests beside each, one .changeset/12705-*.md (stop on breach; explain in the report)
Container & model: M, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 3 on 「当前任务处理完,后续并发降到3」, this session's chat, 2026-10-16)
Clause-②: yes
Clause-② reason: ConsolePageHeaderProps is exported from @object-ui/app-shell, and folding all but the primary action very likely needs the header to know which action is primary (a structured actions member or a marker), which widens that type. «拿不准 ⇒ 按 yes». The seat's TIER_DEFAULT review comes before ready.
Responsibility: n/a — a measured header layout defect
Thread-read: none
Serial constraints cleared: objectui#12606 (this seat, the same header's Setup posture) landed as c41ce3f, which clears the card's "lands second" constraint. No open objectui PR touches PageHeader.tsx, ObjectView.tsx or ResourceListPage.tsx. objectui#12695 (the icon-only list toolbar) is unclaimed and edits the list toolbar, not the page header.
{
"issue": 12705,
"status": "done",
"branch": "claude/issue-12705-header-actions-fold",
"pr": 12754,
"session": "session_01Xdo68iRc7fYqRwjmU3FoD1; dispatched by PM seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw",
"premise_still_valid": true,
"summary": "Premise re-measured on main c41ce3f. At 1024 px Setup Users no longer cuts its description: objectui#12606 put the description on its own line. The cut still happens in the one-row layout: HotCRM Opportunities at 1024 px, with New, Import and Update Stage, shows 154 of the 284 px its description needs. Setup Packages also cuts at 1024 px (374 of 428 px). ConsolePageHeader gains one optional prop, foldedActions: the page's folded set of actions, meaning the primary action with its label plus the page's ⋯ menu. The header measures its own width (a ResizeObserver plus a pass after every render). It swaps actions for foldedActions before the title or the description is cut, and only unfolds once the text would still fit, so it does not flip-flop. ObjectView declares the list's folded set. The primary is New, or else the toolbar action authored with variant primary. Import, the other toolbar actions, favorites and Reset view go into one action:bar overflow menu. Setup Packages and the object data page move their second action into a new menu. Branch pushed at c878e1a; screenshots on claude/issue-12705-evidence at 59aec883d.",
"tests": "HEAD c878e1a. New pins: packages/app-shell/src/layout/__tests__/PageHeader.actionsFold-12705.test.tsx (7) and packages/app-shell/src/views/ObjectView.headerFold-12705.test.tsx (6); 13 passed. Ablations ran through objectstack scripts/ablation-replace.mjs. Each anchor went from 1 hit to 0, and each restore gave blob == HEAD with git diff HEAD empty. A1, fold never engages: 8 failed. A2, unfold without hysteresis: 6 failed. A3, primary taken by row position (toolbarRowActions[0]): 1 failed (the USERS case). A5, canFold = true: the CONTROL failed. A4b, useConsumeOnce keeps returning the request: the exactly-once pin failed with 'expected to be called 1 times, but got 2 times'. A4 removed the guard that kept the fold off while a deep link was armed; all 13 stayed green, so I dropped the guard as unneeded (commit 5c886c9). No dist ablation was needed because the tests import src by relative path. Full app-shell suite: pnpm --filter @object-ui/app-shell test on 5c886c9 under os-verify-lock, VERDICT command-exit 0, Test Files 1468 passed | 1 skipped (1469), Tests 13832 passed | 9 skipped (13841). After e1c4356 (Packages, ObjectDataPage): 117 targeted app-shell files (PageHeader, ObjectView, ObjectDataPage, PackagesPage, i18n, product-neutral ratchet), 1256 tests, exit 0. The 16 apps/console test files that import these components: 337 tests, exit 0 (at c878e1a).",
"gates": "Local; each exit code captured before any pipe. Closure build pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build: exit 0. pnpm --filter @object-ui/app-shell type-check: exit 0 (after the last source commit). pnpm --filter @object-ui/app-shell test (full, 5c886c9): exit 0. pnpm --filter @object-ui/app-shell build: exit 0. pnpm --filter '@object-ui/console^...' build: exit 0, then pnpm --filter @object-ui/console build: exit 0. A first console build attempt exited 2 with TS2882 on plugin packages not yet built (outside app-shell's dependency closure); that is not a gate reading. eslint on the 7 touched ts/tsx files: exit 0, 0 errors, 219 warnings. Against base that is +1 react-refresh/only-export-components in ObjectView.tsx, from exporting declaredPrimaryToolbarAction; PageHeader.tsx, ObjectDataPage.tsx and PackagesPage.tsx add no warnings. pnpm check:i18n-keys: exit 0. pnpm check:i18n-drift: exit 0. pnpm check:i18n-designer-parity: exit 0 (new key engine.packages.moreActions, en and zh). node scripts/check-changeset-presence.mjs: exit 0. pnpm check:new-line-citations: exit 0 (0 new). Control-byte scan of the changed files: empty. objectui has no scripts/pm/dispatch-gates.mjs, so this list is derived by hand as the dispatch asks. CI check-runs: NOT MEASURED, because no PR is open (the PM opens it).",
"mcp_calls": "5 GitHub MCP reads, 0 writes: mcp__github__issue_read get #12705, get_comments #12705, get #12606, get #12695, get #12702. Plus 2 claude-code-remote add_repo calls with read access; both answered 'read_available' and attached nothing.",
"api_writes": "0 REST writes. git push only: claude/issue-12705-header-actions-fold (the empty branch first, then commits up to c878e1a) and claude/issue-12705-evidence (59aec883d).",
"open_questions": [
{
"question": "How does ConsolePageHeader learn which action is primary and what folds? (Decided; recorded on the four axes.)",
"options": [
"A (taken): one optional ReactNode prop, foldedActions, holding the page's whole folded set (the primary action with its label plus its ⋯ menu). The header measures and swaps.",
"B: a separate primaryAction node beside actions. The header would still have to turn the rest of actions, an opaque node, into menu items, and it cannot.",
"C: structured items, each with a primary flag plus a button form and a menu-item form. The list's schema toolbar actions only render correctly as menu items inside action:bar's own overflow menu (capability gate, visible and disabled gates, execute payload). Per-item menu forms would need a new @object-ui/components export or a copy of that execute payload."
],
"recommendation": "A. Business need: measured on three pages that cut today (Opportunities, Setup Packages, the object data page), and the list's primary is already declared in metadata (variant primary on sys_user's invite_user). Long term: one header, one measurement, no new components API, and the schema actions keep their single run path. AI-error axis: weaker than C, because a caller could leave an action out of its folded set. The ObjectView pins assert the menu contents, and the list builds its menu from the same action list its row draws. Startup focus: one optional ReactNode, no new gate, nothing retired."
},
{
"question": "os-dev.md tells the dev to open the draft PR and post the os-dev-report comment through scripts/pm and the fleet-write relay. This dispatch says the relay is refused (403) in this container and forbids both. Which wins?",
"options": [
"A (taken): follow the dispatch's restricted channel. No PR, no comment, no label; the report goes in the final message for the seat to post.",
"B: try the relay first."
],
"recommendation": "A. The file wins on rules, but by the seat's measurement this container cannot reach the relay, and the file's fallback is that the seat files and writes on the dev's behalf. I did not try the relay, so the 403 is the seat's reading, not mine."
}
],
"out_of_scope_findings": [
"carrier: objectui#11638 · an action:bar overflow member's properties.params is not evaluated. A toolbar action folded into the list's menu has that existing limit, as it does today when it spills past maxVisible · noted, not filed"
],
"deviations": [
"Premise partly moved: Setup Users at 1024 px no longer cuts (since objectui#12606). The cut still happens in the one-row layout (Opportunities) and on Setup Packages. The fold lives in the header, so it applies to both layouts; Setup Users folds at narrower widths (measured at 680 px: Invite User keeps its label, Import and Create User go into the menu).",
"The card says folded actions go 'above Share / Delete'. The list header's own menu holds Add to favorites and Reset view; Share and Delete belong to the record page's page:header renderer. So folded actions go above those two entries.",
"When folded, the list's menu is the toolbar action:bar's overflow menu, not ObjectView's own dropdown. The test ids object-view-more-actions, object-view-favorite and object-view-reset-view stay; they are drawn whenever the header is not folded.",
"Files outside the claim's list: packages/app-shell/src/views/ObjectDataPage.tsx (a caller with two actions whose description is cut at 800 px), packages/app-shell/src/views/metadata-admin/i18n.ts (one new key, engine.packages.moreActions, en and zh), packages/app-shell/README.md (docs for foldedActions, AGENTS.md #2). PackagesPage.tsx is a Setup page that passes actions, so it is inside the claim.",
"Mechanism assumptions: (1) Confirmed: actions was one shrink-0 cluster after refresh in both layouts, with no fold. (2) Partly false: ObjectView does pass one actions node for sys_user, but there is no New. Import is ObjectView's own button; Invite User and Create User come from the schema list_toolbar action:bar, and invite_user declares variant primary. (3) Holds as a control in a slightly different form: Setup Audit Logs draws no labelled action (only Refresh), and its description rendered whole at 1024 px.",
"The full app-shell suite ran once, on 5c886c9. The two later source commits were covered by 117 targeted app-shell files and 16 console files. This narrowing is declared; CI runs the full set.",
"Commit trailers use AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude) instead of the harness's trailer with the model name, because the AGENTS.md rule takes precedence.",
"Lint: one new react-refresh/only-export-components warning in ObjectView.tsx, from exporting declaredPrimaryToolbarAction (the file already exports several helpers the same way); 0 errors.",
"The worktree /home/user/objectui-issue-12705 stays in place because no PR is open yet (os-dev cleans up after the PR opens). The evidence worktree is removed, and the backend on :4071 and console on :5197 that I started are stopped."
],
"files_changed": [
"packages/app-shell/src/layout/PageHeader.tsx",
"packages/app-shell/src/layout/__tests__/PageHeader.actionsFold-12705.test.tsx",
"packages/app-shell/src/views/ObjectView.tsx",
"packages/app-shell/src/views/ObjectView.headerFold-12705.test.tsx",
"packages/app-shell/src/views/ObjectDataPage.tsx",
"packages/app-shell/src/views/metadata-admin/PackagesPage.tsx",
"packages/app-shell/src/views/metadata-admin/i18n.ts",
"packages/app-shell/README.md",
".changeset/12705-header-actions-fold.md"
],
"screenshots": [
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/opportunities-1024-light-before.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/opportunities-1024-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/opportunities-1024-light-menu.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1024-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1024-dark.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1280-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1280-dark.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-680-light-folded-menu.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-packages-1024-light.png?raw=true"
],
"line_budget": "n/a",
"pr_title_draft": "feat(app-shell): the console page header folds its actions before it cuts the description (objectui#12705)",
"pr_body_draft": "(elided: it is the body of objectstack-ai/objectui#12754, opened from it verbatim by the seat)"
}
Relayed by seat domain:ui#4 (session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final message (degraded channel: the session pushed and returned pr: null; the seat opened #12754 from pr_title_draft and pr_body_draft, and set pr above).
Landed · PR #12754 merged as 80863ad on main · read 2026-10-16T19:08Z
probe on origin/main80863ad
reading
control
foldedActions in packages/app-shell/src/layout/PageHeader.tsx
6 mentions
the one optional member on ConsolePageHeaderProps, and the header's swap
ResizeObserver in the same file
present (:317)
the header measures its own width, not the viewport
foldedActions in views/ObjectView.tsx, views/ObjectDataPage.tsx, metadata-admin/PackagesPage.tsx
1 each
the three callers that draw more than one labelled action declare their folded face
export function declaredPrimaryToolbarAction in views/ObjectView.tsx
1 (:179)
the primary is declared (New, else variant: 'primary'), never taken by row position
foldedActions / declaredPrimaryToolbarAction in packages/app-shell/src/index.ts
0
no new name on the entry; the prop rides the already-exported ConsolePageHeaderProps
engine.packages.moreActions in metadata-admin/i18n.ts
2 (en, zh)
app-shell's internal strings, not an @object-ui/i18n key
*12705* test files
2
the header pins and the list-header pins
.changeset/12705-header-actions-fold.md
present
—
PNG files in the merge's diff
0
the screenshots stay on claude/issue-12705-evidence (59aec88)
State change: the card closed as completed through Fixes #12705, and pm:dispatched is removed in this act. The cloud session session_01Xdo68iRc7fYqRwjmU3FoD1 is archived. The contract review of record is TIER_DEFAULT PASS at c878e1a (6221947872); the ACCEPT is 6221941062 and the landing note 6222126268.
Merge path: the first merge-group build was dequeued at 18:52 when Test (shard 8/16) hit the job's 20-minute ceiling with no failing test (diagnosis 6222571483). The one re-queue merged at 19:07 on a fresh merge group, which supports the runner reading. Nothing was changed between the two attempts.
Not filed: an action:bar overflow member's properties.params is not evaluated. That is objectui#11638's existing limit, which a folded toolbar action shares with today's spill past maxVisible.
Activity
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 3 (
priority:p2; filed by the epic PM session from the 2026-10-16 fourth review, on the maintainer's 「全部立卡,平台问题到 objectui…」)Session:
session_01SJn1GEkrbbBQkhGC26wEDwAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12705-header-actions-foldWorktree:
objectui-issue-12705(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/app-shell/src/layout/PageHeader.tsx(the actions cluster and its fold), the header's callers only where the fold needs them to say which action is primary (packages/app-shell/src/views/ObjectView.tsxheader row, the Setup pages that passactions), tests beside each, one.changeset/12705-*.md(stop on breach; explain in the report)Container & model:
M,mode:cloud,model: opus(cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 3 on 「当前任务处理完,后续并发降到3」, this session's chat, 2026-10-16)Clause-②: yes
Clause-② reason:
ConsolePageHeaderPropsis exported from@object-ui/app-shell, and folding all but the primary action very likely needs the header to know which action is primary (a structured actions member or a marker), which widens that type. «拿不准 ⇒ 按 yes». The seat'sTIER_DEFAULTreview comes before ready.Responsibility: n/a — a measured header layout defect
Thread-read: none
Serial constraints cleared: objectui#12606 (this seat, the same header's Setup posture) landed as
c41ce3f, which clears the card's "lands second" constraint. No open objectui PR touchesPageHeader.tsx,ObjectView.tsxorResourceListPage.tsx. objectui#12695 (the icon-only list toolbar) is unclaimed and edits the list toolbar, not the page header.objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12705, "status": "done", "branch": "claude/issue-12705-header-actions-fold", "pr": 12754, "session": "session_01Xdo68iRc7fYqRwjmU3FoD1; dispatched by PM seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw", "premise_still_valid": true, "summary": "Premise re-measured on main c41ce3f. At 1024 px Setup Users no longer cuts its description: objectui#12606 put the description on its own line. The cut still happens in the one-row layout: HotCRM Opportunities at 1024 px, with New, Import and Update Stage, shows 154 of the 284 px its description needs. Setup Packages also cuts at 1024 px (374 of 428 px). ConsolePageHeader gains one optional prop, foldedActions: the page's folded set of actions, meaning the primary action with its label plus the page's ⋯ menu. The header measures its own width (a ResizeObserver plus a pass after every render). It swaps actions for foldedActions before the title or the description is cut, and only unfolds once the text would still fit, so it does not flip-flop. ObjectView declares the list's folded set. The primary is New, or else the toolbar action authored with variant primary. Import, the other toolbar actions, favorites and Reset view go into one action:bar overflow menu. Setup Packages and the object data page move their second action into a new menu. Branch pushed at c878e1a; screenshots on claude/issue-12705-evidence at 59aec883d.", "tests": "HEAD c878e1a. New pins: packages/app-shell/src/layout/__tests__/PageHeader.actionsFold-12705.test.tsx (7) and packages/app-shell/src/views/ObjectView.headerFold-12705.test.tsx (6); 13 passed. Ablations ran through objectstack scripts/ablation-replace.mjs. Each anchor went from 1 hit to 0, and each restore gave blob == HEAD with git diff HEAD empty. A1, fold never engages: 8 failed. A2, unfold without hysteresis: 6 failed. A3, primary taken by row position (toolbarRowActions[0]): 1 failed (the USERS case). A5, canFold = true: the CONTROL failed. A4b, useConsumeOnce keeps returning the request: the exactly-once pin failed with 'expected to be called 1 times, but got 2 times'. A4 removed the guard that kept the fold off while a deep link was armed; all 13 stayed green, so I dropped the guard as unneeded (commit 5c886c9). No dist ablation was needed because the tests import src by relative path. Full app-shell suite: pnpm --filter @object-ui/app-shell test on 5c886c9 under os-verify-lock, VERDICT command-exit 0, Test Files 1468 passed | 1 skipped (1469), Tests 13832 passed | 9 skipped (13841). After e1c4356 (Packages, ObjectDataPage): 117 targeted app-shell files (PageHeader, ObjectView, ObjectDataPage, PackagesPage, i18n, product-neutral ratchet), 1256 tests, exit 0. The 16 apps/console test files that import these components: 337 tests, exit 0 (at c878e1a).", "gates": "Local; each exit code captured before any pipe. Closure build pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build: exit 0. pnpm --filter @object-ui/app-shell type-check: exit 0 (after the last source commit). pnpm --filter @object-ui/app-shell test (full, 5c886c9): exit 0. pnpm --filter @object-ui/app-shell build: exit 0. pnpm --filter '@object-ui/console^...' build: exit 0, then pnpm --filter @object-ui/console build: exit 0. A first console build attempt exited 2 with TS2882 on plugin packages not yet built (outside app-shell's dependency closure); that is not a gate reading. eslint on the 7 touched ts/tsx files: exit 0, 0 errors, 219 warnings. Against base that is +1 react-refresh/only-export-components in ObjectView.tsx, from exporting declaredPrimaryToolbarAction; PageHeader.tsx, ObjectDataPage.tsx and PackagesPage.tsx add no warnings. pnpm check:i18n-keys: exit 0. pnpm check:i18n-drift: exit 0. pnpm check:i18n-designer-parity: exit 0 (new key engine.packages.moreActions, en and zh). node scripts/check-changeset-presence.mjs: exit 0. pnpm check:new-line-citations: exit 0 (0 new). Control-byte scan of the changed files: empty. objectui has no scripts/pm/dispatch-gates.mjs, so this list is derived by hand as the dispatch asks. CI check-runs: NOT MEASURED, because no PR is open (the PM opens it).", "mcp_calls": "5 GitHub MCP reads, 0 writes: mcp__github__issue_read get #12705, get_comments #12705, get #12606, get #12695, get #12702. Plus 2 claude-code-remote add_repo calls with read access; both answered 'read_available' and attached nothing.", "api_writes": "0 REST writes. git push only: claude/issue-12705-header-actions-fold (the empty branch first, then commits up to c878e1a) and claude/issue-12705-evidence (59aec883d).", "open_questions": [ { "question": "How does ConsolePageHeader learn which action is primary and what folds? (Decided; recorded on the four axes.)", "options": [ "A (taken): one optional ReactNode prop, foldedActions, holding the page's whole folded set (the primary action with its label plus its ⋯ menu). The header measures and swaps.", "B: a separate primaryAction node beside actions. The header would still have to turn the rest of actions, an opaque node, into menu items, and it cannot.", "C: structured items, each with a primary flag plus a button form and a menu-item form. The list's schema toolbar actions only render correctly as menu items inside action:bar's own overflow menu (capability gate, visible and disabled gates, execute payload). Per-item menu forms would need a new @object-ui/components export or a copy of that execute payload." ], "recommendation": "A. Business need: measured on three pages that cut today (Opportunities, Setup Packages, the object data page), and the list's primary is already declared in metadata (variant primary on sys_user's invite_user). Long term: one header, one measurement, no new components API, and the schema actions keep their single run path. AI-error axis: weaker than C, because a caller could leave an action out of its folded set. The ObjectView pins assert the menu contents, and the list builds its menu from the same action list its row draws. Startup focus: one optional ReactNode, no new gate, nothing retired." }, { "question": "os-dev.md tells the dev to open the draft PR and post the os-dev-report comment through scripts/pm and the fleet-write relay. This dispatch says the relay is refused (403) in this container and forbids both. Which wins?", "options": [ "A (taken): follow the dispatch's restricted channel. No PR, no comment, no label; the report goes in the final message for the seat to post.", "B: try the relay first." ], "recommendation": "A. The file wins on rules, but by the seat's measurement this container cannot reach the relay, and the file's fallback is that the seat files and writes on the dev's behalf. I did not try the relay, so the 403 is the seat's reading, not mine." } ], "out_of_scope_findings": [ "carrier: objectui#11638 · an action:bar overflow member's properties.params is not evaluated. A toolbar action folded into the list's menu has that existing limit, as it does today when it spills past maxVisible · noted, not filed" ], "deviations": [ "Premise partly moved: Setup Users at 1024 px no longer cuts (since objectui#12606). The cut still happens in the one-row layout (Opportunities) and on Setup Packages. The fold lives in the header, so it applies to both layouts; Setup Users folds at narrower widths (measured at 680 px: Invite User keeps its label, Import and Create User go into the menu).", "The card says folded actions go 'above Share / Delete'. The list header's own menu holds Add to favorites and Reset view; Share and Delete belong to the record page's page:header renderer. So folded actions go above those two entries.", "When folded, the list's menu is the toolbar action:bar's overflow menu, not ObjectView's own dropdown. The test ids object-view-more-actions, object-view-favorite and object-view-reset-view stay; they are drawn whenever the header is not folded.", "Files outside the claim's list: packages/app-shell/src/views/ObjectDataPage.tsx (a caller with two actions whose description is cut at 800 px), packages/app-shell/src/views/metadata-admin/i18n.ts (one new key, engine.packages.moreActions, en and zh), packages/app-shell/README.md (docs for foldedActions, AGENTS.md #2). PackagesPage.tsx is a Setup page that passes actions, so it is inside the claim.", "Mechanism assumptions: (1) Confirmed: actions was one shrink-0 cluster after refresh in both layouts, with no fold. (2) Partly false: ObjectView does pass one actions node for sys_user, but there is no New. Import is ObjectView's own button; Invite User and Create User come from the schema list_toolbar action:bar, and invite_user declares variant primary. (3) Holds as a control in a slightly different form: Setup Audit Logs draws no labelled action (only Refresh), and its description rendered whole at 1024 px.", "The full app-shell suite ran once, on 5c886c9. The two later source commits were covered by 117 targeted app-shell files and 16 console files. This narrowing is declared; CI runs the full set.", "Commit trailers use AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude) instead of the harness's trailer with the model name, because the AGENTS.md rule takes precedence.", "Lint: one new react-refresh/only-export-components warning in ObjectView.tsx, from exporting declaredPrimaryToolbarAction (the file already exports several helpers the same way); 0 errors.", "The worktree /home/user/objectui-issue-12705 stays in place because no PR is open yet (os-dev cleans up after the PR opens). The evidence worktree is removed, and the backend on :4071 and console on :5197 that I started are stopped." ], "files_changed": [ "packages/app-shell/src/layout/PageHeader.tsx", "packages/app-shell/src/layout/__tests__/PageHeader.actionsFold-12705.test.tsx", "packages/app-shell/src/views/ObjectView.tsx", "packages/app-shell/src/views/ObjectView.headerFold-12705.test.tsx", "packages/app-shell/src/views/ObjectDataPage.tsx", "packages/app-shell/src/views/metadata-admin/PackagesPage.tsx", "packages/app-shell/src/views/metadata-admin/i18n.ts", "packages/app-shell/README.md", ".changeset/12705-header-actions-fold.md" ], "screenshots": [ "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/opportunities-1024-light-before.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/opportunities-1024-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/opportunities-1024-light-menu.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1024-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1024-dark.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1280-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-1280-dark.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-users-680-light-folded-menu.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/59aec883d08cc6fdec1b63848d5ad7f5c0659685/docs/design/findings/12705/setup-packages-1024-light.png?raw=true" ], "line_budget": "n/a", "pr_title_draft": "feat(app-shell): the console page header folds its actions before it cuts the description (objectui#12705)", "pr_body_draft": "(elided: it is the body of objectstack-ai/objectui#12754, opened from it verbatim by the seat)" }Relayed by seat
domain:ui#4(session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final message (degraded channel: the session pushed and returnedpr: null; the seat opened #12754 frompr_title_draftandpr_body_draft, and setprabove).Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed · PR #12754 merged as
80863adonmain· read 2026-10-16T19:08Zorigin/main80863adfoldedActionsinpackages/app-shell/src/layout/PageHeader.tsxConsolePageHeaderProps, and the header's swapResizeObserverin the same filefoldedActionsinviews/ObjectView.tsx,views/ObjectDataPage.tsx,metadata-admin/PackagesPage.tsxexport function declaredPrimaryToolbarActioninviews/ObjectView.tsxvariant: 'primary'), never taken by row positionfoldedActions/declaredPrimaryToolbarActioninpackages/app-shell/src/index.tsConsolePageHeaderPropsengine.packages.moreActionsinmetadata-admin/i18n.ts@object-ui/i18nkey*12705*test files.changeset/12705-header-actions-fold.mdclaude/issue-12705-evidence(59aec88)State change: the card closed as completed through
Fixes #12705, andpm:dispatchedis removed in this act. The cloud sessionsession_01Xdo68iRc7fYqRwjmU3FoD1is archived. The contract review of record isTIER_DEFAULTPASS atc878e1a(6221947872); the ACCEPT is6221941062and the landing note6222126268.Merge path: the first merge-group build was dequeued at 18:52 when
Test (shard 8/16)hit the job's 20-minute ceiling with no failing test (diagnosis6222571483). The one re-queue merged at 19:07 on a fresh merge group, which supports the runner reading. Nothing was changed between the two attempts.Not filed: an
action:baroverflow member'sproperties.paramsis not evaluated. That is objectui#11638's existing limit, which a folded toolbar action shares with today's spill pastmaxVisible.Generated by Claude Code