Files
AI-Trader/CHANGELOG.md
2025-11-07 21:04:00 -05:00

33 KiB

Changelog

All notable changes to the AI-Trader-Server project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

[0.5.0] - 2025-11-07

Added

  • Comprehensive Test Coverage Improvements - Increased coverage from 61% to 84.81% (+23.81 percentage points)
    • 406 passing tests (up from 364 with 42 failures)
    • Added 57 new tests across 7 modules
    • New test suites:
      • tools/general_tools.py: 26 tests (97% coverage) - config management, conversation extraction
      • tools/price_tools.py: 11 tests - NASDAQ symbol validation, weekend date handling
      • api/price_data_manager.py: 12 tests (85% coverage) - date expansion, prioritization, progress callbacks
      • api/routes/results_v2.py: 3 tests (98% coverage) - validation, deprecated parameters
      • agent/reasoning_summarizer.py: 2 tests (87% coverage) - trade formatting, error handling
      • api/routes/period_metrics.py: 2 tests (100% coverage) - edge cases
      • agent/mock_provider: 1 test (100% coverage) - string representation
  • Database Connection Management - Context manager pattern to prevent connection leaks
    • New db_connection() context manager for guaranteed cleanup
    • Updated 16+ test files to use context managers
    • Fixes 42 test failures caused by SQLite database locking
  • Date Range Support in /results Endpoint - Query multiple dates in single request with period performance metrics
    • start_date and end_date parameters replace deprecated date parameter
    • Returns lightweight format with daily portfolio values and period metrics for date ranges
    • Period metrics: period return %, annualized return %, calendar days, trading days
    • Default to last 30 days when no dates provided (configurable via DEFAULT_RESULTS_LOOKBACK_DAYS)
    • Automatic edge trimming when requested range exceeds available data
    • Per-model results grouping
  • Environment Variable: DEFAULT_RESULTS_LOOKBACK_DAYS - Configure default lookback period (default: 30)

Changed

  • BREAKING: /results endpoint parameter date removed - use start_date/end_date instead
    • Single date: ?start_date=2025-01-16 or ?end_date=2025-01-16
    • Date range: ?start_date=2025-01-16&end_date=2025-01-20
    • Old ?date=2025-01-16 now returns 422 error with migration instructions
  • Database schema improvements:
    • Added CHECK constraint for action_type field (must be 'buy', 'sell', or 'hold')
    • Added ON DELETE CASCADE to trading_days foreign key
    • Updated drop_all_tables() to match new schema (trading_days, actions vs old positions, trading_sessions)

Fixed

  • Critical: Database connection leaks causing 42 test failures
    • Root cause: Tests opened SQLite connections but didn't close them on failures
    • Solution: Created db_connection() context manager with guaranteed cleanup in finally block
    • All test files updated to use context managers
  • Test suite SQL statement errors:
    • Updated INSERT statements with all required fields (config_path, date_range, models, created_at)
    • Fixed SQL binding mismatches in test fixtures
  • API integration test failures:
    • Fixed date parameter handling for new results endpoint
    • Updated test assertions for API field name changes

Migration Guide

Before:

GET /results?date=2025-01-16&model=gpt-4

After:

# Option 1: Use start_date only
GET /results?start_date=2025-01-16&model=gpt-4

# Option 2: Use both (same result for single date)
GET /results?start_date=2025-01-16&end_date=2025-01-16&model=gpt-4

# New: Date range queries
GET /results?start_date=2025-01-16&end_date=2025-01-20&model=gpt-4

Python Client:

# OLD (will break)
results = client.get_results(date="2025-01-16")

# NEW
results = client.get_results(start_date="2025-01-16")
results = client.get_results(start_date="2025-01-16", end_date="2025-01-20")

[0.4.3] - 2025-11-07

