Commit Graph

284 Commits

Author SHA1 Message Date
grokbot_ty f54cc37dcc docs(deploy): proto woo-creds 10892 after iOS opaque Zoom/Pan cutout 2026-09-26 21:30:56 -07:00
grokbot_ty 5ace4a29d4 fix(capture): opaque mask overlay on Measure Zoom/Pan (iOS)
Alpha-punch of non-slab pixels left a mostly-transparent canvas inside the
CSS-transformed photo-layer. iOS Safari composites that blank — Ty's failure
(checkerboard + tape only, no wood) on LAN :10892. Paint opaque checkerboard
for non-slab like Mask; drop will-change. Unit-tested keep/cover counts.
2026-09-26 21:30:13 -07:00
grokbot_ty b4210b4d44 docs(deploy): proto woo-creds 10892 after in-place Zoom/Pan cutout punch 2026-09-26 20:56:53 -07:00
grokbot_ty af7d4c9d3c fix(capture): punch tape cutout in-place; drop maskedPreview swap
ca983c4 painted mask via offscreen createImageData→drawImage and swapped
Measure to an async alpha PNG. On some clients that left the Zoom/Pan
stage showing only the CSS checkerboard with no slab pixels.

Paint the approved mask by mutating the photo bitmap in place (same as
Mask/SessionCapture): tape mode clears non-slab alpha so the stage grid
shows through; bbox mode still paints opaque checkerboard. Measure binds
source+bitset like Axis — no createMaskedPreviewBlob race. onMount redraw
covers the canvas-bind tick race.
2026-09-26 20:56:05 -07:00
grokbot_ty 5d2134f5dc docs(deploy): proto woo-creds 10892 after Measure Zoom/Pan cutout 2026-09-26 20:48:31 -07:00
grokbot_ty ca983c4dc1 fix(capture): show bg-removed cutout on Measure Zoom/Pan immediately
Tape-mode PhotoStage skipped mask checkerboard painting, so Zoom/Pan
depended on async createMaskedPreviewBlob — a hang/fail left the stage
without a cutout. Paint mask overlay in tape mode, mount PhotoStage on
source+bitset right away (swap to alpha PNG when ready), checkerboard
stage backdrop, and prefer HTML canvas for the preview encode.
2026-09-26 20:47:19 -07:00
grokbot_ty 149197cbae docs(deploy): proto woo-creds 10892 after Woo setup gate 2026-09-26 19:20:21 -07:00
grokbot_ty 2f9b8ebd02 proto(woo): blocking setup gate; require X-Woo-* on Woo HTTP routes
Full-screen WooSetupGate on App mount when this browser lacks device WP
user + app password. Save + Test Woo dismisses only after a successful
test. Publish/test-woo auth failures reopen the gate.

Server: client_for_request requires X-Woo-* on publish, taxonomy sync,
and test-woo (401 woo_device_creds_required); health probe keeps
Settings. Optional SLAB_WOO_ALLOW_SETTINGS_FALLBACK for legacy tests.

See PROTOTYPE.md.
2026-09-26 19:20:16 -07:00
grokbot_ty 2f6335ec26 proto(woo): per-browser Woo creds via X-Woo-* request headers
Prototype routing so 2–3 owners can share one store URL with different WP
application passwords. Device creds live in localStorage; server uses
request override → Settings fallback and never writes overrides into the
Settings row. Inference stays on shared Settings.

See PROTOTYPE.md for UAT with two browsers and known LAN forge risk.
2026-09-26 12:26:21 -07:00
grokbot_ty fc40c66c44 docs(deploy): overnight 10890 after Measure gesture modes 2026-09-26 12:01:35 -07:00
grokbot_ty f505be0bbf fix(capture): Zoom/Pan vs Rotate gesture modes; drop dead ↻ overlay
Pinch/drag were applying zoom and tilt together on Measure. Add an
explicit Zoom/Pan | Rotate segmented toggle (default Zoom/Pan). Stage
gestures are exclusive per mode; tilt/zoom sliders stay available.

