# Quality review and implementation — pass 24 11 October 2026 UTC. Retained Three.js engine, original textured rig/outfit, five-stage campaign, CC0 recorded audio and version-2 saves. The goal was to resolve the largest evidenced weaknesses in the existing game, rather than replace its architecture. ## Review coverage Inspected the existing source, assets, earlier user phone screenshots, and the six-pose offline rig contact sheet. No existing gameplay recording was supplied or present. The managed Sites environment lacks the required control-browser capability, so live play, browser screenshots, GPU capture and physical-device tests could not be performed. Did not install a browser or start an unsupported preview. Complete sessions below are deterministic scripted play, not human playtesting. ## Five issues, in impact order | Rank | Evidence and problem | Implemented improvement | Verification | | --- | --- | --- | --- | | 1 | A tap early in a 400 ms sword cooldown expired after 180 ms; moving throws stayed in Run and had no visible arm release. | One buffered following sword strike survives its remaining cooldown, up to 420 ms. A full 280 ms release/recovery plays while running or airborne. Sword and throw releases are briefly separated; movement remains enabled. | Early rapid taps produce exactly two strikes, never a backlog; sword requests survive the throw release; actual rig enters ThrowRun. | | 2 | AttackRun used a fresh 360 ms leg cycle, breaking the walking phase. Ankle-based grounding allowed actual sole vertices to penetrate terrain by about 0.208 world units in the ramp test. | Separate lower-body gait follows actual traveled distance through sword/throw actions. Cached skinned boot extrema drive terrain contact. Stone approach geometry conforms to terrain, with a 0.025-unit surface offset. Attack progress follows the simulation clock after interruptions. | Independent inspection of 470 sole vertices over ramp/action samples: lowest sole 0.0147 units above terrain; maximum gap of the supporting sole 0.0250. Animation contact sheet and 48-frame CPU motion preview inspected. This is root grounding, not full per-leg inverse kinematics or a claim of zero foot sliding in every pose. | | 3 | Charge used a centered ellipse extending behind the attacker; blade enemies had no ground warning. Flat star polygons lacked readable modeled detail. | Terrain-projected forward capsule and arrow show the charge direction/range; remaining range shrinks during charge. Melee sector clears at the hit beat; recovery uses a distinct green ring. Beveled metal shuriken have a center hole, brass hub and restrained halo. | Warning coordinates/direction/terrain height, melee timing, recovery and actual star geometry checked. Star cleanup/restarts pass the integrated scene test. | | 4 | Action cooldowns had no feedback, Focus text could crowd narrow HUDs, and reduced motion still expanded impact rings. Automatic quality reduction used capped frame time and could miss slow frames. | Cooldown sectors plus dashed rims preserve enabled buttons/input buffering. Readable wrapped Focus/objective text, compact narrow/landscape adjustments, tutorial above portrait thumb controls. Reduced motion removes expanding rings and flash expansion. Quality sampling now uses actual elapsed time. | Input/pause/cancel/saves, four viewport camera shapes, bounded effects and scene cleanup pass with graphics mocked. CSS layout, rendered readability and physical thumb comfort remain unverified. | | 5 | Four movement lessons never taught the distinctive deflection mechanic before combat. | Fifth safe practice sends a slow star toward the player. A real timed sword deflection completes the lesson; missed stars cannot hurt and practice cannot award score/Focus. Existing tutorialDone settings remain honored; Training replays the lesson. | Real projectile/parry path completes the lesson with 5 health, zero score/Focus and zero counted combat parries. Enemy activity stays gated. Skip/retry remain available. | ## Tests and measurements `node tools/verify.mjs` passes: gameplay rules; all five scripted completions with normal damage/health; collision, win/loss/retry; keyboard/touch handler interruption; saved settings/migration/corruption; actual GLTF and scene construction with mocked graphics; VFX limits/cleanup; recorded audio, mixing/state checks and all 60 clip decodes; new quality regressions. Actual audio output is mocked. The previous phone confirmation concerned the working audio transport, not listening acceptance of the latest mix. `node tools/benchmark-quality.mjs`: Node v24.19.0, 15,000 measured simulation steps after warmup, median 0.0041 ms / p95 0.0092 ms. One actual character's animation, sole sampling and outfit update over 2,000 samples: median 0.0469 ms / p95 0.1066 ms. Reset work excluded from the simulation sample. These measurements exclude rendering, DOM, audio output and physical input, and cannot establish browser or phone FPS. Raw conditions/results: `evidence/quality-benchmark.json`. ## Evidence and reproduction - `evidence/quality-before.png`: prior real rig contact sheet. - `evidence/animation-contact-sheet.png`: updated actual rig/material poses, simplified CPU lighting. - `evidence/quality-motion.gif`: 48 frames / approximately 4 seconds from the real simulation and animation rig, with a reference supporting surface. It is an offline animation preview, not a captured WebGL gameplay session. - `evidence/quality-motion-contact.png`: sampled frames from the preview. - `evidence/scripted-completions.json` and `evidence/test-output.txt`: reproducible rule/session evidence. Reproduce: `node tools/verify.mjs`; `node tools/benchmark-quality.mjs`; `node tools/pose-evidence.mjs`; `python tools/render-evidence.py`; `node tools/quality-motion-evidence.mjs`; `python tools/render-evidence.py --motion`. Motion geometry is temporary `/tmp/ninja-motion-poses.json`; the GIF/contact artifacts are retained. Node 22+, Python with Pillow/numpy are required. No build compilation is needed; serve `dist/` over HTTP using the README instructions. ## Remaining acceptance work Live WebGL gameplay recording, real browser CSS acceptance, physical Samsung S24 Ultra touch/orientation/latency, GPU frame time/memory/loading time and human audio audition remain unperformed. Native Android/iOS packages are not included. Animation remains procedurally authored on the retained rig; further foot-locking and human animation review may still improve it. Decorative low foliage/roots are scenery; blocking collision is assigned to trunks and world bounds. Legacy side-view campaign remains supported with its older level/audio system. No saved progress was reset.