256 lines
19 KiB
Markdown
256 lines
19 KiB
Markdown
# 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 ~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.
|