Back to Blog
    Last Week in Unreal

    Last Week in Unreal: ue6-main Drops the VS2022 Compiler, and Ray Tracing Now Requires Inline Support (October 12 to October 18, 2026)

    Venkat S28 min read
    Terminal-style commit analysis card on a dark navy background, showing 1,149 Unreal Engine 6 commits on the ue6-main branch for the week of October 12 to October 18, 2026, under the headline Last Week in Unreal.

    Unreal Engine Weekly: ue6-main Drops the VS2022 Compiler, and Ray Tracing Now Requires Inline Support

    Week of October 12 to October 18, 2026 | 1,149 commits on ue6-main, 126 on ue5-main, none on the public 5.8 branch | Branch: ue6-main

    Overview

    Build engineers will hit Windows_SDK.json first. UnrealBuildTool’s minimum MSVC moved from 14.44.35211 to 14.50.35723, and VS2022’s 14.44 toolset was removed from the preferred list (4d311b2e). The same commit adds a comment to UBT’s Windows validation, “VS2022 IDE is supported but compiler is not,” and remaps a VisualStudio2022 compiler setting to the latest Visual Studio. Four days later, a second commit stopped project file settings and the editor’s source code accessor from choosing the compiler at all (b406a91a). If a Windows build machine syncs ue6-main with only VS2022 installed, it no longer has a supported compiler.

    On the rendering side, ray tracing now requires inline ray tracing support: “Ray tracing now requires inline support, which should be already the case given that we require DXR 1.1” (bbc01b82). Lumen’s indirect rays also stopped hitting objects that have indirect lighting turned off (e3e28641), which will change how some scenes look. Vulkan’s pool allocators and defragmentation are on by default (ed550390).

    If you ship on 5.8, the public 5.8 branch took no commits this week and there is still no 5.8.4 release tag, so last week’s hotfix candidate is unchanged. ue5-main did pick up fixes worth taking, led by a Mac editor exit crash that its commit calls the “top Mac crash in 5.8.2.” Those are in the last section.

    At 1,149 commits, ue6-main ran slightly below last week’s 1,168. Among named subsystems, build leads at 123, followed by editor at 82, core at 76, rendering at 68, and platform at 40.


    The Windows toolchain floor moved to VS2026 over three weeks

    Pattern: two weeks ago, Windows_SDK.json made MSVC 14.51 the top preferred range and banned it a day later for “an optimizer miscompile causing memory corruption.” Last week, 14.51 was removed from the preferred list. This week, the minimum moved to 14.50.35723, the VS2022 14.44 range left the preferred list and the suggested components, and the 14.44 entry was dropped from the banned list (4d311b2e). A new clang mapping, “14.52 = VS2026 18.12 -> clang 22,” appeared alongside it. 14.51 is still banned.

    Interpretation: Epic is on VS2026 now and is not keeping VS2022 compilers working on ue6-main. The follow-up commits point the same way. Static analysis that needs MSVC now picks the latest Visual Studio instead of VisualStudio2022 (c58341cd). MSVC 14.52 and newer gets /std:c++23 instead of /std:c++23preview (7d8e328e). For build farms the practical question is what is installed on every Windows agent, and whether anything in your target rules or BuildConfiguration.xml still names VS2022.

    Who cares: build and CI engineers, anyone maintaining Windows build agent images.

    Signal strength: Strong.

    Agent tooling moved into the editor’s own APIs

    Pattern: counted by commit path the way we have counted it before (the experimental Toolsets, ToolsetRegistry, and AIAssistant plugins, ToolsetCore, and AsyncFunctionResult, with mesh modeling toolsets excluded), the cluster came to 45 this week. The same path-only count gives 63 for last week’s data. The prior weeks we reported were 20, 30, 56, 46, and 64; that 64 also counted commits by name in the message, so the path-only figure is the like-for-like comparison.

    Interpretation: the lower count does not mean less agent work. More of it now lands in native editor code that the path count cannot see. The Control Rig Sequencer library became a toolset provider, and “129 existing Blueprint functions gain AICallable with AIAccessMode Read (41) or Write (88)” (7b3f981f). A follow-up “Retires the 62-tool controlrig_sequencer.py toolset; agents now call the AICallable … tools directly” (c767b830). PCG operations moved into PCGEditorSubsystem, leaving the old toolsets as “MCP forwarding adapters” (14ad9e7f). The agent surface is converging with the ordinary scripting surface: in Control Rig, PCG, and SceneGraph, agent tools now live on the editor’s own script-exposed functions, and in Control Rig each carries a declared read or write access mode.

    Who cares: tools programmers and pipeline teams with Python or Blueprint editor automation.

    Signal strength: Moderate.

    UBA: more commits, fewer in UBA itself, and Horde demand reporting half-shipped

    Pattern: commits whose paths touch UnrealBuildAccelerator came to 20 this week, against 13 last week. Nine of the 20 touch only UBT’s UBA executor folder, and five of those are C# analyzer cleanups. Restricted to UBA’s own source tree, the count is 11 this week and 12 last week. Three engineers wrote those 11.

    Interpretation: the UBA work itself was steady and practical, covered under Highlights. The larger project this week was teaching Horde how much compute a build actually needs. The Horde server side shipped: a compute demand ledger (de09a5ef) and a CloudWatch strategy that is “Metrics only: returns the current agent count, so Horde never resizes the pool from it” (7dac5f07). All three client-side reporters were backed out the same day with no reland in the window: “[UBT] Report UBA demand to Horde” (4ce830af, backed out by d7ca9fb4), “[UBA] Scheduler: report the weight of remote work remaining” (51fb0713, backed out by af3a4c33), and “[UbaCoordinatorHorde] Report compute demand to Horde” (eb5253f8, backed out by 760ba636). So UBT does not report demand to Horde on ue6-main yet, and even when it does, the new strategy only publishes metrics.

    Who cares: build engineers running Horde with autoscaled agent pools.

    Signal strength: Moderate.


    TL;DR

    • The VS2022 compiler is no longer supported on ue6-main. The minimum MSVC is now 14.50.35723, and a VisualStudio2022 compiler setting is silently remapped to the latest Visual Studio (4d311b2e). Project file format and IDE preference no longer pick the compiler (b406a91a). Check every Windows build agent.
    • Linux links now fail on undeclared dependencies. Unresolved symbols are reported “for every link unless the module sets bIgnoreUnresolvedSymbols” (402ebfda). Code that used symbols from a dependency its Build.cs did not name used to find out at load time. It now finds out at link time.
    • Ray tracing requires inline support. The ray tracing enablement checks now also require RHISupportsInlineRayTracing (bbc01b82). Lumen’s indirect rays now skip objects with indirect lighting disabled, a deliberate behavior change (e3e28641).
    • Defaults moved. Vulkan pool allocators and defrag are on (ed550390). Binned3 on Mac and Linux now matches Windows (21114ad9). SNew disables ticking for widgets that do not override Tick (59b071c3). UbaCli’s CAS store defaults to 20 GB instead of unlimited (62fd2a06). Installed engine builds no longer upload to Horde unless you set PublishToHorde (22bd0876).
    • Cook and shader-compile fixes for flaky CI. An intermittent RigVM ensure that made a finished cook exit 1 (9ac05e23), a multithreaded save race on shared shader map ids (cf2aa7b9), and a hang and assert with async shader compilation off (c1377f30).
    • Python editor scripts will see new errors. Control Rig Sequencer scripting now raises where it used to return false or silently drop keys (74c01af2), and assigning into a temporary struct copy “now raises a RuntimeError” (bc5b3cfb).
    • If you ship on 5.8: no change to the 5.8.4 candidate this week. On ue5-main, take the Mac editor exit crash fix, the shader compile fix for runs with async compilation off, and the paired movie staging changes. Details are in the 5.8 section.

    Highlights

    The VS2022 compiler is gone, and project files no longer choose your compiler

    What changed

    “UnrealBuildTool: Bump minimum MSVC version to 14.50.35723” (4d311b2e). The diff to Windows_SDK.json changes MinimumVisualCppVersion from 14.44.35211 to 14.50.35723 and leaves 14.50 (VS2026 18.0) as the only preferred range. VS2022’s 14.44 components were removed from the suggested install list. In UEBuildWindows.cs, the same commit adds:

    // VS2022 IDE is supported but compiler is not

    followed by code that changes a target’s WindowsPlatform.Compiler or ToolChain from VisualStudio2022 to VisualStudio. There is no warning in the diff when that happens.

    Four days later: “Project file generation logic/preferences should not influence compiler selection. We should use the MicrosoftPlatformSDK logic for compiler choices” (b406a91a). The diff removes the code in GetDefaultToolchain that returned VS2022 or VS2026 based on the -ProjectFileFormat list, the VCProjectFileSettings.ProjectFileFormat setting, or the editor’s preferred source code accessor. An explicitly set compiler is still honored.

    Related toolchain changes this week:

    • C++23 flag. MSVC 14.52 and newer now gets /std:c++23 instead of /std:c++23preview (7d8e328e).
    • Strict volatile. A new WindowsPlatform.bStrictVolatileConformance controls /volatile:iso, default false, forced on with instrumentation (b8ec8fca). The commit message does not mention a second change in the same diff: the block that downgraded /arch:AVX10.2 to AVX10.1 on MSVC older than 14.50 was removed. With the minimum now at 14.50, that downgrade no longer had a supported compiler to apply to.
    • Static analysis. When static analysis needs MSVC and the compiler is unset or clang, UBT now picks the latest Visual Studio instead of VS2022 (c58341cd).
    • Clang minimum check. The MSVC path compared the minimum clang version against SelectedCompilerVersion instead of SelectedClangVersion, which affected the Intel compiler path (5ad89d5f).
    • Linux unresolved symbols. “LinuxToolChain dropped -Wl,–unresolved-symbols=ignore-in-shared-libs for cross-referenced DSOs, so a module could use symbols from modules its Build.cs never named and only find out at load time” (402ebfda). The exemption is gone. Epic set bIgnoreUnresolvedSymbols on Linux for PerforceSourceControl, ChangelistReview, and USDUtilities, which resolve OpenSSL or CPython at load time.
    • Core header diet. Core headers no longer include <iterator>, so “code relying on std::data, std::size and being included transitively” needs its own includes (4a076db4). “DWORD no longer available after Core Windows include cleanup” (b423a6d5).

    Why this is important

    The MSVC change does not fail loudly in the case most likely to bite: a target or BuildConfiguration.xml that asks for VisualStudio2022 gets remapped instead of rejected, and a machine without VS2026 at 14.50.35723 or later then has no valid compiler. The project-file change removes a habit some teams relied on, where generating VS2022 project files kept the build on the VS2022 toolset. The Linux and header changes break licensee code that compiled before, because the engine stopped hiding missing dependencies and missing includes.

    Who should care

    Build and CI engineers, anyone maintaining Windows build agent images, teams with custom engine plugins or Linux server targets.

    Urgency

    Act now on Windows agent toolchains and on Linux link settings before your next ue6-main sync.


    UBT got much faster at no-op and incremental builds

    What changed

    A run of UBT overhead fixes, most with measured numbers in the message:

    • Makefile size. Merged binaries wrote each module’s object file list in full, “~350M references, a 1.43GB makefile for our biggest target.” Arrays are now written once and referenced. “SavingMakefile went from 45s to 3s and makefile size went from 1.4gb to 500mb” (124ed2c3). Moving AutoRTFM arguments into the shared response file took another 14% off makefiles for AutoRTFM targets (885b404b).
    • No-op builds that were not no-ops. A no-op build kept recreating the makefile with “Native verse files changed,” a “Regression from CL 59148489; affects all builds” (3b4c42b2). A second cause, a .vmodule file outside a Verse/ folder, was fixed later in the week (786814b5).
    • Smaller wins. Action hashes are memoized, “ActionGraph.SortActionList 0.97s -> 0.17s” (1ed58e1c). Writing .adm files in parallel went “3s to 0.2s” (b00dc391). UBT skips garbage collection on null builds (2ba70ece) and lost “a ~0.75s startup stall” (bf861d5c).
    • Lost cache entries. When makefile creation throws, FileHashCache could save before its asynchronous writes finished, losing entries. It now waits for them (ea35b5ca). This one breaks an API: GenerateProjectFiles becomes GenerateProjectFilesAsync, and the overload taking bCacheDataForEditor, “deprecated in UE5.6, is removed.”
    • IWYU. Include-what-you-use mode now uses Epic’s WhyInclude tool by default. UE_IWYU_USE_INCLUDE_WHAT_YOU_USE=1 switches back to the old tool (5dcb628d).

    Why this is important

    For large targets, UBT’s own overhead is a measurable share of an incremental build, and these numbers come from Epic’s biggest target. The “Native verse files changed” regression meant a no-op build was not a no-op on ue6-main since CL 59148489. If your CI showed makefile regeneration on every run recently, this is a likely cause. Custom project file generators that override GenerateProjectFiles need a code change.

    Who should care

    Build engineers, anyone measuring incremental build time, teams with custom UBT project file generators.

    Urgency

    Track the speedups. Act now if you maintain a custom project file generator.


    Ray tracing requires inline support, and Lumen’s indirect rays changed

    What changed

    “[RayTracing] Replace LumenMinimal and replace those raygen traces with inline traces” (bbc01b82). The message says “Ray tracing now requires inline support, which should be already the case given that we require DXR 1.1.” The diff makes it code: the ray tracing enablement checks in RenderUtils.cpp now also require RHISupportsInlineRayTracing(ShaderPlatform) or GRHISupportsInlineRayTracing. The commit also removes LumenMinimal shader binding table overhead, “~1/3rd of hit-lighting shader bindings CPU overhead.”

    A ray tracing mask change alters what Lumen’s indirect rays hit (e3e28641). A new RAY_TRACING_MASK_OPAQUE_GI is tied to AffectDynamicIndirectLighting, and to AffectIndirectLightingWhileHidden for hidden objects. In the commit’s words: “Previously, disabling those properties only removes surface cache from objects but their ray tracing representations remain and blocks indirect (including reflection) rays. Now indirect rays properly skip them.”

    Other ray tracing and Lumen work:

    • Vulkan shader execution reordering. VulkanRHI supports VK_EXT_ray_tracing_invocation_reorder, enabled in the Windows and Linux platform info, and Lumen and path tracing shaders moved from NVAPI hit objects to a generic wrapper (163fc0e9).
    • Lumen GPU time. Tiled dispatches took LumenWorldCache “1.04 to 0.99 ms” (0f02f21c), and another change took it to 0.95 ms at the cost of “extra 16mb non-transient memory” (66d9d77a). Both are measured on Epic’s GPU test bed.
    • Instanced skinned meshes. A skinning cache with per-instance LOD for instanced skinned meshes was backed out and resubmitted the same day (8ee80ad1). The diff keeps inline skinning as the default for Auto components (r.Skinning.Cache.Raster.DefaultBehavior = 0). The follow-up that caches single skeletal meshes is opt-in, r.Skinning.Cache.SkeletalMeshes = 0 (79b836fb). The message reports “Vulkan not verified: the editor currently asserts at startup in ray tracing setup, independent of this change.”
    • Substrate anisotropy. Blendable GBuffer anisotropy through a UAV (6882be35). The code default of r.Substrate.BlendableGBuffer.AnisotropyUAV is 0, but BaseWindowsEngine.ini sets it to 1, so it is on for Windows.
    • Removed: volumetric cloud empty space skipping. The experimental feature and its r.VolumetricCloud.EmptySpaceSkipping* CVars are gone. Its material expressions “now silently do nothing” (a29dcc6d). The default was off, so only projects that opted in are affected.

    Why this is important

    The inline requirement mostly formalizes what DXR 1.1 already implies. It matters for anyone testing ray tracing on hardware or RHIs without inline support, where ray tracing is now simply off. Artists will see the mask change. Objects that had indirect lighting disabled were still blocking indirect and reflection rays, and now they do not, so lighting and reflections can change in existing scenes with no content edit.

    Who should care

    Graphics programmers, lighting artists, teams using HWRT Lumen, and anyone who turned on volumetric cloud empty space skipping.

    Urgency

    Act now if your scenes use AffectDynamicIndirectLighting or AffectIndirectLightingWhileHidden and you compare lighting between syncs. Track the rest.


    Defaults that moved this week

    What changed

    • Vulkan pool allocators. “VulkanRHI: Enable RHICore pool allocators by default” (ed550390). The diff changes GVulkanUsePoolAllocator from 0 to 1 and the defrag mode from Off to All. AndroidEngine.ini also sets defrag on with a 16 MB per-frame copy cap. The CVar’s help text still says “(default: 0).”
    • Binned3 on Mac and Linux. “Enable the large-allocation cache and lower the small-pool cutoff from 128 KiB to 14 KiB,” to match Windows (21114ad9). A companion fix corrects inflated LLM totals on those platforms (aec473c1).
    • Slate ticking. SNew, SAssignNew, and SArgumentNew “now call SetCanTick(false) when the created class does not override Tick” (59b071c3). “User Widgets keep ticking.” The commit names one known limitation: a widget that only adds using SWidget::Tick; over a base-class override ends up with ticking disabled.
    • PSO precaching. “r.PSOPrecache.DeferToEndOfFrame is on by default,” but nothing is deferred unless r.PSOPrecache.ProxyCreationStrategy=1 and the end of frame update is parallel, and only for components that opt in, which today means UStaticMeshComponent (6ac614c4).
    • Android video decoding. “ElectraCodecs: switching to the new common Android decoder implementation by default” (372ff3bb).
    • Linux mesh LOD streaming. Enabled for “Cooked non-server targets only, just like on Windows and Mac” (01c0a670).
    • Editor HDR. Editor builds on Windows and Mac now output “10-bit PQ/Rec. 2020 instead of FP16 scRGB” to match game builds (7e0ae5f4).
    • Metal shader recompile. Metal ray tracing shaders now compile with NaN/Inf optimization disabled, because “under MSC fast-math those become poison, which zeroed the path tracer IOR and blew out glass/specular.” The commit also hashes the compatibility flags “into the Metal shader format version so flag changes invalidate DDC/cooked shaders” (ce2af89e). Expect a Metal shader rebuild after syncing.

    Why this is important

    Each of these can change behavior after a sync with no change on your side. The Vulkan allocator change touches every Vulkan allocation path at once, and defrag moves resources while the game runs. The Binned3 change shifts memory profiles on Mac and Linux, so compare memory budgets against a pre-sync baseline before blaming content. The Slate change saves a function call per widget per frame, but custom widgets that set SetCanTick in a C++ constructor or rely on inherited Tick through a using declaration should be checked.

    Who should care

    Vulkan and Android rendering engineers, Mac and Linux performance owners, Slate UI programmers, Metal teams.

    Urgency

    Act now on Vulkan if you ship it. Track the rest at your next sync.


    Cook, staging, and shader compile: fixes for flaky CI

    What changed

    • A cook that finished and still failed. An ensure, “StaticFindFirstObject: Ambiguous object name bool,” was “the only entry in the Warning/Error Summary and the cook exits ExitCode=1 (BUILD FAILED)” even though the cook ran to “Done!” It fired only when two or more Deform Rig control rigs loaded in the same cook worker (9ac05e23).
    • Multithreaded save race. “FMaterialShaderMapId::Serialize: do not modify the id when saving cooked (multithreaded save data race; shader maps are shared between concurrently saved packages)” (cf2aa7b9).
    • Cook determinism. Legacy inline lightmap data now gets a deterministic MapBuildDataId, so older components “no longer produce a different id per LOD on every cook” (b7087cd2).
    • Async shader compilation off. Blocking waits “could end with jobs still outstanding and assert (UE-398095),” and on-demand material shader requests “were never compiled,” leaving the material editor “stuck on ‘Preparing Shaders’” (c1377f30).
    • ODSC and cook-on-the-fly shutdown. The ODSC server is now its own commandlet, -run=ODSCServer, and “-run=cook with -odsc on the command line now forwards to it, so existing scripts keep working unchanged” (e3a0dddd). An ODSC client no longer hangs at exit on a stalled server, with a new ODSC.RequestTimeoutSeconds that defaults to 0, meaning wait indefinitely (206abb01). The cook-on-the-fly server no longer hangs at shutdown on a dead client (5b610715), and a failed handshake is retried instead of logging Fatal (ec9f7f16).
    • Zen. Staging now makes sure the Zen server is running before post-cook staging (f7d1b97c). zenserver moved to v5.8.26, whose notes include “Cache value reads no longer intermittently miss existing entries while garbage collection compacts storage” and new exit codes from zen, “84 for timeouts and 81 for refused connections” (c2b6b602).
    • Staging. *shaderstatdefinitions.ini is always excluded from staging (17492e69). A selector file whose platform allow-list has no available platforms now “matches none instead of all” (98e8aaa0).
    • DDC invalidation. A material translation DDC version bump invalidates those entries (76da0c2a).

    Why this is important

    Most of these show up as intermittent red builds that are hard to reproduce: a cook that exits 1 after succeeding, a race in multithreaded save, a shutdown that hangs until the job times out. If you wrap zen commands in CI scripts, the new exit codes mean a timeout and a refused connection are now distinguishable, and scripts that only checked for zero still work.

    Who should care

    Build and cook engineers, CI owners, teams using ODSC or cook-on-the-fly.

    Urgency

    Act now if you have seen intermittent cook exit code 1 or shutdown hangs. Track otherwise.


    UBA and Horde: a CAS file cap, a smaller default store, and a Horde upload you now opt into

    What changed

    • CAS file count cap. “Too many cas files can run NTFS volumes out of file records,” so UBA storage now evicts on file count as well as bytes (a9b0b95f). The library default is 0, no limit. UbaCli defaults to 1.5 million files.
    • UbaCli default store size. “Changed so UbaCli defaults to 20gb casdb size instead of infinite,” and UbaCli now loads UbaCli.toml from its own folder if present (62fd2a06).
    • Memory-throttled hosts. The scheduler no longer stops remote scheduling based on maxcpu “if host is under memory pressure” (4cb3348a).
    • Endpoint security hooks. A crash in UBA’s detoured NtQueryObject on fake standard handles was “seen on 5.8 with BeyondTrust PGHook.dll injected into ispc.exe” (a7425d41).
    • Agent requests. A failure to create the HTTP client “is now treated as transient and retried every 5 seconds instead of permanently disabling agent requests for the session” (c5fa9ee7).
    • Installed builds and Horde. “Add an option to publish installed engine build to Horde. Off by default” (22bd0876). The diff shows the “Upload to Horde” targets used to be added whenever an installed platform was enabled. They now require the new PublishToHorde option, which defaults to false.
    • Horde fixes. Step notifications were being lost “to a disposed HttpContext” (a3758504). UGS Linux syncs failed on a temp file collision because “Sync error retries default to 0, so one collision aborted the whole sync” (7ba3953a).

    Why this is important

    If you run UbaCli as a cache or storage service without an explicit capacity, it now caps itself at 20 GB and evicts, which can look like a sudden drop in cache hit rate. The PublishToHorde change does the opposite of what the message headline suggests for existing pipelines: installed builds that uploaded to Horde stop doing so until you pass the option. Studios running endpoint security software on build agents should note the BeyondTrust crash, since the commit says it was seen on 5.8.

    Who should care

    Build engineers running UBA or Horde, teams producing installed engine builds.

    Urgency

    Act now on UbaCli capacity and PublishToHorde if either applies. Track the rest.


    Python editor scripting got stricter

    What changed

    • Control Rig Sequencer scripting. “Invalid input, no open Sequencer, Animation Mode inactive, inaccessible or read-only assets, unknown controls, mismatched array lengths and failed operations now raise script errors instead of returning false/null/identity or true after doing nothing.” Setters now raise when keying without the sequence focused, where “keys were silently dropped” (74c01af2).
    • Temporary struct copies. Assigning through an indexed temporary, foo[0].bar = x, “now raises a RuntimeError, rather than silently changing a copy that is immediately discarded” (bc5b3cfb).
    • Use-after-free. Accessing a property whose owning UObject was force-purged now raises instead of reading freed memory (11770551).
    • Tick callbacks. Engine plugins moved from Slate tick callbacks to unreal.register_ticker_callback, because Slate also ticks “during asset loading, progress bars and modal dialogs” and “Non-UI work in the callback can hang, deadlock or crash the editor, including at startup” (4299b7a6).

    Why this is important

    These are correct changes, and each turns a silent failure into an error. Studio scripts that worked by accident (keying with the wrong sequence focused, writing through a temporary struct) will start raising after a sync. The ticker guidance applies to studio scripts as much as engine plugins.

    Who should care

    Technical animators, pipeline TDs, anyone with Python editor automation.

    Urgency

    Track, and run your Python tooling against a fresh ue6-main sync before rolling it out.


    Security and memory safety

    What changed

    • RigVM. A hardening change for FromString shipped: types that can resolve object references from runtime strings are filtered out, so “such a graph no longer compiles and cooked bytecode naming one fails to resolve its function” (8b48d9e9). Its sibling, which validated operand types because “a crafted asset could read or write any register as any type,” was backed out twice (bad164a1, 9ed3ce9a) with no reland, so that validation did not ship this week (4b6626da).
    • DirectLink. “Fixed vulnerability in DirectLink serialization,” with no further detail in the message (33fcf3c5).
    • MIDI. “Harden MIDI file loading against malformed input” (a21438a7).
    • Out-of-bounds reads. mimalloc read “past the end of its THP detection buffer” (f03f8203). A TEDS row array removal read past its end, so “Whatever value sat past the end could then be treated as a match and removed” (e1c42494).
    • Released buffers. Nanite material bins on ODSC clients held a uniform buffer after it was released (e31336de).

    Why this is important

    The RigVM pair matters if you load Control Rig or animation assets you did not author. One half of the fix is in and the other is not, so asset trust boundaries on ue6-main are not fully closed yet. The FromString change can also stop existing graphs from compiling.

    Who should care

    Teams loading user-generated or third-party content, Control Rig users, editor stability owners.

    Urgency

    Track. Check RigVM graphs that use FromString with object or text types.


    Worth Tracking

    TSet is one define away from a different implementation. TSet is now an alias of TSparseSet or TCompactSet, “selected by UE_USE_COMPACT_SET_AS_DEFAULT” (e2426b23). The define is still 0, so nothing changed yet. A separate commit fixes TMap usage “in preparation for TMap becoming an alias” (26615b4c). If that define flips, iteration order and removal behavior change for every set in the engine and in your code. Watch for it.

    Networking congestion control on CUBIC. “Net: Rebuild Congestion controller on CUBIC with a rate-based BDP cap” (0bed951f). The message says “Disabled by default; opt-in.” It is a different algorithm from the one it replaces, so anyone who already enabled congestion control should retest.

    Follow-ups on last week’s post. Last week we reported the platform I/O dispatcher on by default for game and client targets. On Monday it was turned off again “to fix rare case of race condition for cancelled file block reads” (74b6e76a), a cancel fix landed the same day (a37bcf60), and on Wednesday it was re-enabled (6fc98e1e). It is on at the end of this week, but a sync from between those changes has it off. The ITF visualizer default was attempted a second time (1932ad7d) and backed out the same day again (32054904), so component visualizer behavior is unchanged.


    What We Ignored

    This week we ignored most of the 1,149 commits: UAF and animation iteration, test fixtures and Catch2 ports, Python API exposure, static analysis and C# style cleanups, AI Assistant UI, internal tooling like UGS and the test automation dashboard, Verse and UEFN work, scene graph and TEDS changes, Mesh Partition and Mutable churn, and narrow editor crash fixes. There were 26 commits tagged [Backout], against 17 last week, inside the normal band for this branch. Most relanded in-window.

    A few that did not come back, because their titles make them sound shipped. The switch from Breakpad to Mozilla dump_syms was backed out again (e2709e92), so symbol dumping is unchanged. The Horde demand reporting and RigVM operand validation commits are covered above.


    For teams shipping on 5.8

    The public 5.8 branch took no commits this week. There is still no 5.8.4 release tag; the newest is 5.8.3. Last week’s “Update version for 5.8.4” and its 108 cherry-picks remain a hotfix candidate, unchanged. Everything below is on ue5-main, and none of it is on the 5.8 branch yet.

    ue5-main ran 126 commits. Five are Localization Automation. 29 are UAF animation framework work, and 20 are one engineer’s hardware ray tracing refactor series, neither of which is hotfix material. 82 of the 121 non-localization commits have titles identical to ue6-main commits this week, landing in both branches within a narrow changelist range, so they look like simultaneous submits, not backports. There was one backout, relanded in-window.

    Worth cherry-picking onto 5.8

    • Mac editor exit crash. An async task notification kept its widget alive past engine exit, and at static destruction ICU memory was freed through the wrong allocator. The commit says it is “back-ported to 5.8 where the crash ships (top Mac crash in 5.8.2)” (a7d48a45). Last week’s candidate already has a different Mac exit crash fix, so these two complement each other. Take this one first if you have Mac editor users.
    • Shader compile hang and assert with async compilation off. The same fix as on ue6-main: blocking waits “could end with jobs still outstanding and assert (UE-398095),” and the material editor could sit on “Preparing Shaders” (45066056). Build machines and commandlets that disable async shader compilation should take it.
    • Movie staging for Zen and file-server runs. Two changes in order. The first stages movies as non-UFS unless the run is a file-server run without pak files (600657d5). The second sets movies to non-UFS unconditionally, because “Several movie streamers open their source with native OS/media APIs rather than through IPlatformFile, so a movie that only exists as a UFS file served over the network can never be played by them” (880a4296). Take both together.
    • macOS 15 Xcode project copy. “‘cp -R src/ dst/’ fails on MacOS 15 when dst is a symbolic link. Use rsync -a instead” (8ed70370).
    • Xbox and GDK. “GDK save game not working after Suspend/Resume” (ca761ba2). A “(WinGDK)” suffix on remote device IDs “was breaking Turnkey,” which fixes Launch On errors for remote WinGDK devices (fa5796e5). Enabling OnlineServicesXbl without the GDK “no longer bricks the project” (4e8f00b1).
    • Dedicated server crash. “Backport ServerMutePlayer null TSharedRef deref fix (V2-encoded FUniqueNetIdRepl),” covering “all 4 server RPCs, the 2 client RPCs and the gameplay mute paths” (25e3a00f).

    Take if you hit them

    • Landscape. A crash patching streamed heightmap mip edges, tested “in cooked game” (70da205f), and an assert after a layer info asset is replaced on disk (4bfbc13f).
    • Sequencer scheduler. Bugs that “could break task dependencies in the custom task scheduler once a graph exceeded 512 tasks” (b0806d0f). Broken dependencies do not necessarily crash, so it is worth a look for large sequences.
    • Control Rig. Copy and paste duplicated a function’s Guid, crashing on load; the fix can mark loaded dependent assets dirty so the repair is saved (73e6025c).
    • MetaHuman. A “critical bug crash when upgrading MetaHuman Config asset from UE5.2” (b8d50355).
    • Python. A struct sized too small let CPython “read the weakref list past the end of the allocation … causing intermittent crashes” (cb3f58ad).

    Watch, do not cherry-pick

    The Nanite culling rewrite also landed on ue5-main: “This new culling path is now used everywhere and the old persistent culling path has been removed” (3365a542). The diff deletes r.Nanite.PersistentThreadsCulling, so configs that set it do nothing on ue5-main. Treat it as next-release material, not a hotfix.


    Closing

    For most teams the action this week is on build machines: check the Windows compiler, the Linux link settings, and any UbaCli or Horde upload settings before syncing ue6-main. If you ship on 5.8, the candidate has not moved, and pull the Mac exit crash fix from ue5-main.

    Commit SHAs are cited inline, in parentheses, next to each claim. They reference the ue6-main branch of EpicGames/UnrealEngine, except in the “For teams shipping on 5.8” section, where they reference ue5-main.

    Share this article