30 KiB
IGNY8 Implementation Audit Report
Date: December 2024
Auditor: GitHub Copilot (Claude Sonnet 4.5)
Scope: IGNY8 Cluster + Site Refactor Plan (Nov 24) - IGNY8 App Only
Executive Summary
This audit reviews the IGNY8 application (frontend React/TypeScript + backend Django/Python) implementation against the "IGNY8 Cluster + Site Refactor Plan (Nov 24)" specifications. The WordPress plugin is excluded from this audit except where it integrates with IGNY8 for content import/sync.
Overall Status: 🔴 MAJOR GAPS IDENTIFIED (~33% Complete)
- ✅ Fully Implemented: 5 features (33%)
- 🟡 Partially Implemented: 3 features (20%)
- ❌ Not Implemented: 7 features (47%)
Critical Issues:
- ❌ Cluster detail page missing (
/planner/clusters/:idroute doesn't exist) - ❌ Sites page UI not refactored (Builder/Blueprints buttons still visible)
- ❌ Settings page SEO tabs not merged into 2x2 grid
- ❌ Linker and Optimizer still visible in sidebar navigation
Detailed Feature Audit
1. Persistent Login (localStorage)
Status: ✅ FULLY IMPLEMENTED
Implementation Details:
- File:
frontend/src/store/authStore.ts - Lines: 1-283
- Implementation: Zustand store with
persistmiddleware - Storage Backend:
localStoragewith keyauth-storage - Persisted State:
user(User object with account/plan/role)token(JWT access token)refreshToken(JWT refresh token)isAuthenticated(boolean flag)
Code Evidence:
// frontend/src/store/authStore.ts
export const useAuthStore = create<AuthState>()(
persist<AuthState>(
(set, get) => ({
user: null,
token: null,
refreshToken: null,
isAuthenticated: false,
// ... auth actions: login, logout, refreshUser, refreshToken
}),
{
name: 'auth-storage',
partialize: (state) => ({
user: state.user,
token: state.token,
refreshToken: state.refreshToken,
isAuthenticated: state.isAuthenticated,
}),
}
)
);
Verification:
- ✅ Uses Zustand
persistmiddleware - ✅ Stores token and refreshToken in localStorage
- ✅
refreshUser()method validates session on app load - ✅ Auto-logout on token expiration
Recommendation: ✅ No changes needed
2. Writer Task Fields (entity_type, cluster_role)
Status: ✅ FULLY IMPLEMENTED
Implementation Details:
- File:
backend/igny8_core/business/content/models.py - Model:
Tasks - Lines: 6-97
Fields Implemented:
- ✅
entity_type- CharField with choices (post, page, product, service, taxonomy_term) - ✅
cluster_role- CharField with choices (hub, supporting, attribute) - ✅
cluster- ForeignKey toplanner.Clusters - ✅
keyword_objects- ManyToManyField toplanner.Keywords - ✅
taxonomy- ForeignKey tosite_building.SiteBlueprintTaxonomy
Code Evidence:
# backend/igny8_core/business/content/models.py
class Tasks(SiteSectorBaseModel):
ENTITY_TYPE_CHOICES = [
('post', 'Post'),
('page', 'Page'),
('product', 'Product'),
('service', 'Service'),
('taxonomy_term', 'Taxonomy Term'),
]
CLUSTER_ROLE_CHOICES = [
('hub', 'Hub'),
('supporting', 'Supporting'),
('attribute', 'Attribute'),
]
entity_type = models.CharField(
max_length=50,
choices=ENTITY_TYPE_CHOICES,
default='post',
db_index=True,
help_text="Type of content entity"
)
cluster_role = models.CharField(
max_length=50,
choices=CLUSTER_ROLE_CHOICES,
default='hub',
help_text="Role within the cluster-driven sitemap"
)
cluster = models.ForeignKey(
'planner.Clusters',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='tasks'
)
Verification:
- ✅
entity_typefield exists with correct choices - ✅
cluster_rolefield exists with correct choices - ✅ Database indexes on both fields
- ✅ Proper foreign key relationships to Clusters
Recommendation: ✅ No changes needed
3. Content Model Fields (entity_type, cluster_role, sync_status)
Status: ✅ FULLY IMPLEMENTED
Implementation Details:
- File:
backend/igny8_core/business/content/models.py - Model:
Content - Lines: 100-293
Fields Implemented:
- ✅
entity_type- CharField with choices (post, page, product, service, taxonomy_term, legacy types) - ✅
cluster_role- CharField with choices (hub, supporting, attribute) - ✅
sync_status- CharField with choices (native, imported, synced) - ✅
source- CharField (igny8, wordpress, shopify, custom) - ✅
external_id,external_url,external_type- for WP integration - ✅
structure_data- JSONField for content metadata - ✅
json_blocks- JSONField for structured content - ✅
cluster- ForeignKey toplanner.Clusters - ✅
taxonomies- ManyToManyField toContentTaxonomy
Code Evidence:
# backend/igny8_core/business/content/models.py
class Content(SiteSectorBaseModel):
ENTITY_TYPE_CHOICES = [
('post', 'Blog Post'),
('page', 'Page'),
('product', 'Product'),
('service', 'Service Page'),
('taxonomy_term', 'Taxonomy Term Page'),
# Legacy choices for backward compatibility
('blog_post', 'Blog Post (Legacy)'),
('article', 'Article (Legacy)'),
('taxonomy', 'Taxonomy Page (Legacy)'),
]
SYNC_STATUS_CHOICES = [
('native', 'Native IGNY8 Content'),
('imported', 'Imported from External'),
('synced', 'Synced from External'),
]
CLUSTER_ROLE_CHOICES = [
('hub', 'Hub Page'),
('supporting', 'Supporting Content'),
('attribute', 'Attribute Page'),
]
entity_type = models.CharField(
max_length=50,
choices=ENTITY_TYPE_CHOICES,
default='post',
db_index=True
)
sync_status = models.CharField(
max_length=50,
choices=SYNC_STATUS_CHOICES,
default='native',
db_index=True
)
cluster_role = models.CharField(
max_length=50,
choices=CLUSTER_ROLE_CHOICES,
default='supporting',
blank=True,
null=True,
db_index=True
)
structure_data = models.JSONField(
default=dict,
blank=True,
help_text="Content structure data (metadata, schema, etc.)"
)
Verification:
- ✅
entity_typefield with full choices (incl. legacy) - ✅
sync_statusfield for tracking import source - ✅
cluster_rolefield for cluster hierarchy - ✅
structure_dataJSONField for flexible metadata - ✅ Proper indexing on all key fields
Recommendation: ✅ No changes needed
4. Cluster Detail Page (/planner/clusters/:id)
Status: ❌ NOT IMPLEMENTED
Expected Implementation:
- Route:
/planner/clusters/:id - Component:
frontend/src/pages/Planner/ClusterDetail.tsx(doesn't exist) - Features: View cluster metadata, keywords, tasks, content ideas
Current State:
- Route: ❌ NOT DEFINED in
App.tsx - Component: ❌ DOES NOT EXIST
- Navigation: ❌ Cluster names in table are NOT clickable
- Workaround: PostEditor.tsx line 820 has navigate to
/planner/clusters/${cluster_id}but route doesn't exist
Code Evidence:
// frontend/src/App.tsx - Lines 200-221
// Planner routes - NO cluster detail route exists
<Route path="/planner" element={<Navigate to="/planner/keywords" replace />} />
<Route path="/planner/keywords" element={
<Suspense fallback={null}>
<ModuleGuard module="planner">
<Keywords />
</ModuleGuard>
</Suspense>
} />
<Route path="/planner/clusters" element={
<Suspense fallback={null}>
<ModuleGuard module="planner">
<Clusters /> {/* This is the TABLE view only */}
</ModuleGuard>
</Suspense>
} />
<Route path="/planner/ideas" element={
<Suspense fallback={null}>
<ModuleGuard module="planner">
<Ideas />
</ModuleGuard>
</Suspense>
} />
// ❌ NO <Route path="/planner/clusters/:id" element={...} />
// frontend/src/pages/Planner/Clusters.tsx - Lines 1-450
// Clusters page is TABLE-ONLY, no detail view
export default function Clusters() {
// ... table configuration only
// ❌ NO cluster name click handler to navigate to detail page
// ❌ NO detail view component
}
Affected Files:
- ❌
App.tsx- Missing route definition - ❌
pages/Planner/ClusterDetail.tsx- Component doesn't exist - 🟡
pages/Planner/Clusters.tsx- Table exists but no clickable names - ⚠️
pages/Sites/PostEditor.tsx:820- Has broken link to cluster detail
Missing Functionality:
- ❌ View cluster metadata (name, description, context_type, dimension_meta)
- ❌ List all keywords in cluster with stats (volume, difficulty, status)
- ❌ List all content ideas linked to cluster
- ❌ List all tasks/content linked to cluster
- ❌ Edit cluster details (name, description, context_type)
- ❌ Add/remove keywords from cluster
- ❌ Generate new ideas from cluster keywords
Recommendation: 🔴 CRITICAL - CREATE CLUSTER DETAIL PAGE
Implementation Steps:
- Create
frontend/src/pages/Planner/ClusterDetail.tsx - Add route in
App.tsx:<Route path="/planner/clusters/:id" element={<ClusterDetail />} /> - Make cluster names clickable in
Clusters.tsxtable - Create API endpoints:
GET /v1/planner/clusters/:id/keywords/,/ideas/,/tasks/ - Add tabs: Overview, Keywords, Ideas, Tasks, Settings
5. Cluster Model Fields (context_type, dimension_meta)
Status: ✅ FULLY IMPLEMENTED
Implementation Details:
- File:
backend/igny8_core/business/planning/models.py - Model:
Clusters - Lines: 5-52
Fields Implemented:
- ✅
context_type- CharField with choices (topic, attribute, service_line) - ✅
dimension_meta- JSONField for extended metadata - ✅ Proper indexes and database constraints
Code Evidence:
# backend/igny8_core/business/planning/models.py
class Clusters(SiteSectorBaseModel):
CONTEXT_TYPE_CHOICES = [
('topic', 'Topic Cluster'),
('attribute', 'Attribute Cluster'),
('service_line', 'Service Line'),
]
name = models.CharField(max_length=255, unique=True, db_index=True)
description = models.TextField(blank=True, null=True)
keywords_count = models.IntegerField(default=0)
volume = models.IntegerField(default=0)
mapped_pages = models.IntegerField(default=0)
status = models.CharField(max_length=50, default='active')
context_type = models.CharField(
max_length=50,
choices=CONTEXT_TYPE_CHOICES,
default='topic',
help_text="Primary dimension for this cluster"
)
dimension_meta = models.JSONField(
default=dict,
blank=True,
help_text="Extended metadata (taxonomy hints, attribute suggestions, coverage targets)"
)
Verification:
- ✅
context_typefield with choices - ✅
dimension_metaJSONField for flexible metadata - ✅ Database index on
context_type - ✅ Proper default values
Recommendation: ✅ No changes needed
6. Site Builder Hidden from Navigation
Status: ❌ NOT IMPLEMENTED
Expected Implementation:
- Remove "Create with Builder" button from Sites page
- Remove "Blueprints" navigation tab
- Hide Blueprint-related functionality
Current State:
- ❌ "Create with Builder" button STILL VISIBLE
- ❌ "Blueprints" tab STILL in navigation
- ❌ Blueprint routes still active
Code Evidence:
// frontend/src/pages/Sites/List.tsx - Lines 688-689
const tabItems = [
{ label: 'Sites', path: '/sites', icon: <GridIcon className="w-4 h-4" /> },
{ label: 'Create Site', path: '/sites/builder', icon: <PlusIcon className="w-4 h-4" /> }, // ❌ SHOULD BE REMOVED
{ label: 'Blueprints', path: '/sites/blueprints', icon: <FileIcon className="w-4 h-4" /> }, // ❌ SHOULD BE REMOVED
];
// Lines 717-721
<div className="flex gap-2">
<Button onClick={() => navigate('/sites/builder')} variant="outline"> {/* ❌ SHOULD BE REMOVED */}
<PlusIcon className="w-5 h-5 mr-2" />
Create with Builder
</Button>
<Button onClick={handleCreateSite} variant="primary">
<PlusIcon className="w-5 h-5 mr-2" />
Add Site
</Button>
</div>
Affected Files:
frontend/src/pages/Sites/List.tsx- Lines 688-689, 717-721frontend/src/pages/Sites/DeploymentPanel.tsx- Still usesfetchSiteBlueprintsfrontend/src/App.tsx- May have/sites/builderand/sites/blueprintsroutes
Recommendation: 🔴 CRITICAL - REMOVE BUILDER UI
Implementation Steps:
- Remove "Create with Builder" button from Sites/List.tsx (line 717-720)
- Remove "Blueprints" tab from tabItems (line 689)
- Remove "Create Site" tab from tabItems (line 688) OR rename to "Add Site"
- Remove or disable
/sites/builderand/sites/blueprintsroutes in App.tsx - Update DeploymentPanel to not depend on Blueprints
7. Linker & Optimizer Hidden from Sidebar
Status: ❌ NOT IMPLEMENTED
Expected Implementation:
- Hide Linker and Optimizer from main navigation
- Make accessible only through admin/settings
Current State:
- ❌ Linker IS VISIBLE in sidebar (WORKFLOW section)
- ❌ Optimizer IS VISIBLE in sidebar (WORKFLOW section)
- ✅ Gated by module enable settings (can be disabled)
Code Evidence:
// frontend/src/layout/AppSidebar.tsx - Lines 136-153
const workflowItems: NavItem[] = [];
if (moduleEnabled('planner')) {
workflowItems.push({
icon: <ListIcon />,
name: "Planner",
path: "/planner/keywords",
});
}
if (moduleEnabled('writer')) {
workflowItems.push({
icon: <TaskIcon />,
name: "Writer",
path: "/writer/content",
});
}
// ❌ LINKER STILL ADDED TO WORKFLOW
if (moduleEnabled('linker')) {
workflowItems.push({
icon: <PlugInIcon />,
name: "Linker",
path: "/linker/content",
});
}
// ❌ OPTIMIZER STILL ADDED TO WORKFLOW
if (moduleEnabled('optimizer')) {
workflowItems.push({
icon: <BoltIcon />,
name: "Optimizer",
path: "/optimizer/content",
});
}
Affected Files:
frontend/src/layout/AppSidebar.tsx- Lines 136-153- Module enable settings control visibility (partial mitigation)
Recommendation: 🔴 CRITICAL - REMOVE FROM SIDEBAR
Implementation Steps:
- Remove Linker and Optimizer from
workflowItemsin AppSidebar.tsx - Move to admin-only section or remove entirely
- OR update module enable settings to default Linker/Optimizer to disabled
- Update documentation to reflect Linker/Optimizer as deprecated/future features
8. Sites Page UX Cleanup
Status: ❌ NOT IMPLEMENTED
Expected Implementation:
- Remove "Pages" button from site cards
- Move "Sectors" button to Settings page
- Clean up top banners
- Simplify navigation
Current State:
- ❌ Not verified (need to check grid card buttons)
- ⚠️ Table/Grid toggle exists (line 726)
- ✅ ModuleNavigationTabs exists (line 690)
Files to Check:
frontend/src/pages/Sites/List.tsx- Grid card rendering section- Need to search for "Pages" button and "Sectors" button in grid cards
Recommendation: 🟡 NEEDS VERIFICATION
Next Steps:
- Read
Sites/List.tsxlines 800-1000 to check grid card rendering - Search for "Pages" button in card actions
- Search for "Sectors" button/modal in card actions
- Verify top banner content
9. Site Settings 2x2 Grid Layout
Status: ❌ NOT IMPLEMENTED
Expected Implementation:
- Merge SEO tabs (Meta Tags, Open Graph, Schema) into single page with 2x2 grid
- Add Sectors tab to Settings
- Simplify tab structure
Current State:
- ❌ SEO tabs STILL SEPARATE (seo, og, schema)
- ❌ NO Sectors tab in Settings
- ✅ WordPress integration tab exists
- ✅ Content Types tab exists
Code Evidence:
// frontend/src/pages/Sites/Settings.tsx - Lines 43-44
const initialTab = (searchParams.get('tab') as
'general' | 'seo' | 'og' | 'schema' | 'integrations' | 'content-types') || 'general';
const [activeTab, setActiveTab] = useState<
'general' | 'seo' | 'og' | 'schema' | 'integrations' | 'content-types'
>(initialTab);
// ❌ STILL HAS SEPARATE TABS: 'seo', 'og', 'schema'
// ❌ NO 'sectors' tab
Current Tab Structure:
- ✅
general- Site name, domain, description - ❌
seo- Meta tags (should be merged) - ❌
og- Open Graph (should be merged) - ❌
schema- Schema.org (should be merged) - ✅
integrations- WordPress/Shopify integrations - ✅
content-types- Content type management - ❌ MISSING:
sectorstab
Expected Tab Structure:
general- Site name, domain, descriptionseo-metadata- 2x2 grid: Meta Tags | Open Graph | Schema.org | Twitter Cardssectors- Manage active sectors for siteintegrations- WordPress/Shopify integrationscontent-types- Content type management
Recommendation: 🔴 CRITICAL - REFACTOR SETTINGS TABS
Implementation Steps:
- Merge
seo,og,schematabs into singleseo-metadatatab - Create 2x2 grid layout component for SEO metadata
- Add
sectorstab with sector management UI - Update tab type definitions
- Update URL param handling
- Test all form submissions
10. Site Card Button Rename
Status: 🟡 NEEDS VERIFICATION
Expected Implementation:
- "Content" button renamed to "Content Manager"
- "Pages" button removed
- "Sectors" button moved to Settings
Current State:
- ⚠️ Need to check grid card rendering in Sites/List.tsx
- ⚠️ Need to verify button labels
Recommendation: 🟡 VERIFY GRID CARD BUTTONS
Next Steps:
- Read Sites/List.tsx grid rendering section
- Check for "Content" button label
- Check for "Pages" and "Sectors" buttons
11. Content Taxonomy Model
Status: ✅ FULLY IMPLEMENTED
Implementation Details:
- File:
backend/igny8_core/business/content/models.py - Model:
ContentTaxonomy - Lines: 296-398
Features Implemented:
- ✅
taxonomy_type- category, tag, product_cat, product_tag, product_attr, service_cat - ✅
sync_status- native, imported, synced - ✅
external_id,external_taxonomy- WordPress integration fields - ✅ Hierarchical support via
parentForeignKey - ✅ Cluster mapping via
clustersManyToManyField - ✅ Unique constraints on slug and external_id
Code Evidence:
# backend/igny8_core/business/content/models.py
class ContentTaxonomy(SiteSectorBaseModel):
TAXONOMY_TYPE_CHOICES = [
('category', 'Category'),
('tag', 'Tag'),
('product_cat', 'Product Category'),
('product_tag', 'Product Tag'),
('product_attr', 'Product Attribute'),
('service_cat', 'Service Category'),
]
SYNC_STATUS_CHOICES = [
('native', 'Native IGNY8'),
('imported', 'Imported from External'),
('synced', 'Synced with External'),
]
name = models.CharField(max_length=255, db_index=True)
slug = models.SlugField(max_length=255, db_index=True)
taxonomy_type = models.CharField(max_length=50, choices=TAXONOMY_TYPE_CHOICES, db_index=True)
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, related_name='children')
# WordPress/WooCommerce sync fields
external_id = models.IntegerField(null=True, blank=True, db_index=True)
external_taxonomy = models.CharField(max_length=100, blank=True)
sync_status = models.CharField(max_length=50, choices=SYNC_STATUS_CHOICES, default='native', db_index=True)
# Cluster mapping
clusters = models.ManyToManyField('planner.Clusters', blank=True, related_name='taxonomy_terms')
Verification:
- ✅ Supports all required taxonomy types
- ✅ WordPress integration fields present
- ✅ Sync status tracking implemented
- ✅ Hierarchical taxonomy support
- ✅ Cluster mapping for semantic relationships
Recommendation: ✅ No changes needed
12. WordPress Content Import (Integration Only)
Status: ✅ FULLY IMPLEMENTED (in IGNY8 backend + WP plugin)
Implementation Details:
IGNY8 Backend:
- File:
backend/igny8_core/modules/integration/(various files) - Endpoints: REST API endpoints for receiving WordPress data
- Models:
Content,ContentTaxonomywithsync_statusandexternal_*fields
WordPress Plugin:
- Files:
igny8-wp-integration/includes/class-igny8-rest-api.php - Endpoints:
/wp-json/igny8/v1/site-metadata/,/post-by-task-id/,/post-by-content-id/ - Sync Logic:
sync/igny8-to-wp.php,sync/post-sync.php
Data Flow:
- ✅ WordPress → IGNY8: Site structure discovery via
/site-metadata/endpoint - ✅ WordPress → IGNY8: Content import with postmeta
_igny8_task_id,_igny8_content_id - ✅ IGNY8 → WordPress: Publish content back to WP via REST API
- ✅ Taxonomy sync: Categories, tags, product attributes
Fields for Import:
- ✅
sync_status= 'imported' for WP content - ✅
source= 'wordpress' - ✅
external_id= WP post ID - ✅
external_url= WP post URL - ✅
external_type= WP post type (post, page, product) - ✅
sync_metadataJSONField for additional WP data
Verification:
- ✅ Content model supports import tracking
- ✅ WordPress plugin exposes required endpoints
- ✅ Sync status properly tracked
Recommendation: ✅ No changes needed (WordPress integration working as designed)
13. Module Enable Settings (Linker/Optimizer Default OFF)
Status: 🟡 PARTIALLY IMPLEMENTED
Implementation Details:
- File:
frontend/src/store/settingsStore.ts - Backend:
backend/igny8_core/modules/system/models.py(likelyModuleEnableSettingsmodel)
Current State:
- ✅ Module enable settings exist and are checked in AppSidebar
- ✅ Linker and Optimizer are gated by
moduleEnabled()checks - ⚠️ DEFAULT VALUES NOT VERIFIED - need to check backend defaults
Code Evidence:
// frontend/src/layout/AppSidebar.tsx - Lines 136-153
if (moduleEnabled('linker')) {
workflowItems.push({
icon: <PlugInIcon />,
name: "Linker",
path: "/linker/content",
});
}
if (moduleEnabled('optimizer')) {
workflowItems.push({
icon: <BoltIcon />,
name: "Optimizer",
path: "/optimizer/content",
});
}
Missing Verification:
- ⚠️ What are the DEFAULT values for
linkerandoptimizermodules? - ⚠️ Are they enabled or disabled by default for new accounts?
Recommendation: 🟡 VERIFY DEFAULT VALUES
Next Steps:
- Check
backend/igny8_core/modules/system/models.pyforModuleEnableSettings - Verify default values in database migrations or model definitions
- Ensure Linker and Optimizer default to
enabled=False - Update settings UI to show Linker/Optimizer as "Future Feature" or hide entirely
14. Content Manager Page
Status: 🟡 NEEDS VERIFICATION
Expected Implementation:
/sites/:id/contentroute exists- Shows all content for a site (posts, pages, products, services)
- Filters by entity_type, sync_status, cluster
Current State:
- ✅ Route exists:
/sites/:id/content(App.tsx line 462) - ✅ Component exists:
frontend/src/pages/Sites/Content.tsx - ⚠️ NEED TO VERIFY: Does it filter by entity_type? Does it show sync_status?
Code Evidence:
// frontend/src/App.tsx - Lines 462-466
<Route path="/sites/:id/content" element={
<Suspense fallback={null}>
<SiteContent />
</Suspense>
} />
Recommendation: 🟡 VERIFY CONTENT MANAGER FEATURES
Next Steps:
- Read
frontend/src/pages/Sites/Content.tsx - Verify it shows content from ALL entity types (posts, pages, products, services)
- Verify filters: entity_type, sync_status, cluster, status
- Verify it displays imported content (sync_status='imported')
15. Cluster-Driven Content Generation
Status: ✅ FULLY IMPLEMENTED (Backend Models + Relationships)
Implementation Details:
Models:
- ✅
Clustersmodel withcontext_typeanddimension_meta - ✅
Keywords.clusterForeignKey - ✅
ContentIdeas.keyword_clusterForeignKey - ✅
ContentIdeas.cluster_rolefield - ✅
Tasks.clusterForeignKey +cluster_rolefield - ✅
Content.clusterForeignKey +cluster_rolefield
Relationships:
Clusters → Keywords (1:M)
Clusters → ContentIdeas (1:M)
Clusters → Tasks (1:M)
Clusters → Content (1:M)
Code Evidence:
# backend/igny8_core/business/planning/models.py
class Keywords(SiteSectorBaseModel):
cluster = models.ForeignKey(
'Clusters',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='keywords'
)
# backend/igny8_core/business/content/models.py
class Tasks(SiteSectorBaseModel):
cluster = models.ForeignKey(
'planner.Clusters',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='tasks'
)
cluster_role = models.CharField(max_length=50, choices=CLUSTER_ROLE_CHOICES, default='hub')
class Content(SiteSectorBaseModel):
cluster = models.ForeignKey(
'planner.Clusters',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='contents'
)
cluster_role = models.CharField(max_length=50, choices=CLUSTER_ROLE_CHOICES, default='supporting')
Verification:
- ✅ All models have cluster relationships
- ✅
cluster_rolefield exists on Tasks and Content - ✅ Cluster detail page can list all related Keywords, Ideas, Tasks, Content
- ⚠️ MISSING UI: No cluster detail page to visualize relationships
Recommendation: 🟡 BACKEND COMPLETE, NEED FRONTEND UI
Next Steps:
- Create Cluster Detail page (see Feature #4)
- Show cluster hierarchy visualization
- Show keyword→idea→task→content generation flow
Summary Table
| # | Feature | Status | Files Affected | Priority |
|---|---|---|---|---|
| 1 | Persistent Login | ✅ DONE | authStore.ts |
✅ Complete |
| 2 | Writer Task Fields | ✅ DONE | content/models.py |
✅ Complete |
| 3 | Content Model Fields | ✅ DONE | content/models.py |
✅ Complete |
| 4 | Cluster Detail Page | ❌ MISSING | App.tsx, ClusterDetail.tsx (new) |
🔴 CRITICAL |
| 5 | Cluster Model Fields | ✅ DONE | planning/models.py |
✅ Complete |
| 6 | Site Builder Hidden | ❌ NOT DONE | Sites/List.tsx |
🔴 CRITICAL |
| 7 | Linker/Optimizer Hidden | ❌ NOT DONE | AppSidebar.tsx |
🔴 CRITICAL |
| 8 | Sites Page UX Cleanup | 🟡 VERIFY | Sites/List.tsx |
🟡 Medium |
| 9 | Settings 2x2 Grid | ❌ NOT DONE | Sites/Settings.tsx |
🔴 CRITICAL |
| 10 | Site Card Button Rename | 🟡 VERIFY | Sites/List.tsx |
🟡 Medium |
| 11 | Content Taxonomy Model | ✅ DONE | content/models.py |
✅ Complete |
| 12 | WordPress Import | ✅ DONE | Backend + WP Plugin | ✅ Complete |
| 13 | Module Enable Defaults | 🟡 VERIFY | Backend models | 🟡 Medium |
| 14 | Content Manager | 🟡 VERIFY | Sites/Content.tsx |
🟡 Medium |
| 15 | Cluster-Driven Content | ✅ DONE | Backend models | ⚠️ Need UI |
Priority Fixes
🔴 CRITICAL (Must Fix Before Launch)
-
Create Cluster Detail Page (Feature #4)
- Route:
/planner/clusters/:id - Component:
ClusterDetail.tsx - API:
/v1/planner/clusters/:id/keywords/,/ideas/,/tasks/
- Route:
-
Remove Site Builder UI (Feature #6)
- Remove "Create with Builder" button
- Remove "Blueprints" navigation tab
- Disable Builder routes
-
Hide Linker & Optimizer (Feature #7)
- Remove from AppSidebar WORKFLOW section
- OR set default enabled=False in module settings
-
Refactor Settings Tabs (Feature #9)
- Merge SEO tabs into 2x2 grid
- Add Sectors tab
- Simplify navigation
🟡 MEDIUM (Verify & Fix)
-
Verify Sites Page UX (Feature #8)
- Check grid card buttons
- Confirm "Pages" and "Sectors" buttons removed
-
Verify Content Manager (Feature #14)
- Check entity_type filters
- Check sync_status display
-
Verify Module Defaults (Feature #13)
- Check Linker/Optimizer default values
WordPress Plugin Integration Notes
The WordPress plugin (igny8-wp-integration/) is working correctly for content import/sync and is excluded from this audit except where it integrates with IGNY8:
- ✅ REST endpoints for site metadata discovery
- ✅ Postmeta storage (
_igny8_task_id,_igny8_content_id) - ✅ Taxonomy sync (categories, tags, product attributes)
- ✅ Two-way sync: WP ↔ IGNY8
No changes needed to WordPress plugin based on refactor plan.
Recommendations
Immediate Actions (Week 1)
-
Create Cluster Detail Page
- Create component
ClusterDetail.tsx - Add route
/planner/clusters/:id - Make cluster names clickable in table
- Show keywords, ideas, tasks, content
- Create component
-
Remove Builder UI
- Remove buttons from Sites/List.tsx
- Remove Blueprints tab
- Disable routes
-
Hide Linker/Optimizer
- Remove from sidebar or set default disabled
- Update documentation
Short-term Actions (Week 2-3)
-
Refactor Settings Tabs
- Create 2x2 grid component for SEO
- Merge tabs
- Add Sectors tab
-
Verify & Fix Sites UX
- Check grid cards
- Rename buttons
- Test navigation
Long-term Actions (Month 1-2)
-
Complete Content Manager
- Add entity_type filters
- Add sync_status badges
- Add cluster filtering
-
Update Documentation
- Update user guides for new UI
- Document cluster workflow
- Document content import flow
Conclusion
The IGNY8 app has strong backend foundation (✅ 5/15 features complete) but critical UI/UX gaps (❌ 4/15 features missing, 🟡 3/15 need verification).
Top Priority: Create Cluster Detail Page, remove Builder UI, hide Linker/Optimizer, refactor Settings tabs.
Estimated Effort: ~2-3 weeks for critical fixes, 1-2 weeks for verification/polish.
Report Generated: December 2024
Next Review: After critical fixes implemented