Domain Expert Pattern Recognition
Chief Architect Strategic Guidance
Parallel Agent Strategic Deployment
Systematic Transformation with Quality Preservation
PM Verification Excellence
Before: Specialized Approach (Technical Debt Pattern)
# Each item type requires duplicate code and schema
class TodoList: # 300+ lines of list logic
class FeatureList: # 300+ lines (duplicate logic)
class BugList: # 300+ lines (duplicate logic)
class AttendeeList: # 300+ lines (duplicate logic)
# Result: N * 300 lines for N item types
After: Universal Composition (Extensibility Pattern)
# Single implementation supports unlimited item types
class List:
item_type: str # 'todo', 'feature', 'bug', 'attendee', 'anything'
# Usage patterns:
List(item_type='todo') # Replaces TodoList
List(item_type='feature') # Zero additional code
List(item_type='bug') # Zero additional code
List(item_type='attendee') # Zero additional code
List(item_type='meeting') # Zero additional code
# Result: Single implementation, unlimited types
Universal List Domain Model
@dataclass
class List:
"""Universal List model for ANY item type"""
id: str = field(default_factory=lambda: str(uuid4()))
name: str = ""
description: str = ""
item_type: str = "todo" # Discriminator field
list_type: str = "personal"
ordering_strategy: str = "manual"
# UI customization
color: Optional[str] = None
emoji: Optional[str] = None
# Status and metadata
is_archived: bool = False
is_default: bool = False
metadata: Dict[str, Any] = field(default_factory=dict)
tags: List[str] = field(default_factory=list)
# Ownership and sharing
owner_id: str = ""
shared_with: List[str] = field(default_factory=list)
Universal ListItem Relationship
@dataclass
class ListItem:
"""Universal ListItem relationship - polymorphic with item_type discriminator"""
id: str = field(default_factory=lambda: str(uuid4()))
list_id: str = ""
item_id: str = "" # Polymorphic reference
item_type: str = "todo" # Discriminator
position: int = 0
# Membership metadata
added_at: datetime = field(default_factory=datetime.now)
added_by: str = ""
# List-specific overrides
list_priority: Optional[str] = None
list_due_date: Optional[datetime] = None
list_notes: str = ""
Refactored Todo (Decoupled)
@dataclass
class Todo:
"""Standalone Todo domain object - no coupling to TodoList"""
id: str = field(default_factory=lambda: str(uuid4()))
title: str = ""
description: str = ""
priority: str = "medium" # Simple string, no enum coupling
status: str = "pending" # Simple string, no enum coupling
due_date: Optional[datetime] = None
tags: List[str] = field(default_factory=list)
assignee_id: Optional[str] = None
# PM-040 Knowledge Graph integration
metadata: Dict[str, Any] = field(default_factory=dict)
# Timestamps
created_at: datetime = field(default_factory=datetime.now)
updated_at: datetime = field(default_factory=datetime.now)
completed_at: Optional[datetime] = None
Universal Lists Table
CREATE TABLE lists (
id VARCHAR PRIMARY KEY,
name VARCHAR NOT NULL,
description TEXT,
item_type VARCHAR NOT NULL DEFAULT 'todo', -- Discriminator
list_type VARCHAR NOT NULL DEFAULT 'personal',
ordering_strategy VARCHAR NOT NULL DEFAULT 'manual',
-- UI customization
color VARCHAR(7),
emoji VARCHAR(4),
-- Status flags
is_archived BOOLEAN NOT NULL DEFAULT FALSE,
is_default BOOLEAN NOT NULL DEFAULT FALSE,
-- Metadata and tags
metadata JSON,
tags JSON,
-- Ownership
owner_id VARCHAR NOT NULL,
shared_with JSON,
-- Performance optimization
item_count INTEGER NOT NULL DEFAULT 0,
completed_count INTEGER NOT NULL DEFAULT 0,
-- Timestamps
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
Universal List Items Table
CREATE TABLE list_items (
id VARCHAR PRIMARY KEY,
list_id VARCHAR NOT NULL REFERENCES lists(id),
item_id VARCHAR NOT NULL, -- Polymorphic reference
item_type VARCHAR NOT NULL, -- Discriminator
position INTEGER NOT NULL DEFAULT 0,
-- Membership metadata
added_at TIMESTAMP NOT NULL,
added_by VARCHAR NOT NULL,
-- List-specific overrides
list_priority VARCHAR,
list_due_date TIMESTAMP,
list_notes TEXT,
-- Ensure unique membership per list-item pair
UNIQUE(list_id, item_id)
);
Performance-Optimized Indexes
-- Lists table indexes
CREATE INDEX idx_lists_owner_type ON lists(owner_id, item_type);
CREATE INDEX idx_lists_owner_list_type ON lists(owner_id, list_type);
CREATE INDEX idx_lists_default ON lists(owner_id, item_type, is_default);
-- List items table indexes
CREATE UNIQUE INDEX idx_unique_list_item ON list_items(list_id, item_id);
CREATE INDEX idx_list_item_position ON list_items(list_id, position);
CREATE INDEX idx_list_item_by_item ON list_items(item_id, item_type);
class UniversalListRepository(BaseRepository):
"""Repository for Universal List operations supporting ANY item type"""
async def get_lists_by_owner(
self,
owner_id: str,
item_type: Optional[str] = None, # Filter by item type
include_archived: bool = False,
list_type: Optional[str] = None
) -> List[domain.List]:
"""Get lists for an owner with polymorphic filtering"""
query = select(ListDB).where(ListDB.owner_id == owner_id)
if item_type: # Polymorphic filtering
query = query.where(ListDB.item_type == item_type)
if not include_archived:
query = query.where(ListDB.is_archived == False)
result = await self.session.execute(query)
return [db_list.to_domain() for db_list in result.scalars().all()]
class TodoListRepository:
"""Backward compatibility wrapper for TodoList operations"""
def __init__(self, session: AsyncSession):
self.universal_repo = UniversalListRepository(session)
async def get_lists_by_owner(self, owner_id: str) -> List[domain.TodoList]:
"""Get todo lists using universal pattern"""
# Automatically filter for item_type='todo'
universal_lists = await self.universal_repo.get_lists_by_owner(
owner_id=owner_id,
item_type="todo" # Automatic filtering
)
# Convert to TodoList for API compatibility
return [domain.TodoList(**lst.to_dict()) for lst in universal_lists]
-- Migrate specialized todo_lists to universal lists
INSERT INTO lists (
id, name, description, item_type, list_type, ordering_strategy,
color, emoji, is_archived, is_default, metadata, tags,
created_at, updated_at, owner_id, shared_with,
item_count, completed_count
)
SELECT
id, name, description, 'todo' AS item_type, -- Set discriminator
LOWER(list_type::text),
LOWER(ordering_strategy::text),
color, emoji, is_archived, is_default, metadata, tags,
created_at, updated_at, owner_id, shared_with,
todo_count, completed_count
FROM todo_lists;
-- Migrate specialized list_memberships to universal list_items
INSERT INTO list_items (
id, list_id, item_id, item_type, position,
added_at, added_by, list_priority, list_due_date, list_notes
)
SELECT
id, list_id, todo_id AS item_id, 'todo' AS item_type, -- Set discriminator
position, added_at, added_by,
CASE WHEN list_priority IS NOT NULL THEN LOWER(list_priority::text) END,
list_due_date, list_notes
FROM list_memberships;
# Day 1: Todo lists (existing functionality)
todo_lists = await repo.get_lists_by_owner(user_id, item_type="todo")
# Day 2: Feature lists (zero additional code)
feature_lists = await repo.get_lists_by_owner(user_id, item_type="feature")
# Day 3: Bug lists (zero additional code)
bug_lists = await repo.get_lists_by_owner(user_id, item_type="bug")
# Day N: Any item type (zero additional code)
meeting_lists = await repo.get_lists_by_owner(user_id, item_type="meeting")
# Identify specialized pattern candidates
find services/ -name "*list*" -type f
grep -r "class.*List" services/domain/ --include="*.py"
# Look for code duplication patterns
grep -r "class TodoList" -A 10 services/
grep -r "class FeatureList" -A 10 services/ # Would show duplication
# Design universal base class with discriminator
@dataclass
class UniversalContainer:
item_type: str # Discriminator field
# ... shared fields for all specializations
# Replace specialized classes with universal pattern
# Before: TodoList, FeatureList, BugList
# After: UniversalContainer(item_type='todo'|'feature'|'bug')
-- Add discriminator field to existing table
ALTER TABLE specialized_table ADD COLUMN item_type VARCHAR DEFAULT 'existing';
-- Or create new universal table and migrate data
CREATE TABLE universal_table (
-- Universal fields
item_type VARCHAR NOT NULL, -- Discriminator
-- ... other fields
);
# Create universal repository with polymorphic queries
class UniversalRepository:
async def get_items(self, item_type: Optional[str] = None):
query = select(Model)
if item_type:
query = query.where(Model.item_type == item_type)
return await self.execute(query)
# Create compatibility wrappers
class SpecializedRepository:
def __init__(self):
self.universal = UniversalRepository()
async def get_items(self):
return await self.universal.get_items(item_type="specialized")
# Test backward compatibility
async def test_backward_compatibility():
# Old API should work unchanged
todo_lists = await todo_repo.get_lists_by_owner(user_id)
assert len(todo_lists) > 0
# New API should provide same results
universal_lists = await universal_repo.get_lists_by_owner(
user_id, item_type="todo"
)
assert len(universal_lists) == len(todo_lists)
Created: August 5, 2025 - Systematic refactoring methodology for Universal List architecture