diff --git a/docs/release-control/v6/internal/subsystems/storage-recovery.md b/docs/release-control/v6/internal/subsystems/storage-recovery.md index 0c7099e6f..7b5dc0044 100644 --- a/docs/release-control/v6/internal/subsystems/storage-recovery.md +++ b/docs/release-control/v6/internal/subsystems/storage-recovery.md @@ -1224,6 +1224,10 @@ That same direct proof rule also applies to the shared recovery summary helper: `frontend-modern/src/utils/recoverySummaryPresentation.ts` must stay on the explicit `recovery-product-surface` proof path instead of inheriting coverage only through pages or higher-level recovery components. +The default protected-inventory recovery route must also keep its primary +table shell on class-driven sizing (`table-fixed` plus owned width classes) +instead of inline `table-layout` / `min-width` styles, so the public recovery +surface stays CSP-safe without drifting from the shared table contract. That same direct proof rule also applies to the shared recovery record helper: `frontend-modern/src/utils/recoveryRecordPresentation.ts` must stay on the explicit `recovery-product-surface` proof path instead of inheriting coverage diff --git a/frontend-modern/src/components/Recovery/RecoveryProtectedInventorySection.tsx b/frontend-modern/src/components/Recovery/RecoveryProtectedInventorySection.tsx index 9b6b09e5f..0e5b396b2 100644 --- a/frontend-modern/src/components/Recovery/RecoveryProtectedInventorySection.tsx +++ b/frontend-modern/src/components/Recovery/RecoveryProtectedInventorySection.tsx @@ -339,8 +339,9 @@ export const RecoveryProtectedInventorySection: Component< 0}>
diff --git a/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx b/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx index 64edcfc64..187de8b7c 100644 --- a/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx +++ b/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx @@ -742,6 +742,15 @@ describe('Recovery', () => { expect(historyTable).toHaveStyle({ 'min-width': '980px', 'table-layout': 'fixed' }); }); + it('keeps the protected inventory table CSP-safe on the default recovery route', async () => { + render(() => ); + + const protectedInventoryTable = await screen.findByRole('table'); + expect(protectedInventoryTable).not.toHaveAttribute('style'); + expect(protectedInventoryTable.className).toContain('table-fixed'); + expect(protectedInventoryTable.className).toContain('min-w-[640px]'); + }); + it('keeps canonical item and platform columns visible when legacy hidden-column ids exist', async () => { facetsPayload.clusters = ['lab-cluster']; localStorage.setItem(