Release checklist
Every topic in this folder — debugging setup, automated tests, config layering, save versioning, packaging, crash reporting — exists to prevent a specific category of "found out after ship" problem. A release checklist's job is to force you to actually check each of those categories deliberately, once, right before a build goes out, instead of trusting that "it worked in the editor" generalizes to "it works for players." This doc is a working list, not a policy document — treat it as a starting checklist to adapt, not a substitute for platform certification requirements.
Why this matters
Individually, every item below is something you already know how to verify. Collectively, under release pressure, they're exactly the things that get skipped because "we tested that weeks ago" — and weeks ago was before the last ten commits. A checklist's value isn't teaching you anything new; it's making the skip visible and deliberate instead of silent.
Mental model
Each branch below corresponds to a folder elsewhere in this knowledge base — the checklist's job is to route you back to the doc that covers how to verify each item, not to re-explain the mechanics here.
The mechanics
Build and packaging
- Package with the actual
Shippingconfiguration andGame/Client/Servertarget you intend to ship — notDevelopment, notDebugGame Editor. See Build configurations and targets for whatShippingstrips (console commands, most logging, non-fatalcheck/ensurediagnostics) — behavior gated behind those macros needs testing in a build that actually has them stripped, not assumed safe because it worked in the editor. - Run a full
RunUAT BuildCookRunwith-pak(and-archiveif you use it), not just a cook-only CI pass — see Packaging and build targets for why a green cook-only job doesn't prove staging/packing succeed. - If you use chunking, verify chunk 0 alone is enough to reach a playable state, and that DLC/optional chunks are actually reachable post-install — see Packaging and build targets.
- Confirm
bSkipEditorContent=Trueand your intendedbCompressedsetting are what you expect in the packaging settings that actually apply to the build — not left over from an earlier debugging session.
Config
- Check platform-specific
.inioverrides for every platform you ship on — a value fixed in your project-wideDefault*.inican still be silently overridden by a forgottenConfig/<Platform>/<Platform><Category>.inilayer. See Config system and .ini files. - Grep for stray
+/-prefix mistakes on array config properties that were touched recently — these are the most common silent config regression and won't show up as a build error. - Confirm no debug/cheat-enabling config values (
DefaultEngine.initweaks made for internal testing) are still set to their debug values in the config layer that actually ships.
Saves
- Load a save file written by the previous shipped build (not one written by today's build) into today's build, and confirm it loads correctly, not just "doesn't crash." See Save game and serialization.
- Confirm every
Serializeoverride with a custom version bump was actually exercised against an old-version save during this pass — a version check that's never hit an old file is unverified, not verified. - If this release changes save-relevant struct/array layouts, confirm the custom version was bumped in the same change, not left at its previous value.
Performance
- Profile the actual
Shipping(or at minimumDevelopment) packaged build, not aDebugGame Editorsession — editor overhead and unoptimized game code both distort numbers relative to what ships. See Unreal Insights and Stat commands and console for capturing real numbers. - Re-check memory budgets against the packaged build's actual footprint, not an editor estimate — see Memory budgets and profiling.
- Confirm known optimization patterns applied earlier in development haven't regressed under recent content additions — see Optimization patterns.
Content
- Smoke-test the packaged build for content that works in PIE but is missing once cooked — a common symptom of an asset the cooker couldn't discover a reference path to. See Asset manager and soft references and Packaging and build targets.
- Confirm the Derived Data Cache used for the release build is either freshly generated or from a trusted shared cache — a stale/corrupt DDC entry can ship subtly wrong cooked data. See Cooking and derived data cache.
Crash reporting
- Deliberately trigger a test crash in the exact build you intend to ship, and confirm a report actually arrives somewhere you can read it — verifying "the pipeline is wired up" is not optional. See Crash reporting.
- Confirm
.pdb/.dSYMsymbols for this exact build are archived somewhere reachable (a symbol server or equivalent) before the build goes out — symbolicating a crash from a build whose symbols were never kept is not possible after the fact. See Debugging in Visual Studio.
Automated tests
- Run the full automated test suite against the actual target you're shipping (or as close to it as your CI supports), not only inside the editor — a test flagged for an editor application context is invisible, not failing, when queried from a packaged process; make sure this isn't hiding a suite that never actually ran for this release. See Automation and functional tests.
- Confirm CI's headless automation run actually exited non-zero on a deliberately-introduced failing test, if you haven't verified that recently — a CI job that always reports green regardless of test outcome is worse than no CI job, because it looks like coverage.
Code
# 1. Full package build for the real target/configuration
Engine/Build/BatchFiles/RunUAT.bat BuildCookRun \
-project="D:/MyGame/MyGame.uproject" -platform=Win64 -clientconfig=Shipping \
-build -cook -stage -pak -archive -archivedirectory="D:/Builds/Release-1.2.0"
# 2. Headless automation pass against the packaged/editor-cmd target
UnrealEditor-Cmd.exe "D:/MyGame/MyGame.uproject" \
-ExecCmds="Automation RunTests MyGame" -unattended -nopause -nullrhi -log
# 3. Load-test a previous-build save against today's binary (manual step, run the packaged .exe)
; Search your project's Default*.ini and platform override files for leftovers like:
; [/Script/Engine.PlayerController]
; bShowMouseCursor=True ; left on from UI debugging — should not ship this way
Gotchas
Every item above needs to be re-verified against the specific build being released, not assumed to still hold from an earlier pass — a config change, a save-format edit, or a new content reference made in the final days before release is exactly the kind of change most likely to be unverified against this list.
Console/storefront platforms typically have their own mandatory certification checklists (TRC/XR/Lotcheck equivalents) with requirements well beyond what's listed here — this checklist covers Unreal-specific technical risk, not platform business/certification requirements.
The value of a written checklist degrades fast if it's silently trimmed under time pressure by whoever happens to be running it. Treat skipped items as an explicit, logged decision ("skipped save-compat check for this hotfix, no save format changes since last release"), not a silent omission.
See also
- Packaging and build targets — the build pipeline this checklist assumes.
- Save game and serialization — the versioning discipline behind the saves section above.
- Config system and .ini files — the layering discipline behind the config section above.
- Crash reporting — verifying the pipeline this checklist asks you to test.
- Memory budgets and profiling — the performance-budget verification this checklist points at.
- Epic — Testing and Optimizing Your Content