Files
Atomizer/docs/reviews/ATOMIZER_ARCHITECTURE.svg
Anto01 ea437d360e docs: Major documentation overhaul - restructure folders, update tagline, add Getting Started guide
- Restructure docs/ folder (remove numeric prefixes):
  - 04_USER_GUIDES -> guides/
  - 05_API_REFERENCE -> api/
  - 06_PHYSICS -> physics/
  - 07_DEVELOPMENT -> development/
  - 08_ARCHIVE -> archive/
  - 09_DIAGRAMS -> diagrams/

- Replace tagline 'Talk, don't click' with 'LLM-driven optimization framework' in 9 files

- Create comprehensive docs/GETTING_STARTED.md:
  - Prerequisites and quick setup
  - Project structure overview
  - First study tutorial (Claude or manual)
  - Dashboard usage guide
  - Neural acceleration introduction

- Rewrite docs/00_INDEX.md with correct paths and modern structure

- Archive obsolete files:
  - 01_PROTOCOLS.md -> archive/historical/01_PROTOCOLS_legacy.md
  - 03_GETTING_STARTED.md -> archive/historical/
  - ATOMIZER_PODCAST_BRIEFING.md -> archive/marketing/

- Update timestamps to 2026-01-20 across all key files

- Update .gitignore to exclude docs/generated/

- Version bump: ATOMIZER_CONTEXT v1.8 -> v2.0
2026-01-20 10:03:45 -05:00