Fixed

  • Critical: Fixed cross-job portfolio continuity bug where subsequent jobs reset to initial position
    • Root cause: Two database query functions (get_previous_trading_day() and get_starting_holdings()) filtered by job_id, preventing them from finding previous day's position when queried from a different job
    • Impact: New jobs on consecutive dates would start with $10,000 cash and empty holdings instead of continuing from previous job's ending position (e.g., Job 2 on 2025-10-08 started with $10,000 instead of $329.825 cash and lost all stock holdings from Job 1 on 2025-10-07)
    • Solution: Removed job_id filters from SQL queries to enable cross-job position lookups, matching the existing design in get_current_position_from_db() which already supported cross-job continuity
    • Fix ensures complete portfolio continuity (both cash and holdings) across jobs for the same model
    • Added comprehensive test coverage with test_get_previous_trading_day_across_jobs and test_get_starting_holdings_across_jobs
    • Locations: api/database.py:622-630 (get_previous_trading_day), api/database.py:674-681 (get_starting_holdings), tests/unit/test_database_helpers.py:133-169,265-316

[0.4.2] - 2025-11-07

Fixed

  • Critical: Fixed negative cash position bug where trades calculated from initial capital instead of accumulating
    • Root cause: MCP tools return CallToolResult objects with position data in structuredContent field, but ContextInjector was checking isinstance(result, dict) which always failed
    • Impact: Each trade checked cash against initial $10,000 instead of cumulative position, allowing over-spending and resulting in negative cash balances (e.g., -$8,768.68 after 11 trades totaling $18,768.68)
    • Solution: Updated ContextInjector to extract position dict from CallToolResult.structuredContent before validation
    • Fix ensures proper intra-day position tracking with cumulative cash checks preventing over-trading
    • Updated unit tests to mock CallToolResult objects matching production MCP behavior
    • Locations: agent/context_injector.py:95-109, tests/unit/test_context_injector.py:26-53
  • Enabled MCP service logging by redirecting stdout/stderr from /dev/null to main process for better debugging
    • Previously, all MCP tool debug output was silently discarded
    • Now visible in docker logs for diagnosing parameter injection and trade execution issues
    • Location: agent_tools/start_mcp_services.py:81-88

Fixed

  • Critical: Fixed stale jobs blocking new jobs after Docker container restart
    • Root cause: Jobs with status 'pending', 'downloading_data', or 'running' remained in database after container shutdown, preventing new job creation
    • Solution: Added cleanup_stale_jobs() method that runs on FastAPI startup to mark interrupted jobs as 'failed' or 'partial' based on completion percentage
    • Intelligent status determination: Uses existing progress tracking (completed/total model-days) to distinguish between failed (0% complete) and partial (>0% complete)
    • Detailed error messages include original status and completion counts (e.g., "Job interrupted by container restart (was running, 3/10 model-days completed)")
    • Incomplete job_details automatically marked as 'failed' with clear error messages
    • Deployment-aware: Skips cleanup in DEV mode when database is reset, always runs in PROD mode
    • Comprehensive test coverage: 6 new unit tests covering all cleanup scenarios
    • Locations: api/job_manager.py:702-779, api/main.py:164-168, tests/unit/test_job_manager.py:451-609
  • Fixed Pydantic validation errors when using DeepSeek models via OpenRouter
    • Root cause: LangChain's parse_tool_call() has a bug where it sometimes returns args as JSON string instead of parsed dict object
    • Solution: Added ToolCallArgsParsingWrapper that:
      1. Patches parse_tool_call() to detect and fix string args by parsing them to dict
      2. Normalizes non-standard tool_call formats (e.g., {name, args, id}{function: {name, arguments}, id})
    • The wrapper is defensive and only acts when needed, ensuring compatibility with all AI providers
    • Fixes validation error: tool_calls.0.args: Input should be a valid dictionary [type=dict_type, input_value='...', input_type=str]

[0.4.1] - 2025-11-06

