← back to Dw Photo Capture
DEVICE-TEST: batch checklist for PSku→Info two-shot flow, side-named files, WYSIWYG sliders, toolpanel
243f75ac8a3f7603eeef2ebfcc40a45869f07f20 · 2026-09-19 09:57:09 -0700 · Steve Abrams
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014D6DNRc992gKfEHCbt6urC
Files touched
Diff
commit 243f75ac8a3f7603eeef2ebfcc40a45869f07f20
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Sep 19 09:57:09 2026 -0700
DEVICE-TEST: batch checklist for PSku→Info two-shot flow, side-named files, WYSIWYG sliders, toolpanel
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014D6DNRc992gKfEHCbt6urC
---
DEVICE-TEST.md | 41 ++++++++++++++++++++++++++++-------------
1 file changed, 28 insertions(+), 13 deletions(-)
diff --git a/DEVICE-TEST.md b/DEVICE-TEST.md
index 99bf99a..c6d9f3a 100644
--- a/DEVICE-TEST.md
+++ b/DEVICE-TEST.md
@@ -86,14 +86,25 @@ auto-lock set to Never.
square → **Capture calibration**. Toast shows WB gains + luma. (Re-open the batch → it skips
straight to shooting; calibration persisted per session in localStorage.)
-## 2. Continuous shoot
-- [ ] Place sample #1 → within a beat the top shows **BATCH: <vendor> <collection>**, the **N / count**
- counter, and status chips (CAM / WB·LOCK / EXP·LOCK / FOCUS / CAL / SKU / Δ).
-- [ ] **SKU auto-fill:** the label OCR (`/api/identify`, Gemini ≈ $0.0006/read) fills the SKU; low
- confidence shows `?` — type/scan to override. The **queue · cost $** line climbs.
-- [ ] **Hands-free:** with *hands-free* ticked, removing one sample and placing the next auto-fires
- once the frame settles + passes the gate (≥1.5 s cadence governor). Toggle off → use the big
- shutter or a **BT shutter** (volume/space/enter).
+## 2. Shoot — PSku photo, then Info photo (two shots per sample, one code)
+- [ ] Camera fills the **whole iPad screen** (100dvh, no letterbox strip at the bottom). The top shows
+ **BATCH: <vendor> <collection>**, the **N / count** counter, and status chips
+ (CAM / WB·LOCK / EXP·LOCK / FOCUS / CAL / SKU / Δ).
+- [ ] **Tools panel** sits center-bottom on load with a **📷 PSku Photo** badge. Drag it by the
+ header anywhere on screen; tap **▾** to collapse to just the header and again to expand.
+- [ ] **Live colour tools (WYSIWYG):** move **Brightness / Warmth / Hue** — the live preview changes
+ *exactly* as the saved photo will (same pixel pipeline). **↺ Reset colour** zeroes all three.
+ Values are sticky (localStorage `dwbatch.tune`) — reload → same slider positions.
+- [ ] **Shot 1 — PSku (product) photo, no code required:** place sample face-up → **shutter**.
+ Badge flips to **Info** and the state line asks for the label.
+ *Short-circuit:* if the code was already readable on the front, it fills the SKU and the pair
+ completes with ONE photo (no Info shot asked).
+- [ ] **Shot 2 — Info (label) photo:** flip to the label → shutter. OCR (`/api/identify`, Gemini
+ ≈ $0.0006/read) fills **code / vendor / pattern / colour**; all four fields are editable. The
+ **queue · cost $** line climbs. Low confidence shows `?` — type to override.
+- [ ] **Auto-snap is OFF by default** (operator-paced). Tick it → removing one sample and placing the
+ next auto-fires once the frame settles + passes the gate (≥1.5 s cadence governor). A **BT
+ shutter** (volume/space/enter) also fires.
- [ ] **Quality gate:** deliberately shoot blurry / too-dark / empty-stand → a big red **RETAKE**
appears and it does **not** enqueue. A good shot flips the state to green **READY**.
- [ ] **Software lock / drift:** nudge the light or the stand → CAL chip flips **DRIFT** and a
@@ -101,9 +112,11 @@ auto-lock set to Never.
substitute for the hardware WB/exposure lock iOS Safari can't give.)*
## 3. Outputs + durability
-- [ ] After ~10 shots, confirm on the server: `photos/batch/<session>/` holds
- `<SKU>_original.jpg` (untouched), `_master.jpg` (WB+exposure-corrected, cropped),
- `_web.jpg` (~1600px), and the session `.jsonl` manifest has one line per shot.
+- [ ] After ~10 samples, confirm on the server: `photos/batch/<session>/` holds, per sample,
+ `<SKU>_psku_original.jpg` + `<SKU>_info_original.jpg` (untouched), matching `_master.jpg`
+ (WB+exposure+slider-corrected, cropped) and `_web.jpg` (~1600px). A single-shot short-circuit
+ keeps the legacy `<SKU>_original/_master/_web.jpg` names. The session `.jsonl` manifest has one
+ line per shot (side recorded).
- [ ] **Reload mid-batch** (durable queue): pull-to-refresh while a few are still uploading →
the queue count survives the reload and keeps draining (IndexedDB). Nothing is lost offline.
- [ ] **Thermal:** during a long run, if the device warms the cadence should visibly back off
@@ -114,5 +127,7 @@ auto-lock set to Never.
- **WB/exposure/focus "LOCK" is software** (enforced against the calibration frame), not hardware.
- **Master crop is axis-aligned** (copy-stand square-on). True 4-corner perspective warp + 24-patch
ColorChecker CCM/ΔE + a Shopify batch-attach are the **v1.1** backlog.
-- Two samples that OCR to the **same SKU** in one session overwrite each other's files (the manifest
- still records both by seq+timestamp) — resolve duplicate SKUs at the keypad.
+- Two *different* samples that OCR to the **same SKU** in one session overwrite each other's files
+ for that side (the manifest still records both by seq+timestamp) — resolve duplicate SKUs at the
+ keypad. (PSku vs Info of the *same* sample no longer collide: they are side-named.)
+- Slider corrections are baked into `_master`/`_web` only; `_original` is always the raw frame.
← 23bf804 Batch capture: harden against camera death + low-confidence
·
back to Dw Photo Capture
·
auto-data-snapshot: 2026-09-19T09:59:20 (4 data files) — dat 7a758b5 →