stratum · seed identity · by hand · measured

The tide is the moon

The field's warm/cold balance bound to the lunation. Four phases at one instant differ only in the sky; a page with no ephemeris is hash-identical to neutral. Found on the way: the disagreement palette had never fired.

evidence produced by scripts in artifact/strata2/tide-moon/ · plates in the review · live in the canon
The tide is the moon plate

Evidence

Built directly, not by the squad: every squad agent in this session was blocked at the permission layer before it could read a file. Every number below came out of Playwright/Chromium with --use-gl=swiftshader, in a reducedMotion: 'reduce' context, so each state is ONE frame at t = 3.0 — the same instant, differing only in the sky. The harnesses are beside this file: probe-df.mjs (the distribution), probe-tide.mjs (the four phases).

The shared mechanism

The ephemeris publishes window.MN_EPHEMERIS — {date, phase, illum, phaseName, seed, seedHex, hourOfDay, planet, mansion, figure} — and dispatches mn:ephemeris on every date change. The field reads it each frame. Nothing in the object is new information; every field is already printed in the ephemeris ledger. It adds reach, not claims.

Identity: a page with no ephemeris is bit-identical to neutral

none     (no MN_EPHEMERIS)        hash 1027496998
neutral  (illum 0.5, phase 0)     hash 1027496998   → identical

Defaults of u_tide = 0.5 and u_wax = 0 reproduce the unbound field exactly.

The four phases, one instant

Warm energy = Σ max(R−B, 0), cold = Σ max(B−R, 0) over the 1440×660 field.

stateillumphasewarmcoldwarm/cold
neutral0.50.004,863,6124,019,4311.21
new moon0.00.003,747,18516,402,3160.23
full1.00.5017,962,1293,675,8214.89
waxing (first quarter)0.50.256,717,0582,573,2792.61
waning (last quarter)0.50.753,163,5326,358,9070.50

What the measurement found that nobody had looked for

The first run bound the moon and passed identity, new and full — and returned byte-identical hashes for waxing and waning. The asymmetric thresholds had no effect because the disagreement palette had never fired.

probe-df.mjs wrote |df| to a channel and read 15,147 cells at 1440×900:

p50 0.0088   p72 0.0147   p85 0.0201   p95 0.0265   max 0.0500
cells with |df| > 0.055 (the smoothstep start): 0
cells with |df| > 0.10  (the threshold):        0

The canon's 0.10 / 0.055 belong to p5's Perlin; this shader's value-noise never reaches half of the lower one. So "warm leads a rising contour, cold trails a falling one" — documented in §09 and in every evidence file since — was not the behaviour on screen. Every tint came through the agreement path, and at neutral it was warm-biased (old warm/cold 4.48) because the WARM/COLD midpoint reads warm under R−B.

Thresholds are now the measured p85 (full disagreement) and p72 (agreement ends), the percentile method the 1-bit solid uses for occlusion. The constants carry the measurement in a comment. After the change, at neutral:

warm/cold 4.48 → 1.21

Page-level

console errors 0 · pageerrors 0 · contrast failures 2 (the exempt disabled buttons)
review.mjs: two faces, weights 400/500, radius only on pills, sigil never a fill

Not established