Fixed

  • Fixed "No trading" message always displaying despite trading activity by initializing IF_TRADE to True (trades expected by default)
  • Root cause: IF_TRADE was initialized to False in runtime config but never updated when trades executed

Note

  • ChatDeepSeek integration was reverted as it conflicts with OpenRouter unified gateway architecture
  • System uses OPENAI_API_BASE (OpenRouter) with single OPENAI_API_KEY for all providers
  • Sporadic DeepSeek validation errors appear to be transient and do not require code changes

[0.4.0] - 2025-11-05

BREAKING CHANGES

Schema Migration: Old Tables Removed

The following database tables have been removed and replaced with new schema:

Removed Tables:

  • trading_sessions → Replaced by trading_days
  • positions (old action-centric version) → Replaced by trading_days + actions + holdings
  • reasoning_logs → Replaced by trading_days.reasoning_full (JSON column)

Migration Required:

  • If you have existing data in old tables, export it before upgrading
  • New installations automatically use new schema
  • Old data cannot be automatically migrated (different data model)

Database Path:

  • Production: data/trading.db
  • Development: data/trading_dev.db

To migrate existing production database:

# Run migration script to drop old tables
PYTHONPATH=. python api/migrations/002_drop_old_schema.py

API Endpoint Removed: /reasoning

The /reasoning endpoint has been removed and replaced by /results with reasoning parameter.

Migration Guide:

Old Endpoint New Endpoint
GET /reasoning?job_id=X GET /results?job_id=X&reasoning=summary
GET /reasoning?job_id=X&include_full_conversation=true GET /results?job_id=X&reasoning=full

Benefits of New Endpoint:

  • Day-centric structure (easier to understand portfolio progression)
  • Daily P&L metrics included
  • AI-generated reasoning summaries (2-3 sentences)
  • Unified data model

Response Structure Changes:

Old /reasoning returned:

{
  "sessions": [
    {
      "session_id": 1,
      "positions": [{"action_id": 0, "cash_after": 10000, ...}],
      "conversation": [...]
    }
  ]
}

New /results?reasoning=full returns:

{
  "results": [
    {
      "date": "2025-01-15",
      "starting_position": {"holdings": [], "cash": 10000},
      "daily_metrics": {"profit": 0.0, "return_pct": 0.0},
      "trades": [{"action_type": "buy", "symbol": "AAPL", ...}],
      "final_position": {"holdings": [...], "cash": 8500},
      "reasoning": [...]
    }
  ]
}

Removed

  • /reasoning endpoint (use /results?reasoning=full instead)
  • Old database tables: trading_sessions, positions, reasoning_logs
  • Pydantic models: ReasoningMessage, PositionSummary, TradingSessionResponse, ReasoningResponse
  • Old-schema tests for deprecated tables

Added

  • Daily P&L Calculation System - Accurate profit/loss tracking with normalized database schema
    • New trading_days table for day-centric trading results with daily P&L metrics
    • holdings table for portfolio snapshots (ending positions only)
    • actions table for trade execution ledger
    • DailyPnLCalculator calculates P&L by valuing previous holdings at current prices
    • Weekend/holiday gap handling with days_since_last_trading tracking
    • First trading day properly handled with zero P&L
    • Auto-initialization of schema on database creation
  • AI Reasoning Summaries - Automated trading decision documentation
    • ReasoningSummarizer generates 2-3 sentence AI-powered summaries of trading sessions
    • Fallback to statistical summary if AI generation fails
    • Summaries generated during simulation and stored in database
    • Full reasoning logs preserved for detailed analysis
  • Day-Centric Results API - Unified endpoint for trading results
    • New /results endpoint with query parameters: job_id, model, date, reasoning
    • Three reasoning levels: none (default), summary, full
    • Response structure: starting_position, daily_metrics, trades, final_position, metadata
    • Holdings chain validation across trading days
    • Replaced old positions-based endpoint
  • BaseAgent P&L Integration - Complete integration of P&L calculation into trading sessions
    • P&L calculated at start of each trading day after loading current prices
    • Trading day records created with comprehensive metrics
    • Holdings saved to database after each session
    • Reasoning summaries generated and stored automatically
    • Database helper methods for clean data access

