Repository navigation
Description
Filing gate ④ (a coordination node: one parent, its child cards listed below) on the maintainer's instruction, gate ③ (chat, 2026-10-15, session session_019YFzJp4o8Ck4NsT1toC4UP, seat account os-bill), verbatim: 「这些任务都是你处理吗? 是否建议开专题卡」 and, on the seat's recommendation of a tracking parent, 「同意专题卡」. The design every child follows is the maintainer-approved prototype at https://claude.ai/artifact/8JLqDFmcuK82RS1Cb8219f (private to the maintainer; artboards: the 1440 main board, the 1024 laptop board with the collapsed icon rail, the 390 phone board that keeps today's phone shape). The maintainer's framing of the whole, verbatim: 「我关心的是平台整体界面的布局优化」 and 「crm 本身的元数据不重要,我关心的还是平台的基础能力」 — every child changes @object-ui/* platform behaviour; the two HotCRM cards of the audit round (below) are listed here for the record and change HotCRM view metadata only.
Reader who acts: nobody on this card itself — it is not dispatchable and carries no pm:queue. The domain:ui lane's seat (seat post objectstack-ai/objectui#9800, vacant since the filing session clocked out) claims and dispatches each child from pm:queue on its own, one dev at a time, and keeps the checklist below current at each round boundary. The maintainer adds follow-ups as comments here; the seat turns each into a child card.
Dedupe (MCP search_issues, scope objectstack-ai/objectui, all states, read 2026-10-15T07:25Z): "tracking parent card console list page shell layout sidebar favorites toolbar Display prototype" → 37 total, top 8 read: the four children (#12440, objectstack-ai/objectui#12423, objectstack-ai/objectui#12429, objectstack-ai/objectui#12427) and four unrelated closed cards (#12211 browser-pass list card, objectstack-ai/objectui#11572 InterfaceListPage projection, objectstack-ai/objectui#5720 AppSidebar observation, objectstack-ai/objectui#3946 app-shell.mdx). No open or closed parent for this prototype. None is this card.
What the prototype changes, and where each piece lives
The list page on a 1440 px desktop spent about 290 px of chrome before its first row and offered up to twelve toolbar controls at once; the sidebar had two "keep this handy" controls that landed in different places, and its collapse toggle sat at the bottom-left of a long navigation. The prototype's shape: four toolbar controls (Filter · Sort · Display · Search) with everything else inside Display; saved-view tabs sized to the width, on the same row as those controls; one leading cell per grid row (number, checkbox on hover); a one-row page header; one Favorites section at the top of the sidebar fed by a hover ⋯ menu on each item and by the page's overflow menu; the collapse toggle in the app bar's left slot at every width; the phone shape unchanged.
Children of the prototype round (all landed)
- console list page: the toolbar's settings cluster folds into one Display popover, view tabs size to their width and carry the view's type icon, the row-number cell yields to the checkbox on hover, and the page header is one row objectui#12423 — list page: the Display popover, width-fitted view tabs, the leading cell, the one-row header. MERGED 2026-10-15T07:29Z as
a2225f9(PR feat(list): Filter · Sort · Display · Search toolbar, width-fitted view tabs, one leading row cell, one-row page header objectui#12436; ACCEPT + contract review PASS on head4ba299c). - console shell: the page-header star and the sidebar pin become one "Pin to sidebar" action in the page overflow menu, landing in the Pinned section at the top; the app sidebar's bottom Favorites group goes objectui#12427 — Favorites: the sidebar ⋯ menu, the top Favorites section, the two
NavigationRendererprops, the list header ⋯ entry, the record overflow entry, the i18n keys: PR feat(app-shell): the sidebar entry's ⋯ menu, one component for every entry type (part of objectui#12427) objectui#12443 MERGED 2026-10-15T08:37Z asa8e5b73. The remainder (the record header star draws only where the host wires a toggle,@object-ui/componentscontainers.tsx): PR fix(components): the record header star draws only where the host wires a toggle (objectui#12427) objectui#12465 MERGED 2026-10-15T10:37Z as5c4deb5. - console list page: the saved-view tab strip and the toolbar's four controls share one row — ListView takes a leading toolbar slot as a host prop and the console passes ViewTabBar into it objectui#12440 — the saved-view tab strip and the four controls share one row (
ListViewtakes a leading toolbar slot as a host prop; the console passesViewTabBarinto it). PR feat(list): view tabs share the list toolbar row — ListView toolbarLeading host prop (objectui#12440) objectui#12473 MERGED 2026-10-15T12:34Z asd4bc81e. Left behind one regression, console list page: the saved-view tab strip inside the toolbar's leading slot folds to one tab and "N more" at 1440 — the bar's root does not grow, so the width the fit is derived from is its own content's width (regression of #12440) objectui#12518 below. - console shell: the sidebar collapse toggle moves from the sidebar footer to the app bar's left slot at every width, where the drawer button already sits below lg objectui#12429 — the sidebar collapse toggle moves from the sidebar footer to the app bar's left slot at every width. PR feat(app-shell): the sidebar trigger moves to the app bar's left slot at every width (objectui#12429) objectui#12466 MERGED 2026-10-15T10:29Z as
e869e41. - docs: the console layout design reference (three artboard PNGs and the targets table) lands under docs/design/console-layout-2026-10-15/ so every dev and seat of #12444 builds and reviews against the same picture objectui#12457 — closed, not planned, on the maintainer's ruling 「设计参照 PNG 进仓库 不应该,你放在 issue 上就可以」: the design reference stays on the reference page linked above and in chat; nothing lands in the repository.
- console app bar: the object breadcrumb after the app switcher goes, the Preview badge stays beside the app name, and Edit app is an icon button at every width — the page header is the one place a page is named objectui#12461 — app bar: the object breadcrumb after the app switcher goes, the Preview badge stays beside the app name, Edit app is an icon button at every width. PR feat(app-shell,i18n): the console app bar's left group is the app pill and its PREVIEW chip; an object route draws no crumb; Edit app is an icon button (objectui#12461) objectui#12469 MERGED 2026-10-15T11:12Z as
d9d9d98. - console list page: a list_toolbar action that acts on a selection leaves the page header for the selection bar — the bar floats when rows are selected, next to the view's bulkActions, and the header keeps only New, Import and the ⋯ objectui#12462 — list page: a selection-scoped
list_toolbaraction (the demo's Add to Campaign) leaves the header for the selection bar that floats when rows are selected, next to the view'sbulkActions; the header keeps New, Import and ⋯. PR feat(app-shell): the list header leaves a bulk-wired, record-scoped list_toolbar action to the selection bar (objectui#12462) objectui#12494 MERGED 2026-10-15T13:47Z asd35cfbf. - console list page: on desktop the table scrolls inside the page under a sticky header while the app bar, page header, view row and footer stay put; at 1024 the first and the actions column stick and a right-edge shadow says more columns follow objectui#12463 — list page: on desktop the table scrolls inside the page under its sticky header while the chrome and the footer stay put; at 1024 the first and the actions column stick and a right-edge shadow says more columns follow. PR feat(console): list table scrolls inside the page below banners; data-table right-edge scroll shadow (objectui#12463) objectui#12479 MERGED 2026-10-15T11:56Z as
c950345.
Acceptance of the round: the filing session's post-merge screenshots at 1440 / 1024 / 390 were shown to the maintainer in chat; the gaps the maintainer named became objectstack-ai/objectui#12461, objectstack-ai/objectui#12462 and objectstack-ai/objectui#12463 above, now landed.
Children of the audit round (filed 2026-10-15T14:31Z)
On the maintainer's instruction 「更新最新的代码,完整的测试一下前端用户界面的各项功能,评估还有哪些可以改进的地方」 the filing session audited the HotCRM console on main 720f6d4 (report, private to the maintainer: https://claude.ai/artifact/XPrn5eZMsQaKUgasMJEMmR; 93 screenshots at 1440 / 1024 / 390, light and dark, en and zh-CN; every function exercised worked, zero runtime errors). The maintainer answered 「同意开卡,使用 pm-dispatch 创建卡片」 and then 「你创建的卡片可以放到队列让 ui 车道自己认领吧?」: every card below sits in pm:queue with no assignee for the lane's seat to claim; nothing is dispatched by the filing session. The quota of three cards per fire is exceeded on that word, which approved the report's list as a set.
- console list page: the saved-view tab strip inside the toolbar's leading slot folds to one tab and "N more" at 1440 — the bar's root does not grow, so the width the fit is derived from is its own content's width (regression of #12440) objectui#12518 — p1, regression of console list page: the saved-view tab strip and the toolbar's four controls share one row — ListView takes a leading toolbar slot as a host prop and the console passes ViewTabBar into it objectui#12440: the tab strip inside the toolbar's leading slot folds to one tab + "N more" at 1440 because the bar's root does not grow (
flex-grow: 0), so the width the fit is derived from is its own content's.@object-ui/plugin-view, size S. - console sidebar: the ⋯ menu's Design entry opens the metadata-admin page, which calls a packaged object locked, while the app bar's Edit app opens Studio's Data surface for the same object — one designer, one destination objectui#12520 — p1: the sidebar ⋯ menu's Design entry opens the metadata-admin page (which calls a packaged object locked) while the app bar's Edit app opens Studio's Data surface; one derivation, one destination.
@object-ui/app-shell, size S. - console record form: a create/edit dialog with no authored layout opens at 95vw with one column of unequal field widths — a bounded dialog with a two-column field grid and one width per field kind objectui#12521 — p1: a create/edit dialog with no authored layout opens at 95vw with one column of unequal field widths; a bounded dialog with a two-column field grid.
@object-ui/plugin-form, size M. - record page header: the highlight strip clips its last values at 1440 ("+1-555-0") and at 390 mixes a two-column grid with an indented list — values truncate with a tooltip or wrap, and the phone strip keeps one layout objectui#12523 — p1: the record page's highlight strip clips its last values at 1440 and mixes two layouts at 390; values truncate with a tooltip or wrap, one phone layout.
@object-ui/plugin-detail, size S. - console inbox and home: the Activity feed lists platform events (JWKS keys, data migrations, owner backfills, every login) to business users — the feed reads the app's business objects only objectui#12530 — p1: the bell's Activity feed and the home card list platform events (JWKS keys, data migrations, every login) to business users; the feed reads the app's business objects only.
@object-ui/app-shell, size S–M. - console page headers: object lists, dashboards and component pages draw three header shapes and dashboards keep an app-bar crumb — one PageHeader for all three, the page named once objectui#12526 — p2: object lists, dashboards and component pages draw three page-header shapes and dashboards keep an app-bar crumb; one
PageHeaderfor all three.@object-ui/app-shell, size M. - record page History: an activity row with no actor at all (actor_id and actor_name both null: seed and system writes) reads "Unknown user" with a "?" avatar — it reads System objectui#12527 — p2: a History row with no actor at all reads "Unknown user"; it reads System.
@object-ui/plugin-detail+ i18n, size S. - record page header ⋯ menu: the system entries (Edit, favorites, Share, Delete) carry no icons beside the app's iconed actions, and Edit has no header control when the row is full — icons on every entry, Delete last, an Edit icon button beside the ⋯ objectui#12529 — p2: the record header ⋯ menu's system entries carry no icons and Edit has no header control when the row is full.
@object-ui/app-shell, size S. - console list and dashboard chrome (family card): the view description's own row, the sort popover's standing lookup note, the metric card's four-line stack and the two-row list footer — four nails, one card objectui#12528 — p2, family card: the view description's own row, the sort popover's standing note, the metric card's four-line stack, the two-row list footer.
plugin-list,plugin-grid,plugin-dashboard, size M. - Leads views: Lead Pipeline and Lead Cards split first and last name into separate lines and repeat the name — full_name as the card title with business fields in the body; Lead Calendar keys on created_at hotcrm#2122 — p2, HotCRM metadata: Lead Pipeline and Lead Cards split the name into two lines and repeat it;
full_nameas the card title; Lead Calendar keys oncreated_at. Claimed by therepo:hotcrmseat, not this lane. - Leads, Accounts and Opportunities grid views: no column chooser in Display because userActions.hideFields is unset — declare it once the objectui Hide Fields persistence fixes (objectui#12474, objectui#12505) are released hotcrm#2123 — p2,
pm:blockedon console list toolbar: the density toggle and Hide Fields still write the shared view, so one user's click changes the list for everyone and a walled tenant is refused (the rest of objectui#12418's family) objectui#12474 and console list toolbar: Hide Fields on a user's saved view that declares no columns is session-only after objectui#12474 (it used to persist by writing the shared view) objectui#12505: the grid views declare nouserActions.hideFields, so Display has no column chooser; declared once the Hide Fields persistence fixes are released.
Not carded from the audit, by the filing gate: the dev-mode boot cost (3,303 module requests on a full reload; a production build measurement first), the pre-login 401s and the auth/organization/list 404 on boot, and the 2-second "Connected" flash of ConnectionStatus (by design).
Parallelism: objectstack-ai/objectui#12518 (plugin-view), objectstack-ai/objectui#12521 (plugin-form), objectstack-ai/objectui#12523 and objectstack-ai/objectui#12527 (plugin-detail, different files), objectstack-ai/objectui#12528 (plugin-list / plugin-grid / plugin-dashboard) touch disjoint packages and run in parallel. objectstack-ai/objectui#12520, objectstack-ai/objectui#12530, objectstack-ai/objectui#12526 and objectstack-ai/objectui#12529 all edit @object-ui/app-shell: objectstack-ai/objectui#12520 (SidebarItemMenu.tsx), objectstack-ai/objectui#12530 (hooks/sharedUserFeeds.ts, layout/ActivityFeed.tsx), objectstack-ai/objectui#12526 (layout/PageHeader.tsx, views/DashboardView.tsx, layout/AppHeader.tsx) and objectstack-ai/objectui#12529 (views/RecordDetailView.tsx) are different files; the second to land merges main again.
In the prototype, not yet carded
- The 1024 px laptop board's collapsed icon rail was console shell: the sidebar collapse toggle moves from the sidebar footer to the app bar's left slot at every width, where the drawer button already sits below lg objectui#12429's acceptance, not a card of its own.
- Per-user persistence of Display settings (density, hidden fields, row numbers) landed as console lists: per-user list state (view tab order, filter state, sort, column widths) moves from localStorage and shared-view writes onto sys_user_preference ui.* keys; a toolbar sort or drag-reorder no longer rewrites the shared view objectui#12418 (
caac3b2), an existing card outside this parent; its remainder is console list toolbar: the density toggle and Hide Fields still write the shared view, so one user's click changes the list for everyone and a walled tenant is refused (the rest of objectui#12418's family) objectui#12474 / console list toolbar: Hide Fields on a user's saved view that declares no columns is session-only after objectui#12474 (it used to persist by writing the shared view) objectui#12505, outside this parent.
How this parent is kept
The checklist above is the only state on this card; the seat ticks a child when its PR is MERGED and adds a line with the merge commit. Child cards carry Blocked-by: lines to each other, not to this parent. Sub-issue links are not written: the fleet-write relay's op table has no sub-issue op and the seat writes GitHub through that relay only, so the task-list references above are the parent–child relation GitHub shows ("tracked by").
Attribution: written by the domain:ui seat in session session_019YFzJp4o8Ck4NsT1toC4UP (account os-bill) on the maintainer's instruction quoted above.
Design reference (added 2026-10-15T08:12Z on the maintainer's question 「如何确保车道能严格按照你的设计开发」)
The visual target lives in one page, readable by every session of this account and shareable by the maintainer from its Share menu: https://claude.ai/artifact/JCzrzHxTxzD4EEKCTtDaNA — the three artboards rendered to PNG (main-1440.png, laptop-1024.png, phone-390.png, fetchable as the page's files), a targets table per child card, the designer's notes verbatim, and the acceptance protocol. The interactive prototype stays at https://claude.ai/artifact/8JLqDFmcuK82RS1Cb8219f. Text beats picture: a child card's acceptance list is the spec a dev builds and a seat reviews against; the images show the shape; where they disagree the card wins and gets fixed. The audit report linked above is the second reference: its figures are what each audit-round card cites.
Pixel facts on the main board (1440 px, Leads list, admin): chrome before the first data row ≈ 183 px (app bar 48, page header 52, view row 47, table header 36); the console on main 720f6d4 measures first row y = 207 with the tab row and the toolbar on one row. At 1024 the sidebar is a 56 px icon rail and 4 tabs show with "4 more" (today one tab, objectstack-ai/objectui#12518). At 390 only the view row changes (a current-view picker, icon-only controls); the phone shape is otherwise today's.
How a landing seat proves a child matches: its ## 席位核对 carries browser readings at 1440 / 1024 / 390 against the HotCRM demo (first-row y, the toolbar's control list by test id, the folded tab count), compared with the targets table. How the maintainer accepts after merge: three screenshots of the merged console beside the three PNGs, taken by the session the maintainer designates; differences come back here as comments and become child cards.
Handover: a domain:ui PM named by the maintainer takes this parent over; the filing session landed objectstack-ai/objectui#12427 (PR objectstack-ai/objectui#12443), returned objectstack-ai/objectui#12440 and objectstack-ai/objectui#12429 to pm:queue at priority:p1 in that landing stroke, clocked out of seat 3 with the handover brief on the seat post, and later filed the audit round above without claiming any of it.
Activity
objectstack-fleet commentedon Oct 15, 2026
Maintainer's instruction 2026-10-15T07:58Z (chat, 2026-10-15, verbatim: 「那后续的任务你放回队列,按 p1 标记,开发完了合并之后你验收。」): the children not yet in development (#12440, objectstack-ai/objectui#12429) are regraded
priority:p1and go back topm:queueas soon as their blocker (#12427's PR objectstack-ai/objectui#12443) merges; anydomain:uiseat dispatches them from the queue. The filing session finishes objectstack-ai/objectui#12427 (in flight, PR objectstack-ai/objectui#12443) and then clocks out of seat 3. Acceptance of each child after its merge is the maintainer's step: screenshots of the merged console against the prototype linked above, taken by the session the maintainer designates; the seat that lands a child ticks it here and leaves the acceptance line to the maintainer.Thread-read: none
Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Post-merge acceptance readings 2026-10-15T08:56Z by the session the maintainer designated (
session_019YFzJp4o8Ck4NsT1toC4UP), onorigin/maina8e5b73(#12436 and objectstack-ai/objectui#12443 merged), the HotCRM demo's Leads list as admin, driven by Playwright; the screenshots went to the maintainer in chat and are compared with the reference page's boards.mainlist_toolbarmetadata action) stays in the header until the bulk-bar item is cardedSo: objectstack-ai/objectui#12423 and the merged half of objectstack-ai/objectui#12427 match the boards; the three gaps are exactly the queued cards (#12440 one row, objectstack-ai/objectui#12429 toggle, objectstack-ai/objectui#12427's record star) plus the uncarded bulk-bar item. Readings only; the checklist above is the seat's to tick on each landing.
Thread-read: 6187364621
Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Transferred 2026-10-26T04:56Z from objectstack-ai/objectui#12444, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the
ui/workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.Paths. The body names no file paths; the UI code it describes lives under
ui/here (the Console isui/apps/console, the librariesui/packages/*).References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#3946, objectstack-ai/objectui#5720, objectstack-ai/objectui#9800, objectstack-ai/objectui#11572, objectstack-ai/objectui#12211, objectstack-ai/objectui#12418, objectstack-ai/objectui#12423, objectstack-ai/objectui#12427, objectstack-ai/objectui#12429, objectstack-ai/objectui#12436, objectstack-ai/objectui#12440, objectstack-ai/objectui#12443 and 21 more.
No stale
pm:dispatchedor assignee to strip.Generated by Claude Code