6.0 KiB
War-Room Migration Plan v2 — Projects-First Architecture
Date: 2026-02-23
Adapted by: Manager
Reviewer: Auditor (Codex 5.3)
Original: war-room-migration-plan.md (2026-02-20)
Key Change from v1
Top-level studies/ folder is eliminated. All work lives under projects/, where each project is self-contained per the Atomizer Project Standard. Studies are nested inside their parent project.
New repo structure
Atomizer/
├── projects/ # Canonical project home (Project Standard)
│ ├── hydrotech-beam/ # ✅ already exists
│ ├── isogrid-dev-plate/ # ✅ already exists
│ └── <future projects>/ # Created per Project Standard when needed
├── studies/ # ⚠️ LEGACY — kept as-is, not actively used
│ ├── M1_Mirror/ # Migrated into projects/ one-at-a-time
│ ├── UAV_Arm/ # when the project becomes active
│ ├── ... # (restructured to new standard at that time)
├── optimization_engine/
├── templates/
├── ...
Migration strategy: INCREMENTAL
- No bulk migration. Legacy
studies/stays untouched. projects/is the new canonical root for all code paths.- When a legacy study becomes active, it gets migrated into a proper project under
projects/and restructured to the Project Standard at that time. - New projects are always created under
projects/.
Phase 0 — Stop The Bleeding (P0, 1-2 days)
Unchanged from v1. Fix broken imports, plugin paths, smoke tests. No folder moves yet.
Phase 1 — Entrypoint Contract Unification (P0, 2-4 days)
Unchanged from v1. Canonical runner API (optimization_engine/app/runner_service.py).
Addition: The canonical runner must resolve study paths via a project-aware resolver (see Phase 2).
Phase 2 — Projects-First Code Migration (P0, 2-3 days) ⬅️ NEW
Replaces v1 "Study Script Decoupling"
2A — No folder moves
Legacy studies/ stays as-is. No bulk migration. Projects get migrated individually when they become active.
2B — Update code paths to use projects/ as primary
Files referencing studies/ that need updating:
| File | Reference type | Action |
|---|---|---|
atomizer.py (lines 135, 193, 301-310, 373-377, 443, 538, 573-598) |
PROJECT_ROOT / "studies" |
Change to PROJECT_ROOT / "projects" with project-aware resolver |
optimization_engine/validators/results_validator.py (line 468) |
Path(f"studies/{study_name}") |
Update to project-relative path |
optimization_engine/validators/config_validator.py (line 12) |
Docstring example | Update path |
optimization_engine/insights/__init__.py (lines 51-77) |
Docstring examples | Update paths |
optimization_engine/templates/__init__.py (line 155) |
Example display | Update path |
optimization_engine/devloop/planning.py (lines 298-345) |
studies/_Other/ hardcoded |
Update to use projects/ with legacy fallback |
optimization_engine/processors/surrogates/*.py |
Hardcoded Windows paths | Update to project-relative |
optimization_engine/gnn/*.py |
Hardcoded Windows paths | Update to project-relative |
2C — Project-aware study resolver (with legacy fallback)
New module: optimization_engine/app/study_resolver.py
def resolve_study(study_name: str, project: str = None) -> Path:
"""
Resolve study path. Search order:
1. projects/{project}/studies/{study_name} (if project specified)
2. projects/*/studies/{study_name} (search all projects)
3. studies/{study_name} (legacy fallback)
"""
CLI changes:
atomizer list-studies→atomizer list-studies [--project X](lists from projects/ + legacy studies/)atomizer neural-optimize --study X→ add optional--project Pflag, auto-resolve with fallbackatomizer create-study→ requires--project(new studies always go in projects/)
2D — Legacy studies/ gets a README
studies/README.md:
"Legacy study folder. New work goes in projects/.
These studies will be migrated into projects/ individually when needed."
Phase 3 — Hooks/Plugins Hardening (P1, 3-5 days)
Unchanged from v1.
Phase 4 — Extractor Surface Rationalization (P1, 1 week)
Unchanged from v1.
Phase 5 — Template/Study Generation Repair (P1, 2-4 days)
Updated: atomizer create-study must now:
- Accept
--projectflag (required) - Generate study inside
projects/{project}/studies/{study_name}/ - Create project scaffold if project doesn't exist yet (with confirmation)
Phase 6 — Future Folder Re-homing (P2, 1 week)
Unchanged from v1.
Phase 7 — Verification and Guardrails (P0 ongoing)
Updated tests:
test_project_structure.py— validate all projects have required subdirstest_study_resolver.py— study lookup works across projectstest_no_toplevel_studies.py— fail ifstudies/dir exists at repo root- Original tests from v1 still apply
Dependency-Critical Ordering Summary
- Phase 0 — import/plugin path fixes (no folder moves)
- Phase 1 — canonical runner contract
- Phase 2 — projects-first migration (folder moves + path updates + resolver)
- Phase 5 — template generation updated for projects
- Phase 3 — hooks hardening
- Phase 4 + 6 — extractor/future rationalization
- Phase 7 — continuously
Quick Wins (do first in Phase 2)
- Add
--projectflag to CLI + study resolver with legacy fallback - Update
atomizer.pyto searchprojects/first,studies/second - Add README to
studies/marking it legacy - Update docstring examples
Risk Notes
- Zero breaking changes: legacy
studies/untouched, resolver falls back to it - Windows hardcoded paths: GNN test files reference
C:/Users/Antoine/Atomizer/studies/...— low priority, update when those projects get migrated - Syncthing: no changes needed now since studies/ stays. Update sync config only when individual projects migrate.