v26.05.24.3: FC-3i System Activity dashboard + migration backup-gate retired + modal Escape #9
Reference in New Issue
Block a user
Delete Branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Big release: FC-3i System Activity Overview ships (IR-style operator visibility into the Celery pipeline), plus two dogfood fixes that unblock the IR migration UI.
Headline — FC-3i: System Activity Overview
Operator visibility into every Celery lane: queue depths, worker assignments, recent activity, recent failures. Lives at
Settings → Activitywith a quick-summary card onSettings → Overview.task_runtable (alembic 0016): id, queue, task_name, target_id, started_at/finished_at, duration_ms, status (running/ok/error/timeout/retry), error_type, error_message, retry_count, worker_hostname, args_summary. Composite indexes on (queue, started_at desc), (status, started_at desc), (task_name, started_at desc).backend/app/celery_signals.pypopulatetask_runautomatically for every task — drop-in for every existing and future Celery task; no per-task instrumentation.task_preruninserts arunningrow;task_postrunmarksok;task_failuremarkserror(ortimeoutforSoftTimeLimitExceeded);task_retrymarksretrywith the count. Wrapped in try/except + structured logging so a broken signal handler never breaks the task itself.recover_stalled_task_runs(Beat every 5 min): flipstask_runrows stuck inrunningpastSTUCK_THRESHOLD_MINUTEStoerrorwitherror_type='RecoverySweep'.prune_task_runs(Beat daily): deletesokrows older than 24h,error/timeout/retryrows older than 7 days.runningrows never deleted by retention — that's the recovery sweep's job./api/system/activityblueprint with four endpoints:/queues(Redis LLEN per queue, cached 2s),/workers(celery inspect, cached 5s),/runs(paginated task_run history, queue/status filters, keyset cursor),/failures(24h-window error+timeout rows + count_by_type aggregation).systemActivityPinia store +QueuesTable.vue(shared) +SystemActivitySummary.vue(5s poll on Overview) +SystemActivityTab.vue(3s+15s polls on Activity tab with three panes: queues+workers, recent failures with clickable error-type pills, all-activity table with queue/status filters).Migration UX unblock — backup-gate retired
The
_APPLY_KINDScheck in/api/migrate/<kind>was blocking IR/GS ingest from the UI when there was no recentpre_migrationbackup — but backup on a large NFS-backed image library hits the 30-min timeout and fails reliably. The gate has been retired (_APPLY_KINDS = frozenset()); the UI ingest path now just works. FC-3h will rewrite backup as a first-class feature with proper splitting (DB vs images, independent timeouts/schedules) and recovery.Modal Escape via document-level listener
The
@keydown.eschandler on the viewer modal's root div didn't fire when a<video>element had focus (video controls capture keystrokes and don't bubble reliably). Moved todocument.addEventListener('keydown', ..., capture=true)so Escape closes the modal whether you're on an image or a video, focused on the modal or on the video itself.Commits