520 lines
41 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 1200" width="1400" height="1200">
<defs>
<!-- Gradients -->
<linearGradient id="headerGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#1a1a2e"/>
<stop offset="100%" style="stop-color:#16213e"/>
</linearGradient>
<linearGradient id="frontendGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#0f3460"/>
<stop offset="100%" style="stop-color:#0d2847"/>
</linearGradient>
<linearGradient id="backendGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#1a472a"/>
<stop offset="100%" style="stop-color:#143d20"/>
</linearGradient>
<linearGradient id="engineGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#4a1942"/>
<stop offset="100%" style="stop-color:#3d1536"/>
</linearGradient>
<linearGradient id="specGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#e94560"/>
<stop offset="100%" style="stop-color:#c73659"/>
</linearGradient>
<linearGradient id="claudeGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#d4a373"/>
<stop offset="100%" style="stop-color:#bc8f5f"/>
</linearGradient>
<!-- Arrow marker -->
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#6b7280"/>
</marker>
<marker id="arrowheadBlue" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#3b82f6"/>
</marker>
<marker id="arrowheadGreen" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#22c55e"/>
</marker>
<marker id="arrowheadOrange" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#f97316"/>
</marker>
<!-- Drop shadow -->
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="2" dy="2" stdDeviation="3" flood-opacity="0.3"/>
</filter>
</defs>
<!-- Background -->
<rect width="1400" height="1200" fill="#0f0f1a"/>
<!-- Title -->
<rect x="0" y="0" width="1400" height="60" fill="url(#headerGrad)"/>
<text x="700" y="40" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#ffffff">
ATOMIZER ARCHITECTURE - Intelligence Layout
</text>
<text x="700" y="55" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#9ca3af">
AtomizerSpec v2.0 | Single Source of Truth Pattern | January 2026
</text>
<!-- ==================== FRONTEND SECTION ==================== -->
<g id="frontend">
<!-- Frontend Container -->
<rect x="30" y="80" width="420" height="350" rx="10" fill="url(#frontendGrad)" filter="url(#shadow)" stroke="#3b82f6" stroke-width="2"/>
<text x="240" y="105" text-anchor="middle" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#3b82f6">FRONTEND (React + TypeScript)</text>
<!-- Canvas View -->
<rect x="50" y="120" width="180" height="80" rx="6" fill="#1e3a5f" stroke="#60a5fa" stroke-width="1"/>
<text x="140" y="145" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#60a5fa">CanvasView</text>
<text x="140" y="162" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#93c5fd">ReactFlow Canvas</text>
<text x="140" y="175" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#93c5fd">Node Rendering</text>
<text x="140" y="188" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#93c5fd">Edge Connections</text>
<!-- Chat Panel -->
<rect x="250" y="120" width="180" height="80" rx="6" fill="#1e3a5f" stroke="#60a5fa" stroke-width="1"/>
<text x="340" y="145" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#60a5fa">ChatPanel</text>
<text x="340" y="162" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#93c5fd">Claude Integration</text>
<text x="340" y="175" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#93c5fd">User/Power Mode</text>
<text x="340" y="188" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#93c5fd">Tool Call Display</text>
<!-- useSpecStore -->
<rect x="50" y="215" width="180" height="90" rx="6" fill="#0d47a1" stroke="#2196f3" stroke-width="2"/>
<text x="140" y="240" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#ffffff">useSpecStore</text>
<text x="140" y="257" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#bbdefb">Zustand Store</text>
<text x="140" y="272" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#90caf9">spec | hash | isDirty</text>
<text x="140" y="285" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#90caf9">selectedNode | validation</text>
<text x="140" y="298" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#64b5f6">patchSpec() | addNode()</text>
<!-- useChat -->
<rect x="250" y="215" width="180" height="90" rx="6" fill="#0d47a1" stroke="#2196f3" stroke-width="2"/>
<text x="340" y="240" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#ffffff">useChat</text>
<text x="340" y="257" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#bbdefb">WebSocket Hook</text>
<text x="340" y="272" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#90caf9">messages | isThinking</text>
<text x="340" y="285" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#90caf9">mode: user | power</text>
<text x="340" y="298" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#64b5f6">sendMessage() | switchMode()</text>
<!-- Converter -->
<rect x="50" y="320" width="380" height="45" rx="6" fill="#1565c0" stroke="#42a5f5" stroke-width="1"/>
<text x="240" y="342" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">spec/converter.ts</text>
<text x="240" y="358" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#bbdefb">specToNodes() | nodesToSpec() | Auto-layout: DVs→Model→Solver→Extractors→Objectives→Algorithm</text>
<!-- Types -->
<rect x="50" y="375" width="180" height="40" rx="4" fill="#1976d2" stroke="#64b5f6" stroke-width="1"/>
<text x="140" y="395" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#ffffff">types/atomizer-spec.ts</text>
<text x="140" y="408" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbdefb">TypeScript Definitions</text>
<!-- Panels -->
<rect x="250" y="375" width="180" height="40" rx="4" fill="#1976d2" stroke="#64b5f6" stroke-width="1"/>
<text x="340" y="395" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#ffffff">panels/*.tsx</text>
<text x="340" y="408" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbdefb">NodeConfig | Validation | Execute</text>
</g>
<!-- ==================== BACKEND SECTION ==================== -->
<g id="backend">
<!-- Backend Container -->
<rect x="490" y="80" width="420" height="350" rx="10" fill="url(#backendGrad)" filter="url(#shadow)" stroke="#22c55e" stroke-width="2"/>
<text x="700" y="105" text-anchor="middle" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#22c55e">BACKEND (FastAPI + Python)</text>
<!-- Routes -->
<rect x="510" y="120" width="180" height="100" rx="6" fill="#14532d" stroke="#4ade80" stroke-width="1"/>
<text x="600" y="140" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#4ade80">routes/</text>
<text x="600" y="158" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">spec.py - CRUD + WS sync</text>
<text x="600" y="173" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">claude.py - Chat sessions</text>
<text x="600" y="188" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">optimization.py - Run control</text>
<text x="600" y="203" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">files.py - Upload/download</text>
<!-- Services -->
<rect x="710" y="120" width="180" height="100" rx="6" fill="#14532d" stroke="#4ade80" stroke-width="1"/>
<text x="800" y="140" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#4ade80">services/</text>
<text x="800" y="158" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">spec_manager.py</text>
<text x="800" y="173" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">claude_agent.py</text>
<text x="800" y="188" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">context_builder.py</text>
<text x="800" y="203" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">session_manager.py</text>
<!-- SpecManager Detail -->
<rect x="510" y="235" width="380" height="100" rx="6" fill="#166534" stroke="#22c55e" stroke-width="2"/>
<text x="700" y="258" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#ffffff">SpecManager (Central Gatekeeper)</text>
<text x="700" y="278" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#bbf7d0">load_spec() → validate() → patch_spec() → save_spec()</text>
<text x="700" y="295" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">Pydantic Validation | Atomic Writes | SHA256 Hashing</text>
<text x="700" y="312" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#86efac">WebSocket Broadcast | Conflict Detection</text>
<text x="700" y="328" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#4ade80">All modifications must go through SpecManager</text>
<!-- REST Endpoints -->
<rect x="510" y="350" width="180" height="65" rx="4" fill="#15803d" stroke="#4ade80" stroke-width="1"/>
<text x="600" y="370" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">REST API</text>
<text x="600" y="385" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">GET/PUT/PATCH /spec</text>
<text x="600" y="398" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">POST/PATCH/DELETE /nodes</text>
<text x="600" y="411" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">POST /validate</text>
<!-- WebSocket -->
<rect x="710" y="350" width="180" height="65" rx="4" fill="#15803d" stroke="#4ade80" stroke-width="1"/>
<text x="800" y="370" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">WebSocket</text>
<text x="800" y="385" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">/spec/sync - Real-time sync</text>
<text x="800" y="398" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">/ws - User mode chat</text>
<text x="800" y="411" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">/ws/power - Power mode</text>
</g>
<!-- ==================== ATOMIZER SPEC (CENTER) ==================== -->
<g id="spec">
<rect x="520" y="470" width="360" height="200" rx="12" fill="url(#specGrad)" filter="url(#shadow)" stroke="#ff6b6b" stroke-width="3"/>
<text x="700" y="500" text-anchor="middle" font-family="Arial, sans-serif" font-size="18" font-weight="bold" fill="#ffffff">atomizer_spec.json</text>
<text x="700" y="520" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" fill="#fecaca">SINGLE SOURCE OF TRUTH</text>
<!-- Spec Structure -->
<rect x="540" y="535" width="150" height="120" rx="4" fill="#991b1b" stroke="#fca5a5" stroke-width="1"/>
<text x="615" y="555" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#fecaca">Structure</text>
<text x="615" y="572" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fecaca">meta: { version, name }</text>
<text x="615" y="586" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fecaca">model: { sim, fem }</text>
<text x="615" y="600" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fecaca">design_variables[]</text>
<text x="615" y="614" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fecaca">extractors[]</text>
<text x="615" y="628" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fecaca">objectives[]</text>
<text x="615" y="642" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fecaca">constraints[]</text>
<!-- Node IDs -->
<rect x="710" y="535" width="150" height="120" rx="4" fill="#991b1b" stroke="#fca5a5" stroke-width="1"/>
<text x="785" y="555" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#fecaca">Node IDs</text>
<text x="785" y="575" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#fecaca">dv_001, dv_002...</text>
<text x="785" y="592" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#fecaca">ext_001, ext_002...</text>
<text x="785" y="609" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#fecaca">obj_001, obj_002...</text>
<text x="785" y="626" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#fecaca">con_001, con_002...</text>
<text x="785" y="648" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#f87171">+ canvas_position</text>
</g>
<!-- ==================== OPTIMIZATION ENGINE ==================== -->
<g id="engine">
<rect x="950" y="80" width="420" height="350" rx="10" fill="url(#engineGrad)" filter="url(#shadow)" stroke="#c026d3" stroke-width="2"/>
<text x="1160" y="105" text-anchor="middle" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#c026d3">OPTIMIZATION ENGINE</text>
<!-- Core -->
<rect x="970" y="120" width="180" height="95" rx="6" fill="#581c87" stroke="#d946ef" stroke-width="1"/>
<text x="1060" y="140" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#d946ef">core/</text>
<text x="1060" y="158" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">runner.py - Main loop</text>
<text x="1060" y="173" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">method_selector.py</text>
<text x="1060" y="188" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">intelligent_optimizer.py</text>
<text x="1060" y="203" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">gradient_optimizer.py</text>
<!-- Extractors -->
<rect x="1170" y="120" width="180" height="95" rx="6" fill="#581c87" stroke="#d946ef" stroke-width="1"/>
<text x="1260" y="140" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#d946ef">extractors/</text>
<text x="1260" y="158" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">displacement, stress</text>
<text x="1260" y="173" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">frequency, mass</text>
<text x="1260" y="188" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">zernike_opd</text>
<text x="1260" y="203" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">custom_extractor_loader</text>
<!-- Config -->
<rect x="970" y="230" width="180" height="80" rx="6" fill="#6b21a8" stroke="#a855f7" stroke-width="2"/>
<text x="1060" y="252" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">config/</text>
<text x="1060" y="270" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">spec_models.py (Pydantic)</text>
<text x="1060" y="285" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">spec_validator.py</text>
<text x="1060" y="300" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">migrator.py (legacy→v2)</text>
<!-- NX Integration -->
<rect x="1170" y="230" width="180" height="80" rx="6" fill="#581c87" stroke="#d946ef" stroke-width="1"/>
<text x="1260" y="252" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#d946ef">nx/</text>
<text x="1260" y="270" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">solver.py - Nastran exec</text>
<text x="1260" y="285" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">updater.py - Param update</text>
<text x="1260" y="300" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#e9d5ff">session_manager.py</text>
<!-- Utils -->
<rect x="970" y="325" width="180" height="55" rx="4" fill="#7c3aed" stroke="#a78bfa" stroke-width="1"/>
<text x="1060" y="345" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">utils/</text>
<text x="1060" y="362" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#ddd6fe">dashboard_db.py (Optuna)</text>
<text x="1060" y="375" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#ddd6fe">trial_manager.py</text>
<!-- Study -->
<rect x="1170" y="325" width="180" height="55" rx="4" fill="#7c3aed" stroke="#a78bfa" stroke-width="1"/>
<text x="1260" y="345" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">study/</text>
<text x="1260" y="362" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#ddd6fe">creator.py, state.py</text>
<text x="1260" y="375" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#ddd6fe">reset.py</text>
<!-- Algorithms Box -->
<rect x="970" y="390" width="380" height="35" rx="4" fill="#4c1d95" stroke="#8b5cf6" stroke-width="1"/>
<text x="1160" y="412" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#c4b5fd">Algorithms: TPE | CMA-ES | NSGA-II | IMSO | SAT_v3 | RandomSearch</text>
</g>
<!-- ==================== CLAUDE INTEGRATION ==================== -->
<g id="claude">
<rect x="950" y="470" width="420" height="200" rx="10" fill="url(#claudeGrad)" filter="url(#shadow)" stroke="#d97706" stroke-width="2"/>
<text x="1160" y="495" text-anchor="middle" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#451a03">CLAUDE INTEGRATION</text>
<!-- AtomizerClaudeAgent -->
<rect x="970" y="510" width="180" height="145" rx="6" fill="#92400e" stroke="#fbbf24" stroke-width="1"/>
<text x="1060" y="532" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#fef3c7">AtomizerClaudeAgent</text>
<text x="1060" y="550" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#fde68a">Direct Anthropic API</text>
<text x="1060" y="570" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fef3c7">Tools (Power Mode):</text>
<text x="1060" y="585" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">add_design_variable()</text>
<text x="1060" y="598" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">add_extractor()</text>
<text x="1060" y="611" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">add_objective()</text>
<text x="1060" y="624" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">add_constraint()</text>
<text x="1060" y="637" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">update_spec_field()</text>
<text x="1060" y="650" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">remove_node()</text>
<!-- Context Builder -->
<rect x="1170" y="510" width="180" height="75" rx="6" fill="#92400e" stroke="#fbbf24" stroke-width="1"/>
<text x="1260" y="532" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#fef3c7">ContextBuilder</text>
<text x="1260" y="552" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#fde68a">System prompt assembly</text>
<text x="1260" y="568" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">Study context injection</text>
<text x="1260" y="581" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">Canvas state embedding</text>
<!-- Modes -->
<rect x="1170" y="595" width="85" height="55" rx="4" fill="#78350f" stroke="#f59e0b" stroke-width="1"/>
<text x="1212" y="615" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#fef3c7">User</text>
<text x="1212" y="630" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">Read-only</text>
<text x="1212" y="643" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fde68a">MCP tools</text>
<rect x="1265" y="595" width="85" height="55" rx="4" fill="#b45309" stroke="#fbbf24" stroke-width="2"/>
<text x="1307" y="615" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">Power</text>
<text x="1307" y="630" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fef3c7">Full write</text>
<text x="1307" y="643" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#fef3c7">Direct API</text>
</g>
<!-- ==================== FILE SYSTEM ==================== -->
<g id="filesystem">
<rect x="30" y="470" width="450" height="200" rx="10" fill="#1f2937" filter="url(#shadow)" stroke="#6b7280" stroke-width="2"/>
<text x="255" y="495" text-anchor="middle" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#9ca3af">FILE SYSTEM</text>
<!-- Study Structure -->
<rect x="50" y="510" width="200" height="145" rx="6" fill="#374151" stroke="#6b7280" stroke-width="1"/>
<text x="150" y="530" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#d1d5db">studies/{name}/</text>
<text x="150" y="550" text-anchor="middle" font-family="monospace" font-size="9" fill="#9ca3af">atomizer_spec.json</text>
<text x="150" y="566" text-anchor="middle" font-family="monospace" font-size="9" fill="#6b7280">1_setup/model/</text>
<text x="150" y="582" text-anchor="middle" font-family="monospace" font-size="9" fill="#6b7280"> *.prt, *.sim, *.fem</text>
<text x="150" y="598" text-anchor="middle" font-family="monospace" font-size="9" fill="#6b7280">2_iterations/</text>
<text x="150" y="614" text-anchor="middle" font-family="monospace" font-size="9" fill="#6b7280"> trial_NNNN/</text>
<text x="150" y="630" text-anchor="middle" font-family="monospace" font-size="9" fill="#6b7280">3_results/</text>
<text x="150" y="646" text-anchor="middle" font-family="monospace" font-size="9" fill="#9ca3af"> study.db</text>
<!-- Database -->
<rect x="270" y="510" width="190" height="145" rx="6" fill="#374151" stroke="#6b7280" stroke-width="1"/>
<text x="365" y="530" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#d1d5db">study.db (Optuna)</text>
<text x="365" y="555" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#9ca3af">trials</text>
<text x="365" y="570" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#6b7280">trial_id | state | created</text>
<text x="365" y="590" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#9ca3af">trial_params</text>
<text x="365" y="605" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#6b7280">param_name | param_value</text>
<text x="365" y="625" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#9ca3af">trial_values</text>
<text x="365" y="640" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#6b7280">objective_id | value</text>
</g>
<!-- ==================== DATA FLOW ARROWS ==================== -->
<!-- Frontend to Backend (REST) -->
<path d="M 450 285 L 510 285" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrowheadBlue)" fill="none"/>
<text x="480" y="278" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#60a5fa">REST</text>
<!-- Frontend to Backend (WebSocket) -->
<path d="M 450 315 L 510 315" stroke="#22c55e" stroke-width="2" marker-end="url(#arrowheadGreen)" fill="none" stroke-dasharray="5,3"/>
<text x="480" y="330" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#4ade80">WS</text>
<!-- Backend to Spec -->
<path d="M 700 420 L 700 470" stroke="#e94560" stroke-width="3" marker-end="url(#arrowhead)" fill="none"/>
<text x="715" y="445" font-family="Arial, sans-serif" font-size="8" fill="#f87171">Read/Write</text>
<!-- Spec to Engine -->
<path d="M 880 570 L 950 570" stroke="#c026d3" stroke-width="2" marker-end="url(#arrowhead)" fill="none"/>
<text x="915" y="563" font-family="Arial, sans-serif" font-size="8" fill="#d946ef">Load</text>
<!-- Claude to Spec -->
<path d="M 950 570 L 880 570" stroke="#d97706" stroke-width="2" marker-end="url(#arrowheadOrange)" fill="none" stroke-dasharray="5,3"/>
<text x="915" y="585" font-family="Arial, sans-serif" font-size="8" fill="#fbbf24">Modify</text>
<!-- Spec to FileSystem -->
<path d="M 520 570 L 480 570" stroke="#6b7280" stroke-width="2" marker-end="url(#arrowhead)" fill="none"/>
<text x="500" y="563" font-family="Arial, sans-serif" font-size="8" fill="#9ca3af">File</text>
<!-- Engine to FileSystem (DB) -->
<path d="M 950 400 L 480 590" stroke="#c026d3" stroke-width="1.5" marker-end="url(#arrowhead)" fill="none" stroke-dasharray="3,2"/>
<text x="720" y="485" font-family="Arial, sans-serif" font-size="8" fill="#d946ef">Trials</text>
<!-- Frontend to Claude (Chat) -->
<path d="M 430 155 L 1050 475" stroke="#d97706" stroke-width="1.5" marker-end="url(#arrowheadOrange)" fill="none" stroke-dasharray="5,3"/>
<text x="740" y="300" font-family="Arial, sans-serif" font-size="8" fill="#fbbf24">Chat WS</text>
<!-- ==================== LEGEND ==================== -->
<g id="legend">
<rect x="30" y="700" width="1340" height="80" rx="8" fill="#1a1a2e" stroke="#374151" stroke-width="1"/>
<text x="700" y="725" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#ffffff">DATA FLOW LEGEND</text>
<!-- REST -->
<line x1="80" y1="750" x2="130" y2="750" stroke="#3b82f6" stroke-width="2"/>
<text x="145" y="754" font-family="Arial, sans-serif" font-size="10" fill="#60a5fa">REST API</text>
<!-- WebSocket -->
<line x1="230" y1="750" x2="280" y2="750" stroke="#22c55e" stroke-width="2" stroke-dasharray="5,3"/>
<text x="295" y="754" font-family="Arial, sans-serif" font-size="10" fill="#4ade80">WebSocket</text>
<!-- Read/Write -->
<line x1="400" y1="750" x2="450" y2="750" stroke="#e94560" stroke-width="3"/>
<text x="465" y="754" font-family="Arial, sans-serif" font-size="10" fill="#f87171">Spec I/O</text>
<!-- Claude -->
<line x1="560" y1="750" x2="610" y2="750" stroke="#d97706" stroke-width="2" stroke-dasharray="5,3"/>
<text x="625" y="754" font-family="Arial, sans-serif" font-size="10" fill="#fbbf24">Claude</text>
<!-- Engine -->
<line x1="700" y1="750" x2="750" y2="750" stroke="#c026d3" stroke-width="2"/>
<text x="765" y="754" font-family="Arial, sans-serif" font-size="10" fill="#d946ef">Engine</text>
<!-- Key Principle -->
<rect x="900" y="740" width="430" height="25" rx="4" fill="#991b1b"/>
<text x="1115" y="757" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">
All modifications flow through atomizer_spec.json (Single Source of Truth)
</text>
</g>
<!-- ==================== CANVAS NODES DETAIL ==================== -->
<g id="canvas-nodes">
<rect x="30" y="800" width="650" height="180" rx="8" fill="#0d2847" stroke="#3b82f6" stroke-width="1"/>
<text x="355" y="825" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#3b82f6">CANVAS NODE TYPES (ReactFlow)</text>
<!-- Node types in columns -->
<g transform="translate(50, 845)">
<!-- Design Variables -->
<rect x="0" y="0" width="90" height="50" rx="4" fill="#1e40af" stroke="#60a5fa" stroke-width="1"/>
<text x="45" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">DesignVar</text>
<text x="45" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#93c5fd">dv_001</text>
<text x="45" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#93c5fd">bounds, baseline</text>
<!-- Model -->
<rect x="105" y="0" width="90" height="50" rx="4" fill="#065f46" stroke="#34d399" stroke-width="1"/>
<text x="150" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">Model</text>
<text x="150" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#a7f3d0">synthetic</text>
<text x="150" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#a7f3d0">.sim path</text>
<!-- Solver -->
<rect x="210" y="0" width="90" height="50" rx="4" fill="#065f46" stroke="#34d399" stroke-width="1"/>
<text x="255" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">Solver</text>
<text x="255" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#a7f3d0">synthetic</text>
<text x="255" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#a7f3d0">SOL 101/103</text>
<!-- Extractor -->
<rect x="315" y="0" width="90" height="50" rx="4" fill="#7c2d12" stroke="#fb923c" stroke-width="1"/>
<text x="360" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">Extractor</text>
<text x="360" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#fed7aa">ext_001</text>
<text x="360" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#fed7aa">type, outputs</text>
<!-- Objective -->
<rect x="420" y="0" width="90" height="50" rx="4" fill="#7f1d1d" stroke="#f87171" stroke-width="1"/>
<text x="465" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">Objective</text>
<text x="465" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#fecaca">obj_001</text>
<text x="465" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#fecaca">direction, weight</text>
<!-- Constraint -->
<rect x="525" y="0" width="90" height="50" rx="4" fill="#713f12" stroke="#facc15" stroke-width="1"/>
<text x="570" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">Constraint</text>
<text x="570" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#fef08a">con_001</text>
<text x="570" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#fef08a">operator, threshold</text>
</g>
<!-- Second row -->
<g transform="translate(50, 910)">
<!-- Algorithm -->
<rect x="0" y="0" width="90" height="50" rx="4" fill="#581c87" stroke="#a855f7" stroke-width="1"/>
<text x="45" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">Algorithm</text>
<text x="45" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#e9d5ff">synthetic</text>
<text x="45" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#e9d5ff">TPE/CMA-ES</text>
<!-- Surrogate -->
<rect x="105" y="0" width="90" height="50" rx="4" fill="#312e81" stroke="#818cf8" stroke-width="1"/>
<text x="150" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" font-weight="bold" fill="#ffffff">Surrogate</text>
<text x="150" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#c7d2fe">optional</text>
<text x="150" y="45" text-anchor="middle" font-family="Arial, sans-serif" font-size="7" fill="#c7d2fe">MLP/GNN</text>
<!-- Flow -->
<text x="330" y="25" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#9ca3af">
Layout: DVs → Model → Solver → Extractors → Objectives/Constraints → Algorithm
</text>
</g>
</g>
<!-- ==================== KEY PATTERNS ==================== -->
<g id="patterns">
<rect x="700" y="800" width="670" height="180" rx="8" fill="#14532d" stroke="#22c55e" stroke-width="1"/>
<text x="1035" y="825" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#22c55e">KEY ARCHITECTURAL PATTERNS</text>
<!-- Optimistic Updates -->
<rect x="720" y="840" width="200" height="60" rx="4" fill="#166534" stroke="#4ade80" stroke-width="1"/>
<text x="820" y="860" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">Optimistic Updates</text>
<text x="820" y="877" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">1. Update UI immediately</text>
<text x="820" y="890" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">2. Async sync to backend</text>
<!-- Conflict Detection -->
<rect x="935" y="840" width="200" height="60" rx="4" fill="#166534" stroke="#4ade80" stroke-width="1"/>
<text x="1035" y="860" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">Conflict Detection</text>
<text x="1035" y="877" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">SHA256 hash comparison</text>
<text x="1035" y="890" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">409 Conflict → reload</text>
<!-- WebSocket Broadcast -->
<rect x="1150" y="840" width="200" height="60" rx="4" fill="#166534" stroke="#4ade80" stroke-width="1"/>
<text x="1250" y="860" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">WS Broadcast</text>
<text x="1250" y="877" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">All clients synced</text>
<text x="1250" y="890" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">Real-time updates</text>
<!-- Pydantic Validation -->
<rect x="720" y="910" width="200" height="60" rx="4" fill="#166534" stroke="#4ade80" stroke-width="1"/>
<text x="820" y="930" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">Pydantic Validation</text>
<text x="820" y="947" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">Every modification validated</text>
<text x="820" y="960" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">Schema + semantic checks</text>
<!-- Atomic Writes -->
<rect x="935" y="910" width="200" height="60" rx="4" fill="#166534" stroke="#4ade80" stroke-width="1"/>
<text x="1035" y="930" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">Atomic Writes</text>
<text x="1035" y="947" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">No partial updates</text>
<text x="1035" y="960" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">Write → hash → broadcast</text>
<!-- Node ID Convention -->
<rect x="1150" y="910" width="200" height="60" rx="4" fill="#166534" stroke="#4ade80" stroke-width="1"/>
<text x="1250" y="930" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#ffffff">Node ID Convention</text>
<text x="1250" y="947" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">dv_, ext_, obj_, con_</text>
<text x="1250" y="960" text-anchor="middle" font-family="Arial, sans-serif" font-size="8" fill="#bbf7d0">Auto-increment: {prefix}{N:03d}</text>
</g>
<!-- ==================== VERSION INFO ==================== -->
<g id="version">
<rect x="30" y="1000" width="1340" height="50" rx="8" fill="#1a1a2e" stroke="#374151" stroke-width="1"/>
<text x="700" y="1020" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#6b7280">
AtomizerSpec v2.0 | React 18 + Vite + Zustand | FastAPI + Pydantic | SQLite (Optuna) | Anthropic Claude API
</text>
<text x="700" y="1038" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#6b7280">
Optimization Algorithms: TPE | CMA-ES | NSGA-II | IMSO | SAT_v3 | GNN Surrogates | Extractors: displacement, stress, frequency, mass, zernike
</text>
</g>
<!-- ==================== INTELLIGENCE INDICATORS ==================== -->
<g id="intelligence">
<rect x="30" y="1060" width="1340" height="120" rx="8" fill="#1f1f3a" stroke="#8b5cf6" stroke-width="2"/>
<text x="700" y="1085" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#a78bfa">INTELLIGENCE LAYER</text>
<!-- Claude Power Mode -->
<rect x="60" y="1100" width="250" height="60" rx="4" fill="#3730a3" stroke="#818cf8" stroke-width="1"/>
<text x="185" y="1120" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">Claude Power Mode</text>
<text x="185" y="1138" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Direct spec modifications via tools</text>
<text x="185" y="1152" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">No permission prompts</text>
<!-- IMSO -->
<rect x="330" y="1100" width="250" height="60" rx="4" fill="#3730a3" stroke="#818cf8" stroke-width="1"/>
<text x="455" y="1120" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">IMSO (Intelligent Multi-Stage)</text>
<text x="455" y="1138" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Adaptive algorithm selection</text>
<text x="455" y="1152" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Surrogate-assisted optimization</text>
<!-- GNN Surrogates -->
<rect x="600" y="1100" width="250" height="60" rx="4" fill="#3730a3" stroke="#818cf8" stroke-width="1"/>
<text x="725" y="1120" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">GNN Surrogates</text>
<text x="725" y="1138" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Neural network FEA predictions</text>
<text x="725" y="1152" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">10x speedup via Zernike GNN</text>
<!-- SAT v3 -->
<rect x="870" y="1100" width="250" height="60" rx="4" fill="#3730a3" stroke="#818cf8" stroke-width="1"/>
<text x="995" y="1120" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">Self-Aware Turbo (SAT v3)</text>
<text x="995" y="1138" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Uncertainty-aware exploration</text>
<text x="995" y="1152" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Adaptive FEA validation</text>
<!-- Context Learning -->
<rect x="1140" y="1100" width="210" height="60" rx="4" fill="#3730a3" stroke="#818cf8" stroke-width="1"/>
<text x="1245" y="1120" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#ffffff">LAC (Learning Core)</text>
<text x="1245" y="1138" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Session insights persistence</text>
<text x="1245" y="1152" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#c7d2fe">Cross-study knowledge</text>
</g>
</svg>