Changed

  • Reduced Docker healthcheck frequency from 30s to 1h to minimize log noise while maintaining startup verification
  • Database schema migrated from action-centric to day-centric model
  • Results API now returns normalized day-centric data structure
  • Trade tools (buy(), sell()) now write to actions table instead of old positions table
  • model_day_executor simplified - removed duplicate writes to old schema tables
  • get_current_position_from_db() queries new schema (trading_days + holdings) instead of positions table

Improved

  • Database helper methods with 7 new functions for trading_days schema operations
  • Test coverage increased with 36+ new comprehensive tests
  • Documentation updated with complete API reference and database schema details

Fixed

  • Critical: Intra-day position tracking for sell-then-buy trades (e20dce7)
    • Sell proceeds now immediately available for subsequent buy orders within same trading session
    • ContextInjector maintains in-memory position state during trading sessions
    • Position updates accumulate after each successful trade
    • Enables agents to rebalance portfolios (sell + buy) in single session
    • Added 13 comprehensive tests for position tracking
  • Critical: Tool message extraction in conversation history (462de3a, abb9cd0)
    • Fixed bug where tool messages (buy/sell trades) were not captured when agent completed in single step
    • Tool extraction now happens BEFORE finish signal check
    • Reasoning summaries now accurately reflect actual trades executed
    • Resolves issue where summarizer saw 0 tools despite multiple trades
  • Reasoning summary generation improvements (6d126db)
    • Summaries now explicitly mention specific trades executed (symbols, quantities, actions)
    • Added TRADES EXECUTED section highlighting tool calls
    • Example: 'sold 1 GOOGL and 1 AMZN to reduce exposure' instead of 'maintain core holdings'
  • Final holdings calculation accuracy (a8d912b)
    • Final positions now calculated from actions instead of querying incomplete database records
    • Correctly handles first trading day with multiple trades
    • New _calculate_final_position_from_actions() method applies all trades to calculate final state
    • Holdings now persist correctly across all trading days
    • Added 3 comprehensive tests for final position calculation
  • Holdings persistence between trading days (aa16480)
    • Query now retrieves previous day's ending position as current day's starting position
    • Changed query from date <= to date < to prevent returning incomplete current-day records
    • Fixes empty starting_position/final_position in API responses despite successful trades
    • Updated tests to verify correct previous-day retrieval
  • Context injector trading_day_id synchronization (05620fa)
    • ContextInjector now updated with trading_day_id after record creation
    • Fixes "Trade failed: trading_day_id not found in runtime config" error
    • MCP tools now correctly receive trading_day_id via context injection
  • Schema migration compatibility fixes (7c71a04)
    • Updated position queries to use new trading_days schema instead of obsolete positions table
    • Removed obsolete add_no_trade_record_to_db function calls
    • Fixes "no such table: positions" error
    • Simplified _handle_trading_result logic
  • Database referential integrity (9da65c2)
    • Corrected Database default path from "data/trading.db" to "data/jobs.db"
    • Ensures all components use same database file
    • Fixes FOREIGN KEY constraint failures when creating trading_day records
  • Debug logging cleanup (1e7bdb5)
    • Removed verbose debug logging from ContextInjector for cleaner output

[0.3.1] - 2025-11-03

Fixed

  • Critical: Fixed position tracking bugs causing cash reset and positions lost over weekends
    • Removed redundant ModelDayExecutor._write_results_to_db() that created corrupt records with cash=0 and holdings=[]
    • Fixed profit calculation to compare against start-of-day portfolio value instead of previous day's final value
    • Positions now correctly carry over between trading days and across weekends
    • Profit/loss calculations now accurately reflect trading gains/losses without treating trades as losses

