45 KiB
Watchlist Visual Redesign - Integrate as Tab on /web
TL;DR
Quick Summary: Refactor standalone
/watchlistpage to integrate as 5th tab on/webpage, 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#watchlistEstimated 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:
/webusesbase.html+components/header.htmlwith clean structure/watchlistis 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
/watchlistinstead 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.watchlistTabLoadedflag → 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-tabclass, 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/watchlistredirect endpoint
Definition of Done
# 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)
/watchlistURL 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
/webpage design (only structure changes for integration) - No DOM ID conflicts with existing tabs
- No CSS class conflicts between
.taband.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.
-
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
truewhen 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,providersTabLoadedbehavior
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 whereanimeTabLoaded = falseis initialized, watch for similar pattern to addwatchlistTabLoadedtabs.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
falsewith other loading flags - Flag set to
trueafter 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.txtScenario: 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.txtEvidence 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
- Open
-
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-taband existing.tabstyles - 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- IDwatchlistContainertemplates/watchlist.html:233- IDschedulerStatustemplates/watchlist.html:237- IDnextRunInfotemplates/watchlist.html:240- IDstartSchedulerBtntemplates/watchlist.html:243- IDstopSchedulerBtntemplates/watchlist.html:422- IDsettingsModaltemplates/watchlist.html:130-148-.filter-tabCSS 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.tabstyles
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-tabCSS 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.txtScenario: 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.txtEvidence 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
-
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.htmllines 421-527 - Replace inline HTML in
handleOpenSettings()with call tocreateSettingsModal() - 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 extracttemplates/watchlist.html:416-538-handleOpenSettings()function using inline HTMLtemplates/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.jshandleOpenSettings()callscreateSettingsModal()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.pngScenario: 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.txtEvidence 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
- Open
-
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.jsshows 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.pngEvidence 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
- Open
-
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 = trueafter 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 tabsstatic/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.txtEvidence 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
- Open
-
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-headerpattern) - 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 extracttemplates/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.htmlfile 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.pngEvidence 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
- Create new file
-
7. Move watchlist inline CSS to style.css
What to do:
- Open
templates/watchlist.htmllines 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
.tabclasses - 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 extractstatic/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.cssreturns 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.pngEvidence 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
- Open
-
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:
<div id="tab-watchlist" class="tab-content"> - 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.
<div id="tab-watchlist" class="tab-content">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.pngEvidence 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
- Open
-
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 = trueafter 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 tabsstatic/js/watchlist-ui.js- Should containdisplayWatchlist()functiontemplates/watchlist.html:282-286- WheredisplayWatchlist()is called on page loadtemplates/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
watchlistTabLoadedset totrueafter 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.txtScenario: 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.pngEvidence 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
- Open
-
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
RedirectResponsefrom 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.txtEvidence 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
- Open
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 —
oracleRead 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(+playwrightskill) 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
# 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