Persistence & Consistency

State v22, atomare Commits und Legacy-Mirror

Der aktuelle Browserpfad benötigt IndexedDB. LocalStorage bleibt für Identität, Einstellungen, Startmarker und die Darstellung älterer UI-Module relevant, ist aber nicht die Quelle neuer wirtschaftlicher Buchungen.

Speicherlandschaft

SpeicherObjekt / PräfixInhaltRolle
IndexedDBcanipolyon_economy_v3, DB v18Snapshot, Belege, Rechnungsarchiv, Geldjournal, Backupsautoritativ
Storesavesein vollständiger State pro UUIDaktueller Spielstand
Storeprocesseduuid:epoch:transactionId → ReceiptIdempotenz
Storebill_archiveältere vollständig bezahlte Rechnungendauerhafte Historie
Storemoney_eventssequenzierte GeldänderungenAudit / Banking-Journal
Storesbackups*Rohzustand vor Migration oder ReparaturRettungsanker
LocalStorageuser_${uuid}_*Mirror, Optionen, Besitz-KompatibilitätAnzeige / Legacy
BroadcastChannelcanipolyon_${uuid}Änderungssignale mit EpochTab-Synchronisation

Commit-Protokoll

Vorprüfungread()Migration + Epoch
Idempotenzprocessed.get()ID und Alias prüfen
KandidatstructuredCloneQuelle unverändert lassen
Mutationapply(next)synchron ausführen
Invariantenvalidate(next)vollständig prüfen
Atomarput + receiptein IDB-Write-Transaction
Ergebnis bei WiederholungExistiert die Transaktions-ID bereits, wird duplicate: true mit dem alten Receipt zurückgegeben. Die Mutation wird nicht erneut ausgeführt.
Epoch-SchutzJeder Reset erhöht die epoch. Ein alter Tab kann anschließend keinen neuen Stand überschreiben, weil commit() die an die Seite gebundene Epoch mit dem Snapshot vergleicht.

State v22 – Hauptbereiche

PfadWichtige FelderBesitzer der Logik
version / epoch / ledgerSchema 22, Spielstandgeneration, letzte 500 Buchungs-IDsTRANSACTION_MANAGER
profilejoinedAtGAME_SAVE_MANAGER
economymoneyCents, walletUnits, level, xp, plants, items, ownership, capacity, miningECONOMY_SERVICE + Regeln
operatingCostsaktive Periode, Zähler, Rechnungen, Forderungen, StromzustandOPERATING_COST_SERVICE
chemistryTabletten je Rezept, aktive Charge, Queue, Upgrades, HistorieCHEMISTRY_TRANSACTIONS
door*offenes Angebot, Reservierung, Historie, Nachfrage, StatistikCUSTOMER_SALES
policeoffener Fall, Cooldown, Statistik, VerlusthistoriePOLICE_EVENTS / POLICE_RULES
tradingHistoryKauf, Verkauf und Mining-ClaimTRADING_SERVICE / ECONOMY_SERVICE
darkweb*Quotes, Reservierungen, Aufträge, Historie, StatistikDARKWEB
canisBalance, Bonuskäufe, Theme, Queue-Bonus, TestbelegeCANIS_SERVICE

Wesentliche Invarianten aus validate()

Geld und Bestände

Alle Mengen sind nichtnegative Safe Integers. Geld wird in Cent, Coins in 10⁻⁸-Units gespeichert. Weed darf die aktuelle Kapazität nicht überschreiten.

Progression

Level ≤ 100. Unter Max-Level muss XP kleiner als der nächste Schwellwert sein; auf Level 100 ist XP immer 0.

Pflanzen

Sechs Zustände; Topfhaltbarkeit 0–10; Erde nur 5/6; gepflanzte und leere Zustände besitzen unterschiedliche Pflichtfelder.

Chemie

Gesamtsumme der sortierten Tabletten plus Altbestand entspricht exakt economy.extasy. Rohstoffe inklusive reservierter Jobs passen ins Lager.

Rechnungen

Teilkomponenten und Zahlungen müssen exakt mit Gesamtbetrag, Restbetrag und globalen offenen Summen übereinstimmen.

Ereignisse

Police-, Sale-, Mining-, Achievement- und Canis-Zustände werden von eigenen Validatoren zusätzlich geprüft.

Migrationen und Backups

Die Upgrade-Kette kennt historische Zustände bis v21 und erzeugt vor dem Umbau versionsbezogene Backups. Der aktuelle Schritt upgradeFromV21() führt zu State v22.

SystemVersionZweck
LocalStorage Save Schema20frühe Reparaturen, kostenlose Slots, PC→Pflanze-4-Umzug; höhere Version erst nach IDB-Migration
IndexedDB State22vollständiges Fachmodell des Snapshots
IndexedDB Datenbank18Store-Struktur und Archive
Operating Costs7aktive Laufzeit, sechs Lampen, Einzelrechnungen, Sperrfrist
Chemistry3Tabletten je Rezept statt unspezifischem Bestand
Mining1drei Coins, Carry-Millis, Claims und Historie

Mirror-Regel

// Nach erfolgreichem Commit:
manager.mirror(state);
// schreibt kompatible Werte wie money, xp, plants, ownership,
// operating_costs_v1, mining, chemistry und inventories.
// Diese Werte dürfen nicht in einen neuen IDB-Commit zurückgefüttert werden.
Anti-PatternEine neue Mechanik, die zuerst localStorage.setItem("user_..._money", ...) ausführt und später IDB aktualisiert, erzeugt zwei Wahrheiten und ist nicht tab-sicher.