Fix 44 verified defects (3 architectural) and reduce bloat backlog 104 → 1#544
Conversation
…e counts - Add @file/@brief to ReflectedSceneSerializer.h (Doxygen coverage now 100%) - Reword EngineRuntime.h historical comment so the deprecated-globals architectural check no longer trips on a doc string - Refresh auto-generated panel/test counts in CLAUDE.md and .github prompts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
…eep) Fixes confirmed by a find -> adversarial-verify -> fix agent pipeline (48 findings, each independently refuted-or-retraced by two verifiers; 41 confirmed, 3 deferred as architectural, 4 refuted). Highlights: Critical: - Logger: FormatLogMessage snprintf return misuse could overflow the 4 KB stack buffer on long messages - NetworkReplication: recursive m_replicationMutex lock deadlocked the server on every client connect - MMO persistence: prepared statements used %N placeholders that AsyncDatabase never substitutes — queries silently dropped parameters High: - OpenGL RHI: context-reuse init skipped command list/caps/transient allocator; WrapNativeTexture deleted externally-owned GL textures; SetRenderTargets ignored depth-stencil and MRT targets 1..N - Linux main loop never called ModuleManager::FixedUpdateAll despite advancing the fixed-timestep accumulator - FixedTimestepPhysicsSystem never actually stepped physics - TerrainSystem regenerated and discarded clipmap meshes every frame - WeaponManager: switching state machine re-entered equip forever; burst mode fired single shots - TweenSystem: sequences played all members in parallel - VisualScriptCompiler: std::sort comparator UB, duplicate Update() emission, cross-event action leakage, double-emitted branch chains - AsyncDatabase KV store corrupted multi-line values on reload and never unquoted SQL-quoted strings - Delta replication packets used a wire format receivers cannot parse - UILayoutExtensions parsed widget geometry from nested child blocks Medium: SimpleConsole help race, GPU-timer null query crash, profiler min-time floor, ReactiveSystem destroyed-entity notifications, Camera2D follow crash + shake accumulation, DedicatedServer stop race, JobSystem::WaitForAll early return, RenderCommandRing uint32 wrap, ordered-channel wedge on reorder-buffer overflow, save/load string length asymmetry, AngelScript dangling module after failed recompile, SpriteNode dirty tracking, localization re-substitution + fallback race, never-resolving AsyncQuery futures, RagdollSystem unreachable init, EventResponseSystem never pumped, VulkanSwapChain stale handles. Also: document three double-confirmed but architectural defects (per-client reliable sequence state, unregistered core ECS phase systems, delta-ack wiring) in wiki/advanced/Codebase-Observations.md instead of auto-fixing. Verified: linux-gcc-release build clean, all 6193 tests pass, clang-format clean, validate-all 10/11 (bloat check pre-existing). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
…plit 12 oversized files Architectural fixes (both previously double-confirmed open defects): - ECS phase pipeline wired into production: GameplayLifecycleShared now creates the PhaseSystemManager via EngineSetup::CreatePhaseSystemManager during gameplay init and pumps UpdateAll each frame in the documented Physics->Animation->AI->Audio->Lifecycle->Render order. Removed the ad-hoc terrain tick (now runs once in PreRender) and the dead StageBasedExecutor (empty tick, zero registrants). New regression test Tests/harden/Test_lifecycle_ecs_phase_wiring.cpp drives the production init path and fails if phase systems are unwired again. - Reliable networking state is now per-peer: dedup windows, ordered reorder buffers, outgoing sequence counters, and unacked/retransmit maps are keyed by ClientID (server) or an implicit server peer (client). ACKs are unicast per peer covering only that peer's sequences; retransmissions unicast to the owning peer; peer state is torn down on kick/disconnect/timeout. Wire format and public API unchanged; single-peer behavior identical. Three new loopback regression tests in TestReliableChannel.cpp (two clients' overlapping sequence spaces, per-peer ordered independence, ACK isolation), all verified failing on pre-fix code. Bloat reduction (12 files split, zero behavior change, 104 -> 92 over-threshold files): DecorLayoutEditorPanel, RegionMapEditorPanel, InspectorComponentRenderers_Reflected, BasicMaterialEditorPanel, BuildPipeline, GraphicsEngineLinux, ShaderCompilationLinux, AssetTypesLinux, ParticleSystemLinux, PhysicsSpatialQueries, CoreComponentSerializers, SparkEngineCamera — each into coherent sibling .cpp units plus small internal headers; moved code byte-identical; new files picked up by the recursive source glob. Verified: linux-gcc-release clean build, all tests pass (including the new regression tests), clang-format clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
…ility The architecture-contract, debugging-playbook, and job-system-threading skills plus Codebase-Observations still described the ECS phase pipeline as unwired and StageBasedExecutor as a live dead-tick; both changed in the 2026-07-18 architectural fixes. Also marks the per-peer reliability refactor as landed and delta-acks as in progress. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
…ders Delta-snapshot acknowledgements (last of the three architectural defects from the 2026-07-18 sweep): new MessageType::DeltaAck with its own sequence space distinct from transport ACKs (which would falsely advance baselines). Clients echo the delta sequence of applied Unreliable EntityStateUpdate packets; the server routes the trusted senderID to DeltaSnapshotManager::AcknowledgeSequence (cumulative, stale acks ignored). pendingDeltas bounded at 256 per connection with oldest-first pruning so silent clients cannot grow memory unbounded. PacketValidator schema added. Regression tests in TestNetworkReplicationIntegration.cpp (ack releases pending + advances baseline, stale ack ignored, silent client capped, late ack drains). Bloat reduction (17 targets split, zero behavior change, 92 -> 74 over-threshold files): SparkEngineLinux (5 TUs + internal header), SeamlessAreaManager (.cpp+.h), PlayControlPanel, TextureSystemLinux, GraphicsDeviceResourcesLinux, AssetPipelineLinux, EditorPanelFactory, InstanceManager, BenchmarkFramework, LightingSystemLinux, ModSystem, InverseKinematics, SceneImportPanel, and umbrella-pattern header reductions for Hash.h, Mesh.h, VisualScriptCompiler.h, AIBudgetLimiter.h. Moved code byte-identical; new files picked up by the recursive glob. Verified: linux-gcc-release clean build, all tests pass, clang-format clean, docs refreshed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
Bloat wave 3 (74 -> 60 over-threshold files, zero behavior change): TFBotSystem (6 TUs + internal header), TFServerSim (5 TUs + constants header), TFVehicleSystem (5 TUs + header), TFOutfitSystem (5 TUs + header), TFWorldSetup (5 TUs), TFTravelSystem (5 TUs + header), TFCommands, TFSocialSystem, TFGrenadeSystem, TFRegionDecor, TFDataTables, TFSquadSystem, TFAbilitySystem, TFDeployableSystem. Moved code byte-identical; shared file-local helpers hoisted once into per-system internal headers under distinct Detail namespaces; ENABLE_NETWORKING / SPARK_HAS_IMGUI guards replicated per TU; recursive source glob picks up new files without CMake edits. Verified: linux-gcc-release clean build, all tests pass, clang-format clean on all touched files. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
…ager) Bloat wave 4 (60 -> 44 over-threshold files, zero behavior change): TFRegionSystem, TFMapScreen, TFProgressionSystem, TFWeaponServer, TFViewModel, TFHUD, TFAlertSystem, TFMedalSystem, TFClientNetHandlers, TFSpectator, TFLoginFlow, TFWorldCollision, TFSpawnScreen, TFTutorial, TFVehicleNet, and Graphics/HybridRT/HybridRTManager — each into coherent sibling TUs with shared file-local helpers hoisted once into per-system internal headers (distinct Detail namespaces), guards replicated per TU. Verified: linux-gcc-release clean build, all tests pass, clang-format clean, docs refreshed. Remaining 44 violations are predominantly Windows-only files (*Windows.cpp, D3D backends) not compile-verifiable in this environment. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
…r threshold Bloat wave 5 (44 -> 19 over-threshold files, zero behavior change): - .cpp splits: MMOFPS Main, TFWeaponSystem, TFClientNet, TFPingSystem, TFPingUI, Racing Main, TFHUDCombat, TFLanDiscovery, TFOutfitStore, TFDayNight, TFAudioAmbience, TFSquadHUD, TFVehicleClient, TFPlayerSystem, TFWeatherFx — one-two coherent sibling TUs each. - Header reductions (umbrella pattern, includers unchanged): TFVehicleSystem.h, TFNetProtocol.h, TFOutfitSystem.h, TFGrenadeSystem.h, TFProgressionSystem.h, AreaServer.h, TFAbilitySystem.h, TFSquadSystem.h, TFBotSystem.h, TFTravelSystem.h. - Tests/CMakeLists.txt: add TFOutfitStoreDisk.cpp to the explicit SparkTests source list (it links module .cpps by path, so a split there needs the new TU listed; documented in the wiki). - Wiki: delta-acks marked fixed; bloat campaign results recorded — remaining 19 violations are 18 Windows-only files (need an MSVC/MinGW session to split safely) plus the FROZEN-CONTRACT TFTypes.h at 301 lines, deliberately left. Verified: linux-gcc-release clean build, all tests pass, clang-format clean, full docs regenerated, validate-all 10/11 (bloat only). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
Final bloat wave (19 -> 1 over-threshold files): the Windows-only files previously deferred as unverifiable are now split, verified with the repo's MinGW cross-compilation path (linux-mingw-release preset) — every split TU passes x86_64-w64-mingw32-g++ -fsyntax-only with the real build flags and the full cross-build links green. - Graphics: GraphicsDeviceResourcesWindows (5 TUs), GraphicsEngineWindows (6 TUs mirroring the Linux twin's split), PostProcessingPipelineWindows (passes TU + 4 shader-source headers), LightingSystemInternalWindows (4 TUs), LightingSystemWindows, TextureSystemWindows, ShaderCompilationWindows, ParticleSystemWindows, GraphicsStateAndSettingsWindows, GraphicsRenderPipelinesWindows, GraphicsConsoleOpsWindows, UpscalingSystemWindows, MeshWindows, AssetTypesWindows, RenderTargetWindows, ShaderWindows - Core: SparkEngineWindows (5 TUs + internal header; new parts added to SPARK_ENGINE_ENTRY_POINTS since exe-only entry files are not globbed) - Utils: ProcessWin32 - SparkInstaller: link d3dcompiler explicitly — imgui_impl_dx11 calls D3DCompile via MSVC #pragma comment auto-link, which MinGW ignores - Wiki: bloat campaign notes updated (104 -> 1; DirectXMath staging and entry-point/explicit-list gotchas recorded) The sole remaining over-threshold file is the FROZEN-CONTRACT TFTypes.h (301 lines), deliberately left. Verified: linux-mingw-release full cross-build green, linux-gcc-release build green, all tests pass, clang-format clean, docs refreshed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
… scan The new SPARK_ENGINE_ENTRY_POINTS comment mentioned a dependency-gate token, which check-thirdparty-manifest-sync.sh treats as dependency wiring and demands a lock bump for. No dependency changed — reword the comment, mirroring the EngineRuntime.h doc-comment precedent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 03b9edda04
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| deltaAck.channel = ChannelType::Unreliable; | ||
| deltaAck.senderID = localID; | ||
| NetBuffer ackBuf; | ||
| ackBuf.WriteUint32(msg.sequence); |
There was a problem hiding this comment.
Don't send cumulative ACKs for unreliable deltas
When an unreliable EntityStateUpdate with sequence N arrives, this echoes N to DeltaSnapshotManager::AcknowledgeSequence, which erases all pending deltas <= N. On lossy or out-of-order UDP, receiving N does not mean N-1 arrived; for example, if seq1 carried a health change and is dropped while seq2 carries ammo and is ACKed, the server discards seq1 and that health change is never resent. Use per-packet ACKs or move this delta stream to a reliable/ordered channel before treating the ACK as cumulative.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
The failure scenario can't occur with this design: BuildDeltaPacket diffs the entity's current fields against ackedEntityFields — the last-acked baseline — not against the last-sent packet. If seq1 (health) is dropped, the health field still differs from the acked baseline when seq2 is built, so seq2 carries health and ammo. Acking seq2 merges its own sentFields (which include health) into the baseline, so nothing is lost; erasing pending records <= N only discards bookkeeping for packets whose changes are superseded by the acked one. Out-of-order acks are also safe: a late ack for an already-erased sequence hits the pendingDeltas.find(sequence) early-return and can't regress the baseline, and lastAckedSequence only moves forward.
Per-field baselines (not per-packet) are exactly what makes lost unreliable deltas self-healing here — the next delta automatically re-includes anything not yet acked.
Generated by Claude Code
| default: | ||
| unescaped += field[i]; |
There was a problem hiding this comment.
Preserve literal backslashes in KV loads
This unescaper now consumes every backslash escape and drops the backslash for unknown sequences. Fallback KV files written by previous versions stored raw values, so loading existing values such as Windows paths (C:\temp\a.txt turns \t into a tab) or foo\bar (becomes foobar) corrupts data before any write. Preserve the backslash for unknown/legacy sequences, or only decode records known to have been written with the new escaping format.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Good catch — fixed in 51a35a0. FlushToDisk now writes a #!spark-kv-v2 marker as the first line, and LoadFromDisk only runs the unescaper on files carrying the marker; marker-less legacy files load verbatim (first line included) and are upgraded to the marked format on the next flush. The unescaper also preserves the backslash on unknown sequences instead of dropping it. Added a regression test covering the legacy raw-backslash load (C:\temp\a.txt, foo\bar) and the upgrade round-trip.
Generated by Claude Code
There was a problem hiding this comment.
Codex review (PR #544): the KV unescaper corrupted legacy fallback-store files written before escaping existed — raw values like C:\temp\a.txt decoded their backslash-t into a tab on first load and were re-flushed corrupted. FlushToDisk now writes a '#!spark-kv-v2' marker as the first line; LoadFromDisk only unescapes files carrying the marker and loads marker-less legacy files verbatim (first line included). The unescaper also preserves the backslash on unknown escape sequences instead of dropping it. Regression test covers legacy raw-backslash load and the upgrade round-trip to the marked format. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
🔍 CodeQL ReportLanguage:
|
| Rule | Location | Message |
|---|---|---|
cpp/toctou-race-condition |
ThirdParty/SDL2/src/audio/SDL_audiodev.c:53 |
The filename being operated upon was previously checked, but the underlying file may have been changed since then. The filename being operated upon was previously checked, but the underlying file may have been changed since then. |
cpp/toctou-race-condition |
ThirdParty/SDL2/src/haptic/linux/SDL_syshaptic.c:252 |
The filename being operated upon was previously checked, but the underlying file may have been changed since then. |
cpp/toctou-race-condition |
ThirdParty/Utils/miniz/miniz_zip.c:4613 |
The filename being operated upon was previously checked, but the underlying file may have been changed since then. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:608 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:587 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:542 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:522 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:499 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:476 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:453 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:430 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:269 |
Comparison between broadphase_layer of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:230 |
Comparison between broadphase_layer of type Type and mNumLayers of wider type uint. |
cpp/comparison-with-wider-type |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp:68 |
Comparison between l of type Type and mNumLayers of wider type uint. |
cpp/wrong-type-format-argument |
ThirdParty/AI/recastnavigation/Recast/Source/RecastRegion.cpp:1658 |
This format specifier for type 'int' does not match the argument type 'long'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Utils/json/nlohmann_json.h:629 |
Multiplication result may overflow 'int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Utils/json/nlohmann_json.h:630 |
Multiplication result may overflow 'int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/AI/recastnavigation/Recast/Source/RecastMesh.cpp:1137 |
Multiplication result may overflow 'int' before it is converted to 'unsigned long'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/AI/recastnavigation/Recast/Source/RecastMesh.cpp:878 |
Multiplication result may overflow 'int' before it is converted to 'unsigned long'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp:209 |
Multiplication result may overflow 'unsigned int' before it is converted to 'unsigned long'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp:1026 |
Multiplication result may overflow 'unsigned int' before it is converted to 'unsigned long'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp:1162 |
Multiplication result may overflow 'unsigned int' before it is converted to 'unsigned long'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp:1615 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp:531 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp:589 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp:626 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Physics/Hair/HairSettings.cpp:593 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/Math/DynMatrix.h:15 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitterBinning.cpp:51 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
cpp/integer-multiplication-cast-to-long |
ThirdParty/Physics/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitterBinning.cpp:91 |
Multiplication result may overflow 'unsigned int' before it is converted to 'size_type'. |
| ... | ... | 20 more findings omitted |
Updated: 2026-07-19T04:44:38Z — this comment is updated in-place, not duplicated.
Summary
Multi-agent hardening session: every finding was independently confirmed by two adversarial verifiers before being fixed, and every commit was gated on a clean
linux-gcc-releasebuild plus the full test suite. The final waves add MinGW cross-build verification for the Windows-only code paths.Defect fixes (44 total)
41 local defects across 31 files — highlights:
Logger.cpp: snprintf return misuse could overflow a 4 KB stack buffer on long messagesNetworkReplication.cpp: recursive mutex lock deadlocked the server on every client connect%Nplaceholders the database layer never substitutes — parameters silently droppedModuleManager::FixedUpdateAll;FixedTimestepPhysicsSystemnever stepped physicsSwitching; burst mode fired single shots; tween sequences played members in parallelstd::sortcomparator UB); AsyncDatabase KV store corrupted multi-line values; save/load string-length asymmetry; plus races, wedged network channels, never-resolving futures, and unwired update loops3 architectural defects, each with regression tests:
TestReliableChannel.cppPhaseSystemManageris now created and ticked by the gameplay lifecycle (it previously ran only in tests); deadStageBasedExecutordeleted —Test_lifecycle_ecs_phase_wiring.cppMessageType::DeltaAckwith its own sequence space (transport ACKs would falsely advance baselines);pendingDeltasbounded per connection —TestNetworkReplicationIntegration.cppBloat campaign: 104 → 1 over-threshold files
103 files split into coherent sibling TUs and umbrella headers across 6 waves, all moves byte-identical. The 18 Windows-only files were verified via the repo's MinGW cross-compilation path — each split TU passes
x86_64-w64-mingw32-g++ -fsyntax-onlywith the real build flags, and the fulllinux-mingw-releasecross-build links green. The sole remaining violation is the FROZEN-CONTRACTTFTypes.h(301/300 lines), deliberately left.Also:
SparkInstallernow linksd3dcompilerexplicitly (imgui_impl_dx11 relies on MSVC#pragma commentauto-link, which MinGW ignores), Doxygen coverage at 100%, wiki/skills updated to reflect the fixed defects and record the split-campaign gotchas.Verification
linux-gcc-release: clean build, all 6,200+ tests pass (including the new regression tests)linux-mingw-release: full cross-build green (compiles all_WIN32/D3D11 paths)tools/validate-all.sh10/11 (the bloat check counts only the frozen-contract header)docs/update-all-docs.sh🤖 Generated with Claude Code
https://claude.ai/code/session_0137Xnhfn3qKfg1PJyNLcP2h
Generated by Claude Code