Changed

  • Position tracking now exclusively handled by trade tools (buy(), sell()) and add_no_trade_record_to_db()
  • Daily profit calculation compares to start-of-day (action_id=0) portfolio value for accurate P&L tracking

Added

  • Standardized testing scripts for different workflows:
    • scripts/test.sh - Interactive menu for all testing operations
    • scripts/quick_test.sh - Fast unit test feedback (~10-30s)
    • scripts/run_tests.sh - Main test runner with full configuration options
    • scripts/coverage_report.sh - Coverage analysis with HTML/JSON/terminal reports
    • scripts/ci_test.sh - CI/CD optimized testing with JUnit/coverage XML output
  • Comprehensive testing documentation in docs/developer/testing.md
  • Test coverage requirement: 85% minimum (currently at 89.86%)

0.3.0 - 2025-11-03

Added - Development & Testing Features

  • Development Mode - Mock AI provider for cost-free testing
    • DEPLOYMENT_MODE=DEV enables mock AI responses with deterministic stock rotation
    • Isolated dev database (trading_dev.db) separate from production data
    • PRESERVE_DEV_DATA=true option to prevent dev database reset on startup
    • No AI API costs during development and testing
    • All API responses include deployment_mode field
    • Startup warning displayed when running in DEV mode
  • Config Override System - Docker configuration merging
    • Place custom configs in user-configs/ directory
    • Startup merges user config with default config
    • Comprehensive validation with clear error messages
    • Volume mount: ./user-configs:/app/user-configs

Added - Enhanced API Features

  • Async Price Download - Non-blocking data preparation
    • POST /simulate/trigger no longer blocks on price downloads
    • New job status: downloading_data during data preparation
    • Warnings field in status response for download issues
    • Better user experience for large date ranges
  • Resume Mode - Idempotent simulation execution
    • Jobs automatically skip already-completed model-days
    • Safe to re-run jobs without duplicating work
    • status="skipped" for already-completed executions
    • Error-free job completion when partial results exist
  • Reasoning Logs API - Access AI decision-making history
    • GET /reasoning endpoint for querying reasoning logs
    • Filter by job_id, model_name, date, include_full_conversation
    • Includes conversation history and tool usage
    • Database-only storage (no JSONL files)
    • AI-powered summary generation for reasoning sessions
  • Job Skip Status - Enhanced job status tracking
    • New status: skipped for already-completed model-days
    • Better differentiation between pending, running, and skipped
    • Accurate job completion detection

Added - Price Data Management & On-Demand Downloads

  • SQLite Price Data Storage - Replaced JSONL files with relational database
    • price_data table for OHLCV data (replaces merged.jsonl)
    • price_data_coverage table for tracking downloaded date ranges
    • simulation_runs table for soft-delete position tracking
    • Comprehensive indexes for query performance
  • On-Demand Price Data Downloads - Automatic gap filling via Alpha Vantage
    • Priority-based download strategy (maximize date completion)
    • Graceful rate limit handling (no pre-configured limits needed)
    • Smart coverage gap detection
    • Configurable via AUTO_DOWNLOAD_PRICE_DATA (default: true)
  • Date Range API - Simplified date specification
    • Single date: {"start_date": "2025-01-20"}
    • Date range: {"start_date": "2025-01-20", "end_date": "2025-01-24"}
    • Automatic validation (chronological order, max range, not future)
    • Configurable max days via MAX_SIMULATION_DAYS (default: 30)
  • Migration Tooling - Script to import existing merged.jsonl data
    • scripts/migrate_price_data.py for one-time data migration
    • Automatic coverage tracking during migration

