UEFN Verse Nested Editable Properties Failing Silently Loosing Serialization- LogPropertyBagRepository: No associated data entry found for replaced object

Summary

In Unreal Editor for Fortnite (UEFN), Verse devices using nested @editable properties (e.g., arrays of structs/classes with nested editable structs) lose their settings intermittently after closing/reopening the editor, pushing to a live session, or cooking the level. This manifests as a “LogPropertyBagRepository: No associated data entry found for replaced object” error, causing devices like resource_controller_device to silently fail in-game despite appearing functional in the editor. The issue is particularly severe with the resource_controller_device, which aggregates resources from multiple resource_list_device instances, leading to broken functionality (e.g., currency operations like granting/removing “Gold” or “BrainBucks”). This appears related to the known Verse serialization bug UCB-1021 or the verse reload FORT-936433, and aligns with community reports of nested editable properties resetting on build/reload.

Severity:

High – Critical game systems (e.g., resource management, currency operations) become non-functional, requiring manual reconfiguration of devices, which disrupts development and playtesting workflows.
Environment:

UEFN Version: Latest as of August 1, 2025 (36.30)
Platform: Windows 11 Pro
Hardware: Ryzen 9 9950X, 192 DDR5, Nvidia RTX 4090
Project Type: UEFN Creative Island
Verse Codebase: Custom resource management system with resource_controller_device and resource_list_device subclasses (see attached code snippets)

Please select what you are reporting on:

Verse

What Type of Bug are you experiencing?

Verse

Steps to Reproduce

Steps to Reproduce:

Create a New UEFN Project:

Start a new Creative Island project in UEFN.
Ensure Verse integration is enabled (e.g., VS Code plugin or built-in Verse editor).

Add Verse Code:

Implement the following simplified Verse code (derived from our project, minimizing unrelated logic while preserving the problematic structure):

resource_data.verse:

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Verse.org/Simulation/Tags }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }

resource_types := enum{None, Currency}

resource<public> := struct<concrete>:
    @editable ID<public> : int = 0
    @editable Name<public> : string = ""
    @editable Type<public> : resource_types = resource_types.None
    @editable ResourceTags : []tag = array{}
    @editable StorageSettings<public> : resource_storage_settings = resource_storage_settings{}
    @editable ItemGranter<public> : ?item_granter_config = false

resource_storage_settings<public> := struct<concrete>:
    @editable CanBeStored<public> : logic = false
    @editable MaxStackSize<public> : int = 100

item_granter_config<public> := struct<concrete>:
    @editable Index<public> : int = 0
    @editable Device<public> : ?item_granter_device = false

resource_list.verse:

using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/Diagnostics }

resource_list_device<public> := class(creative_device):
    @editable var Resources<public> : []resource = array{}

resource_list_currency_device<public> := class(resource_list_device):
    @editable Cur1 : resource = resource{
        ID := 1,
        Name := "Gold",
        Type := resource_types.Currency,
        ResourceTags := array{gold_tag{}},
        StorageSettings := resource_storage_settings{
            CanBeStored := true,
            MaxStackSize := 999
        },
        ItemGranter := option{item_granter_config{Index:= 1, Device := option{item_granter_device{}}}}
    }

    OnBegin<override>()<suspends>:void=
        if(Resources.Length = 0):
            set Resources += array{Cur1}

resource_controller.verse:

using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/Diagnostics }

resource_controller_device<public> := class(creative_device):
    @editable ResourceListDevices<public> : []resource_list_device = array{}
    var ActiveResources<public> : []resource = array{}
    Logger : log = log{Channel := log_resources}

    OnBegin<override>()<suspends>:void=
        for (ListDevice : ResourceListDevices):
            set ActiveResources += ListDevice.Resources
        Logger.Print("Loaded {ActiveResources.Length} resources")

    GetResource<public>(Name:string):resource =
        for (Res : ActiveResources):
            if (Res.Name = Name):
                return Res
        return resource{ID := 0, Name := ""}

This replicates the problematic nesting: ResourceListDevices (array) → Resources (array) → resource (struct with nested StorageSettings and ItemGranter).

Place Devices in Level:

In UEFN, place one resource_controller_device and one resource_list_currency_device in the level.
Configure the resource_controller_device:

