diff --git a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md index 4bb378d52..ec0431ebd 100644 --- a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md +++ b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md @@ -139,6 +139,11 @@ those facts into source-strategy copy, but it must not turn an admitted `first-lab-ready` platform such as VMware into a product-level supported claim, invent platform-local projections, or classify assistant control beyond the manifest's support-floor row. +The lifecycle-owned infrastructure source manager also owns platform/system +grouping as source-management content, but not its table band presentation: +`frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx` must +route table-level product/system group rows through the shared grouped table row +helper instead of carrying lifecycle-local background or hover classes. ## Extension Points diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 25bace18c..6b07f57a4 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -181,8 +181,9 @@ work extends shared components instead of creating new local variants. helper and `.grouped-table-row` CSS token contract instead of local `bg-surface-alt` or page-specific hover fills. This applies to grouped rows across Infrastructure, Workloads, Storage, Recovery, alert history, - and alert threshold tables; feature owners may own group content and - behavior, but not duplicate the subgroup band styling. + alert threshold tables, and Infrastructure Settings source-manager tables; + feature owners may own group content and behavior, but not duplicate the + subgroup band styling. Shared monitored-system warning primitives under that path must stay compact app-shell pointers into the owned Pulse Pro billing surface. The shared banner may announce posture and route to the relevant billing tab, but @@ -358,6 +359,10 @@ work extends shared components instead of creating new local variants. Pulse Agent`, or `via platform API and Pulse Agent`), with fuller detail in the edit dialog, instead of duplicating the same machine across multiple peer groups or forcing operators to decode badge jargon. + The table-level product/system group rows in + `InfrastructureSourceManager.tsx` must also use the shared grouped table row + presentation helper, not local table-background classes, so source-manager + grouping stays visually consistent with the product tables. That same shared shell boundary owns the landing taxonomy too: the primary grouping labels in the infrastructure manager must describe real platform/system owners, not collection methods. Agent-only machines belong diff --git a/frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx b/frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx index d728975ce..51a8b47f6 100644 --- a/frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx +++ b/frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx @@ -18,6 +18,7 @@ import { TableHeader, TableRow, } from '@/components/shared/Table'; +import { getGroupedTableRowClass } from '@/components/shared/groupedTableRowPresentation'; import { connectionAgentVersionPresentation, fleetSignalClassName, @@ -617,7 +618,7 @@ export const InfrastructureSourceManager: Component groupedConfiguredRows().get(product.type) ?? []; const discoveredRows = () => groupedDiscoveredRows().get(product.type) ?? []; const groupRowClass = () => - 'border-b border-border-subtle bg-base hover:bg-base'; + getGroupedTableRowClass('border-b border-border-subtle'); const groupLabelClass = () => 'text-[15px] font-semibold text-base-content'; return ( diff --git a/frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts b/frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts index 46e7a7c42..9c93a04e5 100644 --- a/frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts +++ b/frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts @@ -256,6 +256,8 @@ describe('settings architecture guardrails', () => { expect(infrastructureSourceManagerSource).toContain('Discovered'); expect(infrastructureSourceManagerSource).toContain('getInfrastructureSourceManagerProducts'); expect(infrastructureSourceManagerSource).toContain('TableHeader'); + expect(infrastructureSourceManagerSource).toContain('getGroupedTableRowClass'); + expect(infrastructureSourceManagerSource).not.toContain('bg-base hover:bg-base'); expect(infrastructureSourceManagerSource).toContain('aria-label={product.actionLabel}'); expect(infrastructureSourceManagerSource).toContain('Review'); expect(infrastructureSourceManagerSource).toContain('Manage'); diff --git a/frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts b/frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts index 470275227..7ba35988a 100644 --- a/frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts +++ b/frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts @@ -67,6 +67,7 @@ import summaryTableCardHeaderSource from '@/components/shared/SummaryTableCardHe import summaryTableFocusSource from '@/components/shared/summaryTableFocus.ts?raw'; import tableCardSource from '@/components/shared/TableCard.tsx?raw'; import groupedTableRowPresentationSource from '@/components/shared/groupedTableRowPresentation.ts?raw'; +import infrastructureSourceManagerSource from '@/components/Settings/InfrastructureSourceManager.tsx?raw'; import infrastructureSummaryTableSource from '@/components/shared/InfrastructureSummaryTable.tsx?raw'; import infrastructureSummaryTableRowSource from '@/components/shared/InfrastructureSummaryTableRow.tsx?raw'; import infrastructureSelectorModelSource from '@/components/shared/infrastructureSelectorModel.ts?raw'; @@ -469,6 +470,8 @@ describe('shared primitive guardrails', () => { expect(alertHistoryTableGroupRowSource).toContain('getGroupedTableRowClass'); expect(alertHistoryTableGroupRowSource).not.toContain('class="bg-surface-alt"'); expect(alertResourceTableDesktopSource).toContain('getGroupedTableRowClass'); + expect(infrastructureSourceManagerSource).toContain('getGroupedTableRowClass'); + expect(infrastructureSourceManagerSource).not.toContain('bg-base hover:bg-base'); expect(unifiedResourceHostTableCardSource).toContain('data-summary-group-member-active'); });