What problem does it solve? It prevents hardcoded frame-time literals and mismatched animation speeds when writing or reviewing sprite animation code, ensuring every sprite sheet in the game animates at a consistent 24fps. ## Core Features & Use Cases - Tick-based timing: All durations are expressed as SPRITE_TICK * frames (where SPRITE_TICK = 1000 / SPRITE_FPS in src/canvas/sprite-sheet.ts), never as magic numbers like 16.67 or 1000 / 60. - Playback rules: Clips play at their drawn speed by default; only caster throws are stretched to fit a move window, effects are never stretched, and looping clips repeat rather than slow down. - Scope separation: Distinguishes the 24fps sprite tick from the 60fps battle engine clock so cast windows, cooldowns, and move delays are never conflated with animation timing. - Use Case: When writing a test for a pokemon sheet animation, assert against sprite.length * SPRITE_TICK instead of a hand-computed millisecond figure, so the test stays correct if the frame rate changes. ## Quick Start Ask the assistant to review or write sprite animation code following the sprite-fps rules so all frame durations use SPRITE_TICK instead of hardcoded millisecond values.