Files
SlabUploader/test-results/gate-b-2026-09-07-pass2/RESULTS.md
T
grokbot_ty fb892e4a32 feat(gate-b): add product-state fixture harness for TV-3/6/7/10
Real-fixture path and harness for product-state evidence on TV-3 bdft identity,
TV-6 crop/PNG rules, TV-7 undersized warn/retake, and TV-10 rounding.

- fixtures/real/: acquisition README, placeholder metadata JSON templates
- fixtures/real-fixtures.ts: loader that decodes real PNGs, generates masks,
  runs the pipeline, fails-closed when absent or unmarked
- tv3-real.test.ts / tv6-real.test.ts / tv7-real.test.ts / tv10-real.test.ts:
  product-state tests that skip when real fixtures are absent
- Updated RESULTS.md with real-fixture harness note
- Added pngjs devDependency for PNG decoding in Node.js

Dual-proof preserved: proxy-synthetic unit rows remain separate and unchanged.
Gate B is not green; product-state rows are blocked pending Ty-supplied photos.
2026-09-07 18:23:04 +00:00

5.4 KiB
Raw Blame History

Gate B pass2 results — 2026-09-07

Evidence collected on gate-b @ 699b6a0.

Real-fixture harness landed: frontend/src/__tests__/fixtures/real/ + real-fixtures.ts + four product-state test files. Harness loads real PNGs, generates masks, runs the pipeline, and fails-closed when fixtures are absent or unmarked. Dual-proof preserved: proxy-synthetic unit rows remain separate and unchanged.


Results

Case What this proves (mill-owner English) Evidence class Result Evidence Blocker
TV-1 Green-sheet chroma-key keeps interior green patch, does not eat border wood proxy-synthetic pass vitest.txt:13 —
TV-2 Black-sheet threshold keeps dark interior wood, flood-fill isolates border-only proxy-synthetic pass vitest.txt:13 —
TV-3 bdft = sqft × thickness_in; 1 sqft @ 1" = 1 bdft; no divide-by-12 product-state blocked vitest.txt: skipped (real fixture absent) Real PNG + metadata needed; harness at fixtures/real/
TV-3 bdft identity holds on synthetic fixture (proxy proof only) proxy-synthetic pass vitest.txt:4–5,12 —
TV-4 Width samples at 6" stations report min, max, average perpendicular to confirmed axis proxy-synthetic pass vitest.txt:14–15,20 —
TV-5 Angled-end slab: length axis follows prevailing length; widths stay perpendicular after confirm proxy-synthetic pass vitest.txt:17–18,20 —
TV-6 3:4 crop, slab centered, 80% fill, transparent PNG, shorter side ≥ 1600 when source allows product-state blocked vitest.txt: skipped (real fixture absent) Real PNG + metadata needed; harness at fixtures/real/
TV-6 Crop dimensions and fill ratio hold on synthetic fixture (proxy proof only) proxy-synthetic pass vitest.txt:80–90,101 —
TV-7 Undersized source warns, refuses upscale, photo not publishable until retake product-state blocked vitest.txt: skipped (real fixture absent) Real PNG + metadata needed; harness at fixtures/real/
TV-7 Undersized-source logic holds on synthetic fixture (proxy proof only) proxy-synthetic pass vitest.txt:92–99,101 —
TV-8 Pricing: bdft 0.96 × $12.50 → $12.00 recommended; override stored; no rule leaves empty proxy-synthetic pass vitest.txt:11 —
TV-9 Thickness 1" rounds up to Woo range using synced attribute term, not hardcoded label proxy-synthetic pass vitest.txt:10 —
TV-10 Rounding: 96.04" → 96"; 0.641 sqft → 0.64; 11.525 bdft → 11.53; 12.345 price → 12.35 product-state blocked vitest.txt: skipped (metadata placeholder, real: false) Real measurements from Ty needed; harness at fixtures/real/
TV-10 Rounding rules hold on synthetic fixture (proxy proof only) proxy-synthetic pass vitest.txt:7–8,12 —
V-1 SKU charset [A-Z0-9-]{3,24} accepted; invalid chars/rejected length rejected proxy-synthetic pass vitest.txt:21–50,79 —
V-2 Title/short_title/description maxLength enforced at field exit and submit proxy-synthetic pass vitest.txt:52–68,79 —
V-3 Validation module hash: client cache, submit carry, mismatch returns 412 with fresh module proxy-synthetic pass vitest.txt:70–77,79 —
AES-1 Credentials round-trip without ciphertext leak; settings GET never returns app password api-contract pass pytest.txt:46 —
AES-1 Encrypt-then-decrypt round-trips for username, password, empty, unicode, special chars proxy-synthetic pass pytest.txt:9–17 —
AES-2 Missing SLAB_AES_KEY env var: app refuses to start; no plaintext fallback proxy-synthetic pass pytest.txt:23–24 —
H-1 GET /api/health returns 200 { "status":"ok" } with woo_reachable false when not configured api-contract pass pytest.txt:27–31 —
D-1 POST /api/v1/slabs accepts multipart, returns 201 with status: calibrated and server_rev api-contract fail pytest.txt:32–39 #29
OPS-1 GET https://${APP_HOSTNAME}/api/health returns ok after compose up with filled inventory deploy blocked — health.txt: slab.local unresolved, 443/18443 refuse, HTTP :18081 timed out
GC-5 FastAPI refuses to start when WOO_BASE_URL missing or set to http:// proxy-synthetic pass pytest.txt:40–41 —

Counts

18 pass / 1 fail / 5 blocked (24 total rows)

Real-fixture harness (4 product-state test files + loader + acquisition README) is committed; still blocked pending Ty-supplied PNG photos and real measurements.


Unproven / Gate exit

  • TV-3, TV-6, TV-7, TV-10 product-state: Real-fixture harness committed (fixtures/real/ + real-fixtures.ts
    • four product-state test files). Harness fails-closed when real PNG photos / real measurements are absent. Still blocked pending Ty-supplied photos and measurements. Proxy-synthetic rows pass but do not satisfy Gate B exit.
  • OPS-1 deploy: No compose-up, no Caddy, no inventory filled. Health endpoints all unreachable (health.txt).
  • Walkable UI / E2E: No Playwright E2E tests exist yet; no browser session captured.
  • Real draft create (D-1): All 8 TestCreateSlab tests failed with python-multipart missing; no slab was created.
  • Gate B is not green. UAT is not ready. Bots do not declare Gate B green.