5.0 KiB
Vanilla-only ordinary splash control
tools/headless_game.py --project vanilla-control uses the existing hidden, muted, prefix-locked ordinary runner with the installed regular ArmaReforgerSteam.exe. It passes no successor addon GUID, addon search path, world/header, diagnostic helper, server/config option or noSplash option. It leaves the installed vanilla project's normal main-menu/splash path active. No game has been launched while adding this control.
After all other runners using the disposable prefix have stopped, the bounded invocation is:
python3 tools/headless_game.py --project vanilla-control \
--compat /tmp/erri-headless-compat \
--profile /tmp/erri-vanilla-game-profile \
--timeout 120 --settle 15 --failure-grace 30
The profile must be new or have both ordinary-runner and vanilla-control ownership markers. A pre-existing successor/user profile is rejected; successor runs also reject a control-owned profile. The only profile addon link remains the installed vanilla data directory. The same read-only game-process refusal, shared Workbench prefix lock, candidate/environment prefix checks, Gamescope headless display, own muted sink and launched-process-group/prefix-only cleanup remain in effect. No main-monitor window, public listener, account login, original mission or Steam/user profile modification is requested. -noBackend remains selected; as for the existing runner, the proprietary executable may perform Steam platform initialization internally.
This control is limited to 60–120 seconds total and a 5–30 second stable interval. Failure grace is at most 30 seconds and never extends the absolute deadline. Its readiness requires native GameLib and Game without WORKBENCH/ENF_WB, a Loaded-addons list containing exactly engine core (5614BBCCBB55ED1C) and ArmaReforger (58D0FB3206B6F859), vanilla MainMenuWorld loading, Entered main menu., and no captured errors. Available-addon inventory does not establish loading. Any loaded third addon, successor diagnostic/smoke output or native error fails the control. Startup/menu initialization is not proof of displayed pixels, working input or completed disclaimer interaction.
Raw console/launch logs and the ordinary runner's report/provenance files remain retained. A clean result is named vanilla-control-started, with control_only: true; scenario readiness, participant verification and successor header verification stay false. The retained source manifest is explicitly a snapshot of unused successor addon sources for provenance bookkeeping, not evidence that the control loaded them. This result cannot satisfy successor mission or release acceptance. A splash error remains a failure even if the engine later enters the menu.
This tests initial vanilla splash only. It does not force an addon/scenario reload and therefore cannot by itself qualify the separate ScenarioLoadingScreen resource. If the intro error reproduces, it establishes that the successor is unnecessary for that failure in this installed environment. If it does not, the next discriminator is a separately scoped minimal empty source addon; this runner does not provide that broader control yet.
Validation without launching: tests/test_headless_game_runner.py retains all 32 existing containment/readiness tests; tests/test_vanilla_game_control.py adds ten tests for exact control arguments, profile separation, native-module/menu/base-addon evidence, unexpected addons/errors/successor output, bounded refusal without process/audio calls and failure latching. The stopped first control is recorded below.
First native control: initial splash failure reproduced
Vanilla control 102533 ran the installed regular executable with exactly the two vanilla addons and the fresh private control profile. The raw console confirms no successor addon/search path/helper and no noSplash switch. IntroSplashScreen emits Unknown class SCR_WidgetExportRuleRoot at 10:25:34.416 before Game compilation; the engine later enters the main menu at 10:25:36.920. The one engine error remains a latched failure. No scripted assertion/completion or successor mission/participant readiness is recorded.
The runner stopped after about 33.3 seconds including its bounded failure grace, confirmed owned cleanup, and sealed unchanged launch/stopped source-manifest bytes plus the exact console hash. Those bindings were independently recomputed. The source manifest concerns unloaded successor files and does not turn this vanilla-only control into a successor run. This demonstrates that the successor is unnecessary for the initial splash failure in this installed environment. No scenario reload was requested, so it does not independently reproduce ScenarioLoadingScreen. See source diagnosis and remedy limits. Normal visible loading and manual input remain unqualified; no vanilla asset, global class or error filter was patched.