Remove the bottom-center ↻ handle that sat on tick B (hitTick won, so
the icon looked live but only moved the tick).
2026-09-26 12:01:09 -07:00
grokbot_ty 685acc10dd docs(deploy): overnight 10890 after Publish preview 2026-09-26 11:47:55 -07:00
grokbot_ty 73e28180c8 feat(publish): Publish preview before Woo draft POST
After Review → Continue to Publish, show a glanceable confirmation:
ordered photo thumbs, SKU/title/price, taxonomy + dims, short and long
descriptions (plain text). Back to Review edits; Publish posts the draft.
Reuses slab/taxonomy/photos only — no invented fields.
2026-09-26 11:47:18 -07:00
grokbot_ty 8f8e0132e6 docs(deploy): overnight 10890 after Review UI nits 2026-09-26 11:08:50 -07:00
grokbot_ty 5651a38058 fix(review): UI nits — margins, buttons, moisture, live validation
Post-publish: hide Back while publishing; drop Settings/Slabs chrome on
done (remove unused white Slabs control). Review/App horizontal padding.
Unify Create desc / View prompt / Create title|short as .btn-sec.
Moisture kd default: sync select after form mount; persist via commit.
Ready/missing update on input (debounced) without blur.
2026-09-26 11:08:08 -07:00
grokbot_ty 88278a55e8 fix(call2): no metadata dump in long description
Long desc is Hook + Benefits (+ brief trust close) only; forbid Full specs /
Attribute list / product-name header that re-lists DECLARED ATTRIBUTES or
DIMENSION FACT BLOCK. Defensively strip trailing Category:/Length:/Board Feet:
labeled dumps in parse.
2026-09-26 10:52:53 -07:00
grokbot_ty 7e0157e45b fix(call2): plain text + woodworker tone
Review short/long must not show HTML tags; seed now requires plain text
only (newlines/- bullets) and practical woodworker copy. parse_call2_response
strips residual HTML as a safety net. Seed activation unchanged.
2026-09-26 10:45:28 -07:00
grokbot_ty c25e3f4927 feat(call2): short/long desc structure in seed (not brand voice)
Call 2 seed now requires benefit-first short + four-part long HTML, returned
as JSON. POST parses and persists both fields; Create-desc gate no longer
requires short (Call 2 writes it). Brand voice/geo stay Settings-injected.
2026-09-26 10:35:53 -07:00
grokbot_ty 076eb17db6 fix(review): Create desc gate does not require price 2026-09-26 10:30:55 -07:00
grokbot_ty 1464cac5f7 docs(deploy): overnight 10890 after View prompt / Call 2 package 2026-09-26 10:12:47 -07:00
grokbot_ty 1ff082f77c feat(review): View prompt + Call 2 declared attrs, Create-desc gate
Shared assemble_call2 for GET .../call2/prompt and POST call2 (seed +
DECLARED ATTRIBUTES + dimension fact + brand/geo; photo slots without
base64). Create desc disabled until content LLM + title/short + species +
wood cats/primary + edge + ≥1 figure + grade + moisture + price; show
missing. figure_term_ids required for ready. Moisture defaults to Kiln
dried (kd). Pin snl / liveedge in wood-cat UI. Ready-on-change via
MultiSelect onCommit.
2026-09-26 10:11:50 -07:00
grokbot_ty a801a757f8 docs(deploy): overnight 10890 after Review metadata slug/decode fixes 2026-09-26 09:42:30 -07:00
grokbot_ty 85786f16f2 fix(review): slug-scoped tags, decode names, drop fig picker & AI labels
- Taxonomy sync keeps fig-/feat- by slug (hyphen), not name; HTML-unescape names
- Review: remove AI assist labels; Features picker for feat-*; derive fig_tag_ids
  from Figure term names (casefold match, no bridges); decodeName on display
