# FPS hands and shotgun animation polish

2026-10-30. Integrated into the existing browser game for Rook, Jeff, Fass and Joker. Their actual arm geometry, textures, sleeves and Black skin corrections remain in use. No character models were generated and no credits were spent.

## Changed behavior

- The support hand releases the pump, reaches for a shell, brings it to the underside loading port and returns to the pump. The right hand stays on the firing grip.
- Shoulder positions remain attached to the player as the gun rolls; calibrated wrist orientation follows the gun without inheriting elbow-solve twist. Rook uses his real finger bones; the three Meshy survivors retain their fixed mesh finger grips.
- The pump has a distinct rear stroke, brief hold and forward return. The bolt follows the pump and a cosmetic spent shell ejects near the rear stroke.
- Movement bob follows actual travel after collision, with damped sprint lowering, restrained look inertia and quieter aiming. Existing camera recoil and aim FOV are retained.
- Reload framing raises and rolls the receiver so the shell and support hand are visible. A low-intensity camera-relative light improves hand and gun readability in the club.
- Firing interrupts the reload animation immediately, including while a delayed co-op snapshot still reports reloading. The support hand recovers smoothly to the pump.

## Timing and authority

Presentation observes the existing ammo and reload state. The first shell uses the existing 0.40-second cycle; later shells use 0.58 seconds. An authoritative ammo increase starts the next visual cycle. A stalled snapshot holds the seated pose instead of repeatedly inventing shell insertions. Animation never grants ammo, changes damage or delays a legal shot.

The pump travels 0.15 m: rear stroke 0.14-0.30 s, hold to 0.36 s, return by 0.56 s. Support-hand offsets use damping and a 5.5 m/s travel limit. These are authored DGs timings, not measurements copied from Call of Duty.

## Verification

- 49 logic tests pass, including stale reload snapshots, frame-rate controls, shell-path continuity and pump hold.
- 44 actual-GLB animation checks pass across the four survivors: shoulder anchoring, wrist reach and grip, shell approach, interruption, finite pose and reset. Trigger-hand and reach errors are below 0.001 mm in these samples; pump recovery error stays about 1.01 mm. These are bone landmarks, not a guarantee against all skin intersections.
- The existing 29 Rook and 33-per-Meshy model/material/deformed-geometry checks pass again.
- 62 actual-game browser checks pass, including all existing zombie footwork and reaction checks plus six weapon integration checks. The inspected browser reported no JavaScript errors.
- 13 HTTP co-op checks pass using four independent sessions and the production Worker with local SQLite: server ammo, selected survivor IDs, shot events and reload transfers remain valid.
- The connected browser was used to inspect the real meshes in game lighting: Rook/Fass/Joker reload, Jeff pump/ejection, and Rook alongside the zombie cast in the full game renderer. Captures are labeled paused inspection views, not ordinary combat footage.

Reports: [logic](../evidence/fps-animation-tests.tap), [actual rigs](../evidence/fps-animation-model-checks.json), [browser](../evidence/fps-animation-browser-checks.json), [co-op HTTP](../evidence/coop-http-checks.json).

## Limits

This remains procedural animation over the current generated meshes and existing modeled shotgun. The three Meshy rigs do not gain independent finger articulation. Spent casings are short-lived camera-relative visual effects, not physical world objects. Co-op presentation follows received state rather than a shared server animation clock; high Internet latency can affect visual timing. A four-human Internet session, controller/touch input, new mocap and a higher-detail weapon asset are outside this pass.

The FPS Shooter, Game Feel and Game Dev Playbook rigging/combat guidance was applied. The local playbook lesson and applied ledger were updated; this installed skill copy has no Git metadata, so no upstream lesson push is claimed.
