- Document build cache accumulation problem (40-50 GB typical)
- Add cleanup commands: image prune, builder prune, volume prune
- Recommend running after each deployment or weekly
- Typical space freed: 40-55 GB per cleanup
- Clarify what's safe vs not safe to delete
- Part of maintaining healthy development environment
- Added /api/trading/sync-positions endpoint to key endpoints list
- Updated retryWithBackoff baseDelay from 2s to 5s with rationale
- Added DNS retry vs rate limit retry distinction (2s vs 5s)
- Updated Position Manager section with startup validation and rate limit-aware exit
- Referenced docs/HELIUS_RATE_LIMITS.md for detailed analysis
- All documentation now reflects Nov 14, 2025 fixes for orphaned positions
Updated documentation to reflect critical bug found and fixed:
SIGNAL_QUALITY_OPTIMIZATION_ROADMAP.md:
- Added bug fix commit (795026a) to Phase 1.5
- Documented price source (Pyth price monitor)
- Added validation and logging details
- Included Known Issues section with real incident details
- Updated monitoring examples with detailed price logging
.github/copilot-instructions.md:
- Added Common Pitfall #31: Flip-flop price context bug
- Documented root cause: currentPrice undefined in check-risk
- Real incident: Nov 14 06:05, -$1.56 loss from false positive
- Two-part fix with code examples (price fetch + validation)
- Lesson: Always validate financial calculation inputs
- Monitoring guidance: Watch for flip-flop price check logs
This ensures future AI agents and developers understand:
1. Why Pyth price fetch is needed in check-risk
2. Why validation before calculation is critical
3. The real financial impact of missing validation
- Added 'When Making Changes' item #12: Git commit and push
- Make git workflow mandatory after ANY feature/fix/change
- User should not have to ask - it's part of completion
- Include commit message format and types (feat/fix/docs/refactor)
- Emphasize: code only exists when committed and pushed
- Update trade count: 161 -> 168 (as of Nov 14, 2025)
- Auto-close phantom positions immediately via market order
- Return HTTP 200 (not 500) to allow n8n workflow continuation
- Save phantom trades to database with full P&L tracking
- Exit reason: 'manual' category for phantom auto-closes
- Protects user during unavailable hours (sleeping, no phone)
- Add Docker build best practices to instructions (background + tail)
- Document phantom system as Critical Component #1
- Add Common Pitfall #30: Phantom notification workflow
Why auto-close:
- User can't always respond to phantom alerts
- Unmonitored position = unlimited risk exposure
- Better to exit with small loss/gain than leave exposed
- Re-entry possible if setup actually good
Files changed:
- app/api/trading/execute/route.ts: Auto-close logic
- .github/copilot-instructions.md: Documentation + build pattern
Added documentation for two critical fixes:
1. Database-First Pattern (Pitfall #27):
- Documents the unprotected position bug from today
- Explains why database save MUST happen before Position Manager add
- Includes fix code example and impact analysis
- References CRITICAL_INCIDENT_UNPROTECTED_POSITION.md
2. DNS Retry Logic (Pitfall #28):
- Documents automatic retry for transient DNS failures
- Explains EAI_AGAIN, ENOTFOUND, ETIMEDOUT handling
- Includes retry code example and success logs
- 99% of DNS failures now auto-recover
Also updated Execute Trade workflow to highlight critical execution order
with explanation of why it's a safety requirement, not just a convention.
CHANGE: MIN_QUALITY_SCORE lowered from 65 to 60
REASON: Data analysis of 161 trades showed score 60-64 tier
significantly outperformed higher quality scores:
- 60-64: 2 trades, +$45.78 total, 100% WR, +$22.89 avg/trade
- 65-69: 13 trades, +$28.28 total, 53.8% WR, +$2.18 avg/trade
PARADOX DISCOVERED: Higher quality scores don't correlate with
better trading results in current data. Stricter 65 threshold
was blocking profitable 60-64 range setups.
EXPECTED IMPACT:
- 2-3 additional trades per week in 60-64 quality range
- Estimated +$46-69 weekly profit potential based on avg
- Enables blocked signal collection at 55-59 range for Phase 2
- Win rate should remain 50%+ (60-64 tier is 100%, 65-69 is 53.8%)
RISK MANAGEMENT:
- Small sample size (2 trades at 60-64) could be outliers
- Downside limited - can raise back to 65 if performance degrades
- Will monitor first 10 trades at new threshold closely
Added as Common Pitfall #25 with full SQL analysis details.
Updated references in Mission section and Signal Quality System
description to reflect new 60+ threshold.
Added comprehensive "VERIFICATION MANDATE" section requiring proof
before declaring features working. This addresses pattern of bugs
slipping through despite documentation.
NEW SECTION INCLUDES:
- Core principle: "working" = verified with real data, not code review
- Critical path verification checklists for:
* Position Manager changes (test trade + logs + SQL verification)
* Exit logic changes (expected vs actual behavior)
* API endpoint changes (curl + database + notifications)
* Calculation changes (verbose logging + SQL validation)
* SDK integration (never trust docs, verify with console.log)
- Red flags requiring extra verification (unit conversions, state
transitions, config precedence, display values, timing logic)
- SQL verification queries for Position Manager and P&L calculations
- Real example: How position.size bug should have been caught with
one console.log statement showing tokens vs USD mismatch
- Deployment checklist: code review → tests → logs → database →
edge cases → documentation → user notification
- When to escalate: Don't say "it's working" without proof
UPDATED "When Making Changes" section:
#9: Position Manager changes require test trade + log monitoring + SQL
#10: Calculation changes require verbose logging + SQL verification
This creates "prove it works" culture vs "looks like it works".
Root cause of recent bugs: confirmation bias without verification.
- position.size tokens vs USD: looked right, wasn't tested
- leverage display: looked right, notification showed wrong value
- Both would've been caught with one test trade + log observation
Impact: At $97.55 capital with 15x leverage, each bug costs 5-20%
of account. Verification mandate makes this unacceptable going forward.
Added 'Mission & Financial Goals' section at the top to provide critical
context for AI agents making decisions:
**Current Phase Context:**
- Starting capital: $106 (+ $1K deposit in 2 weeks)
- Target: $2,500 by Month 2.5
- Strategy: Aggressive compounding, 0 withdrawals
- Position sizing: 100% of account at 20x leverage
- Win target: 20-30% monthly returns
**Why This Matters:**
- Every dollar counts - optimize for profitability
- User needs $300-500/month withdrawals starting Month 3
- No changes that reduce win rate unless they improve profit factor
- System must prove itself before scaling
**Key Constraints:**
- Can't afford extended drawdowns (limited capital)
- Must maintain 60%+ win rate to compound effectively
- Quality > quantity (70+ signal scores only)
- Stop after 3 consecutive losses
Also added 'Financial Roadmap Integration' subsection linking technical
improvements to phase objectives (Phase 1: prove system, Phase 2-3:
sustainable growth + withdrawals, Phase 4+: scale + reduce risk).
This ensures future AI agents understand the YOLO/recovery context and
prioritize profitability over conservative safety during Phase 1.
Added SQL Analysis Queries section with:
- Phase 1 monitoring queries (count, score distribution, recent signals)
- Phase 2 comparison queries (blocked vs executed trades)
- Pattern analysis queries (range extremes, ADX distribution)
Benefits:
- AI agents have immediate access to standard queries
- Consistent analysis approach each time
- No need to context-switch to separate docs
- Quick reference for common investigations
Includes usage pattern guidance and reference to full docs.
- Added BlockedSignal to database models list
- Updated signalQualityVersion to v4 (current)
- Added blocked signals tracking functions to database section
- Updated check-risk endpoint description
- Added Signal Quality Optimization Roadmap reference
- Documented blocked signals analysis workflow
- Added reference to BLOCKED_SIGNALS_TRACKING.md
This ensures AI agents understand the new data collection system.
BUG FOUND:
Line 558: tp2SizePercent: config.takeProfit2SizePercent || 100
When config.takeProfit2SizePercent = 0 (TP2-as-runner system), JavaScript's ||
operator treats 0 as falsy and falls back to 100, causing TP2 to close 100%
of remaining position instead of activating trailing stop.
IMPACT:
- On-chain orders placed correctly (line 481 uses ?? correctly)
- Position Manager reads from DB and expects TP2 to close position
- Result: User sees TWO take-profit orders instead of runner system
FIX:
Changed both tp1SizePercent and tp2SizePercent to use ?? operator:
- tp1SizePercent: config.takeProfit1SizePercent ?? 75
- tp2SizePercent: config.takeProfit2SizePercent ?? 0
This allows 0 value to be saved correctly for TP2-as-runner system.
VERIFICATION NEEDED:
Current open SHORT position in database has tp2SizePercent=100 from before
this fix. Next trade will use correct runner system.
- New /api/trading/sync-positions endpoint (no auth)
- Fetches actual Drift positions and compares with Position Manager
- Removes stale tracking, adds missing positions with calculated TP/SL
- Settings UI: Orange 'Sync Positions' button added
- CLI script: scripts/sync-positions.sh for terminal access
- Full documentation in docs/guides/POSITION_SYNC_GUIDE.md
- Quick reference: POSITION_SYNC_QUICK_REF.md
- Updated AI instructions with pitfall #23
Problem solved: Manual Telegram trades with partial fills can cause
Position Manager to lose tracking, leaving positions without software-
based stop loss protection. This feature restores dual-layer protection.
Note: Docker build not picking up route yet (cache issue), needs investigation
- Updated Signal Quality System to reflect MIN_SIGNAL_QUALITY_SCORE is configurable (default: 65)
- Added critical pitfall #7: Never use hardcoded config values in endpoints
- Emphasized settings page can modify minSignalQualityScore dynamically
- Renumbered remaining pitfalls for clarity
- Add market data cache service (5min expiry) for storing TradingView metrics
- Create /api/trading/market-data webhook endpoint for continuous data updates
- Add /api/analytics/reentry-check endpoint for validating manual trades
- Update execute endpoint to auto-cache metrics from incoming signals
- Enhance Telegram bot with pre-execution analytics validation
- Support --force flag to override analytics blocks
- Use fresh ADX/ATR/RSI data when available, fallback to historical
- Apply performance modifiers: -20 for losing streaks, +10 for winning
- Minimum re-entry score 55 (vs 60 for new signals)
- Fail-open design: proceeds if analytics unavailable
- Show data freshness and source in Telegram responses
- Add comprehensive setup guide in docs/guides/REENTRY_ANALYTICS_QUICKSTART.md
Phase 1 implementation for smart manual trade validation.
- Fix P&L calculation in Position Manager to use actual entry vs exit price instead of SDK's potentially incorrect realizedPnL
- Calculate actual profit percentage and apply to closed position size for accurate dollar amounts
- Update database record for last trade from incorrect 6.58 to actual .66 P&L
- Update .github/copilot-instructions.md to reflect TP2-as-runner system changes
- Document 25% runner system (5x larger than old 5%) with ATR-based trailing
- Add critical P&L calculation pattern to common pitfalls section
- Mark Phase 5 complete in development roadmap
- Added signalQualityVersion field documentation (v1/v2/v3 tracking)
- Documented /api/analytics/version-comparison endpoint
- Added Prisma Decimal type handling pitfall (#18)
- Added signal quality version tracking section to Development Roadmap
- References SQL analysis file for version comparison queries
Enables AI agents to understand the version tracking system for
data-driven algorithm optimization.
- Added signalQualityVersion field to Trade model
- Tracks which scoring logic version was used for each trade
- v1: Original logic (price position < 5% threshold)
- v2: Added volume compensation for low ADX
- v3: CURRENT - Stricter logic requiring ADX > 18 for extreme positions (< 15%)
This enables future analysis to:
- Compare performance between logic versions
- Filter trades by scoring algorithm
- Data-driven improvements based on clean datasets
All new trades will be marked as v3. Old trades remain null/v1 for comparison.
Added documentation for recent improvements:
- MAE/MFE tracking for trade optimization
- On-chain order synchronization after TP1 hits
- Exit reason detection using trade state flags (not current price)
- Per-symbol cooldown to avoid missing opportunities
- Quality score integration in analytics dashboard
Updated workflows and pitfalls sections with lessons learned from debugging session
- Add qualityScore to ExecuteTradeResponse interface and response object
- Update analytics page to always show Signal Quality card (N/A if unavailable)
- Fix n8n workflow to pass context metrics and qualityScore to execute endpoint
- Fix timezone in Telegram notifications (Europe/Berlin)
- Fix symbol normalization in /api/trading/close endpoint
- Update Drift ETH-PERP minimum order size (0.002 ETH not 0.01)
- Add transaction confirmation to closePosition() to prevent phantom closes
- Add 30-second grace period for new trades in Position Manager
- Fix execution order: database save before Position Manager.addTrade()
- Update copilot instructions with transaction confirmation pattern
- Added telegram_command_bot.py with slash commands (/buySOL, /sellBTC, etc)
- Docker compose setup with DNS configuration
- Sends trades as plain text to n8n webhook (same format as TradingView)
- Improved Telegram success message formatting
- Only responds to authorized chat ID (579304651)
- Commands: /buySOL, /sellSOL, /buyBTC, /sellBTC, /buyETH, /sellETH