# Aja Bellona Frame-Snap Live Link Export

## Scope

V2 accepts Aja-cleaned and Aja-retargeted motion only after Bellona turns it
into a rollback-deterministic animation import artifact:

1. `@aja/neural-retargeting` emits the accepted V2 skeleton clip.
2. `@bellona/mocap` resamples the clip to 60 Hz, snaps every exported frame to
   an integer frame number, and normalizes notify segments to the same grid.
3. `@bellona/unreal` receives an editor-only Live Link handoff for import under
   `/Game/V2/Animation/Mocap/FrameSnap`.

## Rollback Contract

The V2 contract rejects any notify segment whose start or end lands between 60
Hz frames. `hit-active`, `armor`, `cancel-window`, root-motion, and foot-contact
segments must use integer frame boundaries before the animation can enter cook.

V2 keeps Unreal Live Link runtime plugins disabled. The Live Link payload in
this path is an editor/cook handoff generated by `@bellona/unreal`, and the
runtime artifact is a cooked `AnimSequence` plus notify-segment alignment
evidence.

## Validation

`V2/ue/Tools/check-v2-aja-bellona-livelink.py` enforces:

- `@bellona/mocap` exports the frame-snap manifest builder.
- `@v2/aja-bellona-livelink-export` depends on `@bellona/mocap`,
  `@bellona/unreal`, and `@v2/aja-studio-mocap-pipeline`.
- `V2Services` registers `@bellona/mocap`.
- `docs/domains/aja/deep-dive/specifications.md` and
  `docs/domains/bellona/deep-dive/specifications.md` contain the reciprocal
  Aja + Bellona contract.
- V2 TODOs mark the frame-snap and reciprocal task complete.
