Appearance
Saved Blueprint entry lifecycle — 2026-10-06
UE5.6.1 CL44394996, Win64, DX11. Original Field journal and WBP_JournalEntry, no Game Master design/assets or inventory rules. This is programmatic real-RHI lifecycle/virtualization testing, separate from physical input and full-game performance certification.
What changed and why
The first1000-model run rendered only4 rows, updated text through NotifyDataChanged and removed old subscriptions on scrolling. It exposed missing OnEntryReleased presentation cleanup in the saved journal Blueprint. Added ordinary public Blueprint events: OnEntrySelectionChanged chooses Accent/Body text and2/1-unit outline; OnEntryReleased clears title/detail and restores Body/1-unit outline. Existing classes, theme tokens, refresh graph and provider contracts remain intact. No core source change was required.
Initial selection assertions ran in the same world tick as SetSelectedItem and were premature. Inspected installed SObjectTableRow.h: it detects row selection through a Slate active timer. A corrected run waited for that update; selection passed, while the missing release cleanup still failed. Epic's RegenerateAllEntries documentation also explains that pooled regeneration uses entry-release/item-assignment callbacks, rather than Construct/Destruct. The example now follows those callbacks.
Fixture and checks
Development-only -IFVerifyEntries spawns an example QA actor, opens the actual saved Blueprint journal through PushScreen and replaces its list with1000 ordinary IFPresentationData objects. It uses engine ListView/public InterfaceForge APIs. Tests do not implement entity simulation or inventory mechanics. Shipping startup does not invoke this fixture; its execution is compiled out.
The actual sequence checks bounded displayed rows and current-model subscriptions; matching Blueprint labels; original source model unbinding; selection after a Slate tick; immediate visible NotifyDataChanged refresh; scroll to index999; old-model unbinding and inability to alter a recycled row; selection after recycling; ClearListItems; empty pooled text/data/selection/default styling; repopulation with a bounded reused row pool; screen close and final unbinding. A temporary150%UI/text preview is used only with -IFVerifyEntriesEnlarged, canceled without Apply/save. -IFVerifyEntriesCapture requests engine UI captures after selection has settled, before scrolling.
Rendering runs use -RenderOffscreen -dx11 -ResX=<width> -ResY=<height> -ForceRes -Windowed -unattended -nosplash. Source adds -game and the own project/map; cooked runs use the archived exact ForgeExamples executable and /Game/Maps/ForgeOutpost. Source additionally used temporary -DDC-ForceMemoryCache. All processes exit and retain their own logs; no desktop focus, security settings or reference assets were operated.
Results and scope
| Revision | Result | Displayed / observed pooled rows | Frame samples, median / P95 ms |
|---|---|---|---|
| Initial source fixture | FAIL: premature selection assertions plus retained release text | 4 /8 | 1528,2.545 /3.524 |
| Source with corrected selection timing | FAIL: release text only | 4 /8 | 2305,2.534 /3.472 |
| Repaired source, normal | PASS | 4 /8 | 2160,2.543 /3.430 |
| Repaired source,150% UI/text | PASS | 3 /6 | 2196,2.507 /3.447 |
| Cooked JournalLifecycleSlice, measured1280×720 | PASS | 4 /8 | 2314,2.514 /3.511 |
| Cooked JournalLifecycleSlice, measured800×600,150%UI/text | PASS | 3 /6 | 2389,2.438 /3.413 |
Source run logs printed0×0 viewport at startup before viewport allocation; image dimensions confirm1280×720/800×600. Corrected measurement occurs at the first settled stage in the cooked runs. Do not use startup0×0 as resolution evidence. Frame timings are uncapped local mock-scene world-tick samples during this short test, including list mutations/transitions. They are not a frame-budget guarantee, physical-input benchmark,10k-entity test or comparison against another game. Initial source setup created1000 models in2.079ms, list assignment0.307ms and one visible notify0.037ms; those are scoped observations on this machine.
Logs: EntryReview-Initial-UE56, EntryReview-Timing-UE56, EntryReview-Repaired-Normal-UE56, EntryReview-Repaired-Enlarged-UE56, Packaged-JournalLifecycle-Normal-UE56, Packaged-JournalLifecycle-Enlarged-UE56 under Evidence/Logs. Failed first authoring commandlet had a handled duplicate widget-variable registration ensure; added a presence guard. The next build and all14 saved Blueprint authoring passed0errors/0warnings (Create-JournalLifecycle-Repaired-UE56.log). No cook was used to conceal the failed authoring result.
JournalLifecycleSlice builds/cooks/archives both maps in26.38seconds (cook9.92seconds),464packages,0cookerrors/warnings. Ownership/staging check passed98source files/31own assets/5546reference hashes/2619targets. All reference HEAD/status/changed-file hashes and5546 UI packages remain unchanged. Captures were visually reviewed: selected title has Accent color and a thicker outline, text stays readable, partial last row is clipped only at the bounded scrolling list edge, and theme/return controls remain reachable. Source/cooked copies are Evidence/Visual/Journal-Selected[-Enlarged]-Source/Cooked-UE56.png. Captures and internal QA data remain excluded from distribution.
Validate actual results
Later BlueprintCustomizationSlice adds the journal's Watchpost survey footer. Current exact cooked normal/enlarged1000-model regressions pass with3/2 displayed rows and6/4 pooled rows; cleanup, selection, old-source isolation and bounded reuse remain intact. Frame samples3403/3354, median1.684/1.707ms and P95 2.348/2.461ms are scoped local tick observations. Logs Customization-Cooked-Entries-Normal/Enlarged-UE56.log; see customization record. The earlier4/3-row table remains historical evidence, not the current layout count.
The initial failed engine run returned process exit0 despite its FAIL marker. Accept neither process exit nor a screenshot alone. Tools/verify_entry_review.py requires one complete1000-item PASS marker, no fixture/runtime errors and, when requested, the measured viewport. It correctly returned1 for the retained failed timing run and0 for both cooked passes:
powershell
python Tools/verify_entry_review.py --log Evidence/Logs/Packaged-JournalLifecycle-Normal-UE56.log --width 1280 --height 720
python Tools/verify_entry_review.py --log Evidence/Logs/Packaged-JournalLifecycle-Enlarged-UE56.log --width 800 --height 600Paths above are relative to the development workspace. Physical mouse/keyboard-to-controller/touch navigation and device switching through this new selection presentation remain open. A fresh XInput1.4 check at13:30:53UTC found all4 slots disconnected; this does not enumerate touch or non-XInput hardware.