Back to Blog
    Last Week in Unreal

    Last Week in Unreal: Epic Preferred MSVC 14.51, Then Banned It for a Miscompile (September 28 to October 4, 2026)

    Venkat S26 min read
    Last Week in Unreal: Epic Preferred MSVC 14.51, Then Banned It for a Miscompile (September 28 to October 4, 2026)

    Unreal Engine Weekly: Epic Preferred MSVC 14.51, Then Banned It for a Miscompile

    Week of September 28 to October 4, 2026 | 1,065 commits on ue6-main, 123 on ue5-main | Branch: ue6-main

    Overview

    On Thursday, Windows_SDK.json added “14.51.36231-14.51.99999 as the top preferred MSVC range so UnrealBuildTool selects it when installed” (b9836eed). On Friday, the same file banned it: “Ban MSVC 14.51 due to an optimizer miscompile causing memory corruption and HeadlessChaos cluster assertions. Reproduced with cl 19.51.36260; /d2SSAOptimizer- avoids the failure.” (71b4bbb5). Epic caught a compiler bug in its own build within a day of choosing that compiler. If your build machines picked up 14.51 on their own, check that first.

    Much of the rest of the week changes what your build or game does without producing an error. The ray-traced skinned mesh cache renamed its console variables, and the commit says outright that “project ini overrides of the old names are ignored” (95930ecc). PSO precache deferral went on by default (7cc9b379), Mac bindless went on by default (d0841228), and a mesh pass sort key had been returning 0 (69b6a2af). The cooker also got a run of incremental correctness fixes, including one that recooked “every Blueprint deriving from a class with SparseClassDataTypes” on each incremental cook (fd0a139c).

    At 1,065 commits, ue6-main came in just under last week’s 1,072, the busiest week since this briefing started tracking it in June. Among named subsystems, build leads at 104, followed by editor at 86, rendering at 69, and core at 67.


    Agent tooling eased off its peak, and kept building out

    Pattern: counting commits that touch the toolset registry, the AI Assistant plugin, the experimental toolsets, AsyncFunctionResult, and ToolsetCore (by path or by name in the message, with mesh modeling toolsets excluded), the cluster came to 46 this week, against 56 last week, 30 the week before, and 20 the week before that. It is off last week’s high and still more than double the early September count.

    Interpretation: the work moved from structure to behavior. A new MediaToolset plugin adds “four read-only AI-callable tools: ReadImageFile, GetVideoInfo, SkimVideo and SampleFrames,” with video decoding through Media Foundation “gated on PLATFORM_WINDOWS” (03b4fb0f). ObjectToolset now refuses writes to class default data a Blueprint does not own. Before, “an agent could write to a native CDO like Default__StaticMeshActor, or one of its default subobjects, and change every object of that class created for the rest of the session” (a1e938cf). Agent undo got sturdier: each tool call’s edits now go into their own buffer (7406cee2), and undoing through the EDA “now reverts unconditionally, hand edits included” (c9b057b6). One change did not stick: AllToolsets, EditorToolset, and AnimationAssistantToolset were restricted to desktop platforms early in the week (ff17b2f4), and the restriction was reverted on Friday, “removing SupportedTargetPlatforms from the AllToolsets, AnimationAssistantToolset, and EditorToolset plugins” (258545c3). We are watching UnrealConsole most closely, covered under Worth Tracking.

    Who cares: tools programmers, pipeline and automation teams, anyone scripting the editor through the toolset APIs.

    Signal strength: Strong.

    UBA is still one engineer’s work

    Pattern: counting commits touching UnrealBuildAccelerator the same way each week: 37 with 29 from one engineer (Sep 7 to 13), 19 with 10 from a second engineer and 7 from the original (Sep 14 to 20), 36 all from the original (Sep 21 to 27), and 19 this week, all from the same engineer behind last week’s 36.

    Interpretation: last week we dropped our handoff reading, and this week supports that. Volume fell to 19, but authorship did not change. The work is mostly Linux and Ninja: Go and static-glibc syscalls routed through UBA’s virtual filesystem (47ff3089, 4d7e530e, a8fbc0eb), generated Ninja dependencies kept so “consumers rebuild after changed generators” (a2c1462d), and oversized static command lines that “fail cleanly with E2BIG” when they still do not fit (f987c8ac). The storage proxy fix in Highlights is the one most farms should take.

    Who cares: build and CI engineers, anyone whose build farm depends on UBA.

    Signal strength: Moderate.

    Cook correctness, and DLC cooking in particular

    Pattern: twelve commits this week open with “Cooker:”, most of them under one DLC ticket, alongside a set of incremental cook fixes and a merge of determinism fixes from Main. The low tier alone carries about 25 cook determinism commits, a series from one engineer among them.

    Interpretation: the commits suggest Epic is making incremental cooks something it trusts for shipping as well as iteration. Several fixes close cases where an incremental cook either did too much work or skipped work it should have done, and the DLC series adds warnings for content a DLC cook depends on but did not cook.

    Who cares: build engineers, release managers, anyone running incremental or DLC cooks.

    Signal strength: Moderate.


    TL;DR

    • Check which MSVC your Windows build machines are using. 14.51 became the top preferred range on Thursday (b9836eed) and was banned on Friday for “an optimizer miscompile causing memory corruption and HeadlessChaos cluster assertions” (71b4bbb5). 14.50 remains available.
    • The ray-traced skinned mesh cache CVars were renamed, and old names are ignored. r.Skinning.RayTracingCache is now r.Skinning.Cache.RayTracing (95930ecc). Refits now default to an unlimited budget instead of the old “250k triangles per frame” cap (3bd88216), and a new r.Skinning.Cache.RayTracing.BudgetMB defaults to 256 (98f9acf2).
    • An occlusion feedback regression fix is off by default. With r.OcclusionFeedback.Enable=1, spurious visible verdicts kept re-arming skeletal pose ticking and Niagara visibility work. The fix sits behind r.OcclusionFeedback.UntestedAsIndefinite, “(default 0)” (46ea29b0). If you run occlusion feedback, opt in.
    • Incremental cooks got more correct. Blueprints with sparse class data were recooked on each incremental cook (fd0a139c), and a comparison bug “led to missed incremental recooks” (2e1c5832). The determinism merge from Main shipped after one backout (78a2556e).
    • Several defaults moved. r.PSOPrecache.DeferUntilPostLoad is on (7cc9b379), Mac bindless is on (d0841228), two Chaos user data fixes default on (f5ecfea2, 0b2283ee), and the Sequencer landing mode went from 2 to 3 (868a4600).
    • UBA’s storage proxy could hang fetches “until 10 minute timeout” and leave helpers looping (94dbca45). Launch On iteration lost about 4 seconds without AutoSDK (d65c5690) and about 2 seconds on Android (d42c6f51).
    • If you ship on 5.8: an XSX EOS delay-load crash on launch, garbled UAT commandlet output on non-Latin build agents, a Lumen atlas cleared each frame while a SceneCapture2D renders, and a hotfix-compatible landscape edit layer fix are in the 5.8 section below, with commit references.

    Highlights

    MSVC 14.51 was preferred, then banned

    What changed

    Two commits a day apart, in changelist order. First, “Windows_SDK.json: prefer MSVC 14.51,” adding “14.51.36231-14.51.99999 as the top preferred MSVC range so UnrealBuildTool selects it when installed. 14.50 and 14.44 remain as fallbacks.” (b9836eed). A companion commit fixed 14.51 validation warnings (4a4575f1). Then: “Ban MSVC 14.51 due to an optimizer miscompile causing memory corruption and HeadlessChaos cluster assertions. Reproduced with cl 19.51.36260; /d2SSAOptimizer- avoids the failure. Valid installed toolchains, including 14.50, remain available.” (71b4bbb5).

    Why this is important

    A miscompile that shows up as memory corruption does not fail the build. It can ship and surface later as a crash that is hard to trace back to the compiler. The message cites HeadlessChaos cluster assertions as the symptom Epic saw. If a Windows build machine installed 14.51 and your engine version was between these two commits, or if you set toolchain preferences yourself, check the compiler version in your build logs. The commit names a workaround flag, /d2SSAOptimizer-, but the engine’s answer is to not use 14.51 at all.

    Who should care

    Build engineers, CI owners, anyone maintaining Windows build images.

    Urgency

    Act now if any Windows build machine has MSVC 14.51 installed.


    The ray-traced skinned mesh cache was rebuilt, and its CVars renamed

    What changed

    Four commits from one engineer rebuilt the ray tracing cache for animated instanced skinned meshes (ISKM). Storage became demand-driven: “only active slots own a block and a BLAS, so memory follows active slots and inactive slots are never skinned or built” (781f4415).

    The cache then moved onto the shared dynamic geometry budget. The commit flags a “Behavior change with default settings: the manager’s budget is unlimited by default, so every visible cache slot is refit every frame (previously capped at 250k triangles per frame by r.Skinning.RayTracingCache.MaxTrianglesPerFrame).” It measured “cache skinning 0.01 -> 0.21 ms p50” on its perf test level and says “Projects that relied on the old cap should set r.RayTracing.DynamicGeometry.MaxUpdatePrimitivesPerFrame.” It removed r.Skinning.RayTracingCache.MaxTrianglesPerFrame and r.Skinning.RayTracingCache.RebuildInterval, and fixed “a latent cross-queue race with r.RayTracing.AsyncBuild 1” (3bd88216).

    The same day, the names changed: “Impact: renamed console variables, so project ini overrides of the old names are ignored.” r.Skinning.RayTracingCache became r.Skinning.Cache.RayTracing, MaxInitialBuildTrianglesPerFrame, PageSizeMB, and PageIdleFrames moved under r.Skinning.Cache.RayTracing.*, and r.Skinning.RayTracingCache.Audit became r.Skinning.Cache.Audit (95930ecc).

    Two days later, slots got per-slot LODs and a scene-wide memory budget, r.Skinning.Cache.RayTracing.BudgetMB “(default 256, 0 = unlimited).” Nearby instances now “trace finer LODs (the cache used the coarsest LOD),” and scenes over budget trace their farthest instances with static geometry: “a 10,000 instance crowd: 642 MB -> 256 MB.” Render thread cost of the update is quoted at “0.18 ms for 4,000 instances, 0.50 ms for 10,000 instances (Development)” (98f9acf2).

    Why this is important

    Two separate changes can bite here. A config file that sets any r.Skinning.RayTracingCache.* variable now sets nothing, with no error. And with default settings, refits are no longer capped, which the commit itself says “costs more GPU with many animations.” If you tuned crowds against the 250k cap, your GPU budget moved. The commit also notes that at a matched 250k budget “GPU cost is unchanged and cache CPU time in the scene update drops 20-88%,” so setting the shared budget explicitly gets you the old cost with the new scheduling.

    Who should care

    Graphics programmers, technical artists running large animated crowds under ray tracing, anyone with skinning cache CVars in config.

    Urgency

    Act now if your project config sets any of the old CVar names or relied on the 250k refit cap. Track otherwise.


    The chunk assigner can now be enabled from a project setting

    What changed

    Client and game targets can now turn on the oplog chunk assigner with a project setting, [/Script/UnrealEd.ProjectPackagingSettings] bRunChunkAssigner, which the commit adds to BaseGame.ini as “Default False.” DLC reads the plugin’s Config/Game.ini first. “Dedicated servers only run it with -RunChunkAssigner / -ChunkAssigner=.” The commit message reads as if the setting replaces the flag, but the diff shows otherwise: the flag’s help text now says it forces the assigner “for every target, including dedicated servers,” and the setting decides only “Without this flag” (bb4f6b5a). An earlier commit passed the metadata directory through to the assigner (b8279ecf), and a follow-up stages GameFeatureVersePaths.bin explicitly, deleting any previous copy first “so a stale copy is never paked” (a6cdc4f9).

    Why this is important

    Nothing breaks. Pipelines that pass -RunChunkAssigner keep working, and with the setting defaulting to False, projects that never used the assigner see no change. What is new is that a project can turn the assigner on for client builds in config instead of carrying a command-line flag through every BuildCookRun invocation, and that the message’s “instead of” wording overstates the change if you read it alone.

    Who should care

    Build and release engineers, anyone using the oplog chunk assigner.

    Urgency

    Track. Consider moving to the project setting if you already pass the flag for client builds.


    Incremental cooks stopped overcooking and undercooking

    What changed

    Three fixes, failing in different directions. The Blueprint native class dependency hash varied with sparse class data creation order, “which caused every Blueprint deriving from a class with SparseClassDataTypes to be reported as Native Class Changed and recooked on every incremental cook” (fd0a139c). In the other direction, “Algo::CompareAsInt in ARFilter.cpp repeated LessThan(A, B), so it never returned +1,” the cook’s asset registry access tracker overwrote records on hash collisions, and “the dropped AR-query build dependencies led to missed incremental recooks” (2e1c5832). And packages importing a class that CoreRedirects declares removed now stay eligible for incremental cooking (760e6ed4).

    “Merge cook determinism fixes from Main” covers “cook dependency tracking, deterministic actor naming and ordering, archetype inheritance, soft object path fixup, shader library sorting.” It was backed out once and relanded inside the week (78a2556e).

    For DLC, CookImportChecker now runs on DLC cooks, “giving warnings for missing hard imports and adding missing soft imports to the Cook.ReferencesOfUncooked op in the DLC cook’s oplog” (45178bb1). -DlcPluginOnly had a plain bug: “Packages outside of the plugin were still being cooked” (b4a4d9cc). The uncooked references list now works for loose file cooks (02b84132), and UnrealPak and IoStore no longer look for DevelopmentAssetRegistry.bin to find metadata, because “-NoSaveDevAR skips it for performance” (1f7d40c4).

    On speed, a material change adds cook.MICParameterLookupCache “(default 0; set by -CookExperimentalOptimizations)” and measures “UpdateParameters 602 s -> 8 s, about -4.8% wall” on a content subset. Two caveats come with it: materials see a “one-time TargetDomainKey change,” and “UMaterialInstance editor layout change (ReentrantFlag removed); editor plugins must rebuild” (8a5911ac).

    Why this is important

    The sparse class data bug is easy to spot, because incremental cooks do far more work than they should. The comparison bug is worse, because a missed recook can leave stale cooked data in a build with nothing to flag it. If you rely on incremental cooks for anything that goes to players, take 2e1c5832. Expect one larger-than-usual incremental cook after 8a5911ac because of the key change, and rebuild editor plugins that touch UMaterialInstance.

    Who should care

    Build engineers, release managers, DLC and plugin content teams, editor plugin authors.

    Urgency

    Act now if you ship from incremental or DLC cooks. Track otherwise.


    Defaults that moved this week

    What changed

    None of these announce themselves at build time.

    • PSO precache deferral is on. r.PSOPrecache.DeferUntilPostLoad (default 1) defers precaching on loaded components until their own PostLoad, because an actor’s PostLoad can change materials first. “Behavior change: on by default. r.PSOPrecache.DeferUntilPostLoad=0 restores the previous behavior.” (7cc9b379).
    • Mac bindless is on. “Enable Bindless on all Mac platforms by default.” The diff changes BindlessConfiguration from Disabled to All in BaseMacEngine.ini (d0841228).
    • Chaos user data, two fixes default on. p.Chaos.UserDataPT.SkipNullPayloadOnAdd, “default on” (f5ecfea2). And p.Chaos.UserDataPT.SkipInputsDuringResim, “default on,” because a resim replay “stored nulls over live data and repeated old removals” (0b2283ee). Seven commits added eight new collision options alongside, each “default off” in its message (2a3d0def, 60a3728a, cb076f03, eb642d3c, dc5169d4, 7c340dd7, 20f3192e).
    • Sequencer landing mode. “Change the default Sequencer.SwitchBoundary.OccupiedLandingMode from 2 to 3 (keep the existing world at the moving boundary and always add a key at the drag start)” (868a4600).
    • Animation tick ordering. EndPhysicsTick now waits on the skeletal mesh primary tick, with an opt-out, tick.EndPhysicsTickWaitsForAnimation=0 (53d95ea0).
    • Mesh pass sorting was off. “Fix TShaderRef::GetSortKey() always returning 0, which left every mesh pass sorted by state bucket id instead of by shader” (69b6a2af). The message does not say when the bug came in.
    • An occlusion feedback fix you have to opt into. With r.OcclusionFeedback.Enable=1, spurious visible verdicts re-armed “the 1 second bRecentlyRendered window and all the work keyed on it: skeletal pose ticking (ShouldTickPose, URO, Animation Budget Allocator) and effects.” The fix sits behind r.OcclusionFeedback.UntestedAsIndefinite, “(default 0),” and the diff confirms 0 (46ea29b0).

    Why this is important

    Act on the occlusion feedback item first. The commit calls it “a game thread regression,” but the default leaves the regression in place, so a project running occlusion feedback has to set r.OcclusionFeedback.UntestedAsIndefinite=1 (or already run r.OcclusionFeedback.VisibleTestPeriod above 1) to get the fix. The sort key fix is a silent performance change: mesh passes now sort by shader as intended. The message gives no performance numbers, so measure before and after if you profile draw submission closely. One adjacent fix: setting r.CustomDepth to the value it already had reregistered “every component in every world for no change: a large hitch” (1ff8ad7a).

    Who should care

    Graphics and gameplay programmers, Mac teams, network physics programmers, Sequencer animators, performance engineers.

    Urgency

    Act now on occlusion feedback if you run it. Track the rest at your next integration.


    Mobile and lower-end GPUs got more reach

    What changed

    Ambient Lighting Volumes moved to mobile. The commit cuts instance data “from 6 uint4 to 3 uint4,” reduces “the overhead cost from 0.5ms to 0.3ms when simply enabling ALVs on a mobile platform,” notes that “android has been able to cook with ALV enabled,” and concludes “ALV is now enabled by default on mobile platforms” (ee32ab5b). The diff shows no CVar or ini default change, and the new mobile shader path is still gated on the project’s ALV support setting. The day after, ALVs were disabled again in the mobile merged light pass “due to out of smaplers for some game materials” (63a418c0), then re-enabled two days later after a texture slot was saved so they “should fit withing the 16 samplers limit of Android OpenGL” (ca4699fe).

    On desktop, a new r.SM6.RequireAtomic64 (default: true) lets otherwise-compatible D3D12 and Mac GPUs select SM6 without 64-bit typed atomics when set to false, while it will “Keep Nanite unavailable on unsupported GPUs” (6b14511d). The engine default is unchanged. Lyra is the only project that sets it false this week, with “Nanite remains disabled on those GPUs” (c9d18676).

    For Adreno, a SPIR-V optimizer pass now “stores a null value into every fragment output the shader declares but never writes,” because “Pixels shaders that do not write to all declared outputs may hang Adreno GPUs” (1b9401b7). It replaces an earlier runtime fix for the same GPU failure on the “Galaxy S24 with Adreno 750,” backed out with the note “Shader fix now applied in a ShaderConductor” (ddf3b96f). Separately, debug view markup had “pushed landscape materials over the ES3.1 16 sampler limit” under the new material translator (daeb62f8).

    Why this is important

    The ALV message says enabled by default on mobile, and the commits back that up as a cost reduction rather than a flag flip. Whether your mobile build uses ALVs still depends on your project’s ALV support setting, so check yours. Three commits this week ran into mobile sampler limits (16 on ES3.1 and Android OpenGL), so expect more of that. The SM6 change opens a path for GPUs without 64-bit atomics, but only if you opt in, and Nanite stays off on those GPUs either way. The Adreno fix lands in the shader compiler, so it applies after a shader rebuild.

    Who should care

    Mobile rendering engineers, Android teams, technical artists using ALVs, teams supporting older desktop GPUs.

    Urgency

    Act now if you ship on Adreno and have seen GPU hangs. Track otherwise.


    UBA fetch hangs fixed, and Launch On got faster

    What changed

    UBA’s storage proxy fix covers several ways a fetch could stall. The proxy used to drop the client when the server could not provide a file, which “made the helper get the same proxy again and loop reconnecting forever.” A leaked begin message meant “all later fetches of that file hung until 10 minute timeout.” And “A failed fetch begin is no longer cached forever in the proxy” (94dbca45).

    Launch On iteration got two cuts. Without AutoSDK, editor and commandlet startup ran a BuildUBT up-to-date check that “costs ~4s even when nothing changed, while UBT itself takes ~0.7s. This is paid on every cook in Launch On Device.” It is now skipped when UBT is launched with bSkipBuildUBT (d65c5690). On Android, AFS deploy avoids “a second file server start on every iterative deploy (~2s per Launch On)” (d42c6f51), and quick launch incremental deploy was fixed (18b07486). A third change, reusing the cached UATRules assembly instead of recompiling it “(~2s, e.g. every editor quick launch),” was backed out the same day with no reland, so it did not ship (88268823).

    Why this is important

    The proxy bug showed up as helpers stuck, or processes failing with “missing files that are not missing.” If you run UBA with a storage proxy and have seen intermittent ten-minute stalls, test with this. The Launch On changes are small numbers that add up for anyone iterating on device several times an hour.

    Who should care

    Build and CI engineers, UBA operators, anyone iterating with Launch On.

    Urgency

    Act now if you run UBA through a storage proxy. Track otherwise.


    Worth Tracking

    Frame pacing groundwork landed, compiled out. A new frame pacer measures each pipeline stage from a per-frame task timing graph, “takes the slowest stage’s recurrence as the achievable frame period,” and delays frame start so work lands “just-in-time for the flip minus r.FramePacing.TargetSlack.” The commit ends with “All task timing and frame pacer code is disabled by UE_TASK_TIMING_ENABLE 0 for now.” (c8214148). The next day, the D3D12 RHI removed its PresentOnSubmissionThread paths, which “have been disabled for a while,” because removing them “will make it easier to support the new frame pacing system in D3D12” (2dcea985). Nothing changes for you yet. When UE_TASK_TIMING_ENABLE flips, frame timing behavior changes with it.

    UnrealConsole, a headless editor host. Seven commit messages name it this week. It boots a “curated” startup that was missing two steps “relative to FEngineLoop,” one of which left “any map load” failing CheckForWorldGCLeaks under -minimalengine (8ffa5e75). Saving under “UnrealConsole’s minimal engine” failed (c625ee5a), Slate gained a way to skip editor UI because “UnrealConsole being headless doesn’t want any Slate” (3c28faf2), and toolsets learned to work without it: the agent plugin skips its settings panel “(UnrealConsole headless host)” (dd5f55ec), and the toolset registry tolerates missing editor subsystems “for headless editor hosts” (12efd3d9). No message states the purpose. The commits suggest a headless editor that agent tools can drive without a UI.

    PCG Component Lite. Eight commits this week, counting a backout and its reland, took the series from P4 through P8, including “P6 – add the non-partitioned Lite component” (b2f57825) and a display name of “PCG (Lite)” (a2f7ef33). Last week PCG added a base class to “phase out the old overcrowded component with a new one.” No commit yet states a default or a migration path.

    Two follow-ups on last week’s post. We reported the Iris RPC ownership bypass fix as backed out with no reland. It relanded on Monday as “Re-submit of CL 58175859 (backed out in CL 58581021). Fix Iris RPC ownership bypass and type confusion during RPC processing.” with new tests, and nothing backed it out through Sunday (d42001cf). We also said we would not count the VBench TWriteBarrier change as shipped until the next reland. It also relanded on Monday, with the same “10% speedup on VBench” text, and stayed in through the end of the week (8feb3d14).


    What We Ignored

    This week we ignored roughly 830 commits: config and plugin descriptor churn, Verse, UEFN, and scene graph work, animation framework and RigVM polish, AI toolset API surface, virtual production and media plumbing, editor UI, header tool codegen, test and static analysis cleanup, and the usual small fixes. There were 24 commits tagged [Backout], the same as last week and inside the normal band for this branch. Several relanded in-window, including the cook determinism merge above, PCG Component Lite P5 (2ec4c4e4), and a TEDS column API change (8dbc277a).

    Three that did not come back are worth naming, because their titles make them sound shipped. “Enabling new platform IO dispatcher on all platforms until hard-lock to give it some testing” was backed out with no reland (4572de78), so the new dispatcher is not enabled. The UATRules cache reuse mentioned above did not ship (88268823). And a ChaosCloth change to stop rotating reference bone velocity, which would have removed a “fake centripetal acceleration,” was backed out with no reland (d5e43eb6).

    A few one-liners. GAS CancelAbilities was cancelling all instances instead of the targeted ones (150de265). A Niagara PSO readiness bug left some effects that “can never be culled,” with kill switches fx.Niagara.RestoreSoloAfterReady=0 and fx.Niagara.RegisterScalabilityAfterReady=0 (e312517c). With memory-mapped shaders, encrypted IAD chunks reached the shader archive and “Oodle decompression in CreateShader then failed fatally” (16c68d93). And “project-scoped asset module accessibility” is now on by default, which “can cause some ambiguity errors” (c5449c37).


    For teams shipping on 5.8

    ue5-main ran 123 commits with no backouts, against 196 last week. There was no gather changelist and no hotfix version bump. Of 122 analyzable commits, 111 carry an exact title twin on ue6-main, so most of this list is mirrored there. The traffic is mostly animation framework work (about 45 commits), Control Rig, and Sequencer, with rendering thin at six commits. A handful of the items below are on this branch only, and each says so.

    • XSX EOS delay-load crash on launch. “Fix EOS delay-load crash on launch with modern GDK folder layout,” with a note to “Remove once EOSSDK ships a modern-layout XSX binary.” It changes build rules only (ef041c2a). This one is on ue5-main only. A separate EOSSDK v1.19.2.1 binary update marks “PS4 10.008.001/10.508.001, PS5 10.00.00.40/11.00.00.40, Switch 18.3.1/19.3.5, XboxOneGDK/XSX 240300-241000” as deprecated and adds “Switch/Switch2 22.2.5” (e0b317d6). Its message does not say whether it ships the modern-layout XSX binary.
    • UAT output on non-Latin build agents. UAT now starts commandlets with a UTF-8 environment, fixing “garbled output from the commandlets when running UAT on a system that is set to a non-latin codepage (Japanese, Chinese…)” (97185d08). On ue5-main only. If your build agents run a Japanese or Chinese system locale, take this.
    • Lumen atlas cleared each frame under SceneCapture2D. “Fix Lumen indirect lighting atlas being cleared every frame when a SceneCapture2D is rendering” (0fda89fd). Also on ue6-main. A separate Lumen crash when uploading “more instance indices than GPUScene can hold (MAX_INSTANCE_ID)” is also fixed (6014b88a), on both branches, alongside a Vulkan ReadSurfaceData null check (61e2141e).
    • A landscape fix written to be hotfix compatible. An assertion in the batched edit layers merge “when two landscape components overlap” is fixed, and the commit notes “New functions intentionally omit LANDSCAPE_API to make the CL hotfix compatible.” (4ff41bbd). It is also on ue6-main. It is the only commit this week that says this, which suggests it is a candidate for a 5.8 hotfix, though no message says so.
    • Static mesh builds crashed on meshes with no UVs. “Array index out of bounds: 0 into an array of size 0” in the async static mesh build “whenever bUseMikkTSpace was on, which is the default.” It now falls back to per-vertex tangent averaging, with “No behaviour change for meshes with at least one UV channel” (0c34c4aa). Also on ue6-main.
    • Mac pak staging for projects outside the engine root. A GitHub pull request (PR #15101) fixes the CreatePaksUsingChunkManifests lookup path “so that it works for mac platforms and not just windows particularly for projects that live outside the UE root” (01428705). Also on ue6-main.
    • Editor web views no longer take the editor down. The CEF v128 update “Fixes editor crashes when the GPU process is reported as unusable,” and the web views now show a spinner instead (7bb6f298). A shutdown crash with -RenderOffScreen is fixed too (1d60c6cb). Both are also on ue6-main. The commits suggest the second matters most on headless build agents.
    • PIE crash on brushes without a level. “EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000028” in ABrush::PostLoad, where “Every reported occurrence is a PIE world duplication.” The fix adds an ensure, and “projects that suppress LogBrush will see the ensure where they previously saw nothing. It fires once per session.” (9396d5b1). Also on ue6-main.
    • Cook determinism, two fixes. PoseSearch PCA data varied with CPU cache size, so “a machine with a 32 KB L1 and one with a 48 KB L1” produced different covariances. The fix bumps DatabaseIndexDerivedDataCacheKeyVersion “to rebuild the cached indices” (5cc61f39). A Control Rig anim graph node’s compiled class “no longer depends on cook load order” (e8dcfef1). Both are also on ue6-main. Expect a PoseSearch DDC rebuild.
    • Sequencer landing mode default changed here too. Sequencer.SwitchBoundary.OccupiedLandingMode went “from 2 to 3” (de572aff), the same change as on ue6-main.
    • Visual Studio 2026 solutions. The source code accessor did not recognize .slnx, so clicking a Blueprint’s native parent class “launched a new devenv on every click,” and the hot reload “save all open Visual Studio documents before compiling” hook was silently disabled (5fc7f720). No twin landed on ue6-main this week. The commit is a cherry-pick of an older changelist.
    • Animation framework content needs a resave. An output variables change includes an “asset registry version bump,” and “UAF content needs a resave with or directly after this change” (8b1e4487). Also on ue6-main.
    • The GC barrier change from last week, one follow-up. Epic’s own replication test target needed an explicit opt-in: “CIS compile error fix: enabling the GC barrier for replication tests (required by TestGarbageObjectPtrReference)” (acf28db8), also on ue6-main. It is a one-file target change, and it is the pattern to expect in your own non-editor targets if they depend on the barrier. Nothing on this branch touched last week’s AVBOIT, Nanite translucency, Vulkan fence, or RigVM Return node defaults, so last week’s state stands.
    • Crash fixes worth taking. A use-after-free in constraint tick prerequisites (6f08631b) and a “GC-related regression from CL 56542014 that could cause crashes in other engine systems like MRQ” (51775abc), both also on ue6-main.

    Closing

    A compiler was chosen and withdrawn inside a day because HeadlessChaos asserted. Epic’s test coverage caught it, and your build logs are where you confirm you are on the right side of it.

    Commit SHAs are cited inline, in parentheses, next to each claim. They reference the ue6-main branch of EpicGames/UnrealEngine unless the claim is in the “For teams shipping on 5.8” section, which references ue5-main. Many of the highest-interest entries resolve to Commit.gitdeps.xml binary-manifest blobs: the commit message is real, but the code lives in Epic’s internal binaries, which we cannot see.

    Share this article