In the Details panel, add the resource_list_currency_device to the ResourceListDevices array.
For the resource_list_currency_device, ensure the Cur1 resource is configured (e.g., set ItemGranter.Device to a new item_granter_device placed in the level).

Save the level.

Test Initial Functionality:

Playtest the level in UEFN (Start Session).
Use a debug trigger (e.g., add a button device calling GetResource(“Gold”) in resource_controller_device) to verify the resource is loaded correctly.
Confirm “Gold” is accessible (e.g., log output shows “Loaded 1 resources”).

Trigger Serialization Issue:

Perform one or more of the following actions (each can trigger the issue):

a. Close and Reopen UEFN: Save the project, close UEFN, and reopen it. Reload the level.

b. Push to Live Session: Publish the island to a live session (e.g., via “Publish” in UEFN).

c. Cook the Level: Build the level for playtesting (e.g., via “Build Verse Code” or full cook).
After each action, check the Output Log for errors like:
textLogPropertyBagRepository: No associated data entry found for replaced object: //Verse.Default__Verse-Scripts-ActorSystem-:_verse

Playtest again and check if GetResource(“Gold”) fails (e.g., returns empty resource or device functionality like granting “Gold” silently fails).

Verify Failure:

In the editor, inspect the resource_controller_device. The ResourceListDevices array may appear intact, but ActiveResources may be empty or contain default/invalid data.
In-game, actions tied to resources (e.g., granting items via ItemGranter) fail silently, despite devices appearing functional in the editor.

Expected Result

After closing/reopening UEFN, pushing to a live session, or cooking, the resource_controller_device loses its settings (e.g., ResourceListDevices or nested resource properties like ItemGranter reset).
Errors like “LogPropertyBagRepository: No associated data entry found for replaced object” appear in the Output Log.
In-game, resource-related functionality (e.g., granting “Gold”) fails silently, requiring manual replacement of the device with a new instance and reconfiguration in the editor.

Observed Result

Breaks core gameplay systems (e.g., currency management, item granting), making levels unplayable until devices are manually reconfigured.
Disrupts development workflow, as settings must be repeatedly reset.
Likely tied to UCB-1021 (noted in our codebase as a Verse serialization bug), affecting nested @editable properties, especially arrays of structs/classes with nested editable fields.

Workarounds Attempted:

Reinitialize in OnBegin: Populating Resources array in resource_list_device during OnBegin (as a workaround for UCB-1021) helps but doesn’t fully prevent resets in resource_controller_device.
Manual Device Replacement: Dragging a new resource_controller_device into the level and reconfiguring fixes the issue temporarily but is unsustainable for large projects.
Flattening Nesting: Testing with top-level @editable properties (instead of nested arrays/structs) reduces frequency but doesn’t eliminate the issue.
Debug Logging: Enabling debug mode in resource_controller_device confirms resources fail to load into ActiveResources when serialization breaks.

Additional Notes

The issue is intermittent, occurring inconsistently across editor sessions or builds, suggesting a race condition or serialization desync in Verse’s property bag system.
Community reports (e.g., Unreal forums, 2023–2025) describe similar issues with nested @editable arrays/classes resetting, with no confirmed fix as of August 2025.
Codebase uses a complex structure: resource_controller_device aggregates ResourceListDevices (array of devices), each with a Resources array of resource structs containing nested @editable structs (StorageSettings, ItemGranter). Simplifying to top-level @editable properties or flat class instances may mitigate but requires significant refactoring.

Attachments:

Simplified Verse code (above) to reproduce the issue.
Full codebase available upon request (includes resource_data.verse, resource_list.verse, resource_controller.verse, and related files).
Sample log output:
text[2025.08.01-16.55.54:996][630]LogPropertyBagRepository: No associated data entry found for replaced object: /LuminaraSecrets_B/Verse.Default__Verse-Scripts-ActorSystem-:_verse

Suggested Fix:

Improve Verse serialization for nested @editable properties, especially arrays of structs/classes with nested editable fields.
Ensure property bag system correctly migrates references during object replacement (e.g., after recompilation or session reload).
Provide clearer diagnostics in logs to identify which property or reference failed.