- Sando is zone-DETECTION now: the stack = food bodies physically resting in
the plate zone, bottom->top. Hand-stacked and harness-stacked sandos are
judged identically (sando.kinds() is what the judge reads).
- The full live loop: Game.state + updateLive() — ticket clock with late-anger
(1 bump/3s overdue), bow-dwell serve (hold still 0.5s over a matching
standing sando -> scorecard), click -> next day; string cut -> ragdoll ->
fail card -> click retries the same day with fresh strings. setupDay stages
bread + fillings per order; sins fire live off cutter.onCut + offstage sweep.
- String unlockables: HEMP/RUBBER/CHAIN/SILK picker on the title (stiffness/
damping multipliers, registry-persisted). Rubber visibly stretches.
- Days 6-8: Tamago (it rolls), Tofu (fragile), THE TOWER (5 layers) + tofu food.
- samurai_bow (same seed): an S serve swaps in the single approving nod.
- Battery: M1 87f/8.41u/10-10, M2 cv0 clean, M3 both, days SSSSSSSS, live
serve commits at 31f (~0.5s), death->retry + serve->advance verified.
- Known: embedded preview pane never fires rAF (visibilityState hidden) — live
loop freezes there by browser design; harness steps manually. Real tabs fine.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The soul of a marionette game: draw the 6 strings + the wooden control bar
every frame (Marionette.stringSegments/barSegment, Stage.drawStrings). Gone
once the strings are cut. It finally reads as a puppet on strings.
- Procedural cut-out faces: two eyes + a worried 'o' punched into each whole-food
silhouette in the bright washi tone (backlit-hole look, fits the aesthetic).
Pieces stay faceless. (The generated face PNGs were full-colour cartoons that
clashed with the silhouettes — this replaces them.)
- Order ticket HUD (top-left) + a grabbable cleaver whose held edge drives the
live cutter — swinging it chops food. __s.swingCleaver() proves the wiring:
a held blade whipped through food cuts clean (tip speed ~150 >> threshold).
- All M1-M6 harness numbers unchanged; typecheck + npm run check + build pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 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>
- sim/stack.ts: ordered layers on a plate zone, honest Matter stacking scored
by lean/COM-drift/overhang. standing = elevation (a toppled tower loses
height), not lean angle — a short stack reads 30deg from a 24px step.
- nudge() earthquake discriminates: a centred sando survives (lean 0->2.4),
a marginally-leaning one (lean 44) topples on the shake.
- Grip pickup fixed: was non-deterministic (trials shared puppet state) and
unreliable (a sideways bar yank only stretches the arms — they hang from the
shoulders). Now shiftBodyTo() walks the body over the crate first, and every
trial resets to home -> a true, deterministic 10/10.
- Exit-bar (full battery): M1 dangle 97f / walk 8.78u upright / grip 10/10;
M2 chop 2p cv0 clean / push splat 3.28 / wild offstage; M3 good survives,
bad toppled-by-quake. Verified in-browser + npm run check.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- sim/marionette.ts: control bar + 6 soft strings (head/back/2 hands/2 knees)
over a 9-segment silhouette. Bar snaps to mouse; the felt lag is string
stiffness<1 (worldConstraints), not an input buffer.
- Feet planted on floor + head+back strings keep the torso upright (no topple);
earlier pure-pendulum rig spun past 360deg — the back string fixed it.
- Sticky grip: while gripped, any empty hand latches the nearest target on
contact (puppet.update() each step). Reach = LMB drops the bar.
- Harness verbs: bar/sway/grip/pose/settle + dangle/walk/pickupTest + reset.
- Exit-bar measured: dangle settles 87 frames upright (lean 4.6); walk 8.84
units upright (>6 req, lean 30<45); grip 10/10. Verified in-browser + shot.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>