Files
Atomizer/docs/plans/UNIFIED_CONFIG_EXECUTION_PLAN.md

496 lines
20 KiB
Markdown
Raw Normal View History

# Unified Configuration Architecture - Execution Plan
**Project**: AtomizerSpec v2.0 Implementation
**Reference Document**: `docs/plans/UNIFIED_CONFIGURATION_ARCHITECTURE.md`
**Schema Definition**: `optimization_engine/schemas/atomizer_spec_v2.json`
**Status**: Ready for Implementation
---
## Project Overview
Transform Atomizer's fragmented configuration system into a unified architecture where:
- One JSON schema (AtomizerSpec v2.0) is the single source of truth
- Canvas, Backend, Claude, and Optimization Engine all use the same spec
- Real-time WebSocket sync keeps all clients updated
- Claude can dynamically modify specs and add custom functions
---
## Phase Structure
| Phase | Name | Duration | Focus |
|-------|------|----------|-------|
| 1 | Foundation | Week 1-3 | Backend SpecManager, REST API, Migration |
| 2 | Frontend | Week 4-6 | SpecRenderer, WebSocket Sync, Store |
| 3 | Claude Integration | Week 7-9 | MCP Tools, Custom Functions |
| 4 | Polish & Testing | Week 10-12 | Migration, Testing, Documentation |
---
## Implementation Order (Critical Path)
```
1. Schema & Types (P1.1-P1.3)
└── 2. SpecManager Service (P1.4-P1.7)
└── 3. REST Endpoints (P1.8-P1.12)
├── 4. Migration Script (P1.13-P1.16)
└── 5. Frontend Store (P2.1-P2.4)
└── 6. SpecRenderer (P2.5-P2.10)
└── 7. WebSocket Sync (P2.11-P2.15)
└── 8. MCP Tools (P3.1-P3.8)
└── 9. Custom Functions (P3.9-P3.14)
└── 10. Testing & Polish (P4.1-P4.12)
```
---
## PHASE 1: Foundation (Backend)
### P1.1 - Create TypeScript types from JSON Schema
- **File**: `atomizer-dashboard/frontend/src/types/atomizer-spec.ts`
- **Action**: Generate TypeScript interfaces matching `atomizer_spec_v2.json`
- **Reference**: Schema at `optimization_engine/schemas/atomizer_spec_v2.json`
- **Acceptance**: Types compile, cover all schema definitions
### P1.2 - Create Python Pydantic models from JSON Schema
- **File**: `optimization_engine/config/spec_models.py`
- **Action**: Create Pydantic models for AtomizerSpec validation
- **Reference**: Schema at `optimization_engine/schemas/atomizer_spec_v2.json`
- **Acceptance**: Models validate example specs correctly
### P1.3 - Create spec validation utility
- **File**: `optimization_engine/config/spec_validator.py`
- **Action**: JSON Schema validation + semantic validation (bounds, references)
- **Dependencies**: P1.2
- **Acceptance**: Validates good specs, rejects invalid with clear errors
### P1.4 - Create SpecManager core class
- **File**: `atomizer-dashboard/backend/api/services/spec_manager.py`
- **Action**: Implement `load()`, `save()`, `_validate()`, `_compute_hash()`
- **Reference**: Design in UNIFIED_CONFIGURATION_ARCHITECTURE.md Section 5.1
- **Dependencies**: P1.3
- **Acceptance**: Can load/save/validate atomizer_spec.json files
### P1.5 - Add SpecManager patch functionality
- **File**: `atomizer-dashboard/backend/api/services/spec_manager.py`
- **Action**: Implement `patch()` method for JSONPath-style updates
- **Dependencies**: P1.4
- **Acceptance**: Can update nested fields with conflict detection
### P1.6 - Add SpecManager node operations
- **File**: `atomizer-dashboard/backend/api/services/spec_manager.py`
- **Action**: Implement `add_node()`, `remove_node()`, `_generate_id()`, `_auto_position()`
- **Dependencies**: P1.5
- **Acceptance**: Can add/remove design vars, extractors, objectives, constraints
### P1.7 - Add SpecManager custom function support
- **File**: `atomizer-dashboard/backend/api/services/spec_manager.py`
- **Action**: Implement `add_custom_function()` with Python syntax validation
- **Dependencies**: P1.6
- **Acceptance**: Can add custom extractors with validated Python code
### P1.8 - Create spec REST router
- **File**: `atomizer-dashboard/backend/api/routes/spec.py`
- **Action**: Create FastAPI router for spec endpoints
- **Dependencies**: P1.7
- **Acceptance**: Router imports and mounts correctly
### P1.9 - Implement GET /studies/{study_id}/spec
- **File**: `atomizer-dashboard/backend/api/routes/spec.py`
- **Action**: Return full AtomizerSpec for a study
- **Dependencies**: P1.8
- **Acceptance**: Returns valid spec JSON, 404 for missing studies
### P1.10 - Implement PUT /studies/{study_id}/spec
- **File**: `atomizer-dashboard/backend/api/routes/spec.py`
- **Action**: Replace entire spec with validation
- **Dependencies**: P1.9
- **Acceptance**: Validates, saves, returns new hash
### P1.11 - Implement PATCH /studies/{study_id}/spec
- **File**: `atomizer-dashboard/backend/api/routes/spec.py`
- **Action**: Partial update with JSONPath
- **Dependencies**: P1.10
- **Acceptance**: Updates specific fields, broadcasts change
### P1.12 - Implement POST /studies/{study_id}/spec/validate
- **File**: `atomizer-dashboard/backend/api/routes/spec.py`
- **Action**: Validate spec and return detailed report
- **Dependencies**: P1.11
- **Acceptance**: Returns errors, warnings, summary
### P1.13 - Create config migration base
- **File**: `optimization_engine/config/migrator.py`
- **Action**: Create SpecMigrator class with field mapping
- **Reference**: Design in UNIFIED_CONFIGURATION_ARCHITECTURE.md Section 8
- **Acceptance**: Class structure ready for migration logic
### P1.14 - Implement design variable migration
- **File**: `optimization_engine/config/migrator.py`
- **Action**: Migrate `bounds[]``bounds.min/max`, `parameter``expression_name`
- **Dependencies**: P1.13
- **Acceptance**: All DV formats convert correctly
### P1.15 - Implement objective/constraint migration
- **File**: `optimization_engine/config/migrator.py`
- **Action**: Migrate `goal``direction`, extraction configs to new format
- **Dependencies**: P1.14
- **Acceptance**: Objectives and constraints convert correctly
### P1.16 - Implement full config migration
- **File**: `optimization_engine/config/migrator.py`
- **Action**: Complete migration including canvas positions, extractors inference
- **Dependencies**: P1.15
- **Acceptance**: Can migrate any existing optimization_config.json to AtomizerSpec
### P1.17 - Create migration CLI tool
- **File**: `tools/migrate_to_spec_v2.py`
- **Action**: CLI for batch migration with dry-run support
- **Dependencies**: P1.16
- **Acceptance**: `python tools/migrate_to_spec_v2.py --dry-run studies/*`
---
## PHASE 2: Frontend Integration
### P2.1 - Create useSpecStore hook
- **File**: `atomizer-dashboard/frontend/src/hooks/useSpecStore.ts`
- **Action**: Zustand store for AtomizerSpec state management
- **Dependencies**: P1.1
- **Acceptance**: Store holds spec, provides typed accessors
### P2.2 - Add spec loading to useSpecStore
- **File**: `atomizer-dashboard/frontend/src/hooks/useSpecStore.ts`
- **Action**: Implement `loadSpec(studyId)` fetching from API
- **Dependencies**: P2.1, P1.9
- **Acceptance**: Loads spec from backend, updates store
### P2.3 - Add spec modification to useSpecStore
- **File**: `atomizer-dashboard/frontend/src/hooks/useSpecStore.ts`
- **Action**: Implement `patchSpec()`, `addNode()`, `removeNode()` calling API
- **Dependencies**: P2.2, P1.11
- **Acceptance**: Modifications persist to backend
### P2.4 - Add optimistic updates to useSpecStore
- **File**: `atomizer-dashboard/frontend/src/hooks/useSpecStore.ts`
- **Action**: Update local state immediately, rollback on error
- **Dependencies**: P2.3
- **Acceptance**: UI feels instant, handles errors gracefully
### P2.5 - Create specToNodes converter
- **File**: `atomizer-dashboard/frontend/src/lib/spec/converter.ts`
- **Action**: Convert AtomizerSpec to ReactFlow nodes array
- **Reference**: Design in UNIFIED_CONFIGURATION_ARCHITECTURE.md Section 5.2
- **Dependencies**: P1.1
- **Acceptance**: All node types render correctly
### P2.6 - Create specToEdges converter
- **File**: `atomizer-dashboard/frontend/src/lib/spec/converter.ts`
- **Action**: Convert spec.canvas.edges to ReactFlow edges
- **Dependencies**: P2.5
- **Acceptance**: All connections render correctly
### P2.7 - Create SpecRenderer component
- **File**: `atomizer-dashboard/frontend/src/components/canvas/SpecRenderer.tsx`
- **Action**: ReactFlow component that renders from useSpecStore
- **Dependencies**: P2.5, P2.6, P2.4
- **Acceptance**: Canvas displays spec correctly
### P2.8 - Wire node editing to spec updates
- **File**: `atomizer-dashboard/frontend/src/components/canvas/SpecRenderer.tsx`
- **Action**: Node data changes call useSpecStore.patchSpec()
- **Dependencies**: P2.7
- **Acceptance**: Editing node properties persists to spec
### P2.9 - Wire node position to spec updates
- **File**: `atomizer-dashboard/frontend/src/components/canvas/SpecRenderer.tsx`
- **Action**: Drag-drop updates canvas_position in spec
- **Dependencies**: P2.8
- **Acceptance**: Layout persists across reloads
### P2.10 - Update node panels for full spec fields
- **Files**: `atomizer-dashboard/frontend/src/components/canvas/panels/*.tsx`
- **Action**: Update all node config panels to show/edit full spec fields
- **Dependencies**: P2.8
- **Acceptance**: All spec fields are editable in UI
### P2.11 - Create WebSocket connection hook
- **File**: `atomizer-dashboard/frontend/src/hooks/useSpecSync.ts`
- **Action**: WebSocket connection to `/api/studies/{id}/sync`
- **Dependencies**: P2.4
- **Acceptance**: Connects, handles reconnection
### P2.12 - Create WebSocket backend endpoint
- **File**: `atomizer-dashboard/backend/api/routes/spec.py`
- **Action**: WebSocket endpoint for spec sync
- **Dependencies**: P1.12
- **Acceptance**: Accepts connections, tracks subscribers
### P2.13 - Implement spec_updated broadcast
- **File**: `atomizer-dashboard/backend/api/services/spec_manager.py`
- **Action**: SpecManager broadcasts to all subscribers on save
- **Dependencies**: P2.12
- **Acceptance**: All connected clients receive updates
### P2.14 - Handle spec_updated in frontend
- **File**: `atomizer-dashboard/frontend/src/hooks/useSpecSync.ts`
- **Action**: On spec_updated message, refresh spec from store
- **Dependencies**: P2.11, P2.13
- **Acceptance**: Changes from other clients appear in real-time
### P2.15 - Add conflict detection
- **File**: `atomizer-dashboard/frontend/src/hooks/useSpecStore.ts`
- **Action**: Compare hashes, warn on conflict, offer merge/overwrite
- **Dependencies**: P2.14
- **Acceptance**: Concurrent edits don't silently overwrite
### P2.16 - Replace CanvasView with SpecRenderer
- **File**: `atomizer-dashboard/frontend/src/pages/CanvasView.tsx`
- **Action**: Switch from useCanvasStore to useSpecStore + SpecRenderer
- **Dependencies**: P2.10, P2.15
- **Acceptance**: Canvas page uses new spec-based system
---
## PHASE 3: Claude Integration
### P3.1 - Create spec_get MCP tool
- **File**: `mcp-server/atomizer-tools/src/tools/spec_tools.ts`
- **Action**: Tool to retrieve full AtomizerSpec
- **Reference**: Design in UNIFIED_CONFIGURATION_ARCHITECTURE.md Section 5.3
- **Dependencies**: P1.9
- **Acceptance**: Claude can read spec via MCP
### P3.2 - Create spec_modify MCP tool
- **File**: `mcp-server/atomizer-tools/src/tools/spec_tools.ts`
- **Action**: Tool to apply modifications (set, add, remove operations)
- **Dependencies**: P3.1, P1.11
- **Acceptance**: Claude can modify spec fields
### P3.3 - Create spec_add_node MCP tool
- **File**: `mcp-server/atomizer-tools/src/tools/spec_tools.ts`
- **Action**: Tool to add design vars, extractors, objectives, constraints
- **Dependencies**: P3.2
- **Acceptance**: Claude can add nodes to canvas
### P3.4 - Create spec_remove_node MCP tool
- **File**: `mcp-server/atomizer-tools/src/tools/spec_tools.ts`
- **Action**: Tool to remove nodes (with edge cleanup)
- **Dependencies**: P3.3
- **Acceptance**: Claude can remove nodes
### P3.5 - Create spec_validate MCP tool
- **File**: `mcp-server/atomizer-tools/src/tools/spec_tools.ts`
- **Action**: Tool to validate spec and return report
- **Dependencies**: P1.12
- **Acceptance**: Claude can check spec validity
### P3.6 - Create spec_add_custom_extractor MCP tool
- **File**: `mcp-server/atomizer-tools/src/tools/spec_tools.ts`
- **Action**: Tool to add custom Python functions as extractors
- **Dependencies**: P1.7, P3.3
- **Acceptance**: Claude can add custom extraction logic
### P3.7 - Register spec tools in MCP server
- **File**: `mcp-server/atomizer-tools/src/index.ts`
- **Action**: Import and register all spec_* tools
- **Dependencies**: P3.1-P3.6
- **Acceptance**: Tools appear in MCP tool list
### P3.8 - Update ContextBuilder for spec awareness
- **File**: `atomizer-dashboard/backend/api/services/context_builder.py`
- **Action**: Include spec summary in Claude context, mention spec tools
- **Dependencies**: P3.7
- **Acceptance**: Claude knows about spec tools in context
### P3.9 - Create custom extractor runtime loader
- **File**: `optimization_engine/extractors/custom_loader.py`
- **Action**: Dynamically load and execute custom functions from spec
- **Dependencies**: P1.7
- **Acceptance**: Custom functions execute during optimization
### P3.10 - Integrate custom extractors into optimization runner
- **File**: `optimization_engine/core/runner.py`
- **Action**: Check spec for custom extractors, load and use them
- **Dependencies**: P3.9
- **Acceptance**: Optimization uses custom extractors defined in spec
### P3.11 - Add custom extractor node type to canvas
- **File**: `atomizer-dashboard/frontend/src/components/canvas/nodes/CustomExtractorNode.tsx`
- **Action**: New node type showing custom function with code preview
- **Dependencies**: P2.10
- **Acceptance**: Custom extractors display distinctly in canvas
### P3.12 - Add code editor for custom extractors
- **File**: `atomizer-dashboard/frontend/src/components/canvas/panels/CustomExtractorPanel.tsx`
- **Action**: Monaco editor for viewing/editing custom Python code
- **Dependencies**: P3.11
- **Acceptance**: Users can view and edit custom function code
### P3.13 - Create spec_create_from_description MCP tool
- **File**: `mcp-server/atomizer-tools/src/tools/spec_tools.ts`
- **Action**: Tool to create new spec from natural language + model path
- **Dependencies**: P3.6, P1.16
- **Acceptance**: Claude can create studies from descriptions
### P3.14 - Update Claude prompts for spec workflow
- **File**: `atomizer-dashboard/backend/api/services/context_builder.py`
- **Action**: Update system prompts to guide Claude on using spec tools
- **Dependencies**: P3.13
- **Acceptance**: Claude naturally uses spec tools for modifications
---
## PHASE 4: Polish & Testing
### P4.1 - Migrate m1_mirror studies
- **Action**: Run migration on all m1_mirror_* studies
- **Dependencies**: P1.17
- **Acceptance**: All studies have valid atomizer_spec.json
### P4.2 - Migrate drone_gimbal study
- **Action**: Run migration on drone_gimbal study
- **Dependencies**: P1.17
- **Acceptance**: Study has valid atomizer_spec.json
### P4.3 - Migrate all remaining studies
- **Action**: Run migration on all studies in studies/
- **Dependencies**: P4.1, P4.2
- **Acceptance**: All studies migrated, validated
### P4.4 - Create spec unit tests
- **File**: `tests/test_spec_manager.py`
- **Action**: Unit tests for SpecManager operations
- **Dependencies**: P1.7
- **Acceptance**: All SpecManager methods tested
### P4.5 - Create spec API integration tests
- **File**: `tests/test_spec_api.py`
- **Action**: Integration tests for REST endpoints
- **Dependencies**: P1.12
- **Acceptance**: All endpoints tested
### P4.6 - Create migration tests
- **File**: `tests/test_migrator.py`
- **Action**: Test migration with various config formats
- **Dependencies**: P1.16
- **Acceptance**: All config variants migrate correctly
### P4.7 - Create frontend component tests
- **File**: `atomizer-dashboard/frontend/src/__tests__/SpecRenderer.test.tsx`
- **Action**: Test SpecRenderer with various specs
- **Dependencies**: P2.16
- **Acceptance**: Canvas renders correctly for all spec types
### P4.8 - Create WebSocket sync tests
- **File**: `tests/test_spec_sync.py`
- **Action**: Test real-time sync between multiple clients
- **Dependencies**: P2.15
- **Acceptance**: Changes propagate correctly
### P4.9 - Create MCP tools tests
- **File**: `mcp-server/atomizer-tools/src/__tests__/spec_tools.test.ts`
- **Action**: Test all spec_* MCP tools
- **Dependencies**: P3.7
- **Acceptance**: All tools work correctly
### P4.10 - End-to-end testing
- **Action**: Full workflow test: create study in canvas, modify via Claude, run optimization
- **Dependencies**: P4.1-P4.9
- **Acceptance**: Complete workflow works
### P4.11 - Update documentation
- **Files**: `docs/04_USER_GUIDES/CANVAS.md`, `docs/04_USER_GUIDES/DASHBOARD.md`
- **Action**: Document new spec-based workflow
- **Dependencies**: P4.10
- **Acceptance**: Documentation reflects new system
### P4.12 - Update CLAUDE.md
- **File**: `CLAUDE.md`
- **Action**: Add spec tools documentation, update context loading
- **Dependencies**: P4.11
- **Acceptance**: Claude Code sessions know about spec system
---
## File Summary
### New Files to Create
| File | Phase | Purpose |
|------|-------|---------|
| `atomizer-dashboard/frontend/src/types/atomizer-spec.ts` | P1 | TypeScript types |
| `optimization_engine/config/spec_models.py` | P1 | Pydantic models |
| `optimization_engine/config/spec_validator.py` | P1 | Validation logic |
| `atomizer-dashboard/backend/api/services/spec_manager.py` | P1 | Core spec service |
| `atomizer-dashboard/backend/api/routes/spec.py` | P1 | REST endpoints |
| `optimization_engine/config/migrator.py` | P1 | Config migration |
| `tools/migrate_to_spec_v2.py` | P1 | Migration CLI |
| `atomizer-dashboard/frontend/src/hooks/useSpecStore.ts` | P2 | Spec state store |
| `atomizer-dashboard/frontend/src/hooks/useSpecSync.ts` | P2 | WebSocket sync |
| `atomizer-dashboard/frontend/src/lib/spec/converter.ts` | P2 | Spec ↔ ReactFlow |
| `atomizer-dashboard/frontend/src/components/canvas/SpecRenderer.tsx` | P2 | New canvas component |
| `mcp-server/atomizer-tools/src/tools/spec_tools.ts` | P3 | MCP tools |
| `optimization_engine/extractors/custom_loader.py` | P3 | Custom function loader |
| `atomizer-dashboard/frontend/src/components/canvas/nodes/CustomExtractorNode.tsx` | P3 | Custom node type |
| `atomizer-dashboard/frontend/src/components/canvas/panels/CustomExtractorPanel.tsx` | P3 | Code editor panel |
### Files to Modify
| File | Phase | Changes |
|------|-------|---------|
| `atomizer-dashboard/backend/api/main.py` | P1 | Mount spec router |
| `mcp-server/atomizer-tools/src/index.ts` | P3 | Register spec tools |
| `atomizer-dashboard/backend/api/services/context_builder.py` | P3 | Update Claude context |
| `optimization_engine/core/runner.py` | P3 | Custom extractor support |
| `atomizer-dashboard/frontend/src/pages/CanvasView.tsx` | P2 | Use SpecRenderer |
| `CLAUDE.md` | P4 | Document spec system |
---
## Success Criteria
### Phase 1 Complete When:
- [ ] SpecManager can load/save/validate specs
- [ ] All REST endpoints return correct responses
- [ ] Migration tool converts existing configs
### Phase 2 Complete When:
- [ ] Canvas renders from AtomizerSpec
- [ ] Edits persist to spec file
- [ ] WebSocket sync works between clients
### Phase 3 Complete When:
- [ ] Claude can read and modify specs via MCP
- [ ] Custom extractors work in optimization
- [ ] Claude can create studies from descriptions
### Phase 4 Complete When:
- [ ] All existing studies migrated
- [ ] All tests pass
- [ ] Documentation updated
---
## Risk Mitigation
| Risk | Mitigation |
|------|------------|
| Existing studies break | Migration tool with dry-run, keep old configs as backup |
| WebSocket complexity | Start with polling, add WebSocket as enhancement |
| Custom code security | Sandbox execution, syntax validation, no imports |
| Performance with large specs | Lazy loading, incremental updates |
---
## Quick Reference
**Master Design**: `docs/plans/UNIFIED_CONFIGURATION_ARCHITECTURE.md`
**Schema**: `optimization_engine/schemas/atomizer_spec_v2.json`
**This Plan**: `docs/plans/UNIFIED_CONFIG_EXECUTION_PLAN.md`
---
*Execute tasks in order. Each task has clear acceptance criteria. Reference the master design document for detailed specifications.*