Epic 2.4: a slow axis, and an honest account of what it fixes

Eleven scenes changed as much in half a second as in two minutes. The cause
was that everything moving in them was cyclic: ArcDriver's drift is a 20-70
second LFO, and an LFO returns, so ten cycles of it over five minutes is not
five minutes of anything. The eye adapts in about two seconds and then there
is nothing left to find — violently animated, and reads as static.

ArcDriver._slowAxisFor adds the missing timescale: a param that travels ONE
WAY across the whole track, keyed on the module so a scene returning in the
last section arrives further along rather than resetting. Rate params are
excluded for the reason schema.js already gives.

Two things were learned by getting them wrong first, and both are recorded
where the next person will hit them.

The first version chose the param at random from everything eligible and
measured as doing NOTHING — identical structural change with the axis applied
and with it disabled. Which param you move decides everything: sweeping Moiré
Grid's `width` moves its time-averaged structure by 0.110 and its `offset` by
0.002, and a random draw finds the second kind almost every time. So the axis
is now DECLARED, `slowAxis: true`, validated by the schema (and rejected on
rate params, where walking one would jump the animation phase).

The second is that single-frame distance cannot measure this at all. A
churning scene's consecutive frames are already ~0.6 apart, so every pair of
its frames scores the same whether the structure moved or not — the metric is
saturated by the churn it exists to see through, and the first gate passed
while the mechanism was provably inert. The gate now compares TEN-SECOND
time-averaged frames. The window was measured rather than guessed: at one
second Moiré Grid's frozen control still reads 0.024, at ten it reads 0.0095
while the signal holds at 0.037.

Per EPIC-2.md §4, the metric is verified by breaking what it should catch:
a second check runs the identical measurement with the axis disabled and
requires it to read ~1.0. It reads exactly 1.00x on all three scenes.

The honest scope, measured across ten candidates and written into EPIC-2.md
§3.4: the axis works on Moiré Grid (3.93x), Gate Corridor (2.88x) and Truchet
Fold (1.40x). Curl Flow, Signal Decay and Circuit Bloom have NO parameter that
changes their structure and still need shader work — parameter automation
cannot substitute for structure a scene does not have. Four more already
develop on their own and were never the problem. The flag is set only where it
is proven, so it means something.

69/70 on phases 3,4,7-11 slow; the one failure is the known load-dependent
Horizon Lines flake recorded in d14d473.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dejvino
2026-08-06 07:54:35 +02:00
co-authored by Claude Opus 5
parent acc33cedd7
commit 189328587d
14 changed files with 381 additions and 11 deletions
+32
View File
@@ -126,6 +126,38 @@ but it is the only thing that fixes the specific failure of "animated and yet st
The five nearly-static scenes get the opposite treatment, and Phase 7's movement gate already
describes what "enough" means.
**Status after the first pass: mechanism delivered, most of the scene work still open.**
The mechanism exists and is proven. `ArcDriver._slowAxisFor` walks a declared param across the
whole track, monotonically — the existing drift is a 20-70 second LFO, and an LFO returns,
which is precisely why ten cycles of it over five minutes reads as static.
Two things were learned the hard way and are worth not relearning:
*Which param you move decides everything.* The first version chose at random from everything
eligible and measured as doing **nothing whatsoever** — identical structural change with the
axis applied and with it disabled. Sweeping Moiré Grid's `width` moves its time-averaged
structure by 0.110 and its `offset` by 0.002; a random draw finds the second kind almost every
time. Hence `slowAxis: true` as a declaration rather than a heuristic.
*Single-frame distance cannot measure this.* A churning scene's consecutive frames are already
~0.6 apart, so every pair of its frames scores the same whether the structure moved or not.
The gate measures **ten-second time-averaged** frames, which cancels the churn and leaves the
structure. The window was measured: at one second, Moiré Grid's frozen-parameter control still
reads 0.024; at ten it reads 0.0095 while the axis-driven signal stays at 0.037.
Measured across ten candidate scenes (ratio of axis-driven structural change to what the scene
does on its own):
| works | Moiré Grid 3.93× · Gate Corridor 2.88× · Truchet Fold 1.40× |
|---|---|
| **no parameter helps** | Curl Flow 1.31× · Signal Decay 1.21× · Circuit Bloom 1.10× |
| **already develops; never the problem** | Firefly Drift · Vortex Drift · Kaleido Tunnel · Plasma Bloom |
The middle row is the remaining work, and it is **not** mechanical: those scenes have no
parameter that changes their structure, so they need shader changes that introduce one.
Parameter automation cannot substitute for structure a scene does not have.
### 3.5 A framing layer
The one that raises the ceiling rather than the floor. A shared zoom / crop / scale envelope