13 Commits
Author SHA1 Message Date
m038 1a6afe86fc fix(review): operator-agnostic sanity check + invariant TODOs + dedupe
Code-review follow-ups on the pgvector spike:
- self-similarity sanity check now compares to the seed's own self-distance
  (0 for cosine/L2, ~-1 for inner product <#>) instead of a hardcoded ~0, so it
  no longer misfires if Immich ever uses a vector_ip_ops index (correctness P3).
- mark the deliberate raw-SQLite read in the probe as a spike-only exception and
  add an M1.5 TODO that the real pgvector reader belongs in shared/photoflow/immich
  and SQLite access in shared/photoflow/core (project-standards P2 x2).
- document join_and_coverage's return shape; extract a _pct() helper to dedupe the
  coverage-percentage formatting (maintainability P3 x2).
Findings doc refreshed from the latest live run (coverage now ~46%, re-run ongoing).
2026-06-27 20:50:06 +02:00
m038 ade19fa094 feat(config): add optional IMMICH_DB_URL for pgvector spike
Optional Postgres DSN field on Config (REST creds stay required), env.example
entry, and a throwaway scripts/requirements-spike.txt (psycopg3 + pgvector)
kept out of the app's runtime deps. Unblocks the M1.5 pgvector feasibility spike.
2026-06-27 20:32:07 +02:00
m038 bd8fe59b49 fix(ingest): don't advance incremental cursor past a failed/sampled asset
A later successful asset could push last_ingest_at past an earlier asset whose
thumbnail download failed, permanently excluding it from later incremental runs
(only --full recovered it). Now the cursor never advances to/past the earliest
failed asset, never below the prior cursor, and not at all on a --subset run.
Regression tests added. (review finding #9)
2026-06-27 18:49:24 +02:00
m038 ae093881fa fix(review): harden write-back, confirmation gate, and edge cases
- write-back: call upsert_tag inside _apply_tag's try so a tag-create failure
  is caught per-asset and apply_all no longer aborts mid-batch (was P1)
- write-back: surface _pipeline/processed write failures in the result instead
  of discarding them (was reported as success)
- ui: add title to the high confidence badge so approve-high-confidence's
  pre-action count is non-zero; confirm() before single-cluster apply
- core: Store context manager; close DB connection even if a route raises;
  guard split_cluster against a first-member boundary (empty cluster); add
  writeback_log lookup index
- ingest: split thumbnail download/write error handling and clean up the
  .tmp file on a write failure
- tests: upsert/processed write-failure regression tests + split-guard test
2026-06-27 17:54:38 +02:00
m038 edf0735098 feat(trip-cluster): master/detail review routes + templates + clusterReview JS 2026-06-27 17:35:58 +02:00
m038 44c05444d3 feat(trip-cluster): idempotent write-back + CLI apply with confirmation 2026-06-27 17:35:58 +02:00
m038 5256df4117 feat(trip-cluster): cluster orchestration (seed derivation + coverage) + CLI 2026-06-27 17:28:27 +02:00
m038 a9b443cd53 feat(trip-cluster): cluster review operations (approve/non-trip/skip/split/merge/bulk) 2026-06-27 17:21:38 +02:00
m038 6d0c9662ee feat(trip-cluster): ingest — scopeable, incremental, processed read-back 2026-06-27 17:21:38 +02:00
m038 8d58ec03a9 feat(trip-cluster): coverage detection — completeness flags + outliers 2026-06-27 17:19:06 +02:00
m038 e01b30a5b5 feat(trip-cluster): config, factory, CLI skeleton, health + thumb proxy 2026-06-27 17:19:06 +02:00
m038 76be1fb5af feat(trip-cluster): density-adaptive timestamp clustering + tag seeds + anchors 2026-06-27 17:16:07 +02:00
m038 01ac95059e feat: monorepo scaffold — photoflow shared dist + trip-cluster app skeleton 2026-06-27 17:08:11 +02:00