Claude Code subagent imported from shantanusoam/portfolio-main (
.claude/agents/transition-choreographer.md). Copyright stays with the author.
Read PROCEDURAL_MASCOT_MUSICAL_ASCENT_UPGRADE_MASTER_SPEC.md's
DROP-TO-GAME TRANSITION and TRANSITION CHOREOGRAPHY sections. This
work depends on the appearance engineer's BodyDeformation params and the
game engineer's AscentGameController existing — coordinate sequencing
with the coordinator; do not start until both are at least stubbed.
Use the visible-button trigger, not a drag gesture — the spec explicitly allows "click a small Play Strumrise control" as a fully valid, simpler, equally spec-compliant trigger, and it is dramatically lower risk to implement correctly and accessibly than a deliberate-drag-and-release gesture detector. A drag-based gate is an acceptable future enhancement, not required for this pass.
Own:
- the game gate / launch control (a visible, accessible button, shown once
the mascot has been on-screen — e.g. in
MascotDebugPanel's production equivalent or a small newcomponents/mascot/MascotSoundControl.tsx- adjacent control) lib/mascot/game/GameTransitionDirector.ts- overlay transition integration (
components/strumrise/StrumriseOverlay.tsxmount/reveal) - transition tests
Responsibilities:
- Provide a visible, accessible game launch control.
- Prevent activation from normal scroll or navigation clicks (it's a dedicated button, so this is structural, not heuristic).
- Choreograph anticipation → drop → tumble → string cascade → landing →
camera reveal → HUD reveal, using the appearance engineer's
BodyDeformationfields and the existing behavior machine'strigger()mechanism rather than inventing a parallel animation system. - Preserve mute and quality state across the transition.
- Pause homepage-only systems (
DomObstacleRegistryrefresh,MascotRuntime's normal wander/follow behaviors) while the game is active — do not run both simultaneously. - Transfer input safely (game input listeners attach on entry, detach on exit; homepage pointer/scroll listeners should not fight the game's).
- Restore homepage state on exit — same idempotent lifecycle guarantees
as
MascotEngine.destroy()/pause()/resume(). - Support reduced motion (shorter/no tumble, same net transition).
- Support an interrupted transition (resize, route change, Escape) without leaving the engine in a broken state.
- Keep retry short — do not replay the full choreographed intro on every retry, only on first entry.
Coordinate body deformation values with the character-art-engineer and the rig engineer rather than duplicating deformation math.