# Bone Flow #122 KeyFrame Specification v1.0

Status: Development Candidate  
Formal source: `000-Development-Order_v1.1.1.md`  
Runtime: BoneKeyFrame 1.0.0

## Responsibility
#122 defines the state at each point of an Animation.

Formal states:
1. Position
2. Rotation
3. Scale
4. Opacity
5. Color

## Boundary
- #117 Animation owns the actual animation behavior/execution.
- #118 Transition owns interpolation/state-change behavior between states.
- #121 Timeline owns Delay / Duration / Loop / Repeat / Sequence / Parallel.
- #122 does not play, interpolate, schedule, repeat, or trigger Animation.

## Development candidate data model
A KeyFrame candidate contains an `offset` from 0 to 100 and the five formal state values. `offset` identifies the point on the animation progress axis; it does not define duration.

Candidate fields:
- `offset`: 0..100
- `position.x`, `position.y`
- `rotation`
- `scale`
- `opacity`
- `color`

Color selection UI delegates to installed #040 ColorPicker. Runtime stores safe plain color data without reimplementing the ColorPicker UI.

## Security
Plain data only. Accessor/getter/setter properties are rejected without executing them. Out-of-range values and duplicate offsets are rejected.


## OUT WAIT / BLOCKED integration baseline
The test page follows the completed #017 Text delivery presentation rather than an assistant-designed substitute. The section title remains `OUT WAIT / BLOCKED - #002 Joint v1.1.36 Integration`; FIFO is the automatic delivery behavior after WAIT is released, not a separate section responsibility.

The section is one wide card with `KeyFrame OUT -> #002 Joint -> Target`, four status values (`Joint State`, `Target`, `Queue`, `Delivered`), exactly three actions (`WAIT / FIFO`, `BLOCKED`, `Reset`), one log line, and separate WAIT/BLOCKED visual confirmations. No manual Target READY/BUSY selector, Payload A/B selector, separate FIFO button, custom spinner, custom ban icon, or fake Joint line is allowed.

Runtime behavior uses #002 `createDeliveryChannel()`, `evaluate()`, and `drawLine()`. WAIT keeps the connection established, queues A then B while Target is BUSY, shows the official #002 spinner, and automatically delivers A then B when Target becomes READY. BLOCKED keeps the connection established, shows the official #002 ban / beat-fade marker, and does not deliver to Target. Delivery Channel `getState()` is not treated as containing `connectionEstablished`; connection persistence is verified separately through `BoneJoint.evaluate(... state:"waiting" / "blocked")`. Layering is line 1 / nodes 2 / official marker 3.

## Completion
Smoke and Validation plus localhost visual confirmation are required. Package-local checks do not make #122 Completed or Specification Frozen.


## Test UI baseline
The #122 test page follows the completed #017 Text whole-page structure. Preserve the shared order and visual grammar: Header, Dependencies, 使用コンポーネント, Property Editor + Combined Preview, Connection Image, Smoke Test / Validation Report, Completion, and the bottom HTML Functional Class bar. Component-specific Security and OUT WAIT / BLOCKED panels are inserted without replacing those shared sections.

## Property language
Property provides an explicit Japanese / English switch. Headings, labels, descriptions, actions, and Preview labels inside the Property workspace switch without changing KeyFrame values.

## DOC language parity
DOC-0122 must provide non-placeholder Japanese and English guides with matching coverage of role, responsibility boundaries, Property, Preview, Joint, Security, WAIT/BLOCKED, QA, Completion, and HTML Functional Class use.