- Unit tests for scoped_tags, fig match, Review UI contract; docs slug wording
2026-09-26 09:41:30 -07:00
grokbot_ty c54870f5b9 docs(deploy): overnight 10890 after PNG floor warn/block split 2026-09-26 09:12:09 -07:00
grokbot_ty 1b5ad112cc fix(capture): warn 300–799px PNG floor; hard-block only below 300
Split FLOOR_WARN_PX=800 / FLOOR_BLOCK_PX=300. Warn-band still encodes and
includes the photo (Photos-ready + batchApply ok+warn). Block excludes
siblings and clean cal. CAPTURE-105 / CAPTURE.md / PHOTOS.md updated.
2026-09-26 09:11:34 -07:00
grokbot_ty df87d97a7d docs(deploy): overnight 10890 after species Create-title fix 2026-09-26 08:58:17 -07:00
grokbot_ty 76f30262f3 fix(review): carry Measure species into Create title/short-desc
Live overnight slabs after removing the Review species picker had
species_id null, so Create title stayed gated off. Require species on
Measure Calculate, stop the select sync from wiping choices before
options load, and have Review gate/PUT from slab.species_id with a
Capture handoff repair so deterministic title/short-desc always see it.
2026-09-26 08:57:53 -07:00
grokbot_ty 610b0883fe feat(review): remove species picker; species stays from Measure
Species is chosen on the merged Measure screen; the Review select was a
duplicate. Keep species_id on the slab from createSlab (Capture→draft→Woo)
and gate Create title from the hydrated value without offering edit.
2026-09-26 08:47:40 -07:00
grokbot_ty 89bc7d4ee9 fix(measure): show masked calibration preview 2026-09-26 08:38:17 -07:00
grokbot_ty 0dd5d255ec fix(mask): keep only largest connected slab component
Sheet gaps after black/green removal left stray chunks in the bitset.
After keep predicates, zero all but the largest 4-connected component
and recompute slabPx before bbox / slabBounds.
2026-09-26 08:33:19 -07:00
grokbot_ty b55344ec05 feat(capture): merge tape orientation into Measure with species
After mask approve, land on one Measure screen: interactive tape
PhotoStage plus Length L, Thickness, and Species (Woo taxonomy leaves).
Approve tape is folded into Calculate. Persist species_id on the device
draft and pass it through createSlab so Review pre-fills.
2026-09-26 08:22:08 -07:00
grokbot_ty 4ea2618475 fix(overlay): Photos-ready dims follow tape, not wood MAR
After rotateCalibration, map tape tick A→B through bakeTiltTransform into
baked cal coords, orient overlay bbox with orientedRect(..., tapeAngle), and
pass optional axis into buildOverlayPlan so length || tape and widths ⊥ tape.
2026-09-26 08:08:21 -07:00
grokbot_ty d7fc424b69 fix(capture): damp tape gesture sensitivity 2026-09-26 07:58:36 -07:00
grokbot_ty b841b16cc0 fix(capture): ±90° tilt slider midpoint + two-finger rotate
Clamp tape tilt to [-90, 90] so the slider knob starts centered and
CCW works. PhotoStage pinch now tracks angle as well as zoom.
2026-09-26 07:54:36 -07:00
grokbot_ty ba30a340e6 docs(deploy): overnight prop on 10890/10891 (slab-overnight) 2026-09-25 22:06:48 -07:00
grokbot_ty 0c263c6563 docs(deploy): record overnight-whole-app prop on ubudual5060 :10881 2026-09-25 22:05:41 -07:00
grokbot_ty 6caa4f62e7 fix(uat): allow Cloudflare quick-tunnel Host on vite preview
So phone/laptop without Tailscale can hit overnight UAT via trycloudflare.com.
2026-09-25 22:01:44 -07:00
grokbot_ty 2ac0f6f48e fix(review): adopt latest server_rev on PUT; retry once on 409
Review was POSTing price/sku to /review before each save; that endpoint
persists those overrides and bumps server_rev, so the following PUT sent
a stale client_rev and hit 409 — Continue to Publish stayed disabled.
Stop sending price/sku on review probes (PUT already persists them) and
have updateSlab refetch + retry once on revision_conflict.
2026-09-25 18:14:38 -07:00
grokbot_ty f5b84f1ad7 chore(deploy): overnight box UAT on :18181 / API :18182
Document Grok Bot computer UAT in deploy/INVENTORY.md.
Vite preview proxies /api → FastAPI :18182. Ignore .uat-data/ and
.venv-overnight/. Never bind :10880.
2026-09-25 17:50:14 -07:00
grokbot_ty 65589ac4b4 chore(review): drop unused Call 1 aibar CSS after disable 2026-09-25 17:47:12 -07:00
grokbot_ty 087557f89f chore(inference): disable Call 1 end-to-end; Call 2 stays
overnight-whole-app: Call 1 (vision classification) is OUT.
- POST /api/v1/slabs/{id}/inference/call1 always returns 410 call1_disabled
  (no model chat, no inference_log). Prompt seed/revision APIs kept dormant.
