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.
A swipe that began while a move animation was playing could still commit:
mouse_down latched the drag unconditionally and the animation-active check
sat at mouse_up, so a press made mid-animation committed once the timeline
finished before release — against a board mid-transition.
Gate input at gesture START instead. Add a pure `accepts_input(anim)`
predicate (false while a timeline is active) and check it at mouse_down: a
press begun mid-animation is dropped and never latches a drag, so it cannot
commit when the animation later settles. The now-dead mouse_up gate is
removed. Animation visuals and the logical model are unchanged.
Extend tests/anim_plan.sx to assert accepts_input rejects for the whole
window (idle accept / busy reject / settled accept) and that press-gating
drops the exact failure gesture a release-gate would let through.