← back to Dw Photo Capture
auto-data-snapshot: 2026-09-19T11:34:41 (7 data files) — 5x/out/features-sweep6.json 5x/out/features-sweep7.json 5x/out/features-sweep8.json 5x/out/s8-dryrun-9890.json 5x/out/s8-dryrun-9899-FM.json
767d07cb213181f91bd9265a26f218bcb03cfbd8 · 2026-09-19 11:35:12 -0700 · auto-commit-fleet
Files touched
M 5x/out/features-sweep6.jsonA 5x/out/features-sweep7.jsonA 5x/out/features-sweep8.jsonA 5x/out/s8-dryrun-9890.jsonA 5x/out/s8-dryrun-9899-FM.jsonM data/build.jsonM data/scan-log.jsonl
Diff
commit 767d07cb213181f91bd9265a26f218bcb03cfbd8
Author: auto-commit-fleet <steve@designerwallcoverings.com>
Date: Sat Sep 19 11:35:12 2026 -0700
auto-data-snapshot: 2026-09-19T11:34:41 (7 data files) — 5x/out/features-sweep6.json 5x/out/features-sweep7.json 5x/out/features-sweep8.json 5x/out/s8-dryrun-9890.json 5x/out/s8-dryrun-9899-FM.json
---
5x/out/features-sweep6.json | 2 +-
5x/out/features-sweep7.json | 1 +
5x/out/features-sweep8.json | 1 +
5x/out/s8-dryrun-9890.json | 1 +
5x/out/s8-dryrun-9899-FM.json | 1 +
data/build.json | 6 ++++--
data/scan-log.jsonl | 6 ++++++
7 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/5x/out/features-sweep6.json b/5x/out/features-sweep6.json
index 35f1998..a00aeb9 100644
--- a/5x/out/features-sweep6.json
+++ b/5x/out/features-sweep6.json
@@ -1 +1 @@
-{"sweep":"6","base":"http://127.0.0.1:9890","local":"http://127.0.0.1:9890","fm":"http://127.0.0.1:9899","at":"2026-09-19T18:00:55.366Z","secs":0,"total":0,"passed":0,"failed":0,"skipped":0,"gemini_cost_usd":0,"gemini_calls":0,"results":[]}
\ No newline at end of file
+{"sweep":"6","base":"http://127.0.0.1:9890","local":"http://127.0.0.1:9890","fm":"http://127.0.0.1:9899","at":"2026-09-19T18:11:48.914Z","secs":22,"total":52,"passed":50,"failed":2,"skipped":0,"gemini_cost_usd":0.0012,"gemini_calls":2,"results":[{"id":"F2.0","name":"numbered Front(1)/Back(2) tiles","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"fn\":\"1\",\"bn\":\"2\"}"},{"id":"F2.1","name":"gate text: empty → \"take Photo 1 / FRONT\"","engine":"chromium","vp":"ipad","pass":true,"detail":"📷 Step 1 — take the FRONT (pattern) photo."},{"id":"F2.2","name":"create blocked with no photos (\"Take Photo 1\")","engine":"chromium","vp":"ipad","pass":true,"detail":"📷 Take Photo 1 — the FRONT (pattern) face."},{"id":"F5.0","name":"WB live camera opened","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F5.1","name":"tap-a-white-point sets numeric gains that neutralise the warm cast","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ White point set (R×0.89 G×1.03 B×1.10) — new photos render true. Tap | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.2","name":"✨ Auto (gray-world) sets gains","engine":"chromium","vp":"ipad","pass":true,"detail":"✨ Auto (gray-world) white balance set — new photos render tr | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.3","name":"↺ Clear resets gains + hides Clear","engine":"chromium","vp":"ipad","pass":true,"detail":"White balance cleared. Tap a white/grey area to set it again"},{"id":"F5.4","name":"WB gains persist across reload (readout says SET, Clear offered)","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ White balance is SET — tap a white/grey area to re-set, or ↺ Clear."},{"id":"F4.0","name":"Measure live camera opened","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F4.1","name":"first open → set-scale mode with a numeric px/in (not \"…\", not NaN)","engine":"chromium","vp":"ipad","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.2","name":"Set scale → measure mode shows numeric W/L inches","engine":"chromium","vp":"ipad","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance"},{"id":"F4.3","name":"↺ Set scale (card) re-enters calibrate with numeric ppi","engine":"chromium","vp":"ipad","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.4","name":"REGRESSION: recal → set-scale never dead-ends; W/L numeric, ppi>0 saved","engine":"chromium","vp":"ipad","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance | ppi=40"},{"id":"F4.5","name":"Use W×L writes the measured spec into the item","engine":"chromium","vp":"ipad","pass":true,"detail":"📐 Measured5.3\" × 6.8\""},{"id":"F2.3","name":"after Photo 1: tile ✓ + gate says \"take Photo 2 / BACK\"","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Step 2 — now take the BACK (label) photo."},{"id":"F2.4","name":"create blocked with one photo (\"Take Photo 2\")","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Take Photo 2 — the BACK (label / SKU)."},{"id":"F6.0","name":"colour chip + HEX + colourway name after the front photo (WB applied)","engine":"chromium","vp":"ipad","pass":true,"detail":"Navy #20365fUse “Navy” | field=Navy"},{"id":"F2.5","name":"after Photo 2: tile ✓ + mfr info determined (auto | candidates | manual — never silent)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"st\":\"✓ mfr info read from the 2 photos — review & edit below\",\"mfr\":\"TR2581\",\"cand\":false,\"nCand\":0,\"vendor\":\"Anna French\",\"name\":\"Watercolor Stripe\",\"src\":\"auto\",\"haveB\":true}"},{"id":"F3.real","name":"real OCR path outcome (recorded, informational)","engine":"chromium","vp":"ipad","pass":true,"detail":"src=auto mfr=TR2581 cand=0 name=Watercolor Stripe"},{"id":"F2.6","name":"gate: both photos, no mfr# → \"Pick or type mfr#\"","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.7","name":"create BLOCKED until an mfr# exists","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.8","name":"gate OK once mfr# typed (\"✓ mfr# … review & Preview\")","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ mfr# ZZTEST-5X — review & Preview"},{"id":"F2.9","name":"DRY-RUN preview: DWAT- DW#, Shopify DRAFT, staging + FileMaker sections, nothing created","engine":"chromium","vp":"ipad","pass":true,"detail":"Preview — nothing created yet (all 3 systems). | DWAT-336001"},{"id":"F2","name":"test threw","engine":"chromium","vp":"ipad","pass":false,"detail":"page.evaluate: TypeError: Cannot read properties of null (reading 'hidden')"},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"GUARD","name":"commit:true requests intercepted by harness (linear flow)","engine":"chromium","vp":"ipad","pass":true,"detail":"[{\"mfr\":\"ZZTEST-5X\",\"vendor\":\"Anna French\",\"ts\":1789841497583}]"},{"id":"F2.0","name":"numbered Front(1)/Back(2) tiles","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"fn\":\"1\",\"bn\":\"2\"}"},{"id":"F2.1","name":"gate text: empty → \"take Photo 1 / FRONT\"","engine":"chromium","vp":"iphone","pass":true,"detail":"📷 Step 1 — take the FRONT (pattern) photo."},{"id":"F2.2","name":"create blocked with no photos (\"Take Photo 1\")","engine":"chromium","vp":"iphone","pass":true,"detail":"📷 Take Photo 1 — the FRONT (pattern) face."},{"id":"F5.0","name":"WB live camera opened","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F5.1","name":"tap-a-white-point sets numeric gains that neutralise the warm cast","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ White point set (R×0.89 G×1.03 B×1.10) — new photos render true. Tap | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.2","name":"✨ Auto (gray-world) sets gains","engine":"chromium","vp":"iphone","pass":true,"detail":"✨ Auto (gray-world) white balance set — new photos render tr | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.3","name":"↺ Clear resets gains + hides Clear","engine":"chromium","vp":"iphone","pass":true,"detail":"White balance cleared. Tap a white/grey area to set it again"},{"id":"F5.4","name":"WB gains persist across reload (readout says SET, Clear offered)","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ White balance is SET — tap a white/grey area to re-set, or ↺ Clear."},{"id":"F4.0","name":"Measure live camera opened","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F4.1","name":"first open → set-scale mode with a numeric px/in (not \"…\", not NaN)","engine":"chromium","vp":"iphone","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.2","name":"Set scale → measure mode shows numeric W/L inches","engine":"chromium","vp":"iphone","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance"},{"id":"F4.3","name":"↺ Set scale (card) re-enters calibrate with numeric ppi","engine":"chromium","vp":"iphone","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.4","name":"REGRESSION: recal → set-scale never dead-ends; W/L numeric, ppi>0 saved","engine":"chromium","vp":"iphone","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance | ppi=40"},{"id":"F4.5","name":"Use W×L writes the measured spec into the item","engine":"chromium","vp":"iphone","pass":true,"detail":"📐 Measured5.3\" × 6.8\""},{"id":"F2.3","name":"after Photo 1: tile ✓ + gate says \"take Photo 2 / BACK\"","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Step 2 — now take the BACK (label) photo."},{"id":"F2.4","name":"create blocked with one photo (\"Take Photo 2\")","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Take Photo 2 — the BACK (label / SKU)."},{"id":"F6.0","name":"colour chip + HEX + colourway name after the front photo (WB applied)","engine":"chromium","vp":"iphone","pass":true,"detail":"Navy #20365fUse “Navy” | field=Navy"},{"id":"F2.5","name":"after Photo 2: tile ✓ + mfr info determined (auto | candidates | manual — never silent)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"st\":\"✓ mfr info read from the 2 photos — review & edit below\",\"mfr\":\"TR2581\",\"cand\":false,\"nCand\":0,\"vendor\":\"Anna French\",\"name\":\"Watercolor Stripe\",\"src\":\"auto\",\"haveB\":true}"},{"id":"F3.real","name":"real OCR path outcome (recorded, informational)","engine":"chromium","vp":"iphone","pass":true,"detail":"src=auto mfr=TR2581 cand=0 name=Watercolor Stripe"},{"id":"F2.6","name":"gate: both photos, no mfr# → \"Pick or type mfr#\"","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.7","name":"create BLOCKED until an mfr# exists","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.8","name":"gate OK once mfr# typed (\"✓ mfr# … review & Preview\")","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ mfr# ZZTEST-5X — review & Preview"},{"id":"F2.9","name":"DRY-RUN preview: DWAT- DW#, Shopify DRAFT, staging + FileMaker sections, nothing created","engine":"chromium","vp":"iphone","pass":true,"detail":"Preview — nothing created yet (all 3 systems). | DWAT-336001"},{"id":"F2","name":"test threw","engine":"chromium","vp":"iphone","pass":false,"detail":"page.evaluate: TypeError: Cannot read properties of null (reading 'hidden')"},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"GUARD","name":"commit:true requests intercepted by harness (linear flow)","engine":"chromium","vp":"iphone","pass":true,"detail":"[{\"mfr\":\"ZZTEST-5X\",\"vendor\":\"Anna French\",\"ts\":1789841508790}]"}]}
\ No newline at end of file
diff --git a/5x/out/features-sweep7.json b/5x/out/features-sweep7.json
new file mode 100644
index 0000000..b79bfb1
--- /dev/null
+++ b/5x/out/features-sweep7.json
@@ -0,0 +1 @@
+{"sweep":"7","base":"http://127.0.0.1:9890","local":"http://127.0.0.1:9890","fm":"http://127.0.0.1:9899","at":"2026-09-19T18:14:01.970Z","secs":18,"total":56,"passed":56,"failed":0,"skipped":0,"gemini_cost_usd":0.0012,"gemini_calls":2,"results":[{"id":"F2.0","name":"numbered Front(1)/Back(2) tiles","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"fn\":\"1\",\"bn\":\"2\"}"},{"id":"F2.1","name":"gate text: empty → \"take Photo 1 / FRONT\"","engine":"chromium","vp":"ipad","pass":true,"detail":"📷 Step 1 — take the FRONT (pattern) photo."},{"id":"F2.2","name":"create blocked with no photos (\"Take Photo 1\")","engine":"chromium","vp":"ipad","pass":true,"detail":"📷 Take Photo 1 — the FRONT (pattern) face."},{"id":"F5.0","name":"WB live camera opened","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F5.1","name":"tap-a-white-point sets numeric gains that neutralise the warm cast","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ White point set (R×0.89 G×1.03 B×1.10) — new photos render true. Tap | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.2","name":"✨ Auto (gray-world) sets gains","engine":"chromium","vp":"ipad","pass":true,"detail":"✨ Auto (gray-world) white balance set — new photos render tr | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.3","name":"↺ Clear resets gains + hides Clear","engine":"chromium","vp":"ipad","pass":true,"detail":"White balance cleared. Tap a white/grey area to set it again"},{"id":"F5.4","name":"WB gains persist across reload (readout says SET, Clear offered)","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ White balance is SET — tap a white/grey area to re-set, or ↺ Clear."},{"id":"F4.0","name":"Measure live camera opened","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F4.1","name":"first open → set-scale mode with a numeric px/in (not \"…\", not NaN)","engine":"chromium","vp":"ipad","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.2","name":"Set scale → measure mode shows numeric W/L inches","engine":"chromium","vp":"ipad","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance"},{"id":"F4.3","name":"↺ Set scale (card) re-enters calibrate with numeric ppi","engine":"chromium","vp":"ipad","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.4","name":"REGRESSION: recal → set-scale never dead-ends; W/L numeric, ppi>0 saved","engine":"chromium","vp":"ipad","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance | ppi=40"},{"id":"F4.5","name":"Use W×L writes the measured spec into the item","engine":"chromium","vp":"ipad","pass":true,"detail":"📐 Measured5.3\" × 6.8\""},{"id":"F2.3","name":"after Photo 1: tile ✓ + gate says \"take Photo 2 / BACK\"","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Step 2 — now take the BACK (label) photo."},{"id":"F2.4","name":"create blocked with one photo (\"Take Photo 2\")","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Take Photo 2 — the BACK (label / SKU)."},{"id":"F6.0","name":"colour chip + HEX + colourway name after the front photo (WB applied)","engine":"chromium","vp":"ipad","pass":true,"detail":"Navy #20365fUse “Navy” | field=Navy"},{"id":"F2.5","name":"after Photo 2: tile ✓ + mfr info determined (auto | candidates | manual — never silent)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"st\":\"✓ mfr info read from the 2 photos — review & edit below\",\"mfr\":\"TR2581\",\"cand\":false,\"nCand\":0,\"vendor\":\"Anna French\",\"name\":\"Watercolor Stripe\",\"src\":\"auto\",\"haveB\":true}"},{"id":"F3.real","name":"real OCR path outcome (recorded, informational)","engine":"chromium","vp":"ipad","pass":true,"detail":"src=auto mfr=TR2581 cand=0 name=Watercolor Stripe"},{"id":"F2.6","name":"gate: both photos, no mfr# → \"Pick or type mfr#\"","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.7","name":"create BLOCKED until an mfr# exists","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.8","name":"gate OK once mfr# typed (\"✓ mfr# … review & Preview\")","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ mfr# ZZTEST-5X — review & Preview"},{"id":"F2.9","name":"DRY-RUN preview: DWAT- DW#, Shopify DRAFT, staging + FileMaker sections, nothing created","engine":"chromium","vp":"ipad","pass":true,"detail":"Preview — nothing created yet (all 3 systems). | DWAT-336001"},{"id":"F7.0","name":"session count increments after create","engine":"chromium","vp":"ipad","pass":true,"detail":"1 this session"},{"id":"F7.1","name":"Next item clears photos + mfr + name + colour and jumps to Photo 1","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"mfr\":\"\",\"name\":\"\",\"col\":\"\",\"f\":false,\"b\":false,\"st\":\"📷 Step 1 — take the FRONT (pattern) photo.\"}"},{"id":"F7.2","name":"Next item KEEPS sticky vendor + Measure-Depth scale + White-Balance; count kept","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"v\":\"Anna French\",\"cal\":true,\"wb\":true,\"sess\":\"1 this session\"}"},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"GUARD","name":"commit:true requests intercepted by harness (linear flow)","engine":"chromium","vp":"ipad","pass":true,"detail":"[{\"mfr\":\"ZZTEST-5X\",\"vendor\":\"Anna French\",\"ts\":1789841632372}]"},{"id":"F2.0","name":"numbered Front(1)/Back(2) tiles","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"fn\":\"1\",\"bn\":\"2\"}"},{"id":"F2.1","name":"gate text: empty → \"take Photo 1 / FRONT\"","engine":"chromium","vp":"iphone","pass":true,"detail":"📷 Step 1 — take the FRONT (pattern) photo."},{"id":"F2.2","name":"create blocked with no photos (\"Take Photo 1\")","engine":"chromium","vp":"iphone","pass":true,"detail":"📷 Take Photo 1 — the FRONT (pattern) face."},{"id":"F5.0","name":"WB live camera opened","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F5.1","name":"tap-a-white-point sets numeric gains that neutralise the warm cast","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ White point set (R×0.89 G×1.03 B×1.10) — new photos render true. Tap | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.2","name":"✨ Auto (gray-world) sets gains","engine":"chromium","vp":"iphone","pass":true,"detail":"✨ Auto (gray-world) white balance set — new photos render tr | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.3","name":"↺ Clear resets gains + hides Clear","engine":"chromium","vp":"iphone","pass":true,"detail":"White balance cleared. Tap a white/grey area to set it again"},{"id":"F5.4","name":"WB gains persist across reload (readout says SET, Clear offered)","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ White balance is SET — tap a white/grey area to re-set, or ↺ Clear."},{"id":"F4.0","name":"Measure live camera opened","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F4.1","name":"first open → set-scale mode with a numeric px/in (not \"…\", not NaN)","engine":"chromium","vp":"iphone","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.2","name":"Set scale → measure mode shows numeric W/L inches","engine":"chromium","vp":"iphone","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance"},{"id":"F4.3","name":"↺ Set scale (card) re-enters calibrate with numeric ppi","engine":"chromium","vp":"iphone","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.4","name":"REGRESSION: recal → set-scale never dead-ends; W/L numeric, ppi>0 saved","engine":"chromium","vp":"iphone","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance | ppi=40"},{"id":"F4.5","name":"Use W×L writes the measured spec into the item","engine":"chromium","vp":"iphone","pass":true,"detail":"📐 Measured5.3\" × 6.8\""},{"id":"F2.3","name":"after Photo 1: tile ✓ + gate says \"take Photo 2 / BACK\"","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Step 2 — now take the BACK (label) photo."},{"id":"F2.4","name":"create blocked with one photo (\"Take Photo 2\")","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Take Photo 2 — the BACK (label / SKU)."},{"id":"F6.0","name":"colour chip + HEX + colourway name after the front photo (WB applied)","engine":"chromium","vp":"iphone","pass":true,"detail":"Navy #20365fUse “Navy” | field=Navy"},{"id":"F2.5","name":"after Photo 2: tile ✓ + mfr info determined (auto | candidates | manual — never silent)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"st\":\"✓ mfr info read from the 2 photos — review & edit below\",\"mfr\":\"TR2581\",\"cand\":false,\"nCand\":0,\"vendor\":\"Anna French\",\"name\":\"Watercolor Stripe\",\"src\":\"auto\",\"haveB\":true}"},{"id":"F3.real","name":"real OCR path outcome (recorded, informational)","engine":"chromium","vp":"iphone","pass":true,"detail":"src=auto mfr=TR2581 cand=0 name=Watercolor Stripe"},{"id":"F2.6","name":"gate: both photos, no mfr# → \"Pick or type mfr#\"","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.7","name":"create BLOCKED until an mfr# exists","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.8","name":"gate OK once mfr# typed (\"✓ mfr# … review & Preview\")","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ mfr# ZZTEST-5X — review & Preview"},{"id":"F2.9","name":"DRY-RUN preview: DWAT- DW#, Shopify DRAFT, staging + FileMaker sections, nothing created","engine":"chromium","vp":"iphone","pass":true,"detail":"Preview — nothing created yet (all 3 systems). | DWAT-336001"},{"id":"F7.0","name":"session count increments after create","engine":"chromium","vp":"iphone","pass":true,"detail":"1 this session"},{"id":"F7.1","name":"Next item clears photos + mfr + name + colour and jumps to Photo 1","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"mfr\":\"\",\"name\":\"\",\"col\":\"\",\"f\":false,\"b\":false,\"st\":\"📷 Step 1 — take the FRONT (pattern) photo.\"}"},{"id":"F7.2","name":"Next item KEEPS sticky vendor + Measure-Depth scale + White-Balance; count kept","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"v\":\"Anna French\",\"cal\":true,\"wb\":true,\"sess\":\"1 this session\"}"},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"GUARD","name":"commit:true requests intercepted by harness (linear flow)","engine":"chromium","vp":"iphone","pass":true,"detail":"[{\"mfr\":\"ZZTEST-5X\",\"vendor\":\"Anna French\",\"ts\":1789841641474}]"}]}
\ No newline at end of file
diff --git a/5x/out/features-sweep8.json b/5x/out/features-sweep8.json
new file mode 100644
index 0000000..5d7eb4e
--- /dev/null
+++ b/5x/out/features-sweep8.json
@@ -0,0 +1 @@
+{"sweep":"8","base":"http://127.0.0.1:9890","local":"http://127.0.0.1:9890","fm":"http://127.0.0.1:9899","at":"2026-09-19T18:14:54.989Z","secs":36,"total":159,"passed":157,"failed":2,"skipped":0,"gemini_cost_usd":0.0012,"gemini_calls":2,"results":[{"id":"F10.1","name":"/manifest.webmanifest 200 (manifest+json)","engine":"http","vp":"http://127.0.0.1:9890","pass":true,"detail":"{\"status\":200,\"type\":\"application/manifest+json\",\"len\":0}"},{"id":"F10.2","name":"/apple-touch-icon.png 200 (image/png)","engine":"http","vp":"http://127.0.0.1:9890","pass":true,"detail":"{\"status\":200,\"type\":\"image/png\",\"len\":0}"},{"id":"F11.9899-FM","name":"dry-run create-item (http://127.0.0.1:9899) → ok, DWAT- preview, draft, staging + filemaker, nothing created","engine":"http","vp":"9899-FM","pass":true,"detail":"dw_sku=DWAT-336001 draft=draft fm=WALLPAPER/*List Wallpapers - Full View fmFields=8 flags=[\"no FileMaker vid resolved for series DWAT — set WALLPAPER.vid manually or add a vid mapping\"]"},{"id":"F11.9890","name":"dry-run create-item (http://127.0.0.1:9890) → ok, DWAT- preview, draft, staging + filemaker, nothing created","engine":"http","vp":"9890","pass":true,"detail":"dw_sku=DWAT-336001 draft=draft fm=WALLPAPER/*List Wallpapers - Full View fmFields=8 flags=[\"no FileMaker vid resolved for series DWAT — set WALLPAPER.vid manually or add a vid mapping\"]"},{"id":"B0","name":"/batch serves 200 text/html with auth (toolpanel + pv canvas in markup), 401 without","engine":"http","vp":"local","pass":true,"detail":"auth=200 noauth=401 tools=true pv=true"},{"id":"B1","name":"meta.side=psku → <SKU>_psku_{original,master,web}.jpg written + served","engine":"http","vp":"local","pass":true,"detail":"status=200 paths={\"original\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH_psku_original.jpg\",\"master\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH_psku_master.jpg\",\"web\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH_psku_web.jpg\"} readback=[200,200,200] errors=[]"},{"id":"B2","name":"meta.side=info on the SAME sku → <SKU>_info_*.jpg written; psku files NOT overwritten (both sets, distinct bytes)","engine":"http","vp":"local","pass":true,"detail":"info=[200,200,200] psku_orig 3612→3612B info_orig 53116B"},{"id":"B3","name":"no side (single shot) → legacy <SKU>_{original,master,web}.jpg (back-compat)","engine":"http","vp":"local","pass":true,"detail":"paths={\"original\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH_original.jpg\",\"master\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH_master.jpg\",\"web\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH_web.jpg\"} readback=[200,200,200]"},{"id":"B4","name":"unknown side (zzz / ../../evil / 42) → falls back to legacy naming; side never reaches the filename","engine":"http","vp":"local","pass":true,"detail":"{\"web\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH-B4_web.jpg\"} | {\"web\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH-B4_web.jpg\"} | {\"web\":\"/photos/batch/5x-8-1789841660288/ZZ5X-BATCH-B4_web.jpg\"}"},{"id":"B5","name":"re-shoot same sku+side → 200 ok, identical paths (overwrite, no dup files); manifest = one clean JSON line per accepted POST","engine":"http","vp":"local","pass":true,"detail":"paths_same=true manifest=7 lines / 7 accepted sides=[\"psku\",\"info\",null,\"zzz\",\"../../evil\",42,\"psku\"]"},{"id":"B6","name":"degenerate <200B blob rejected per-variant (master still saved); all-degenerate → 500 ok:false; traversal in session/sku sanitized + /photos/.. → 404; empty/no-variant → 400","engine":"http","vp":"local","pass":true,"detail":"b6a=200/[\"original: size 4\"] b6b=500 b6c=200:{\"web\":\"/photos/batch/......etc/....server.js_web.jpg\"} b6d=400 b6e=400 trav=404/404/404"},{"id":"B7.0","name":"Resume → shoot view; movable tools panel renders center-bottom, on-screen, expanded","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"shoot\":true,\"tools\":true,\"tog\":\"▾\",\"onScreen\":true,\"centered\":true,\"hBatch\":\"5x Harness ui\"}"},{"id":"B7.1","name":"Brightness/Warmth/Hue sliders at 0 (+ labels), Reset present; SKU + vendor/pattern/colour fields + shutter in the panel","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"sliders\":[\"0\",\"0\",\"0\"],\"labels\":[\"0\",\"0\",\"0\"],\"reset\":true,\"fields\":true}"},{"id":"B7.2","name":"Auto-snap is UNCHECKED by default (operator-paced)","engine":"chromium","vp":"ipad","pass":true,"detail":"checked=false"},{"id":"B7.3","name":"side badge starts on \"PSku Photo\"; WYSIWYG preview canvas #pv + overlay #ov both present","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"badge\":\"PSku Photo\",\"pv\":true,\"ov\":true}"},{"id":"B7.4","name":"shoot view fills the viewport (100dvh)","engine":"chromium","vp":"ipad","pass":true,"detail":"stage=1366 inner=1366"},{"id":"B7.5","name":"fake camera opens → live WYSIWYG preview canvas is sized + painting frames","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"cam\":true,\"w\":640,\"h\":480,\"nonzero\":true}"},{"id":"B7.6","name":"panel toggle collapses (body hidden, ▸, persisted) and re-expands (▾)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"col\":{\"c\":true,\"t\":\"▸\",\"bodyShown\":false,\"ls\":{\"collapsed\":true}},\"exp\":{\"c\":false,\"t\":\"▾\",\"bodyShown\":true}}"},{"id":"B7.7","name":"slider changes persist to localStorage dwbatch.tune and survive a reload (sticky to the next photo)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"t1\":{\"ls\":{\"bright\":25,\"warm\":-40,\"hue\":0},\"lb\":\"25\",\"lw\":\"-40\"},\"t2\":{\"b\":\"25\",\"w\":\"-40\",\"h\":\"0\",\"lb\":\"25\"}}"},{"id":"B7.8","name":"↺ Reset colour → all sliders 0 and persisted 0","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"ls\":{\"bright\":0,\"warm\":0,\"hue\":0},\"v\":[\"0\",\"0\",\"0\"]}"},{"id":"B7.10","name":"Resume (\"Pick up where I left off\") reloads the persisted gray-card calibration → straight to SHOOT, CAL chip = ok (not none), no DRIFT overlay","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"chip\":\"ok\",\"cls\":\"d ok\",\"calStored\":true,\"resumePaths\":[\"calib\",\"shoot\"]}"},{"id":"B7.11","name":"Resume with NO stored calibration falls through to the CALIB view (same as Start) and #cSave stores a self-consistent cal","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"first\":\"calib\",\"calStored\":true}"},{"id":"B7.9","name":"harness guard: no real /api/batch-shot writes, no /api/identify (Gemini) calls reached the server from the UI test","engine":"chromium","vp":"ipad","pass":true,"detail":"batch-shot intercepted=0 identify intercepted=0"},{"id":"ERR","name":"zero console errors + zero pageerrors (batch shoot UI)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"B7.0","name":"Resume → shoot view; movable tools panel renders center-bottom, on-screen, expanded","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"shoot\":true,\"tools\":true,\"tog\":\"▾\",\"onScreen\":true,\"centered\":true,\"hBatch\":\"5x Harness ui\"}"},{"id":"B7.1","name":"Brightness/Warmth/Hue sliders at 0 (+ labels), Reset present; SKU + vendor/pattern/colour fields + shutter in the panel","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"sliders\":[\"0\",\"0\",\"0\"],\"labels\":[\"0\",\"0\",\"0\"],\"reset\":true,\"fields\":true}"},{"id":"B7.2","name":"Auto-snap is UNCHECKED by default (operator-paced)","engine":"chromium","vp":"iphone","pass":true,"detail":"checked=false"},{"id":"B7.3","name":"side badge starts on \"PSku Photo\"; WYSIWYG preview canvas #pv + overlay #ov both present","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"badge\":\"PSku Photo\",\"pv\":true,\"ov\":true}"},{"id":"B7.4","name":"shoot view fills the viewport (100dvh)","engine":"chromium","vp":"iphone","pass":true,"detail":"stage=844 inner=844"},{"id":"B7.5","name":"fake camera opens → live WYSIWYG preview canvas is sized + painting frames","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"cam\":true,\"w\":640,\"h\":480,\"nonzero\":true}"},{"id":"B7.6","name":"panel toggle collapses (body hidden, ▸, persisted) and re-expands (▾)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"col\":{\"c\":true,\"t\":\"▸\",\"bodyShown\":false,\"ls\":{\"collapsed\":true}},\"exp\":{\"c\":false,\"t\":\"▾\",\"bodyShown\":true}}"},{"id":"B7.7","name":"slider changes persist to localStorage dwbatch.tune and survive a reload (sticky to the next photo)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"t1\":{\"ls\":{\"bright\":25,\"warm\":-40,\"hue\":0},\"lb\":\"25\",\"lw\":\"-40\"},\"t2\":{\"b\":\"25\",\"w\":\"-40\",\"h\":\"0\",\"lb\":\"25\"}}"},{"id":"B7.8","name":"↺ Reset colour → all sliders 0 and persisted 0","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"ls\":{\"bright\":0,\"warm\":0,\"hue\":0},\"v\":[\"0\",\"0\",\"0\"]}"},{"id":"B7.10","name":"Resume (\"Pick up where I left off\") reloads the persisted gray-card calibration → straight to SHOOT, CAL chip = ok (not none), no DRIFT overlay","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"chip\":\"ok\",\"cls\":\"d ok\",\"calStored\":true,\"resumePaths\":[\"calib\",\"shoot\"]}"},{"id":"B7.11","name":"Resume with NO stored calibration falls through to the CALIB view (same as Start) and #cSave stores a self-consistent cal","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"first\":\"calib\",\"calStored\":true}"},{"id":"B7.9","name":"harness guard: no real /api/batch-shot writes, no /api/identify (Gemini) calls reached the server from the UI test","engine":"chromium","vp":"iphone","pass":true,"detail":"batch-shot intercepted=0 identify intercepted=0"},{"id":"ERR","name":"zero console errors + zero pageerrors (batch shoot UI)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F1.0","name":"live camera stream opened (fake device)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F1.1","name":"/api/vendors-registry loads into the sticky bar","engine":"chromium","vp":"ipad","pass":true,"detail":"368 vendors"},{"id":"F1.2","name":"XL vendor text ≥ 24px","engine":"chromium","vp":"ipad","pass":true,"detail":"24px"},{"id":"F1.3","name":"bar is pinned to the top of the live camera, full-width, hit-testable","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"top\":0,\"liveTop\":0,\"w\":1024,\"vw\":1024,\"hit\":\"stickyVendor\",\"selRight\":1012}"},{"id":"F1.4","name":"pick persists (localStorage) + meta shows the series","engine":"chromium","vp":"ipad","pass":true,"detail":"Anna French | Series DWAT · next DW# on Preview · FM vid unresolved"},{"id":"F1.5","name":"survives reload: shown in the top bar + mirrored into the modal picker","engine":"chromium","vp":"ipad","pass":true,"detail":"sticky=Anna French modal=Anna French"},{"id":"ERR","name":"zero console errors + zero pageerrors (vendor bar)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F1t.1","name":"modal twin picker loads the registry, XL text ≥ 24px","engine":"chromium","vp":"ipad","pass":true,"detail":"368 vendors, 24px"},{"id":"F1t.2","name":"vendor pick survives reload (localStorage) in the twin picker","engine":"chromium","vp":"ipad","pass":true,"detail":"ls=Anna French after=Anna French"},{"id":"F2t","name":"Front(1) then Back(2) numbered tiles render","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"f\":true,\"b\":true,\"fn\":\"1\",\"bn\":\"2\",\"ft\":true,\"bt\":true}"},{"id":"F2m","name":"add modal fits the viewport or is scrollable (every control reachable)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"top\":169,\"bottom\":1197,\"vh\":1366,\"ov\":\"auto\",\"cardOv\":\"visible\"}"},{"id":"ERR","name":"zero console errors + zero pageerrors (twin picker)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F2.0","name":"numbered Front(1)/Back(2) tiles","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"fn\":\"1\",\"bn\":\"2\"}"},{"id":"F2.1","name":"gate text: empty → \"take Photo 1 / FRONT\"","engine":"chromium","vp":"ipad","pass":true,"detail":"📷 Step 1 — take the FRONT (pattern) photo."},{"id":"F2.2","name":"create blocked with no photos (\"Take Photo 1\")","engine":"chromium","vp":"ipad","pass":true,"detail":"📷 Take Photo 1 — the FRONT (pattern) face."},{"id":"F5.0","name":"WB live camera opened","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F5.1","name":"tap-a-white-point sets numeric gains that neutralise the warm cast","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ White point set (R×0.89 G×1.03 B×1.10) — new photos render true. Tap | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.2","name":"✨ Auto (gray-world) sets gains","engine":"chromium","vp":"ipad","pass":true,"detail":"✨ Auto (gray-world) white balance set — new photos render tr | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.3","name":"↺ Clear resets gains + hides Clear","engine":"chromium","vp":"ipad","pass":true,"detail":"White balance cleared. Tap a white/grey area to set it again"},{"id":"F5.4","name":"WB gains persist across reload (readout says SET, Clear offered)","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ White balance is SET — tap a white/grey area to re-set, or ↺ Clear."},{"id":"F4.0","name":"Measure live camera opened","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F4.1","name":"first open → set-scale mode with a numeric px/in (not \"…\", not NaN)","engine":"chromium","vp":"ipad","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.2","name":"Set scale → measure mode shows numeric W/L inches","engine":"chromium","vp":"ipad","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance"},{"id":"F4.3","name":"↺ Set scale (card) re-enters calibrate with numeric ppi","engine":"chromium","vp":"ipad","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.4","name":"REGRESSION: recal → set-scale never dead-ends; W/L numeric, ppi>0 saved","engine":"chromium","vp":"ipad","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance | ppi=40"},{"id":"F4.5","name":"Use W×L writes the measured spec into the item","engine":"chromium","vp":"ipad","pass":true,"detail":"📐 Measured5.3\" × 6.8\""},{"id":"F2.3","name":"after Photo 1: tile ✓ + gate says \"take Photo 2 / BACK\"","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Step 2 — now take the BACK (label) photo."},{"id":"F2.4","name":"create blocked with one photo (\"Take Photo 2\")","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Take Photo 2 — the BACK (label / SKU)."},{"id":"F6.0","name":"colour chip + HEX + colourway name after the front photo (WB applied)","engine":"chromium","vp":"ipad","pass":true,"detail":"Navy #20365fUse “Navy” | field=Navy"},{"id":"F2.5","name":"after Photo 2: tile ✓ + mfr info determined (auto | candidates | manual — never silent)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"st\":\"✓ mfr info read from the 2 photos — review & edit below\",\"mfr\":\"TR2581\",\"cand\":false,\"nCand\":0,\"vendor\":\"Anna French\",\"name\":\"Watercolor Stripe\",\"src\":\"auto\",\"haveB\":true}"},{"id":"F3.real","name":"real OCR path outcome (recorded, informational)","engine":"chromium","vp":"ipad","pass":true,"detail":"src=auto mfr=TR2581 cand=0 name=Watercolor Stripe"},{"id":"F2.6","name":"gate: both photos, no mfr# → \"Pick or type mfr#\"","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.7","name":"create BLOCKED until an mfr# exists","engine":"chromium","vp":"ipad","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.8","name":"gate OK once mfr# typed (\"✓ mfr# … review & Preview\")","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ mfr# ZZTEST-5X — review & Preview"},{"id":"F2.9","name":"DRY-RUN preview: DWAT- DW#, Shopify DRAFT, staging + FileMaker sections, nothing created","engine":"chromium","vp":"ipad","pass":true,"detail":"Preview — nothing created yet (all 3 systems). | DWAT-336001"},{"id":"F7.0","name":"session count increments after create","engine":"chromium","vp":"ipad","pass":true,"detail":"1 this session"},{"id":"F7.1","name":"Next item clears photos + mfr + name + colour and jumps to Photo 1","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"mfr\":\"\",\"name\":\"\",\"col\":\"\",\"f\":false,\"b\":false,\"st\":\"📷 Step 1 — take the FRONT (pattern) photo.\"}"},{"id":"F7.2","name":"Next item KEEPS sticky vendor + Measure-Depth scale + White-Balance; count kept","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"v\":\"Anna French\",\"cal\":true,\"wb\":true,\"sess\":\"1 this session\"}"},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"GUARD","name":"commit:true requests intercepted by harness (linear flow)","engine":"chromium","vp":"ipad","pass":true,"detail":"[{\"mfr\":\"ZZTEST-5X\",\"vendor\":\"Anna French\",\"ts\":1789841676881}]"},{"id":"F6.1","name":"navy swatch → chip + HEX + nearest colourway name; auto-fills the colour field","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"name\":\"Navy\",\"hex\":\"#243456\",\"sw\":\"rgb(36, 52, 86)\",\"field\":\"Navy\",\"use\":true}"},{"id":"F6.2","name":"does NOT overwrite a colour the user already typed (chip still offers it)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"name\":\"Navy\",\"field\":\"Custom Red\"}"},{"id":"F6.3","name":"\"Use <name>\" button explicitly applies the detected colour","engine":"chromium","vp":"ipad","pass":true,"detail":"Navy"},{"id":"ERR","name":"zero console errors + zero pageerrors (colour hue)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F1.0","name":"live camera stream opened (fake device)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F1.1","name":"/api/vendors-registry loads into the sticky bar","engine":"chromium","vp":"iphone","pass":true,"detail":"368 vendors"},{"id":"F1.2","name":"XL vendor text ≥ 24px","engine":"chromium","vp":"iphone","pass":true,"detail":"24px"},{"id":"F1.3","name":"bar is pinned to the top of the live camera, full-width, hit-testable","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"top\":0,\"liveTop\":0,\"w\":390,\"vw\":390,\"hit\":\"stickyVendor\",\"selRight\":378}"},{"id":"F1.4","name":"pick persists (localStorage) + meta shows the series","engine":"chromium","vp":"iphone","pass":true,"detail":"Anna French | Series DWAT · next DW# on Preview · FM vid unresolved"},{"id":"F1.5","name":"survives reload: shown in the top bar + mirrored into the modal picker","engine":"chromium","vp":"iphone","pass":true,"detail":"sticky=Anna French modal=Anna French"},{"id":"ERR","name":"zero console errors + zero pageerrors (vendor bar)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F1t.1","name":"modal twin picker loads the registry, XL text ≥ 24px","engine":"chromium","vp":"iphone","pass":true,"detail":"368 vendors, 24px"},{"id":"F1t.2","name":"vendor pick survives reload (localStorage) in the twin picker","engine":"chromium","vp":"iphone","pass":true,"detail":"ls=Anna French after=Anna French"},{"id":"F2t","name":"Front(1) then Back(2) numbered tiles render","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"f\":true,\"b\":true,\"fn\":\"1\",\"bn\":\"2\",\"ft\":true,\"bt\":true}"},{"id":"F2m","name":"add modal fits the viewport or is scrollable (every control reachable)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"top\":18,\"bottom\":1065,\"vh\":844,\"ov\":\"auto\",\"cardOv\":\"visible\"}"},{"id":"ERR","name":"zero console errors + zero pageerrors (twin picker)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F2.0","name":"numbered Front(1)/Back(2) tiles","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"fn\":\"1\",\"bn\":\"2\"}"},{"id":"F2.1","name":"gate text: empty → \"take Photo 1 / FRONT\"","engine":"chromium","vp":"iphone","pass":true,"detail":"📷 Step 1 — take the FRONT (pattern) photo."},{"id":"F2.2","name":"create blocked with no photos (\"Take Photo 1\")","engine":"chromium","vp":"iphone","pass":true,"detail":"📷 Take Photo 1 — the FRONT (pattern) face."},{"id":"F5.0","name":"WB live camera opened","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F5.1","name":"tap-a-white-point sets numeric gains that neutralise the warm cast","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ White point set (R×0.89 G×1.03 B×1.10) — new photos render true. Tap | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.2","name":"✨ Auto (gray-world) sets gains","engine":"chromium","vp":"iphone","pass":true,"detail":"✨ Auto (gray-world) white balance set — new photos render tr | {\"rGain\":0.8933333333333333,\"gGain\":1.0307692307692307,\"bGain\":1.098360655737705}"},{"id":"F5.3","name":"↺ Clear resets gains + hides Clear","engine":"chromium","vp":"iphone","pass":true,"detail":"White balance cleared. Tap a white/grey area to set it again"},{"id":"F5.4","name":"WB gains persist across reload (readout says SET, Clear offered)","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ White balance is SET — tap a white/grey area to re-set, or ↺ Clear."},{"id":"F4.0","name":"Measure live camera opened","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F4.1","name":"first open → set-scale mode with a numeric px/in (not \"…\", not NaN)","engine":"chromium","vp":"iphone","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.2","name":"Set scale → measure mode shows numeric W/L inches","engine":"chromium","vp":"iphone","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance"},{"id":"F4.3","name":"↺ Set scale (card) re-enters calibrate with numeric ppi","engine":"chromium","vp":"iphone","pass":true,"detail":"Set scale: size 💳 to a real credit card, then tap Set scale. (40 px/in)"},{"id":"F4.4","name":"REGRESSION: recal → set-scale never dead-ends; W/L numeric, ppi>0 saved","engine":"chromium","vp":"iphone","pass":true,"detail":"W 5.3\" · L 6.8\" · saved scale · hold at your usual distance | ppi=40"},{"id":"F4.5","name":"Use W×L writes the measured spec into the item","engine":"chromium","vp":"iphone","pass":true,"detail":"📐 Measured5.3\" × 6.8\""},{"id":"F2.3","name":"after Photo 1: tile ✓ + gate says \"take Photo 2 / BACK\"","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Step 2 — now take the BACK (label) photo."},{"id":"F2.4","name":"create blocked with one photo (\"Take Photo 2\")","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Take Photo 2 — the BACK (label / SKU)."},{"id":"F6.0","name":"colour chip + HEX + colourway name after the front photo (WB applied)","engine":"chromium","vp":"iphone","pass":true,"detail":"Navy #20365fUse “Navy” | field=Navy"},{"id":"F2.5","name":"after Photo 2: tile ✓ + mfr info determined (auto | candidates | manual — never silent)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"st\":\"✓ mfr info read from the 2 photos — review & edit below\",\"mfr\":\"TR2581\",\"cand\":false,\"nCand\":0,\"vendor\":\"Anna French\",\"name\":\"Watercolor Stripe\",\"src\":\"auto\",\"haveB\":true}"},{"id":"F3.real","name":"real OCR path outcome (recorded, informational)","engine":"chromium","vp":"iphone","pass":true,"detail":"src=auto mfr=TR2581 cand=0 name=Watercolor Stripe"},{"id":"F2.6","name":"gate: both photos, no mfr# → \"Pick or type mfr#\"","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.7","name":"create BLOCKED until an mfr# exists","engine":"chromium","vp":"iphone","pass":true,"detail":"🏷 Pick or type the mfr#/SKU to continue."},{"id":"F2.8","name":"gate OK once mfr# typed (\"✓ mfr# … review & Preview\")","engine":"chromium","vp":"iphone","pass":true,"detail":"✓ mfr# ZZTEST-5X — review & Preview"},{"id":"F2.9","name":"DRY-RUN preview: DWAT- DW#, Shopify DRAFT, staging + FileMaker sections, nothing created","engine":"chromium","vp":"iphone","pass":true,"detail":"Preview — nothing created yet (all 3 systems). | DWAT-336001"},{"id":"F7.0","name":"session count increments after create","engine":"chromium","vp":"iphone","pass":true,"detail":"1 this session"},{"id":"F7.1","name":"Next item clears photos + mfr + name + colour and jumps to Photo 1","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"mfr\":\"\",\"name\":\"\",\"col\":\"\",\"f\":false,\"b\":false,\"st\":\"📷 Step 1 — take the FRONT (pattern) photo.\"}"},{"id":"F7.2","name":"Next item KEEPS sticky vendor + Measure-Depth scale + White-Balance; count kept","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"v\":\"Anna French\",\"cal\":true,\"wb\":true,\"sess\":\"1 this session\"}"},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"GUARD","name":"commit:true requests intercepted by harness (linear flow)","engine":"chromium","vp":"iphone","pass":true,"detail":"[{\"mfr\":\"ZZTEST-5X\",\"vendor\":\"Anna French\",\"ts\":1789841686873}]"},{"id":"F6.1","name":"navy swatch → chip + HEX + nearest colourway name; auto-fills the colour field","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"name\":\"Navy\",\"hex\":\"#243456\",\"sw\":\"rgb(36, 52, 86)\",\"field\":\"Navy\",\"use\":true}"},{"id":"F6.2","name":"does NOT overwrite a colour the user already typed (chip still offers it)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"name\":\"Navy\",\"field\":\"Custom Red\"}"},{"id":"F6.3","name":"\"Use <name>\" button explicitly applies the detected colour","engine":"chromium","vp":"iphone","pass":true,"detail":"Navy"},{"id":"ERR","name":"zero console errors + zero pageerrors (colour hue)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F3.1","name":"no confident read → OCR candidate chips render (deduped) + \"none — type it\"","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"hid\":false,\"chips\":[\"AB-1234\",\"CD-5678\"],\"st\":\"🏷 Tap the correct SKU above, or type it below.\",\"block\":true,\"manual\":true}"},{"id":"F3.2","name":"tapping a chip fills mfr# (id_source=select), chips clear, gate OK","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"mfr\":\"CD-5678\",\"hid\":true,\"st\":\"✓ SKU selected — review & edit below\",\"src\":\"select\",\"need\":false}"},{"id":"F3.3","name":"manual typing also satisfies the gate","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ mfr# ZZ-MANUAL — review & Preview"},{"id":"F3.4","name":"\"none — type it\" → manual prompt (field flagged + focused, chips cleared)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"st\":\"🏷 Couldn’t read the mfr# — type the mfr#/SKU below.\",\"need\":true,\"hid\":true,\"src\":\"manual\",\"focused\":\"addMfr\"}"},{"id":"F3.5","name":"typed mfr# after manual prompt clears the flag + passes the gate","engine":"chromium","vp":"ipad","pass":true,"detail":"✓ mfr# ZZ-TYPED — review & Preview"},{"id":"ERR","name":"zero console errors + zero pageerrors (mfr candidates)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F8.1","name":"Web Speech present → a mic next to EVERY editable field, all visible","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"hasSR\":true,\"nFields\":10,\"withMic\":10,\"visibleMics\":10,\"offClass\":0,\"total\":10}"},{"id":"ERR","name":"zero console errors + zero pageerrors (mic present)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F8.2","name":"Web Speech deleted → every mic HIDDEN (not broken), controls still wired","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"hasSR\":false,\"nFields\":10,\"withMic\":10,\"visibleMics\":0,\"offClass\":10,\"total\":10}"},{"id":"F8.3","name":"voice-fill without Web Speech degrades gracefully (no error, field prompt shown)","engine":"chromium","vp":"ipad","pass":true,"detail":"🔊 Enter the SKU number — say it or type it"},{"id":"ERR","name":"zero console errors + zero pageerrors (mic absent)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F9.1","name":"no body horizontal scroll: home / add modal / header+grid / ID modal","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"home\":{\"sw\":390,\"cw\":390,\"dw\":390,\"iw\":390},\"add\":{\"sw\":390,\"cw\":390,\"dw\":390,\"iw\":390},\"grid\":{\"sw\":390,\"cw\":390,\"dw\":390,\"iw\":390},\"fb\":{\"sw\":390,\"cw\":390,\"dw\":390,\"iw\":390}}"},{"id":"F9.2","name":"no body horizontal scroll with the live scanner + sticky bar open","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"sw\":390,\"cw\":390,\"dw\":390,\"iw\":390}"},{"id":"ERR","name":"zero console errors + zero pageerrors (h-scroll)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F12.0","name":"after dismissing the onload chooser the header is hit-testable","engine":"chromium","vp":"ipad","pass":true,"detail":"scanBtn"},{"id":"F12.1","name":"⌂ reopens the chooser","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F12.2","name":"🔢 Scan opens the live scanner","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F12.3","name":"🎤 voice search responds (listening or a graceful \"not supported\" toast)","engine":"chromium","vp":"ipad","pass":true,"detail":"{\"toast\":\"🎤 Listening — say a vendor, SKU, or what to look for…\",\"cls\":\"scanbtn on\",\"txt\":\"🔴\"}"},{"id":"F12.4","name":"📷 Back/Front toggles + persists","engine":"chromium","vp":"ipad","pass":true,"detail":"🤳 Front → 📷 Back"},{"id":"F12.5","name":"🎨 Similar opens the photo picker","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F12.6","name":"🔎 ID F+B opens the identify modal","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F12.7","name":"➕ New item opens the add modal","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"ERR","name":"zero console errors + zero pageerrors (header controls)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"id":"F12.0","name":"after dismissing the onload chooser the header is hit-testable","engine":"chromium","vp":"iphone","pass":true,"detail":"scanBtn"},{"id":"F12.1","name":"⌂ reopens the chooser","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F12.2","name":"🔢 Scan opens the live scanner","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F12.3","name":"🎤 voice search responds (listening or a graceful \"not supported\" toast)","engine":"chromium","vp":"iphone","pass":true,"detail":"{\"toast\":\"🎤 Listening — say a vendor, SKU, or what to look for…\",\"cls\":\"scanbtn on\",\"txt\":\"🔴\"}"},{"id":"F12.4","name":"📷 Back/Front toggles + persists","engine":"chromium","vp":"iphone","pass":true,"detail":"🤳 Front → 📷 Back"},{"id":"F12.5","name":"🎨 Similar opens the photo picker","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F12.6","name":"🔎 ID F+B opens the identify modal","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"F12.7","name":"➕ New item opens the add modal","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"ERR","name":"zero console errors + zero pageerrors (header controls)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"id":"ENGINE","name":"webkit launch","engine":"webkit","vp":"-","pass":false,"detail":"browserType.launch: Executable doesn't exist at /Users/macstudio3/Library/Caches/ms-playwright/webkit-2227/pw_run.sh"},{"id":"ENGINE","name":"firefox launch","engine":"firefox","vp":"-","pass":false,"detail":"browserType.launch: Executable doesn't exist at /Users/macstudio3/Library/Caches/ms-playwright/firefox-1497/firefox/Nightly.app/Contents/MacOS/firefox"}]}
\ No newline at end of file
diff --git a/5x/out/s8-dryrun-9890.json b/5x/out/s8-dryrun-9890.json
new file mode 100644
index 0000000..8d5e871
--- /dev/null
+++ b/5x/out/s8-dryrun-9890.json
@@ -0,0 +1 @@
+{"ok":true,"dryRun":true,"preview":{"title":"ZZ 5X TEST 5x | Anna French","dw_sku":"DWAT-336001","mfr":"ZZTEST-5X","vendor":"Anna French","vid":"anna_french","color":"5x","price":null,"status":"draft","photos":1,"provisional_sku":false,"duplicate_of":null,"shopify":{"vendor":"Anna French","product_type":"Wallcovering","status":"draft","variants":[{"option1":"Roll","sku":"DWAT-336001","price":"(quote — draft, no price yet)"},{"option1":"Sample","sku":"DWAT-336001-Sample","price":"4.25"}]},"staging":{"table":"new_items_staging","dw_sku":"DWAT-336001","mfr_sku":"ZZTEST-5X","vendor":"Anna French","vid":"anna_french","pattern_name":"ZZ 5X TEST","color":"5x","price":null,"specs":{"material":"Wallcovering","collection":"","width":"","roll_length":"","repeat":"","pattern_match":"","substrate":"","how_sold":"","price_code":"","notes":""}},"filemaker":{"db":"WALLPAPER","layout":"*List Wallpapers - Full View","fieldData":{"Record Type":"Master","Series":"DWAT","JS Pattern":"336001","Mfr Pattern":"ZZTEST-5X","mfr pattern number":"ZZTEST-5X","Name of Pattern":"ZZ 5X TEST","Internal Description":"ZZ 5X TEST","Color of Pattern":"5x"},"auto_calc":{"combo sku":"DWAT-336001"},"unmapped_kept_in_metafields":{}},"flags":["no FileMaker vid resolved for series DWAT — set WALLPAPER.vid manually or add a vid mapping"]}}
\ No newline at end of file
diff --git a/5x/out/s8-dryrun-9899-FM.json b/5x/out/s8-dryrun-9899-FM.json
new file mode 100644
index 0000000..8d5e871
--- /dev/null
+++ b/5x/out/s8-dryrun-9899-FM.json
@@ -0,0 +1 @@
+{"ok":true,"dryRun":true,"preview":{"title":"ZZ 5X TEST 5x | Anna French","dw_sku":"DWAT-336001","mfr":"ZZTEST-5X","vendor":"Anna French","vid":"anna_french","color":"5x","price":null,"status":"draft","photos":1,"provisional_sku":false,"duplicate_of":null,"shopify":{"vendor":"Anna French","product_type":"Wallcovering","status":"draft","variants":[{"option1":"Roll","sku":"DWAT-336001","price":"(quote — draft, no price yet)"},{"option1":"Sample","sku":"DWAT-336001-Sample","price":"4.25"}]},"staging":{"table":"new_items_staging","dw_sku":"DWAT-336001","mfr_sku":"ZZTEST-5X","vendor":"Anna French","vid":"anna_french","pattern_name":"ZZ 5X TEST","color":"5x","price":null,"specs":{"material":"Wallcovering","collection":"","width":"","roll_length":"","repeat":"","pattern_match":"","substrate":"","how_sold":"","price_code":"","notes":""}},"filemaker":{"db":"WALLPAPER","layout":"*List Wallpapers - Full View","fieldData":{"Record Type":"Master","Series":"DWAT","JS Pattern":"336001","Mfr Pattern":"ZZTEST-5X","mfr pattern number":"ZZTEST-5X","Name of Pattern":"ZZ 5X TEST","Internal Description":"ZZ 5X TEST","Color of Pattern":"5x"},"auto_calc":{"combo sku":"DWAT-336001"},"unmapped_kept_in_metafields":{}},"flags":["no FileMaker vid resolved for series DWAT — set WALLPAPER.vid manually or add a vid mapping"]}}
\ No newline at end of file
diff --git a/data/build.json b/data/build.json
index 68d09ae..378a758 100644
--- a/data/build.json
+++ b/data/build.json
@@ -1,5 +1,5 @@
{
- "next": 74,
+ "next": 76,
"map": {
"13917438": 55,
"63863152": 27,
@@ -72,6 +72,8 @@
"3db60cc7": 70,
"8a74cec0": 71,
"4176e62e": 72,
- "48d81794": 73
+ "48d81794": 73,
+ "b8644720": 74,
+ "820a5476": 75
}
}
\ No newline at end of file
diff --git a/data/scan-log.jsonl b/data/scan-log.jsonl
index 55ef1b8..308ecba 100644
--- a/data/scan-log.jsonl
+++ b/data/scan-log.jsonl
@@ -17,3 +17,9 @@
{"id":"2026-09-18T21-54-09-919Z-4x78","at":"2026-09-18T21:54:09.919Z","images":{"front":"/photos/scan-2026-09-18T21-54-09-919Z-4x78-front.jpg"},"found":true,"source":"visual","confidence":"low","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DWYA-60071","mfr_sku":null,"vendor":"Maya Romanoff","pattern":"Beadazzled 1X15"}}
{"id":"2026-09-19T15-52-42-239Z-5ryg","at":"2026-09-19T15:52:42.239Z","images":{"front":"/photos/scan-2026-09-19T15-52-42-239Z-5ryg-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DIG-740022-25-type-2-vinyl-2x12","mfr_sku":null,"vendor":"DW Bespoke Studio","pattern":"A Happy Smiley Day"}}
{"id":"2026-09-19T16-40-35-224Z-6sgm","at":"2026-09-19T16:40:35.224Z","images":{"front":"/photos/scan-2026-09-19T16-40-35-224Z-6sgm-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"GRD-87003","mfr_sku":"TIGERS-TIGERS-TIGERS-IN-THE-JUNGLE","vendor":"grd","pattern":"Tiger Tiger"}}
+{"id":"2026-09-19T18-11-35-485Z-1gak","at":"2026-09-19T18:11:35.485Z","images":{"front":"/photos/scan-2026-09-19T18-11-35-485Z-1gak-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DWGB-200541","mfr_sku":"108887","vendor":"graham_brown","pattern":""}}
+{"id":"2026-09-19T18-11-46-102Z-22mh","at":"2026-09-19T18:11:46.102Z","images":{"front":"/photos/scan-2026-09-19T18-11-46-102Z-22mh-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DWGB-200541","mfr_sku":"108887","vendor":"graham_brown","pattern":""}}
+{"id":"2026-09-19T18-13-50-571Z-35yo","at":"2026-09-19T18:13:50.571Z","images":{"front":"/photos/scan-2026-09-19T18-13-50-571Z-35yo-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DWGB-200541","mfr_sku":"108887","vendor":"graham_brown","pattern":""}}
+{"id":"2026-09-19T18-13-59-782Z-4q3k","at":"2026-09-19T18:13:59.782Z","images":{"front":"/photos/scan-2026-09-19T18-13-59-782Z-4q3k-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DWGB-200541","mfr_sku":"108887","vendor":"graham_brown","pattern":""}}
+{"id":"2026-09-19T18-14-35-006Z-5ma7","at":"2026-09-19T18:14:35.006Z","images":{"front":"/photos/scan-2026-09-19T18-14-35-006Z-5ma7-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DWGB-200541","mfr_sku":"108887","vendor":"graham_brown","pattern":""}}
+{"id":"2026-09-19T18-14-45-078Z-69rh","at":"2026-09-19T18:14:45.078Z","images":{"front":"/photos/scan-2026-09-19T18-14-45-078Z-69rh-front.jpg"},"found":true,"source":"visual","confidence":"high","corroborated":false,"code":null,"engines":null,"cost_usd":null,"candidates":null,"vendor":null,"resolved":{"dw_sku":"DWGB-200541","mfr_sku":"108887","vendor":"graham_brown","pattern":""}}
← 725a545 Add-modal: session counter survived only until the modal ope
·
back to Dw Photo Capture
·
auto-data-snapshot: 2026-09-19T13:09:57 (2 data files) — dat 313e6c7 →