# AetherForge Streamlining — Quick Reference & Dependency Map ## Module Dependency Graph ``` ┌─────────────────────────────────────────────────────────────────┐ │ CORE MINING OPERATIONS │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────┐ ┌──────────────┐ ┌────────────┐ │ │ │ Agent │───→│ Client │───→│ Miner │ │ │ │ (C2 auth) │ │ (WS client) │ │ (XMRig) │ │ │ └────────────┘ └──────────────┘ └────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ OPTIONAL FEATURES (REMOVE) │ │ │ ├──────────────────────────────────────────────────┤ │ │ │ • AI/LLM (scheduler, court_chamber) │ │ │ │ • Mesh P2P (mDNS relay) │ │ │ │ • GPU optimization (tuning heuristics) │ │ │ │ • AWS cloud features (erasure, fargate) │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ SUPPORTING MODULES (KEEP, OPTIMIZE) │ │ │ ├──────────────────────────────────────────────────┤ │ │ │ • Strategy (phenotype clone, adaptive) │ │ │ │ • Atlas (failure tracking) │ │ │ │ • Pool (Stratum proxy) │ │ │ │ • Recon (KEV, vulnerability scan) │ │ │ │ • Deploy (LOTL 14-tier onion) │ │ │ │ • Scheduler (task timing) │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ DASHBOARD (REACT) │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ MONOLITHIC CONTEXT (REFACTOR) │ │ │ ├──────────────────────────────────────────────────┤ │ │ │ WebSocketProvider (339 LOC) │ │ │ │ ├─ agents[] ─→ [SPLIT] StatsContext │ │ │ │ ├─ recentShares[] ─→ [SPLIT] StatsContext │ │ │ │ ├─ fleetAlerts[] ─→ [SPLIT] ConnectionContext │ │ │ │ ├─ poolStatus[] ─→ [SPLIT] ConnectionContext │ │ │ │ ├─ aiActivity[] ─→ [DELETE] (remove with AI) │ │ │ │ ├─ agentLogs{} ─→ [OPTIMIZE] Ring buffer │ │ │ │ ├─ commandResults[] ─→ [SPLIT] CommandContext │ │ │ │ └─ policyAcks[] ─→ [SPLIT] CommandContext │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ LARGE COMPONENTS (SPLIT) │ │ │ ├──────────────────────────────────────────────────┤ │ │ │ CruciblePage (1,851 LOC) │ │ │ │ ├─ CrucibleTerminal (400 LOC) │ │ │ │ ├─ CrucibleHeatMap (200 LOC) │ │ │ │ ├─ CrucibleRoster (250 LOC) │ │ │ │ └─ Tabs: │ │ │ │ ├─ LotlTimelineTab (250 LOC) │ │ │ │ ├─ AccessDepthTab (200 LOC) │ │ │ │ └─ SpreadTab (180 LOC) │ │ │ │ │ │ │ │ Other Heavy Components: │ │ │ │ ├─ CrucibleExpandedOps (959 LOC) ✓ exists │ │ │ │ ├─ AgentRemoteActions (934 LOC) ✓ exists │ │ │ │ └─ NetworkTopoMap (511 LOC) → lazy-load │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ DATABASE & PERSISTENCE │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ SQLite (data/miner.db) — 64 tables │ │ ├─ [OPTIMIZE] hashrate_samples │ │ │ └─ Add batching layer (5s flush) │ │ │ └─ SetMaxOpenConns(1) → SetMaxOpenConns(4) │ │ ├─ [KEEP] agents, shares, jobs, builds │ │ ├─ [KEEP] audit_log, fleet_tasks │ │ ├─ [KEEP] campaign_hits, cred_edges │ │ ├─ [KEEP] strain_memory, strain_cards (fleet intelligence) │ │ ├─ [KEEP] subnet_discoveries, recon_scans │ │ ├─ [OPTIONAL] pathtrace_sessions (trim >7d) │ │ ├─ [OPTIONAL] oath_ledger (disable by config) │ │ ├─ [OPTIONAL] recon_canary (disable by config) │ │ └─ [DELETE] ai_decisions (when AI removed) │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## Phase 1: Feature Removal — Exact File Paths ### 1A. Remove AWS Cloud Features **Directories to DELETE:** ``` F:\AGENT\AetherForge\server\internal\erasure\ F:\AGENT\AetherForge\server\internal\fargate\ ``` **Files to DELETE:** ``` F:\AGENT\AetherForge\server\internal\api\fargate_burst.go F:\AGENT\AetherForge\server\internal\api\fargate_burst_test.go F:\AGENT\AetherForge\server\internal\api\erasure_swarm.go F:\AGENT\AetherForge\server\internal\api\erasure_swarm_test.go F:\AGENT\AetherForge\server\internal\api\erasure_auth.go F:\AGENT\AetherForge\server\internal\api\erasure_auth_test.go F:\AGENT\AetherForge\server\internal\api\fleet_torrent_manifest.go F:\AGENT\AetherForge\server\internal\api\fleet_torrent_manifest_test.go F:\AGENT\AetherForge\server\internal\api\deploy_plan_s3_swarm.go F:\AGENT\AetherForge\server\internal\api\deploy_plan_s3_swarm_test.go F:\AGENT\AetherForge\server\internal\api\deploy_plan_erasure.go F:\AGENT\AetherForge\server\internal\api\deploy_plan_erasure_test.go F:\AGENT\AetherForge\server\internal\api\spread_s3_crr.go F:\AGENT\AetherForge\server\internal\api\spread_s3_crr_test.go ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\server\main.go → Line 26: Remove "crypto-miner-server/internal/erasure" → Line 26: Remove "crypto-miner-server/internal/fargate" → Remove erasure.Start() calls → Remove fargate.Init() calls F:\AGENT\AetherForge\server\internal\api\router.go → Search for "AttachS3Swarm" route → DELETE handler → Search for "AttachCloudMapRouteVia" → DELETE handler → Search for "FargateBurst" → DELETE handler → Search for "ErasureAuth" → DELETE handler F:\AGENT\AetherForge\server\internal\api\deploy_plan.go → Remove S3 swarm attachment logic → Remove Fargate export logic F:\AGENT\AetherForge\server\internal\db\sqlite.go → Remove CREATE TABLE for erasure-related tables (if any) ``` **UI Files to MODIFY:** ``` F:\AGENT\AetherForge\server\web\src\pages\EmberwakePage.tsx → Remove Cloud Spread panel section (~100 LOC) → Remove S3/CloudFront tabs F:\AGENT\AetherForge\server\web\src\pages\CalibratePage.tsx → Remove AWS credentials section (Access Key, Secret, etc.) → Remove Cloudfront signing key section ``` **Test Files to DELETE:** ``` All files matching: server/internal/api/*s3*test.go All files matching: server/internal/api/*fargate*test.go All files matching: server/internal/api/*erasure*test.go All files matching: server/internal/erasure/*test.go All files matching: server/internal/fargate/*test.go ``` --- ### 1B. Remove AI Control Features **Directory to DELETE:** ``` F:\AGENT\AetherForge\server\internal\ai\ (all 29 files including court_chamber*.go, scheduler.go, commands.go, etc.) ``` **Files to DELETE:** ``` F:\AGENT\AetherForge\server\internal\api\fleet_ai_bridge.go F:\AGENT\AetherForge\server\internal\api\court_chamber_bridge.go ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\server\main.go → Line 25: Remove "crypto-miner-server/internal/ai" → Line ~150–170: Remove fleetai.StartScheduler() call → Remove ai initialization goroutines F:\AGENT\AetherForge\server\internal\api\router.go → Search for "/api/v1/ai/*" → DELETE all routes → DELETE routes: - GET /api/v1/ai/decisions - POST /api/v1/ai/court-session - PUT /api/v1/agent/decide F:\AGENT\AetherForge\server\internal\config.go (or LoadConfig) → Remove AIControlEnabled config option → Remove AIPersona enum → Remove AIEndpoint URL setting ``` **UI Files to DELETE:** ``` Anything under: F:\AGENT\AetherForge\server\web\src\help\*ai* OR F:\AGENT\AetherForge\server\web\src\components\*Court* ``` **UI Files to MODIFY:** ``` F:\AGENT\AetherForge\server\web\src\pages\CalibratePage.tsx → Remove "AI Control" section (entire toggle block) → Remove AI Persona selector (Aggressive/Silent/Passive/etc.) → Remove AI Endpoint URL input F:\AGENT\AetherForge\server\web\src\pages\CruciblePage.tsx → Remove AI Decision panel from LOTL Timeline tab → Remove court-session UI components F:\AGENT\AetherForge\server\web\src\context\WebSocketProvider.tsx → Remove aiActivity state → Remove AI decision WS message handler ``` --- ### 1C. Disable Mesh P2P Networking **Agent-side Files to DELETE:** ``` F:\AGENT\AetherForge\agent\client\mesh_p2p.go F:\AGENT\AetherForge\agent\client\mesh_p2p_stub.go ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\agent\client\main.go → Remove mesh initialization code → Remove "-tags p2p" build instructions F:\AGENT\AetherForge\agent\config\builtin.go → Remove mesh-related config fields (if exposed) F:\AGENT\AetherForge\server\web\src\pages\ForgePage.tsx → Remove "Mesh Networking" checkbox from Forge builder ``` **Build Documentation to UPDATE:** ``` F:\AGENT\AetherForge\README.md → Remove Mesh Networking section → Remove "-tags p2p" build instructions ``` --- ## Phase 2: Architectural Refactoring — File Structure ### 2A. WebSocket Context Split **New Files to CREATE:** ``` F:\AGENT\AetherForge\server\web\src\context\StatsContext.tsx (100 LOC) - Manages: agents, recentShares, fleetAlerts - Update frequency: 250ms (coalesced WS batches) - Exported hook: useStatsContext() F:\AGENT\AetherForge\server\web\src\context\CommandContext.tsx (80 LOC) - Manages: commandResults, policyAcks - Update frequency: Per-command (sparse) - Exported hook: useCommandContext() F:\AGENT\AetherForge\server\web\src\hooks\useAgents.ts (50 LOC) - Selector hook: returns agents from StatsContext - Memoized: useCallback ensures same reference across renders F:\AGENT\AetherForge\server\web\src\hooks\useAgentById.ts (60 LOC) - Selector hook: returns single agent by ID - Memoized with useMemo to prevent re-renders on siblings change F:\AGENT\AetherForge\server\web\src\hooks\useCommandResults.ts (50 LOC) - Selector hook: returns command results with ring-buffer awareness - Track by _seq instead of array index ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\server\web\src\context\WebSocketProvider.tsx → Refactor to initialize both StatsContext + CommandContext → Delegate state updates to child contexts → Keep as top-level connection manager only (~150 LOC, down from 339) F:\AGENT\AetherForge\server\web\src\pages\DashboardPage.tsx → Change: useWebSocketContext() → useStatsContext() → Add memoization: React.memo() F:\AGENT\AetherForge\server\web\src\pages\CruciblePage.tsx → Change: useWebSocketContext() → useCommandContext() (for results) → Change: useWebSocketContext() → useStatsContext() (for agents) → Wrap subsections in React.memo() F:\AGENT\AetherForge\server\web\src\components\Fleet/*.tsx (30+ files) → Replace useWebSocketContext() with specific hooks (useAgents, useAgentById) → Wrap heavy rows in React.memo() ``` --- ### 2B. CruciblePage Component Split **New Files to CREATE:** ``` F:\AGENT\AetherForge\server\web\src\components\Crucible\CrucibleTerminal.tsx (400 LOC) - Extracted from CruciblePage - Props: selectedAgents, onCommand(agentId, text) - State: command history, output buffer F:\AGENT\AetherForge\server\web\src\components\Crucible\CrucibleHeatMap.tsx (200 LOC) - Extracted from CruciblePage - Props: agents, selectedId, onSelect - State: color mapping, topology toggle F:\AGENT\AetherForge\server\web\src\components\Crucible\CrucibleRoster.tsx (250 LOC) - Extracted from CruciblePage - Props: agents, onSelect, onBulkCommand - State: expand inline, bulk select checkbox F:\AGENT\AetherForge\server\web\src\components\Crucible\tabs\LotlTimelineTab.tsx (250 LOC) - Extracted from CruciblePage - Props: selectedAgents, agents - Lazy-load: only render when tab active F:\AGENT\AetherForge\server\web\src\components\Crucible\tabs\AccessDepthTab.tsx (200 LOC) - Extracted from CruciblePage - Props: selectedAgent (single) - Lazy-load F:\AGENT\AetherForge\server\web\src\components\Crucible\tabs\SpreadTab.tsx (180 LOC) - Extracted from CruciblePage - Props: selectedAgents, agents - Lazy-load ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\server\web\src\pages\CruciblePage.tsx → Reduce from 1,851 to ~300 LOC (coordinator only) → Route by tab: ?tab=onion|access|spread → Lazy-load tab components: const LotlTab = lazy(() => import(...)) → Render only active tab to avoid re-renders ``` --- ### 2C. SQLite Optimization **Files to CREATE:** ``` F:\AGENT\AetherForge\server\internal\db\hashrate_batch.go (150 LOC) - New type: HashrateBatcher - Batches hashrate inserts every 5 seconds - Auto-flushes on shutdown - Provides: Add(), Flush(), Stop() ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\server\internal\db\sqlite.go → Line 33: Change SetMaxOpenConns(1) → SetMaxOpenConns(4) → Add PRAGMA settings in DSN: _pragma=synchronous(NORMAL) _pragma=cache_size(-64000) _pragma=mmap_size(30000000) F:\AGENT\AetherForge\server\internal\api\websocket.go → Line ~XX (stats handler): Replace single INSERT with batch → Create HashrateBatcher instance on hub init → Call batcher.Add() in stats_batch handler → Call batcher.Stop() on server shutdown F:\AGENT\AetherForge\server\main.go → Add batcher.Stop() in defer chain before db.Close() ``` --- ## Phase 3: Build Optimization ### 3A. Go Build Tags (Optional) **New Build Profiles:** ```bash # Core mining only (smallest binary) go build -o agent-core.exe agent/cmd/main.go # With adaptive intelligence go build -tags "strategy,atlas" -o agent-smart.exe agent/cmd/main.go # Full featured (legacy, rarely used) go build -tags "p2p,gpu,advanced" -o agent-full.exe agent/cmd/main.go ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\agent\client\main.go → Wrap optional feature init in build-tag conditional: //go:build p2p // +build p2p func initMeshP2P() { ... } F:\AGENT\AetherForge\server\web\src\pages\ForgePage.tsx → Add profile selector dropdown (Core/Smart/Full) → Default: Core ``` --- ### 3B. Dashboard Code Splitting **Files to MODIFY:** ``` F:\AGENT\AetherForge\server\web\vite.config.ts → Add manual chunks: build: { rollupOptions: { output: { manualChunks: { 'crucible': ['src/pages/CruciblePage.tsx'], 'emberwake': ['src/pages/EmberwakePage.tsx'], 'forge': ['src/pages/ForgePage.tsx'], 'three': ['three'] // Separate Three.js vendor chunk } } } } F:\AGENT\AetherForge\server\web\src\pages\DashboardPage.tsx → Import FleetTopologyMap as lazy: const FleetTopologyMap = lazy(() => import('../components/Fleet/FleetTopologyMap')) → Wrap in F:\AGENT\AetherForge\server\web\src\components\Layout\MatrixRain.tsx → Replace Three.js particles with CSS-only version (if not critical) → Or: Keep Three.js but lazy-load only when "Advanced Mode" toggled ``` --- ## Phase 4: Database Retention **Files to CREATE:** ``` F:\AGENT\AetherForge\server\internal\maintenance\retention.go (200 LOC) - New function: PruneHashrateSamples() - Rules: * Keep raw: 24 hours * Aggregate to 1-min: 7 days * Aggregate to 1-hour: 90 days * Delete older than 90 days ``` **Files to MODIFY:** ``` F:\AGENT\AetherForge\server\internal\db\sqlite.go → Add Hashrate aggregation tables: CREATE TABLE IF NOT EXISTS hashrate_1m (...) CREATE TABLE IF NOT EXISTS hashrate_1h (...) F:\AGENT\AetherForge\server\main.go → Call maintenance.StartRetentionJobs() on startup → Job runs every 1 hour (purge + aggregate) ``` --- ## Performance Impact Summary | Operation | Before | After | Gain | |-----------|--------|-------|------| | **Binary size (MB)** | 35 | 15 | 57% ↓ | | **Server memory (500 agents, GB)** | 0.8 | 0.4 | 50% ↓ | | **Database size (GB)** | 0.5 | 0.1 | 80% ↓ | | **Dashboard load (sec)** | 3 | 1.5 | 50% ↓ | | **Stats re-renders/sec** | 8–10 | 1–2 | 80% ↓ | | **DB writes/min (500 agents)** | 500 | 1–2 | 99% ↓ | | **Max stable fleet size** | 500 | 1500+ | 3x ↑ | --- ## Testing Checklist After each modification, verify: - [ ] `go test ./...` passes (all server tests) - [ ] `npm test` passes (all React component tests) - [ ] `npm run build` completes (no TypeScript errors) - [ ] Dashboard loads at localhost:8989 (no blank screen) - [ ] Forge compiles an agent (Windows/Linux/macOS) - [ ] Agent connects to server (WS handshake succeeds) - [ ] Mining starts (hashrate > 0) - [ ] Crucible terminal responds to commands - [ ] No console errors (F12 DevTools) - [ ] Memory stable over 5 minutes (no leaks) --- ## Risk & Rollback Strategy **If issues arise:** 1. **Feature removal breaks compilation** → Restore deleted files from git, remove only code references 2. **WebSocket refactor causes re-render storms** → Revert to single context, implement selector hooks incrementally 3. **Database batching loses data** → Disable batching, revert to single-insert, investigate WAL corruption 4. **Component split causes layout breakage** → Restore CruciblePage, apply memoization only 5. **Build optimization increases binary** → Remove manual chunks, leave lazy-loading only **All changes committed individually** so any phase can be rolled back independently. --- ## Next Steps 1. **Create feature branch:** `git checkout -b streamline/phase-1` 2. **Execute Phase 1** (feature removal) — 2 days 3. **Code review + QA** — 1 day 4. **Merge to main** 5. **Repeat for Phases 2–5** **Total timeline:** 3 weeks (all phases) or 2 weeks (Phases 1–2 only, MVP).