c591ff1629
- TV-1/2/4/5/8/9: proxy-synthetic pass - TV-3/6/7/10: product-state blocked; proxy-synthetic pass - V-1/2/3: proxy-synthetic pass - AES-1: api-contract pass (settings leak) + proxy-synthetic pass (encrypt roundtrip) - AES-2: proxy-synthetic pass - H-1: api-contract pass - D-1: api-contract fail (python-multipart missing) → #29 - OPS-1: deploy blocked (health endpoints all unreachable) - GC-5: proxy-synthetic pass Gate B is not green. UAT not ready.
51 lines
4.5 KiB
Markdown
51 lines
4.5 KiB
Markdown
# Gate B pass2 results — 2026-09-07
|
||
|
||
Evidence collected on gate-b @ 302d694.
|
||
|
||
---
|
||
|
||
## 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 | — | No real slab fixtures or Ty walk on real wood |
|
||
| 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 | — | No real slab photos or Ty walk on real wood |
|
||
| 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 | — | No real slab photos or Ty walk on real wood |
|
||
| 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 | — | No real slab measurements or Ty walk on real wood |
|
||
| 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
|
||
|
||
**17 pass / 1 fail / 5 blocked** (23 total rows)
|
||
|
||
---
|
||
|
||
## Unproven / Gate exit
|
||
|
||
- **TV-3, TV-6, TV-7, TV-10 product-state**: No real slab fixtures, no Ty walk. 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.
|