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

61 lines
5.4 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 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](https://gitea.vps1.afterthedemo.com/Ty_Tech/SlabUploader/issues/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.