# Phase A — Object Position OOD: 1v vs 2v

## Setup
- Train: `exp3_left_train` (128 demos, left-half object positions, j ∈ [0, 7])
- Test: 20 random in-dist (left) positions + 20 random OOD (right) positions, 5 episodes each
- Eval flags: `--teleport --zero_rotation --clean_scene --max_steps 600`
- Model arch: PARA (DINOv3-S/16+ + dense per-pixel volume head)
- Training: 60min on GPU 2

## Results
| Method | Train-dist (left) | OOD (right) | Δ |
|---|---|---|---|
| **1v PARA**     | 61/100 = 61% | 51/100 = 51% | -10pp |
| **2v dual_para**| FAILED       | FAILED       |   —   |

## 2view blocker
The `dual_para` architecture in `para_normalized_losses` is broken at inference.
- My freshly-trained `dual_para_exp3_left_2v` (60min training, valid losses) → 0/15 on first 3 positions; all episodes hit max_steps.
- Pre-existing `dual_para_alldemo_t0_noclip` (trained on all 50 default demos) → 0/3 at default position.

The issue is architectural / in the decoder (`decode_dual_window_actions`), not my training.
Need either (a) fix the decoder, or (b) integrate the proven query-MLP 2view from
`/data/cameron/para/libero/model_dino_volume_query_2view.py` into this repo's OOD harness.

## Next
Recommend deferring 2v vs 1v OOD until decoder bug fixed or query-MLP integrated.
