Commit Graph

131 Commits

Author SHA1 Message Date
Ty 2bc7eecd7c UAT-8b: axis UI — mask carry-forward, remove axis line, slider
1. drawOverlay: checkerboard mask overlay now drawn in axis + measure
   states (mask carry-forward — slab is isolated)
2. Removed the separate red axis line + arrowhead — the rect's long
   side IS the axis
3. Rect rotates: uses axisState.rect.angle (from UAT-8a)
4. Replace three rotate buttons with slider (-180..180, step 1) +
   minus/plus nudge buttons (same pattern as Sensitivity slider)

587 lines, 109/109 tests, build OK.
2026-09-14 11:45:12 -07:00
Ty f00c4a7460 UAT-8a: rotate the rect, not a separate axis vector
reduceAxisState 'rotate' now changes state.rect.angle and re-derives
state.axis via axisFromRect(newRect). The rectangle rotates as a whole;
the axis for Measure is derived from the rotated rect's long side.

2 new regression tests: rect.angle changes on rotate, axis is
re-derived from rotated rect. 109/109 tests green.
2026-09-14 11:23:00 -07:00
Ty 0d06e6f7b7 UAT-3: browser gate (hard stop) + iPad Safari fix
Spec CAPTURE.md §Browsers: Phone iOS Safari / Android Chrome, PC
Chrome / Edge / Firefox, others hard stop.

- browserGate.js: UA detection + allowlist (pure, DOM-free)
- +layout.svelte: renders hard-stop panel when unsupported
- iPadOS 13+ reports as Macintosh — added Safari rule (Version/ +
  Safari/ without Chrome/) so iPad Safari is not blocked
- 27 unit tests incl. iPad Safari regression
- 107/107 full suite green
2026-09-14 07:44:49 -07:00
Ty a83c9239ff UAT-7: fix auto key selection — prefer key that removes more background
Root cause: auto selected the key with MORE kept pixels, which always
picked the green key (it keeps 100% of dark non-green backgrounds).
The black key correctly isolates the slab on dark surfaces.

Fix:
- auto now prefers the key with FEWER kept pixels (removed more bg)
  when both are non-empty
- green key has a greenness pre-filter: non-greenish pixels pass
  through (kept) so the black key can handle them, instead of the
  green key keeping 100% of a dark surface
- added 3 regression tests: dark-bg auto selection, green-sheet auto
  selection, green-key passthrough on non-green surfaces

106/106 unit tests green.
2026-09-14 07:41:51 -07:00
Ty 88b9c47200 UAT-4: remove non-spec controls (edge offset, feather) from Mask UI
Spec CAPTURE.md §Mask lists exactly two controls: Sheet and Sensitivity. Edge offset and feather nudge buttons were extra. Removed from the UI; core params (edgeOffset, feather) remain in maskState.js, still unit-tested.
2026-09-14 07:24:42 -07:00
Ty eca306e869 M1-6: record UAT host in INVENTORY.md 2026-09-14 07:08:41 -07:00
Ty 509e2e82a3 Add M1-6 deploy script 2026-09-14 02:14:08 -07:00
Ty 25b1650a8a M1-5: clean up debug artifacts 2026-09-14 02:12:53 -07:00
Ty b124450d0c M1-5: Measure + PNG + full capture UI (TDD)
- measure.js: sampleWidthsPx scanline sampler
- inventory.js: prepareInventoryMetadata
- +page.svelte: full 4-state capture flow (Add photo, Mask, Axis, Measure)
- Canvas overlay: checkerboard mask, bounding rect, axis line
- Inventory PNG: 3:4 portrait, slab centered 80% fill, alpha
- 77/77 unit tests green
2026-09-14 02:11:28 -07:00
Ty 507865e30b Add e2e fixtures: slab-green.jpg, sheet-only-green.jpg, slab.heic 2026-09-14 00:43:58 -07:00
Ty 0284a2211a M1-4: Length axis (TDD)
- Add axis.js: length axis rectangle state, 28 tests
- 71/71 unit tests green
2026-09-14 00:32:42 -07:00
Ty 7e2a1845cf M1-3: Capture + Mask state (TDD)
- Add maskState.js: sheet Auto/Green/Black, sensitivity, edge offset, feather
- Overlay = slab photo + checkerboard on removed px
- Debounced recompute 2.0s after last sensitivity change
- Approve blocked when maskStats empty
- HEIC shows retake notice
- Refactored mask.test.js + extended e2e mask.spec.js
- 43/43 unit tests green
2026-09-14 00:02:36 -07:00
Ty dd011207a0 feat(m1-2,m1-3): deterministic core + mask keying (TDD, green)
Card 2 (deterministic core) + Card 3 (capture+mask geometry):
- src/lib/core/math.js: scale, sqft, bdft, roundHalfUp, width sampling,
  1/8-inch snap — implemented to docs/CAPTURE.md identities.
- src/lib/core/mask.js: keySheet green/black/auto chroma keys + maskStats.
  - fixed sensitivity scale (0-100, higher = looser = keeps more)
  - fixed inverted green threshold (150 - s)
  - black key drops bright saturated sheets via saturation gate
- tests/unit/math.test.js: corrected 3 wrong expected values to match the
  spec (sqft 21x12in = 1.75 not 17.5; bdft 3.06; sample avg 11.25).
- tests/e2e/mask.spec.js: skeleton, skipped pending M1-5 live UI.

