Sets — locations × seasons

Five clocks across one set beat 1/Δf, phased lull → building → peak → easing → lull.

Provenance

captured
2026-08-29T02:21:39.473Z
built
2026-08-29T02:21:39.473Z
commit
f3b6bde · f3b6bdedbbbbc2375b144f2ae00f69acafcb44cc
branch
main
working tree
clean
app build
011a5ba2daf9 — sha256/12 over the files build_site.py ships as sim/
note
Causal foam lead, accelerating curl crash, derived incident direction, and marine-layer controls.
links resolve to
../sim/ (published mode)

What this is. A QA instrument. Deterministic captures of the pointbreak wave model at clocks pinned by the model itself, laid out so a defect is visible by scanning rather than by hunting. Every cell is labelled with the exact URL hash it was taken at and links into the simulator at that state, so any frame here can be reopened and argued with.

What this is not. Not a validation. The model is unvalidated against measured surf — a first validation pass, model residuals against an independent record of a specific day, is the largest open gap in the project. These sheets check the model against itself: that it is deterministic, that its phases differ, that something breaks where something should. They cannot tell you whether it matches Pleasure Point. Not a surf report, not a forecast, and not usable for any decision about entering the water.

What a still cannot show. No frame here supports a claim with a verb of motion in it. What each cell states is a position at a known clock, read out of the model; the frames are ordered by the model's own clock rather than by inspection, so a reader may compare those positions across a row. The pictures themselves still cannot tell you which way anything is going, and nothing on these pages is measured off them except the pixel foam fraction, which is labelled as such.

Licence. Code, docs and these renders are MIT (© 2026 Andy Edmonds). The frames are Produced Works under ODbL — the coastline geometry they are drawn over is OpenStreetMap-derived, and the seabed is NOAA NCEI (public domain). Attribution below is required; share-alike is not triggered by a rendering. The full file-by-file split is LICENSES.md in the repository.

Coastline & spots: OpenStreetMap contributors, ODbL 1.0 · Bathymetry: NOAA NCEI Monterey Bay 1/3″ coastal DEM, NAVD88 · Seasonality: CDIP MOP v1.1 SC116 hindcast (Scripps).

This is the published view: 7 of 13 rows. The full local sheet runs all seven site presets at month=january plus two presets across three months. Published here are three sites and two months. The sites are Sewers (ξ 1.15, the most plunging in the bank), Second Peak (ξ 0.65, the most spilling) and Privates (the one synthetic-stage site, which is where the n/a readings on this page come from) — the two ends of the breaker-character range plus the honest edge case. The four omitted sites sit between the two mapped ones. The months are January and August, the two the CDIP record actually separates: H₀ p75 1.245 m against 0.585 m, with zero hours at or above Hs 1.3 m across twenty-five Augusts. October is the shoulder month and is in the local sheet to catch a monotonicity break, which is QA rather than exposition. All five clocks are kept in every row: lull → building → peak → easing → lull is the demonstration.