Added - API Service Transformation

  • REST API Service - Complete FastAPI implementation for external orchestration
    • POST /simulate/trigger - Trigger simulation jobs with config, date range, and models
    • GET /simulate/status/{job_id} - Query job progress and execution details
    • GET /results - Retrieve simulation results with filtering (job_id, date, model)
    • GET /health - Service health check with database connectivity verification
  • SQLite Database - Complete persistence layer replacing JSONL files
    • Jobs table - Job metadata and lifecycle tracking
    • Job details table - Per model-day execution status
    • Positions table - Trading position records with P&L
    • Holdings table - Portfolio holdings breakdown
    • Reasoning logs table - AI decision reasoning history
    • Tool usage table - MCP tool usage statistics
  • Backend Components
    • JobManager - Job lifecycle management with concurrent job prevention
    • RuntimeConfigManager - Isolated runtime configs for thread-safe execution
    • ModelDayExecutor - Single model-day execution engine
    • SimulationWorker - Job orchestration with date-sequential, model-parallel execution
  • Comprehensive Test Suite
    • 175 unit and integration tests
    • 19 database tests (98% coverage)
    • 23 job manager tests (98% coverage)
    • 10 model executor tests (84% coverage)
    • 20 API endpoint tests (81% coverage)
    • 20 Pydantic model tests (100% coverage)
    • 10 runtime manager tests (89% coverage)
    • 22 date utilities tests (100% coverage)
    • 33 price data manager tests (85% coverage)
    • 10 on-demand download integration tests
    • 8 existing integration tests
  • Docker Deployment - Persistent REST API service
    • API-only deployment (batch mode removed for simplicity)
    • Single docker-compose service (ai-trader-server)
    • Health check configuration (30s interval, 3 retries)
    • Volume persistence for SQLite database and logs
    • Configurable API_PORT for flexible deployment
    • System dependencies (curl, procps) for health checks and debugging
  • Validation & Testing Tools
    • scripts/validate_docker_build.sh - Docker build and startup validation with port awareness
    • scripts/test_api_endpoints.sh - Complete API endpoint testing suite with port awareness
    • TESTING_GUIDE.md - Comprehensive testing procedures and troubleshooting (including port conflicts)
  • Documentation
    • DOCKER_API.md - API deployment guide with examples
    • TESTING_GUIDE.md - Validation procedures and troubleshooting
    • API endpoint documentation with request/response examples
    • Windmill integration patterns and examples

Changed

  • Project Rebrand - AI-Trader renamed to AI-Trader-Server
    • Updated all documentation for new project name
    • Updated Docker images to ghcr.io/xe138/ai-trader-server
    • Updated GitHub Actions workflows
    • Updated README, CHANGELOG, and all user guides
  • Architecture - Transformed from batch-only to API-first service with database persistence
  • Data Storage - Migrated from JSONL files to SQLite relational database
    • Price data now stored in price_data table instead of merged.jsonl
    • Tools/price_tools.py updated to query database
    • Position data fully migrated to database-only storage (removed JSONL dependencies)
    • Trade tools now read/write from database tables with lazy context injection
  • Deployment - Simplified to single API-only Docker service (REST API is new in v0.3.0)
  • Logging - Removed duplicate MCP service log files for cleaner output
  • Configuration - Simplified environment variable configuration
    • Added: DEPLOYMENT_MODE (PROD/DEV) for environment control
    • Added: PRESERVE_DEV_DATA (default: false) to keep dev data between runs
    • Added: AUTO_DOWNLOAD_PRICE_DATA (default: true) - Enable on-demand downloads
    • Added: MAX_SIMULATION_DAYS (default: 30) - Maximum date range size
    • Added: API_PORT for host port mapping (default: 8080, customizable for port conflicts)
    • Removed: RUNTIME_ENV_PATH (API dynamically manages runtime configs)
    • Removed: MCP service ports (MATH_HTTP_PORT, SEARCH_HTTP_PORT, TRADE_HTTP_PORT, GETPRICE_HTTP_PORT)
    • Removed: WEB_HTTP_PORT (web UI not implemented)
    • MCP services use fixed internal ports (8000-8003) and are no longer exposed to host
    • Container always uses port 8080 internally for API
    • Only API port (8080) is exposed to host
    • Reduces configuration complexity and attack surface
  • Requirements - Added fastapi>=0.120.0, uvicorn[standard]>=0.27.0, pydantic>=2.0.0
  • Docker Compose - Single service (ai-trader-server) instead of dual-mode
  • Dockerfile - Added system dependencies (curl, procps) and port 8080 exposure
  • .env.example - Simplified configuration with only essential variables
  • Entrypoint - Unified entrypoint.sh with proper signal handling (exec uvicorn)

