# TOM exploration loop — state & plan

**Loop window:** started 2026-06-23T18:15 PT → **DEADLINE 2026-06-24T18:15 PT (epoch 1782350134)**.
Every firing: `date +%s` on lab; if ≥ 1782350134 → run CronList+CronDelete (stop) and write a final summary to outbox.md. Also stop early if all goals below are done, or if Cameron has replied.

## Context (corrected diagnosis — keep straight)
TOM's `gen_urdf` was NEVER blocked by build123d version or the main/develop branch split. Root cause = **5 custom-part STEPs were unhydrated Git-LFS stubs** (`.lfsconfig` excludes `models/**`), so OCC failed to parse them → degenerate shapes → `Compound.center()` AssertionError. Fix = `git lfs pull -I models/robots/tom/v2/parts -X ""`. After hydration, `tom.py` regenerates **byte-identical** to the committed `tom.urdf` (9 links/8 joints/24 meshes, empty diff).

## How to build (all on lab via `ssh cameronsmith@100.74.71.38`)
- Regen a TOM URDF: `bash /data/cameron/repos/smith300_para_stuff/tom_build.sh <gen.py> <out.urdf>` (cwd-relative to tom v2 dir). Reuses `.venv_cad` + develop `cadpy`/`cadpy_metadata` on PYTHONPATH + `tom_patch/` center() safety net (now inert).
- Worktree: `/data/cameron/repos/ttc-develop/models/robots/tom/v2`. Meshes are 3MF under `3MF/`.
- Validate: `bash /data/cameron/repos/smith300_para_stuff/validate_tom.sh`.

## Goals backlog (do ONE concrete step per firing; check items off)
- [x] G1: Regenerate `tom.urdf` from source → byte-identical. DONE 2026-06-23.
- [ ] G2: Generate `tom_with_gripper.py` + `tom_double.py` URDFs (hydrate any extra LFS STEPs they need; record which).
- [x] G3: TOM viewable in cad.omidlab.net. Verified 2026-06-23: viewer bundle has `ThreeMFLoader` (native 3MF); all 14 `3MF/*.3mf` are real hydrated ZIP binaries (not LFS stubs); `/__cad/catalog` returns HTTP 200 CROSS-DIR for the ttc-develop tom dir, listing tom.urdf + all meshes. URL: `https://cad.omidlab.net/?dir=/data/cameron/repos/ttc-develop/models/robots/tom/v2&file=tom.urdf`. (Not pixel-screenshotted via headless WebGL, but serving+format+hydration all verified.)
- [ ] G4: Document TOM's parametric structure (robot_common/robot_arm.py + tom.py param block): link lengths, joint axes, servo placement formulas → vault `fleet/agents/cad/tom_params.md`.
- [ ] G5: Extract the `link_bracket` design (yoke ↔ next-servo interface) — the exact piece our `two_servo` mating approximates. Document geometry + how it bolts.
- [ ] G6: Compare TOM's kinematic chain vs `smith300.urdf` + our `two_servo.urdf`; note what to adopt for OUR printed arm.
- [ ] G7 (stretch): prototype an `ours` parametric arm = TOM chain structure but our printed `holder_wrap` + `yoke_exact` (not sheet-metal).

## Progress log → append to agents/cad/outbox.md each firing (1–2 lines).
