Troubleshooting

Symptoms in the order people meet them, with the cause and the fix — save, load, values, autosave, cloud and the Editor.

Reference NexusForge Persistence 0.2.0 Updated

The save never appears#

SymptomLikely causeFix
SaveAsync succeeds but no file existsYou are looking in the wrong rootOpen Save Folder, or read the path from the smoke test's report
NF.PERSIST.STORAGE.PATH_TOO_LONGNamespace + environment + slot exceeded the path budgetShorten the namespace, or raise Storage.MaxPathLength deliberately
Nothing is written and no error appearsPersistence was never initialisedCall Initialize during startup; a save before that is NF.PERSIST.LIFECYCLE.NOT_INITIALIZED
The storage probe fails in the EditorPermissions, a read-only volume, or another process holding the fileCheck free space and folder permissions; the probe names the root

Loading fails#

CodeMeaningFix
NF.PERSIST.SLOT.NOT_FOUNDThe slot was never writtenTreat LoadOutcome.NotFound as "new game", not as an error
NF.PERSIST.SECURITY.AUTHENTICATION_FAILEDThe file was altered, or the key does not matchCheck the key provider and Security.KeyId; nothing was read or decrypted
NF.PERSIST.SECURITY.KEY_UNAVAILABLEEncryption is configured but no key was suppliedRegister an ISaveKeyProvider, or turn encryption off
NF.PERSIST.ENVELOPE.INTEGRITY_MISMATCHThe file is damagedUse recovery: it quarantines the damaged file and restores the newest valid backup
NF.PERSIST.MIGRATION.PATH_MISSINGA migration step is missing for a schema in the saveRegister the step, and declare the versions so validation catches it earlier
NF.PERSIST.SERIALIZATION.MALFORMEDThe document does not match the modelUsually a model change without a migration, or a member the type cannot represent

A failed load never modifies the slot. Recovery is a separate, explicit step.

"My values changed after a round trip"#

SymptomCauseFix
Dates come back as a different instantAlmost always a model type that cannot represent the valueInspect the written document; the framework writes timestamps in round-trip, culture-independent form
Large integers lose precisionA double in your model, or a serialisation path outside the frameworkKeep 64-bit counters as long; the framework preserves them exactly
Unknown fields disappearedThe document was re-serialised outside the framework, or a schema change deleted themUse the framework's save path; PreserveAndReport keeps unknown members across a load/edit/save cycle

Autosave#

SymptomCauseFix
No autosave happensAutosave.Enabled is false, or nothing called MarkDirtyEnable it, and mark dirty on real change events
Autosave happens too oftenDebounce is short and the game marks dirty every frameIncrease the debounce, or mark dirty on milestones rather than continuously
A save is lost when the app is suspendedNothing flushed on pauseSet Autosave.SaveOnPauseRequested, or call MarkDirty from your pause handler
Frame hitches on large savesProjection plus serialisation run on the caller's thread by defaultConsider Storage.OffloadWritesToThreadPool, and measure with the Performance test category

Cloud#

SymptomCauseFix
"Cloud is enabled but no provider is installed"The setting is on but no transport was suppliedImplement ICloudTransport and pass it to CloudSaveSyncService; the package ships no service
Repeated conflicts on one deviceThe provider reports no conditional-write support, or is rewriting metadataDeclare capabilities truthfully — see Providers and adapters
Uploads never happen offlineOfflineQueueEnabled is off, or the journal cannot be writtenTurn the queue on; check the save root is writable
A conflict lost a versionPreserveConflictCopies is offTurn it on: the losing copy is preserved in a *_conflict_<rev> slot

"Everything looks fine but the Editor complains"#

The validation report distinguishes four kinds of finding, and only two of them are problems: WARNING and ERROR are actionable and each carries a remedy; INFO is worth knowing; NOT VERIFIED means nothing was run for this combination — it is not a failure and not a promise. See Validation.

Getting help#

Run NexusForge → Persistence → Validate Everything first: its output is exactly what a maintainer needs, and it is safe to paste because it contains no payload bytes, keys or credentials. Support lists the rest.

Next#

  • Error codes — the complete reference.
  • Recovery — what to do about a damaged save.
  • FAQ — the questions that are not symptoms.

Something wrong on this page? Every page here describes behaviour that is checked in the repository. If a page and the package disagree, the package wins.

Report a documentation problem · Frequently asked questions · Troubleshooting