Troubleshooting
Problem, cause and solution for the validation codes and runtime behaviours World State Reset Framework reports.
Findings reported by Validate World State carry a code. Search this page for the code shown in the Inspector.
Validation codes
| Code | Severity | Cause | Solution |
|---|---|---|---|
MissingStableId | Error | The component has no Stable ID | Assign Missing IDs in the Inspector |
DuplicateStableId | Error | Two components share one ID, usually from copying a configured Actor at runtime or through source control | Regenerate Selected ID on the copy, never on the original |
InvalidRegion | Error | The Actor has no usable region membership | Assign a region tag in Quick Setup |
PolicyWithoutTrigger | Error | The reset policy has an empty trigger set, so no reset can ever match | Add the reason tags this Actor should respond to, or apply a preset |
PersistentContradiction | Warning | Persistent configuration contradicts the rest of the policy | Decide whether the Actor is Persistent or Resettable; it cannot be both |
OneShotTriggersIgnored | Warning | A One Shot Actor has reset triggers, which normal resets ignore | Remove the triggers, or switch the Actor to Resettable if it should return |
UnavailableClass | Error | The Actor class cannot be resolved | Restore the missing class or asset |
NonRespawnableClass | Error | The class cannot be recreated after destruction | Use a spawnable class, or make the record non-destructible |
NonPlaceableClass | Warning | The class is not normally placeable in a level | Confirm the Actor really is authored content |
ManifestOutdated | Warning | Authored configuration changed since the World Manifest was built | Click Build World Manifest and save |
UnmanagedAttachmentParent | Warning | The parent Actor is not managed by WSRF | Add a state component to the parent, or accept that the attachment cannot be rebuilt |
MissingAttachmentParent | Error | The recorded attachment parent no longer exists | Repair the attachment or clear it |
AttachmentCycle | Error | Managed Actors form an attachment loop | Break the cycle; restore ordering cannot be resolved |
MissingCustomStateInterface | Warning | The restore strategy expects WSRF Resettable, but the class does not implement it | Implement the interface, or switch to Automatic |
UnusedCustomStateInterface | Info | The class implements WSRF Resettable but the strategy never calls it | Switch to AutomaticThenInterface or InterfaceOnly if you meant to use it |
InvalidCustomStateSchema | Warning | A detectable invalid Custom State schema version | Set a valid version with Set Version during capture |
RuntimeRespawnUnsupported | Error | A destroyed runtime Actor is configured with a restore behaviour that cannot work | Change RuntimeActorBehavior, or make the Actor placed content |
MissingStableIdReference | Warning | Custom State references a Stable ID that matches nothing in the world | Re-capture the reference, or repair the target Actor’s ID |
Reset does nothing
| Problem | Cause | Solution |
|---|---|---|
| The reset runs but nothing changes | The request’s Reason is not in the Actor’s ResetTriggers | Compare both tags. This is the most common cause by a wide margin |
Nothing changes, and Scheduled is 0 | The region tag does not match, or child regions are excluded | Check the region tag and bIncludeChildRegions |
| One Actor never resets | Its persistence mode is Persistent | Persistent records are intentionally skipped by resets |
| An Actor resets to the wrong state | The initial capture happened before the Actor finished initialising | Call Recapture Initial State after your setup, or change CaptureTiming |
| Immediate capture appears overwritten | Immediate At Component BeginPlay applies pending state before the owner’s BeginPlay, so owner initialisation can overwrite it | Prefer the deferred default, or make owner initialisation conditional |
A Persistent Actor unexpectedly resets | Its policy is not actually Persistent, or a preset was re-applied afterwards | Re-check the policy; a preset overwrites the fields it owns |
| A policy change disappears after restarting PIE | Set Reset Policy is intentionally session-only | Change the authored component or Blueprint default for a permanent edit |
| A queued reset never reports success immediately | The immediate value is a placeholder (bWasQueued true, bWasExecuted false) | Match its OperationId to the completion delegate and use Was WSRF Reset Successful on that final report. If the 64-operation queue guard aborts requests, remove reset requests that recursively originate from completion callbacks |
Destroyed Actors
| Problem | Cause | Solution |
|---|---|---|
| A destroyed Actor does not return | The record is not Resettable, its trigger or region does not match, its class is not spawnable, or its source level is unloaded | Check each in that order; the report’s Errors names the failing record |
| A destroyed runtime-spawned Actor does not return | Expected: RestoreToCapturedState can restore a surviving runtime Actor but cannot respawn a destroyed one — no authored source placement exists | Recreate it through its owner/spawner or Custom State |
Find Loaded Actor returns null during Custom Restore | The related Actor may still belong to an unloaded source level, its respawn may have failed, or its container may not match | Keep the Stable ID, handle null, and resolve again when that world content is available. Never cache a destroyed object pointer as world state |
The Actor is StreamedOut, not Destroyed | Its level, cell or Data Layer unloaded — that is not destruction | Expected. The record is retained and marked Pending Restore |
| Respawn fails with a container error | WSRF could not prove the correct source level or container | Intentional: it refuses to spawn into the Persistent Level. Restore the source level |
| A respawned Actor lost a Blueprint value | Automatic capture only covers supported Instance Editable properties that differ from the class default | Use WSRF Resettable and the typed Writer/Reader for gameplay state |
| A reference to a destroyed Actor is broken | An object reference was stored instead of a Stable ID | Store the Stable ID and resolve it with Find Loaded Actor during Custom Restore |
Streaming
| Problem | Cause | Solution |
|---|---|---|
| Manifest Requires Rebuild | Managed Actors, IDs, regions, policies, classes, Data Layers or container structure changed | Build World Manifest and save |
| Records stay in Pending Restore | The Actor’s cell, sublevel or Data Layer is not loaded | Expected until the container returns; WSRF does not force loading |
| Duplicate effective identity | Duplicate local IDs, or conflicting instance/container configuration | Repair the local IDs, then rebuild the manifest |
| Two Level Instances reset each other | A non-context lookup or reset was used inside instanced content | Use Reset World Region In Context and Find Loaded Actor In Context |
| A streamed Actor is skipped by a reset | Streaming unload is not destruction | Intentional. The record is reconciled on reload rather than duplicated |
Persistence
| Problem | Cause | Solution |
|---|---|---|
| Nothing was exported | No Actor is configured as Persistent or OneShot | Only those two modes are exported, by design |
| An enemy respawned after loading a save | It is Resettable, so its temporary dead state is not saved | Intentional. Use Persistent or OneShot if it must be remembered |
Compatibility is TooOld or TooNew | The snapshot schema does not match this plugin version | Implement a UWSRFSnapshotMigrator and use the advanced import |
Compatibility is WrongWorld | The snapshot was captured in a different world | Apply it in the world it came from |
Records come back as VersionMismatch | The Custom State schema version changed | Branch on Get Version during restore, or migrate explicitly |
Records come back as Missing | No current or manifest identity matches | Expected after content was removed; other records still load |
Records come back as Deferred | The matching Actor or container is unloaded | Expected; they apply when the container registers |
The report counts ConfigurationMismatch | The saved configuration hash differs from the current Actor setup — the Actor’s class, regions, policy or container changed since the save | Diagnostic only: the state is still applied with the current settings. Review the per-record message if the change was unintentional |
Editor
| Problem | Cause | Solution |
|---|---|---|
| The Inspector menu is missing | The plugin is not enabled, or the editor was not restarted | Enable it and restart; check the Output Log |
| Reset Region (PIE) is disabled | An Editor world is selected, or no concrete region is chosen | Select an active PIE world and a specific region |
| Assign Missing IDs is disabled | A PIE world is selected | ID repair is Editor-only by design |
| The Inspector does not update on its own | It has no permanent tick, deliberately | Click Refresh |
| Plugin content is not visible | Plugin content is hidden in the Content Browser | Content Browser Settings → Show Plugin Content |
| Niagara state is not restored after removing the demo | The optional capture adapter was removed with the demo | Keep and load WorldStateResetFrameworkNiagara and enable Unreal’s Niagara plugin — the core Runtime intentionally has no Niagara dependency |
Still stuck
Collect the plugin version, the engine version, the validation code, the reset or import report and the reproduction steps, then write to support.
Last updated: 2026-09-04