diff --git a/docs/release-control/v6/internal/status.json b/docs/release-control/v6/internal/status.json
index 9476d35d8..483d18512 100644
--- a/docs/release-control/v6/internal/status.json
+++ b/docs/release-control/v6/internal/status.json
@@ -2959,6 +2959,26 @@
"path": "frontend-modern/src/utils/alertOverviewPresentation.ts",
"kind": "file"
},
+ {
+ "repo": "pulse",
+ "path": "frontend-modern/src/utils/connectionErrorPresentation.ts",
+ "kind": "file"
+ },
+ {
+ "repo": "pulse",
+ "path": "internal/api/connections_grouping.go",
+ "kind": "file"
+ },
+ {
+ "repo": "pulse",
+ "path": "internal/api/connections_grouping_test.go",
+ "kind": "file"
+ },
+ {
+ "repo": "pulse",
+ "path": "internal/api/contract_test.go",
+ "kind": "file"
+ },
{
"repo": "pulse",
"path": "internal/api/resources.go",
@@ -3159,16 +3179,36 @@
"path": "frontend-modern/src/components/Infrastructure/UnifiedResourceTable.tsx",
"kind": "file"
},
+ {
+ "repo": "pulse",
+ "path": "frontend-modern/src/components/Workloads/__tests__/workloadInventorySourceIssues.test.ts",
+ "kind": "file"
+ },
{
"repo": "pulse",
"path": "frontend-modern/src/components/Workloads/__tests__/WorkloadsSurface.performance.contract.test.tsx",
"kind": "file"
},
+ {
+ "repo": "pulse",
+ "path": "frontend-modern/src/components/Workloads/useWorkloadsState.ts",
+ "kind": "file"
+ },
+ {
+ "repo": "pulse",
+ "path": "frontend-modern/src/components/Workloads/workloadInventorySourceIssues.ts",
+ "kind": "file"
+ },
{
"repo": "pulse",
"path": "frontend-modern/src/components/Workloads/workloadSelectors.ts",
"kind": "file"
},
+ {
+ "repo": "pulse",
+ "path": "frontend-modern/src/components/Workloads/WorkloadsStateCards.tsx",
+ "kind": "file"
+ },
{
"repo": "pulse",
"path": "frontend-modern/src/components/Workloads/WorkloadsSurface.tsx",
diff --git a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md
index 7fc684c5d..3c9e021bc 100644
--- a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md
+++ b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md
@@ -556,6 +556,11 @@ profile and assignment columns, but embedded table framing must route through
columns: the landing table reuses the `System` and `Endpoint` cells for a
short host fact such as OS/platform plus a reported endpoint, while the
richer agent identity facts stay in the edit/detail surface.
+ Exact Proxmox host-agent attachments remain backend-authored through
+ `/api/connections` even when Proxmox workload inventory is blocked by
+ credentials or reachability; lifecycle surfaces must render that attached
+ agent as part of the API source row and must not re-offer host install or
+ standalone lifecycle actions for the same physical host.
Public demo and other read-only settings posture must stay reporting-first
on that same lifecycle-owned workspace boundary: infrastructure workspace
routes may retain install and platform setup surfaces for manageable
diff --git a/docs/release-control/v6/internal/subsystems/api-contracts.md b/docs/release-control/v6/internal/subsystems/api-contracts.md
index d47a89f68..f6151f779 100644
--- a/docs/release-control/v6/internal/subsystems/api-contracts.md
+++ b/docs/release-control/v6/internal/subsystems/api-contracts.md
@@ -93,6 +93,7 @@ product API routes free of maintainer commercial analytics.
59. `internal/api/connections_handlers.go`
60. `internal/api/connections_probe.go`
61. `frontend-modern/src/api/connections.ts`
+62. `frontend-modern/src/utils/connectionErrorPresentation.ts`
62. `frontend-modern/src/api/hostedSignup.ts`
63. `internal/api/availability_handlers.go`
64. `frontend-modern/src/api/availabilityTargets.ts`
@@ -856,7 +857,12 @@ the canonical monitored-system blocked payload.
discovery and settings surfaces can reconcile hostname-only and IP-only
views of the same enrolled machine instead of showing a second
"discovered" candidate row for an already represented source member or
- API-plus-agent source row. Agent-backed
+ API-plus-agent source row. Exact host-agent matches for a configured
+ Proxmox primary source must also attach through the backend systems
+ payload when workload node inventory is absent because credentials or
+ reachability are blocked, so the infrastructure ledger does not split the
+ same physical host into an API row plus a standalone host-agent row.
+ Agent-backed
connections also own canonical version/update facts on that same payload:
when a source or attachment is backed by Pulse Agent, `/api/connections`
carries the
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 4fa384925..3adb8775c 100644
--- a/docs/release-control/v6/internal/subsystems/performance-and-scalability.md
+++ b/docs/release-control/v6/internal/subsystems/performance-and-scalability.md
@@ -28,7 +28,9 @@ regression protection.
5. `internal/api/slo_bench_test.go`
6. `frontend-modern/src/components/Workloads/WorkloadsSurface.tsx`
7. `frontend-modern/src/components/Workloads/WorkloadsStateCards.tsx`
-8. `frontend-modern/src/components/Workloads/WorkloadsStatsStrip.tsx`
+8. `frontend-modern/src/components/Workloads/workloadInventorySourceIssues.ts`
+9. `frontend-modern/src/components/Workloads/__tests__/workloadInventorySourceIssues.test.ts`
+10. `frontend-modern/src/components/Workloads/WorkloadsStatsStrip.tsx`
9. `frontend-modern/src/components/Workloads/WorkloadsTable.tsx`
10. `frontend-modern/src/components/Workloads/WorkloadPanel.tsx`
11. `frontend-modern/src/components/Workloads/WorkloadTableHeader.tsx`
@@ -209,6 +211,14 @@ regression protection.
`platformData.sources` hints, and must not reconstruct platform identity by
scanning sibling resources or making row-time API calls.
5. Extend workload hot-path filter, sort, grouping, and stats math through `frontend-modern/src/components/Workloads/workloadSelectors.ts`, and extend workload identity, discovery routing, and node-topology helpers through `frontend-modern/src/components/Workloads/workloadTopology.ts`, rather than duplicating selector or topology logic in `frontend-modern/src/components/Workloads/WorkloadsSurface.tsx`
+ Workloads source-health messaging must derive from the canonical
+ `/api/connections` ledger through
+ `frontend-modern/src/components/Workloads/workloadInventorySourceIssues.ts`.
+ The Workloads page may show a bounded partial-inventory banner when a
+ configured workload-capable source is unauthorized, unreachable, stale,
+ pending, or paused, but it must not fabricate VM/container rows from host
+ telemetry or hide source blockers just because another source still has
+ workload rows.
The retired dashboard overview route must not return as a hot-path
orientation shortcut. First-viewport system count, health, source coverage,
and freshness now belong to Infrastructure and Add infrastructure, derived
diff --git a/docs/release-control/v6/internal/subsystems/storage-recovery.md b/docs/release-control/v6/internal/subsystems/storage-recovery.md
index 024599337..96ebdad57 100644
--- a/docs/release-control/v6/internal/subsystems/storage-recovery.md
+++ b/docs/release-control/v6/internal/subsystems/storage-recovery.md
@@ -590,6 +590,10 @@ bypass the API fail-closed execution gate.
unknown because no trustworthy applied fingerprint exists, storage and
recovery must preserve that uncertainty instead of translating it into a
storage-local current/drifted verdict.
+ When `/api/connections` attaches an exact-match host agent to a blocked
+ Proxmox API source without fresh node inventory, storage and recovery must
+ treat that as one represented source with host telemetry, not as a second
+ protected system or a storage-local duplicate host.
22. Keep backend-native platform actions on the adjacent AI/runtime and platform contracts. When `internal/api/` wires native TrueNAS app control for Assistant, storage and recovery may consume the refreshed recovery points afterward, but they must not grow a parallel recovery-local action transport or action-specific payload shape.
23. Keep backend-native platform diagnostics on the adjacent AI/runtime and platform contracts. When `internal/api/` wires native TrueNAS app log reads for Assistant, storage and recovery may use those diagnostics during investigation, but they must not grow a parallel recovery-local log transport or diagnostic payload shape.
24. Keep backend-native platform configuration reads on the adjacent AI/runtime and platform contracts. When `internal/api/` wires native TrueNAS app config for Assistant, storage and recovery may use that runtime shape during investigation, but they must not grow a parallel recovery-local config transport or provider-shaped configuration payload.
diff --git a/frontend-modern/src/components/Workloads/WorkloadsStateCards.tsx b/frontend-modern/src/components/Workloads/WorkloadsStateCards.tsx
index 0e2292c76..82420e65a 100644
--- a/frontend-modern/src/components/Workloads/WorkloadsStateCards.tsx
+++ b/frontend-modern/src/components/Workloads/WorkloadsStateCards.tsx
@@ -1,4 +1,4 @@
-import { Show } from 'solid-js';
+import { For, Show } from 'solid-js';
import {
buildInfrastructureOnboardingPath,
@@ -25,6 +25,7 @@ type WorkloadsStateCardsProps = Pick<
| 'kioskMode'
| 'navigate'
| 'reconnect'
+ | 'workloadInventoryIssues'
| 'workloads'
>;
@@ -61,6 +62,66 @@ export function WorkloadsStateCards(props: WorkloadsStateCardsProps) {
+ 0
+ }
+ >
+
+
+
+
+
Workload inventory is incomplete
+
+ One or more configured workload sources cannot currently report inventory.
+