Repository navigation
Conversation
Contributor
agatha197
force-pushed
the
feat/gh-10586-superadmin-cards
branch
from
October 27, 2026 04:06
781d239 to
4d4797d
Compare
The cards the project admin dashboard shares with the superadmin one now
take a third scope, the current domain (ADR 0012, ADR 0015 "one UI, scope
as input"), and keep the same layout:
- Session Status: 8 scopedSessionsV2(scope: {domain}) count aliases.
- Pending, Long-running and Recent Sessions: SessionList over
scopedSessionsV2; the domain rows add Project and Resource Group columns,
and the pending reason reads compute_session_nodes(scope_id: "domain:").
Pending Sessions narrows to its resource group setting only when one is
set (both pages; no setting reads every group).
- Audit Log: adminAuditLogsV2 on the superadmin page. A domain entity scope
(scopedAuditLogsV2) returns only the domain's own children (projects,
users, roles, resource groups: 566 rows against 35,002) and none of the
sessions, folders or deployments in it (0 session rows against 185), so
that card reads the whole cluster and its tooltip says so. Both queries
render one view (stats with sparklines, table, failures-only switch).
- Deployment Status: scopedDeployments(scope: {domain}).
- Folders: scopedVFoldersV2(scope: {domain}) ready and trash counts (the
domain has no folder limit).
- Users (moved to cards/UsersPanel): scopedUsersV2 active, inactive and
ACTIVE role ADMIN counts.
- Resource Allocation (moved to cards/ResourceAllocationPanel):
adminDomainResourceAllocationV2(domainName).
- i18n: the domain tooltips and the superadmin card strings, 21 locales.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The superadmin dashboard (/admin/dashboard) gets its own cards next to the shared ones; each owns its query, and range or resource group cards declare a per-card setting. Default board, in this order (PanelDefinition.order per page): 1. Session Status (shared; replaces the legacy Active Sessions card) 2. Pending Sessions (shared; resource group setting) 3. Scheduling Failures: adminSessionSchedulingHistories, a donut of four result count aliases (FAILURE, GIVE_UP, EXPIRED, NEED_RETRY; errorCode is null on every row of manager 26.10) and the newest attempts with the session (opens the drawer), project, result and message; range setting. 4. Agents (key activeAgents, replacing the legacy AgentList card): an agentsV2 status donut (four count aliases) and the agents with resource group, status, schedulable and containers. 5. Agent Statistics (agentStats, unchanged) 6. Failures by Entity Type: adminAuditLogsV2 ERROR/DENIED counts for seven entity types plus one "other types" alias, as a donut; range setting. 7. Audit Log (shared; adminAuditLogsV2 here) 8. Top Projects by Usage: adminProjectUsageBuckets of the domain over the range (periodStart after the day before) and resource group setting; each bucket row (project, resource group, day) as the manager recorded it, ordered by its CPU core-hours, never added together. 9. Fair Share: rgProjectFairShares per resource group setting, lowest factor first. Then Total Resources in Resource Group, as before. Catalog only: Long-running Sessions, Resource Allocation, Deployment Status, Folders, Users (shared cards over the domain), Resource Groups and Capacity, Recently Created Sessions (the member Recent Sessions card over the domain, under its old key), Resource Policies (keypair/user/project policy counts linking to their tabs), Keypairs and Sign-ins (adminKeypairsV2 total and inactive, adminLoginHistoryV2 failed sign-ins of the domain with delta and list), Container Registries and Notifications (rules and channels with enabled counts). - PanelDefinition.defaultHidden takes a page list and `order` places a card per page, so one shared definition can be default on one page and catalog-only on another. - Removed: the activeSessions key (stored boards drop it through sanitizeBoard), SessionCountDashboardItem, RecentlyCreatedSession and ActiveAgents, and their fragments from the admin page query; the unused activeAgent.* and session.ActiveSessions strings. - Unit tests for the scope resolver, the per-page seeding and the pure usage/failure helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The card title and factor column now read webui.menu.FairShare and fairShare.FairShareFactor, so they match the Fair Share page in every locale. The duplicate dashboard.card.FairShare / FairShareFactor keys are gone, and FairShareTooltip uses each locale's own labels for both terms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e agent list does The status donut above the table was squeezed to a few pixels once the table took the card's height. The four status counts now sit in a stat row like Session Status's, and the table is the agent list page's BAIAgentTable (ID and endpoint, resource group, the status badge, the schedulable check icon) with the container count added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es do - Container Registries: the registry page's column names, the type as plain text and the project as a token. - Fair Share: the Fair Share page's number format, with "(default)" beside a weight that is not set. - Keypairs and Sign-ins: the login history page's BAILoginHistoryTable (time, result token, client IP) with the user's email added; its failed sign-in delta now carries the range for the hover explanation. - Scheduling Failures: BAISchedulingHistoryNodes' created-at and result columns, with the session, project and reason added. The card-only column titles that no longer render leave every locale. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It counted the manager's notification rules and channels, but WebUI has no page that shows or manages them, so the numbers meant nothing and there was nowhere to link. A stored board that still lists the card drops it, as sanitizeBoard does with any unknown key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The status counts are drawn small and the type legend flows into two columns when it runs out of height, so the card fits 2x2 without the extra row this layer gave it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A card whose subject has a list page now has one arrow button at the right
end of its header, named after the destination ("View in Sessions"). The
destination is declared on the catalog entry (`detailLink`), resolved by
the board for the page's route scope, and rendered by the shared card
header. Only query keys the destination page parses are passed: the session
lists' statusCategory, the superadmin pending tab and its resource group,
the agent list's status, and the users and environment pages' tab. Cards
without a list page (failures by entity type, top projects by usage, the
audit logs, scheduling failures, resource and start cards) get no button.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
agatha197
force-pushed
the
feat/gh-10586-superadmin-cards
branch
from
October 27, 2026 04:59
4d4797d to
7930fe6
Compare
…uperadmin-cards Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # react/src/__generated__/AuditLogPanelScopedQuery.graphql.ts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-detail-links Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
agatha197
commented
Oct 30, 2026
agatha197
left a comment
Contributor
Author
There was a problem hiding this comment.
Ready-gate agent review — 11 findings — 8 Important, 3 Nit, 0 Pre-existing. The summary comment on this PR lists every finding and its outcome.
Contributor
Author
|
11 findings — 8 Important, 3 Nit, 0 Pre-existing Round 1 —
|
| # | Tag | File:line | Finding | Outcome |
|---|---|---|---|---|
| 1 | Important | react/src/components/DashboardPanels/PanelFrame.tsx:86 |
Resource group and range pickers now render in every card header in view mode, contradicting ADR 0018 ('Edit mode only'; card headers in view mode show no setting values), and the ADR is not updated in this PR. | fixed 69b607a (ADR 0018 in #10592) |
| 2 | Nit | react/src/components/DashboardPanels/boardModel.ts:317 |
activeSessions (shipped on main in admin_dashboard_board_items) is dropped without a RENAMED_PANEL_KEYS entry, while the listed keypairsLogins rename never left this stack. |
fixed db083e5 |
| 3 | Important | react/src/components/DashboardPanels/cards/AuditLogPanel.tsx:94 |
On the superadmin page the audit log card (and FailuresByEntityTypePanel) read cluster-wide adminAuditLogsV2, while ADR 0012 and ADR 0018 say this page reads the current domain; the deviation is recorded only in a code comment, not in an ADR. |
fixed 69b607a (ADR 0018 in #10592) |
| 4 | Important | react/src/components/DashboardPanels/cards/PendingSessionsPanel.tsx:294 |
Pending Sessions (and Top Projects by Usage, TopProjectsUsagePanel.tsx:217) read raw panel.settings?.resourceGroups instead of vars.resourceGroup, so with no saved setting they count every resource group while the header picker shows the current group as the card's value (ADR 0018 'Defaults'). |
fixed 28fe34d, 9ef81a5 |
| 5 | Important | react/src/components/DashboardPanels/memberCards/ResourceGroupTotalPanel.tsx:66 |
The header Used/Free toggle never reaches the body: TotalResourceWithinResourceGroup reads useControllableValue(props) with the default valuePropName: 'value', so the displayType prop is ignored and the bars stay on 'free' (and displayType is spread onto the root BAIFlex DOM node). |
fixed 4cc4d92 |
| 6 | Important | react/src/components/DashboardPanels/superadminCards/AgentStatsPanel.tsx:37 |
AgentStatsPanel now runs its own useLazyLoadQuery with only a Suspense boundary; custom cards get no BAIBoardItemErrorBoundary from contentOf, so a query error escapes the card. |
fixed f5607f7 |
| 7 | Important | react/src/components/DashboardPanels/superadminCards/FairSharePanel.tsx:46 |
The Fair Share table's page offset is not reset when the resource group changes (ResourceGroupFairShares is not keyed by it), and the new header picker makes that change routine. |
fixed 31d78ac |
| 8 | Important | react/src/components/DashboardPanels/superadminCards/TopProjectsUsagePanel.tsx:105 |
'Top projects' are ranked client-side by CPU from an arbitrary 200 buckets: every row shares the same periodStart, so PERIOD_START DESC does not pick the heaviest ones, and the 'Showing the 200 newest' note is wrong. |
fixed 9ef81a5 |
| 9 | Nit | react/src/components/DashboardPanels/useDashboardBoard.tsx:158 |
removePanel and resetLayout leave header overrides in panelSettingOverridesAtom; built-in cards reuse their key as id, so a removed and re-added card comes back with the old header pick. |
fixed 3590ff1 |
| 10 | Important | react/src/components/DashboardPanels/useDashboardBoard.tsx:251 |
A header pick that makes a card's query fail cannot be undone: MemberCard's BAIBoardItemErrorBoundary wraps PanelFrame and has no reset key, so its fallback drops the header picker and the reset button. |
fixed e94c544 |
| 11 | Nit | scripts/migration-gates/token-gate.allowlist.json:10 |
The new --board-item-padding-top allowlist entry says BAIBoard.css reads it, but no file in the tree references that token any more, so it is a stale exemption with a false reason. |
fixed ac3a1c5 |
Security review: 0 findings
Posted inline: 11 · already inline from this round: 0 · table only (outside the diff): 0 · repeats of an earlier round dropped: 0 · Nits over the cap of 3 dropped: 0 · not posted (no file:line, or style-only): 0
… refresh BAIBoardItemErrorBoundary takes resetKeys now. MemberCard resets it on the card's fetch key, and the resource-group cards also on their project and resource group, so a refresh, the auto refresh or a new resource group retries a card that failed once instead of leaving the error until a page reload. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e reach the bars TotalResourceWithinResourceGroup read its display type through useControllableValue's default 'value' prop, so the header's Used/Free toggle never reached the bars and displayType leaked onto the root DOM node. It now reads displayType and keeps the display-type props off the DOM. The card also says when no resource group is selected, resets its boundary on refresh and resource group, and keeps the header picks in its failed state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…uery failure in its card AgentStatsPanel runs its own query now, and custom cards get no error boundary from the board, so a failed query took down the dashboard. It is wrapped in BAIBoardItemErrorBoundary, reset on refresh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p in Pending Sessions The card read the raw saved setting, so with none saved it listed every resource group while the header showed the current one. It reads the card's effective resource group (vars.resourceGroup) now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ole day Usage buckets order by period start only, so the first 200 rows of the latest day were an arbitrary subset. The card now reads every bucket of that day, 200 per page (up to 5000), before ranking by CPU, and the note says how many rows the ranking used when the cap is hit. It also reads the card's effective resource group instead of the raw saved setting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… member card MemberCard's error fallback showed only the title, so a header pick that made the query fail could not be undone. The fallback keeps the header controls (and the reset button), and the boundary resets when the effective settings change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e on a new resource group The table is keyed by resource group and domain, so a header pick no longer queries the previous group's page offset. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Removing a card, deactivating it from the sider or resetting the layout now clears its in-memory header override, so a re-added card starts from its saved settings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
keypairsLogins never shipped, and main's activeSessions lived only in the localStorage layout that #10590 no longer migrates, so no stored app-config board can hold either key. The rename machinery goes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…owlist entry Nothing in the tree reads --board-item-padding-top any more. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The superadmin audit cards read adminAuditLogsV2 cluster-wide; the decision is recorded in ADR 0018 by the cascade. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moves @lablup/ui-common and @lablup/ui-common-cli to 0.2.0-alpha.20.canary-20261029050354-1feb007cd, which carries lablup/ui-common#107 (needed by #10496). No codemods run between the two canaries; the AGENTS.md ui-common blocks are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Tooltip Pin @lablup/ui-common to 0.2.0-alpha.20.canary-20261030092430-1f45b2b9a, which carries lablup/ui-common#115: Stat takes a deltaTooltip anchored to the delta itself. TrendStat no longer wraps the whole Stat in a Tooltip, forces a tabIndex and fit-content width on it, or moves the sparkline out of media to keep the two tooltips apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolves #10586, #10620, #10638, #10642
Summary
Seventh layer of the role-aware dashboard stack (#10422), reviewed after the board feature: the superadmin dashboard (
/admin/dashboard) gets its cards. Every card that also exists for members or project admins is the same component (#10597) read over the current domain (ADR 0012); superadmin-only fields are used only where no scoped field exists.Default board
scopedSessionsV2(scope: {domain})count aliases: status stats and a session-type donut with the totalscopedSessionsV2PENDING, oldest first, with project and resource group; reason fromcompute_session_nodes(scope_id: "domain:<name>")adminSessionSchedulingHistories: donut by result (FAILURE, GIVE_UP, EXPIRED, NEED_RETRY) and the newest attempts; names open the session draweragentsV2: status donut and agent list (replaces the legacy Active Agents card)agentStats(unchanged)adminAuditLogsV2ERROR/DENIED counts per entity type (7 types and "other") as a donutadminAuditLogsV2with the shared stats, sparklines, failure-only switch and copyable descriptionsadminProjectUsageBucketsfor the domain, rows ordered by CPU core-hoursrgProjectFairSharesper resource group, lowest factor firstCatalog only: Long-running Sessions, Resource Allocation (
adminDomainResourceAllocationV2), Deployment Status, Folders, Users and Resource Groups and Capacity over the domain; Recently Created Sessions; Resource Policies; Keypairs and Sign-ins (adminKeypairsV2, failed sign-ins fromadminLoginHistoryV2); Container Registries.PanelDefinitiongains a per-pageorderand per-pagedefaultHidden, so one shared definition can be on the board on one page and catalog-only on another.activeSessions,SessionCountDashboardItem,RecentlyCreatedSessionandActiveAgentsare removed; stored boards drop the old keys on read.Behaviour notes for review
adminAuditLogsV2; their tooltips say so.errorCodeis null on every row of this manager./admin/deployments/:id.Verification
cardScope.test.ts,superadminCardData.test.ts, per-page order anddefaultHiddencases inboardModel.test.tsandpanelCatalog.test.ts./admin/dashboardand/project/default/admin/dashboard: no GraphQL errors; donut and sparkline tooltips; the Scheduling Failures range setting opens in edit mode; the admin account's stored boards were not changed.Follow-up fixes in this layer: the Agents card shows its status counts as a stat row and its agents through the agent list's own table (schedulable as a check icon); the Scheduling Failures, Keypairs and Sign-ins, Container Registries and Fair Share tables render their columns the way their list pages do; the Notifications card is removed (WebUI has no page for notification rules or channels); My Sessions is 2x2 again.
Changes after the ready-gate review
Server load
AuditLogPanelAdminHistoryQuery+AuditLogPanelAdminQuery), 17 to 7 aliases per 1-minute refresh for the default range.@catch(to: NULL), so one failing count shows as 0 instead of erroring the card.activealias, as the mine and project queries did in feat(#10585): add the project admin dashboard cards #10597.Decisions (2026-10-29)
failedLogins,FailedLoginsPanel, titledashboard.card.FailedLogins, new tooltipdashboard.card.FailedLoginsTooltip. The keypair and inactive keypair counts are dropped; the failed sign-in count with its previous-range delta and the recent failed sign-ins table stay. The unusedKeypairs,InactiveKeypairs,KeypairsAndLoginsandKeypairsAndLoginsTooltipkeys are removed.keypairsLoginsis migrated on read:sanitizeBoardmaps it tofailedLoginsthroughRENAMED_PANEL_KEYS(id, layout, range setting andknownKeyscarried over, so a removed card stays removed).refresh: { min }(ADR 0018).Card header, View all links and ui-common board items (was #10627)
This PR folds the three card-header follow-ups of the stack into one review: #10639 and #10643 were closed into it. The branch now holds all three layers; the review reads the final card header (title, help, header controls, "View all") in one place.
Card "View all" links (was #10627) (#10620)
Summary
Every dashboard card whose subject has a list page gets a small "View all" text button with a right chevron at the right end of its header (an
ArrowUpRighticon at first, which read like "enlarge this card"). It opens that page in the same tab, with the card's scope and the filters the page reads from its URL.detailLinkinpanelCatalog.tsx; the board resolves it for the page's scope (mine, project, domain) and the shared card header draws the button. The button reads "View all" (dashboard.card.ViewAll); its tooltip and accessible name read "View in {menu}" (dashboard.card.ViewIn), both in all 21 locales./project/<p>/session,/project/<p>/admin/sessionor/admin/session, and the same for deployments, data and users.statusCategory=running, pending sessionstab=pending-sessions&resourceGroup=<first configured group>, agentsstatus=ALIVE, userstab=credentials, environmenttab=registry./project/p/session?statusCategory=running/project/p/admin/session?statusCategory=running/admin/session?statusCategory=running/project/p/session/admin/session/admin/session?tab=pending-sessions&resourceGroup=…/project/p/deployments/project/p/admin/deployments/admin/deployments/project/p/admin/data/admin/data/project/p/admin/users/admin/users/admin/agent?status=ALIVE//admin/agent/admin/scheduler/admin/resource-policy/admin/users?tab=credentials/admin/environment?tab=registryVerification
VERIFY_BASE=origin/main VERIFY_TESTS=1 bash scripts/verify.sh:=== ALL PASS ===.detailLink.test.tscovers the role and scope cases.Changes after the ready-gate review
PanelFrameintoPanelDetailLinkButton, which both headers render;AgentStats.test.tsxcovers it.Change a card's resource group and range from its header for a moment (was #10639) (#10638)
Summary
A card whose settings include a resource group or a time range now shows that value as a compact control by its title, like the old dashboard's "My resources in " select. A value picked there is a temporary view; the edit-mode card settings stay the saved default, and the settings modal now says so.
panelSettingOverrides.ts: a jotai atom of header picks keyed by board id and panel id (card ids repeat across boards), plus the pure resolution: effective = header pick ?? saved setting ?? card default.useDashboardBoard: every card gets its effective settings through the samepanel/vars/ detail-link inputs it already reads, so no card component changed how it reads them. Edit and save paths keep using the saved panel.PanelSettingsHeaderControls+PanelHeaderSettingsContext: the resource group select (BAIScopedResourceGroupSelect, sameresourceGroupScopeOfas the settings modal, moved todashboardScope.ts) and the range select (RANGE_PRESETS),size="sm".PanelFramerenders them right after the title and its help glyph; the row's end keeps the card's own actions and the detail link. The total-resources card draws the select where its resource group name was.useResetOnLeavingPath: the "reset when the path changes, not on a same-path remount" rule the board already used for edit mode and the temporary table sort, now a hook that also clears the header picks.Behaviour
Resource groups: the header picks one group, or clears to the card default (the current resource group, or all groups on a custom panel), the same
resourceGroupsshape the settings use. A saved choice of several groups is shown as the joined names until a single group is picked.Cards that got a control: My Total Resource Usage, Resource Presets, Total Resources in Resource Group, Pending Sessions and Reasons, Resource Groups and Capacity, Top Projects by Usage, Fair Share and custom table panels whose source supports a resource group (resource group); My Activity, Audit Log, Long-running Sessions, Scheduling Failures, Failures by Entity Type, Keypairs and Logins (range).
New i18n keys in all 21 locales:
dashboard.settings.BackToSavedSetting,DefaultSettingsOf,DefaultCardSettings,DefaultResourceGroups,DefaultTimeRange,DefaultSettingsHelp;CardSettings,CardSettingsOfandResourceGroupsare replaced and removed.Verification
VERIFY_BASE=origin/main VERIFY_TESTS=1 bash scripts/verify.sh:=== ALL PASS ===.panelSettingOverrides.test.ts(effective-value resolution, modified flags, override merge, board keying) anduseResetOnLeavingPath.test.ts(resets on a path change, not on a same-path remount)./admin/dashboard: Total Resources pickedsftp(CPU 11 → 15 Core); kept after the refresh button and after a 30 s auto refresh; back todefaultafter reload. Scheduling Failures picked "Last 7 days" (failures 666/669 → 7,270/7,281); back to "Last 24 hours" after reload./project/default/admin/dashboard: Long-running Sessions "Last 1 hour", Pending Sessionssftp; both back to the default after leaving and returning./project/default/dashboardas a plain user: My Total Resource Usage pickedsftp(13 → 17 Core); kept after refresh; back todefaultafter reload. The select lists the project's resource groups fromscopedResourceGroups.Where to look: any card with a resource group or time range on the three dashboard pages; the select sits right after the card title.
Changes after the ready-gate review
TotalResourcesInResourceGroupkey now reads), with the header picker and one Used/Free switch beside it like on other cards. Every resource group section, the first included, is labelled with its own group name, so two saved default groups no longer show "a, b" over group a's numbers.Move the dashboard onto ui-common's title and description board items (was #10643) (#10642)
Summary
@lablup/ui-commonand@lablup/ui-common-clito0.2.0-alpha.20.canary-20261028082256-e3c262420(pnpm run ui-common:pin). It carries feat(Board)!: items are a title and a description, padded by the board ui-common#68 (a board item is atitleand adescription, padded by the board;renderItem,BoardItemActionsandremoveItemare gone), fix(Board): end a handle's keyboard activation on a press elsewhere ui-common#103 (a click on a move or resize handle no longer leaves the item in keyboard mode), feat(Board): render a body BoardItemTitle in the item header ui-common#113 (in an untitled item, the firstBoardItemTitlein the description renders in the header row;useIsInBoardItem) and fix(DataGrid): let the footer page-size list flip above ui-common#116 (the DataGrid page-size list flips above its trigger near the viewport bottom). No codemods ran between the versions;ui-common upgradewrote no report.BAITable.css, webui's override of the page-size list margin, is deleted now that fix(DataGrid): let the footer page-size list flip above ui-common#116 ships the same fix in ui-common.BAIBoardpasses each item'sdata.contentas the itemdescription. TheBAIBoardItemTitlea card renders (PanelFrame's row: title, help glyph, Let a card's resource group and time range be changed for a moment from its header #10638 header controls, extras and the Link each dashboard card to its list page with the card's filters #10620 detail link; or a legacy card's own title) is moved into the item header by ui-commonBoard, so the title row is the board's: the drag handle sits on the title's first line, and the title and the body start at the board's left padding. Content without a title gets no title row. The earlier title-slot portal, its:emptyheader CSS andBAIBoardItemInlineTitlesare gone; a second section title would takeinline.useIsInBAIBoardItem, now an alias of ui-commonuseIsInBoardItem) and keep it where they are not on one (the panel modal's preview, the session list's resource card). Skeleton fallbacks lose their extra padding.BAIBoardstrips the description node it adds from whatonItemsChangereports (items,movedItem,resizedItem), and the dashboard persists only layout fields, so repeated moves never nest a title row (the lesson of Board TitleWithActions story nests BoardItemTitle on every move/resize ui-common#104/Feature/#102 multiple selection ui #105). A unit test moves a card six times and checks one title row and no title or description keys in the reported items.UserSessionsMetrics) keeps its graphs' own title rows and inset withitemPadding={0}.BAIBoard.csspads a title-less item through Board's documented--board-item-padding-topknob, allowlisted in the token gate as an override hook.Verification
VERIFY_BASE=origin/main VERIFY_TESTS=1 bash scripts/verify.sh→=== ALL PASS ===(token gate: 0 undeclared).uic-board-item--active, and an arrow key afterwards no longer resizes it).Decisions (2026-10-29)
dashboard.settings.DefaultResourceGroup).Ready gate (round 1)
@lablup/ui-commonand its CLI pinned to 0.2.0-alpha.20.canary-20261029050354-1feb007cd (carries feat(Selector): let an option say why it is disabled ui-common#107, needed by fix(#10493): say why a select option is disabled #10496); AGENTS.md blocks regenerated; no codemods.🤖 Generated with Claude Code
Risk tier: High —
AGENTS.md,pnpm-lock.yaml,pnpm-workspace.yaml,react/AGENTS.md,react/src/__generated__/AuditLogPanelScopedHistoryQuery.graphql.tsSuggested human approvals: 2 (branch protection decides)
Reviewed by fw ready gate at
43f61a9(round 1)