Dashboard insights + project-wide DRY pass #32

Merged
bvandeusen merged 0 commits from dev into main 2026-05-28 15:38:26 -04:00
bvandeusen commented 2026-05-28 15:37:56 -04:00 (Migrated from git.fabledsword.com)

Summary

Two bodies of work since v26.05.28.0 (18 commits).

Dashboard insights (Subscriptions hub)

  • Scheduler health strip — last-tick / next-due / due-now, re-polled every 30s
  • Failing-source rollup with per-source + bulk "retry"
  • 24h download activity sparkline (failures stacked in error color)
  • Credential staleness nudge — last-verified age + "re-verify recommended" past 30d (also fixes the dead last_verified_at field-name bug)
  • Richer Downloads filters (clickable stat chips, search, artist autocomplete, no-change toggle), 1600px centered layout, sticky headers, "needs attention" quick-filter
  • Live download-activity polling, real credential Verify endpoint, copy buttons in the detail modal

Project-wide DRY pass — 8 chunks, ~-600 lines net, behavior-preserving

  • F2: shared UI primitives — utils/{toast,date.formatRelative,downloadStatus}
  • S1: app/client test fixtures hoisted into conftest (−424)
  • F1: useAsyncAction store lifecycle helper (11 stores, errorAs preserves each store's error shape)
  • B1: _bad error helper → api/_responses.py (8 blueprints)
  • B4: async_session_factorytasks/_async_session.py (3 tasks)
  • B2: ImportSettings.load()/load_sync() classmethods (15 sites)
  • B3: Importer._get_or_create race-safe find-or-create (3 methods, reduces drift risk on a banked race-condition pattern)
  • F5: useTabQuery composable (?tab= routing, 2 views)

Deliberately skipped where extraction would be premature/over-engineering: dashboard cluster (already collapsed by F2), settings/modal (DestructiveConfirmModal already shared), extension platform table (intentional cross-runtime dup), model timestamp mixin (unverifiable core-ORM change for trivial columns).

Test plan

  • CI green on dev (ruff + frontend build + integration tests)
  • Smoke-test the Subscriptions hub: scheduler strip, failing rollup, sparkline, credential cards
  • Confirm no regressions in tag/gallery/artist/import flows (touched by the F1/B-series refactors)

🤖 Generated with Claude Code

## Summary Two bodies of work since v26.05.28.0 (18 commits). **Dashboard insights (Subscriptions hub)** - Scheduler health strip — last-tick / next-due / due-now, re-polled every 30s - Failing-source rollup with per-source + bulk "retry" - 24h download activity sparkline (failures stacked in error color) - Credential staleness nudge — last-verified age + "re-verify recommended" past 30d (also fixes the dead `last_verified_at` field-name bug) - Richer Downloads filters (clickable stat chips, search, artist autocomplete, no-change toggle), 1600px centered layout, sticky headers, "needs attention" quick-filter - Live download-activity polling, real credential Verify endpoint, copy buttons in the detail modal **Project-wide DRY pass — 8 chunks, ~-600 lines net, behavior-preserving** - F2: shared UI primitives — `utils/{toast,date.formatRelative,downloadStatus}` - S1: `app`/`client` test fixtures hoisted into conftest (−424) - F1: `useAsyncAction` store lifecycle helper (11 stores, `errorAs` preserves each store's error shape) - B1: `_bad` error helper → `api/_responses.py` (8 blueprints) - B4: `async_session_factory` → `tasks/_async_session.py` (3 tasks) - B2: `ImportSettings.load()/load_sync()` classmethods (15 sites) - B3: `Importer._get_or_create` race-safe find-or-create (3 methods, reduces drift risk on a banked race-condition pattern) - F5: `useTabQuery` composable (`?tab=` routing, 2 views) Deliberately skipped where extraction would be premature/over-engineering: dashboard cluster (already collapsed by F2), settings/modal (`DestructiveConfirmModal` already shared), extension platform table (intentional cross-runtime dup), model timestamp mixin (unverifiable core-ORM change for trivial columns). ## Test plan - [x] CI green on dev (ruff + frontend build + integration tests) - [ ] Smoke-test the Subscriptions hub: scheduler strip, failing rollup, sparkline, credential cards - [ ] Confirm no regressions in tag/gallery/artist/import flows (touched by the F1/B-series refactors) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledCurator#32