diff --git a/docs/plans/COMPREHENSIVE-SYSTEM-FIX-PLAN-JAN-10-2026.md b/docs/plans/COMPREHENSIVE-SYSTEM-FIX-PLAN-JAN-10-2026.md
index 629cca4a..2c6d63fd 100644
--- a/docs/plans/COMPREHENSIVE-SYSTEM-FIX-PLAN-JAN-10-2026.md
+++ b/docs/plans/COMPREHENSIVE-SYSTEM-FIX-PLAN-JAN-10-2026.md
@@ -1,17 +1,29 @@
# COMPREHENSIVE SYSTEM FIX PLAN
**Date:** January 10, 2026
+**Last Updated:** January 10, 2026
**Priority:** CRITICAL
-**Status:** Analysis Complete - Ready for Implementation
+**Status:** Phase 1 Complete - Phase 2 In Progress
---
## EXECUTIVE SUMMARY
-After comprehensive system analysis, I've identified **7 critical issues** with clear root causes and detailed fixes. These issues fall into **3 categories**:
+This plan tracks all identified system issues, their status, and implementation details. Issues are categorized by priority and module.
-1. **Backend Data Model Inconsistencies** (2 issues)
-2. **Missing Credit Tracking & Logging** (1 major issue)
-3. **Frontend Issues** (4 issues)
+**Issue Categories:**
+1. **Backend Data Model & Credits** (2 issues - ✅ COMPLETED)
+2. **Frontend - Automation** (3 issues)
+3. **Frontend - Publishing & Calendar** (3 issues)
+4. **Frontend - Planner/Writer Pages** (2 issues)
+5. **Frontend - Sites & Settings** (3 issues)
+6. **Branding & Terminology** (2 issues)
+7. **New Features** (2 issues)
+
+**Completion Status:**
+- ✅ Phase 1 (Backend Credit System): COMPLETED
+- 🔄 Phase 2 (Frontend Critical): IN PROGRESS
+- ⏳ Phase 3 (UX Improvements): PENDING
+- ⏳ Phase 4 (New Features): PENDING
**Impact:** These fixes will ensure:
- ✅ All AI functions log consistently to AI tasks, notifications, and usage logs
@@ -19,12 +31,15 @@ After comprehensive system analysis, I've identified **7 critical issues** with
- ✅ No attribute errors in AI model configuration
- ✅ Consistent data display across all pages
- ✅ Improved UX with proper button styling and working features
+- ✅ Proper terminology throughout the app (site vs wordpress)
+- ✅ Auto-approve and auto-publish working correctly
+- ✅ Content calendar showing published content
---
## ISSUE 1: AIModelConfig AttributeError - `input_cost_per_1m`
-### 🔴 CRITICAL - System Breaking
+### ✅ COMPLETED - v1.7.1
**Error Message:**
```
@@ -32,72 +47,41 @@ Failed to cluster keywords: Unexpected error: 'AIModelConfig' object has no attr
```
**Root Cause:**
-The `AIModelConfig` model uses field names `cost_per_1k_input` and `cost_per_1k_output`, but `model_registry.py` is trying to access `input_cost_per_1m` and `output_cost_per_1m` (old field names).
+The `AIModelConfig` model uses field names `cost_per_1k_input` and `cost_per_1k_output`, but `model_registry.py` was trying to access `input_cost_per_1m` and `output_cost_per_1m` (old field names).
-**Location:**
-- File: `/backend/igny8_core/ai/model_registry.py` line 121
-- File: `/backend/igny8_core/modules/billing/serializers.py` line 290
+**Fix Applied in v1.7.1:**
+- Updated field references in `model_registry.py` to use correct field names
+- Updated field references in `serializers.py` to match
-**Current Code (WRONG):**
-```python
-# model_registry.py line 121
-if rate_type == 'input':
- return model.input_cost_per_1m or Decimal('0') # ❌ WRONG FIELD NAME
-elif rate_type == 'output':
- return model.output_cost_per_1m or Decimal('0') # ❌ WRONG FIELD NAME
-```
-
-**Model Definition (CORRECT):**
-```python
-# business/billing/models.py line 785-797
-cost_per_1k_input = models.DecimalField(...) # ✅ ACTUAL FIELD NAME
-cost_per_1k_output = models.DecimalField(...) # ✅ ACTUAL FIELD NAME
-```
-
-**Fix Strategy:**
-Update field references in `model_registry.py` and `serializers.py` to match actual model field names.
-
-**Files to Change:**
-1. `backend/igny8_core/ai/model_registry.py` (1 fix)
-2. `backend/igny8_core/modules/billing/serializers.py` (1 fix)
-
-**Impact:**
-- Fixes: Clustering errors, all AI function cost calculations
-- Affects: All AI operations that use ModelRegistry for cost calculation
+**Files Changed:**
+1. `backend/igny8_core/ai/model_registry.py`
+2. `backend/igny8_core/modules/billing/serializers.py`
---
## ISSUE 2: Image Generation - Missing Credit Tracking & Logging
-### 🔴 CRITICAL - Business Logic Gap
+### ✅ COMPLETED - v1.7.1
**Problem:**
-Image generation does NOT:
-- ❌ Log to AI tasks table (AITaskLog)
-- ❌ Log to notifications
-- ❌ Log to usage logs with cost calculations
-- ❌ Deduct credits properly based on model configuration
+Image generation was not:
+- ❌ Logging to AI tasks table (AITaskLog)
+- ❌ Logging to notifications
+- ❌ Logging to usage logs with cost calculations
+- ❌ Deducting credits properly based on model configuration
-All other AI functions (clustering, content generation, idea generation) properly log to all 3 locations, but image generation is missing.
+**Fix Applied in v1.7.1:**
+- Added `CreditService.check_credits_for_image()` method
+- Pre-generation credit verification in `tasks.py`
+- Credit deduction after each successful image
+- AITaskLog creation for image generation
+- Notification integration
-**Root Cause Analysis:**
+**Files Changed:**
+1. `backend/igny8_core/business/billing/services/credit_service.py`
+2. `backend/igny8_core/ai/tasks.py`
-**Current Image Generation Flow:**
-```
-generate_images()
- → ai_core.generate_image()
- → _generate_image_openai()/_generate_image_runware()
- → Returns {'url': ..., 'cost': ...}
- → ❌ NO credit deduction
- → ❌ NO AITaskLog creation
- → ❌ NO notification
- → ❌ NO usage log
-```
-
-**Expected Flow (like other AI functions):**
-```
-generate_images()
- → Check credits (CreditService.check_credits)
+**See CHANGELOG v1.7.1 for full details.**
→ ai_core.generate_image()
→ Returns result
→ Deduct credits (CreditService.deduct_credits_for_image)
@@ -338,198 +322,108 @@ If not, add them to the notification type choices.
## ISSUE 3: Pause/Cancel Button Colors in Automation
-### 🟡 MEDIUM - UX Issue
+### ✅ COMPLETED
**Problem:**
-Pause/Cancel buttons in automation in-progress panel need better button colors for clarity.
+Pause/Cancel buttons in automation in-progress panel needed better button colors for clarity.
-**Current Implementation:**
-File: `frontend/src/components/Automation/CurrentProcessingCardV2.tsx` lines 268-294
+**Fix Applied:**
+Updated button variants from `outline` to `primary` for better visibility.
+**File:** `frontend/src/components/Automation/CurrentProcessingCardV2.tsx`
+
+**Current Implementation (CORRECT):**
```tsx
-{currentRun.status === 'running' ? (
- }
- >
- {isPausing ? 'Pausing...' : 'Pause'}
-
-) : currentRun.status === 'paused' ? (
- }
- >
- {isResuming ? 'Resuming...' : 'Resume'}
-
-)}
-
+
+
+
```
-**Recommended Fix:**
-
-```tsx
-{currentRun.status === 'running' ? (
- }
- >
- {isPausing ? 'Pausing...' : 'Pause'}
-
-) : currentRun.status === 'paused' ? (
- }
- >
- {isResuming ? 'Resuming...' : 'Resume'}
-
-)}
-
-```
-
-**Rationale:**
-- Pause: Solid warning (yellow) button - more visible, important action
-- Resume: Already solid success (green) - GOOD
-- Cancel: Solid danger (red) button - critical destructive action needs prominence
-
-**Files to Change:**
-1. `frontend/src/components/Automation/CurrentProcessingCardV2.tsx`
-2. `frontend/src/components/Automation/CurrentProcessingCard.tsx` (if still used)
-
---
-## ISSUE 4: Credits Not Updating in Automation In-Progress Panel
+## ISSUE 4: Automation Stage Cards - Credits Not Showing During Processing
+
+### 🔴 CRITICAL - UI Gap
+
+**Problem:**
+Credits are not showing in Stage 1, 2, 4, and 5 stage cards when processing, but they DO show in Stage 6 card. Need consistency across all stages.
+
+**Root Cause:**
+The `StageCard.tsx` component doesn't have a mechanism to display credits during processing. Only Stage 6 (Image Generation) shows credits because the `CurrentProcessingCardV2.tsx` displays `currentRun.total_credits_used`.
+
+**Files to Investigate:**
+1. `frontend/src/components/Automation/StageCard.tsx` - Individual stage cards
+2. `frontend/src/components/Automation/CurrentProcessingCardV2.tsx` - In-progress panel
+
+**Fix Strategy:**
+1. Pass credits information to StageCard when stage is active
+2. Display credits consumed during that stage's processing
+3. Fetch real-time credit updates from backend
+
+**Implementation:**
+
+```tsx
+// In StageCard.tsx - Add credits display
+interface StageCardProps {
+ // ... existing props
+ creditsUsed?: number; // Credits used by this stage
+ creditsPerItem?: number; // Credit cost per item processed
+}
+
+// Display in active state:
+{isActive && (
+
+
+ Credits Used:
+ {creditsUsed || 0}
+
+
+)}
+```
+
+---
+
+## ISSUE 5: Automation In-Progress Panel - Credits Badge Not Incrementing
### 🔴 CRITICAL - Real-time UX Issue
**Problem:**
-When images are being generated one by one in automation, the credits count doesn't update in the in-progress panel.
+The credits badge in the automation in-progress panel shows `0` and doesn't increment after each stage completes. It should show cumulative credits used during the entire run.
**Root Cause:**
-The in-progress panel doesn't have real-time updates for credit balance. It only updates when the page refreshes or when the run status is polled.
+Looking at `CurrentProcessingCardV2.tsx`, it displays `currentRun.total_credits_used` but this value isn't being updated in real-time from the backend during processing.
-**Current Implementation:**
-File: `frontend/src/components/Automation/CurrentProcessingCardV2.tsx`
-
-The component displays credits from `currentRun` object but doesn't subscribe to credit balance updates.
+**Current Code (Line 297):**
+```tsx
+{currentRun.total_credits_used}
+```
**Fix Strategy:**
-### Option 1: Poll Credit Balance (Simpler)
-
-Add credit balance polling to the automation progress polling:
-
+### Option 1: Poll Credit Updates More Frequently
```tsx
-// In CurrentProcessingCardV2.tsx
-import { useCreditBalance } from '../../hooks/useCreditBalance';
-
-export default function CurrentProcessingCardV2({ ... }) {
- const { balance, loading: balanceLoading, refresh: refreshBalance } = useCreditBalance();
+// Add dedicated credit polling
+useEffect(() => {
+ const pollCredits = async () => {
+ try {
+ const response = await fetchAPI(`/v1/automation/runs/${runId}/credits/`);
+ setCreditsUsed(response.total_credits_used);
+ } catch (err) {}
+ };
- // Refresh balance when run updates
- useEffect(() => {
- if (currentRun) {
- refreshBalance();
- }
- }, [currentRun.credits_used, currentRun.credits_remaining]);
-
- // Display live balance
- return (
-
- {/* ... existing UI ... */}
-
- Credits: {balance?.credits || 0}
-
-
- );
-}
+ if (currentRun.status === 'running') {
+ const interval = setInterval(pollCredits, 2000); // Every 2 seconds
+ return () => clearInterval(interval);
+ }
+}, [currentRun.status, runId]);
```
-### Option 2: WebSocket Updates (Better - Future)
-
-Implement WebSocket for real-time credit updates:
-- Backend: Send credit update events via WebSocket
-- Frontend: Subscribe to credit updates in credit balance context
-
-**Recommended: Option 1 for now** (simpler, works immediately)
+### Option 2: Include Credits in Processing State Response
+Backend should return `credits_used_so_far` in the processing state endpoint.
**Files to Change:**
1. `frontend/src/components/Automation/CurrentProcessingCardV2.tsx`
-2. `frontend/src/hooks/useCreditBalance.ts` (ensure it has refresh method)
-
----
-
-## ISSUE 5: Console Error - value prop without onChange in WordPress Integration Form
-
-### 🟡 MEDIUM - React Warning
-
-**Error:**
-```
-You provided a `value` prop to a form field without an `onChange` handler.
-This will render a read-only field. If the field should be mutable use `defaultValue`.
-Otherwise, set either `onChange` or `readOnly`.
-```
-
-**Location:**
-`frontend/src/components/sites/WordPressIntegrationForm.tsx`
-
-**Root Cause:**
-Input fields are using `value` prop without corresponding `onChange` handlers.
-
-**Fix:**
-Find all `` without `onChange` and either:
-1. Add `onChange` handler, or
-2. Change to `defaultValue` if read-only, or
-3. Add `readOnly` prop
-
-**Example Fix:**
-```tsx
-// BEFORE (WRONG)
-
-
-// AFTER (OPTION 1 - if editable)
- setApiKey(e.target.value)} />
-
-// AFTER (OPTION 2 - if read-only)
-
-
-// AFTER (OPTION 3 - if should use initial value only)
-
-```
-
-**Files to Change:**
-1. `frontend/src/components/sites/WordPressIntegrationForm.tsx`
+2. `backend/igny8_core/business/automation/services/automation_service.py` (if needed)
---
@@ -538,333 +432,599 @@ Find all `` without `onChange` and either:
### 🔴 CRITICAL - Data Integrity Issue
**Problem:**
-The WorkflowCompletionWidget shows different counts on different pages, even though it's the same widget using the same data source.
+The WorkflowCompletionWidget shows different counts on different pages because it filters by active sector.
-**Root Cause Analysis:**
-
-**Current Implementation:**
-- Widget uses `useWorkflowStats()` hook
-- Hook fetches data with site_id and optional sector_id filters
-- **BUG:** Different pages may have different active sector, causing different counts
+**Root Cause:**
+The `useWorkflowStats()` hook uses `activeSector` from store, which changes per page.
**File:** `frontend/src/hooks/useWorkflowStats.ts`
+**Current Code (Line 151):**
```typescript
-const { activeSite } = useSiteStore();
-const { activeSector } = useSectorStore(); // ❌ PROBLEM: sector changes per page
-
-// Fetch with sector filter
+const { activeSector } = useSectorStore();
const sectorParam = activeSector?.id ? `§or_id=${activeSector.id}` : '';
```
-**The Issue:**
-- Keywords page: Shows sector X → Widget shows stats for sector X
-- Writer page: Shows sector Y → Widget shows stats for sector Y
-- Different sectors = different counts = confusing UX
-
-**Fix Strategy:**
-
-### Option 1: Remove Sector Filter from Widget (Recommended)
-
-The widget should always show **site-wide stats**, not sector-specific.
+**Fix:**
+Remove sector filter - widget should always show site-wide stats.
```typescript
-// In useWorkflowStats.ts
-export function useWorkflowStats(timeFilter: TimeFilter = 'all') {
- const { activeSite } = useSiteStore();
- // ✅ REMOVE: Don't use sector filter for widget
- // const { activeSector } = useSectorStore();
-
- const loadStats = useCallback(async () => {
- if (!activeSite?.id) return;
-
- // Build params WITHOUT sector
- const siteParam = `&site_id=${activeSite.id}`;
- // ✅ REMOVED: const sectorParam = activeSector?.id ? `§or_id=${activeSector.id}` : '';
- const baseParams = siteParam; // No sector filter
-
- // ... rest of logic ...
- }, [activeSite?.id]); // ✅ Remove activeSector from dependencies
-}
+// Remove sector dependency
+const loadStats = useCallback(async () => {
+ const siteParam = `&site_id=${activeSite.id}`;
+ // NO sector filter for consistent widget display
+ const baseParams = siteParam;
+ // ...
+}, [activeSite?.id]); // Remove activeSector from dependencies
```
-**Rationale:**
-- Widget is in the footer = global context
-- Should show site-wide completion, not sector-specific
-- Keeps counts consistent across all pages
-
-### Option 2: Add Toggle for Site-wide vs Sector Stats
-
-Add a toggle in the widget to switch between site-wide and sector-specific stats. More complex, may not be needed.
-
-**Recommended: Option 1**
-
-**Files to Change:**
-1. `frontend/src/hooks/useWorkflowStats.ts`
-
-**Testing:**
-- [ ] Navigate between different pages
-- [ ] Verify widget shows same counts on all pages
-- [ ] Verify counts match actual site-wide totals
-
---
-## ISSUE 7: Published Items Calendar Disappeared
+## ISSUE 7: Content Calendar and List Not Showing
### 🔴 CRITICAL - Feature Broken
**Problem:**
-The published items calendar view that was showing earlier has disappeared. Both calendar and list views are not working.
+Content calendar and content list at `/publisher/content-calendar` not showing. Calendar missing completely and list also not showing any past published content.
-**Investigation Needed:**
+**Investigation:**
**File:** `frontend/src/pages/Publisher/ContentCalendar.tsx`
-**Current Status:**
-- Component exists and is implemented
-- Has calendar and list view modes
-- Default view mode is 'calendar'
-- Uses `viewMode` state to switch between views
+**Current Implementation Analysis:**
+- Component fetches ALL content for the site (line 134-145)
+- `publishedItems` filters for items with `external_id` (line 110-112)
+- Calendar uses `getPublishedItemsForDate()` and `getScheduledItemsForDate()`
**Possible Issues:**
-1. Route not working
-2. Component not rendering due to data fetch error
-3. CSS/visibility issue
-4. Auth/permission issue
+1. `external_id` might not be set on published content
+2. `updated_at` used as publish date might not be correct
+3. Data fetch might be failing silently
**Debug Steps:**
-```typescript
-// In ContentCalendar.tsx, add logging
-useEffect(() => {
- console.log('[DEBUG] ContentCalendar mounted');
- console.log('[DEBUG] activeSite:', activeSite);
- console.log('[DEBUG] viewMode:', viewMode);
- console.log('[DEBUG] allContent:', allContent);
-}, []);
+```tsx
+console.log('[ContentCalendar] publishedItems:', publishedItems);
+console.log('[ContentCalendar] Sample with external_id:',
+ allContent.filter(c => c.external_id));
```
-**Fix will depend on findings:**
-- If data fetch error → Fix API call
-- If route issue → Check App.tsx routes
-- If rendering issue → Fix component logic
-- If auth issue → Fix permissions
-
-**Files to Investigate:**
-1. `frontend/src/pages/Publisher/ContentCalendar.tsx`
-2. `frontend/src/App.tsx` (check route)
-3. Browser console (check errors)
-
----
-
-## ISSUE 8: Auto-Approve and Scheduling System
-
-### 🟡 MEDIUM - Feature Incomplete
-
-**Problem:**
-Auto-approve and scheduling feature needs to be properly planned and implemented, or fixed if already configured.
-
-**Current State (Need to Verify):**
-- Auto-approve setting exists in site configuration?
-- Scheduling feature exists for content?
-- Integration with automation?
-
-**Investigation Needed:**
-
-1. **Check if feature exists:**
- ```bash
- grep -r "auto.approve" backend/
- grep -r "auto_approve" backend/
- ```
-
-2. **Check scheduling:**
- ```bash
- grep -r "scheduled_publish" backend/
- ```
-
-3. **Check automation integration:**
- - Does automation respect auto-approve setting?
- - Does it schedule content automatically?
-
-**Potential Implementation (if missing):**
-
-### Auto-Approve Feature
-
-**Backend:**
-- Add `auto_approve_content` field to Site model or AutomationConfig
-- When content is generated, check this setting
-- If true, set status to 'approved' instead of 'review'
-
-**Frontend:**
-- Add toggle in site settings
-- Show in automation configuration
-- Display in content workflow
-
-### Scheduling Feature
-
-**Backend:**
-- Add `auto_schedule` field to Site model or AutomationConfig
-- Add `schedule_interval` (daily, every 2 days, weekly, etc.)
-- When content is approved (or auto-approved), calculate next schedule date
-- Set `scheduled_publish_at` field
-
-**Frontend:**
-- Add scheduling configuration in site settings
-- Show schedule preview
-- Display scheduled items in calendar
-
-**Files to Investigate:**
-1. `backend/igny8_core/business/automation/models.py` (AutomationConfig)
-2. `backend/igny8_core/modules/integration/models.py` (Site model)
-3. `frontend/src/pages/Sites/Settings.tsx`
-
----
-
-## ISSUE 9: 404 Page Redesign
-
-### 🟢 LOW - Visual Enhancement
-
-**Problem:**
-404 page needs to be branded as igny8 own.
-
-**Current State:**
-- Default React 404 page or basic error page
-- Not branded with igny8 design system
-
**Fix Strategy:**
-
-Create a custom 404 page component:
-
-```tsx
-// frontend/src/pages/NotFound.tsx
-import React from 'react';
-import { Link } from 'react-router-dom';
-import Button from '../components/ui/button/Button';
-import { HomeIcon, ArrowLeftIcon } from '../icons';
-
-export default function NotFound() {
- return (
-
-
- {/* Logo */}
-
-
-
-
- {/* 404 */}
-
- 404
-
-
- {/* Message */}
-
- Page Not Found
-
-
- The page you're looking for doesn't exist or has been moved.
-
- );
-}
-```
-
-**Integration:**
-```tsx
-// In App.tsx
-} />
-```
-
-**Files to Create/Change:**
-1. `frontend/src/pages/NotFound.tsx` (new file)
-2. `frontend/src/App.tsx` (add route)
+1. Verify that published content has `external_id` set
+2. Check if backend is returning published content correctly
+3. May need to use `site_status === 'published'` instead of checking `external_id`
---
-## IMPLEMENTATION PRIORITY & ORDER
+## ISSUE 8: Auto-Approve and Auto-Publish on Site Settings
-### Phase 1: Critical Backend Fixes (MUST FIX FIRST)
-**Estimated Time: 2-3 hours**
+### 🔴 CRITICAL - Feature Not Functional
-1. ✅ **Issue 1: AIModelConfig AttributeError** (30 min)
- - Fix field name references
- - Test all AI functions
+**Problem:**
+Auto-approve and auto-publish toggles on Site Settings → Publishing tab need to be made functional.
-2. ✅ **Issue 2: Image Generation Credit Tracking** (2 hours)
- - Integrate credit service
- - Add AITaskLog creation
- - Add notification creation
- - Add usage log with cost
- - Test thoroughly
+**Current State (from code analysis):**
-### Phase 2: Critical Frontend Fixes
-**Estimated Time: 2-3 hours**
+**Backend Models Exist:**
+- `PublishingSettings.auto_approval_enabled` - in `business/integration/models.py:265`
+- `PublishingSettings.auto_publish_enabled` - in `business/integration/models.py:271`
-3. ✅ **Issue 6: WorkflowCompletionWidget Data Consistency** (30 min)
- - Remove sector filter from widget
- - Test across all pages
+**Backend Service Integration Exists:**
+- `automation_service.py:1491` - Checks `auto_approval_enabled`
+- `automation_service.py:1632` - Checks `auto_publish_enabled` and triggers publish
-4. ✅ **Issue 4: Credits Not Updating in Automation** (1 hour)
- - Add credit balance polling
- - Test real-time updates
+**Frontend Implementation Exists:**
+- Site Settings Publishing tab has toggles
+- Saves via `savePublishingSettings()` on toggle change
-5. ✅ **Issue 7: Published Items Calendar** (1 hour)
- - Debug and identify issue
- - Implement fix
- - Test both views
+**Issues to Fix:**
+1. ✅ Backend models exist
+2. ✅ Backend service checks the flags
+3. ❓ Need to verify data flow is working
+4. ❓ Need to verify settings are being loaded correctly
-### Phase 3: UX Improvements
-**Estimated Time: 1-2 hours**
+**Testing Required:**
+1. Toggle auto-approval ON → Run automation → Content should go to 'approved' not 'review'
+2. Toggle auto-publish ON → Content approved → Should trigger publish to WordPress
-6. ✅ **Issue 3: Automation Button Colors** (15 min)
- - Update button variants
- - Test visual appearance
+---
-7. ✅ **Issue 5: Console Error - WordPress Form** (30 min)
- - Fix input onChange handlers
- - Test form
+## ISSUE 9: Publishing Settings Save Button
-8. ✅ **Issue 9: 404 Page Redesign** (30 min)
- - Create branded 404 page
- - Test routing
+### 🟡 MEDIUM - UX Improvement
-### Phase 4: Feature Implementation (If Time Permits)
+**Problem:**
+Limits and Schedule settings in Publishing tab save immediately on change. They should require a Save button click instead. Only the automation toggles should save on toggle.
+
+**Current Implementation:**
+File: `frontend/src/pages/Sites/Settings.tsx` (lines 1025-1100)
+
+```tsx
+// Limits Card - saves on every change (WRONG)
+ {
+ const value = ...;
+ setPublishingSettings({ ...publishingSettings, daily_publish_limit: value });
+ // Missing: Should NOT auto-save here
+ }}
+/>
+
+// Automation Card - saves on toggle (CORRECT for toggles)
+ {
+ setPublishingSettings(newSettings);
+ savePublishingSettings({ auto_approval_enabled: checked }); // ✅ OK for toggles
+ }}
+/>
+```
+
+**Fix Strategy:**
+1. Remove immediate save from Limits and Schedule cards
+2. Add a "Save Settings" button at bottom of Publishing tab
+3. Keep toggle-based save for Automation card only
+
+**New Code:**
+```tsx
+// Limits Card - no auto-save
+onChange={(e) => {
+ setPublishingSettings({ ...publishingSettings, daily_publish_limit: value });
+ // Don't call savePublishingSettings here
+}}
+
+// Add Save button at bottom
+
+
+
+```
+
+---
+
+## ISSUE 10: Planner and Writer Pagination
+
+### 🟡 MEDIUM - Navigation Issue
+
+**Problem:**
+Pagination not working properly on all Planner and Writer pages.
+
+**Pages Affected:**
+- `/planner/keywords`
+- `/planner/clusters`
+- `/planner/ideas`
+- `/writer/tasks`
+- `/writer/drafts`
+- `/writer/images`
+
+**Current Implementation:**
+All pages use similar pagination pattern via `TablePageTemplate`:
+- `currentPage` state
+- `pageSize` state
+- `setCurrentPage` passed to Pagination component
+
+**Possible Issues:**
+1. Page doesn't reset when filters change
+2. Total count not being calculated correctly
+3. Backend not respecting page parameter
+
+**Debug Steps:**
+1. Check network tab - verify `page` param sent correctly
+2. Check response - verify `count` and `results` correct
+3. Check `setCurrentPage` - verify it triggers data reload
+
+**Files to Check:**
+1. `frontend/src/pages/Planner/Keywords.tsx`
+2. `frontend/src/pages/Planner/Clusters.tsx`
+3. `frontend/src/pages/Writer/Tasks.tsx`
+4. `frontend/src/templates/TablePageTemplate.tsx`
+
+---
+
+## ISSUE 11: Footer Widgets Data Audit
+
+### 🟡 MEDIUM - Data Accuracy
+
+**Problem:**
+Need to audit footer widgets on all Planner and Writer pages to ensure counts are accurate.
+
+**Widgets to Audit:**
+1. **Credits Widget** - Shows credit balance
+2. **Quick Stats Widget** - Shows items pending/processed
+3. **Workflow Completion Widget** - Shows pipeline progress
+
+**Audit Table Required:**
+
+| Page | Widget | Model/API | Field | Filter/Criteria | Status |
+|------|--------|-----------|-------|-----------------|--------|
+| Keywords | Quick Stats | Keyword | count | site_id, status | TBD |
+| Clusters | Quick Stats | Cluster | count | site_id | TBD |
+| Ideas | Quick Stats | ContentIdea | count | site_id | TBD |
+| Tasks | Quick Stats | Task | count | site_id | TBD |
+| ... | ... | ... | ... | ... | ... |
+
+**Investigation Required:**
+1. List all widgets shown on each page
+2. Document API endpoint each widget calls
+3. Document filter criteria used
+4. Verify counts match backend reality
+
+---
+
+## ISSUE 12: Usage Logs Cost Calculation Formula
+
+### 🟡 MEDIUM - Documentation/Clarity
+
+**Problem:**
+Need to document the formula/criteria used for cost calculation in Usage Logs page.
+
+**Page:** `/account/usage/logs`
+
+**Current Implementation:**
+File: `frontend/src/pages/account/UsageLogsPage.tsx`
+
+The page displays `cost_usd` from the `CreditUsageLog` model.
+
+**Backend Cost Calculation:**
+File: `backend/igny8_core/business/billing/services/credit_service.py`
+
+```python
+# For text operations (clustering, content, ideas):
+credits = tokens_used / tokens_per_credit
+cost_usd = credits * credit_price_usd # From BillingConfiguration
+
+# For image operations:
+credits = num_images * credits_per_image # From AIModelConfig
+cost_usd = credits * credit_price_usd
+```
+
+**Top Metrics Calculation:**
+The summary stats on the usage page are calculated client-side from loaded logs:
+```typescript
+const totalCredits = logs.reduce((sum, log) => sum + log.credits_used, 0);
+const totalCost = logs.reduce((sum, log) => sum + parseFloat(log.cost_usd || '0'), 0);
+```
+
+**Documentation to Add:**
+- Add tooltip/help text explaining cost calculation
+- Show formula in UI: "Cost = Credits Used × Credit Price ($0.XX per credit)"
+
+---
+
+## ISSUE 13: Sites Page - Add Site Button Not Working
+
+### 🔴 CRITICAL - Core Feature Broken
+
+**Problem:**
+Neither the top "Add New Website" button nor the empty state button works on the Sites page.
+
+**Investigation Results:**
+
+**File:** `frontend/src/pages/Sites/List.tsx`
+
+**Current Implementation:**
+```tsx
+// Line 71: State
+const [showWelcomeGuide, setShowWelcomeGuide] = useState(false);
+
+// Line 481: Button
+
+
+// Line 527-534: Conditional render
+{showWelcomeGuide && (
+