# Hand Tie Clips -- engineering log The dated record behind [`CLAUDE.md`](../CLAUDE.md), which is the architecture brief. Everything here is **history**: what was built on a given day, what it measured, and what it got wrong. Later sections correct earlier ones -- read to the end of a thread before trusting the top of it. Numbering starts at 8 because sections 1-7 became the brief. ## 8. References are files, not wires (2026-08-28) The node had **16 sockets** and twelve of them were user media: `ref_image_1..9`, `reference_video`, `voice`, `start_image`. They occupied roughly 340px down the left of the node before the editor started, each needing its own `Load Image`. They are gone. The node now has **five**: `model`, `clip`, `vae`, `audio_vae`, `continuity_state`. A reference names a **file** under `/h3_refs`. `media.py` owns both halves of that: - **`resolve(name)` is the only thing that turns a name into a path**, and it is used by the upload route and the loaders alike. Basename only, `normpath`, then a prefix check against the reference directory, then an extension whitelist. Verified against absolute paths, `../` traversal, and traversal carrying a legal extension — all refused. - **The loaders return exactly what the sockets delivered** — float `[N,H,W,3]` in 0..1 — so `_ref_frames`' resize, `_collect_ref_images`' dense-pack and `store.tensor_digest`'s cache keying are all unchanged. That is why this was a small diff rather than a rewrite. **Pixels never enter a widget.** Only the basename is stored. PromptMasterLD measured 1.68 MB of widget value for nine base64 thumbnails and ComfyUI then failed to save the workflow at all; previews are `/view?...&subfolder=h3_refs` URLs, which cost nothing to rebuild and survive a reload. `/view` also brings Range support, which a `