Risk Log — Melodex (Spotify Playlist Export Feature Slice)¶
This is the initial risk register for the Spotify playlist export feature and adjacent areas it touches.
Scales: Likelihood (L) and Impact (I) use Low / Medium / High. Exposure is a simple score: Low=1, Med=2, High=3 → L×I.
Legend¶
- Likelihood: Low(1), Medium(2), High(3)
- Impact: Low(1), Medium(2), High(3)
- Exposure: L×I (1–9)
- Status: Open / Mitigating / Accepted / Closed
ID | Risk | Category | L | I | Exp | Triggers / Indicators | Mitigation / Prevention | Contingency / Response | Owner | Status |
---|---|---|---|---|---|---|---|---|---|---|
R-01 | Spotify OAuth misconfiguration (redirect/callback mismatch) blocks auth | Integration / Config | M | H | 6 | OAuth errors, redirect loop, 400/401 on callback | Keep callback URLs in Cognito & Spotify aligned; env-driven config; add CI check for env consistency | Roll back to last known good config; hotfix callback URLs; manual token testing | Dev | Open |
R-02 | Token refresh failures (silent 401s) break export mid-flow | Auth / Session | M | H | 6 | 401 during export; partial playlists | Centralized token manager; auto refresh + single retry; Jest for refresh path | On retry fail, surface “reconnect” CTA; log incident; guide user to re-auth | Dev | Open |
R-03 | Spotify API rate limits (429) during batch add | Third-party Limits | M | H | 6 | 429 responses; delayed export | Backoff + jitter; configurable batch size; preflight estimate | Queue + resume; show “Try again later”; persist progress | Dev | Open |
R-04 | Deezer↔Spotify track mismatch (wrong tracks added) | Data Quality | M | M | 4 | Unusual playlist contents; user reports | Deterministic mapping; fuzzy match thresholds; add artist+title normalization tests | Provide review modal (remove items); allow re-run with stricter matching | QA | Mitigating |
R-05 | Deezer preview URL expiry breaks audio in ranking/review | UX / Stability | M | M | 4 | Audio errors; silent players | “Is preview valid” check; refresh metadata endpoint; fallback label; add TTL parsing and cooldown logic; merge refreshed Deezer IDs into Mongo to avoid stale data | Hide player on error; lazy-refresh preview on demand; persist refreshed previews in DB for future sessions | Dev | Mitigating |
R-06 | Sensitive keys or tokens leaked in repo / logs | Security | L | H | 3 | Secrets appear in commits or build logs | .gitignore for env; GitHub secrets; secret scanning; no tokens in client logs |
Revoke & rotate keys; invalidate sessions; post-mortem | Dev | Open |
R-07 | MongoDB outage or slow queries block ranking/export | Reliability | L | H | 3 | Timeouts; 5xx from backend | Connection pooling; timeouts; indexes on userID, deezerID ; health checks |
Serve graceful error; circuit break; retry later | DevOps | Open |
R-08 | CORS misconfig blocks frontend→backend requests | Config | M | M | 4 | CORS errors in console | Keep allowed origins env-based; add preflight tests in CI | Temporarily widen allowlist while hotfixing | Dev | Open |
R-09 | Mobile browser quirks (deep link, modal scroll) hurt UX | Cross-Device UX | M | M | 4 | Playlist link opens wrong target; scroll lock issues | Cypress mobile view; deep-link scheme + web fallback; focus trapping in modal | Provide “Open in Spotify Web” fallback; close modal on failure | QA | Open |
R-10 | Long export runs with poor feedback feel “frozen” | UX / Perception | M | M | 4 | User cancels; multiple clicks | Progress states; optimistic UI; disable duplicate submits; toasts | Resume support; idempotent requests; friendly failure message | UX | Mitigating |
R-11 | Partial failures (some tracks fail) not surfaced clearly | Error Handling | M | M | 4 | User sees fewer songs than expected | Per-item error list with skip/retry; logging for failed IDs | Offer retry all / retry failed; export remainder | QA | Open |
R-12 | Legal / Terms non-compliance (Spotify/Deezer API usage) | Compliance | L | H | 3 | TOS updates; emails from provider | Review TOS; avoid storing restricted data; cache within limits | Disable feature if required; contact provider support | PM | Open |
R-13 | Build/Deploy pipeline breaks docs or site (Pages/Actions) | CI/CD | M | M | 4 | Pages build fails; workflow disabled | Pinned actions; simple workflow; status badge; manual run enabled | Serve local docs; re-enable Actions; restore last good run | DevOps | Open |
R-14 | Regression in ELO/ranking affects export sets | Functional | L | M | 2 | Unexpected song ordering; user complaints | Snapshot unit tests for ELO; contract tests for ranked endpoints | Hotfix ELO; re-run export with corrected set | QA | Open |
R-15 | Duplicate tracks in playlist (race / mapping issue) | Data Integrity | M | M | 4 | Visible duplicates; Spotify returns 400 | De-dupe by Spotify track ID before POST; idempotent batcher | Remove duplicates; re-post missing items | Dev | Open |
R-16 | Browser autoplay policy blocks previews during review | Browser Policy | M | L | 2 | No audio until user gesture | Require explicit play; show hint; user gesture to enable sound | Keep non-blocking UI; persist preferred volume | UX | Accepted |
R-17 | Accessibility gaps in modal hinder some users | Accessibility | L | M | 2 | Keyboard trap; focus loss | Basic focus trapping; aria labels; visible focus | Provide non-modal fallback flow | QA | Accepted |
R-18 | Flaky E2E tests slow delivery | Quality / Process | M | M | 4 | Intermittent CI failures | Test isolation; data seeding; network stubbing for 3rd-party | Quarantine flaky tests; fix before merging | QA | Open |
R-19 | Environment parity gaps (local vs. prod) | Config Drift | M | M | 4 | Works local, fails prod | .env.example ; config docs; smoke tests post-deploy |
Feature flag; quick rollback | DevOps | Open |
R-20 | User confusion about export scope (filters vs. selection) | UX / Clarity | M | L | 2 | Support questions; wrong expectations | Clear summary: N songs, filters applied; confirm modal | Undo/redo; simple re-export | UX | Mitigating |
R-21 | Unbounded background fetch inflates API usage / cloud costs | Reliability / Cost | M | M | 4 | Repeating fetch logs; buffer keeps growing; cost spike | Strict in-flight guard; cooldown; cap bursts (~33 items); fetch gated on isRankPageActive + filtersApplied + buffer/list thresholds; dedupe initial vs bg | Temporarily disable bg fetch; lower caps; hotfix guard checks | Dev | Mitigating |
Risk Heat Map¶
This qualitative heat map groups risks by Likelihood (rows) and Impact (columns). It reflects the current risk register values and will be updated as we re-assess.
Legend:
Rows = Likelihood (High, Medium, Low)
Columns = Impact (Low, Medium, High)
Each cell shows: count — list of Risk IDs
Impact: Low | Impact: Medium | Impact: High | |
---|---|---|---|
Likelihood: High | 0 — (none) | 0 - (none) | 0 — (none) |
Likelihood: Medium | 2 — R-16, R-20 | 10 — R-04, R-08, R-09, R-10, R-11, R-13, R-15, R-18, R-19, R-21 | 3 — R-01, R-02, R-03 |
Likelihood: Low | 0 — (none) | 3 — R-14, R-17, R-05 | 3 — R-06, R-07, R-12 |
Notes¶
- This log is intentionally feature-focused. Platform-wide risks (e.g., domain/DNS, billing) are tracked separately in project ops docs.
- Highest concentration: Medium Likelihood / Medium Impact (10 items) — focus mitigations here to reduce overall exposure quickly.
- High Impact clusters:
- Medium/High: R-01, R-02, R-03 (OAuth, token refresh, rate limits)
- Low/High: R-06, R-07, R-12 (secrets, DB reliability, TOS compliance)
- Revisit post-implementation of auth & export flows to re-score R-01 to R-03, and after CI hardening to re-score R-13/R-18.