soulsync/core/enrichment
BoulderBadgeDad fc9a9f1c90 Enrichment manager v2: working retry + bulk retry-all-failed
Fixes a correctness bug and adds bulk re-queuing.

- Bug: per-row 'Retry' used clear-match, which sets an item to not_found
  with last_attempted=NULL. The worker only retries not_found items where
  last_attempted < (now - 30d), and 'NULL < cutoff' is false in SQLite, so
  those items were never re-queued. Fixed by resetting match_status to NULL
  (pending), which every worker's queue picks up on the next pass.
- New POST /api/enrichment/<id>/retry with scope 'item' | 'failed'
  (failed = re-queue every not_found item of an entity type), backed by a
  pure whitelisted build_reset_query + MusicDatabase.reset_enrichment().
- UI: per-row Retry now hits /retry; a 'Retry all failed' bulk button appears
  when the current entity has not-found items (confirm + count toast); a hint
  line explains retry/match/auto-retry behaviour.
- 11 new tests (38 enrichment tests total, all green).
2026-06-02 19:19:39 -07:00
..
__init__.py Consolidate enrichment bubble routes behind a service registry 2026-05-01 20:14:30 -07:00
api.py Enrichment manager v2: working retry + bulk retry-all-failed 2026-06-02 19:19:39 -07:00
manual_match_honoring.py Honor manually-matched source IDs in per-source enrichment workers 2026-05-06 19:00:53 -07:00
services.py Consolidate enrichment bubble routes behind a service registry 2026-05-01 20:14:30 -07:00
unmatched.py Enrichment manager v2: working retry + bulk retry-all-failed 2026-06-02 19:19:39 -07:00