Technical Implementation

  • Test-Driven Development - All components written with tests first
  • Mock-based Testing - Avoid heavy dependencies in unit tests
  • Pydantic V2 - Type-safe request/response validation
  • Foreign Key Constraints - Database referential integrity with cascade deletes
  • Thread-safe Execution - Isolated runtime configs per model-day
  • Background Job Execution - ThreadPoolExecutor for parallel model execution
  • Automatic Status Transitions - Job status updates based on model-day completion

Performance & Quality

  • Test Suite - 175 tests, all passing
    • Unit tests: 155 tests
    • Integration tests: 18 tests
    • API tests: 20+ tests
  • Code Coverage - High coverage for new modules
    • Date utilities: 100%
    • Price data manager: 85%
    • Database layer: 98%
    • Job manager: 98%
    • Pydantic models: 100%
    • Runtime manager: 89%
    • Model executor: 84%
    • FastAPI app: 81%
  • Test Execution - Fast test suite (~12 seconds for full suite)

Integration Ready

  • Windmill.dev - HTTP-based integration with polling support
  • External Orchestration - RESTful API for workflow automation
  • Monitoring - Health checks and status tracking
  • Persistence - SQLite database survives container restarts

Fixed

  • Context Injection - Runtime parameters correctly injected into MCP tools
    • ContextInjector always overrides AI-provided parameters (defense-in-depth)
    • Hidden context parameters from AI tool schema to prevent hallucination
    • Resolved database locking issues with concurrent tool calls
    • Proper async handling of tool reloading after context injection
  • Simulation Re-runs - Prevent duplicate execution of completed model-days
    • Fixed job hanging when re-running partially completed simulations
    • _execute_date() now skips already-completed model-days
    • Job completion status correctly reflects skipped items
  • Agent Initialization - Correct parameter passing in API mode
    • Fixed BaseAgent initialization parameters in ModelDayExecutor
    • Resolved async execution and position storage issues
  • Database Reliability - Various improvements for concurrent access
    • Fixed column existence checks before creating indexes
    • Proper database path resolution in dev mode (prevents recursive _dev suffix)
    • Module-level database initialization for uvicorn reliability
    • Fixed database locking during concurrent writes
    • Improved error handling in buy/sell functions
  • Configuration - Improved config handling
    • Use enabled field from config to determine which models run
    • Use config models when empty models list provided
    • Correct handling of merged runtime configs in containers
    • Proper get_db_path() usage to pass base database path
  • Docker - Various deployment improvements
    • Removed non-existent data scripts from Dockerfile
    • Proper respect for dev mode in entrypoint database initialization
    • Correct closure usage to capture db_path in lifespan context manager

Breaking Changes

  • Batch Mode Removed - All simulations now run through REST API
    • v0.2.0 used sequential batch execution via Docker entrypoint
    • v0.3.0 introduces REST API for external orchestration
    • Migration: Use POST /simulate/trigger endpoint instead of direct script execution
  • Data Storage Format Changed - Price data moved from JSONL to SQLite
    • Run python scripts/migrate_price_data.py to migrate existing merged.jsonl data
    • merged.jsonl no longer used (replaced by price_data table)
    • Automatic on-demand downloads eliminate need for manual data fetching
  • Configuration Variables Changed
    • Added: DEPLOYMENT_MODE, PRESERVE_DEV_DATA, AUTO_DOWNLOAD_PRICE_DATA, MAX_SIMULATION_DAYS, API_PORT
    • Removed: RUNTIME_ENV_PATH, MCP service ports, WEB_HTTP_PORT
    • MCP services now use fixed internal ports (not exposed to host)

