86091ed916
Standalone compose (project slab-greenfield) on ports 10884/10885 with dedicated slab_greenfield_* volumes; live M3/M4 stacks (10881/10882/10883) untouched. All smoke checks pass; Woo draft pending live creds (P5 exit).
9.7 KiB
9.7 KiB
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/ LAN192.168.1.202/ Tailscale100.64.0.9 - Container:
slabuploader-m2-overnight(imageslabuploader-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-21 02:41 PDT — #90 wood primary category + derived thickness band
- Source ref:
0329052onissue-89-metadata-lock(pushed to Gitea; pulled into~/slab-deploy). - Images (built on
ubudual5060):deploy-frontend:latest1c169c29f131,deploy-fastapi:latest32671659639b. - 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(sha2563b665746ec81f28e…) contains the new markers and no#thicknessselect;POST /api/v1/slabsatthickness_in 1.0stored band350(1"- 1 1/2");PUTat2.75re-banded to352; a client-sent stale band id was ignored;POST /reviewno longer lists thickness as missing; the Review screen in a real browser (LAN URL) shows the wood-category MultiSelect closed summary with names + count, thePrimary wood categoryradio 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_idNULL 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:latestand 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(baseorigin/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_lockedDB 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).commitReviewauto-fills only empty fields (no owner-clobber);createTitleis 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.ymlwas absent from disk; the live stack's 10881/10882 LAN binds were re-created by editingdeploy/docker-compose.ymlports in-place (loopback 18082/18083 from.env+0.0.0.0:10881/0.0.0.0:10882), thendown --remove-orphans+up -d(no-v). - Bundle:
assets/index-YPAqx609.js(new; containscreate-title). API/api/healthwoo_reachable:true. - Sample data preserved: yes — 34 slabs before/after.
- Live verification (LAN URL, real DB):
slabstable has nometadata_lockedcolumn;slab_photos.rolepresent.POST /reviewon slabec4088da…→title:'Curl Black Walnut Slab',ready:True.PUTtitle 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 ofwork/merge-89-90into main, which itself reconciled main's PR #97 client-sidethicknessBand.ts+syncSelects/box-sizingagainst the branch's server-sidethickness_band.py+ Create-string #89).matches HEAD: yes. - Resolution outcome in the deployed bundle: band is server-side —
Review.svelteno longer importsthicknessBandand the read-only band display is gone; PR #97'ssyncSelects()(3× in source) +box-sizingCSS preserved;metadata_lockedstill 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-mergeYPAqx609; containscreate-title, zerothicknessBandreferences). API/api/healthwoo_reachable:true. - Sample data preserved: yes — 35 slabs (one added upstream since last deploy).
- Live verification (LAN URL, real DB):
POST /reviewon slabec4088da…→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-90andissue-89-metadata-lockdeleted (local + remote); remote has onlymain.
2026-09-21 12:34 PDT — Review mount: restore dropped lineup/woodPrimary imports
- Source: uncommitted working tree on
main(parent67aa3d6).matches HEAD: no. Diff:frontend/src/create/review/Review.svelte+5 lines restoring imports ofkeptInOrder/moveItem/missingMinimums/roleLabel/resolvePhotoUrl/LineupItemfromlineup.tsandnextPrimaryfromwoodPrimary.ts. The morning merge kept the call sites and dropped the imports →ReferenceErroron Review mount → "Could not load the slab." - Rebuilt
deploy-frontendonly (compose build frontend+up -d frontend, no-v). Image56b35f6cdcdf. FastAPI container left running. - URL: http://192.168.1.202:10881 (LAN) · loopback 127.0.0.1:18082
- Bundle:
assets/index-BVCyM130.js(replacedindex-ck41xD02.js). Served JS has 0nextPrimary/keptInOrder(minified locals) vs 3 unresolvednextPrimaryin 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-screenvisible, 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.
2026-09-25 14:00 PDT — greenfield rebuild M1–M3 live (isolated project)
- Source: branch
rewrite/greenfield-app@49c22c9"feat(greenfield): rebuild SlabUploader M1-M3 on clean foundation, all gates green" (pushed to Gitea; pulled into~/slab-deploy).matches HEAD: yes (deploy tree clean at49c22c9). - Isolated deploy: standalone
deploy/greenfield-standalone.yml+COMPOSE_PROJECT_NAME=slab-greenfield(host-local, untracked). No base-file merge (avoids the compose ports-merge collision on 10881/10882). Dedicated volumesslab_greenfield_db/slab_greenfield_images— the livedeploy_slab_db/deploy_slab_images(10881/10882) are untouched. - URLs:
http://192.168.1.202:10884(LAN FE) ·http://100.64.0.9:10884(Tailscale) ·http://192.168.1.202:10885(LAN API) · loopback 127.0.0.1:18084 / 18085. SLAB_ENV=dev(mock-safe slice runs without live Woo creds at startup); real Woo creds are entered in-app (Settings) for the P5 UAT walk.WOO_BASE_URLfrom.env(https, store).- Smoke checks (§5) all pass: FE-served + direct
/api/health→{"status":"ok","version":"0.6.0-gf-p3a","woo_reachable":false}; fastapi log clean (schema ready (idempotent),Application startup complete, no refusal); FE serves<title>SlabUploader — Capture</title>;GET /settingsmasked (SETTINGS-75);GET /admin/taxonomy200 (empty cache); 404 envelope{"error":{...}}. - Existing stacks verified intact post-deploy:
deploy-frontend-1(10881),deploy-fastapi-1(10882),slabuploader-m4-review(10883),slabuploader-m1(18080). - Not done: the live
SLAB-UAT-*Woo draft (P5 exit) — needs Woo app password entered in Settings +test-woo+ the human UAT walk (QUALITY-105/30).