**Root Causes:** 1. Auto-flip logic could create phantom trades if close failed 2. Position size mismatches (0.01 SOL vs 11.92 SOL expected) not caught 3. Multiple trades for same symbol+direction in database **Preventive Measures:** 1. **Startup Validation (lib/startup/init-position-manager.ts)** - Validates all open trades against Drift positions on startup - Auto-closes phantom trades with <50% expected size - Logs size mismatches for manual review - Prevents Position Manager from tracking ghost positions 2. **Duplicate Position Prevention (app/api/trading/execute/route.ts)** - Blocks opening same-direction position on same symbol - Returns 400 error if duplicate detected - Only allows auto-flip (opposite direction close + open) 3. **Runtime Phantom Detection (lib/trading/position-manager.ts)** - Checks position size every 2s monitoring cycle - Auto-closes if size ratio <50% (extreme mismatch) - Logs as 'manual' exit with AUTO_CLEANUP tx - Removes from monitoring immediately 4. **Quality Score Fix (app/api/trading/check-risk/route.ts)** - Hardcoded minScore=60 (removed non-existent config reference) **Prevention Summary:** - ✅ Startup validation catches historical phantoms - ✅ Duplicate check prevents new phantoms - ✅ Runtime detection catches size mismatches <30s after they occur - ✅ All three layers work together for defense-in-depth Issue: User had LONG (phantom) + SHORT (undersized 0.01 SOL vs 11.92 expected) Fix: Both detected and closed, bot now clean with 0 active trades
36 KiB
36 KiB