+
Because these images are deliberately held, deleting one directly (by id, including through the API) is refused. Release the generation from **Resources → Rollback** instead, or leave it to clear on its own.
diff --git a/docs/images/health-gated-updates/rollback-generations.png b/docs/images/health-gated-updates/rollback-generations.png
new file mode 100644
index 00000000..c01a5510
Binary files /dev/null and b/docs/images/health-gated-updates/rollback-generations.png differ
diff --git a/frontend/src/components/__tests__/ResourcesView.test.tsx b/frontend/src/components/__tests__/ResourcesView.test.tsx
index e5f96c84..980fe545 100644
--- a/frontend/src/components/__tests__/ResourcesView.test.tsx
+++ b/frontend/src/components/__tests__/ResourcesView.test.tsx
@@ -508,7 +508,8 @@ describe('ResourcesView', () => {
expect(await screen.findByText('seerr')).toBeInTheDocument();
expect(screen.getByText('abc123456789')).toBeInTheDocument();
- expect(screen.getByText('Current')).toBeInTheDocument();
+ // State badge and the Current filter pill both render this label.
+ expect(screen.getAllByText('Current').length).toBeGreaterThanOrEqual(2);
expect(screen.getByRole('button', { name: /release rollback protection/i })).toBeInTheDocument();
});
});
diff --git a/frontend/src/components/resources/RollbackGenerationsTab.tsx b/frontend/src/components/resources/RollbackGenerationsTab.tsx
index 0c0a160c..3b37491f 100644
--- a/frontend/src/components/resources/RollbackGenerationsTab.tsx
+++ b/frontend/src/components/resources/RollbackGenerationsTab.tsx
@@ -1,11 +1,14 @@
-import { useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
+import { SortableTableHead } from '@/components/ui/sortable-table';
+import { useTableSort } from '@/hooks/useTableSort';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
+import { Input } from '@/components/ui/input';
import { ScrollArea } from '@/components/ui/scroll-area';
import { ConfirmModal } from '@/components/ui/modal';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
-import { Unlock } from 'lucide-react';
+import { Info, Search, Unlock } from 'lucide-react';
import { apiFetch } from '@/lib/api';
import { toast } from '@/components/ui/toast-store';
import { SENCHO_OPEN_STACK_EVENT, type SenchoOpenStackDetail } from '@/lib/events';
@@ -33,6 +36,21 @@ interface RollbackGenerationsTabProps {
onReleased: () => void | Promise- Rollback-protected images from full-stack updates. Each generation is kept so a failed update can be - automatically rolled back, and clears on its own once it is superseded and its retention window - passes (configurable under Settings → Infrastructure → Stacks → Deploy Guardrails). -
+{ROLLBACK_HELP}
+