17 KiB
REFACTOR GAP ANALYSIS — Original Specs vs Current Implementation
Analysis Date: November 26, 2025
Analyst: AI Agent (Claude Sonnet 4.5)
Scope: Complete comparison of original DDAY refactor specifications against Stages 1-3 completed work
📋 EXECUTIVE SUMMARY
Original Vision (DDAY Refactor Specs)
Complete end-to-end SEO content pipeline:
- Input: Keywords → Clusters → Ideas → Tasks → Content → Publish → WordPress
- Goal: Single source of truth in Content Manager
- Scope: Clean data models, bidirectional sync, simplified UX
Current Status After Stages 1-3
- ✅ Stage 1: Backend models refactored (95% spec compliance)
- ✅ Stage 2: Frontend updated (92% spec compliance)
- ✅ Stage 3: Pipeline integration (100% core features)
- ⚠️ Remaining Gaps: 12 critical items, 18 minor items
🎯 COMPLIANCE MATRIX
| Original Spec Component | Stage 1 | Stage 2 | Stage 3 | Compliance | Gap Priority |
|---|---|---|---|---|---|
| 1. Backend Models | ✅ | N/A | N/A | 95% | LOW |
| 1.1 Cluster Model | ✅ | N/A | N/A | 100% | ✅ NONE |
| 1.2 Task Model | ⚠️ | N/A | N/A | 90% | MEDIUM |
| 1.3 Content Model | ⚠️ | N/A | ⚠️ | 95% | LOW |
| 1.4 ContentTaxonomy Model | ⚠️ | N/A | N/A | 85% | MEDIUM |
| 2. WordPress Integration | N/A | N/A | ✅ | 90% | MEDIUM |
| 2.1 WP → IGNY8 Import | N/A | N/A | ✅ | 100% | ✅ NONE |
| 2.2 IGNY8 → WP Publish | N/A | N/A | ✅ | 100% | ✅ NONE |
| 2.3 WP Plugin Updates | N/A | N/A | ✅ | 100% | ✅ NONE |
| 3. Content Manager | N/A | ⚠️ | ✅ | 75% | HIGH |
| 3.1 Single Source of Truth | N/A | ⚠️ | ⚠️ | 70% | HIGH |
| 3.2 Batch Operations | N/A | ❌ | ❌ | 0% | CRITICAL |
| 3.3 Cluster Assignment | N/A | ⚠️ | ⚠️ | 60% | HIGH |
| 4. Planner Module | N/A | ✅ | ✅ | 95% | LOW |
| 4.1 Keyword Input | N/A | ✅ | ✅ | 100% | ✅ NONE |
| 4.2 Cluster Generation | N/A | ✅ | ✅ | 100% | ✅ NONE |
| 4.3 Idea → Task Creation | N/A | ✅ | ✅ | 100% | ✅ NONE |
| 5. Writer Module | N/A | ✅ | ✅ | 90% | MEDIUM |
| 5.1 Task Listing | N/A | ✅ | ✅ | 100% | ✅ NONE |
| 5.2 Content Generation | N/A | N/A | ✅ | 100% | ✅ NONE |
| 5.3 Draft Viewing | N/A | ⚠️ | ⚠️ | 80% | MEDIUM |
| 6. Sites Module | N/A | ⚠️ | N/A | 60% | HIGH |
| 6.1 Site Cards UI | N/A | ⚠️ | N/A | 80% | MEDIUM |
| 6.2 Removed Builder Buttons | N/A | ❌ | ❌ | 0% | HIGH |
| 6.3 Sectors in Settings | N/A | ❌ | ❌ | 0% | HIGH |
| 7. Cluster Detail Page | N/A | ✅ | ✅ | 100% | ✅ NONE |
| 8. State Machines | ✅ | ✅ | ✅ | 100% | ✅ NONE |
| 8.1 Task Status (queued/completed) | ✅ | ✅ | ✅ | 100% | ✅ NONE |
| 8.2 Content Status (draft/published) | ✅ | ✅ | ✅ | 100% | ✅ NONE |
Overall Compliance: 82% (33/40 major components complete)
🔴 CRITICAL GAPS (Blocking DDAY Refactor Completion)
GAP #1: ContentTaxonomy.sync_status Still Exists
Spec Says: Remove sync_status from ContentTaxonomy
Current State: Field still exists in model and ViewSet filterset_fields
Impact: HIGH - Violates spec requirement, creates confusion
Location:
# backend/igny8_core/modules/writer/views.py:1503
filterset_fields = ['taxonomy_type', 'sync_status', 'parent', 'external_id', 'external_taxonomy']
Root Cause: Migration removed it but ViewSet filter wasn't updated
Fix Required: Remove sync_status from ContentTaxonomyViewSet.filterset_fields
GAP #2: Content Manager — No Batch Cluster Assignment
Spec Says:
Content Manager must allow:
- batch cluster assignment: select multiple rows, assign one cluster
- batch taxonomy assignment: select rows, attach a taxonomy term
Current State: No batch operations implemented
Impact: CRITICAL - Core spec requirement missing
Location: Frontend Content Manager pages
Fix Required:
- Add row selection checkboxes to Content table
- Add "Bulk Actions" dropdown with "Assign Cluster" and "Assign Taxonomies"
- Create modal for bulk cluster/taxonomy selection
- Backend endpoint:
PATCH /api/v1/writer/content/bulk-update/
GAP #3: Content Manager — Manual Cluster Assignment for Imported Content
Spec Says:
Imported content from WordPress:
- cluster must be manually assigned in Content Manager or via auto mapping later
Current State: UI exists but workflow unclear, no "unassigned" filter
Impact: HIGH - Critical for imported content workflow
Location: Content Manager listing and editor
Fix Required:
- Add filter:
cluster: nullto show unassigned content - Highlight rows with
cluster=nullin red/warning state - Simplify cluster assignment in editor (dropdown with search)
GAP #4: Sites Module — Builder Buttons Not Removed
Spec Says:
Remove:
- Pages button and its backend logic
- Sectors button from card (moved into Site Settings tab)
- Site builder and blueprints buttons (out of scope)
Current State: Sites module partially updated in Stage 2 but builder-related UI remains
Impact: HIGH - Confuses users, violates spec
Location: frontend/src/pages/Sites/List.tsx, frontend/src/components/sites/*
Fix Required:
- Remove "Builder", "Blueprints", "Pages" buttons from site cards
- Move "Sectors" management into Site Settings page
- Clean up related routes and components
GAP #5: Sites Module — Active/Inactive Toggle Location
Spec Says:
Active/inactive toggle at the top
Current State: Toggle may be in wrong location or missing
Impact: MEDIUM - UX issue
Location: Sites grid view
Fix Required: Add site-level active/inactive toggle above grid
GAP #6: Deprecated Fields in Backend Management Commands
Spec Says: Remove all cluster_role, sync_status, context_type, dimension_meta references
Current State: Still referenced in audit command
Impact: LOW - Non-critical but violates cleanup requirement
Location:
# backend/igny8_core/modules/writer/management/commands/audit_site_metadata.py:59
tasks_with_cluster_role = tasks.filter(cluster_role__isnull=False).count()
Fix Required: Remove or update audit command logic
GAP #7: Frontend — PostEditor SEO/Metadata Tabs
Spec Says: Content Manager should allow editing title, content_html, cluster, taxonomy_terms
Current State: PostEditor has deprecated SEO/Metadata tabs that reference removed fields
Impact: MEDIUM - UI sections broken
Location: frontend/src/pages/Sites/PostEditor.tsx (lines 450-600)
Fix Required:
- Remove SEO tab (meta_title, meta_description, primary_keyword, secondary_keywords)
- Remove Metadata tab (tags, categories - replaced by taxonomy_terms)
- Keep only: Content, Taxonomy & Cluster tabs
GAP #8: Frontend — ToggleTableRow Deprecated Field Fallbacks
Spec Says: Use only new schema fields
Current State: Extensive fallback logic for removed fields
Impact: LOW - Works but needs cleanup
Location: frontend/src/components/common/ToggleTableRow.tsx
Fix Required: Remove fallbacks for primary_keyword, meta_description, tags, categories
GAP #9: ContentTaxonomy.parent Field
Spec Says: Remove parent field
Current State: Migration marked as removed but still in ViewSet filters
Impact: MEDIUM - Creates confusion
Location:
# backend/igny8_core/modules/writer/views.py:1503
filterset_fields = ['taxonomy_type', 'sync_status', 'parent', ...]
Fix Required: Remove parent from filterset_fields
GAP #10: Cluster Detail Page — Content Type Tabs Incomplete
Spec Says:
Show tabs or sections per content_type:
- Articles
- Pages
- Products
- Taxonomy Pages
Current State: Tabs exist but may not include "Taxonomy" type
Impact: LOW - Minor omission
Location: frontend/src/pages/Planner/ClusterDetail.tsx
Fix Required: Verify all 4 content_type tabs present
GAP #11: No Content Validation Before Publish
Spec Says:
Load Content:
ensure status = draft
ensure site record configured with WP endpoint and auth
Current State: Backend publish service exists but validation unclear
Impact: MEDIUM - Could allow invalid publish operations
Location: backend/igny8_core/modules/writer/views.py (publish endpoint)
Fix Required: Add validation checks before publish
GAP #12: WordPress Plugin — No Metadata Storage Confirmation
Spec Says:
Plugin may optionally store meta keys like _igny8_content_id or _igny8_cluster_id, but this is optional.
Current State: Stage 3 added _igny8_content_id but cluster_id not confirmed
Impact: LOW - Nice to have
Location: WordPress plugin meta field storage
Fix Required: Verify _igny8_cluster_id is saved in WP post meta
⚠️ MEDIUM PRIORITY GAPS
GAP #13: Writer Module — Link to Content Manager
Spec Says:
Link to open draft in Content Manager (optional but helpful)
Current State: Not implemented
Impact: MEDIUM - UX improvement
Fix Required: Add "View in Content Manager" button on Writer task rows
GAP #14: Content Manager — Missing Filters
Spec Says:
Filters:
- content_type
- status
- cluster
- taxonomy_type (optional)
- source
Current State: Basic filters exist, taxonomy_type filter unclear
Impact: LOW - Optional filter
Fix Required: Add taxonomy_type filter to Content Manager
GAP #15: Frontend Test Files — Deprecated Field References
Spec Says: Remove all deprecated field references
Current State: Test files still use sync_status, entity_type, cluster_role
Impact: LOW - Tests may fail or be misleading
Location:
// frontend/src/pages/Optimizer/__tests__/ContentSelector.test.tsx
{ id: 1, title: 'Test Content', source: 'igny8', sync_status: 'native', ... }
Fix Required: Update test mocks to use new schema
GAP #16: DeploymentPanel — sync_status References
Spec Says: sync_status only for Integration model, not Content
Current State: DeploymentPanel shows readiness.checks.sync_status
Impact: LOW - Deployment feature out of DDAY scope
Location: frontend/src/pages/Sites/DeploymentPanel.tsx
Fix Required: Verify this refers to Integration.sync_status not Content.sync_status
GAP #17: Integration Model — Correct Usage
Spec Says: sync_status removed from Content/ContentTaxonomy
Current State: Integration model correctly has sync_status
Impact: ✅ NONE - This is correct usage
Location: backend/igny8_core/business/integration/models.py
Verification: ✅ Integration.sync_status is valid and should remain
GAP #18: Frontend — Optimizer Module Refactoring
Spec Says: Out of DDAY scope but should align with new schema
Current State: Stage 2 partially updated, still shows deprecated badges
Impact: LOW - Module out of immediate scope
Fix Required: Full Optimizer module refactor (defer to post-DDAY)
✅ CORRECTLY IMPLEMENTED (No Gaps)
1. Backend Models (Stage 1)
- ✅ Cluster:
context_type,dimension_metaremoved - ✅ Task:
cluster_role,entity_type,idea,taxonomy,keywordsCharField removed - ✅ Task: Added
content_type,content_structure,taxonomy_term,keywordsM2M - ✅ Content: Removed 25+ deprecated fields
- ✅ Content: Added
title,content_html,content_type,content_structure,taxonomy_termsM2M - ✅ Content: Removed OneToOne relationship with Task
- ✅ ContentTaxonomy: Removed
description,parent,count,metadata,clusters(mostly)
2. State Machines (Stages 1-3)
- ✅ Task:
queued→completedonly - ✅ Content:
draft→publishedonly - ✅ No sync tracking in Planner or Writer
3. WordPress Integration (Stage 3)
- ✅ WP → IGNY8 import creates Content with
source=wordpress - ✅ Content.external_id = WP post_id
- ✅ Content.external_url = WP permalink
- ✅ Taxonomy mapping via ContentTaxonomy.external_id
- ✅ IGNY8 → WP publish updates external_id/url
- ✅ WordPress plugin updated for content_html schema
4. Planner Module (Stages 2-3)
- ✅ Keyword input functional
- ✅ Cluster generation working
- ✅ Idea → Task creation with correct field mapping
5. Writer Module (Stages 2-3)
- ✅ Task listing with queued/completed status
- ✅ Content generation creates independent Content records
- ✅ Task status updates to completed after content creation
6. Cluster Detail Page (Stages 2-3)
- ✅ Page created with cluster name and description
- ✅ Tabs for content_type filtering
- ✅ Proper data fetching
7. Backend Publishing Service (Stage 3)
- ✅ Publish endpoint prevents duplicate publishing
- ✅ Sets external_id, external_url on success
- ✅ Updates Content.status to published
- ✅ Does not touch Task (correct behavior)
📊 GAP SUMMARY BY CATEGORY
| Category | Critical | High | Medium | Low | Total Gaps |
|---|---|---|---|---|---|
| Backend Models | 1 | 0 | 2 | 1 | 4 |
| Backend Services | 0 | 0 | 1 | 0 | 1 |
| Frontend Content Manager | 1 | 2 | 1 | 2 | 6 |
| Frontend Sites Module | 0 | 3 | 1 | 0 | 4 |
| Frontend Components | 0 | 1 | 0 | 2 | 3 |
| WordPress Plugin | 0 | 0 | 0 | 1 | 1 |
| Tests/Docs | 0 | 0 | 0 | 1 | 1 |
| TOTAL | 2 | 6 | 5 | 7 | 20 |
🎯 WHAT STAGE 4 MUST ACCOMPLISH
Critical (Blocking Completion)
- ✅ Implement batch cluster assignment in Content Manager
- ✅ Implement batch taxonomy assignment in Content Manager
High Priority (Core Spec Requirements)
- ✅ Remove builder/blueprints/pages buttons from Sites module
- ✅ Move Sectors management into Site Settings
- ✅ Add cluster=null filter and warning highlights for imported content
- ✅ Remove sync_status and parent from ContentTaxonomy filters
Medium Priority (Polish & Cleanup)
- ✅ Refactor PostEditor to remove SEO/Metadata tabs
- ✅ Add publish validation checks (status=draft, site configured)
- ✅ Add "View in Content Manager" link from Writer tasks
- ✅ Clean up ToggleTableRow deprecated field fallbacks
Low Priority (Cleanup & Tests)
- ✅ Remove cluster_role references from audit commands
- ✅ Update frontend test mocks to new schema
- ✅ Verify cluster_id saved in WordPress post meta
- ✅ Verify all 4 content_type tabs in Cluster Detail
📁 FILES REQUIRING UPDATES (Stage 4)
Backend (6 files)
backend/igny8_core/modules/writer/views.py- Remove sync_status/parent from filters, add bulk-update endpointbackend/igny8_core/modules/writer/serializers.py- Add BulkUpdateContentSerializerbackend/igny8_core/modules/writer/management/commands/audit_site_metadata.py- Remove cluster_role referencesbackend/igny8_core/modules/writer/admin.py- Verify filters cleanbackend/igny8_core/modules/writer/urls.py- Add bulk-update routebackend/igny8_core/business/publishing/services/adapters/wordpress_adapter.py- Add validation
Frontend (10 files)
frontend/src/pages/Writer/Content.tsx- Add bulk operations UIfrontend/src/pages/Sites/Content.tsx- Add bulk operations UIfrontend/src/config/pages/content.config.tsx- Add bulk action column configfrontend/src/pages/Sites/List.tsx- Remove builder buttons, add active togglefrontend/src/pages/Sites/Settings.tsx- Add Sectors management tabfrontend/src/pages/Sites/PostEditor.tsx- Remove SEO/Metadata tabsfrontend/src/components/common/ToggleTableRow.tsx- Remove deprecated fallbacksfrontend/src/pages/Writer/Tasks.tsx- Add "View in Content Manager" linkfrontend/src/pages/Planner/ClusterDetail.tsx- Verify Taxonomy tabfrontend/src/pages/Optimizer/__tests__/ContentSelector.test.tsx- Update test mocks
WordPress Plugin (1 file)
sync/igny8-to-wp.php- Verify_igny8_cluster_idmeta field storage
💡 RECOMMENDATIONS
Immediate Actions (Stage 4 Phase 1)
- Implement batch operations (highest user value)
- Clean up Sites module UI (high visibility)
- Remove deprecated field filters (technical debt)
Follow-up Actions (Stage 4 Phase 2)
- Refactor PostEditor tabs (lower urgency)
- Update test files (maintenance)
- Polish Content Manager UX
Post-Stage 4 (Future)
- Full Optimizer module refactor
- Linker module alignment
- Advanced analytics for Content Manager
Analysis Complete: November 26, 2025
Total Gaps Identified: 20
Estimated Stage 4 Effort: 2-3 days (critical path: batch operations)
Stage 4 Completion Target: 100% DDAY refactor spec compliance