0.2.0 - 2025-10-31

Added

  • Complete Docker deployment support with containerization
  • Docker Compose orchestration for easy local deployment
  • Multi-stage Dockerfile with Python 3.10-slim base image
  • Automated CI/CD pipeline via GitHub Actions for release builds
  • Automatic draft release creation with version tagging
  • Docker images published to GitHub Container Registry (ghcr.io)
  • Comprehensive Docker documentation (docs/DOCKER.md)
  • Release process documentation (docs/RELEASING.md)
  • Data cache reuse design documentation (docs/DESIGN_DATA_CACHE_REUSE.md)
  • CLAUDE.md repository guidance for development
  • Docker deployment section in main README
  • Environment variable configuration via docker-compose
  • Sequential startup script (entrypoint.sh) for data fetch, MCP services, and trading agent
  • Volume mounts for data and logs persistence
  • Pre-built image support from ghcr.io/xe138/ai-trader-server
  • Configurable volume path for persistent data
  • Configurable web interface host port
  • Automated merged.jsonl creation during price fetching
  • API key registration URLs in .env.example

Changed

  • Updated .env.example with Docker-specific configuration, API key URLs, and paths
  • Updated .gitignore to exclude git worktrees directory
  • Removed deprecated version tag from docker-compose.yml
  • Updated repository URLs to Xe138/AI-Trader-Server fork
  • Docker Compose now uses pre-built image by default
  • Simplified Docker config file selection with convention over configuration
  • Fixed internal ports with configurable host ports
  • Separated data scripts from volume mount directory
  • Reduced log flooding during data fetch
  • OPENAI_API_BASE can now be left empty in configuration

Fixed

  • Docker Compose configuration now follows modern best practices (version-less)
  • Prevent restart loop on missing API keys with proper validation
  • Docker tag generation now converts repository owner to lowercase
  • Validate GITHUB_REF is a tag in docker-release workflow
  • Correct Dockerfile FROM AS casing
  • Module import errors for MCP services resolved with PYTHONPATH
  • Prevent price data overwrite on container restart
  • Merge script now writes to current directory for volume compatibility

0.1.0 - Initial Release

Added

  • AI trading competition platform for NASDAQ 100 stocks
  • Support for multiple AI models (GPT, Claude, Qwen, DeepSeek, Gemini)
  • MCP (Model Context Protocol) toolchain integration
    • Mathematical calculation tools
    • Market intelligence search via Jina AI
    • Trading execution tools
    • Price query tools
  • Historical replay architecture with anti-look-ahead controls
  • Alpha Vantage API integration for price data
  • Autonomous AI decision-making with zero human intervention
  • Real-time performance analytics and leaderboard
  • Position tracking and trading logs
  • Web-based performance dashboard
  • Complete NASDAQ 100 stock universe support
  • Initial capital: $10,000 per AI model
  • Configurable date range for backtesting
  • Multi-model concurrent trading support
  • Automatic data fetching and merging
  • Comprehensive README with quick start guide

Technical Details

  • Python 3.10+ support
  • LangChain framework integration
  • FastMCP for MCP service implementation
  • JSONL format for position and log storage
  • Weekday-only trading simulation
  • Configurable agent parameters (max_steps, max_retries, initial_cash)

Release Notes Template

For future releases, use this template:

## [X.Y.Z] - YYYY-MM-DD

### Added
- New features

### Changed
- Changes to existing functionality

### Deprecated
- Soon-to-be removed features

### Removed
- Removed features

### Fixed
- Bug fixes

### Security
- Security improvements