Files
SlabUploader/deploy/INVENTORY.md

22 KiB
Raw Permalink Blame History

Host

Port block 10880–10889 on ubudual5060 is allocated to this project. :10880 is Ty's local Node/SvelteKit and must never be bound by project deploys. The dev-test environment binds 0.0.0.0 so any machine on 192.168.1.0/24 can reach it. Check to see if you are running on ubudual5060 (192.168.1.202) before attempting SSH.

Dev-test environment (M2 current, M3 incoming)

  • Host: ubudual5060 / LAN 192.168.1.202 / Tailscale 100.64.0.9
  • Container: slabuploader-m2-overnight (image slabuploader-m2:overnight)
  • Port: 10881 → 80, bound 0.0.0.0
  • URLs: http://192.168.1.202:10881 (LAN) · http://100.64.0.9:10881 (Tailscale)
  • M3 replaces this container on the same port; remove the M2 container once M3 is healthy.

Ty local Node/SvelteKit (do not overwrite)

  • Host: ubudual5060 / 100.64.0.9
  • Container: slabuploader-m1
  • Port: 18080 → 80 (inventory previously listed 10880; that port is off limits to project deploys)
  • URL: http://100.64.0.9:18080
  • Never recreate or remap this container for project deploys.

Future deploys use a separate container name and a free port in 10880–10889 (other than 10880), bound 0.0.0.0. Do not put a host name in the product spec.

Deploy records

2026-09-27 ~09:05 PT — Jeff-facing UI/copy pass on proto :10892

  • Source: proto-per-user-woo-creds @ 20a7d7d (feat(ui): Jeff-facing copy + 3:4 inventory thumbs + fixed overlay font)
  • Compose: -p slab-proto-woo-creds + deploy/override-proto-woo-creds.yml — frontend rebuilt/recreated (slab-proto-woo-creds-fastapi-1 left running)
  • Left alone: overnight :10890/:10891, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10892/api/health → ok; root / → 200; asset index-BJygplat.js; overnight :10890 still 200
  • UX: 3:4 contain inventory thumbs (Photos ready / Review / Publish preview); overlay font fixed 36px; Jeff-plain Measure/Photos/Review copy; View prompt Settings checkbox default off; SVG lock on required photos; red missing/not-ready
  • Out of scope (next pass): Settings/Woo gate string polish
  • URLs: Tailscale http://100.64.0.9:10892 · LAN http://192.168.1.202:10892

2026-09-26 ~22:50 PT — Create title / content LLM gate fix on proto :10892

  • Source: proto-per-user-woo-creds @ fca3239 (fix(review): Create title no silent fail; gate enables content LLM)
  • Compose: -p slab-proto-woo-creds + deploy/override-proto-woo-creds.yml — fastapi + frontend rebuilt/recreated
  • Left alone: overnight :10890/:10891, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10892/api/health → ok; root / → 200; asset index-B5UqdfVE.js; overnight :10890 still 200
  • Root cause: Create title silently echoed a pre-typed title when species/primary missing from taxonomy; WooSetupGate saved inference URL/key without enabling content_llm_enabled (Create desc showed “content LLM on”)
  • Fix: title_built + persist wood cats before build; gate turns on content LLM when URL+key set (Call 1 stays out); Create-desc gate also requires inference creds
  • URLs: Tailscale http://100.64.0.9:10892 · LAN http://192.168.1.202:10892

2026-09-26 ~21:30 PT — Measure Zoom/Pan opaque cutout (iOS) on proto :10892

  • Source: proto-per-user-woo-creds @ 5ace4a2 (fix(capture): opaque mask overlay on Measure Zoom/Pan (iOS))
  • Compose: -p slab-proto-woo-creds + deploy/override-proto-woo-creds.yml — frontend rebuilt/recreated (slab-proto-woo-creds-fastapi-1 left running)
  • Left alone: overnight :10890/:10891, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10892/api/health → ok; root / → 200; asset index-D5uJ69-T.js; overnight :10890 still 200
  • Root cause: tape mode alpha-punched non-slab → mostly-transparent canvas inside CSS-transformed photo-layer; iOS Safari blanked it (Ty: checkerboard + tape only). Fix: opaque checkerboard cover like Mask; drop will-change
  • Probe: woodish=221791, transparent=0, checker=7.1M on :10892
  • URLs: Tailscale http://100.64.0.9:10892 · LAN http://192.168.1.202:10892

