# Campaign AR Stage 2 connected and closeout gate **Date:** 2026-08-22 **Verdict:** PASS for every machine-local Stage 2 row that the available credentials and hardware can exercise; a distinct-account remote-player row, external hardware, and final project-owner acceptance remain explicit gates ## Scope and evidence boundary This report records the executable ACE-connected, dense-scene A/B, long-life, external-package, shader, build, and complete-test work that followed the [Stage 1 live approval](2026-08-22-atmospheric-stage1-live-gate.md). It applies the measured constraints and budgets already established in the [terrain and atmospheric findings](2026-08-21-terrain-and-atmospheric-rendering-findings.md); it does not re-derive them or revisit that report's refuted claims. The measured binaries were clean-source Release products. The retail renderer remained the default and authoritative path. No physics or collision behavior was changed. ## Connected scenario matrix The three-process connected lifecycle gate passed on exact commit `0b6c6557`. Its report is [`logs/connected-world-gate-20260822-132443/report.json`](../../logs/connected-world-gate-20260822-132443/report.json). The capped six-stop process ran for 249.114 seconds, the fresh uncapped reconnect for 67.917 seconds, and the pack-transition process for 51.277 seconds. All three exited gracefully with no hard failures. Full graphical-process teardown and the subsequent fresh Vulkan context/device construction passed. The route proved: - capped and uncapped operation, portal travel, reconnect, fresh process, and destination publication/retirement; - outdoor, Facility Hub interior/dungeon, and outdoor-after-dungeon states; - atomic High select, retail disable, High re-enable, 1024 x 768 resize, clear, overcast, and rain transitions; - resource-free retail restoration and active enhanced metadata at every named screenshot; and - terminal render-scene shadow parity with zero mismatches and zero pending deltas. The connected metadata makes the caster boundary concrete. The transition row published 6,624 casters: 374 terrain commands, 6,571 outdoor statics, 26 buildings, 10 animated statics, one local player, 14 non-player creatures, one other live dynamic, and one equipped child. The capped login row reached 9,533 casters, including 922 animated statics; Holtburg after the dungeon reached 9,539. Facility Hub correctly published `Outdoor=false`, zero directional strength, and zero casters. Outdoor DAT publication still cannot distinguish a tree from other outdoor scenery, and create-object metadata still cannot distinguish a hostile monster from another non-player creature, so the report keeps the authoritative `OutdoorStatics` and `NonPlayerCreatures` labels. One diagnostic distinction is retained rather than hidden: streaming frames recorded transient render-frame candidate-order differences before the final candidate sets and digests converged. The authoritative render-scene shadow comparison finished 77/77 with zero mismatch in the transition process; no pack or retail-output divergence remained at the terminal checkpoints. ## Dense turning A/B and frame pacing Matched dense-Arwic runs used the same route, commit `1f75ce05`, resolution, camera turn, server, character, entity population (15,522), and warmed scene: - Atmospheric Medium: [`logs/connected-dense-town-20260822-133441.report.json`](../../logs/connected-dense-town-20260822-133441.report.json) - retail/off: [`logs/connected-dense-town-20260822-133727.report.json`](../../logs/connected-dense-town-20260822-133727.report.json) | Phase | Retail CPU p50 / p95 / p99 | Medium CPU p50 / p95 / p99 | Retail GPU p50 / p95 | Medium GPU p50 / p95 | |---|---:|---:|---:|---:| | Six-second turn | 27.8 / 32.9 / 36.7 ms | 28.6 / 32.2 / 40.2 ms | 0.6 / 1.2 ms | 1.5 / 1.9 ms | | Stationary | 28.6 / 30.2 / 31.1 ms | 29.1 / 30.9 / 32.6 ms | 0.9 / 0.9 ms | 1.7 / 1.8 ms | **VM4 correction (2026-08-22):** both runs below executed under the connected automation observer (`ACDREAM_AUTOMATION_ARTIFACT_DIR` render-scene oracle), which the Slice H closeout documents as allocating 3.9–10.5 MiB/frame (`alloc_kb p50 = 9,830` here, 31 Gen0 collections in 216 frames). The absolute CPU figures are therefore observer cost, not product cost, and this A/B says nothing about the owner's turning hitch on the product. Clean production numbers (no observer, uncapped Release) are in the [VM0 report](2026-08-22-vm0-default-path-invariance.md): dense Arwic CPU p50 6.0 ms pre-campaign vs 5.2 ms pack-off. The paragraph below is kept as the historical record of the Medium-minus-retail increment, which the observer does not distort. With that caveat: Medium did not worsen turn CPU p95 under the observer (32.2 versus 32.9 ms). It adds the expected GPU work, about 0.7–0.9 ms at p95/p50 in this run. The Atmospheric screenshot's pack-owned window reports incremental CPU p50/p95/p99 of 0.209/0.248/0.302 ms, inclusive GPU p50/p95/p99 of 1.374/1.818/1.869 ms, 14,890 casters, three cascades, 61,655,840 resident bytes, and 44,236,800 transient bytes. Medium therefore stays inside its declared CPU, GPU, and 128 MiB resident budgets. Process working/private memory was also recorded, as required: the stationary Medium process was 1,669.9/2,084.4 MiB versus retail's 1,354.8/1,676.8 MiB. Those process totals include driver and shared host allocations and are not substituted for the exact pack-owned GPU ledger. Retirement and terminal convergence are covered by the long route and deterministic lifecycle gates. ## Long lifetime and package lifecycle The nine-stop Medium route passed on exact commit `1f75ce05`: [`logs/connected-r6-soak-20260822-134004.report.json`](../../logs/connected-r6-soak-20260822-134004.report.json). It ran for 516.064 seconds through Caul, Sawato, Rynthid, Aerlinthe, Sawato revisit, Holtburg, Caul return, Sawato plateau, and Caul plateau. Every materialization, movement/jump/combat exercise, return/convergence check, and graceful close passed. The warnings are expected world/DAT population noise; there are no renderer, pack-budget, or lifecycle failures. The connected graphical external-package gate passed all six fresh processes on exact commit `f92479ac`. Its machine-readable report is [`artifacts/atmospheric-rendering/connected-package-lifecycle-20260822-135333/report.json`](../../artifacts/atmospheric-rendering/connected-package-lifecycle-20260822-135333/report.json). | Scenario | Plugin outcome | Renderer outcome | Persisted selection | |---|---|---|---| | Install/select v1 Low | loaded | external v1 active | external v1 | | Replace by v2 with stale v1 selection | loaded | safe retail fallback with exact version diagnostic | retail | | Explicitly select v2 High | loaded | external v2 active | external v2 | | Remove package | failed-not-found | safe retail fallback | retail | | Inject failure after registration | failed and transaction rolled back | safe retail fallback | retail | | Correct package and reselect | loaded | external v2 active | external v2 | Every process connected, entered world, captured its render-pack metadata, disconnected, and exited with code zero. Failure rows created no half-active pack and recovery required an explicit corrected selection. ## Remote-player gate availability The connected remote-player gate was exercised on exact commit `a861510a`: [`artifacts/atmospheric-rendering/connected-remote-player-20260822-140355/report.json`](../../artifacts/atmospheric-rendering/connected-remote-player-20260822-140355/report.json). The observer entered the world and moved at the target location. The concurrent primary client then timed out waiting for `CharacterList`: ACE did not permit a second simultaneous character from the same account. Both clients were closed cleanly, and the failed row is not represented as renderer evidence. The gate now reads separate observer credentials from `ACDREAM_TEST_OBSERVER_USER`/`ACDREAM_TEST_OBSERVER_PASS`, rejects same-account configuration before launch, keeps credentials out of its report, and fails fast on session failure. Character indexes are independently selectable because index zero on two accounts still names distinct characters; the entered-world identity assertion is authoritative. The nonzero `RemotePlayers` caster row and visible moving remote-player shadow therefore require only access to a second account; no missing renderer or test-harness implementation remains. ## Final automated gate On clean exact code commit `fa3e7978`: - managed shader regeneration compiled **24/24** Vulkan pairs and produced no tracked SPIR-V difference; - forced locked restore passed; - the complete Release solution built with **0 warnings and 0 errors**; and - the repository-owned fresh-process gate passed **15,179/15,179** tests with zero skips or failures across 14 assemblies. App contributed **5,951/5,951**. The complete logs, TRX files, environment inventory, hashes, and aggregate summary are under [`artifacts/atmospheric-rendering/stage2-closeout-release-gate-fa3e7978/`](../../artifacts/atmospheric-rendering/stage2-closeout-release-gate-fa3e7978/). An earlier rerun exposed that the dense-shadow allocation assertion had only a single warmup frame and could include tiered-JIT work under full-suite parallel load. Commit `d78ce100` changes that test fixture only: it performs a complete 64-frame dense warm window before measurement. The focused test passed 12 fresh-process repeats, the complete App assembly passed, and the final gate above is the authority; production renderer behavior was not changed by this hardening. ## Remaining external gates Campaign AR is not declared shipped by this report. Three evidence classes are not available to this machine-local run: 1. A second connected client using a distinct account must produce a nonzero authoritative `RemotePlayers` caster row and a visible moving remote-player shadow. The connected gate is implemented; the available single account was rejected by ACE for concurrent play as recorded above. 2. Supported physical GPU classes other than the installed Radeon RX 9070 XT and integrated AMD adapter must repeat the required pack-off/Low/Medium/ High/Auto resolution and pacing rows. The integrated adapter currently proves safe Auto-to-retail fallback, not active Low or the complete matrix. 3. The project owner must later perform and explicitly accept the final pack-off/pack-on visual matrix, including moving sun and moon shadows, foliage cutouts, temporal shimmer/cascade seams, indoor gating, rays and sun-only volumetrics, and retail restoration. These are evidence gates, not authorization for more renderer features. The current code, SDK, connected lifecycle, package lifecycle, long lifetime, and machine-local automation are complete. The campaign-wide requirement ledger and exact external-row definition are in the [Campaign AR completion audit](2026-08-22-atmospheric-campaign-completion-audit.md).