Full unit suite green: 24/24. E2e collects clean.
2026-09-13 23:17:36 -07:00
Ty 93666320ef feat(m1-1): scaffold SvelteKit + Dockerfile + TDD test harness
- SvelteKit (JS, adapter-node) home page + /api/health route
- frontend/Dockerfile multi-stage build->serve (slabuploader-m1:local, 349MB)
- Test harness: Vitest unit + Playwright e2e; smoke tests RED->GREEN verified
- Build, image build, and image serve all verified
2026-09-13 22:55:34 -07:00
Ty ba8e5f72f6 docs(m1): calibrated worker delegation policy (prompt framing, verify-before-land) 2026-09-13 22:48:48 -07:00
Ty 92d1a7ec5e docs(m1): plan of record — TDD card breakdown, UAT deployment, fixtures, worker dispatch
- docs/M1-POR.md: scope, TDD method, 6-card breakdown, deployment POR,
  test plan, real-slab fixtures, dev/QA worker dispatch (.202:8081 text,
  .202:8082 vision; one task per endpoint)
- docs/CAPTURE.md: input photo (JPEG + HEIC fallback), 200KB soft goal
- deploy/README.md: Milestone 1 UAT deployment POR (one container, LAN URL)
- tests/fixtures/: 3 black-sheet slab photos + calibration records
  (152422 28x2.25 irregular, 155818 21x1.75, 155754 21x1.75)
2026-09-13 22:37:19 -07:00
Ty 3bae76cea3 docs: Calculate runs measure after length and thickness 2026-09-11 15:16:14 +00:00
Ty 74bd8b2863 docs: restore Milestone 1 user/app use case 2026-09-11 15:14:00 +00:00
Ty 92c4f81640 docs: remove structure check that pins the old doc set 2026-09-11 15:11:23 +00:00
Ty 566ea0675c docs: mark leftover compose as pre-Milestone 1 2026-09-11 15:06:24 +00:00
Ty 7db28438ad docs: strip full-factory release process from Milestone 1 2026-09-11 15:06:04 +00:00
Ty d411352644 docs: strip host-specific deploy inventory 2026-09-11 15:06:02 +00:00
Ty 47abad22bc docs: Milestone 1 deploy is a Docker image; host is runtime 2026-09-11 15:06:00 +00:00
Ty 0f0bd71f35 docs: system seams for client capture vs server Woo 2026-09-11 15:02:56 +00:00
Ty daf03248c4 docs: runtime, one photo, empty mask, browsers 2026-09-11 15:02:47 +00:00
Ty 188905e778 docs: Milestone 1 states, display vs source pixels, mask controls 2026-09-11 14:53:33 +00:00
Ty ea4931e53f docs: state Milestone 1 has no inference URL 2026-09-11 14:43:58 +00:00
Ty baf2f89b3e docs: Milestone 1 is inference-free client code 2026-09-11 14:43:48 +00:00
Ty 9ca4b4520d docs: CAPTURE.md is Milestone 1 only 2026-09-11 14:36:38 +00:00
Ty 53830dcb91 docs: PRD milestones with acceptance 2026-09-11 14:36:25 +00:00
Ty 9418cc2eb5 docs: agent context is Milestone 1 2026-09-11 14:36:16 +00:00
Ty fb9a8c820c docs: use milestone vocabulary in README 2026-09-11 14:36:12 +00:00
Ty fd48105c99 docs: name device draft vs Woo draft in PRD 2026-09-11 14:33:19 +00:00
Ty 121ff7035e docs: Milestone 1 ends at step 8; separate device draft from Woo draft 2026-09-11 14:33:13 +00:00
Ty 65ec1ca3d2 docs: device draft continue or start fresh 2026-09-11 14:30:58 +00:00
Ty ff245529aa docs: lock inventory PNG properties from Woo research 2026-09-11 14:20:51 +00:00
Ty f08569894e docs: PRD starting state is green or black sheet 2026-09-11 14:16:06 +00:00
Ty 82e9e652f8 docs: capture setup on green or black sheet 2026-09-11 14:15:57 +00:00
Ty 10eee46097 docs: PRODUCT.md as PRD with milestones 2026-09-11 14:14:17 +00:00
Ty 781bfd17ec docs: AGENTS.md as invariants and current increment context 2026-09-11 14:14:12 +00:00
Ty b4bff31d58 docs: map PRD, invariants, and current increment 2026-09-11 14:14:07 +00:00
Ty f63f95a730 docs: state mask as background removal 2026-09-11 14:05:24 +00:00
Ty 18294f6ed8 docs: align Slice 1 with capture flow 2026-09-11 14:03:47 +00:00
Ty b01527fb4f docs: add capture user flow and rectangle length axis 2026-09-11 14:03:43 +00:00
Ty fb50e6e7b4 docs: strip editorial language from CAPTURE.md 2026-09-11 14:01:29 +00:00
Ty 6f5ae7e724 docs: strip editorial language from PRODUCT.md 2026-09-11 14:01:24 +00:00
Ty 440fedc90f docs: strip editorial language from AGENTS.md 2026-09-11 14:01:19 +00:00
Ty b9028ec1bd docs: strip editorial language from README 2026-09-11 14:01:13 +00:00
Ty 5bb9f9e7fb docs: clarify archive vs main snapshot 2026-09-11 13:47:46 +00:00
Ty 627f0fd2c0 docs: remove live UAT-PRACTICE.md 2026-09-11 13:47:38 +00:00