viewport
1000 × 625 px, deviceScaleFactor 1
pinned
controls=0&q=high&speed=0 — frozen clock, no UI in frame, quality tier pinned
clock spacing
set beat 1/Δf = 125.0 s (Δf = 0.008 Hz), columns 31.25 s apart. setEnv peaks at the live break line at t = SET_ANCHOR_S = 45 s (#arm anchor re-references the envelope to u_setRef = -36.5 m, so the s/cg term cancels there); columns are 45 + P·(0.5 + k/4), k = 0..4 — a full beat from lull through the peak back to lull.
numbers
env — set envelope at the break line, through the repo's own setEnv twin (web-three/js/model-js.js) fed from the live uniforms.
crest — tallest displaced surface point on the ±45 m shore-normal transect nearest where the camera is aimed, read straight off the GPU through __pointbreak.curlProbe (which runs the shipped shader chunk, not a re-derivation). One of 11 transects along the stage; the stage-wide max is in the JSON as crestMaxM, and it barely moves across a wave period because some wave is always cresting somewhere on 200 m of line. These are displayed metres — the renderer applies a viewing gain of VIS = 3.2 (shared/model-glsl.js), so they are not physical wave heights.
crest±T/2 (set sheet only) — the same read swept across one full wave period centred on the column clock (12 sub-clocks) and maxed: the tallest wave to cross that station around this moment. This is the set sheet's headline number, and inst beside it is the single instant the frame shows. A set beat is 31–42 s per column against a 12–15 s wave, so the two are unrelated phases and an instant aliases the carrier into a number that claims to be about sets — measured at The Hook, the instant reads 3.13 m in the peak column where the envelope reads 5.27 m and the biggest wave (5.30 m) crossed 3.9 s earlier. When they disagree, the wave is simply between crests at that station in that frame.
foammodel — the shader's own foam field at those same transects: peak value, and the share of the 11 stations carrying foam ≥ 0.15. Camera-independent, so the framing cannot move it.
foampix — the camera's answer: share of samples at luma ≥ 160 over the whitewater attachment corridor, 25 points per line station spanning -15 m to +45 m across the break line in world metres (sections shift included), each the max of its 3×3 neighbourhood. Reads n/a where there is no baked line to project (Privates). It is corridor-local: whitewater that has already advected shoreward is outside it by design.
ceilM (JSON only) — the depth-limited crest ceiling 0.8·VIS·min(H₀Ks, γh) at those transects. null at Privates, and that is a result, not a gap: with no measured bed the site runs u_depthMix = 0, the seabed sampler is a 1×1 stand-in, and the depth the shader reads back is the storage format's own quantization floor (a flat 30.91 m stage-wide) rather than a seabed. γh then never binds and the "ceiling" is 1.878·H₀ wearing a depth limit's name, while the crest above it came from the depth-free synthetic branch. Privates has no measured bed and therefore no ceiling to be over. Its crest at the January set peak (5.32 m) is in family with all six mapped sites (4.99–5.32 m) on the same day.
links
Every hash is a live link into ../sim/web-three/ at that exact state, so clicking a suspicious frame drops you into the simulator at it. Those links are relative to this page and resolve against the simulator published beside the essay, so they work wherever this bundle is served from. Row headers link to column 1. Clicking the image opens that frame on its own. Frames were captured at 1000×625 and are published at 800×500 WebP to keep this page a reasonable download; every measurement on it was taken from the full-resolution capture before any crop, marker or downscale, and the hash link reopens the state at full fidelity in the simulator, which is better evidence than any still. Captures were taken on their own separate port so they never touched your dev server.

Locations — three presets, month=january

The location axis: three shipped site presets at the same climatological month, so what differs between rows is the reef. Sewers and Second Peak are the ends of the breaker-character range (ξ 1.15 against 0.65); Privates is the synthetic-stage site.

row ↓ / clock →
1. lullanchor
2. building+1/4 beat
3. SET PEAK+1/2 beat
4. easing+3/4 beat
5. lull+1 beat
Sewers preset=sewers
H₀
1.61 m
T
15.0 s
tide
0.00 m
Δf
0.008 Hz
ξ
1.15
step
31.25 s
cam drift
0.00 m
foam on the crest — → — → — → — → —
OSM/NCEI Sewer Peak · u 403 m · reef -1.53 m NAVD88 · breaker anatomy · bed measured+reef · January · p75 climatology #cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0
frame at sim 107.5 s
t 107.5 s
env 0.15 crest±T/2 1.02 minst 0.91
foammodel 0.08 (0% of stage) foampix 0.0%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=107.5
frame at sim 138.75 s
t 138.8 s
env 0.57 crest±T/2 3.98 minst 2.92
foammodel 0.47 (91% of stage) foampix 1.9%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=138.75
frame at sim 170 s
t 170.0 sSET PEAK
env 1.00 crest±T/2 7.00 minst 3.23
foammodel 0.81 (100% of stage) foampix 15.6%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=170
frame at sim 201.25 s
t 201.3 s
env 0.57 crest±T/2 4.27 minst 1.23
foammodel 0.79 (100% of stage) foampix 5.4%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=201.25
frame at sim 232.5 s
t 232.5 s
env 0.15 crest±T/2 1.36 minst 0.30
foammodel 0.08 (0% of stage) foampix 0.0%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=232.5
Second Peak preset=secondpeak
H₀
1.25 m
T
14.0 s
tide
0.00 m
Δf
0.006 Hz
ξ
0.65
step
41.67 s
cam drift
0.00 m
foam on the crest — → — → — → — → —
OSM/NCEI Second Peak · u 668 m · reef -1.30 m NAVD88 · breaker anatomy · bed measured+reef · January · p75 climatology #cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0
frame at sim 128.33 s
t 128.3 s
env 0.15 crest±T/2 0.81 minst 0.76
foammodel 0.05 (0% of stage) foampix 0.0%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=128.33
frame at sim 170 s
t 170.0 s
env 0.57 crest±T/2 3.34 minst 3.08
foammodel 0.42 (73% of stage) foampix 1.0%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=170
frame at sim 211.67 s
t 211.7 sSET PEAK
env 1.00 crest±T/2 4.94 minst 4.84
foammodel 0.96 (100% of stage) foampix 11.1%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=211.67
frame at sim 253.33 s
t 253.3 s
env 0.57 crest±T/2 2.46 minst 2.44
foammodel 0.47 (82% of stage) foampix 1.4%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=253.33
frame at sim 295 s
t 295.0 s
env 0.15 crest±T/2 0.82 minst 0.77
foammodel 0.04 (0% of stage) foampix 0.0%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=295
Privates preset=privates · synthetic stage — no measured bed
H₀
1.25 m
T
12.0 s
tide
0.00 m
Δf
0.006 Hz
ξ
0.35
step
41.67 s
cam drift
0.00 m
foam on the crest — → — → — → — → —
synthetic contour · no Pleasure Point mapping · breaker anatomy · January · p75 climatology Synthetic stage — no measured bed here, so the depth ceiling and the pixel corridor read n/a on this row. The crest and model foam are measured as everywhere else. #cam=drone&preset=privates&month=january&controls=0&q=high&speed=0
frame at sim 128.33 s
t 128.3 s
env 0.15 crest±T/2 0.93 minst 0.78
foammodel 0.01 (0% of stage) foampix n/a
#cam=drone&preset=privates&month=january&controls=0&q=high&speed=0&sim=128.33
frame at sim 170 s
t 170.0 s
env 0.57 crest±T/2 3.69 minst 3.07
foammodel 0.57 (64% of stage) foampix n/a
#cam=drone&preset=privates&month=january&controls=0&q=high&speed=0&sim=170
frame at sim 211.67 s
t 211.7 sSET PEAK
env 1.00 crest±T/2 5.96 minst 5.20
foammodel 0.60 (100% of stage) foampix n/a
#cam=drone&preset=privates&month=january&controls=0&q=high&speed=0&sim=211.67
frame at sim 253.33 s
t 253.3 s
env 0.57 crest±T/2 3.66 minst 2.07
foammodel 0.72 (73% of stage) foampix n/a
#cam=drone&preset=privates&month=january&controls=0&q=high&speed=0&sim=253.33
frame at sim 295 s
t 295.0 s
env 0.15 crest±T/2 1.02 minst 0.80
foammodel 0.01 (0% of stage) foampix n/a
#cam=drone&preset=privates&month=january&controls=0&q=high&speed=0&sim=295

Seasons — two presets × two months

The season axis at its two extremes: January (the peak month, H₀ p75 1.245 m) against August (the flat request, 0.585 m). The shipped peel floor may raise the drawn H₀; Sewers collapses both requests to 1.61 m, while Second Peak draws 1.245 m against 1.08 m. See "What month actually does".

row ↓ / clock →
1. lullanchor
2. building+1/4 beat
3. SET PEAK+1/2 beat
4. easing+3/4 beat
5. lull+1 beat
Sewers · January the big month — H₀ p75 1.245 m
H₀
1.61 m
T
15.0 s
tide
0.00 m
Δf
0.008 Hz
ξ
1.15
step
31.25 s
cam drift
0.00 m
foam on the crest — → — → — → — → —
OSM/NCEI Sewer Peak · u 403 m · reef -1.53 m NAVD88 · breaker anatomy · bed measured+reef · January · p75 climatology #cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0
frame at sim 107.5 s
t 107.5 s
env 0.15 crest±T/2 1.02 minst 0.91
foammodel 0.08 (0% of stage) foampix 0.0%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=107.5
frame at sim 138.75 s
t 138.8 s
env 0.57 crest±T/2 3.98 minst 2.92
foammodel 0.47 (91% of stage) foampix 1.9%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=138.75
frame at sim 170 s
t 170.0 sSET PEAK
env 1.00 crest±T/2 7.00 minst 3.23
foammodel 0.81 (100% of stage) foampix 15.6%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=170
frame at sim 201.25 s
t 201.3 s
env 0.57 crest±T/2 4.27 minst 1.23
foammodel 0.79 (100% of stage) foampix 5.4%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=201.25
frame at sim 232.5 s
t 232.5 s
env 0.15 crest±T/2 1.36 minst 0.30
foammodel 0.08 (0% of stage) foampix 0.0%
#cam=drone&preset=sewers&month=january&controls=0&q=high&speed=0&sim=232.5
Sewers · August the flat one — H₀ p75 0.585 m; ZERO hours ≥ 1.3 m in 25 years
H₀
1.61 m
T
15.0 s
tide
0.00 m
Δf
0.008 Hz
ξ
1.15
step
31.25 s
cam drift
0.00 m
foam on the crest — → — → — → — → —
OSM/NCEI Sewer Peak · u 403 m · reef -1.53 m NAVD88 · breaker anatomy · bed measured+reef · August · p75 climatology #cam=drone&preset=sewers&month=august&controls=0&q=high&speed=0
frame at sim 107.5 s
t 107.5 s
env 0.15 crest±T/2 1.02 minst 0.91
foammodel 0.08 (0% of stage) foampix 0.0%
#cam=drone&preset=sewers&month=august&controls=0&q=high&speed=0&sim=107.5
frame at sim 138.75 s
t 138.8 s
env 0.57 crest±T/2 3.98 minst 2.92
foammodel 0.47 (91% of stage) foampix 1.9%
#cam=drone&preset=sewers&month=august&controls=0&q=high&speed=0&sim=138.75
frame at sim 170 s
t 170.0 sSET PEAK
env 1.00 crest±T/2 7.00 minst 3.23
foammodel 0.81 (100% of stage) foampix 15.6%
#cam=drone&preset=sewers&month=august&controls=0&q=high&speed=0&sim=170
frame at sim 201.25 s
t 201.3 s
env 0.57 crest±T/2 4.27 minst 1.23
foammodel 0.79 (100% of stage) foampix 5.4%
#cam=drone&preset=sewers&month=august&controls=0&q=high&speed=0&sim=201.25
frame at sim 232.5 s
t 232.5 s
env 0.15 crest±T/2 1.36 minst 0.30
foammodel 0.08 (0% of stage) foampix 0.0%
#cam=drone&preset=sewers&month=august&controls=0&q=high&speed=0&sim=232.5
Second Peak · January the big month — H₀ p75 1.245 m
H₀
1.25 m
T
14.0 s
tide
0.00 m
Δf
0.006 Hz
ξ
0.65
step
41.67 s
cam drift
0.00 m
foam on the crest — → — → — → — → —
OSM/NCEI Second Peak · u 668 m · reef -1.30 m NAVD88 · breaker anatomy · bed measured+reef · January · p75 climatology #cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0
frame at sim 128.33 s
t 128.3 s
env 0.15 crest±T/2 0.81 minst 0.76
foammodel 0.05 (0% of stage) foampix 0.0%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=128.33
frame at sim 170 s
t 170.0 s
env 0.57 crest±T/2 3.34 minst 3.08
foammodel 0.42 (73% of stage) foampix 1.0%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=170
frame at sim 211.67 s
t 211.7 sSET PEAK
env 1.00 crest±T/2 4.94 minst 4.84
foammodel 0.96 (100% of stage) foampix 11.1%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=211.67
frame at sim 253.33 s
t 253.3 s
env 0.57 crest±T/2 2.46 minst 2.44
foammodel 0.47 (82% of stage) foampix 1.4%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=253.33
frame at sim 295 s
t 295.0 s
env 0.15 crest±T/2 0.82 minst 0.77
foammodel 0.04 (0% of stage) foampix 0.0%
#cam=drone&preset=secondpeak&month=january&controls=0&q=high&speed=0&sim=295
Second Peak · August the flat one — H₀ p75 0.585 m; ZERO hours ≥ 1.3 m in 25 years
H₀
1.08 m
T
14.0 s
tide
0.00 m
Δf
0.006 Hz
ξ
0.65
step
41.67 s
cam drift
0.00 m
foam on the crest — → — → — → — → —
OSM/NCEI Second Peak · u 668 m · reef -1.30 m NAVD88 · breaker anatomy · bed measured+reef · August · p75 climatology #cam=drone&preset=secondpeak&month=august&controls=0&q=high&speed=0
frame at sim 128.33 s
t 128.3 s
env 0.15 crest±T/2 0.80 minst 0.67
foammodel 0.04 (0% of stage) foampix 0.0%
#cam=drone&preset=secondpeak&month=august&controls=0&q=high&speed=0&sim=128.33
frame at sim 170 s
t 170.0 s
env 0.57 crest±T/2 3.22 minst 2.73
foammodel 0.29 (64% of stage) foampix 0.3%
#cam=drone&preset=secondpeak&month=august&controls=0&q=high&speed=0&sim=170
frame at sim 211.67 s
t 211.7 sSET PEAK
env 1.00 crest±T/2 4.47 minst 4.08
foammodel 0.57 (91% of stage) foampix 12.3%
#cam=drone&preset=secondpeak&month=august&controls=0&q=high&speed=0&sim=211.67
frame at sim 253.33 s
t 253.3 s
env 0.57 crest±T/2 2.86 minst 1.95
foammodel 0.28 (64% of stage) foampix 0.7%
#cam=drone&preset=secondpeak&month=august&controls=0&q=high&speed=0&sim=253.33
frame at sim 295 s
t 295.0 s
env 0.15 crest±T/2 0.78 minst 0.69
foammodel 0.05 (0% of stage) foampix 0.0%
#cam=drone&preset=secondpeak&month=august&controls=0&q=high&speed=0&sim=295

What month= actually does. It sets H₀ to that month's p75 significant wave height at CDIP SC116 (MOP v1.1, whole years 2000–2024, 218,975 hours used), de-shoaled from the 15 m contour to the deep-water H₀ the shader re-shoals from. Size only. Period is seasonless in this data — the interpolated spectral peak is 14.4–15.2 s in every month — so a month restores the site card's own T, chop and Δf and changes nothing but height. Tide is not a CDIP product and is left alone. month= and day= are mutually exclusive; an explicit h0= beats both. August is the flat one for a measured reason: across 2000–2024 there are zero hours at or above Hs 1.3 m in July or August. See docs/research/PP_CDIP_CLIMATOLOGY.md.

The requested and drawn heights are not always the same. Monthly p75 is routed through the shipped peel floor before rendering. In this sampled matrix Sewers raises January, October and August to the same 1.61 m drawn H₀; Second Peak keeps January at 1.245 m and raises October/August to 1.08 m. Identical Sewers season rows are therefore a visible cost of the current model policy, not stale captures. Every row header prints the drawn state; the requested climatology remains in the row label and permalink. See docs/MODEL.md §4.6 and the clamp control.

What is on this sheet. The location axis is all seven presets at month=january (7 rows). The season axis is two presets × three months (6 rows): January the peak month, October the autumn shoulder, August the flat one. privates is the synthetic-stage site — it has no measured bed, so its reef is authored rather than surveyed, and the app says so in its readout. Camera is cam=drone throughout: a set is a property of the whole lineup, and the overhead view is the one that shows the envelope arriving down the point.

What was left out. 7 presets × 12 months × 5 clocks would be 420 frames. The sampled 7 + 6 = 13 rows cover the location axis completely at one month and the season axis at its two extremes plus a shoulder, on the two sites with the most contrast in ξ (Sewers 1.15, Second Peak 0.65). Not sampled: the other five presets across months; the nine unsampled months; any tide or Δf variation (a month touches neither).

Why the crest number is swept, not sampled (2026-08-19). A set sheet is about the envelope, and this sheet's columns are one quarter of a set beat apart — 31–42 s — against a carrier wave of 12–15 s. Those two periods have no relation, so a single-instant crest at one station lands on an arbitrary point of the passing wave in every column. It looked exactly like a model defect: The Hook read 1.04 / 3.63 / 3.13 / 1.25 / 0.98 m across the beat, a set apparently peaking a column early and half over by the peak column. Sweeping that same station every 1 s across the beat found waves of 2.11–5.30 m with the biggest arriving at t = 184 s, 3.9 s (0.027 beat) before the peak column's own clock — the envelope was where it was designed to be and the instrument was reading between two waves. The headline crest±T/2 is now the max over one carrier period centred on the column clock; the instant is printed beside it because that is what the frame shows. Nothing in the model moved. See docs/research/MEASUREMENT_LESSONS.md 12.

Why the lull is not flat. #env floors the set envelope at 0.15 instead of exactly zero — env = (1−m) + m·cos(…), m = 0.425, so the peak is unchanged at 1.0 by construction and only the trough rises. That floor is derived from the SC116 spectra two independent ways, not picked. Columns 1 and 5 are the lull; if they read as dead flat water, that is the regression this sheet is for.

Where this sheet says n/a, and why. Two measures go blank at Privates, and only at Privates, because that site's coastline defeats the contour fit (16.5 m RMS) and it runs on a synthetic stage rather than a surveyed seabed. foampix needs a baked break line to project a corridor onto; with no measured bed there is no baked line, so there is nothing to sample and the cell reads n/a instead of sampling an arbitrary band of pixels. ceilM, the depth-limited crest ceiling in the JSON, is null for the same root cause one step further on: the site runs u_depthMix = 0, the seabed sampler is a 1×1 stand-in, and the depth the shader reads back is the storage format's quantization floor rather than a seabed — so γh never binds and the "ceiling" would be 1.878·H₀ wearing a depth limit's name. Privates has no measured bed and therefore no ceiling to be over. An earlier sheet did print that number and produced a headline defect ("2.2× over its ceiling") that was entirely an artifact of dividing by it. Everything else on the Privates row — crest, foammodel, the set envelope — is measured the same way as every other site and is directly comparable.

Method caveat. Column 1 of every row is captured from a cold load at its own #sim=; columns 2–5 advance the clock with __pointbreak.setSim() plus two rAF ticks — the mode scripts/capture_temporal.mjs validated against per-frame reloads. Each cell's hash reproduces its frame either way.

Camera drift, recorded not assumed. The #aim cameras frame the baked line's action centroid and smooth over ~6 s of sim time, so advancing the clock could move the instrument between columns of one row (MEASUREMENT_LESSONS 11: an instrument that frames itself on the signal is not a fixed instrument). Each row header carries the largest camera displacement between any two of its five columns. A row with a non-trivial drift there is comparing slightly different windows, and its numbers should be read accordingly. The camera legitimately does differ between rows — the break line moves with H₀ — so only within-row drift is a concern.

Stills, not motion. Nothing here is a motion read off the pictures (MEASUREMENT_LESSONS 1). The positions in the cells and the peel in the row headers are model reads at clocks the model itself derived, and the frames are ordered by that clock, so the ordering is established rather than inferred — which is precisely what lesson 1's third failure ("peel direction is rightward, confirmed across two frames") lacked. Read as pictures, these frames still cannot tell you which way the peel runs.

← all QA sheets in this build · raw measurements (JSON) — the same provenance block, machine-readable · the essay · the repo · commit f3b6bde