From 9ab94eb1f9dee34629fc9fb1dce26a4339835b8d Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 17 Apr 2026 23:01:09 -0400 Subject: [PATCH] docs: add failure display implementation plan 4-task plan: backend default setting, Settings page input, Dashboard script computeds, Dashboard template replacement. Co-Authored-By: Claude Opus 4.7 --- .../plans/2026-04-17-failure-display.md | 483 ++++++++++++++++++ 1 file changed, 483 insertions(+) create mode 100644 docs/superpowers/plans/2026-04-17-failure-display.md diff --git a/docs/superpowers/plans/2026-04-17-failure-display.md b/docs/superpowers/plans/2026-04-17-failure-display.md new file mode 100644 index 0000000..f57c563 --- /dev/null +++ b/docs/superpowers/plans/2026-04-17-failure-display.md @@ -0,0 +1,483 @@ +# Failure Display Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Introduce a configurable "failing source" threshold (default 5 consecutive failures) and surface it on the Dashboard as per-platform health bars plus a strict failing-source list. + +**Architecture:** Four small changes. (1) Backend adds one default setting key. (2) Settings page adds one number input. (3) Dashboard script adds a settings fetch and three derived computeds. (4) Dashboard template replaces the "Sources Needing Attention" card body with platform bars + a filtered table, removing the old recent-failure-based list. + +**Tech Stack:** Python/Quart + SQLAlchemy backend, Vue 3 + Vuetify 3 + Pinia frontend. No test infrastructure in the repo; verification is via `npm run build`, spec-file diffs, and visual inspection after the user deploys. + +Spec: `docs/superpowers/specs/2026-04-17-failure-display-design.md` + +--- + +## File Structure + +| File | Role | Change | +|---|---|---| +| `backend/app/models/setting.py` | DEFAULT_SETTINGS dict | Add `"dashboard.failure_threshold": 5` | +| `frontend/src/views/Settings.vue` | Application settings page | Add Dashboard section with threshold input | +| `frontend/src/views/Dashboard.vue` | Main dashboard page | Add settings store + computeds; replace "Sources Needing Attention" card body; remove obsolete `sourcesWithErrors`; add scoped CSS | + +No new files. No store changes — `useSettingsStore` in `frontend/src/stores/settings.js` already exposes `fetchSettings()` and a reactive `settings` ref. + +--- + +## Task 1: Add default threshold to backend settings + +**Files:** +- Modify: `backend/app/models/setting.py:39-46` + +- [ ] **Step 1: Add the new key to `DEFAULT_SETTINGS`** + +Open `backend/app/models/setting.py` and replace the `DEFAULT_SETTINGS` dict (currently lines 39–46) with: + +```python +# Default settings that should exist +DEFAULT_SETTINGS = { + "download.parallel_limit": 3, + "download.rate_limit": 3.0, + "download.retry_count": 3, + "download.schedule_interval": 28800, # 8 hours + "notification.enabled": False, + "notification.webhook_url": None, + "dashboard.failure_threshold": 5, +} +``` + +Why this is enough: `settings` is a key-value table. `GET /api/settings` (in `backend/app/api/settings.py`) merges stored rows on top of `DEFAULT_SETTINGS` and returns the result. A brand-new key appears in the API response immediately; existing installations get the default until/unless the user saves a different value from the Settings page. No migration, no new endpoint. + +- [ ] **Step 2: Commit** + +```bash +git add backend/app/models/setting.py +git commit -m "feat(settings): add dashboard.failure_threshold default (5)" +``` + +--- + +## Task 2: Add threshold input to the Settings page + +**Files:** +- Modify: `frontend/src/views/Settings.vue` (template only) + +- [ ] **Step 1: Insert a Dashboard section above the Notifications divider** + +In `frontend/src/views/Settings.vue`, locate the block that ends the Download Settings section and starts the Notifications section: + +```vue + + + + + +

Notifications

+``` + +Replace it with: + +```vue + + + + + +

Dashboard

+ + + + + + + + + +

Notifications

+``` + +Why this is enough: `saveSettings()` at `Settings.vue:463` calls `settingsStore.updateSettings(settings.value)` which PATCHes every key in the object. A new `v-model` binding flows through without any handler changes. + +- [ ] **Step 2: Verify the frontend still builds** + +Run from the repo root: +```bash +cd frontend && npm run build +``` +Expected: build completes with no errors. A Vuetify warning about `persistent-hint` is non-fatal if it appears. + +- [ ] **Step 3: Commit** + +```bash +git add frontend/src/views/Settings.vue +git commit -m "feat(settings-ui): expose dashboard failure threshold" +``` + +--- + +## Task 3: Dashboard script — settings store, fetch, computeds + +**Files:** +- Modify: `frontend/src/views/Dashboard.vue` (`