feat(queue): archiveren i.p.v. verwijderen — ops-db, purge naar cold-store, UI-archiefweergave (M32) #82
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/m32-archivering"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
M32 slice 1, Tasks 10–12 van
docs/plans/M32-queue-archivering.md(DUBBEL-GO r7,a476639). Spec §4.5 + besluit B14 (6d8ea8c).Kern: via de gewone UI verdwijnt er niets meer
deleteAgentMessageendeleteMessageActionbestaan niet meer. Ervoor in de plaats:archiveAgentMessage/unarchiveAgentMessage— bericht + volledige transitieve reply-subtree, in één transactie metFOR UPDATE, alleen terminale rijen (QUEUE_NOT_TERMINAL-equivalent: leesbare fout mét het blokkerende id), per rij idempotent, géén pg_notify. Twee tests bewaken dat de oude exports weg blijven.archiveClosedMessageThreadsOlderThan(hernoemd) schuift de thread eerst naaragent_message_archiveen verwijdert hem dan, in één statement.MessageRetentionPurgekrijgtarchivedRows;CLOSED_THREAD_TARGETS_CTEbleef ongewijzigd (al recursief) zodat dry-run en purge niet kunnen divergeren.WORKERS_ARCHIVED_COLUMNSis de enige bron voor beide clausules van de INSERT — spiegel van s4m-queue'sARCHIVED_COLUMNS. Een kolom die hier ontbreekt maar wél in beide tabellen staat, zou stil niet gearchiveerd worden.clearAgentMessageQueueblijft destructief — bewust JP-besluit (B14), inclusief confirm-dialog en dry-run-tellingen.UI
Weergave-toggle Actief / Archief (
role="tablist"), rij-actie archiveer (alleen op terminale rijen — de server zou de rest weigeren) respectievelijk herstel, beide zonder bevestiging omdat ze omkeerbaar zijn. De purge-dialoog zegt nu wat er echt gebeurt: threads verhuizen naar de cold-store, data blijft bewaard.docs/pages/queue-messages.mdis op alle drie de plekken bijgewerkt (prosa, componentbeschrijving, actie-inventaris).Gate
npm run verify && npm run build→ groen; 121 bestanden, 868 tests.De realdb-suite is niet overgeslagen: gedraaid tegen een echte Postgres (wegwerp-container,
OPS_TEST_DATABASE_URL) → 10/10 groen, inclusief de nieuwe cases: een diepte-2-keten verhuist integraal naaragent_message_archive(ook het kleinkind), archiveren weigert fail-closed zolang de keten eenpendingrij bevat (nul rijen half gemarkeerd), en archive/unarchive zijn per rij idempotent ({total: 3, archived: 0}bij de tweede aanroep).De fixture
__tests__/lib/queue/fixtures/agent_message.sqlwas een verouderde Ops-kopie (geenidempotency_key, geen archieftabel). Ververst naar de actuele productievouw uit de drie Scrum4Me-migraties, inclusief M32;beforeEachbouwt nu beide tabellen op.Volgorde
Deze code vereist de kolom uit PR Scrum4Me#154 (migratie) — merge/deploy pas ná die migratie, plan-Task 13.
🤖 Generated with Claude Code
Verdict: COMMENT
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
__tests__/app/queue-messages-view.test.tsx:101— De test "archiveren wordt alleen aangeboden op een terminale rij" rendert eerst een terminale rij en daarna opnieuw een pending-rij zonder cleanup/rerender-isolatie. Daardoor blijft de eerstearchiveer-knop in de DOM staan en bewijsttoHaveLength(1)niet dat de pending-rij géén archiveerknop krijgt. Dit maskeert precies de regressie die de test wil afdekken. Maak de renders geïsoleerd of assert na de tweede render expliciet op de pending-rij/container.Reviewnotities
De backend-wijzigingen volgen de bestaande queue-patronen: admin-guards blijven in de server-actions,
listAgentMessagesdefault naar actieve berichten, purge gebruikt archive-then-delete in één statement, en archive/unarchive locken de subtree transactioneel. De docs voor/queue/messageszijn mee aangepast. Geen blokkerende findings gevonden.