2026-09-26 ~20:56 PT — Measure Zoom/Pan cutout in-place punch on proto :10892

  • Source: proto-per-user-woo-creds @ af7d4c9 (fix(capture): punch tape cutout in-place; drop maskedPreview swap)
  • Compose: -p slab-proto-woo-creds + deploy/override-proto-woo-creds.yml — frontend rebuilt/recreated (slab-proto-woo-creds-fastapi-1 left running)
  • Left alone: overnight :10890/:10891, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10892/api/health → ok; root / → 200; asset index-CqzE4pdY.js; overnight :10890 still 200
  • UX: tape PhotoStage punches non-slab alpha in-place (Mask-style); Measure binds source+bitset (no async alpha PNG swap); Zoom/Pan cutout on CSS checkerboard
  • URLs: Tailscale http://100.64.0.9:10892 · LAN http://192.168.1.202:10892

2026-09-26 ~20:48 PT — Measure Zoom/Pan cutout restore on proto :10892

  • Source: proto-per-user-woo-creds @ ca983c4 (fix(capture): show bg-removed cutout on Measure Zoom/Pan immediately)
  • Compose: -p slab-proto-woo-creds + deploy/override-proto-woo-creds.yml — frontend rebuilt/recreated (slab-proto-woo-creds-fastapi-1 left running)
  • Left alone: overnight :10890/:10891, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10892/api/health → ok; root / → 200; asset index-CuoK2mhY.js
  • UX: tape-mode mask checkerboard + immediate source+bitset stage (alpha PNG when ready); Zoom/Pan cutout on checkerboard
  • URLs: Tailscale http://100.64.0.9:10892 · LAN http://192.168.1.202:10892

2026-09-26 ~19:20 PT — Woo setup gate on proto :10892

  • Source: proto-per-user-woo-creds @ 2f9b8eb (proto(woo): blocking setup gate; require X-Woo-* on Woo HTTP routes)
  • Compose: -p slab-proto-woo-creds + deploy/override-proto-woo-creds.yml — fastapi + frontend rebuild
  • Left alone: overnight :10890/:10891, deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • UX: full-screen WooSetupGate until device WP user + app password pass Test Woo; reopen on woo_auth / missing headers
  • Server: publish / taxonomy sync / test-woo require X-Woo-* (no Settings fallback); health still uses Settings
  • URLs: Tailscale http://100.64.0.9:10892 · LAN http://192.168.1.202:10892

2026-09-26 ~12:01 PT — Measure Zoom/Pan vs Rotate + drop dead ↻ on :10890

  • Source: overnight-whole-app @ f505be0 (fix(capture): Zoom/Pan vs Rotate gesture modes; drop dead ↻ overlay)
  • Compose: -p slab-overnight + deploy/override-overnight.yml — frontend rebuilt/recreated (slab-overnight-fastapi-1 left running)
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10890/api/health → ok; root / → 200; asset index-CsENRLHF.js
  • UX: Measure stage segmented Zoom / Pan (default) vs Rotate; pinch/pan exclusive of two-finger twist; removed bottom-center ↻ that overlapped tick B
  • URLs: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890

2026-09-26 ~11:47 PT — Publish preview before Woo draft POST on :10890

  • Source: overnight-whole-app @ 73e2818 (feat(publish): Publish preview before Woo draft POST)
  • Compose: -p slab-overnight + deploy/override-overnight.yml — frontend rebuilt/recreated (slab-overnight-fastapi-1 left running)
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10890/api/health → ok; root / → 200; asset index-Co2F8tsa.js
  • UX: Review → Continue to Publish → glanceable preview (thumbs, SKU/title/price, taxonomy/dims, short+long desc) → Publish / Back to Review
  • URLs: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890

2026-09-26 ~11:08 PT — Review UI nits (margins, buttons, moisture, live validation) on :10890

  • Source: overnight-whole-app @ 5651a38 (fix(review): UI nits — margins, buttons, moisture, live validation)
  • Compose: -p slab-overnight + deploy/override-overnight.yml — frontend rebuilt/recreated (slab-overnight-fastapi-1 left running)
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10890/api/health → ok; root / → 200; asset index-C1jF-uuB.js
  • Nits: post-publish no Back; removed white Slabs footer control; Review/App padding; unified .btn-sec; moisture kd + live input validation
  • URLs: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890

