diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index dad9dba35..0feba55e8 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -2810,7 +2810,8 @@ drawers still derive `Availability` and `Network Endpoint` labels from the shared resource presentation helpers rather than from preset-local copy. Infrastructure rows for those same agentless endpoints must surface probe evidence directly in the row, not just as a green status dot or an -`Availability` badge. The shared row presentation must expose the probe method, -latest latency or failure result, and recent check timing from the canonical -availability payload so operators can understand what was actually measured -without opening the drawer. +`Availability` badge. The shared row presentation must expose the probe method +and latest latency or failure result once, inline in the agentless endpoint's +metric slot, while keeping recent check timing and fuller failure context in +the tooltip or drawer so operators can understand what was measured without +duplicated row chrome. diff --git a/docs/release-control/v6/internal/subsystems/performance-and-scalability.md b/docs/release-control/v6/internal/subsystems/performance-and-scalability.md index a7c65dd47..db7541448 100644 --- a/docs/release-control/v6/internal/subsystems/performance-and-scalability.md +++ b/docs/release-control/v6/internal/subsystems/performance-and-scalability.md @@ -973,11 +973,12 @@ visible table density. That hot-path contract now includes policy badge rendering on resource rows. Agentless availability evidence belongs on that same bounded row path. Infrastructure `network-endpoint` rows may replace otherwise empty host metric -slots with compact probe method/result text and may add one compact resource -subline for latency, failure, and recent check timing, but they must derive -that text from the existing resource payload and shared presentation helper -instead of adding a per-row fetch, extra hydration pass, or unbounded badge -stack. +slots with one compact inline probe method/result readout. Recent check timing, +latency history, and fuller failure context may stay in bounded tooltip or +drawer detail, but the table must not duplicate the same probe evidence across +the resource identity cell and metric cells. That text must derive from the +existing resource payload and shared presentation helper instead of adding a +per-row fetch, extra hydration pass, or unbounded badge stack. The infrastructure summary hot path is now explicit shared ownership too: `InfrastructureSummary.tsx` stays a render shell, `useInfrastructureSummaryState.ts` owns chart polling and cache lifecycle, and diff --git a/docs/release-control/v6/internal/subsystems/unified-resources.md b/docs/release-control/v6/internal/subsystems/unified-resources.md index c711cd669..2d70776f3 100644 --- a/docs/release-control/v6/internal/subsystems/unified-resources.md +++ b/docs/release-control/v6/internal/subsystems/unified-resources.md @@ -528,10 +528,11 @@ availability data is still `platformType=availability`, `sourceType=api`, and must not regress to a generic platform badge in infrastructure rows or drawers. Infrastructure row presentation must also consume that availability payload as operator evidence, not only as badge identity. `network-endpoint` rows should -surface the probe method, latest latency or failure result, and recent check -timing from either the top-level availability field or the live-state -`platformData.availability` mirror, so REST and realtime paths answer what was -measured without requiring the drawer. +surface one visible probe readout, method plus latest latency or failure +result, from either the top-level availability field or the live-state +`platformData.availability` mirror. Recent check timing and fuller failure +context may stay in tooltip or drawer detail, but the table row must not show +the same probe evidence in both the resource identity cell and metric cell. That same frontend-owned compatibility boundary must remain intentionally narrow. Shared resource adapters may admit explicit aliases such as `host`, `truenas`, and `ceph`, and VMware detail mappers may project typed metadata diff --git a/frontend-modern/src/components/Infrastructure/UnifiedResourceHostTableCard.tsx b/frontend-modern/src/components/Infrastructure/UnifiedResourceHostTableCard.tsx index cd316a607..91b7dd32a 100644 --- a/frontend-modern/src/components/Infrastructure/UnifiedResourceHostTableCard.tsx +++ b/frontend-modern/src/components/Infrastructure/UnifiedResourceHostTableCard.tsx @@ -403,18 +403,6 @@ export const UnifiedResourceHostTableCard: Component - - {(probe) => ( -
- - {probe().rowLabel} - -
- )} -
{(href) => ( @@ -540,14 +528,14 @@ export const UnifiedResourceHostTableCard: Component {(probe) => (
- - {probe().methodLabel} + + {probe().methodLabel}: {probe().resultLabel} diff --git a/frontend-modern/src/components/Infrastructure/__tests__/UnifiedResourceTable.performance.contract.test.tsx b/frontend-modern/src/components/Infrastructure/__tests__/UnifiedResourceTable.performance.contract.test.tsx index b17461f16..b0a1291b1 100644 --- a/frontend-modern/src/components/Infrastructure/__tests__/UnifiedResourceTable.performance.contract.test.tsx +++ b/frontend-modern/src/components/Infrastructure/__tests__/UnifiedResourceTable.performance.contract.test.tsx @@ -248,7 +248,7 @@ describe('UnifiedResourceTable performance contract', () => { }), ]; - const { getByText, getAllByText } = render(() => ( + const { getByText, getAllByText, queryByText } = render(() => ( { )); await waitFor(() => { - expect(getByText('TCP 1883 - 7 ms - checked 14s ago')).toBeInTheDocument(); + expect(getByText('TCP 1883:')).toBeInTheDocument(); + expect(getByText('7 ms')).toBeInTheDocument(); }); - expect(getAllByText('7 ms').length).toBeGreaterThanOrEqual(1); + expect(queryByText('TCP 1883 - 7 ms - checked 14s ago')).toBeNull(); + expect(getAllByText('7 ms')).toHaveLength(1); }); it('adapts host columns from the measured table surface width instead of the window width', async () => {