Files
2026-02-28 09:22:57 +00:00

1114 lines
40 KiB
Markdown

# Watchlist JavaScript Bug Fix - Architectural Refactor
## TL;DR
> **Quick Summary**: Fix critical JavaScript errors causing watchlist infinite loading, broken search, and navigation traps through complete architectural refactor of script loading and code cleanup.
>
> **Deliverables**:
> - Fixed downloads.js duplicate variable declarations
> - Eliminated duplicate API_BASE declarations
> - Removed duplicate script loading in watchlist.html
> - Added "Retour à l'accueil" navigation button
> - Audited all JS files for similar issues
> - Verified backend watchlist API functionality
>
> **Estimated Effort**: Medium
> **Parallel Execution**: YES - 4 waves
> **Critical Path**: downloads.js fix → script cleanup → navigation button → QA verification
---
## Context
### Original Request
User reported watchlist completely broken: infinite loading, non-functional search, navigation stuck on watchlist page with no way to return to home. Multiple JavaScript errors in console preventing proper initialization.
### Interview Summary
**Key Discussions**:
- User confirmed home page is `/web`
- Chose to remove duplicate script from watchlist.html (keep in base.html globally)
- Chose to remove duplicate API_BASE from watchlist/main.js (use api.js only)
- Selected "Architectural Refactor" scope - complete overhaul, not minimal fix
**Research Findings**:
- downloads.js has duplicate variable declarations (lines 64-67 and 69-76)
- API_BASE declared in both api.js and watchlist/main.js
- watchlist/main.js loaded twice (base.html + watchlist.html)
- No navigation button from watchlist to home page
- JavaScript errors prevent proper initialization causing infinite loading
### Metis Review
**Identified Gaps** (addressed):
- Need to audit ALL JS files for similar duplication patterns (not just reported ones)
- Need clear separation between global scripts and page-specific scripts
- Must verify backend API endpoints work correctly
- Need browser console verification steps as acceptance criteria
- Must ensure existing routes (/web, /watchlist) continue to work after refactor
---
## Work Objectives
### Core Objective
Eliminate all JavaScript errors causing watchlist failures through comprehensive architectural refactor of script loading and code cleanup, add proper navigation from watchlist to home, and verify complete functionality.
### Concrete Deliverables
- Fixed `static/js/downloads.js` - no duplicate variable declarations
- Fixed `static/js/watchlist/main.js` - no duplicate API_BASE
- Fixed `templates/watchlist.html` - no duplicate script loading
- Added navigation button in `templates/watchlist.html` to return to `/web`
- Audited all JS files for duplication and scope issues
- Verified `/api/watchlist/*` endpoints work correctly with curl
### Definition of Done
- [ ] Browser console shows 0 JavaScript errors on both `/web` and `/watchlist`
- [ ] Watchlist loads successfully (< 3 seconds) with no infinite loading spinner
- [ ] "Retour à l'accueil" button navigates to `/web`
- [ ] Watchlist search functionality works
- [ ] All API endpoints return valid responses (200/400/401, not 500)
### Must Have
- Fix all 6 JavaScript errors reported
- Add navigation button to return to `/web`
- Verify backend watchlist API works
- Audit all JS files for similar issues
### Must NOT Have (Guardrails)
- **DO NOT change `/web` or `/watchlist` routes** - existing URLs must work
- **DO NOT break authentication flow** - JWT tokens must work on both pages
- **DO NOT create new frameworks** - use existing Vanilla JS patterns
- **DO NOT modify backend API endpoints** - only verify they work
- **DO NOT introduce new pages** - only fix existing functionality
- **DO NOT fix favicon.ico** - separate issue, out of scope
---
## Verification Strategy
> **ZERO HUMAN INTERVENTION** — ALL verification is agent-executed. No exceptions.
### Test Decision
- **Infrastructure exists**: YES (pytest)
- **Automated tests**: NO (focus on browser console verification for UI bugs)
- **Framework**: None for this refactor - use browser console + curl for API tests
- **Rationale**: This is UI-focused bug fix, not new feature development
### 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 browser console verification + Playwright (dev-browser skill) for interactions
- **API/Backend**: Use Bash (curl) — Send requests, assert status + response fields
---
## Execution Strategy
### Parallel Execution Waves
```
Wave 1 (Start Immediately - Foundation Fixes):
├── Task 1: Fix downloads.js duplicate variables [quick]
├── Task 2: Fix watchlist/main.js duplicate API_BASE [quick]
├── Task 3: Remove duplicate script from watchlist.html [quick]
├── Task 4: Audit all JS files for duplication patterns [quick]
└── Task 5: Verify backend watchlist API endpoints [quick]
Wave 2 (After Wave 1 - UI/Navigation):
├── Task 6: Add navigation button to watchlist.html [visual-engineering]
└── Task 7: Style navigation button matching existing UI [visual-engineering]
Wave 3 (After Wave 2 - Integration):
├── Task 8: Test watchlist loading and search functionality [unspecified-high]
└── Task 9: Test navigation from watchlist to home [unspecified-high]
Wave 4 (After Wave 3 - Verification):
├── Task 10: Browser console error verification (all pages) [quick]
├── Task 11: API endpoint integration tests [quick]
└── Task 12: Git cleanup and commit [git]
Critical Path: Task 1 → Task 2 → Task 3 → Task 6 → Task 8 → Task 10
Parallel Speedup: ~60% faster than sequential
Max Concurrent: 5 (Wave 1)
```
### Dependency Matrix
- **1**: — — 4, 5 (independent)
- **2**: — — 4, 5 (independent)
- **3**: — — 4, 5 (independent)
- **4**: 1, 2, 3 — 8, 10
- **5**: — — 11
- **6**: 3 — 7, 8, 9
- **7**: 6 — 8, 9
- **8**: 4, 6, 7 — 10
- **9**: 6, 7 — 10
- **10**: 1, 2, 3, 4, 8 — 12
- **11**: 5 — 12
- **12**: 10, 11 — None
### Agent Dispatch Summary
- **1**: **5** — T1-T3 (quick), T4 (quick), T5 (quick)
- **2**: **2** — T6-T7 (visual-engineering)
- **3**: **2** — T8-T9 (unspecified-high)
- **4**: **3** — T10-T11 (quick), T12 (git)
---
## TODOs
- [x] 1. Fix downloads.js Duplicate Variable Declarations
**What to do**:
- Read `static/js/downloads.js` to identify duplicate declarations (lines 64-76)
- Remove lines 69-76 which duplicate the variable declarations from lines 64-67
- Verify the function `filterDownloads()` has only one set of declarations for `statusFilter`, `sortBy`, `groupBy`, `searchTerm`
- Ensure the fix preserves the logic (the duplicate code does the same thing)
**Must NOT do**:
- Remove lines 64-67 (these are the correct declarations)
- Change the filter logic or behavior
- Modify other functions in downloads.js
**Recommended Agent Profile**:
> Select category + skills based on task domain. Justify each choice.
- **Category**: `quick`
- Reason: Simple fix with clear scope - remove duplicate code block
- **Skills**: []
- No specific skills needed - straightforward JavaScript file edit
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1 (with Tasks 2, 3, 4, 5)
- **Blocks**: Task 8, 10
- **Blocked By**: None (can start immediately)
**References** (CRITICAL - Be Exhaustive):
**Pattern References** (existing code to follow):
- `static/js/downloads.js:64-76` - The function with duplicate declarations
**Acceptance Criteria**:
> **AGENT-EXECUTABLE VERIFICATION ONLY** — No human action permitted.
```bash
# Verify exactly one declaration of each variable
grep -c "const sortBy" static/js/downloads.js
Expected: 1
grep -c "const groupBy" static/js/downloads.js
Expected: 1
grep -c "const searchTerm" static/js/downloads.js
Expected: 1
grep -c "const statusFilter" static/js/downloads.js
Expected: 1
```
**QA Scenarios (MANDATORY — task is INCOMPLETE without these):**
```
Scenario: downloads.js parses without syntax errors
Tool: Bash (node)
Preconditions: None
Steps:
1. Run: node -c static/js/downloads.js
Expected Result: Exit code 0 (syntax valid)
Failure Indicators: Exit code 1 with syntax error
Evidence: .sisyphus/evidence/task-1-syntax-check.txt
Scenario: loadDownloads function is defined and accessible
Tool: Bash (node)
Preconditions: None
Steps:
1. Create test script: echo "const fs = require('fs'); eval(fs.readFileSync('static/js/downloads.js', 'utf8')); console.log(typeof loadDownloads);" > /tmp/test-downloads.js
2. Run: node /tmp/test-downloads.js
Expected Result: Output: "function"
Failure Indicators: Output: "undefined" or syntax error
Evidence: .sisyphus/evidence/task-1-function-accessible.txt
```
**Commit**: YES
- Message: `fix(js): Remove duplicate variable declarations in downloads.js`
- Files: `static/js/downloads.js`
- [x] 2. Fix watchlist/main.js Duplicate API_BASE Declaration
**What to do**:
- Read `static/js/watchlist/main.js` to locate line 3 with `const API_BASE = '/api';`
- Remove line 3 (duplicate declaration)
- Verify the file no longer contains any API_BASE declaration
- Confirm api.js is loaded before watchlist/main.js in base.html (check base.html line 2 loads api.js, line 21 loads watchlist/main.js)
**Must NOT do**:
- Add API_BASE back with different syntax (var instead of const)
- Change the value of API_BASE ('/api' should remain)
- Modify api.js
**Recommended Agent Profile**:
- **Category**: `quick`
- Reason: Simple line removal - DRY principle fix
- **Skills**: []
- No special skills needed
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1 (with Tasks 1, 3, 4, 5)
- **Blocks**: Task 10
- **Blocked By**: None (can start immediately)
**References**:
**Pattern References**:
- `static/js/api.js:2` - Correct API_BASE declaration
- `static/js/watchlist/main.js:3` - Duplicate to remove
- `templates/base.html:2` - api.js loaded globally
- `templates/base.html:21` - watchlist/main.js loaded globally
**Acceptance Criteria**:
```bash
# Verify no API_BASE in watchlist/main.js
grep -c "API_BASE" static/js/watchlist/main.js
Expected: 0
# Verify api.js still has API_BASE
grep -c "API_BASE" static/js/api.js
Expected: 1
```
**QA Scenarios (MANDATORY):**
```
Scenario: watchlist/main.js parses without duplicate const errors
Tool: Bash (node)
Preconditions: None
Steps:
1. Run: node -c static/js/watchlist/main.js
Expected Result: Exit code 0 (syntax valid)
Failure Indicators: SyntaxError: Identifier 'API_BASE' has already been declared
Evidence: .sisyphus/evidence/task-2-syntax-check.txt
```
**Commit**: YES
- Message: `fix(js): Remove duplicate API_BASE declaration from watchlist/main.js`
- Files: `static/js/watchlist/main.js`
- [x] 3. Remove Duplicate Script Loading from watchlist.html
**What to do**:
- Read `templates/watchlist.html` to locate line 530 with `<script src="/static/js/watchlist/main.js" defer></script>`
- Remove this script tag (it's already loaded by base.html line 21)
- Verify the file no longer contains any reference to watchlist/main.js
- Confirm base.html still loads watchlist/main.js globally (base.html line 21)
**Must NOT do**:
- Remove watchlist/main.js from base.html (keep it global)
- Add other scripts to watchlist.html
- Modify script loading order in base.html
**Recommended Agent Profile**:
- **Category**: `quick`
- Reason: Simple HTML tag removal - eliminate duplicate loading
- **Skills**: []
- No special skills needed
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1 (with Tasks 1, 2, 4, 5)
- **Blocks**: Task 6, 8
- **Blocked By**: None (can start immediately)
**References**:
**Pattern References**:
- `templates/base.html:21` - Correct global loading of watchlist/main.js
- `templates/watchlist.html:530` - Duplicate to remove
**Acceptance Criteria**:
```bash
# Verify no watchlist/main.js in watchlist.html
grep -c "watchlist/main.js" templates/watchlist.html
Expected: 0
# Verify base.html still loads it
grep -c "watchlist/main.js" templates/base.html
Expected: 1
```
**QA Scenarios (MANDATORY):**
```
Scenario: watchlist.html loads watchlist/main.js exactly once
Tool: Bash (grep)
Preconditions: None
Steps:
1. Search for all script tags loading watchlist/main.js in watchlist.html
2. Search for all script tags in base.html
Expected Result: 0 occurrences in watchlist.html, 1 in base.html
Failure Indicators: >0 occurrences in watchlist.html
Evidence: .sisyphus/evidence/task-3-script-count.txt
```
**Commit**: YES
- Message: `fix(html): Remove duplicate script loading from watchlist.html`
- Files: `templates/watchlist.html`
- [x] 4. Audit All JS Files for Duplication Patterns
**What to do**:
- List all JavaScript files in `static/js/` directory (recursive)
- For each JS file, search for duplicate:
- const declarations of same variable name
- let declarations of same variable in same scope
- var declarations of same variable in same scope
- Function definitions with same name
- Create audit report listing all duplication issues found
- For any critical duplications (causing syntax errors), create separate fix tasks
- For minor duplications (non-breaking), document for future cleanup
- Focus on: api.js, utils.js, auth.js, main.js, tabs.js, anime.js, series-search.js, downloads.js, watchlist/main.js, anime-details.js, recommendations.js
**Must NOT do**:
- Fix non-critical duplications without explicit approval
- Modify working code (only document issues)
- Change architecture patterns unless duplications are critical bugs
**Recommended Agent Profile**:
- **Category**: `quick`
- Reason: Audit task with grep-based analysis
- **Skills**: []
- grep and file listing sufficient
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1 (with Tasks 1, 2, 3, 5)
- **Blocks**: None (report only)
- **Blocked By**: None (can start immediately)
**References**:
**Pattern References**:
- `static/js/downloads.js` - Example of duplication already fixed
- `static/js/watchlist/main.js` - Example of duplication already fixed
**Acceptance Criteria**:
```bash
# Audit report exists
test -f .sisyphus/evidence/task-4-js-audit.txt
Expected: PASS
```
**QA Scenarios (MANDATORY):**
```
Scenario: All JS files checked for duplicate declarations
Tool: Bash (grep + find)
Preconditions: None
Steps:
1. Find all .js files in static/js/
2. For each file, check for duplicate const/let/var declarations using pattern
3. Check for duplicate function definitions
4. Generate report with file:line:duplication_type format
Expected Result: Report generated with all duplications listed
Failure Indicators: No report generated, or report incomplete
Evidence: .sisyphus/evidence/task-4-js-audit.txt
```
**Commit**: NO
- This is an audit task - no code changes
- [x] 5. Verify Backend Watchlist API Endpoints
**What to do**:
- Start the FastAPI server if not running: `uvicorn main:app --host 0.0.0.0 --port 3000`
- Test all watchlist API endpoints with curl:
- GET `/api/watchlist` - List watchlist items
- POST `/api/watchlist` - Add item to watchlist
- GET `/api/watchlist/{id}` - Get specific item
- PUT `/api/watchlist/{id}` - Update item
- DELETE `/api/watchlist/{id}` - Delete item
- GET `/api/watchlist/stats` - Get statistics
- For each endpoint, record: HTTP status code, response time, response structure
- Check for 500 errors (backend bugs)
- Verify authentication is working (401/403 for unauthenticated, 200 for authenticated)
- Note any endpoints returning unexpected errors
**Must NOT do**:
- Modify backend code
- Fix any API bugs found (only document them)
- Create new endpoints
**Recommended Agent Profile**:
- **Category**: `quick`
- Reason: API verification with curl
- **Skills**: []
- curl sufficient for API testing
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1 (with Tasks 1, 2, 3, 4)
- **Blocks**: Task 11
- **Blocked By**: None (can start immediately)
**References**:
**Pattern References**:
- `app/routes/watchlist.py` - Backend watchlist routes
- `main.py` - FastAPI app setup
**Acceptance Criteria**:
```bash
# Server is running
curl -s http://localhost:3000/health | grep -q "status"
Expected: PASS
```
**QA Scenarios (MANDATORY):**
```
Scenario: GET /api/watchlist returns 401 (requires auth) or 200 (with token)
Tool: Bash (curl)
Preconditions: Server running on port 3000
Steps:
1. Run: curl -i -s http://localhost:3000/api/watchlist
2. Check HTTP status code in response headers
Expected Result: 401 (Unauthorized) OR 200 (OK if token provided)
Failure Indicators: 500 (Internal Server Error), connection refused
Evidence: .sisyphus/evidence/task-5-get-watchlist.txt
Scenario: Watchlist endpoints respond with proper JSON structure
Tool: Bash (curl)
Preconditions: Server running
Steps:
1. Test GET /api/watchlist (authenticated)
2. Test GET /api/watchlist/stats (authenticated)
3. Verify responses are valid JSON
Expected Result: 200 OK with valid JSON array or object
Failure Indicators: Invalid JSON, 500 error, malformed response
Evidence: .sisyphus/evidence/task-5-api-structure.txt
```
**Commit**: NO
- This is verification only - no code changes
- [x] 6. Add Navigation Button to Return to /web in watchlist.html
**What to do**:
- Read `templates/watchlist.html` to locate the header section
- Add a "Retour à l'accueil" button in the header area (before main content)
- Button should use `onclick="window.location.href = '/web'"` or similar
- Style the button to match existing UI (use existing button classes)
- Position button prominently but not obtrusively (top right or near title)
- Ensure button works on both desktop and mobile (touch-friendly, minimum 44x44px)
**Must NOT do**:
- Use `window.history.back()` (user wants /web specifically)
- Create a new page or route
- Modify existing navigation in index.html
- Break the visual consistency of watchlist page
**Recommended Agent Profile**:
- **Category**: `visual-engineering`
- Reason: UI component addition requiring HTML + CSS styling
- **Skills**: []
- No special skills needed - HTML button with existing styles
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 2 (with Task 7)
- **Blocks**: Task 8, 9
- **Blocked By**: Task 3 (duplicate script must be removed first)
**References**:
**Pattern References** (existing code to follow):
- `templates/components/header.html` - Existing navigation pattern and button styles
- `templates/watchlist.html` - Target file where button should be added
- `static/css/style.css` or inline styles - Existing button classes to use
**Acceptance Criteria**:
```bash
# Verify navigation button exists in watchlist.html
grep -c "Retour à l'accueil" templates/watchlist.html
Expected: >= 1
# Verify button points to /web
grep -o "href.*'/web'" templates/watchlist.html | head -1
Expected: href='/web' or similar
```
**QA Scenarios (MANDATORY):**
```
Scenario: Navigation button is visible on watchlist page
Tool: dev-browser (playwright)
Preconditions: Server running on port 3000
Steps:
1. Navigate to http://localhost:3000/watchlist
2. Wait for page to load completely (timeout 10s)
3. Check for element with text "Retour à l'accueil"
Expected Result: Button is visible in DOM with correct text
Failure Indicators: Button not found, button not visible, incorrect text
Evidence: .sisyphus/evidence/task-6-button-visible.png
Scenario: Clicking navigation button redirects to /web
Tool: dev-browser (playwright)
Preconditions: On watchlist page
Steps:
1. Click button with text "Retour à l'accueil"
2. Wait for navigation to complete (timeout 5s)
3. Check current URL
Expected Result: URL changes to /web, home page loads
Failure Indicators: URL does not change, 404 error, page doesn't load
Evidence: .sisyphus/evidence/task-6-redirect-to-home.png
```
**Commit**: NO
- Groups with Task 7
- [ ] 7. Style Navigation Button Matching Existing UI
**What to do**:
- Read existing CSS for button classes in `static/css/style.css` or inline styles in templates
- Identify primary button style used in the application (btn-primary, btn-secondary, etc.)
- Apply appropriate class to the navigation button added in Task 6
- Ensure button has proper hover states, transitions, and active states matching other buttons
- Test button appearance on dark background (watchlist uses dark theme)
- Add padding/margin for proper spacing and alignment
- Ensure button is accessible (adequate contrast, focus state)
**Must NOT do**:
- Create new button classes (reuse existing)
- Change existing button styles
- Break responsive design on mobile
**Recommended Agent Profile**:
- **Category**: `visual-engineering`
- Reason: CSS styling for visual consistency
- **Skills**: []
- No special skills needed - apply existing classes
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 2 (with Task 6)
- **Blocks**: Task 8, 9
- **Blocked By**: Task 6 (button must exist before styling)
**References**:
**Pattern References**:
- `static/css/style.css` - Existing button class definitions
- `templates/components/header.html` - Example of button styling
- `templates/index.html` - Example of button usage in main page
**Acceptance Criteria**:
```bash
# Verify button has appropriate class
grep -A1 "Retour à l'accueil" templates/watchlist.html | grep -q "class=.*btn"
Expected: PASS
```
**QA Scenarios (MANDATORY):**
```
Scenario: Navigation button matches existing button styles
Tool: dev-browser (playwright)
Preconditions: On watchlist page with navigation button
Steps:
1. Take screenshot of navigation button
2. Take screenshot of other buttons on page (e.g., "Ajouter" button)
3. Compare visual appearance (color, padding, font, border radius)
Expected Result: Navigation button visually consistent with other buttons
Failure Indicators: Button looks different/broken, colors don't match theme
Evidence: .sisyphus/evidence/task-7-button-styles.png
Scenario: Button has hover and focus states
Tool: dev-browser (playwright)
Preconditions: On watchlist page
Steps:
1. Hover over navigation button, verify visual change
2. Tab to button, verify focus indicator appears
3. Click button, verify active state if applicable
Expected Result: Hover, focus, and active states work correctly
Failure Indicators: No hover effect, no focus indicator, stuck state
Evidence: .sisyphus/evidence/task-7-button-states.png
```
**Commit**: YES
- Message: `feat(ui): Add navigation button to return to /web from watchlist`
- Files: `templates/watchlist.html`
- [ ] 8. Test Watchlist Loading and Search Functionality
**What to do**:
- Start the FastAPI server: `uvicorn main:app --host 0.0.0.0 --port 3000`
- Open browser and navigate to `/watchlist`
- Verify watchlist loads without infinite loading spinner
- Check that content appears within 3 seconds
- Test search functionality:
- Enter search query in watchlist search input
- Click search button
- Verify results appear or "no results" message shows
- Verify no JavaScript errors in browser console
- Test on both authenticated and unauthenticated states (if applicable)
**Must NOT do**:
- Modify backend code
- Fix bugs found during testing (only document)
- Change search behavior
**Recommended Agent Profile**:
- **Category**: `unspecified-high`
- Reason: Integration testing with browser verification
- **Skills**: [`dev-browser`]
- dev-browser: Use Playwright for browser automation and console checking
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 3 (with Task 9)
- **Blocks**: Task 10
- **Blocked By**: Task 1, 2, 3, 4, 6, 7 (all fixes must be applied first)
**References**:
**Pattern References**:
- `static/js/watchlist/main.js` - Watchlist search implementation
- `templates/watchlist.html` - Watchlist UI structure
**Acceptance Criteria**:
```bash
# Watchlist page loads successfully
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/watchlist
Expected: 200
```
**QA Scenarios (MANDATORY):**
```
Scenario: Watchlist loads successfully without infinite loading
Tool: dev-browser (playwright)
Preconditions: Server running, user may need auth token
Steps:
1. Navigate to http://localhost:3000/watchlist
2. Wait max 5 seconds for page to load
3. Check if "Chargement de la watchlist..." text is present
4. Check if actual watchlist content appears (cards, items, etc.)
Expected Result: Loading text disappears within 3s, actual content appears
Failure Indicators: Loading spinner continues indefinitely, timeout errors, 500 errors
Evidence: .sisyphus/evidence/task-8-watchlist-loads.png
Scenario: Watchlist search works correctly
Tool: dev-browser (playwright)
Preconditions: On watchlist page with content
Steps:
1. Locate search input field
2. Type search query (e.g., "Naruto")
3. Click search button or press Enter
4. Wait max 2 seconds for results
5. Check if results appear or "no results" message shows
Expected Result: Search results appear within 2s, results filter correctly, no console errors
Failure Indicators: No results appear, results don't match query, console errors, timeout
Evidence: .sisyphus/evidence/task-8-search-works.png
Scenario: Browser console shows 0 JavaScript errors on watchlist
Tool: dev-browser (playwright console API)
Preconditions: On watchlist page
Steps:
1. Open browser DevTools Console tab
2. Check for any red error messages
3. Count errors (should be 0)
Expected Result: 0 JavaScript errors in console
Failure Indicators: Any error messages (red text) in console
Evidence: .sisyphus/evidence/task-8-console-errors.txt
```
**Commit**: NO
- This is testing - no code changes
- [ ] 9. Test Navigation from Watchlist to Home
**What to do**:
- Navigate to `/watchlist` page in browser
- Locate the "Retour à l'accueil" button added in Task 6
- Click the button
- Verify navigation redirects to `/web`
- Verify home page loads completely
- Check browser console for errors after navigation
- Test that navigation works from different watchlist states (empty, with items, after search)
- Verify browser history is updated correctly
**Must NOT do**:
- Modify navigation logic
- Fix bugs found during testing (only document)
- Change /web route behavior
**Recommended Agent Profile**:
- **Category**: `unspecified-high`
- Reason: Integration testing of navigation flow
- **Skills**: [`dev-browser`]
- dev-browser: Use Playwright for navigation testing
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 3 (with Task 8)
- **Blocks**: Task 10
- **Blocked By**: Task 6, 7 (navigation button must exist first)
**References**:
**Pattern References**:
- `templates/watchlist.html` - Navigation button location
- `templates/index.html` - Home page structure
**Acceptance Criteria**:
```bash
# Home page loads successfully
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/web
Expected: 200
```
**QA Scenarios (MANDATORY):**
```
Scenario: Clicking navigation button redirects to /web
Tool: dev-browser (playwright)
Preconditions: On watchlist page with navigation button
Steps:
1. Locate button with text "Retour à l'accueil"
2. Click button
3. Wait max 5 seconds for navigation
4. Check current URL in browser
5. Verify home page content is visible
Expected Result: URL changes to /web or /, home page loads completely, no errors
Failure Indicators: URL doesn't change, 404 error, broken page, console errors
Evidence: .sisyphus/evidence/task-9-nav-to-home.png
Scenario: Navigation works from different watchlist states
Tool: dev-browser (playwright)
Preconditions: Server running
Steps:
1. Test from empty watchlist state
2. Test from watchlist with items
3. Test after performing search
4. Test after opening item details
5. For each state, click navigation button and verify it works
Expected Result: Navigation works from all states, no broken scenarios
Failure Indicators: Navigation fails in certain states, inconsistent behavior
Evidence: .sisyphus/evidence/task-9-nav-all-states.png
```
**Commit**: NO
- This is testing - no code changes
- [ ] 10. Browser Console Error Verification (All Pages)
**What to do**:
- Start FastAPI server: `uvicorn main:app --host 0.0.0.0 --port 3000`
- Open browser DevTools on `/web` page
- Check Console tab for any JavaScript errors
- Navigate to `/watchlist` page
- Check Console tab for any JavaScript errors
- Test navigation from watchlist to home
- Check Console tab for any JavaScript errors after navigation
- Verify 0 errors on all pages and after all interactions
- Note any warnings (non-critical) separately from errors
**Must NOT do**:
- Fix any errors found (only document)
- Ignore errors - they must be fixed by previous tasks
- Clear browser cache before testing (test real user scenario)
**Recommended Agent Profile**:
- **Category**: `quick`
- Reason: Console verification task
- **Skills**: [`dev-browser`]
- dev-browser: Use Playwright to access browser console
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 4 (with Tasks 11, 12)
- **Blocks**: Task 12
- **Blocked By**: Task 1, 2, 3, 8, 9 (all fixes and tests must be complete)
**References**:
**Pattern References**:
- `static/js/downloads.js` - Fixed for duplicate variables
- `static/js/watchlist/main.js` - Fixed for duplicate API_BASE
- `templates/watchlist.html` - Fixed for duplicate script loading
**Acceptance Criteria**:
```bash
# No duplicate declarations in downloads.js
grep -c "const sortBy" static/js/downloads.js
Expected: 1
# No API_BASE in watchlist/main.js
grep -c "API_BASE" static/js/watchlist/main.js
Expected: 0
```
**QA Scenarios (MANDATORY):**
```
Scenario: Browser console shows 0 errors on /web page
Tool: dev-browser (playwright)
Preconditions: Server running
Steps:
1. Navigate to http://localhost:3000/web
2. Open DevTools Console tab
3. Check for red error messages
4. Count total errors
Expected Result: 0 JavaScript errors
Failure Indicators: Any error messages in console
Evidence: .sisyphus/evidence/task-10-console-home.txt
Scenario: Browser console shows 0 errors on /watchlist page
Tool: dev-browser (playwright)
Preconditions: Server running
Steps:
1. Navigate to http://localhost:3000/watchlist
2. Open DevTools Console tab
3. Check for red error messages
4. Count total errors
Expected Result: 0 JavaScript errors
Failure Indicators: Any error messages in console
Evidence: .sisyphus/evidence/task-10-console-watchlist.txt
Scenario: No errors after navigating watchlist to home
Tool: dev-browser (playwright)
Preconditions: On watchlist page
Steps:
1. Click "Retour à l'accueil" button
2. Wait for navigation to complete
3. Check Console tab for new errors
Expected Result: 0 new errors after navigation
Failure Indicators: Any error messages appear after navigation
Evidence: .sisyphus/evidence/task-10-console-nav.txt
```
**Commit**: NO
- This is verification - no code changes
- [ ] 11. API Endpoint Integration Tests
**What to do**:
- Verify all watchlist API endpoints work correctly with curl
- Test each endpoint with proper authentication (JWT token)
- Test error handling (missing token, invalid token, invalid data)
- Verify response structure matches expected format
- Test edge cases (empty watchlist, non-existent ID, duplicate adds)
- Document any endpoints returning unexpected responses
- Verify `/health` endpoint returns 200
**Must NOT do**:
- Modify backend code
- Fix any API bugs found (only document)
- Add new endpoints
**Recommended Agent Profile**:
- **Category**: `quick`
- Reason: API testing with curl
- **Skills**: []
- curl sufficient for API verification
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 4 (with Tasks 10, 12)
- **Blocks**: Task 12
- **Blocked By**: Task 5 (initial API verification should have been done)
**References**:
**Pattern References**:
- `app/routes/watchlist.py` - Watchlist API routes
- `app/auth.py` - JWT authentication implementation
**Acceptance Criteria**:
```bash
# Health endpoint works
curl -s http://localhost:3000/health | grep -q "ok"
Expected: PASS
```
**QA Scenarios (MANDATORY):**
```
Scenario: GET /api/watchlist with auth returns 200
Tool: Bash (curl)
Preconditions: Server running, valid JWT token available
Steps:
1. Get auth token (or use existing)
2. Run: curl -i -H "Authorization: Bearer TOKEN" http://localhost:3000/api/watchlist
3. Check HTTP status code
4. Verify response is valid JSON
Expected Result: 200 OK with valid JSON array
Failure Indicators: 401/403, 500 error, invalid JSON
Evidence: .sisyphus/evidence/task-11-api-get-watchlist.txt
Scenario: POST /api/watchlist with valid data returns 201
Tool: Bash (curl)
Preconditions: Server running, authenticated
Steps:
1. Prepare JSON payload with valid watchlist item data
2. Run: curl -i -X POST -H "Content-Type: application/json" -H "Authorization: Bearer TOKEN" -d PAYLOAD http://localhost:3000/api/watchlist
3. Check HTTP status code
Expected Result: 201 Created with valid JSON response
Failure Indicators: 400 Bad Request, 401 Unauthorized, 500 error
Evidence: .sisyphus/evidence/task-11-api-post-watchlist.txt
Scenario: DELETE /api/watchlist/{id} with valid ID returns 204
Tool: Bash (curl)
Preconditions: Server running, authenticated, item exists
Steps:
1. Get valid watchlist item ID from GET request
2. Run: curl -i -X DELETE -H "Authorization: Bearer TOKEN" http://localhost:3000/api/watchlist/{id}
3. Check HTTP status code
Expected Result: 204 No Content (success)
Failure Indicators: 404 Not Found, 401 Unauthorized, 500 error
Evidence: .sisyphus/evidence/task-11-api-delete-watchlist.txt
```
**Commit**: NO
- This is verification - no code changes
- [ ] 12. Git Cleanup and Commit
**What to do**:
- Review all changes made during this refactor
- Group related commits if needed (or keep separate for clarity)
- Verify all modified files are included in commit:
- `static/js/downloads.js` (Task 1)
- `static/js/watchlist/main.js` (Task 2)
- `templates/watchlist.html` (Task 3 and Tasks 6, 7)
- Create descriptive commit messages following project conventions
- Verify no unintended files were modified
- Check git status for untracked files (should be only evidence files)
- Run tests one final time before committing
- Push changes if needed (or prepare for manual push)
**Must NOT do**:
- Commit files that weren't modified
- Commit evidence files (.sisyphus/evidence/)
- Commit with unclear messages
- Include debugging code or console.logs
**Recommended Agent Profile**:
- **Category**: `git`
- Reason: Git operations for commit cleanup
- **Skills**: [`git-master`]
- git-master: Git operations, commit message formatting, history management
**Parallelization**:
- **Can Run In Parallel**: NO
- **Parallel Group**: Final task in Wave 4
- **Blocks**: None
- **Blocked By**: Task 10, 11 (all verifications must complete)
**References**:
**Pattern References**:
- Git log for recent commit messages (check format)
- Project documentation for commit conventions (if exists)
**Acceptance Criteria**:
```bash
# Git status is clean (except evidence files)
git status --porcelain | grep -v "^.sisyphus/evidence"
Expected: Empty or only evidence files
```
**QA Scenarios (MANDATORY):**
```
Scenario: Git commits are properly formatted
Tool: Bash (git)
Preconditions: All fixes applied, tested
Steps:
1. Run: git log -1 --pretty=format:"%s"
2. Verify commit message follows convention: type(scope): description
3. Verify message is descriptive and clear
Expected Result: Commit messages follow project conventions
Failure Indicators: Vague messages, wrong format, merge commits
Evidence: .sisyphus/evidence/task-12-git-log.txt
Scenario: All modified files are committed
Tool: Bash (git)
Preconditions: Ready to commit
Steps:
1. Run: git status
2. Verify downloads.js, watchlist/main.js, watchlist.html are listed as modified
3. Verify no other unexpected files are modified
4. Run: git diff --stat
Expected Result: Only expected files modified, changes match plan
Failure Indicators: Unexpected files modified, missing files, unrelated changes
Evidence: .sisyphus/evidence/task-12-git-status.txt
```
**Commit**: YES (This task IS the commit action)
- Groups all previous tasks into final commits
- [ ] F1. **Plan Compliance Audit** — `oracle`
Read the plan end-to-end. For each "Must Have": verify implementation exists. For each "Must NOT Have": search codebase for forbidden patterns. 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. **Code Quality Review** — `unspecified-high`
Check all changed files for: duplicate variable declarations, duplicate const declarations, syntax errors, console errors. Verify no new bugs introduced.
Output: `Syntax [PASS/FAIL] | Duplicates [0/N] | Files [N clean/N issues] | VERDICT`
- [ ] F3. **Real Manual QA** — `unspecified-high` (+ `dev-browser` skill)
Start from clean state. Navigate to `/web` and `/watchlist`. Verify watchlist loads successfully, search works, navigation button returns to home. Check browser console for 0 errors. Test all watchlist features (add, remove, search, stats).
Output: `Console Errors [0/N] | Watchlist Load [PASS/FAIL] | Search [PASS/FAIL] | Navigation [PASS/FAIL] | VERDICT`
---
## Commit Strategy
- **1**: `fix(js): Remove duplicate variable declarations in downloads.js`
- Files: `static/js/downloads.js`
- **2**: `fix(js): Remove duplicate API_BASE declaration from watchlist/main.js`
- Files: `static/js/watchlist/main.js`
- **3**: `fix(html): Remove duplicate script loading from watchlist.html`
- Files: `templates/watchlist.html`
- **4**: `feat(ui): Add navigation button to return to /web from watchlist`
- Files: `templates/watchlist.html`
---
## Success Criteria
### Verification Commands
```bash
# Check downloads.js has no duplicate declarations
grep -n "const sortBy" static/js/downloads.js | wc -l # Expected: 1
# Check watchlist/main.js has no API_BASE
grep -c "API_BASE" static/js/watchlist/main.js # Expected: 0
# Check watchlist.html doesn't load watchlist/main.js locally
grep -c "watchlist/main.js" templates/watchlist.html # Expected: 0
# Verify navigation button exists in watchlist.html
grep -c "Retour à l'accueil" templates/watchlist.html # Expected: >= 1
# Test backend API endpoints
curl -s http://localhost:3000/health # Expected: {"status": "ok"}
```
### Final Checklist
- [ ] All "Must Have" present (fixes applied, navigation button added)
- [ ] All "Must NOT Have" absent (no new frameworks, no route changes)
- [ ] Browser console shows 0 JavaScript errors
- [ ] Watchlist loads in < 3 seconds with no infinite loading
- [ ] Search functionality works
- [ ] Navigation button returns to `/web`
- [ ] Backend API endpoints respond correctly