# Watchlist Visual Redesign - Integrate as Tab on /web ## TL;DR > **Quick Summary**: Refactor standalone `/watchlist` page to integrate as 5th tab on `/web` page, maintaining all existing features (scheduler, filters, settings) while using exact same visual design. > > **Deliverables**: > - `components/watchlist_section.html` - New component with watchlist content > - Updated `index.html` - Include watchlist tab structure > - Updated `tabs.js` - Load watchlist content instead of redirecting > - Updated `main.js` - Add watchlist case to button activation logic > - Updated `style.css` - Move watchlist inline styles (190 lines) > - Updated `watchlist-ui.js` - Extract settings modal HTML to function > - Updated `main.py` - Redirect `/watchlist` → `/web#watchlist` > > **Estimated Effort**: Medium > **Parallel Execution**: NO - sequential (due to dependencies) > **Critical Path**: Task 1 → Task 4 → Task 6 → Task 7 → Task 9 --- ## Context ### Original Request User wants `/watchlist` page to have exact same visual base as `/web` page, so users don't see any difference between pages except content. ### Interview Summary **Key Discussions**: - **Approach decision**: User chose "Onglet sur /web (Recommandé)" - integrate watchlist as 5th tab on /web page - **Design constraint**: No visual difference between /web and watchlist except content - **Functional requirement**: Keep all existing watchlist features (scheduler, filters, settings modal) **Research Findings**: - `/web` uses `base.html` + `components/header.html` with clean structure - `/watchlist` is standalone HTML with 190 lines of inline CSS, 310 lines of inline JavaScript - Header already has watchlist button (components/header.html lines 47-52) - tabs.js currently redirects to `/watchlist` instead of loading content (line 390) - main.js button activation logic missing watchlist case (lines 220-235) - watchlist.js and watchlist-ui.js already loaded in base.html (lines 21-22) ### Metis Review **Identified Gaps** (addressed in plan): - **Gap 1**: Missing `switchTab()` case in main.js → Task 4 - **Gap 2**: No `window.watchlistTabLoaded` flag → Task 1 - **Gap 3**: Watchlist has duplicate tab navigation (lines 214-220) → Task 8 (remove) - **Gap 4**: Settings modal is inline HTML (lines 421-527) → Task 3 (extract to function) - **Gap 5**: 30-second interval management needs logic → Task 6 (clear/restart on tab switch) - **Gap 6**: DOM ID conflicts need verification → Task 2 (pre-check) - **Gap 7**: Filter tabs use `.filter-tab` class, need CSS conflict check → Task 2 (pre-check) --- ## Work Objectives ### Core Objective Integrate watchlist as seamless tab on /web page with identical visual design and all existing functionality preserved. ### Concrete Deliverables - `components/watchlist_section.html` - New template component - Modified `index.html` - Include watchlist tab div - Modified `tabs.js` - Load watchlist content, not redirect - Modified `main.js` - Add watchlist button activation case - Modified `style.css` - Add watchlist-specific styles (190 lines) - Modified `watchlist-ui.js` - Extract settings modal to function - Modified `main.py` - Add `/watchlist` redirect endpoint ### Definition of Done ```bash # Navigate to /web#watchlist # Verify: Watchlist tab is active (highlighted) # Verify: Same header/nav as other tabs # Verify: Scheduler panel displays correctly # Verify: Filter tabs (All/Active/Paused/Completed) work # Verify: Settings modal opens/closes correctly # Verify: 30-second status refresh works # Verify: Switching away clears interval, switching back restarts ``` ### Must Have - Exact same visual design as /web (colors, fonts, spacing, layout) - All watchlist features work (scheduler, filters, settings, list display) - No duplicate navigation (watchlist's own tab bar removed) - 30-second interval management (clear on tab switch away, restart when active) - Filter tabs function identically to original - Settings modal functional (save, toggle switches, close) - `/watchlist` URL redirects to `/web#watchlist` ### Must NOT Have (Guardrails) - No functional changes to watchlist behavior - No breaking changes to existing features - No duplicate tab navigation (watchlist's own tabs removed) - No visual differences between /web and watchlist - No modifications to `/web` page design (only structure changes for integration) - No DOM ID conflicts with existing tabs - No CSS class conflicts between `.tab` and `.filter-tab` - No infinite interval loops (must clear when switching away) --- ## Verification Strategy (MANDATORY) > **ZERO HUMAN INTERVENTION** — ALL verification is agent-executed. No exceptions. > Acceptance criteria requiring "user manually tests/confirms" are FORBIDDEN. ### Test Decision - **Infrastructure exists**: YES (pytest for backend, browser testing for frontend) - **Automated tests**: Tests-after (manual verification via browser) - **Framework**: Playwright for UI verification ### QA Policy Every task MUST include agent-executed QA scenarios (see TODO template below). Evidence saved to `.sisyphus/evidence/task-{N}-{scenario-slug}.{ext}`. - **Frontend/UI**: Use Playwright (playwright skill) — Navigate, interact, assert DOM, screenshot - **API/Backend**: Use Bash (curl) — Verify redirect endpoint works - **Integration**: Use Playwright — Test full tab switching workflow --- ## Execution Strategy ### Parallel Execution Waves > Sequential execution required due to dependencies between tasks. > Most tasks depend on previous waves completing. ``` Wave 1 (Start Immediately - Pre-implementation checks): ├── Task 1: Add watchlistTabLoaded flag to tabs.js [quick] ├── Task 2: Pre-check for DOM/CSS conflicts [quick] └── Task 3: Extract settings modal HTML to function [quick] Wave 2 (After Wave 1 - JavaScript modifications): ├── Task 4: Add watchlist case to main.js switchTab() [quick] └── Task 5: Remove watchlist redirect from tabs.js [quick] Wave 3 (After Wave 2 - Create component): ├── Task 6: Create components/watchlist_section.html [visual-engineering] └── Task 7: Move watchlist inline CSS to style.css [quick] Wave 4 (After Wave 3 - Integrate): ├── Task 8: Add watchlist tab div to index.html [quick] └── Task 9: Add watchlist loading logic to tabs.js [quick] Wave 5 (After Wave 4 - Backend): ├── Task 10: Add /watchlist redirect endpoint to main.py [quick] Wave 6 (After Wave 5 - Final verification): ├── Task 11: End-to-end testing (Playwright) [unspecified-high] └── Task 12: Git cleanup [git] ``` ### Dependency Matrix - **1, 2, 3**: — — 4, 5, 6 - **4, 5**: 1, 2, 3 — 9 - **6**: 3 — 7, 8 - **7**: 6 — (independent, just CSS) - **8, 9**: 4, 5 — 10 - **10**: 8, 9 — 11 - **11**: 1-10 — 12 > Sequential flow: Pre-checks → JS changes → Component creation → Integration → Backend → Testing ### Agent Dispatch Summary - **1-3**: **3** — T1 → `quick`, T2 → `quick`, T3 → `quick` - **4-5**: **2** — T4 → `quick`, T5 → `quick` - **6-7**: **2** — T6 → `visual-engineering`, T7 → `quick` - **8-9**: **2** — T8 → `quick`, T9 → `quick` - **10**: **1** — T10 → `quick` - **11**: **1** — T11 → `unspecified-high` (+ playwright skill) - **12**: **1** — T12 → `git` --- ## TODOs > Implementation + Test = ONE Task. Never separate. > EVERY task MUST have: Recommended Agent Profile + Parallelization info + QA Scenarios. > **A task WITHOUT QA Scenarios is INCOMPLETE. No exceptions.** --- - [x] 1. Add watchlistTabLoaded flag to tabs.js **What to do**: - Open `static/js/tabs.js` - Find where loading flags are initialized (around line 360 in DOMContentLoaded) - Add `window.watchlistTabLoaded = false;` after other tab loaded flags - Ensure flag is set to `true` when watchlist content loads (in tabs.js switchTab override) **Must NOT do**: - Don't create duplicate flag if already exists (verify first) - Don't change existing `animeTabLoaded`, `seriesTabLoaded`, `providersTabLoaded` behavior **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: Simple flag addition, clear pattern to follow - **Skills**: [] - No special skills needed - straightforward code modification **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 4, Task 5 - **Blocked By**: None (can start immediately) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `static/js/tabs.js:360-395` - Loading flags initialization pattern (animeTabLoaded, seriesTabLoaded) - `static/js/tabs.js:388-391` - Where watchlistTabLoaded flag should be set to true **API/Type References** (contracts to implement against): - N/A (JavaScript flag, no API) **Test References** (testing patterns to follow): - N/A (simple flag, no tests needed) **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - `tabs.js:360-395` - Shows exact pattern where `animeTabLoaded = false` is initialized, watch for similar pattern to add `watchlistTabLoaded` - `tabs.js:388-391` - This is where watchlist currently redirects to /watchlist, needs to set flag instead after loading **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] `grep "watchlistTabLoaded" static/js/tabs.js` → returns 2 matches (initialization + setting to true) - [ ] Flag initialized to `false` with other loading flags - [ ] Flag set to `true` after watchlist content loads **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** > **This is NOT optional. A task without QA scenarios WILL BE REJECTED.** > > Write scenario tests that verify the ACTUAL BEHAVIOR of what you built. > Minimum: 1 happy path + 1 failure/edge case per task. > Each scenario = exact tool + exact steps + exact assertions + evidence path. > > **The executing agent MUST run these scenarios after implementation.** > **The orchestrator WILL verify evidence files exist before marking task complete.** ``` Scenario: Flag initialization and usage Tool: Bash (grep) Preconditions: tabs.js file exists Steps: 1. grep -n "watchlistTabLoaded" static/js/tabs.js 2. Verify 2 matches found (initialization + setting to true) 3. Check line numbers are correct (near other tab loaded flags) Expected Result: Exactly 2 matches, both properly positioned Failure Indicators: Only 1 match, flag not initialized, or flag in wrong location Evidence: .sisyphus/evidence/task-1-flag-init.txt ``` ``` Scenario: Verify flag follows existing pattern Tool: Read Preconditions: tabs.js modified Steps: 1. Read static/js/tabs.js lines 360-400 2. Verify watchlistTabLoaded = false is after animeTabLoaded, seriesTabLoaded, providersTabLoaded 3. Verify watchlistTabLoaded = true is in switchTab watchlist case Expected Result: Flag follows exact same pattern as other tabs Failure Indicators: Flag in different section, wrong initialization value, missing setter Evidence: .sisyphus/evidence/task-1-flag-pattern.txt ``` **Evidence to Capture**: - [ ] task-1-flag-init.txt - Grep output showing 2 matches - [ ] task-1-flag-pattern.txt - Context around flag initialization **Commit**: NO (groups with Task 2, 3) - Message: `feat: add watchlistTabLoaded flag to tabs.js` - Files: `static/js/tabs.js` - Pre-commit: N/A --- - [x] 2. Pre-check for DOM/CSS conflicts **What to do**: - Check for DOM ID conflicts between watchlist and existing tabs - Run `grep -r "id=\"watchlistContainer\|id=\"schedulerStatus\" templates/` - Run `grep -r "id=\"settingsModal\|id=\"nextRunInfo\" templates/` - Run `grep -r "id=\"startSchedulerBtn\|id=\"stopSchedulerBtn\" templates/` - Check for CSS class conflicts between `.filter-tab` and existing `.tab` styles - Run `grep "filter-tab" static/css/style.css` - Document any conflicts found and decide mitigation strategy (rename IDs, use unique prefixes) **Must NOT do**: - Don't modify any files yet (this is a check-only task) - Don't proceed to implementation if conflicts found without documenting **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: Simple grep checks, fast verification - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 3, Task 6, Task 7 - **Blocked By**: None (can start immediately) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `templates/watchlist.html:265` - ID `watchlistContainer` - `templates/watchlist.html:233` - ID `schedulerStatus` - `templates/watchlist.html:237` - ID `nextRunInfo` - `templates/watchlist.html:240` - ID `startSchedulerBtn` - `templates/watchlist.html:243` - ID `stopSchedulerBtn` - `templates/watchlist.html:422` - ID `settingsModal` - `templates/watchlist.html:130-148` - `.filter-tab` CSS class **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - All ID references - These are the specific IDs that could conflict with existing tabs - `.filter-tab` - This CSS class could conflict with existing `.tab` styles **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] All watchlist IDs checked against existing templates (grep results saved) - [ ] `.filter-tab` CSS class checked against style.css - [ ] Conflicts documented (if any found) - [ ] No conflicts found OR mitigation strategy documented **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Check for DOM ID conflicts Tool: Bash (grep) Preconditions: templates directory exists Steps: 1. grep -r "id=\"watchlistContainer\|id=\"schedulerStatus\" templates/ 2. grep -r "id=\"settingsModal\|id=\"nextRunInfo\" templates/ 3. grep -r "id=\"startSchedulerBtn\|id=\"stopSchedulerBtn\" templates/ Expected Result: Each ID appears exactly 1 time (only in watchlist.html) Failure Indicators: Any ID appears in multiple files → conflict exists Evidence: .sisyphus/evidence/task-2-dom-conflicts.txt ``` ``` Scenario: Check for CSS class conflicts Tool: Bash (grep) Preconditions: style.css exists Steps: 1. grep -n "filter-tab" static/css/style.css 2. grep -n "\\.tab\s" static/css/style.css | head -10 3. Verify no overlapping definitions between .filter-tab and .tab Expected Result: .filter-tab either doesn't exist in style.css OR has unique definitions Failure Indicators: .filter-tab conflicts with .tab styles Evidence: .sisyphus/evidence/task-2-css-conflicts.txt ``` **Evidence to Capture**: - [ ] task-2-dom-conflicts.txt - Grep results for ID conflicts - [ ] task-2-css-conflicts.txt - Grep results for CSS conflicts **Commit**: NO (groups with Task 1, 3) - Message: `test: pre-check DOM/CSS conflicts for watchlist integration` - Files: N/A (check-only task) - Pre-commit: N/A --- - [x] 3. Extract settings modal HTML to function **What to do**: - Open `static/js/watchlist-ui.js` - Create new function `createSettingsModal(settings)` that generates modal HTML - Extract modal HTML from `templates/watchlist.html` lines 421-527 - Replace inline HTML in `handleOpenSettings()` with call to `createSettingsModal()` - Keep all modal styles (switch, slider) inline with the function or in style.css - Ensure modal close function `closeSettingsModal()` still works with new HTML structure **Must NOT do**: - Don't break existing modal functionality (open, close, save) - Don't remove any settings fields (check_interval, auto_download_enabled, etc.) - Don't change modal styling (keep exact same visual appearance) **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: Simple HTML extraction to function, no complexity - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 6 - **Blocked By**: None (can start immediately) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `templates/watchlist.html:421-527` - Inline modal HTML to extract - `templates/watchlist.html:416-538` - `handleOpenSettings()` function using inline HTML - `templates/watchlist.html:486-526` - Modal styles (switch, slider) inline in modal HTML **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Lines 421-527 - This is the exact modal HTML that needs to be extracted to a function - Lines 486-526 - Modal styles must be preserved when extracting to function **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] `createSettingsModal(settings)` function exists in watchlist-ui.js - [ ] `handleOpenSettings()` calls `createSettingsModal()` instead of inline HTML - [ ] Modal contains all 4 settings fields (check_interval, auto_download_enabled, max_concurrent, notify_on_new_episodes) - [ ] Modal styles preserved (switch, slider look identical) **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Modal opens correctly Tool: Playwright Preconditions: /web#watchlist loaded Steps: 1. Navigate to http://localhost:3000/web#watchlist 2. Click "⚙️ Paramètres" button 3. Verify modal appears with correct styling 4. Verify all 4 settings fields visible 5. Take screenshot Expected Result: Modal opens, styled correctly, all fields present Failure Indicators: Modal doesn't open, styling broken, fields missing Evidence: .sisyphus/evidence/task-3-modal-open.png ``` ``` Scenario: Modal saves settings Tool: Playwright Preconditions: Settings modal open Steps: 1. Change "Fréquence de vérification" to 12 hours 2. Toggle "Téléchargement automatique" ON 3. Click "💾 Enregistrer" button 4. Verify modal closes 5. Re-open settings modal 6. Verify values persisted Expected Result: Settings saved and persisted correctly Failure Indicators: Values not saved, modal doesn't close, errors in console Evidence: .sisyphus/evidence/task-3-modal-save.txt ``` **Evidence to Capture**: - [ ] task-3-modal-open.png - Screenshot of modal open - [ ] task-3-modal-save.txt - Test results showing save functionality **Commit**: YES (with Tasks 1, 2) - Message: `feat: prepare watchlist integration foundation (flags, conflict check, modal extraction)` - Files: static/js/tabs.js, static/js/watchlist-ui.js - Pre-commit: N/A --- - [x] 4. Add watchlist case to main.js switchTab() **What to do**: - Open `static/js/main.js` - Find button activation logic (around lines 220-235 based on Metis analysis) - Add watchlist case to handle button highlighting when switching tabs - Follow same pattern as existing cases (home, anime, series, providers) - Ensure `btn.classList.add('active')` is called for watchlist tab button **Must NOT do**: - Don't break existing tab switching logic - Don't modify other tab cases (home, anime, series, providers) **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: Simple case addition, follows existing pattern - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 5 - **Blocked By**: Task 1 (watchlistTabLoaded flag needed for complete context) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `static/js/main.js:220-235` - Button activation logic with cases for home, anime, series, providers **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Lines 220-235 - This is where watchlist case needs to be added to highlight watchlist button correctly **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] Watchlist case added to button activation logic - [ ] Case follows same pattern as existing tab cases - [ ] `grep "watchlist" static/js/main.js` shows watchlist handling **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Watchlist button highlights correctly Tool: Playwright Preconditions: /web page loaded Steps: 1. Navigate to http://localhost:3000/web 2. Click Watchlist tab button 3. Verify watchlist button has 'active' class 4. Take screenshot Expected Result: Watchlist button highlighted as active Failure Indicators: Button not highlighted, wrong button active Evidence: .sisyphus/evidence/task-4-button-active.png ``` **Evidence to Capture**: - [ ] task-4-button-active.png - Screenshot showing watchlist button active **Commit**: NO (groups with Task 5) - Message: `feat: add watchlist case to main.js tab switching` - Files: `static/js/main.js` - Pre-commit: N/A --- - [x] 5. Remove watchlist redirect from tabs.js **What to do**: - Open `static/js/tabs.js` - Find watchlist case that redirects to `/watchlist` (around line 388-391) - Replace redirect logic with content loading logic - Add code to load watchlist content instead of redirecting - Set `window.watchlistTabLoaded = true` after content loads - Follow same pattern as anime, series, providers tabs (load content only once) **Must NOT do**: - Don't remove the watchlist case entirely (modify to load content instead) - Don't change how other tabs load content **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: Replace redirect with content loading, follows existing pattern - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 9 - **Blocked By**: Task 1 (watchlistTabLoaded flag needed) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `static/js/tabs.js:372-387` - Content loading patterns for anime, series, providers tabs - `static/js/tabs.js:388-391` - Current watchlist redirect to remove **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Lines 372-387 - These show the pattern for loading tab content that watchlist should follow - Lines 388-391 - This is the redirect logic that must be replaced with content loading **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] Watchlist case no longer redirects to `/watchlist` - [ ] Watchlist case loads content instead - [ ] `window.location.href = '/watchlist'` removed from watchlist case **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Clicking watchlist tab doesn't redirect Tool: Playwright Preconditions: /web page loaded, watchlist_section.html exists Steps: 1. Navigate to http://localhost:3000/web 2. Click Watchlist tab button 3. Verify URL stays as /web#watchlist (not /watchlist) 4. Verify watchlist content loads in same page Expected Result: No redirect, content loads in place Failure Indicators: Redirect to /watchlist occurs, content doesn't load Evidence: .sisyphus/evidence/task-5-no-redirect.txt ``` **Evidence to Capture**: - [ ] task-5-no-redirect.txt - Test results showing no redirect **Commit**: YES (with Task 4) - Message: `refactor: update tab switching for watchlist (load content instead of redirect)` - Files: `static/js/tabs.js` - Pre-commit: N/A --- - [x] 6. Create components/watchlist_section.html **What to do**: - Create new file `templates/components/watchlist_section.html` - Extract main watchlist content from `templates/watchlist.html` (lines 223-267) - Remove duplicate tab navigation (lines 214-220) from watchlist content - Remove duplicate header (lines 200-206) from watchlist content - Include scheduler status section, filter tabs, watchlist container - Use same structure as other tab sections (`.section-header` pattern) - Ensure all IDs match what watchlist.js/watchlist-ui.js expects - Add appropriate comments for maintainability **Must NOT do**: - Don't keep duplicate navigation (header tabs already exist) - Don't change any ID names that watchlist.js depends on - Don't remove any watchlist features (scheduler, filters, container) - Don't change existing watchlist functionality **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `visual-engineering` - Reason: HTML template creation, visual structure alignment - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 7, Task 8 - **Blocked By**: Task 3 (modal extraction needed first) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `templates/watchlist.html:223-267` - Main watchlist content to extract - `templates/index.html:12-52` - Tab content structure pattern (.section-header, content div) - `templates/components/header.html:47-52` - Watchlist tab button structure (for reference) **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Lines 223-267 - This is the core watchlist content that needs to be extracted - Lines 12-52 - This shows how tab sections should be structured for consistency **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] `templates/components/watchlist_section.html` file exists - [ ] Contains scheduler status section (with all buttons: Start, Stop, Check All, Settings) - [ ] Contains filter tabs (All, Active, Paused, Completed) - [ ] Contains watchlist container div - [ ] No duplicate navigation (header tabs removed) - [ ] All IDs preserved from original (watchlistContainer, schedulerStatus, etc.) **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Watchlist section renders correctly Tool: Playwright Preconditions: /web#watchlist loaded, watchlist_section.html included in index.html Steps: 1. Navigate to http://localhost:3000/web#watchlist 2. Verify scheduler status panel displays 3. Verify filter tabs display 4. Verify watchlist container exists 5. Take screenshot Expected Result: All watchlist components render correctly Failure Indicators: Missing components, layout broken, IDs incorrect Evidence: .sisyphus/evidence/task-6-render.png ``` **Evidence to Capture**: - [ ] task-6-render.png - Screenshot of watchlist section rendering **Commit**: NO (groups with Task 7) - Message: `feat: create watchlist section component` - Files: `templates/components/watchlist_section.html` - Pre-commit: N/A --- - [x] 7. Move watchlist inline CSS to style.css **What to do**: - Open `templates/watchlist.html` lines 8-197 (inline styles) - Extract all watchlist-specific CSS (watchlist-header, scheduler-status, filter-tabs, etc.) - Append extracted CSS to `static/css/style.css` - Use unique prefixes to avoid conflicts (`.watchlist-` prefix recommended) - Ensure no CSS class names conflict with existing `.tab` classes - Remove inline styles from watchlist.html after extraction **Must NOT do**: - Don't change any CSS behavior or visual appearance - Don't remove any watchlist-specific styles - Don't break existing styles in style.css **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: CSS extraction and migration, straightforward - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 8 - **Blocked By**: Task 6 (watchlist_section.html needed to verify styles) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `templates/watchlist.html:8-197` - Inline CSS to extract - `static/css/style.css` - Where to append extracted styles **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Lines 8-197 - This is the complete inline CSS that needs to be moved to style.css **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] Watchlist CSS added to `static/css/style.css` - [ ] CSS uses `.watchlist-` prefix for classes to avoid conflicts - [ ] `grep "watchlist-" static/css/style.css` returns watchlist styles - [ ] Inline styles removed from watchlist.html (or kept only for modal) **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Watchlist styles apply correctly Tool: Playwright Preconditions: /web#watchlist loaded Steps: 1. Navigate to http://localhost:3000/web#watchlist 2. Verify watchlist header displays with correct colors 3. Verify scheduler status panel styles match original 4. Verify filter tabs styles match original 5. Take screenshot Expected Result: All visual styles match original watchlist page Failure Indicators: Styles broken, colors wrong, layout issues Evidence: .sisyphus/evidence/task-7-styles.png ``` **Evidence to Capture**: - [ ] task-7-styles.png - Screenshot showing watchlist styles **Commit**: YES (with Task 6) - Message: `feat: add watchlist styles to style.css` - Files: `static/css/style.css` - Pre-commit: N/A --- - [x] 8. Add watchlist tab div to index.html **What to do**: - Open `templates/index.html` - Find where tab sections are defined (after existing tabs) - Add new tab div: `
` - Include watchlist section component: `{% include "components/watchlist_section.html" %}` - Place it after existing tab sections (tab-providers) - Follow same structure as other tab divs **Must NOT do**: - Don't break existing tab structure - Don't modify other tab sections **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: Simple include addition to existing template - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 9, Task 10 - **Blocked By**: Task 6 (watchlist_section.html must exist) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `templates/index.html:12-52` - Where tab sections are defined (tab-home, tab-anime, tab-series, tab-providers) - `templates/index.html:9` - Example of include usage (home_section.html) **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Lines 12-52 - This shows the exact structure and placement where watchlist tab div should be added - Line 9 - This shows how to use {% include %} syntax for components **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] `
` added to index.html - [ ] `{% include "components/watchlist_section.html" %}` inside tab-watchlist div - [ ] Placement after tab-providers section **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Watchlist tab displays when active Tool: Playwright Preconditions: /web page loaded Steps: 1. Navigate to http://localhost:3000/web 2. Click Watchlist tab button 3. Verify tab-watchlist div is visible 4. Verify watchlist section content displays 5. Take screenshot Expected Result: Watchlist tab section appears with all content Failure Indicators: Tab doesn't display, content missing, wrong content shown Evidence: .sisyphus/evidence/task-8-tab-display.png ``` **Evidence to Capture**: - [ ] task-8-tab-display.png - Screenshot of watchlist tab display **Commit**: YES (with Task 9) - Message: `feat: integrate watchlist into main page` - Files: `templates/index.html` - Pre-commit: N/A --- - [x] 9. Add watchlist loading logic to tabs.js **What to do**: - Open `static/js/tabs.js` - Find watchlist case in switchTab override (already modified in Task 5) - Add call to `displayWatchlist()` function when watchlist tab opens - Ensure function exists in watchlist.js (it should from original page) - Add `window.watchlistTabLoaded = true` after successful load - Implement 30-second interval management: - Clear interval when switching away from watchlist - Start interval when watchlist tab becomes active - Use `clearInterval()` to stop refresh when not visible - Follow same pattern as other tabs (animeTabLoaded flag check) **Must NOT do**: - Don't create infinite interval loops - Don't forget to clear interval when switching tabs - Don't break existing interval logic in watchlist.html **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: JavaScript logic for content loading and interval management - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 10 - **Blocked By**: Task 5 (redirect removed), Task 8 (tab structure exists) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `static/js/tabs.js:372-387` - Content loading patterns for anime, series, providers tabs - `static/js/watchlist-ui.js` - Should contain `displayWatchlist()` function - `templates/watchlist.html:282-286` - Where `displayWatchlist()` is called on page load - `templates/watchlist.html:586` - 30-second interval (`setInterval(loadSchedulerStatus, 30000)`) **API/Type References** (contracts to implement against): - N/A **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Lines 372-387 - These show how to load tab content that watchlist should follow - Line 586 - This is the interval that needs management when switching tabs **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] `displayWatchlist()` called when watchlist tab opens - [ ] Interval cleared when switching away from watchlist tab - [ ] Interval restarted when watchlist tab becomes active - [ ] `watchlistTabLoaded` set to `true` after load **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: Interval management works correctly Tool: Playwright Preconditions: /web#watchlist loaded Steps: 1. Navigate to http://localhost:3000/web#watchlist 2. Click Anime tab 3. Wait 35 seconds 4. Switch back to Watchlist tab 5. Verify scheduler status refreshed Expected Result: Interval cleared on tab switch away, restarted when returning Failure Indicators: Interval continues running when not visible, interval doesn't restart Evidence: .sisyphus/evidence/task-9-interval.txt ``` ``` Scenario: Watchlist content loads correctly Tool: Playwright Preconditions: /web page loaded Steps: 1. Navigate to http://localhost:3000/web 2. Click Watchlist tab button 3. Verify scheduler status displays 4. Verify filter tabs display 5. Verify watchlist items load (or empty message) 6. Take screenshot Expected Result: All watchlist content loads and displays correctly Failure Indicators: Content doesn't load, errors in console, missing sections Evidence: .sisyphus/evidence/task-9-content-load.png ``` **Evidence to Capture**: - [ ] task-9-interval.txt - Test results showing interval management - [ ] task-9-content-load.png - Screenshot of content load **Commit**: YES (with Task 8) - Message: `feat: integrate watchlist into main page` - Files: `templates/index.html`, `static/js/tabs.js` - Pre-commit: N/A --- - [x] 10. Add /watchlist redirect endpoint to main.py **What to do**: - Open `main.py` - Find FastAPI app and route definitions - Add new route `@app.get("/watchlist")` - Return redirect to `/web#watchlist` - Use `RedirectResponse` from fastapi - Preserve backward compatibility (old bookmarks still work) **Must NOT do**: - Don't modify existing routes - Don't break existing /web route **Recommended Agent Profile**: > Select category + skills based on task domain. Justify each choice. - **Category**: `quick` - Reason: Simple FastAPI route addition - **Skills**: [] - No special skills needed **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 11 - **Blocked By**: Task 8, Task 9 (watchlist tab fully integrated first) **References** (CRITICAL - Be Exhaustive): > The executor has NO context from your interview. References are their ONLY guide. > Each reference must answer: "What should I look at and WHY?" **Pattern References** (existing code to follow): - `main.py` - Where other routes are defined (look for @app.get decorators) **API/Type References** (contracts to implement against): - FastAPI `RedirectResponse` - Use this for redirect **Test References** (testing patterns to follow): - N/A **External References** (libraries and frameworks): - N/A **WHY Each Reference Matters** (explain the relevance): - Look for @app.get decorators to understand routing pattern **Acceptance Criteria**: > **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted. > Every criterion MUST be verifiable by running a command or using a tool. - [ ] `@app.get("/watchlist")` route added to main.py - [ ] Returns `RedirectResponse("/web#watchlist")` - [ ] Route works when accessed **QA Scenarios (MANDATORY - task is INCOMPLETE without these):** ``` Scenario: /watchlist endpoint redirects correctly Tool: Bash (curl) Preconditions: Server running Steps: 1. curl -I http://localhost:3000/watchlist 2. Check for HTTP 302 or 307 redirect status 3. Check Location header contains /web#watchlist Expected Result: Redirect to /web#watchlist with correct status code Failure Indicators: No redirect, wrong status code, wrong location Evidence: .sisyphus/evidence/task-10-redirect.txt ``` **Evidence to Capture**: - [ ] task-10-redirect.txt - Curl output showing redirect **Commit**: YES (standalone) - Message: `feat: add /watchlist redirect endpoint` - Files: `main.py` - Pre-commit: N/A --- ## Final Verification Wave (MANDATORY — after ALL implementation tasks) > 2 review tasks run in SEQUENTIAL (dependent on each other). ALL must APPROVE. Rejection → fix → re-run. - [ ] F1. **Plan Compliance Audit** — `oracle` Read the plan end-to-end. For each "Must Have": verify implementation exists (read file, curl endpoint, run command). For each "Must NOT Have": search codebase for forbidden patterns — reject with file:line if found. Check evidence files exist in .sisyphus/evidence/. Compare deliverables against plan. Output: `Must Have [N/N] | Must NOT Have [N/N] | Tasks [N/N] | VERDICT: APPROVE/REJECT` - [ ] F2. **Real Manual QA** — `unspecified-high` (+ `playwright` skill) Start from clean state. Execute EVERY QA scenario from EVERY task — follow exact steps, capture evidence. Test cross-task integration: navigate to /web, click watchlist tab, verify all features (scheduler, filters, settings). Test tab switching: switch to other tabs and back, verify interval management. Test filter functionality: click All/Active/Paused/Completed, verify items filtered correctly. Test settings modal: open, toggle switches, save, verify persistence. Save to `.sisyphus/evidence/final-qa/`. Output: `Scenarios [N/N pass] | Integration [N/N] | Edge Cases [N tested] | VERDICT` --- ## Commit Strategy - **1-3**: `feat: prepare watchlist integration foundation` — static/js/tabs.js, static/js/watchlist-ui.js - **4-5**: `refactor: update tab switching for watchlist` — static/js/tabs.js, static/js/main.js - **6-7**: `feat: create watchlist section component` — templates/components/watchlist_section.html, static/css/style.css - **8-9**: `feat: integrate watchlist into main page` — templates/index.html, static/js/tabs.js - **10**: `feat: add watchlist redirect endpoint` — main.py - **11-12**: `test: end-to-end verification` — .sisyphus/evidence/ --- ## Success Criteria ### Verification Commands ```bash # Navigate to /web#watchlist in browser # Verify visual consistency with other tabs # Check for DOM ID conflicts (should be none) grep -r "id=\"watchlistContainer\|id=\"schedulerStatus\"" templates/ | wc -l # Should be 1 # Check for CSS conflicts (should be none) grep "filter-tab" static/css/style.css | head -3 # Verify redirect endpoint works curl -I http://localhost:3000/watchlist # Should return 302 to /web#watchlist ``` ### Final Checklist - [ ] All "Must Have" present - [ ] All "Must NOT Have" absent - [ ] No duplicate navigation tabs - [ ] Interval management works correctly - [ ] Filter tabs functional - [ ] Settings modal functional - [ ] Visual design identical to /web - [ ] All QA scenarios pass