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

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`.
