4.5 KiB
4.5 KiB
Gate B Results — 2026-09-07 pass 3
Evidence on gate-b @ 8d8b3a2.
| Case | What this proves (mill-owner) | Evidence class | Result | Evidence | Blocker |
|---|---|---|---|---|---|
| TV-1 | Green-sheet mask: green interior patch stays, border pixels removed, U2Net not invoked | proxy-synthetic | pass | vitest.txt:6 | |
| TV-1 | Real product behavior on real slab photos | product-state | blocked | No PNG under fixtures/real/ |
|
| TV-2 | Black-sheet mask: dark wood interior stays, flood-fill isolates border-connected pixels only | proxy-synthetic | pass | vitest.txt:6 | |
| TV-2 | Real product behavior on real slab photos | product-state | blocked | No PNG under fixtures/real/ |
|
| TV-3 | bdft = sqft × thickness_in; identity 1 sqft @ 1" = 1 bdft; no divide-by-12 | product-state | blocked | No PNG under fixtures/real/; vitest.txt:7 (tv3-real skipped) |
|
| TV-3 | bdft identity computed correctly by pure module | proxy-synthetic | pass | vitest.txt:75-76 (bdft=0.96, identity=1) | |
| TV-4 | Width samples at 6" stations report min/max/average perpendicular to confirmed axis | proxy-synthetic | pass | vitest.txt:8-14 (5 tests, min/max/avg reported) | |
| TV-5 | Angled-end slab: length axis follows prevailing length; widths stay perpendicular after confirm | proxy-synthetic | pass | vitest.txt:11-12 (2 tests, direction rotated) | |
| TV-6 | 3:4 crop, 80% fill, transparent PNG, shorter side ≥1600 when source allows | product-state | blocked | No PNG under fixtures/real/; vitest.txt:4 (tv6-real skipped) |
|
| TV-6 | 3:4 crop, 80% fill, ≥1600px computed correctly by pure module | proxy-synthetic | pass | vitest.txt:84-105 (7 tests: crop dims, bounding box, fill, minPx, no upscale) | |
| TV-7 | Undersized source warns, refuses upscale, photo not publishable until retake | product-state | blocked | No PNG under fixtures/real/; vitest.txt:4 (tv7-real skipped) |
|
| TV-7 | Undersized detection and no-upscale logic correct | proxy-synthetic | pass | vitest.txt:96-104 (3 tests: detects undersized, meetsMinPx=false, no upscale) | |
| TV-8 | Pricing: bdft × price_per_bdft; override sticks; missing rule leaves rec empty | proxy-synthetic | pass | vitest.txt:74 (6 tests) | |
| TV-9 | Thickness 1" → Woo range rounds up using synced attribute term | proxy-synthetic | pass | vitest.txt:78 (6 tests) | |
| TV-10 | Rounding: 96.04→96", 0.641→0.64 sqft, 11.525→11.53 bdft, 12.345→12.35 price; half-up 2 decimals | product-state | blocked | No PNG under fixtures/real/; vitest.txt:82 (tv10-real skipped) |
|
| TV-10 | Rounding logic correct | proxy-synthetic | pass | vitest.txt:79-80 (half-up matches vectors) | |
| V-1 | SKU charset [A-Z0-9-]{3,24} accepted; invalid values rejected with errors |
proxy-synthetic | pass | vitest.txt:15-45 (valid + invalid boundary strings) | |
| V-2 | Title/short_title/description maxLength enforced at field exit and submit | proxy-synthetic | pass | vitest.txt:46-63 (200/201, 2500/2501 boundary) | |
| V-3 | Validation module hash: client caches; mismatch returns 412 with fresh module | proxy-synthetic | pass | vitest.txt:64-73 (v1 hash, match, mismatch→412) | |
| AES-1 | Encrypt-decrypt round-trip; ciphertext never in GET settings; password never returned | api-contract | pass | pytest.txt:9-17 (roundtrip), pytest.txt:46 (settings never returns app_password) | |
| AES-2 | Missing SLAB_AES_KEY refuses startup; no plaintext fallback | proxy-synthetic | pass | pytest.txt:23-24 (missing_key_refuses, too_short_refuses, get_aes_key_returns_bytes) | |
| H-1 | GET /api/health returns 200 { "status":"ok" } with woo_reachable false |
api-contract | pass | pytest.txt:27-31 (health: 200, ok status, woo_reachable false, shape, lifespan) | |
| D-1 | POST /api/v1/slabs accepts multipart data JSON + files; returns 201 calibrated with server_rev | api-contract | pass | pytest.txt:32-39 (8 TestCreateSlab: 201, calibrated, server_rev, shape, multiple photos, missing data 400, duplicate 409, lifespan) | |
| OPS-1 | GET https://${APP_HOSTNAME}/api/health returns 200 after compose up | deploy | pass | health.txt:2-13 (HTTP/2 200, status ok, woo_reachable false). Self-signed cert (curl -k); phones need CA. slab.local DNS unresolved. UI at / returns 200 text/html but no Playwright e2e — walkable UI UNPROVEN. |
Counts: pass = 13, blocked = 6, fail = 0. Total rows = 19.
Gate B is not green. TV-3, TV-6, TV-7, TV-10 product-state rows are blocked (no real fixtures under fixtures/real/). All proxy-synthetic companions passed. OPS-1 deploy pass confirmed on https://100.64.0.9 but self-signed; UAT not ready.