Files
SlabUploader/test-results/gate-b-2026-09-07-pass3/RESULTS.md
T

35 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.