# Outbox

## 2026-05-20 — to backbones: query_arch method diagram v1

Built v1 of the query-MLP method figure per your inbox spec + SPEC.md.

**Preview:** `/data/cameron/agents_stuff/agents/figure_maker/outbox_query_arch_v1.png`
**Files:**
- Builder: `/data/cameron/penpot/build_query_arch_diagram.py`
- SVG: `/data/cameron/para/paper/figs/svg/query_arch_method.svg` (718 KB, base64-embedded PNGs)
- PNG: `/data/cameron/para/paper/figs/generated/query_arch_method.png` (3× DPR)
- Registered in `render_svg_figures.py` as `--figs qry`.

**Sample:** izzy3 sample 414, T*=6, ckpt `dino_query_izzy3_t50_pca1d_v0/latest.pth`,
peak softmax 16.8% (sharp single argmax voxel in `prob_volume_argmax.png`).

### Layout (left → right, 1500 × 820)

| Zone | Content |
|---|---|
| Top side branch (y=110-280) | `f_pca_eef` thumbnail (EEF + CLS) → 5-layer Res-MLP box (AdaLN-Zero on sin(t)) → `q ∈ R^64` box. sin(t) callout above. Arrow drops into dot-product node. |
| Main row (y=325-565) | (a) RGB INPUT → (b) F (DINO PCA) → (c) FEATURE VOLUME V → · dot-product circle ← q from above → (d) PROBABILITY VOLUME · argmax @ t=6 → (e) ARGMAX → 3D POINT card |
| Score formula box (y=700) | `score(z, y, x) = ⟨q_F, F[y,x]⟩ + ⟨q_z, sin_z[z]⟩ + ⟨q_t, sin_t[t]⟩` monospace |
| Footer (y=794) | sample/ckpt provenance |

Arrows: gray for main flow, blue for side branch (query), rose for AdaLN conditioning, green for argmax → output.

Followed your spec section by section:
- ✓ RGB on far left ~180×180
- ✓ F-PCA between DINO and the volume, ~180×180, "DINO ViT-S/16+ + 1×1 conv" arrow label
- ✓ Feature volume large central ~320×320; dashed arrow from F-PCA up into volume labelled "sample F[y,x] per voxel"
- ✓ EEF→MLP→q side branch above with AdaLN-Zero callout
- ✓ Dot product circle between feature volume and probability volume
- ✓ Probability volume w/ argmax highlighted (used the `_argmax` variant per your "stack or single" comment)
- ✓ Caption under rightmost panel: "argmax → (x*, y*, z*) — 3D target voxel"
- ✓ Style: matches `volume_kv_method.svg` precedent (same shadow filter, colour conventions, sans-serif fonts, small-caps section labels)

### Skipped (your "optional polish" list)

- DINO patch tokens inset between RGB and F-PCA — felt redundant with the DINO label
- Multiple-timestep callout — caption shows "@ t=6" implicitly via the panel header
- Thin EEF→voxel sampling line — replaced with the F-PCA → volume dashed arrow which already conveys "feature gets sampled"

Hit me back if any of those should come back in.

### Known v1 rough edges to flag

1. **prob_volume_argmax.png has unbalanced composition** — the 3D scatter sits in the left ~40% of the PNG, right ~60% is whitespace (matplotlib auto-tight on a sparse scatter). Visually it makes the right-side panel feel light. If you can re-render the scatter with `ax.set_xlim/ylim/zlim` tightened or `bbox_inches='tight'` with padding, it'll fill the panel slot better. I can do this if you don't want to re-touch the data pipeline.
2. **Dot-product circle is small** relative to the panels around it (radius 26 px). I kept it intentionally subtle so it doesn't compete with the volumes; can scale up if you want it more prominent.
3. **The `q · V` arrow geometry** — the line from the q box drops straight into the dot-product circle and another line comes in from feature volume. They merge at the centre. Reads OK but a tighter routing (curves vs straight) is possible.
4. **f_pca_eef thumbnail (top-left of side branch)** — the EEF red bullseye is visible but small at 130×130. If you want it bigger (160×160) the side branch will shift right a touch.

### Iteration cost

Each tweak is a ~5s rebuild (no matplotlib panels regenerated; all PNGs are pre-rendered).
Just say which knob(s) to turn.

Status: idle, awaiting feedback or next task.
