THE ROUTE'S TIME PIN NEVER HELD, AND EVERY V7 NUMBER SO FAR WAS TAKEN THROUGH IT.
connected-backend-differential.route.txt opened by pressing
AcdreamCycleTimeOfDay three times, on the stated theory that the cycle walks
live -> 0.00 -> 0.25 -> 0.50 and lands on noon. The mechanism underneath is
WorldTimeService.SetDebugTime, and SyncFromServer clears it -- deliberately,
because that setter is the /time slash command and the command is meant to be a
look-at-dusk-for-a-moment affordance rather than a mode. There is even a test
pinning that behaviour: WorldTimeDebugTests.SyncFromServer_ClearsDebugOverride.
ACE sends TimeSync every few seconds. The clock was therefore un-pinned again
long before the route reached its first stop, on every run this campaign has
taken, including V6m's smoke pair.
The Dereth clock does not only move the sky. It moves the SUN, so it moves the
directional term of every lit surface in the scene.
MEASURED, rather than argued. A probe route captured each stop TWICE, 45 seconds
apart, in the same run on the same backend:
GL, Holtburg, capture 1 vs capture 2: 205,772 px 22.33%
Vulkan, Holtburg, capture 1 vs capture 2: 218,732 px 23.73%
GL, Facility Hub, capture 1 vs capture 2: 108,795 px 11.81%
Vulkan, Facility Hub, capture 1 vs capture 2: 130,206 px 14.13%
One backend, one stop, nothing moving, and a fifth of the frame changes while
you watch. No cross-backend number means anything against that noise floor, and
the cross-backend numbers taken during that probe run were duly absurd -- 56% at
Holtburg, where the two launches happened to be at different times of Dereth day.
THE FIX IS A PIN THAT OUTRANKS THE SERVER CLOCK AND SURVIVES SYNC.
WorldTimeService.PinnedDayFraction is a nullable day fraction that wins over both
Calendar.DayFraction(NowTicks) and SetDebugTime, and that SyncFromServer does not
touch. ACDREAM_WORLD_TIME -> RuntimeOptions.PinnedWorldDayFraction ->
WorldEnvironmentController, which writes it once: the Runtime environment owner
and its clock are session-scoped, so one write outlives every teleport and every
reveal generation. Values outside [0, 1) are REJECTED rather than clamped -- a
day fraction of 12.5 is a typo, and silently pinning the world at it would be
worse than ignoring it.
Unset is the default and every ordinary run. The calendar DATE still advances,
which is intentional: the date drives day-group selection, and ACDREAM_DAY_GROUP
already pins that. The differential gate forces the pin at 0.5 -- noon, which is
what the three presses were aiming at -- on both launches, and the route's
presses are deleted rather than left in as decoration.
This is instrument determinism on the footing of ACDREAM_DAY_GROUP and V7's
ACDREAM_SKY_PHASE_SECONDS, not a workaround: it is off by default, nothing in the
shipping client reads it, and the alternative was to keep measuring two backends
through a fifth of a frame of sunlight.
WHAT IT MOVED. The same three-stop route, same commit otherwise, before and after:
holtburg_town 9.05% -> 2.86% (83,438 -> 26,330 px)
facility_hub_interior 12.16% -> 0.78% (112,075 -> 7,176 px)
aerlinthe_island 23.09% -> 6.82% (212,824 -> 62,892 px)
The interior stop is the headline. V6m recorded it as a route defect on the
theory that the indoor spring-arm camera settles to different distances in two
runs; that theory is now refuted. The camera was fine. The interior was lit
differently because the sun had moved, and with the sun held still the stop drops
by a factor of 15 to 0.78% -- close enough to the 0.001 threshold that its
remaining population is worth naming rather than guessing at. No route change was
needed and none was made.
WHAT REMAINS, per the difference maps, all of it now attributable by eye:
the animated portal beside the Holtburg stop; distant scenery foliage; wandering
NPCs and a chimney smoke plume, which are animation and emitter phase; the vitals
readouts, whose stamina and mana genuinely regenerate at different rates across
two logins minutes apart; and, at Aerlinthe, a dense low-magnitude speckle in a
scene whose mean luminance is 28/255 -- half of its differing pixels are exactly
delta 3, one step over a tolerance that is absolute rather than relative.
Gates. Release build green. App tests 4,134 passed / 3 skipped (one new: the
day-fraction range check); AcDream.Core.Tests WorldTimeDebugTests 6/6, including
the two new ones that assert the pin survives a sync and outranks the transient
override. GL offline pixel gate against the pre-slice tree: 2.66e-05, 15 pixels
of 563,200, inside the documented 9-31 band -- GL did not move.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
77 lines
4.1 KiB
Text
77 lines
4.1 KiB
Text
# Campaign V slice V7: the connected route the GL-versus-Vulkan differential
|
|
# runs TWICE, once per backend, pairing the PNGs by name.
|
|
#
|
|
# Two separate launches have to agree pixel-for-pixel, which is a much stricter
|
|
# requirement than either connected route was written for. Everything below is
|
|
# in service of that:
|
|
#
|
|
# * Every teleloc carries the identity quaternion, so the heading at each stop
|
|
# is the same on both runs rather than whatever the previous heading was.
|
|
# * The world clock is pinned by ACDREAM_WORLD_TIME, which the gate script
|
|
# forces on both launches. It used to be pinned here instead, by pressing
|
|
# AcdreamCycleTimeOfDay three times (live -> 0.00 -> 0.25 -> 0.50), and
|
|
# THAT DID NOT WORK: SetDebugTime is transient by design -- it is the /time
|
|
# slash command's mechanism, and WorldTimeService.SyncFromServer clears it
|
|
# -- so ACE's next TimeSync un-pinned the clock seconds later, long before
|
|
# the first stop. V7 measured the consequence directly: two captures 45 s
|
|
# apart at ONE stop on ONE backend differ in 22.3% of the frame outdoors and
|
|
# 11.8% indoors, because the sun keeps moving. The presses are gone.
|
|
# * Nothing moves the character. The only thing between arrival and capture is
|
|
# a settle window, because a timed turn cannot be relied on to stop at the
|
|
# same angle twice.
|
|
# * There is no `checkpoint` verb here. The differential's verdict is the
|
|
# paired PNG, and the ownership ledger has its own gate
|
|
# (run-connected-world-lifecycle-gate.ps1) that this route does not duplicate.
|
|
#
|
|
# MSAA is forced OFF by the gate script rather than here, on BOTH launches.
|
|
# Sample positions are not specified across implementations and cost 8.8% of the
|
|
# frame at 4x -- measured, plan section 5.5.16 -- so a differential run with MSAA
|
|
# on measures the two drivers' sample patterns and nothing else.
|
|
#
|
|
# Residual divergence this route cannot remove, and which is a finding rather
|
|
# than a failure: PHASE. Two launches cannot agree on an emitter's age, a
|
|
# creature's animation cursor, a portal's scrolling texture, or the cloud
|
|
# sheet's position -- the cloud sheet in particular advances with WALL time and
|
|
# not with the Dereth clock the override above pins, which is why the offline
|
|
# pixel gate masks its own top 280 rows. The V6m smoke run measured the shape
|
|
# of it at stop 1 with MSAA off: 18.52% of the frame differed, 89% of that in
|
|
# the top 240 rows (cloud sheet, treeline, the portal), and rows 300-720 --
|
|
# terrain, blending, roads, buildings, character, entire retained UI --
|
|
# contributed about 9,500 pixels between them, almost all of it thin outlines
|
|
# on silhouette edges. That is why every stop below is chosen for its static
|
|
# content and why the settle windows are long.
|
|
|
|
wait world-ready 90000
|
|
wait world-visible 30000
|
|
sleep 8000
|
|
|
|
# 1. Holtburg: the dense outdoor town. Terrain, terrain blending, the road
|
|
# overlay, static world meshes, scenery and the whole retained UI in one
|
|
# frame. This is the SMOKE stop -- the one pair -Smoke compares on its own.
|
|
command /teleloc 0xA9B40019 84.0 7.1 94.005 1 0 0 0
|
|
wait materialized 1 90000
|
|
wait world-visible 30000
|
|
sleep 25000
|
|
screenshot holtburg_town 15000
|
|
|
|
# 2. Facility Hub: an interior EnvCell, and the durable fix for the campaign's
|
|
# oldest coverage gap. Plan section 5.1 records that the offline gate sees no
|
|
# EnvCell at all and that EnvCellRenderer's Vulkan arm is proven by one
|
|
# eyes-on frame; this stop is the first automated instrument that looks at
|
|
# one. Cell 0x164 is >= 0x100, which is what makes it indoor: walls, floor,
|
|
# per-cell lighting and the doorway clip region rather than terrain.
|
|
command /teleloc 0x8A020164 70.35 -40.66 -5.9 1 0 0 0
|
|
wait materialized 2 90000
|
|
wait world-visible 30000
|
|
sleep 25000
|
|
screenshot facility_hub_interior 15000
|
|
|
|
# 3. Aerlinthe: dense island geometry, the water edge and a long view. The
|
|
# stop that exercises fog and the far end of the depth range, where a
|
|
# precision divergence between the two backends would show first.
|
|
command /teleloc 0x09040008 11.4 188.6 87.705 1 0 0 0
|
|
wait materialized 3 90000
|
|
wait world-visible 30000
|
|
sleep 25000
|
|
screenshot aerlinthe_island 15000
|
|
sleep 3000
|