[object Object]

← 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 →