- sim/samurai.ts: anger meter (0..1), events (drop/splat/crimeCut/servedWrong/
offstage/cleanServe), 5 unsheath stages -> generated portraits, vignette.
- game/judging.ts: 4 groups (THE CUT/SANDO/SERVICE/FLOOR), banded scores,
grade S-D. game/lines.ts: bilingual samurai barks, 8+/group, deterministic.
- game/game.ts: the run controller — order, serve+verdict, sins -> anger,
onStrike -> the string cut.
- THE STRING CUT: Marionette.cutStrings() deletes all 6 strings in one frame ->
ragdoll (pins survive); stage flings loose food with the slash impulse +
white slash FX + synth gong. Restringable (reset rebuilds).
- Assets wired: bg_washi backdrop + samurai portrait HUD + anger bar. The stage
now reads as the shadow-puppet theatre.
- Exit-bar: clean run grade S(10) standing; bad run grade D (judge discriminates);
disaster run strings cut -> ragdoll falls ~180px, samurai fury. Verified
in-browser (scorecard + string-cut shots) + full M1-M4 battery + npm run check.
- Traps: field 'game' collided with Phaser.Scene.game -> 'session'; walk
faceplant was per-frame lean>45 (a stride recovers) -> now head-hit-floor.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>