Final golden sweep + doc finalization for the organic-animation pass. No .sx
logic/render change; goldens + README only (CLAUDE.md is local-only/gitignored).
Refreshed 8 stale goldens to the SHIPPED render (each verified deterministic):
- p6_anim_swap/clear/fall, p6_fx, p6_inputlock_board (M3TE_FX=3 at swap/clear/fall
segment phases): last captured at P13.1, so they still showed the PRE-organic
flat tweens; now show the merged overshoot / pop-ripple / gravity-accel motion.
- p17_fall, p17_stagger, p17_land (M3TE_FX=11 deep cascade): captured incrementally
at P17.1/.2/.3 and never updated as later steps changed the shared cascade frame
(P17.2 stagger, P17.3 squash, P18.2 burst ripple), so the committed PNGs no longer
matched the shipped code (12-20% board-region diff). Re-captured to the final,
fully-merged fall motion at their documented phases.
README:
- Added the previously-undocumented move-timeline frame recipes (swap/clear/fall/
after segment phases + the resting-board goldens), filling the doc gap.
- Fixed the now-false P17 prose: p17_fall was described as a "pre-stagger lockstep
reference" and p17_stagger as carrying "no squash" — both untrue once the full
fall motion shipped. Now describes all three as the final combined motion, each
pinned to foreground a different tell (accel / staircase / squash wave).
Verified all 28 goldens: 8 refreshed, 20 unchanged (board+HUD region byte-identical
over a status-bar/home-indicator crop), 0 removed. t=0 rest, win/lose, HUD, select,
idle, FPS, p16/p18 and p11_combo_deep all reproduce. Gate green (ios-sim build +
22/22 logic tests; tests/gem_pose.sx + tests/easing.sx pin the t=0 rest invariant).
Integration-only (no logic changes). Validated the full candy vibe in the booted
iPhone sim and brought every artifact in line with the shipped candy palette +
Triple Treat SFX bank.
Goldens — swept all 23:
- Refreshed 15 that predated the candy palette (P12): p6_idle_t0, p6_idle_mid,
p6_select, p7_restart, p5_swap_before/after, p6_anim_swap/clear/fall/after,
p6_fx, p6_fx_after, p6_fx_match, p6_inputlock_board, p11_combo_deep — re-captured
via the documented M3TE_* hooks.
- Left 5 unchanged (board+HUD region byte-identical to the current build, verified
by cropped-region hash): p4_board, p4_hud, p9_polish, p7_win, p7_lose.
- Removed 3 obsolete pre-board orange-quad goldens (app no longer renders them):
p0_quad, p0_input_before, p0_input_after.
Docs — README.md:
- Section 2 now describes the candy board (not the old orange quad) and points at
goldens/p6_idle_t0.png; dropped the removed p0_* references.
- Added the final audio model: Triple Treat SFX provenance + per-cue mapping, the
per-round ascending cascade (one combo cue per round, clamped at combo5), the
WAVE/mono/44100/Int16 @ -15 dBFS format spec, and the cue-log capture commands.
- Added image-art asset regeneration (codex imagegen via codex exec + sips
normalize to exact per-asset dims/format).
Gate: ios-sim build links (exit 0); 21/21 pure-sx logic tests pass. Playthrough
evidence (cue NSLog ascending combo1..combo5 + win/lose stingers, screenshots)
captured in the worker report.
Add a purely-visual, transient juice layer over a committed move — score
popups + a tinted particle/flash burst at the clears — with no change to the
model, score, moves, or settled board.
- assets/fx/particle.png: key the painted transparency checkerboard out of the
provided particle art to real alpha (8-connected border flood fill +
smooth luminance falloff that preserves the soft glow), downscaled to a
256x256 RGBA white sparkle. tools/key_particle.sx is the reproducible tool.
- board_fx.sx: BoardFx (live particle bursts + one "+points" popup) and
BoardFxAssets. The engine image path samples texture*white (no draw-time
tint), so the white sprite is tinted per gem colour at LOAD time into one
texture per colour; a burst animates by scale (grow -> shrink) and the soft
texture edges carry the fade. Combos (cascade depth > 1) burst bigger and the
popup is larger + gold. All driven by delta_time and self-pruning.
- board_anim.sx: AnimMove carries the model's cascade.awarded so the popup
shows the real payout without re-deriving any scoring in the view.
- board_view.sx / main.sx: wire BoardFx + the tinted assets, tick each frame,
spawn on a legal commit, and render bursts (clipped to the grid) under the
popups (drawn on top). Input-lock (BoardAnim.active) is untouched; FX never
gate input and may outlast the move slightly before vanishing.
Goldens (iPhone-17-class sim, iOS 26): p6_fx.png (combo: gold "+480" + bursts
mid-cascade), p6_fx_match.png (single match: "+30" + red burst), p6_fx_after.png
(settled board, FX fully gone). Gate: ios-sim build links, 15/15 logic tests
green (scoring/cascade goldens unchanged).