20 KiB
20 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-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; assetindex-B5UqdfVE.js; overnight:10890still 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· LANhttp://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-1left 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; assetindex-D5uJ69-T.js; overnight:10890still 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· LANhttp://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-1left 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; assetindex-CqzE4pdY.js; overnight:10890still 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· LANhttp://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-1left 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; assetindex-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· LANhttp://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· LANhttp://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-1left 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; assetindex-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· LANhttp://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-1left 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; assetindex-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· LANhttp://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-1left 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; assetindex-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· LANhttp://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; assetindex-BJxrob4c.js - Call 1 still 410
call1_disabled;GET .../inference/call2/promptlive (View prompt) - URLs: Tailscale
http://100.64.0.9:10890· LANhttp://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 (11fig-*, 3feat-*); 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; assetindex-DA24IrWT.js - Call 1 still 410
call1_disabled - URLs: Tailscale
http://100.64.0.9:10890· LANhttp://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-1left 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; assetindex-Cgc1wxKP.js - Call 1 still 410
call1_disabled - URLs: Tailscale
http://100.64.0.9:10890· LANhttp://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-1left running) - Left alone:
deploy-*10881/10882, greenfield 10884/10885, m4 10883, m1 18080 - Health:
GET http://127.0.0.1:10890/api/health→ ok; Tailscale100.64.0.9:10890→ ok; root/→ 200; assetindex-4mcBthul.js - Call 1 still 410
call1_disabled - URLs: Tailscale
http://100.64.0.9:10890· LANhttp://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/ LAN192.168.1.202/ Tailscale100.64.0.9 - Checkout:
~/slab-deploy@6caa4f6branchovernight-whole-app - Compose: host-local untracked
deploy/override-overnight.ymlas 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 reusedeploy_slab_*) - Left alone:
deploy-*10881/10882, greenfield 10884/10885, m4 10883, m1 18080 - Health:
GET http://127.0.0.1:10890/api/healthand 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→ 410call1_disabled - URLs for Ty: Tailscale
http://100.64.0.9:10890· LANhttp://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/ LAN192.168.1.202/ Tailscale100.64.0.9 - Checkout:
~/slab-deploybranchovernight-whole-app@6caa4f6(fix(uat): allow Cloudflare quick-tunnel Host on vite preview) - Compose project:
deploy→ containersdeploy-frontend-1/deploy-fastapi-1only - 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 buildthenup -d, no-v); volumesdeploy_slab_db/deploy_slab_imagespreserved - Health:
GET /api/health→{"status":"ok","version":"0.5.0-m3","woo_reachable":true}from 127.0.0.1 and from Tailscale100.64.0.9; root/→ 200 - Call 1:
POST /api/v1/slabs/{id}/inference/call1→ 410call1_disabled - URLs for Ty: Tailscale
http://100.64.0.9:10881· LANhttp://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-lineb44e231→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_URLfrom~/.config/slabuploader/woo.env(password not logged);SLAB_AES_KEYfrom local file (not in repo). - Call 1:
POST .../inference/call1→ 410 call1_disabled. Call 2 path retained. - Health:
/api/healthok;woo_reachablemay 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:
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.