{"slug":"enrich-local-hybrid","total":13,"limit":100,"offset":0,"since":null,"commits":[{"hash":"695cb76","date":"2026-09-23 18:07:37 -0700","author":"Steve Abrams","subject":"DEPLOY.md: mark exo-vision repoint FIXED+DEPLOYED+VERIFIED on Kamatera (TK-12090/TK-12113)","body":""},{"hash":"e7e778b","date":"2026-09-23 17:47:52 -0700","author":"Steve Abrams","subject":"enrich-local: EXO_TIMEOUT_MS 15s->45s (warm real-image vision ≈14s; give working exo calls headroom before falling to paid Gemini) TK-12090","body":""},{"hash":"5193103","date":"2026-09-23 17:47:04 -0700","author":"Steve Abrams","subject":"enrich-local: fast-fail exo (15s) + consecutive-failure circuit breaker so a loaded/cold ring can't stall a 1500-image cron (TK-12090)","body":""},{"hash":"63ea825","date":"2026-09-23 14:52:45 -0700","author":"Steve Abrams","subject":"Route local vision leg through shared exo-vision lib, drop direct Ollama call (TK-12090 Lane E)","body":"enrich-local.js's ollamaVL() hit a hardcoded Mac tailnet Ollama host\ndirectly; Ollama is retired fleet-wide. Now calls\n~/Projects/_shared/lib/exo-vision.mjs visionChat() (exo ring primary $0,\nGemini fallback cost-ledgered). Ollama's grammar-constrained format:schema\nhas no lib equivalent, so the schema is now spelled out in-prompt and\nparsed leniently. Output aiData shape is unchanged (verified against\nenrich-ai-tags.patched.js's field reads).\n\nFound in the process: Kamatera's live full-monte/.env already points\nENRICH_OLLAMA_URL at 100.82.17.107:11434 (a 2026-06-30 Mac1->Mac2 tailnet\nfailover) with ENRICH_PROVIDER=local already live — so production has\nbeen silently 100% Gemini-billed since Ollama died on that host, with the\n\"local hybrid\" fallback swallowing every failure. Verified Kamatera can\nreach that same host's exo ring at :52415 (HTTP 200). DEPLOY.md documents\nthe fix + the required VISION_URL env cutover; the actual Kamatera\nredeploy is left gated for Steve (live prod script + env change).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KXUyzc9vybUz39rhnNJdwY"},{"hash":"0efb0b0","date":"2026-08-31 12:15:24 -0700","author":"Steve","subject":"reconcile-image-less: guard mfr_sku col + scope to monitor's actionable set (live-parsed exclusions); dry-run confirms 3419 rows","body":""},{"hash":"2b5fd92","date":"2026-08-31 12:08:58 -0700","author":"Steve","subject":"Add reversible Phase-3 image-less phantom-backlog reconcile (TK-phase3-phantom, staged/gated)","body":""},{"hash":"11302b0","date":"2026-08-06 14:28:54 -0700","author":"steve","subject":"enricher: dead-image drain guard + tag-on-skip (TK-10168)","body":"loadProducts() re-loaded dead-image rows every run (unfetchable URL → fetch fails →\nself-skip → stays untagged → re-churned forever). Two additive changes:\n1. drain guard: exclude image_rejected IS DISTINCT FROM TRUE from the enrichable queue.\n2. tag-on-skip: a genuinely dead image (geminiAnalyze all-candidates-failed) now returns a\n   DISTINCT {__deadImage} sentinel; the main loop flags image_rejected=TRUE once + continues.\nSentinel avoids the naive-fix bug of mis-tagging 429/no-data nulls as dead images.\nReversible; writes gate on the normal enricher run. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"20434f1","date":"2026-07-03 08:08:02 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"029e667","date":"2026-07-01 15:10:29 -0700","author":"Steve Abrams","subject":"palette: make vl_max env-tunable via ENRICH_VL_MAX (default 1024, backward-compatible)","body":""},{"hash":"79237c9","date":"2026-06-24 10:46:25 -0700","author":"Steve","subject":"enrich-local: raise VL timeout 120s→300s + keep_alive 15m to absorb Mac1 cold-load","body":""},{"hash":"204b3e2","date":"2026-06-24 09:08:45 -0700","author":"Steve","subject":"fix: normalize image through Pillow→JPEG before VL (catalog CMYK/WebP images broke ollama image loader)","body":""},{"hash":"168999c","date":"2026-06-24 08:59:40 -0700","author":"Steve","subject":"DEPLOY.md: exact go-live = one line in full-monte/.env (Phase-3 spawns enrich-ai-tags w/ inherited env)","body":""},{"hash":"4008570","date":"2026-06-24 08:52:51 -0700","author":"Steve","subject":"hybrid local enrich-ai-tags: ground-truth hex (Pillow) + qwen2.5vl semantics, Gemini fallback, off-by-default","body":""}]}