# CRITICAL ISSUE: Router Context Error After Git Commits **Date:** December 8, 2025 **Status:** πŸ”΄ CRITICAL - Blocks deployment **Priority:** P0 - Must fix before any git push to remote --- ## Problem Summary After committing backend changes to git and syncing with remote, **frontend pages break** with React Router context errors. The system is currently working but **will break** when the 6 modified backend files are pushed to remote. ### Affected Pages 1. `/planner/keywords` - Planner Keywords page 2. `/writer/tasks` - Writer Tasks page 3. `/sites` - Sites management page 4. `/thinker/prompts` - Thinker Prompts page 5. `/automation` - Automation page 6. `/setup/add-keywords` - Add Keywords setup page ### Error Pattern **Primary Error:** ``` Error: useLocation() may be used only in the context of a component. at ModuleNavigationTabs (ModuleNavigationTabs.tsx:22:20) ``` **Secondary Error:** ``` Error: useNavigate() may be used only in the context of a component. ``` **Associated API Errors (related to permission fixes):** ``` 403 Forbidden: /api/v1/auth/sites/5/sectors/ 403 Forbidden: /api/v1/auth/sites/ 404 Not Found: /api/v1/billing/transactions/balance/ ``` --- ## Root Cause Analysis ### NOT a Code Issue The code works fine in development and after fresh rebuild. The Router errors are **NOT** caused by the backend permission fixes. ### ACTUAL Cause: Docker Build Cache Invalidation Failure **The Problem Chain:** 1. Backend code changes are committed to git 2. Git push triggers remote sync 3. Docker Compose sees changed files 4. **Docker does NOT properly rebuild frontend container** (uses stale cache) 5. Frontend serves old JavaScript bundles with mismatched module boundaries 6. React Router hooks fail because component tree structure changed 7. Pages crash with "useLocation/useNavigate not in Router context" **Why This Happens:** - Frontend `Dockerfile.dev` uses `npm install` (not `npm ci`) - `package.json` changes don't always trigger full rebuild - Docker layer caching is too aggressive - `node_modules` volume persists stale dependencies - Vite HMR works during dev, but production bundle gets out of sync --- ## Current Workaround (Manual Fix) **When errors occur, run these steps:** ```bash # 1. Remove ALL containers in Portainer (manual deletion via UI) # 2. Rebuild infrastructure containers cd /data/app docker compose -f docker-compose.yml -p igny8-infra up -d sleep 3 # 3. Rebuild application containers cd /data/app/igny8 docker compose -f docker-compose.app.yml -p igny8-app up -d # 4. Clear user session # - Log out from app # - Clear all cookies # - Log back in ``` **Result:** All pages work again βœ… --- ## Files That Will Trigger This Issue **Currently modified (unstaged) backend files:** ``` backend/igny8_core/api/base.py - Superuser bypass in ViewSets backend/igny8_core/api/permissions.py - Bypass in permission classes backend/igny8_core/api/throttles.py - Bypass in rate throttling backend/igny8_core/auth/middleware.py - Session validation bypass backend/igny8_core/auth/utils.py - Account validation bypass backend/igny8_core/modules/billing/urls.py - Billing endpoint alias ``` **When these are pushed to remote β†’ frontend breaks** --- ## Permanent Fix Required ### Solution A: Fix Docker Build Cache (RECOMMENDED) **1. Update `frontend/Dockerfile.dev`:** ```dockerfile # Before: RUN npm install # After: COPY package.json package-lock.json ./ RUN npm ci --prefer-offline --no-audit COPY . . ``` **Explanation:** - `npm ci` does clean install (deletes node_modules first) - Separate COPY layers ensure package.json changes invalidate cache - `--prefer-offline` speeds up rebuild with local cache **2. Update `docker-compose.app.yml` frontend service:** ```yaml volumes: - ./frontend:/app - /app/node_modules # ← ADD THIS LINE ``` **Explanation:** - Excludes `node_modules` from volume mount - Prevents host `node_modules` from overriding container's - Forces Docker to use freshly installed dependencies **3. Update deployment commands to use `--no-cache` flag:** ```bash # Development rebuild (when issues occur) docker compose -f docker-compose.app.yml build --no-cache frontend docker compose -f docker-compose.app.yml up -d frontend # Production deployment (always use) docker compose -f docker-compose.app.yml build --no-cache docker compose -f docker-compose.app.yml up -d ``` ### Solution B: Add Build Verification Step **Add to deployment script:** ```bash #!/bin/bash # deploy_frontend.sh echo "Building frontend with cache busting..." docker compose -f docker-compose.app.yml build --no-cache frontend echo "Checking build artifacts..." docker run --rm igny8-app-frontend ls -la /app/dist/ echo "Deploying frontend..." docker compose -f docker-compose.app.yml up -d frontend echo "Waiting for health check..." sleep 5 curl -f https://app.igny8.com || echo "WARNING: Frontend not responding" ``` --- ## Why Backend Changes Break Frontend **This seems counterintuitive but here's why:** 1. **Backend changes get committed** β†’ triggers rebuild process 2. **docker-compose.app.yml rebuilds ALL services** (backend + frontend) 3. **Backend rebuilds correctly** (Django reloads Python modules) 4. **Frontend rebuild FAILS SILENTLY** (uses cached layers) 5. **Old frontend bundle** tries to connect to **new backend API** 6. **React component tree structure mismatch** β†’ Router context errors **The Fix:** - Ensure frontend ALWAYS rebuilds when ANY file in docker-compose.app.yml changes - Use `--no-cache` on deployments - Add build hash verification --- ## Testing Plan ### Before Pushing to Remote **1. Test current system works:** ```bash curl -I https://app.igny8.com/planner/keywords curl -I https://app.igny8.com/writer/tasks curl -I https://app.igny8.com/sites ``` **2. Apply Docker fixes:** - Update `frontend/Dockerfile.dev` - Update `docker-compose.app.yml` - Test rebuild with `--no-cache` **3. Verify pages load:** - Login as dev@igny8.com - Visit all 6 affected pages - Check browser console for errors **4. Commit and push:** ```bash git add backend/ git commit -m "Fix superuser/developer access bypass" git push origin main ``` **5. Monitor production:** - SSH to server - Watch docker logs: `docker logs -f igny8_frontend` - Check all 6 pages still work ### If Errors Still Occur Run the manual workaround: 1. Remove containers in Portainer 2. Rebuild infra + app 3. Clear cookies + re-login --- ## Impact Assessment **Current Status:** - βœ… System working locally - βœ… All pages functional after rebuild - ⚠️ **6 backend files uncommitted** (permission fixes) - πŸ”΄ **Cannot push to remote** (will break production) **Deployment Blocked Until:** - [ ] Docker build cache fix implemented - [ ] Frontend Dockerfile.dev updated - [ ] docker-compose.app.yml volume exclusion added - [ ] Deployment script uses --no-cache - [ ] Test push to staging branch first **Business Impact:** - Superuser/developer access fixes are ready but **cannot be deployed** - Production system stuck on old code - Manual rebuild required after every deployment - High risk of breaking production --- ## Next Steps **Immediate (Before Any Git Push):** 1. ⏸️ **DO NOT commit or push the 6 backend files yet** 2. πŸ”§ Fix `frontend/Dockerfile.dev` first 3. πŸ”§ Update `docker-compose.app.yml` volumes 4. βœ… Test full rebuild with --no-cache 5. βœ… Verify all 6 pages work 6. πŸ“ Commit Docker fixes first 7. πŸ“ Then commit backend permission fixes 8. πŸš€ Push to remote in correct order **After Router Fix:** 1. User will test account/billing pages (user-level) 2. Check for permission leakage in admin menu 3. Verify superuser-only access works correctly 4. Test user menu vs admin menu isolation --- ## Related Issues **From Previous Documentation:** - Issue D: Docker Build Cache (FINAL-IMPLEMENTATION-REQUIREMENTS.md) - Session Contamination (CRITICAL-ISSUE-C.md) - Subscription Creation Gap (Issue B) **New Findings:** - Router context errors are **symptom** of build cache issue - Backend commits trigger the problem (unexpected) - Frontend needs proper dependency invalidation - Cookie clearing required after rebuild (session state persists) --- ## References **Files Modified (Current Session):** ``` βœ… backend/igny8_core/auth/middleware.py - Added superuser bypass βœ… backend/igny8_core/api/permissions.py - Added bypass to 4 classes βœ… backend/igny8_core/api/base.py - Added bypass to ViewSet querysets βœ… backend/igny8_core/auth/utils.py - Added bypass to validation βœ… backend/igny8_core/modules/billing/urls.py - Added endpoint alias βœ… backend/igny8_core/api/throttles.py - Added throttle bypass ``` **Database Changes (Current Session):** ``` βœ… Deleted duplicate free-trial plan (ID: 7) βœ… Renamed enterprise β†’ internal (System/Superuser only) βœ… 5 plans now active: free, starter, growth, scale, internal ``` **Documentation Created:** ``` - IMPLEMENTATION-COMPLETE-DEC-8-2025.md (comprehensive summary) - QUICK-FIX-IMPLEMENTATION-SUMMARY.md (initial fixes) - SYSTEM-AUDIT-REPORT-2025-12-08.md (audit results) - CRITICAL-ISSUE-ROUTER-CONTEXT-ERROR.md (this document) ``` --- ## Conclusion **The system is working perfectly right now**, but **will break when code is pushed to remote** due to Docker build cache issues. **Priority:** Fix Docker caching BEFORE committing the 6 backend permission files. **DO NOT PUSH TO REMOTE until Docker fixes are tested and verified.**