Continual Learning — Progress Dashboard

Framework A — from scratch

open_microwave

SOLVEDstatus
3iterations
27.6seconds to solve

iter_001 — fail

2026-07-23 10:47:31 · wall 6.3s · sim 34.1s · progress 0.3679

iter_002 — fail

2026-07-23 10:51:07 · wall 8.8s · sim 46.5s · progress 0.4992

iter_003 — success

2026-07-23 10:53:14 · wall 12.5s · sim 63.4s · progress 0.5027

iter_004 — fail

2026-07-23 10:55:32 · wall 10.3s · sim 55.8s · progress 0.4097

iter_005 — fail

2026-07-23 10:56:43 · wall 13.8s · sim 73.4s · progress 0.4515

iter_006 — success

2026-07-23 10:57:22 · wall 12.7s · sim 63.4s · progress 0.5027

iter_007 — fail

2026-07-23 10:58:26 · wall 10.9s · sim 55.0s · progress 0.4643

iter_008 — success

2026-07-23 11:02:14 · wall 24.2s · sim 121.3s · progress 0.5011

iter_009 — success

2026-07-23 11:03:09 · wall 12.3s · sim 65.5s · progress 0.5295

Failure analysis

# open_microwave — analysis (iter_009, SUCCESS, progress 0.5295)

Perception-driven solution using the distilled skills
(`skills/geometry.py`, `skills/hinged_door.py`). Grasps the vertical handle
bar's centre, seated deep in the finger gap, and pulls the end-effector along
the door's hinge arc with fixed gripper orientation, then releases and retreats.

## Path to success
- iter_001 (yaw-follow the door): door reached ~0.37 rad then the gripper was
  pried off by the yaw. progress 0.368.
- iter_002 (fixed orientation): slip moved out to ~0.5 rad. progress 0.499.
- iter_003 (deep grasp, fixed orientation): first SUCCESS. Deep seating of the
  bar in the finger gap survived past 0.8 rad. progress 0.503 (right at the
  0.8-rad threshold).
- iter_009 (this): perception-driven via skills, grasping the bar CENTRE →
  progress 0.5295, more margin, and validates the reusable primitive.

## Key facts established
- Success threshold ≈ 0.8 rad; progress ≈ door_angle / 1.6. Eval deterministic.
- Door stays where released (no spring-back) → only need to hold grip to target.
- Grip security (deep + centred) is the dominant factor. Yaw-following hurts.
- ~0.8 rad is an arm-strength ceiling (arm sags in z at far reach); don't fight
  it with longer sweeps — clear the threshold and stop.

Proposed solution

# open_microwave — proposal (from iter_009)

Task is solved (deterministic success). No further iteration needed for
open_microwave. The winning program is `workspace/open_microwave_v005.py`.

Durable outputs written for future sessions:
- `skills/geometry.py` — quaternion helpers, `find_protruding_point`.
- `skills/hinged_door.py` — `pull_hinged_door`, `open_sign_toward_robot`,
  `release_and_retreat` primitive.
- `skills/open_hinged_door.md` — recipe.
- `world_memory/{scene_microwave, action_open_hinged_door, embodiment_kinova_gen3}.md`.

If revisited for more margin/robustness: the ~0.8-rad pull ceiling is set by arm
sag at far reach. A possible avenue is a two-phase open (pull to ~0.6 rad, then
push the swung-out door face with the gripper back), but pulling alone already
clears the requirement deterministically, so it is not worth the risk/time.

iter_010 — success

2026-07-23 11:03:56 · wall 12.9s · sim 65.5s · progress 0.5295

Framework B — human-demo guided

open_microwave

SOLVEDstatus
3iterations
19.9seconds to solve
0.975traj similarity

Human demonstration

iter_001 — fail

2026-07-23 10:48:57 · wall 7.5s · sim 40.5s · progress 0.334 · similarity 0.969

iter_002 — fail

2026-07-23 10:52:34 · wall 4.8s · sim 26.5s · progress 0.2112 · similarity 0.958

iter_003 — success

2026-07-23 10:55:18 · wall 7.6s · sim 40.1s · progress 0.5536 · similarity 0.975

iter_004 — success

2026-07-23 10:58:34 · wall 9.2s · sim 43.3s · progress 0.7729 · similarity 0.966

iter_005 — success

2026-07-23 11:00:12 · wall 8.0s · sim 41.5s · progress 0.7786 · similarity 0.959

Failure analysis

# open_microwave — iteration 5 analysis

**Result:** SUCCESS. progress = 0.7786 rad (resting, after release + settle),
success threshold 0.5. traj_similarity to demo = 0.959.

## Progression across iterations
| iter | sweep cmd | held (before release) | resting (progress) | note |
|------|-----------|-----------------------|--------------------|------|
| 001  | 1.02      | ~0.33 (slipped)       | 0.334              | fixed gripper orientation → cammed off bar |
| 002  | 1.08 +inward bias | ~0.4 then thrash | 0.211           | inward bias made targets unreachable, IK dove (z→0.40) |
| 003  | 1.08      | ~1.0                  | 0.554 (SUCCESS)    | rotating gripper fixed the slip |
| 004  | 1.35      | ~1.35                 | 0.773              | pushed past springback |
| 005  | 1.50      | ~1.4 (open stop)      | 0.779              | diminishing returns; ~0.78 is the resting equilibrium |

## What was actually happening
- The handle is a **vertical** bar on a door with a **vertical** hinge axis, so
  the bar stays vertical and at constant z (~0.60); it only translates along a
  horizontal arc. Circle fit on the demo's gripper-closed EE path:
  **hinge (x,y)=(0.656, 0.276), radius 0.483 m**, closed handle angle -1.524 rad.
- **Root failure (iter 1):** holding the EE orientation fixed while the door
  rotates ~60° makes the handle rotate relative to the fingers, so the grip
  progressively cams off the bar. Fix: rotate the gripper about world **+z** by
  the door angle (`rot_z(q0, sweep*frac)`) so the grip stays aligned. This alone
  turned failure into success.
- **Inward radial bias (iter 2) is harmful:** the door is rigid, so aiming
  inside the true arc makes every waypoint unreachable; move_to times out and IK
  produces wild poses (z crashed to 0.40 m) that throw the gripper off. Trace the
  *exact* arc.
- **Springback:** the door relaxes to ~0.57× the held angle after release. To
  land a large resting angle you must over-open. It saturates at ~0.78 rad
  resting (≈ half the 1.57 rad range) regardless of extra push — a stable
  equilibrium / open stop.

## Takeaways captured
Distilled into `skills/articulated_open.py` (+ `skills/articulated_open.md`) and
`world_memory/`.

Proposed solution

# open_microwave — proposal after iteration 5

Task is solved robustly (resting 0.779 rad ≥ 0.5). No further iteration needed.

If pushing the resting angle even higher were required:
- It saturates near ~0.78 rad (both sweep 1.35 and 1.50 land there), so more
  pull won't help — the door has a stable half-open equilibrium.
- The only lever left would be to *wedge* the door (e.g. release while the arm
  body still blocks it) or find an over-center latch point, neither of which is
  needed here.

Recommended canonical solution: **iter 3's parameters** (sweep 1.08) are the
minimal reliable success; **iter 4/5 (sweep ~1.35–1.5)** give the largest
margin. Ship v005-style parameters for robustness.