acdream/docs/research/2026-08-22-atmospheric-stage2-connected-gate.md
Erik 6e76314b08 docs(vm4): every Campaign AR document says what its evidence shows
Dated 'VM4 correction' notes, not silent rewrites:
- AR plan: NoOpRenderPackProductionIntegrationTests is a 2x2 recording-
  device fixture, not a production pin; the real invariance is VM0's.
  Both '14,928/14,928 zero skips' totals qualified: hermetic lane filter.
- Stage-2 connected report: the dense-town CPU figures ran under the
  automation observer (9.8 MB/frame alloc) and say nothing about the
  owner's hitch on the product; clean numbers are VM0's.
- Track A report + findings doc: TerrainUtils.GetNormal only orients
  scenery; the render normals were already smooth; A2 replaced central
  differences with retail's incident-face average (the reviewer's own
  premise error).
- Findings doc: 'retail brightens' is the fallback path only; real
  hardware runs the single-pass lerp (VM2). LandscapeDetailTextures = 0
  answers the landscape open question. VM0 production table added as the
  baseline.
- Completion audit retail-path row and the review's F1/F2/F3/F5 headers
  annotated with their closures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 22:51:59 +02:00

11 KiB
Raw Blame History

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. It applies the measured constraints and budgets already established in the terrain and atmospheric findings; 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. 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:

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.910.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: 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.70.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. 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.

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

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.