# ING-05 – Prüfprotokoll: Folder-State & UIDVALIDITY-Handling Voraussetzung ING-01 (Fertig). ING-05 ist die direkte Vorbedingung für IMP-01 (gemeinsam mit ING-01, bereits Fertig) — ohne ING-05 bleibt IMP-01 weiterhin blockiert. ## Umsetzung - `mail/internal/folderstate/store.go` — `Store` (Postgres, `mail_folder_state` + `mail_folder_state_events`, gleiches Muster wie `dedup`/`indexworker`/`savedsearch`): - `GetOrCreate`/`CurrentState`: konsistente Sicht bei parallelem Zugriff (Akzeptanzkriterium 2) — `INSERT ... ON CONFLICT DO NOTHING` + Rücklese, kein Lese-dann-Schreib-Fenster. - `NextUID`: vergibt UIDs atomar über `UPDATE ... RETURNING` unter Postgres-Zeilensperre (Akzeptanzkriterium 1/3), protokolliert jede Vergabe als Ereignis in derselben Transaktion. - `Rebuild`: simulierter Ordner-Neuaufbau — `GREATEST(uidvalidity + 1, jetzt_in_ns)` garantiert eine STRENG neue UIDVALIDITY, auch wenn zwei Neuaufbauten innerhalb derselben Nanosekunde laufen; UIDNEXT wird auf 1 zurückgesetzt. - `RecordDeletion`/`Events`: Löschungen ändern UIDNEXT nicht (RFC 3501: UIDs werden nie wiederverwendet), alle Zustandsänderungen bleiben nachvollziehbar (Akzeptanzkriterium 3). - Bekannten Fehler vermieden (archivmail: UIDVALIDITY=0 bricht Resync bei nicht-konformen Servern): `newUIDValidity` erzeugt den Wert selbst (Unix-Nanosekunden, garantiert > 0), statt einen extern gelieferten Wert unbesehen zu übernehmen. - Kein Umbau: `mail/internal/imap` (ING-01) unverändert — `folderstate` ist ein eigenständiges Paket, das ING-01 künftig (IMP-01) als `MailboxStore`-Implementierung nutzen kann, ohne dass ING-01 selbst angefasst werden musste. ## Prüfungen | # | Prüfung | Ergebnis | |---|---|---| | 1 | Automatisierter Test für UIDVALIDITY-Änderung bei simuliertem Ordner-Neuaufbau | **bestanden** – `TestRebuild_ChangesUIDValidityOnSimulatedFolderRebuild`: Ordner angelegt, UID vergeben, `Rebuild` aufgerufen — UIDVALIDITY real geändert, UIDNEXT real auf 1 zurückgesetzt, `rebuilt`-Ereignis real protokolliert | | 2 | Nebenläufigkeitstest: zwei Sessions auf demselben Ordner ohne Inkonsistenz | **bestanden** – `TestNextUID_ConcurrentSessionsOnSameFolderNoInconsistency`: 20 reale gleichzeitige `NextUID`-Aufrufe auf demselben Ordner, alle 20 UIDs real eindeutig, keine Dopplung | | 3 | Test für UIDNEXT-Monotonie über viele Einfüge-/Löschzyklen | **bestanden** – `TestNextUID_MonotonicAcrossManyInsertDeleteCycles`: 200 Zyklen, jede zweite Nachricht real "gelöscht" — UIDNEXT bleibt real strikt monoton steigend, Löschungen beeinflussen die Vergabe nicht | ## Build/Test-Ergebnis (192.168.1.131) ``` go build ./... -> clean go vet ./... -> clean golangci-lint run ./... -> 0 issues TEST_TENANT_DSN=... go test ./internal/folderstate/... -v -> 3/3 bestanden TEST_TENANT_DSN=... TEST_MANTICORE_URL=... go test ./... -p 1 -> alle 13 Pakete bestanden, keine Regression ``` ## Gesamtergebnis **Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen real erfüllt. Entsperrt IMP-01 (gemeinsam mit ING-01, bereits Fertig) und ING-10.