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>
75 lines
8.8 KiB
Markdown
75 lines
8.8 KiB
Markdown
# Campaign AR completion audit
|
||
|
||
**Date:** 2026-08-22
|
||
**Branch:** `codex/atmospheric-rendering-campaign`
|
||
**Status:** all implementation and machine-local gates complete; not shipped
|
||
|
||
## Audit boundary
|
||
|
||
This is the requirement-by-requirement closeout audit for
|
||
[Campaign AR](../plans/2026-08-21-atmospheric-rendering.md). It uses the
|
||
measured evidence and constraints in the
|
||
[terrain and atmospheric findings](2026-08-21-terrain-and-atmospheric-rendering-findings.md)
|
||
without re-deriving them or revisiting that report's three refuted claims. The
|
||
detailed connected results remain in the
|
||
[Stage 2 report](2026-08-22-atmospheric-stage2-connected-gate.md).
|
||
|
||
The last remote fetch reported `origin/main` at `6c79d35c`; merge `99cf26e0`
|
||
is in this branch and `git rev-list --left-right --count HEAD...origin/main`
|
||
reported zero missing main commits. Campaign commits remain local and have not
|
||
been pushed.
|
||
|
||
## Requirement ledger
|
||
|
||
| Requirement | Verdict | Authoritative evidence |
|
||
|---|---|---|
|
||
| Stage 1 project-owner stop | Pass | The owner's 2026-08-22 “Looks good!” acceptance, after exposure 1.0 → 0.80, is recorded in the [live-gate report](2026-08-22-atmospheric-stage1-live-gate.md). |
|
||
| Retail-faithful path stays default and authoritative | Pass (evidence strengthened by VM0, 2026-08-22: exact pack-off pixel identity vs `6c79d35c` on static content and a clean production perf A/B — see `2026-08-22-vm0-default-path-invariance.md`; the no-op oracle named here is a 2x2 recording-device fixture) | The checked-in production no-op oracle, six physical pack-off rows, connected disable/restore transitions, and package-failure rows all pass. A branch diff contains only newly named atmospheric/detail shader sources plus the generated shader manifest; no pre-campaign retail shader source is modified. |
|
||
| Physics and collision unchanged | Pass | `git diff origin/main...HEAD -- src/AcDream.Runtime src/AcDream.App/Physics src/AcDream.Core/Physics` is empty. The connected routes use the existing gameplay simulation without changing it. |
|
||
| Tier 1 bloom, filmic tone mapping, colour grade, vignette, neutral settings, resize, and retained-UI/private-view isolation | Pass for implementation and available automation/physical rows | Slice 1 tests and the RX 9070 XT 30-row matrix pass; final project-owner image judgment remains below. |
|
||
| Tier 1 authored-sun rays | Pass for implementation and connected state transitions | Authored sun/day-group/weather, occlusion-mask, behind-camera/off gates, and pre-tonemap composition are automated; connected time/weather transitions pass. Final physical-display dawn/noon/dusk, occlusion, and edge-flicker judgment remains below. |
|
||
| Tier 2 moving authored sun/moon shadows are the headline | Pass for implementation, Stage 1 owner gate, and available connected rows | The selected-source contract, stabilized cascades, opaque/cutout casters, animated transforms, receivers, outdoor/indoor gating, and weather energy pass. Connected metadata proves terrain, outdoor statics, buildings, animated statics, local player, non-player creatures, other dynamics, and equipped children. The distinct-account remote-player row remains below. |
|
||
| Headline caster membership without fabricated identity | Pass | Diagnostics report source-owned `OutdoorStatics` and `NonPlayerCreatures` rather than guessing tree or hostile-monster identity. The transition capture published 6,624 casters and the capped route reached 9,533. |
|
||
| Low/Medium/High/Auto scaling and weak-hardware fail-safe | Pass on available hardware | The exact RX 9070 XT 30-row matrix passes. The integrated AMD Auto run retires atomically to retail with a visible reason and a 0.00365% paired sky-masked difference. Other physical adapters remain below. |
|
||
| Tier 2+ sun-only volumetric shafts | Pass for implementation and available performance/lifecycle rows | Sun-only selection, weather/indoor gates, independent quality, depth reuse, neutral A/B, and the 2,048-sample reference-GPU cost row pass. Final owner occluder/weather judgment remains below. |
|
||
| Connected select/disable/re-enable, resize, weather, interior/dungeon, portal, reconnect, and fresh renderer/device recreation | Pass | [`logs/connected-world-gate-20260822-132443/report.json`](../../logs/connected-world-gate-20260822-132443/report.json): three clean graphical processes, graceful exits, 77/77 terminal render-scene shadow parity, zero mismatch, and zero pending deltas. |
|
||
| Dense turning/frame-pacing and desktop-performance investigation | Pass | Matched Medium/retail dense-Arwic reports show the reported turning hitch on both paths. Medium does not worsen CPU p95 (32.2 vs 32.9 ms) and adds about 0.7–0.9 ms GPU work. Pack-owned CPU/GPU/memory measurements stay within Medium budgets. |
|
||
| Long-run resource convergence | Pass | [`logs/connected-r6-soak-20260822-134004.report.json`](../../logs/connected-r6-soak-20260822-134004.report.json) completes the 516.064-second nine-stop route with movement/jump/combat, revisits, convergence, and graceful shutdown. Deterministic 12-cycle and fresh-device fixtures also pass. |
|
||
| External pack install/select/update/remove/fail/recover | Pass | [`artifacts/atmospheric-rendering/connected-package-lifecycle-20260822-135333/report.json`](../../artifacts/atmospheric-rendering/connected-package-lifecycle-20260822-135333/report.json): all six fresh connected graphical processes pass; failures create no half-active pack and corrected recovery is explicit. |
|
||
| Public pack API and SDK | Pass | BCL-only v1 contracts, manifest schema, semantic bindings, compatibility guide, validator, built-in pack, no-op sample, and two Tier-2 samples are present. External projects reference only `AcDream.Plugin.Abstractions`, not App or Vulkan. |
|
||
| Shaders and generated artifacts | Pass | Managed regeneration compiles 24/24 Vulkan pairs. The final release gate reports no tracked SPIR-V difference after regeneration. |
|
||
| Locked restore, Release build, and complete hermetic tests | Pass | [`artifacts/atmospheric-rendering/stage2-closeout-release-gate-fa3e7978/release-gate-summary.json`](../../artifacts/atmospheric-rendering/stage2-closeout-release-gate-fa3e7978/release-gate-summary.json): clean exact code commit `fa3e7978`, locked restore pass, zero-warning/error Release build, and 15,179/15,179 tests passing with zero skips/failures across 14 assemblies. |
|
||
| Campaign documentation and divergence registration | Pass | Campaign plan, SDK docs, Stage 1/2 reports, roadmap pointer, release-gate graph update, IA-24, and this audit are present. Phase identifier remains **Campaign AR**. |
|
||
| M4 priority is not displaced | Pass | The roadmap and campaign plan retain M4 as the active gameplay milestone and describe Campaign AR as owner-authorized parallel work. No roadmap milestone is reassigned. |
|
||
|
||
## Exact remaining external gates
|
||
|
||
No further renderer, SDK, tool, test, or machine-local documentation work is
|
||
known from this audit. Campaign AR remains deliberately **not shipped** until
|
||
all three evidence classes below pass:
|
||
|
||
1. **Distinct-account remote player.** Run
|
||
`tools/run-connected-render-pack-remote-player-gate.ps1` with the primary
|
||
`ACDREAM_TEST_USER`/`ACDREAM_TEST_PASS` and distinct observer
|
||
`ACDREAM_TEST_OBSERVER_USER`/`ACDREAM_TEST_OBSERVER_PASS` environment
|
||
variables. Require a nonzero authoritative `RemotePlayers` caster count plus
|
||
a visible moving remote-player shadow.
|
||
The same-account attempt is recorded in
|
||
[`artifacts/atmospheric-rendering/connected-remote-player-20260822-140355/report.json`](../../artifacts/atmospheric-rendering/connected-remote-player-20260822-140355/report.json): the observer entered and moved, then ACE rejected the concurrent primary session. The corrected gate does not serialize credentials.
|
||
2. **Unavailable physical adapters.** On every other supported physical Vulkan
|
||
adapter, run the source-identical matrix for pack-off, Low, Medium, High,
|
||
and Auto at 1920×1080, 2560×1440, and 3840×2160, each capped and uncapped.
|
||
That is 30 rows per adapter. The installed RX 9070 XT already passes all 30;
|
||
the installed integrated AMD row proves Auto-to-retail fallback only, so
|
||
active Low and the other 29 rows on that adapter also remain external.
|
||
3. **Final project-owner visual acceptance.** Compare pack off and pack on for
|
||
Tier-1 neutral output and private views/UI; sun rays at dawn/noon/dusk,
|
||
behind-camera and occluded states; foliage cutouts; moving local, remote,
|
||
creature, tree, and building shadows under sun and moon; indoor gating;
|
||
source transitions; temporal shimmer/pixelation and cascade/bias artifacts;
|
||
sun-only volumetric weather/occluder behavior; and exact pack-off
|
||
restoration. The owner must explicitly accept both sides before the plan or
|
||
roadmap says shipped.
|
||
|
||
These are evidence gates, not open implementation slices. Any failure reopens
|
||
only the behavior it contradicts; passing them closes the campaign.
|