← back to Dw Photo Capture
5x/out/features-sweep5.json
1 lines
{"sweep":"5","base":"https://photo.designerwallcoverings.com","local":"http://127.0.0.1:9890","fm":"http://127.0.0.1:9899","at":"2026-09-19T17:59:32.111Z","secs":220,"total":118,"passed":109,"failed":9,"skipped":0,"gemini_cost_usd":0.0027,"gemini_calls":3,"results":[{"id":"F10.1","name":"/manifest.webmanifest 200 (manifest+json)","engine":"http","vp":"https://photo.designerwallcoverings.com","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":"https://photo.designerwallcoverings.com","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-5-1789840553675/ZZ5X-BATCH_psku_original.jpg\",\"master\":\"/photos/batch/5x-5-1789840553675/ZZ5X-BATCH_psku_master.jpg\",\"web\":\"/photos/batch/5x-5-1789840553675/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-5-1789840553675/ZZ5X-BATCH_original.jpg\",\"master\":\"/photos/batch/5x-5-1789840553675/ZZ5X-BATCH_master.jpg\",\"web\":\"/photos/batch/5x-5-1789840553675/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-5-1789840553675/ZZ5X-BATCH-B4_web.jpg\"} | {\"web\":\"/photos/batch/5x-5-1789840553675/ZZ5X-BATCH-B4_web.jpg\"} | {\"web\":\"/photos/batch/5x-5-1789840553675/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":"365 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":"365 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\":\"visible\",\"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\":\"✓ Read a SKU off the label — review & edit below\",\"mfr\":\"TR2581\",\"cand\":false,\"nCand\":0,\"vendor\":\"Anna French\",\"name\":\"\",\"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="},{"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-336000"},{"id":"F2","name":"test threw","engine":"chromium","vp":"ipad","pass":false,"detail":"page.click: Timeout 30000ms exceeded."},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"ipad","pass":true,"detail":""},{"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","name":"test threw","engine":"chromium","vp":"iphone","pass":false,"detail":"page.click: Timeout 30000ms exceeded."},{"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":"365 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":false,"detail":"{\"top\":-101,\"bottom\":945,\"vh\":844,\"ov\":\"visible\",\"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","name":"test threw","engine":"chromium","vp":"iphone","pass":false,"detail":"page.click: Timeout 30000ms exceeded."},{"id":"ERR","name":"zero console errors + zero pageerrors (linear flow)","engine":"chromium","vp":"iphone","pass":true,"detail":""},{"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","name":"test threw","engine":"chromium","vp":"iphone","pass":false,"detail":"page.click: Timeout 30000ms exceeded."},{"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","name":"test threw","engine":"chromium","vp":"iphone","pass":false,"detail":"page.click: Timeout 30000ms exceeded."},{"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","name":"test threw","engine":"chromium","vp":"iphone","pass":false,"detail":"page.click: Timeout 30000ms exceeded."},{"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"}]}