12 KiB
SiteBuilder Removal - Complete Migration Guide
Date: December 1, 2025
Status: Code changes completed, database migration pending
Summary
All SiteBuilder and Blueprint functionality has been removed from the IGNY8 system. The taxonomy system has been simplified to use the direct Content.taxonomy_terms many-to-many relationship with the ContentTaxonomy model.
What Was Removed
Backend Models (Django)
- ✅
SiteBlueprint- Site structure blueprints - ✅
PageBlueprint- Individual page definitions - ✅
SiteBlueprintCluster- Cluster to blueprint mappings - ✅
SiteBlueprintTaxonomy- Blueprint taxonomy definitions - ✅
BusinessType,AudienceProfile,BrandPersonality,HeroImageryDirection- SiteBuilder metadata options - ✅
ContentTaxonomyMap- Replaced byContent.taxonomy_termsM2M field
Backend Modules
- ✅ Removed entire
igny8_core.modules.site_buildermodule - ✅ Removed from
INSTALLED_APPSin settings.py - ✅ Removed
/api/v1/site-builder/URL patterns - ✅ Cleaned up
site_building/models.py,site_building/admin.py
Backend Services & Views
- ✅ Updated
PublisherService- removedpublish_to_sites()method - ✅ Updated
PublisherViewSet- removed blueprint publishing actions - ✅ Updated
DeploymentRecordViewSet- removed blueprint references - ✅ Updated
PublishingRecordmodel - removedsite_blueprintfield - ✅ Updated
DeploymentRecordmodel - removedsite_blueprintfield - ✅ Fixed
metadata_mapping_service.py- removed ContentTaxonomyMap - ✅ Fixed
candidate_engine.py- usesContent.taxonomy_termsnow - ✅ Fixed
sites_renderer_adapter.py- uses M2M taxonomy relationship - ✅ Fixed
planner/serializers.py- removed SiteBlueprintTaxonomy import
Frontend
- ✅ Removed
frontend/src/modules/siteBuilder/directory - ✅ Removed
frontend/src/types/siteBuilder.ts - ✅ Removed
frontend/src/services/siteBuilder.api.ts - ✅ Removed SiteBlueprint API functions from
services/api.ts - ✅ Removed SiteBuilder routes from navigation
Current Taxonomy System
Simplified Architecture
Before (Complex - SiteBuilder era):
Content → ContentTaxonomyMap → SiteBlueprintTaxonomy → Clusters
(through table) (blueprint planning)
After (Simplified - Current):
Content ←→ ContentTaxonomy (many-to-many direct relationship)
↓
Cluster (foreign key)
ContentTaxonomy Model
Location: backend/igny8_core/business/content/models.py
Fields:
name- Term name (e.g., "Outdoor Living Design")slug- URL-safe versiontaxonomy_type- Choices:category,tagexternal_id- WordPress term_id for syncexternal_taxonomy- WordPress taxonomy slug (category, post_tag)description- Term descriptionaccount,site,sector- Multi-tenancy fields
Relationship:
Content.taxonomy_terms- ManyToManyField to ContentTaxonomy- Categories/tags are AI-generated and linked directly to Content
How Content Taxonomy Works Now
Publishing Flow (IGNY8 → WordPress)
# In wordpress_publishing.py task
# STEP 4: Get categories from Content.taxonomy_terms
categories = [
term.name
for term in content.taxonomy_terms.filter(taxonomy_type='category')
]
# Fallback to cluster if no taxonomy_terms
if not categories and content.cluster:
categories.append(content.cluster.name)
# STEP 5: Get tags from taxonomy_terms + keywords
tags = [
term.name
for term in content.taxonomy_terms.filter(taxonomy_type='tag')
]
# Add keywords as tags
if content.primary_keyword not in tags:
tags.append(content.primary_keyword)
for keyword in content.secondary_keywords:
if keyword not in tags:
tags.append(keyword)
Data Flow
Keywords → Clusters → Ideas → Tasks → Content
├── taxonomy_terms (M2M)
│ ├── Categories
│ └── Tags
├── cluster (FK)
├── primary_keyword
└── secondary_keywords
↓
WordPress Publish
├── Categories (from taxonomy_terms + cluster)
└── Tags (from taxonomy_terms + keywords)
Django Admin
ContentTaxonomy is registered in backend/igny8_core/modules/writer/admin.py:
- View at:
/admin/writer/contenttaxonomy/ - Shows: name, taxonomy_type, slug, external_id, external_taxonomy, site, sector
- Searchable by: name, slug, external_taxonomy
- Filterable by: taxonomy_type, site, sector
Database Migration (PENDING)
Migration File: backend/igny8_core/business/site_building/migrations/0002_remove_blueprint_models.py
Status: Created but not applied (requires external PostgreSQL access)
Manual SQL Commands
Run these SQL commands directly on your production PostgreSQL database:
-- Drop foreign key constraints first
ALTER TABLE igny8_publishing_records
DROP CONSTRAINT IF EXISTS igny8_publishing_recor_site_blueprint_id_9f4e8c7a_fk_igny8_sit CASCADE;
ALTER TABLE igny8_deployment_records
DROP CONSTRAINT IF EXISTS igny8_deployment_recor_site_blueprint_id_3a2b7c1d_fk_igny8_sit CASCADE;
-- Drop blueprint tables
DROP TABLE IF EXISTS igny8_site_blueprint_taxonomies CASCADE;
DROP TABLE IF EXISTS igny8_site_blueprint_clusters CASCADE;
DROP TABLE IF EXISTS igny8_page_blueprints CASCADE;
DROP TABLE IF EXISTS igny8_site_blueprints CASCADE;
-- Drop SiteBuilder metadata tables
DROP TABLE IF EXISTS igny8_site_builder_business_types CASCADE;
DROP TABLE IF EXISTS igny8_site_builder_audience_profiles CASCADE;
DROP TABLE IF EXISTS igny8_site_builder_brand_personalities CASCADE;
DROP TABLE IF EXISTS igny8_site_builder_hero_imagery CASCADE;
-- Drop site_blueprint_id columns
ALTER TABLE igny8_publishing_records DROP COLUMN IF EXISTS site_blueprint_id CASCADE;
ALTER TABLE igny8_deployment_records DROP COLUMN IF EXISTS site_blueprint_id CASCADE;
-- Drop indexes
DROP INDEX IF EXISTS igny8_publishing_recor_site_blueprint_id_des_b7c4e5f8_idx;
-- Mark migration as applied
INSERT INTO django_migrations (app, name, applied)
VALUES ('site_building', '0002_remove_blueprint_models', NOW())
ON CONFLICT DO NOTHING;
Files Modified
Backend Python Files (24 files)
backend/igny8_core/business/site_building/models.py- All models removedbackend/igny8_core/business/site_building/admin.py- All admin classes removedbackend/igny8_core/business/publishing/models.py- Removed site_blueprint FKbackend/igny8_core/business/publishing/services/publisher_service.py- Removed publish_to_sitesbackend/igny8_core/business/publishing/services/adapters/sites_renderer_adapter.py- Updated taxonomy usagebackend/igny8_core/business/content/services/metadata_mapping_service.py- Removed ContentTaxonomyMapbackend/igny8_core/business/linking/services/candidate_engine.py- Updated to M2M taxonomybackend/igny8_core/business/optimization/services/analyzer.py- Updated taxonomy checkbackend/igny8_core/modules/publisher/views.py- Removed blueprint actionsbackend/igny8_core/modules/planner/serializers.py- Removed SiteBlueprintTaxonomybackend/igny8_core/tasks/wordpress_publishing.py- Uses Content.taxonomy_termsbackend/igny8_core/urls.py- Removed site-builder URLbackend/igny8_core/settings.py- Removed site_builder from INSTALLED_APPS
Frontend TypeScript Files (3 files)
frontend/src/services/api.ts- Removed SiteBlueprint API functions- Removed:
frontend/src/types/siteBuilder.ts - Removed:
frontend/src/services/siteBuilder.api.ts - Removed:
frontend/src/modules/siteBuilder/directory
Migrations
- Created:
backend/igny8_core/business/site_building/migrations/0002_remove_blueprint_models.py
Testing Checklist
Backend Health Check
# Check if backend starts successfully
docker compose -f docker-compose.app.yml logs igny8_backend | grep -i "error\|exception"
# Should show no import errors
Taxonomy Workflow Test
-
Check ContentTaxonomy in Admin
- Go to
/admin/writer/contenttaxonomy/ - Verify model is accessible
- Check existing taxonomy terms
- Go to
-
Test Content Creation
# In Django shell from igny8_core.business.content.models import Content, ContentTaxonomy content = Content.objects.first() print(f"Taxonomy terms: {content.taxonomy_terms.count()}") print(f"Cluster: {content.cluster.name if content.cluster else 'None'}") -
Test Publishing to WordPress
- Create/select content with taxonomy_terms
- Publish to WordPress from Review page
- Verify categories and tags appear in WordPress
- Check logs:
tail -f backend/logs/publish-sync-logs/publish-sync.log
Expected Log Output
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] STEP 4: Loading taxonomy terms...
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] Found 1 categories from taxonomy_terms
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] 📁 Category: 'Outdoor Living Design'
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] ✅ TOTAL categories: 1
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] STEP 5: Loading tags...
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] 🏷️ Primary keyword: 'outdoor patio design'
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] 🏷️ Secondary keywords: ['outdoor living spaces', 'outdoor kitchen design']
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] ✅ TOTAL tags: 3
Remaining Legacy References
These files contain SiteBlueprint references in migrations only (historical data, safe to ignore):
backend/igny8_core/business/content/migrations/0002_stage1_refactor_task_content_taxonomy.pybackend/igny8_core/modules/writer/migrations/0001_initial.pybackend/igny8_core/modules/planner/migrations/0002_initial.pybackend/igny8_core/tasks/wordpress_publishing_backup.py(backup file)backend/igny8_core/tasks/wordpress_publishing_new.py(backup file)
Benefits of Simplified System
Before (Complex)
- 5 models: SiteBlueprint, PageBlueprint, SiteBlueprintCluster, SiteBlueprintTaxonomy, ContentTaxonomyMap
- 3-level indirection: Content → ContentTaxonomyMap → SiteBlueprintTaxonomy
- Blueprint planning layer for site building
- Difficult to understand taxonomy relationships
After (Simple)
- 1 model: ContentTaxonomy
- Direct M2M: Content ↔ ContentTaxonomy
- AI-generated categories/tags linked directly
- Clear taxonomy-content relationship in Django Admin
Performance Improvements
- Fewer database queries (eliminated ContentTaxonomyMap joins)
- Simpler ORM queries:
content.taxonomy_terms.filter(taxonomy_type='category') - Easier debugging and maintenance
Next Steps
-
Apply Database Migration
- Run SQL commands on production PostgreSQL
- Mark migration as applied in django_migrations table
-
Test Publishing Workflow
- Publish content from Review page
- Verify categories/tags in WordPress
- Check sync logs for any errors
-
Monitor Logs
- Backend:
/data/app/igny8/backend/logs/publish-sync-logs/ - WordPress:
/wp-content/plugins/igny8-ai-os/logs/publish-sync-logs/
- Backend:
-
Update Documentation
- Update SYSTEM-ARCHITECTURE doc to reflect simplified taxonomy
- Remove SiteBuilder references from workflow docs
Rollback Plan (If Needed)
If issues arise, you can restore SiteBuilder functionality by:
-
Restore backup files:
cd /data/app/igny8/backend/igny8_core/modules mv site_builder.backup site_builder -
Uncomment in settings.py:
'igny8_core.modules.site_builder.apps.SiteBuilderConfig', -
Restore URL pattern in urls.py:
path('api/v1/site-builder/', include('igny8_core.modules.site_builder.urls')), -
Reverse database changes (restore from backup)
Contact & Support
If you encounter any issues during migration:
- Check logs in
backend/logs/and WordPress pluginlogs/ - Review Django admin for ContentTaxonomy model
- Test publishing workflow step by step
Migration completed by: GitHub Copilot
Date: December 1, 2025
Version: IGNY8 v1.0 - SiteBuilder Removal