Fighting Game · Guides & deep dives

V2 Automation Run — 2026-06-12 (Linux Editor, on-box)

invocation against the engine at /root/workspace/UnrealEngine-5.5.

7sections3 minread

On this page

Test-execution evidence for the V2 source tree as of this date, run on the on-box Unreal Engine 5.5.4 Linux source build (UnrealEditor-Cmd, NullRHI, unattended, run as the ueagent user). The raw exported report index is committed next to this file as 2026-06-12-linux-editor-report.json.

Build#

  • Target: V2Editor Linux Development, built via direct UnrealBuildTool invocation against the engine at /root/workspace/UnrealEngine-5.5.
  • Pre-build step (pnpm --filter @oshun/codegen run v2:grpc-stubs) regenerated and verified 44 gRPC service descriptors / 666 RPC descriptors.
  • Full rebuild plus incremental passes completed with zero compile or link errors across all 26 project modules and plugins.

Full suite#

Command: UnrealEditor-Cmd V2.uproject -ExecCmds="Automation RunTests V2.; Quit" -ReportExportPath=... -unattended -nop4 -nosplash -NullRHI

Result: 168 / 168 tests Success (one success-with-warnings), zero failures, zero not-run. This includes V2.Combat.MoveData.AssetContract (the §6.7 projectile / reflectable / multi-hit per-move verification), V2.UI.RegionVariantBoot.AssetContract (§54.2 region variant data assets + boot assert), and the two §56.1 golden-replay corpus tests below.

Golden-replay corpus (§56.1)#

  • V2.Netcode.GoldenReplayCorpus.Generator (run with -V2GenerateGoldenCorpus) wrote 200 manifests to Content/V2/Tests/GoldenReplays/Corpus/, each self-verified by an immediate in-process re-simulation before writing.
  • V2.Netcode.GoldenReplayCorpus.Regression was then run in a separate editor process and replayed all 200 manifests through FV2SimWorld with frame-by-frame hash comparison: 200 / 200, zero divergence.

Determinism bug found and fixed by this run#

The first cross-process regression run failed loudly (Golden.SimCorpus.000.json: DIVERGENCE at frame 10): the deterministic sim state hash mixed in GetTypeHash(FName), which hashes the process-local name-table index and therefore differs between processes. This silently broke any cross-process hash comparison — exactly what §49 server re-simulation verification depends on. Fixed by introducing V2StableNameHash (content-based FCrc::StrCrc32 of the name string) and converting all 103 FName/tag hash sites in V2NetcodeTypes.cpp / V2RollbackSimWorld.cpp (fighter state hash, snapshot hash and serialized state, collision-event hashes, ability-state hash accumulation). After the fix the corpus was regenerated and the fresh-process regression passed 200 / 200.

Region variant data assets (§54.2)#

UnrealEditor-Cmd V2.uproject -run=V2CreateRegionVariants authored the eight URV2_RegionVariant data assets at Content/V2/Regions/ from V2/legal/rating-boards.json; every rule passed URV2_RegionVariant::IsValidRegionVariant before save, and V2.UI.RegionVariantBoot.AssetContract validates each asset's canonical variant id, SKU tag, content-rule flags, and boot-assert pass.

Companion sweeps (same date)#

  • V2/ue/Tools/check-*.py: 547 / 547 pass (after the cook-staged rating samples landed; see stage-region-rating-config.py).
  • V2 service libraries (apps/v2/*): 50 / 50 vitest suites pass.
  • V2 web surface (apps/v2/web): 3 / 3 vitest tests pass.

Engine-side fix applied during the sample cook#

The first Linux cook died fatally in global shader compilation: NiagaraStatelessSimulationTemplate.ush includes Modules/NiagaraStatelessModule_ScaleMeshSizebySpeed.ush (lower-case "by") while the file on disk is ...ScaleMeshSizeBySpeed.ush — harmless on case-insensitive Windows, fatal on Linux. Fixed in the on-box engine checkout (/root/workspace/UnrealEngine-5.5, one-character include correction) and the cook was re-run. This is an engine-tree fix and is not part of this repository's diff.

Scope honesty#

These runs exercise the C++ contract/spec layer, the deterministic sim core, and editor commandlets on Linux. They are not cooked-platform runs, not hardware-latency measurements, and not live-service verification; tasks gated on those remain unchecked in V2/V2_TODOS.md.