Commit Graph
37 Commits
Author SHA1 Message Date
m038 cc8de0e52d docs: add BACKLOG.md for near-term open tasks
Track loose ends between milestones: the pgvector spike's final coverage
snapshot (pending CLIP re-run completion), the M1 validation-gate run on a hard
sample, and the M1.5 least-privilege read-only role. Linked from ROADMAP.
2026-06-27 22:34:55 +02:00
m038 d9ba194b30 docs(spike): add runbook + definition of done
Consolidate the scattered run instructions and pass/fail criteria into one place:
- design spec gains 'Running the spike' (venv bootstrap + flags + DB prereqs) and
  'Definition of done' (Req 0-4 are the bar; coverage does not gate done-ness;
  the only follow-up at ~100% CLIP coverage is one no-flag re-run to snapshot the
  final coverage into the contract doc) sections, and the status line now reads
  'passed 2026-06-27'.
- script docstring Usage now includes the missing 'python3 -m venv .venv' bootstrap
  a fresh checkout needs, and points to the spec's definition of done.
2026-06-27 22:31:26 +02:00
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 7745f05323 docs(roadmap): correct M1.5 spike claims (spike now run + verified)
Fixes both false claims the spec flagged: M1.5 was never 'verified in M1' and M1
did not 'run a read-only feasibility spike' (it deferred it). The spike has now
run separately and passed, so both are updated to point at the findings spec
(smart_search.embedding, 1152-dim, cosine, clean assetId->asset.id join) and the
spike is listed under Related specs.
2026-06-27 20:40:26 +02:00
m038 4882f4ca5a feat(spike): read-only pgvector probe + live findings
scripts/pgvector_spike.py probes Immich's Postgres read-only (session-level
read-only guard) and answers the M1.5 prerequisites against the live DB:
catalog-discovered embedding table/column, vector dimension, distance operator
(from the index opclass), the embedding->asset FK join, and coverage over the
IMAGE population. Discovers the asset table name from the FK (asset, not the
legacy assets) rather than hardcoding it, so it survives Immich version drift.

Findings (this Immich version): smart_search.embedding, 1152-dim, cosine <=>
(vector_cosine_ops), assetId->asset.id join clean (0 orphans), ~44% image
coverage (CLIP re-run in progress). Doc is M1.5's version-pinned contract.
2026-06-27 20:39:31 +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
m038andClaude Opus 4.8 33ac3ae69c docs(spec): harden pgvector spike from ce-doc-review (11 findings)
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>
2026-06-27 20:19:09 +02:00
m038andClaude Opus 4.8 e5923317de docs(spec): pgvector embedding feasibility spike (M1.5 dependency)
Defines the read-only Postgres/pgvector feasibility spike that the
roadmap claims ran in M1 but the M1 plan deferred. Pins the four
pass/fail requirements, the disposable-probe approach, and the
findings-doc contract that unblocks M1.5.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 19:41:59 +02:00
m038 fccc74f8b8 docs(solutions): document Gitea PR-creation workflow (gh/tea limits -> REST API) 2026-06-27 19:33:56 +02:00
m038 fa9a5e14c2 docs: add M1 implementation plan 2026-06-27 19:25:15 +02:00
m038 389c5fbfee docs: align M1 design spec with ROADMAP (M1.5, shared/ai -> M3) 2026-06-27 19:25:15 +02:00
m038 3968ccb704 docs(roadmap): mark M1 shipped; add M1.5 visual-similarity milestone 2026-06-27 19:24:04 +02:00
m038 19394908d2 docs: add Gitea env vars to .env.example 2026-06-27 19:19:25 +02:00
m038 d5b073da9c Merge pull request 'feat: M1 foundation packages + trip-cluster app' (#1) from feat/m1-foundation-trip-cluster into master
Reviewed-on: #1
2026-06-27 19:10:48 +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 d67b677b6a docs+docker: README, CLAUDE.md, Dockerfile/compose (8084), M1 validation gate 2026-06-27 17:37:22 +02:00
m038 c4ff5bcb06 test(trip-cluster): Playwright UI — grid nav, lightbox, cluster switching, approve 2026-06-27 17:35:58 +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 9ec6512428 feat(core): cluster data-access — attention sort, neighbors, split/merge, writeback log 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 351a001903 feat(core): asset & tag data-access 2026-06-27 17:16:07 +02:00
m038 da5b1de2a2 feat(immich): write-back (upsert_tag, tag_assets) + _pipeline tag conventions 2026-06-27 17:16:07 +02:00
m038 c36d93e3c7 feat(ui): base.html, macros (badges, lightbox), shared.js, register_shared_ui 2026-06-27 17:11:49 +02:00
m038 4db684fbdc feat(core): domain models + Store (schema, connection, meta) 2026-06-27 17:11:49 +02:00
m038 862480916a feat(immich): ImmichClient read — search_assets, list_tags, resolve_tag_id, download_thumbnail 2026-06-27 17:11:49 +02:00
m038 01ac95059e feat: monorepo scaffold — photoflow shared dist + trip-cluster app skeleton 2026-06-27 17:08:11 +02:00
m038andClaude Opus 4.8 c406b567bd docs: extract authoritative ROADMAP.md; spec links to it
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 15:04:44 +02:00
m038andClaude Opus 4.8 07bba5796f docs: refine spec — _pipeline tag namespace, processed marker, visual-similarity deferral, header formatting
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 15:01:23 +02:00
m038andClaude Opus 4.8 69f041cdd0 docs: rename project to immich-photo-flow
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 14:25:19 +02:00
m038andClaude Opus 4.8 0cb0bcd6a7 docs: M1 design spec — image categorizer foundation + trip-cluster
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 14:17:46 +02:00