Files
SlabUploader/deploy/INVENTORY.md
T

266 lines
20 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.
# 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-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.