test_fallback_task_retained_until_fire asserts len(_bg_tasks) == 1, but
the set carries pending tasks from earlier tests' fallback schedules, so
the assertion saw the accumulated count instead. Drop the references (no
.cancel() — the tasks belong to closed loops, cross-loop cancel raises
RuntimeError on the next test's setup).
Operability:
- Correlation IDs end-to-end: shared dispatch_id between log lines and
EventLog rows (event/watcher/scheduled/deferred/action/HA/command paths)
and a new X-Request-Id middleware that normalizes inbound ids and binds
request_id into log context.
- dispatch_summary block merged into EventLog.details: per-target
success/failure counts plus Telegram media delivered/skipped/failed and
truncated error lists, so partial outcomes surface in the UI.
- Diagnostic mode: admin can flip one module to DEBUG for a bounded
window with auto-revert (in-memory only; setup_logging() resets on
boot, lifespan reverts on shutdown). New /diagnostic-mode endpoints
plus DiagnosticsCassette UI on the settings page.
Telegram:
- Per-receiver options: disable_notification (silent send) and
message_thread_id (forum-topic routing), wired through the dispatcher
via a ContextVar so all four send sites (sendMessage / sendPhoto-Video-
Document / sendMediaGroup / cache-hit POST) pick them up.
- send_large_videos_as_documents target setting: bypass the 50 MB
sendVideo cap by falling back to sendDocument for oversized videos.
- sendMediaGroup byte-budget enforcement (TELEGRAM_MAX_GROUP_TOTAL_BYTES,
45 MB) with per-item fallback on chunk failure so a stale file_id no
longer silently drops a cached asset.
Tests:
- New: diagnostic_mode, dispatch_summary, request_correlation,
telegram_media_group_partial, telegram_per_send_options.
Docs:
- .claude/reviews/: six-axis production-readiness review of v0.8.1.
- .claude/docs/functional-review-2026-05-28.md: focused review of
Telegram/Immich/logging subsystems.