diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index c52d780..c5c815a 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -785,7 +785,11 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe - [x] Add recovery plan for corrupted save. Added `Docs/Ops/PersistenceSaveRecoveryPlan.md` covering suspect-save symptoms, backup restore steps, failed-backup fallback, and current MVP limitations. -- [ ] Document persistence limitations. +- [x] Document persistence limitations. Added an MVP limitations section to + `Docs/PersistenceDesignDocument.md` covering file-based saves, missing + database/account binding, migration limits, corrupted-save validation, + container actor capture, offline simulation, cross-server persistence, + external backup replication, UI, and pre-MVP save compatibility. ## 0.1.N MVP UI And UX diff --git a/Docs/PersistenceDesignDocument.md b/Docs/PersistenceDesignDocument.md index 1758a24..8b1d71f 100644 --- a/Docs/PersistenceDesignDocument.md +++ b/Docs/PersistenceDesignDocument.md @@ -479,6 +479,27 @@ stop the server, preserve the suspect save, restore the newest timestamped backup, restart, validate the world, and only then allow a new manual/admin save. +## MVP Persistence Limitations + +Version 0.1.M persistence is intentionally file-based and MVP-scoped. + +Current limitations: + +- no database-backed world state yet; +- no account-provider identity binding yet; +- no save migration framework beyond simple versioned records; +- no automated corrupted-save validator yet; +- no placed-container actor capture yet, only a reserved container save schema; +- no full offline player simulation or family/generational simulation yet; +- no cross-server persistence or shard transfer yet; +- no external backup replication unless VM/project backup jobs include + `Saved/SaveGames`; +- no player-facing save/load UI yet; +- no compatibility guarantee for pre-MVP experimental save files. + +These limits are acceptable for the first playable MVP as long as they remain +visible in handoffs, investor/demo notes, and release checklists. + ## Testing Gates Minimum persistence smoke test: diff --git a/Scripts/verify_persistence_limitations.py b/Scripts/verify_persistence_limitations.py new file mode 100644 index 0000000..062dff5 --- /dev/null +++ b/Scripts/verify_persistence_limitations.py @@ -0,0 +1,43 @@ +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] + +EXPECTED = { + ROOT / "Docs" / "PersistenceDesignDocument.md": [ + "## MVP Persistence Limitations", + "no database-backed world state yet", + "no account-provider identity binding yet", + "no save migration framework", + "no automated corrupted-save validator yet", + "no placed-container actor capture yet", + "no full offline player simulation or family/generational simulation yet", + "no cross-server persistence or shard transfer yet", + "no external backup replication", + "no player-facing save/load UI yet", + "no compatibility guarantee for pre-MVP experimental save files", + ], + ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md": [ + "[x] Document persistence limitations.", + "`Docs/PersistenceDesignDocument.md`", + "pre-MVP save compatibility", + ], +} + + +def main() -> None: + missing = [] + for path, snippets in EXPECTED.items(): + text = path.read_text(encoding="utf-8") + for snippet in snippets: + if snippet not in text: + missing.append(f"{path.relative_to(ROOT)}: {snippet}") + + if missing: + raise RuntimeError("Persistence limitations verification failed: " + "; ".join(missing)) + + print("PASS: MVP persistence limitations are documented.") + + +if __name__ == "__main__": + main()