33ac3ae69c1481f63ee41512bb4d72faf63a7b30
Multi-persona review (coherence, feasibility, product-lens, security-lens, adversarial) surfaced that the spike proved DB access but not that DB access was the right path or that the signal was useful, and pinned a contract against a private, in-flight-changing schema. Applied 11 fixes: - Requirement 0: test the "REST can't expose embeddings" premise instead of asserting it; record which endpoints were checked and why insufficient. - Reframe Req 1 "real go/no-go" to access-only; signal-usefulness is M1.5's first task, not this spike's. - Mark the schema unsupported/internal, version-pinned; require an M1.5 re-probe/version-guard per Immich upgrade; tie shape to recorded model+ver. - Fix probe correctness: pgvector adapter / server-side vector_dims (psycopg3 returns vector as string); Postgres-internal join with optional SQLite cross-check; coverage over the image/embeddable population (both ratios). - DB-enforced read-only session; standalone .env loading; psycopg+pgvector added to Deliverables; roadmap correction now fixes both false claims. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
immich-photo-flow
A monorepo of small tools that clean up and structure a large Immich
library into travel "memories". M1 ships the shared foundation
(shared/photoflow/{immich,core,ui}) and the trip-cluster app.
Layout
shared/photoflow/immich— the one Immich REST client +_pipeline/tag conventions.shared/photoflow/core— SQLite store + domain models (the only SQL).shared/photoflow/ui— base template, DaisyUI/Tailwind/Alpine/HTMX, shared grid+lightbox.apps/trip-cluster— CLI + Flask review UI (port 8084).
Dev setup
python3.12 -m venv .venv
.venv/bin/pip install -e ./shared -e ./apps/trip-cluster \
pytest==8.3.4 pytest-httpserver==1.1.0 pytest-playwright==0.6.2
.venv/bin/python -m pytest # unit + route tests
.venv/bin/python -m playwright install chromium
.venv/bin/python -m pytest apps/trip-cluster/tests/ui # Playwright UI
trip-cluster workflow
cp .env.example .env # fill IMMICH_URL + IMMICH_API_KEY
cd apps/trip-cluster
python categorize.py ingest --tag "Italy 2019" # or --from/--to/--subset
python categorize.py cluster
python categorize.py serve # review at http://localhost:8084
python categorize.py apply # write approved tags back (asks to confirm)
Immich is the source of truth; SQLite is a rebuildable working layer. Content/trip tags
are never namespaced; pipeline meta-tags live under _pipeline/.
Languages
Python
87%
JavaScript
6.6%
HTML
6.2%
Dockerfile
0.2%