- Review: remove "Suggest with AI" / runInference (inferTaxon).
- GenerateText: remove Classify metadata (Call 1) button; Call 2 generate stays.
- PROMPTS.md banner documents Call 1 OUT / Call 2 STAYS.
- Settings: inference_enabled toggle annotated as Call-1 latch (dormant).
- Backend tests updated to assert 410; Call 2 tests unchanged.
2026-09-25 17:46:39 -07:00
grokbot_ty 60700b47fb feat(capture): tape-line overlay UI replaces axis rectangle (#99)
Pointer-Events pan/zoom/tilt under a fixed black ~2pt line with
rifle-scope end ticks (≥44×44 hit). AxisPanel becomes Tape line step;
session persists tape transform; scale = tick distance / L.
sveltedrag unavailable for Svelte 4 — Pointer Events path used.
2026-09-25 17:44:23 -07:00
grokbot_ty 52240083b3 feat(capture): shared crop_fill + tape geometry for #99
- One crop_fill (default 0.9) replaces duplicated FILL in inventory/overlay
- Thin localStorage settings store; crop % only moves long-axis end insets
- Pure tapeGeometry: fixed stage line, stage↔image map, tick span → px
- measure() prefers tape tick span for scale; maskSpanAlong demoted
- rotateCalibration bakes cal tilt into inventory + overlay only
- Fix stale 80%-fill comment on slabBounds
2026-09-25 17:44:07 -07:00
grokbot_ty d20e3d9077 docs(design): add approved #99 tape-line overlay wireframe
Wireframe settles fixed middle line + movable slab, tick-declared L,
and shared crop_fill. Scaffolding scrubbed before shipping into the app.
2026-09-25 17:44:07 -07:00
Ty 0c00d25cc7 fix(m3): Option A must-fix #79 #82 #83 #84 #89 #98
- #79 publish SKU/create via WooClient (User-Agent + typed 403 unrecoverable)
- #82 stale_field current_options from live taxonomy + owner labels
- #83 create allowlist/extra-key safe; taxonomy+enum 4xx on create
- #84 health woo_reachable real probe (non-failing); version 0.5.0-m3
- #89 review persists assembled title/short after taxonomy lock; UI applies
- #98 live-edge from synced term; attrs resolved by slug then name
2026-09-21 12:55:17 -07:00
Ty 96a697a50a fix(review): restore lineup/woodPrimary imports after merge
Morning merge kept Review call sites (nextPrimary, keptInOrder, roleLabel, …)
and dropped the imports, so hydrate threw ReferenceError and the UI showed
"Could not load the slab." Live UAT redeployed; sample data preserved.
2026-09-21 12:36:24 -07:00
Ty 67aa3d6b0d fix(review): black screen on Capture→Review — speciesId/gradeId refs
The merge auto-kept the branch's canCreateTitle reactive (speciesId) which is
undeclared in the merged file (main's canonical var is speciesSel) → ReferenceError
on Review mount → black screen. Also dropped the branch's duplicate gradeId (main
uses gradeSel) and repointed hydrate/patch to gradeSel. Live UAT verified: Review
now mounts and renders 'Review to Ready' with photo strip + Create buttons.
2026-09-21 12:17:24 -07:00
Ty 8ee3da9dcf merge work/merge-89-90 into main (Create-string #89/#90 + PR #97 fixes)
Reconciles two independent lines of work that both touched Review.svelte,
MultiSelect.svelte, and the thickness band:

- main's PR #97 (client-side thicknessBand.ts + MultiSelect names/commit +
  syncSelects DOM race fix + box-sizing CSS)
- work/merge-89-90 (server-side thickness band in thickness_band.py,
  Create-string #89, metadata_locked dropped, photo strip, wood primary)

Canonical resolution: the band is SERVER-side (hidden from UI, sent to Woo
on publish), so the client-side thicknessBand.ts + read-only band display
are removed from Review.svelte; PR #97's syncSelects() and box-sizing CSS
are preserved (orthogonal fixes). MultiSelect takes selectedSummary from
woodPrimary.ts (names in closed state) + the ms-count testid + onDestroy
timer cleanup; duplicate close()/summary definitions dropped.

Gates: backend 117/117, unit 88/88, tsc clean, e2e 6/6 (m3-create +
photo-strip).
2026-09-21 11:59:36 -07:00
Ty 1a50fad0a5 merge issue-89-metadata-lock → main (Create-string model, #89/#90)
Drop the metadata_locked column + "Save and lock" UI end-to-end. The
review endpoint now builds the deterministic title/short_description on
every call; the owner's Create title / Create short desc buttons fire
the build and write the result (force-overwrite contract). commitReview
auto-fills only empty fields (no owner-clobber) and folds the
deterministic copy into its single PUT (kills the client_rev 409
cascade).

Taken wholesale from the branch: photo strip, wood primary/secondary,
server-side thickness band (hidden from UI, passed to Woo on publish),
and fixes #80/#82/#83/#84.

- backend: remove metadata_locked from schema.sql, db sentinels,
  slabs.py client fields/exposure, review.py lock action; review
  always computes title/short_desc
- frontend: slabs.ts + Review.svelte drop the lock model, add
  Create-string workflow + wood primary + photo strip
- e2e: m3-create + review-photo-strip rewritten for the Create-string
  contract; thickness-band test asserts absence (per #90)
- deploy: recreate LAN binds (override-m3.yml was absent); verify
  metadata_locked gone, review builds title, PUT persists

Gates: backend 117/117, unit 88/88, tsc clean, e2e 6/6 (m3-create +
photo-strip). Live UAT verified at 192.168.1.202:10881.
2026-09-21 11:54:48 -07:00
grokbot_ty e61303e2d8 Merge pull request 'fix(review): #88 thickness band derived; #90 MultiSelect names + commit' (#97) from work/ux-bugs-fixes into main 2026-09-21 17:01:49 +00:00