fix: audit — score falsy-zero, crop person mismatch, adaptive cap, suppress_output, ldconfig glob, scheduler sleep

- immich_api: `score or confidence` treated 0.0 score as falsy; use explicit None check
- diversity: same falsy-zero fix in _get_face_confidence
- diversity: _crop_face_from_thumbnail scale loop now filters by person_id (was
  using first person's imageWidth/imageHeight regardless of target in group photos)
- jobs: partially-trained auto mode kept limit="auto" for adaptive stopping, then
  caps result to remaining capacity (was converting to int, silently disabling FPS
  adaptive threshold and early-stop)
- embeddings: _suppress_output finally block wraps first dup2 in try/finally so
  stderr is always restored even if stdout restore raises OSError
- Dockerfile: ldconfig find uses python3.* glob instead of hardcoded python3.13
- scheduler: sleep until next_run instead of fixed 60s; eliminates late-fire jitter
  and unnecessary wakeups on long schedules

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 16:48:24 +00:00
co-authored by Claude Sonnet 4.6
parent ad4d212df0
commit 85e499a677
6 changed files with 21 additions and 9 deletions
+7 -2
View File
@@ -299,10 +299,13 @@ def auto_configure(people: list[dict]) -> list[dict]:
has_embedding = is_embedding_available(entity_type)
limit, selection_mode = _resolve_strategy(strategy, has_embedding)
# Cap selection to remaining capacity
# Cap selection to remaining capacity.
# For auto mode with partial training, keep "auto" so adaptive stopping
# still runs — just trim the result to the remaining capacity afterward.
auto_cap = None
if limit == "auto":
if already_uploaded > 0:
limit = capacity # partially filled — select exactly what remains
auto_cap = capacity
else:
limit = min(limit, capacity)
@@ -312,6 +315,8 @@ def auto_configure(people: list[dict]) -> list[dict]:
selected_assets = _perform_selection(
recent_assets, limit, name, selection_mode, entity_type, person_id=person["id"]
)
if auto_cap is not None:
selected_assets = selected_assets[:auto_cap]
if selected_assets:
rprint(f" [green]Queued {len(selected_assets)} images for {name}.[/green]")