2026-09-26 ~10:12 PT — Review View prompt + Call 2 declared attrs / Create-desc gate on :10890

  • Source: overnight-whole-app @ 1ff082f (feat(review): View prompt + Call 2 declared attrs, Create-desc gate)
  • Compose: -p slab-overnight + deploy/override-overnight.yml — fastapi + frontend rebuilt/recreated
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080; never :10880
  • Health: GET http://127.0.0.1:10890/api/health → ok; root / → 200; asset index-BJxrob4c.js
  • Call 1 still 410 call1_disabled; GET .../inference/call2/prompt live (View prompt)
  • URLs: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890

2026-09-26 ~09:42 PT — Review metadata: slug tags, decode names, no fig picker / AI labels on :10890

  • Source: overnight-whole-app @ 85786f1 (fix(review): slug-scoped tags, decode names, drop fig picker & AI labels)
  • Compose: -p slab-overnight + deploy/override-overnight.yml — fastapi + frontend rebuilt/recreated
  • Taxonomy re-sync: POST /api/v1/admin/taxonomy/sync → 14 tags (11 fig-*, 3 feat-*); cats decode & → &
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080
  • Health: GET http://127.0.0.1:10890/api/health → ok; root / → 200; asset index-DA24IrWT.js
  • Call 1 still 410 call1_disabled
  • URLs: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890

2026-09-26 ~09:12 PT — PNG size floor warn 300–799 / block <300 on :10890

  • Source: overnight-whole-app @ 1b5ad11 (fix(capture): warn 300–799px PNG floor; hard-block only below 300)
  • Compose: -p slab-overnight + deploy/override-overnight.yml — frontend only rebuilt/recreated (slab-overnight-fastapi-1 left running)
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080
  • Health: GET http://127.0.0.1:10890/api/health → ok; root / → 200; asset index-Cgc1wxKP.js
  • Call 1 still 410 call1_disabled
  • URLs: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890

2026-09-26 ~08:58 PT — fix Create title species carry-forward on :10890

  • Source: overnight-whole-app @ 76f3026 (fix(review): carry Measure species into Create title/short-desc)
  • Compose: -p slab-overnight + deploy/override-overnight.yml — frontend only rebuilt/recreated (slab-overnight-fastapi-1 left running)
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080
  • Health: GET http://127.0.0.1:10890/api/health → ok; Tailscale 100.64.0.9:10890 → ok; root / → 200; asset index-4mcBthul.js
  • Call 1 still 410 call1_disabled
  • URLs: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890

2026-09-25 ~22:06 PT — overnight-whole-app SEPARATE stack on :10890/:10891

  • Intentional ports: frontend 10890, fastapi 10891 (1089x range; avoids fighting 10881/10882).
  • Host: ubudual5060 / LAN 192.168.1.202 / Tailscale 100.64.0.9
  • Checkout: ~/slab-deploy @ 6caa4f6 branch overnight-whole-app
  • Compose: host-local untracked deploy/override-overnight.yml as standalone file (not merged with base); project -p slab-overnight
  • Containers: slab-overnight-frontend-1 / slab-overnight-fastapi-1
  • Binds: 0.0.0.0:10890→80, 0.0.0.0:10891→8000 (+ loopback 18090/18091)
  • Volumes: dedicated slab-overnight_slab_overnight_db / _images (did not reuse deploy_slab_*)
  • Left alone: deploy-* 10881/10882, greenfield 10884/10885, m4 10883, m1 18080
  • Health: GET http://127.0.0.1:10890/api/health and Tailscale → {"status":"ok","version":"0.5.0-m3","woo_reachable":false} (fresh DB; Woo app password not yet in Settings). Root / → 200.
  • Call 1: POST /api/v1/slabs/{id}/inference/call1 → 410 call1_disabled
  • URLs for Ty: Tailscale http://100.64.0.9:10890 · LAN http://192.168.1.202:10890
  • Note: an earlier mistaken recreate put overnight bits onto deploy-* :10881/:10882; that stack was then left running untouched. Canonical overnight prop is 10890/10891.
  • Box Cloudflare quick tunnel stopped; box local :18181/:18182 left running.

