--- name: ductus-offline-recovery description: Assess Ductus local save, crash/reload, offline/reconnect, ACK/retry, stale client/multi-tab and session-change recovery with before/after content and save states. Use for journal/queue preservation and recovery evidence; separate pure planners, storage adapters and real browsers. --- # Provjeri offline oporavak 1. Primijeniti [zajedničke operacije](../../references/project-operations.md). Pročitati aktualni `docs/BACKEND.md` §4.3, `docs/PRODUCT.md` §5 i stvarne sync/journal/serverSync ugovore iz [mape izvora](../../references/source-map.md). Potvrditi koji SHA sadrži planer, adapter i UI; DAN-25 kandidat ne postaje prihvaćeni main bez merge dokaza. 2. Zapisati početni dokument, trenutno vidljivi tekst, zadnju ACK reviziju/sadržaj, pending IDs/localSeq/tx i lokalni snapshot/meta. Imenovati failure cut (prije/dok/nakon atomic write, prije/poslije ACK-a), operacije, identitet korisnika i opseg DB/origina/tabova. Snapshot revision je baza lokalnog kandidata, ne nova poslužiteljska revizija. 3. Proći [sirove scenarije](assets/raw-scenarios.json): pad/reload, offline/reconnect, ponovljeni ACK/retry, multi-tab/stale client, promjena sesije i nepoznat/oštećen red. Najprije provjeriti `validateDocument`, `syncReducer`, `restoreSyncState`, primjenjivi `planDrain`/`planRecovery`/conflict kod; zatim postojeći storage adapter i autorizirani stvarni browser samo ako postoje i dostupni su. 4. Sačuvati svaki unknown/malformed queue red prema **aktualnom provjerenom sendability ugovoru**. Ne pretpostaviti da najnoviji replacement smije obrisati svaki prefiks: kandidat planDrain koristi najraniju nesendabilnu/dupliciranu granicu, a neurediv slijed može blokirati cijeli plan. Ne prepisivati oštećeni red kako bi postao sendable. Svaku propuštenu/dvostruku operaciju usporediti po stvarnom identitetu `(document, actor, clientTransactionId)`; actor nije polje `CommitRequest`. 5. Razlikovati reducer `SYNC_ACK`, parsed `committed`/`duplicate`, stvarno durable sadržaj i dokaz potpisane potvrde koji zahtijeva prihvaćeni tok. Stale_base traži eksplicitno rješenje, ne overwrite retry. CONFLICT/RECOVERY_REQUIRED ostaju sticky preko reload-a; planerova preporuka nije korisnikova odluka. Novi EDIT poništava tvrdnju durability za novi tekst; zakašnjeli ACK ne smije dokazivati novo nepovezano uređivanje. 6. Pri isteku sesije sačuvati journal za ponovnu prijavu istog korisnika. Drugom korisniku ne izložiti/slati tuđe lokalne podatke: provjeriti prihvaćeni blokadni/odjavni tok, bez samostalnog čišćenja. Nikad ne brisati korisnikov browser profil radi prolaza; ponavljati samo vlastiti izolirani sintetički fixture uz odobren reset. 7. Isporučiti **prije/poslije IDs, sadržaj/revizije, pending redovi, operacije i vidljivo save stanje**, uz command/action, head, vrijeme i tablicu primjenjivo/provjereno/pending za pure, adapter i browser. Fake-indexeddb nije stvarni browser; zeleni planer ne dokazuje atomic IndexedDB write, session izolaciju ili oporavak UI-ja. Postojeći produktni bug prijaviti odvojeno bez popravka izvan taska.