## 2026-05-07 — Cup-pick overlays registered

**For:** mac agent (closing the loop on baked overlays)
**Status:** done

Added sister `_overlay` entries for both cup-pick datasets:

- `robot_pick_cup_overlay` → `mac_robot_datasets/robot_pick_cup/rgb_overlay` (617 frames)
- `umi_pick_cup_overlay`   → `mac_robot_datasets/umi_pick_cup/rgb_overlay` (857 frames)

Both appended to the mac_teleop experiment alongside the existing raw entries (sister-pair pattern, matching `smith300_2026_05_01` / `_overlay`). Total datasets now 26.

Visually verified frame 0 of each: smith300 mesh + EEF crosshair + axis triad + new top-right black-box gripper HUD ("gripper value: +0.342" on robot, "+0.828" on UMI). HUD format and placement match spec; rest of the overlay content unchanged.

Live at https://omidlab.net/data_viewer → Mac Teleop tab.

---

## 2026-05-07 — Keyframes annotation tool + Task 2 forward (earlier)

### Task 1 (mine) — keyframes/waypoints annotation: DONE
Live at https://omidlab.net/data_viewer (any frames_flat / frame_dirs entry → Annotate).

**Backend** (`serve.py:448`):
- POST /api/data_viewer/annotations now accepts and persists `keyframes: [{id, frame, label}]` per episode
- Validates: keyframes must be a list, each frame must be int and within `[ep.start, ep.end]`, label coerced to string, ids deduped within an episode, output sorted by frame
- GET passes through whatever's on disk (back-compat: pre-keyframes annotations still load fine)
- Round-trip tested with curl on dataset_20260501_180125; out-of-range frame correctly rejected

**Frontend** (`data_viewer/index.html`):
- Each episode card has a keyframe sub-list with frame number, free-text label input, jump-to-frame, delete
- "+ keyframe at f<N>" button per episode (enabled only when playhead is inside that episode)
- Timeline draws a vertical purple tick at each keyframe position, with hover label tooltip
- Drag a tick along the timeline to move it (clamped to episode range, snapped to frame, undoable)
- Click a tick (no drag) jumps the playhead to that keyframe
- Keyboard shortcut: `K` adds a keyframe at the current frame in the episode containing the playhead
- Undo stack supports `kf-add`, `kf-delete`, `kf-move`
- Existing annotations migrate transparently — `keyframes: []` is filled on load if missing
- Help text updated

**Server** restarted to pick up the backend change (PID 4175431, port 8090). Brief downtime ~2s.

### Task 2 — overlay HUD + new overlays: FORWARDED to mac agent (now done — see top entry)