2026-09-25 ~22:05 PT — overnight-whole-app on ubudual5060 :10881/:10882

  • Host: ubudual5060 / LAN 192.168.1.202 / Tailscale 100.64.0.9
  • Checkout: ~/slab-deploy branch overnight-whole-app @ 6caa4f6 (fix(uat): allow Cloudflare quick-tunnel Host on vite preview)
  • Compose project: deploy → containers deploy-frontend-1 / deploy-fastapi-1 only
  • Ports: 0.0.0.0:10881→80, 0.0.0.0:10882→8000 (+ loopback 18082/18083 from host .env); did not touch 10880 / slabuploader-m1 (18080) / greenfield 10884–10885 / m4-review 10883
  • Build: on UAT host (docker compose -f deploy/docker-compose.yml --env-file deploy/.env build then up -d, no -v); volumes deploy_slab_db / deploy_slab_images preserved
  • Health: GET /api/health → {"status":"ok","version":"0.5.0-m3","woo_reachable":true} from 127.0.0.1 and from Tailscale 100.64.0.9; root / → 200
  • Call 1: POST /api/v1/slabs/{id}/inference/call1 → 410 call1_disabled
  • URLs for Ty: Tailscale http://100.64.0.9:10881 · LAN http://192.168.1.202:10881
  • Box Cloudflare quick tunnel (cloudflared tunnel --url http://127.0.0.1:18181) stopped; box local :18181/:18182 left running

2026-09-25 ~17:50 PT — overnight-whole-app box UAT (Grok Bot computer)

  • Branch: overnight-whole-app (main @ 0c00d25 + cherry-picked #99 tape-line b44e231→323f29b→be2ea6c + Call 1 OUT).
  • Frontend: vite preview 0.0.0.0:18181 (proxy /api → FastAPI). Never touch :10880.
  • Backend: uvicorn 0.0.0.0:18182 (backend.app:app), local SQLite under .uat-data/ (gitignored).
  • Env: WOO_BASE_URL from ~/.config/slabuploader/woo.env (password not logged); SLAB_AES_KEY from local file (not in repo).
  • Call 1: POST .../inference/call1 → 410 call1_disabled. Call 2 path retained.
  • Health: /api/health ok; woo_reachable may be false from this box (network) — draft-only smoke.
  • Partner Woo UAT containers: not touched.

2026-09-21 02:41 PDT — #90 wood primary category + derived thickness band

  • Source ref: 0329052 on issue-89-metadata-lock (pushed to Gitea; pulled into ~/slab-deploy).
  • Images (built on ubudual5060): deploy-frontend:latest 1c169c29f131, deploy-fastapi:latest 32671659639b.
  • Compose: deploy/docker-compose.yml + host-local (untracked) deploy/override-m3.yml.
  • URL: http://192.168.1.202:10881 (LAN) · http://100.64.0.9:10881 (Tailscale).
  • matches HEAD: yes.
  • Sample data preserved: yes — 24 slabs before and after up -d (no -v, no volume removal).
  • Verified on the live stack: served asset assets/index-tlFib3RM.js (sha256 3b665746ec81f28e…) contains the new markers and no #thickness select; POST /api/v1/slabs at thickness_in 1.0 stored band 350 (1"- 1 1/2"); PUT at 2.75 re-banded to 352; a client-sent stale band id was ignored; POST /review no longer lists thickness as missing; the Review screen in a real browser (LAN URL) shows the wood-category MultiSelect closed summary with names + count, the Primary wood category radio set switching on click, and the band as read-only text.
  • Not exercised: the Woo publish path. Rows created before this deploy keep thickness_term_id NULL until their next save (the band is derived on write, so any Review commit fills it in).

2026-09-21 03:12 PDT — follow-up: thickness band omitted entirely from Review

  • Commit: 204bc5e (fix #90: band removed from UI, not merely read-only; publish test added).
  • Rebuilt deploy-frontend:latest and recreated the container on 10881.
  • Live verification: served HTML and bundle contain zero occurrences of "Thickness band" or "set from the measurement".
  • Sample data unchanged (still 25 slabs post-recreate).
  • All gates (unit, build, requirements, coverage, m3-create e2e) pass.

2026-09-21 11:52 PDT — merge issue-89-metadata-lock → main (Create-string model)

  • Source: branch work/merge-89-90 (base origin/issue-89-metadata-lock + Create-string re-applied). matches HEAD: no — staged from the uncommitted working tree (local sync; Gitea push not attempted this round). 9 files changed: Review.svelte, slabs.ts, review.py, slabs.py, schema.sql, db/__init__.py, test_review.py, m3-create.spec.ts, review-photo-strip.spec.ts.
  • Model change: metadata_locked DB column + "Save and lock" UI dropped end-to-end. The deterministic title/short_description are now built by the review endpoint on every call; the owner's Create title / Create short desc buttons fire the build and write the result (overwrite contract). commitReview auto-fills only empty fields (no owner-clobber); createTitle is the explicit force-overwrite. Photo strip, wood primary/secondary, and server-side thickness band (item: not shown in UI, passed to Woo on publish) all taken from the branch.
  • LAN binds: deploy/override-m3.yml was absent from disk; the live stack's 10881/10882 LAN binds were re-created by editing deploy/docker-compose.yml ports in-place (loopback 18082/18083 from .env + 0.0.0.0:10881/0.0.0.0:10882), then down --remove-orphans + up -d (no -v).
  • Bundle: assets/index-YPAqx609.js (new; contains create-title). API /api/health woo_reachable:true.
  • Sample data preserved: yes — 34 slabs before/after.
  • Live verification (LAN URL, real DB): slabs table has no metadata_locked column; slab_photos.role present. POST /review on slab ec4088da… → title:'Curl Black Walnut Slab', ready:True. PUT title persisted (rev 1→2) then restored (original sample value intact, rev 3).
  • Not exercised live: the full browser Create-button click (verified via in-repo Playwright 6/6 m3-create + review-photo-strip; the endpoint + PUT path are proven live above). Woo publish path not exercised this round.

2026-09-21 12:10 PDT — redeploy: main after merge 8ee3da9 (reconciled PR #97 + branch)

  • Source: main @ 8ee3da9 (merge of work/merge-89-90 into main, which itself reconciled main's PR #97 client-side thicknessBand.ts + syncSelects/box-sizing against the branch's server-side thickness_band.py + Create-string #89). matches HEAD: yes.
  • Resolution outcome in the deployed bundle: band is server-side — Review.svelte no longer imports thicknessBand and the read-only band display is gone; PR #97's syncSelects() (3× in source) + box-sizing CSS preserved; metadata_locked still dropped; Create-string + photo strip + wood primary live.
  • Rebuilt both images from main; recreated the stack (down --remove-orphans + up -d, no -v). LAN binds 10881/10882 intact.
  • Bundle: assets/index-BScrgd8o.js (new; differs from pre-merge YPAqx609; contains create-title, zero thicknessBand references). API /api/health woo_reachable:true.
  • Sample data preserved: yes — 35 slabs (one added upstream since last deploy).
  • Live verification (LAN URL, real DB): POST /review on slab ec4088da… → title:'Curl Black Walnut Slab', ready:True.
  • Gates at merge time: backend 117/117, unit 88/88, tsc clean, e2e 6/6 (m3-create + photo-strip).
  • Branches work/merge-89-90 and issue-89-metadata-lock deleted (local + remote); remote has only main.

2026-09-21 12:34 PDT — Review mount: restore dropped lineup/woodPrimary imports

  • Source: uncommitted working tree on main (parent 67aa3d6). matches HEAD: no. Diff: frontend/src/create/review/Review.svelte +5 lines restoring imports of keptInOrder/moveItem/missingMinimums/roleLabel/resolvePhotoUrl/LineupItem from lineup.ts and nextPrimary from woodPrimary.ts. The morning merge kept the call sites and dropped the imports → ReferenceError on Review mount → "Could not load the slab."
  • Rebuilt deploy-frontend only (compose build frontend + up -d frontend, no -v). Image 56b35f6cdcdf. FastAPI container left running.
  • URL: http://192.168.1.202:10881 (LAN) · loopback 127.0.0.1:18082
  • Bundle: assets/index-BVCyM130.js (replaced index-ck41xD02.js). Served JS has 0 nextPrimary/keptInOrder (minified locals) vs 3 unresolved nextPrimary in the broken bundle.
  • Sample data preserved: yes — 47 slabs before rebuild; 48 after live Capture→Review probe (created ef1f4101-b1d2-459d-b9a0-842e7650ea3c, sku NULL, status calibrated, 48×2 in; not published).
  • Live verification (loopback, real API): Continue to Review → review-screen visible, heading "Review to Ready", no loadError, no pageerror. POST /slabs 201, photos 201×2, GET slab/taxonomy/settings 200, review 200.
  • In-repo mock e2e (m3-create + photo-strip) 6/6 green against the same bundle hash before deploy.
  • Not done: commit/push of the import restore; Woo publish path not re-exercised this round.