v0.5.41 — Unreal starter-map receipt integrity (published source-only)¶
Status: v0.5.41 published SOURCE-ONLY prerelease; not a playable Unreal game. The independent source release workflow passed synthetic receipt and C++20 policy checks, but did not run a genuine licensed Unreal Editor or cook a map.
Purpose¶
The genuine circuit map does not ship as a compiled .umap in Git.
A licensed Unreal 5.8 Editor must create or load, save and serialize
/Game/Maps/LatebrakeCircuit before packaging. The previous script wrote
an Editor success receipt listing the map package and file size, but a file
of the same size with different bytes could satisfy the receipt. Also,
calling New-StarterMap.ps1 directly skipped the UE version/uproject
compatibility checks supplied by other build stages.
Hardened authoring sequence¶
On a Windows workstation with authorized Unreal Engine 5.8 installed:
pwsh ./scripts/Build-Editor.ps1 -EngineRoot 'C:/Program Files/Epic Games/UE_5.8'
pwsh ./scripts/New-StarterMap.ps1 -EngineRoot 'C:/Program Files/Epic Games/UE_5.8'
pwsh ./scripts/Build-PlayableCandidate.ps1 -EngineRoot 'C:/Program Files/Epic Games/UE_5.8' -Platform Win64 -OutputDirectory 'D:/LatebrakeCandidateWin64'
The map stage:
- Requires the project's
EngineAssociationand installed engine'sBuild.versionto both identify 5.8 before launching Editor. - Deletes any previous receipt so a swallowed Editor Python exception cannot pass due to an older successful invocation.
- Requires the Editor Python script to confirm the running engine reports
version 5.8, create/load
/Game/Maps/LatebrakeCircuit, and successfully save a genuine binary level. - Writes a version 1 receipt with the fixed map package, operation
(
createdorloaded), engine version5.8, byte length and a streaming SHA256 of the actual saved level. - Rejects malformed/stale receipts, old schema, mismatched engine or map identity, unexpected operation, missing map, symlinks, wrong length, invalid digest and same-size byte modification, then independently checks the serialized Unreal package header.
- The candidate pipeline pins source HEAD and map SHA256 before UAT and checks identity again after UAT; it does not claim the receipt alone proves which map actually cooked.
To inspect the map receipt on the authorized machine after genuine Editor authoring:
pwsh ./scripts/Test-MapAuthoringReceipt.ps1 -MapPath './Content/Maps/LatebrakeCircuit.umap' -ReceiptPath './Saved/LatebrakeAutomation/starter-map-result.json'
To test the policy without Unreal, CI exercises disposable synthetic non-UE bytes; those files are never shipped or treated as valid levels:
pwsh ./scripts/Test-MapAuthoringReceiptPolicy.ps1
Evidence still needed¶
A well-formed receipt proves only that recorded bytes and the inspected file agree. The version fields are emitted by authoring scripts; they are not cryptographic proof of genuine engine execution. Even a map with Unreal package magic may fail to load or cook. Authentic UHT/editor compilation, level load/cook and game startup, gate collisions, an installed Win64 executable, Android package and real-device driving remain unverified.
See executable build pipeline, checkpoint QA issue #31 and Android QA issue #13.