Claude
Skills
Sign in
Back

migration-tracker

Included with Lifetime
$97 forever

Context for ongoing migration from old Portfolio Buddy app. Use when: fixing bugs, adding migrated features, checking feature parity, or understanding why certain code exists. Contains list of 40 features being migrated and known issues.

General

What this skill does


# Portfolio Buddy 2 - Migration Tracker

## Migration Status: 40 Features

### ✅ Completed (36/40 - 90%)
Core features migrated and working:
- CSV upload and parsing with PapaParse
- Supabase storage integration
- Basic metrics calculation (Sharpe, Max DD, CAGR, Win Rate, etc.)
- **Sortino Ratio** (completed commits 258ba3a, 9f25040)
- **Risk-free rate input** (completed commit 258ba3a)
- Asset correlation matrix (Spearman & Pearson)
- Portfolio comparison charts (Chart.js)
- Equity curve visualization
- Responsive UI with Tailwind CSS
- shadcn/ui color system integration
- **Date range filtering** (completed commit 258ba3a)
- **Contract multipliers for futures** (useContractMultipliers hook)
- **Advanced multi-column sorting** (useSorting hook)
- Error handling and validation
- File upload progress tracking
- Multiple file management

- **Database Integration** (Nov 16, 2025) - PRODUCTION READY ✓
  - Python script uploads trades automatically ✓
  - New database schema (portfolios, strategies, trades) ✓
  - Frontend database fetch ✓ (commits c4fa57c through ee7cec8)
  - Dual CSV/Database support ✓
  - Format auto-detection (1-row vs 2-row) ✓
  - User tested and verified ✓
  - Merged to main and deployed ✓
  - **See:** `dev-docs/supabase-migration-plan.md`

### 🚧 In Progress (3/40)
1. **Advanced filtering** - Partial implementation
   - Date filtering complete ✓
   - Symbol filtering needed
   - Strategy filtering needed
2. **Export functionality** - CSV export only
   - Excel export pending
   - PDF reports pending
3. **Historical comparison** - Backend ready, UI pending
   - Need UI for comparing multiple time periods

### ❌ Not Started (2/40)
1. **Multi-period analysis** - Complex, low priority
   - Compare performance across different time windows
   - Requires significant UI work
2. **Risk scenario modeling** - Requires new backend logic
   - Monte Carlo simulations
   - Stress testing

## Recent Completed Features

### Database Fetch Implementation (Nov 16, 2025) ✅ COMPLETED
**Status**: Production ready - Tested and deployed
**Commits**: c4fa57c, a5ce0ec, 676de06, eba4c8d, ee7cec8, ae9202d
**Merged to main**: d56497a (PR #1)

**Implementation Journey** (6 commits):

1. **Initial Implementation** (c4fa57c)
   - Added `calculateMetricsFromDatabase()` and `buildFilenameFromMetadata()` to dataUtils.ts
   - Rewrote `fetchFromSupabase()` in App.tsx
   - Changed from old `csv_files` table to new `strategies` + `trades` schema
   - Added TypeScript interfaces: DatabaseTrade, StrategyMetadata

2. **Fix Query Syntax** (a5ce0ec)
   - Fixed Supabase order clause syntax error
   - Changed `order('trades.trade_date')` to `order('trade_date')` with foreignTable parameter
   - Error: "failed to parse order (trades.trade_date.asc)"

3. **Fix Trade Count Limit** (676de06)
   - Discovered Supabase embedded resource limit (~60 rows)
   - Separated queries: fetch strategies first, then fetch trades separately
   - Added explicit `.limit(10000)` to get all trades
   - Fixed: 59 trades → 119 trades ✅

4. **Fix TypeScript Build Errors** (eba4c8d)
   - Added StrategyFromDB interface with optional `trades?` property
   - Added DatabaseTrade interface to App.tsx
   - Fixed: "Property 'trades' does not exist" errors

5. **Fix Metrics Calculation** (ee7cec8) ⭐ **CRITICAL FIX**
   - Auto-detect format: 2-row (Entry/Exit) vs 1-row (database)
   - Modified `calculateMetrics()` to check for "Entry/Exit" column
   - If present → loop by 2 (old CSV format)
   - If absent → loop by 1 (new database format)
   - Fixed: Metrics now calculated correctly for all 119 trades ✅

6. **Update Documentation** (ae9202d)
   - Updated migration-tracker skill with implementation details
   - Documented all changes and line numbers

**Final Results**:
- ✅ 119 trades loaded from database (not 59)
- ✅ All metrics calculated correctly (win rate, profit factor, etc.)
- ✅ CSV upload backward compatibility preserved
- ✅ Dual-mode support: both CSV and database work simultaneously
- ✅ Format auto-detection works seamlessly
- ✅ User tested and verified working
- ✅ Deployed to production

**Files Modified**:
- `src/utils/dataUtils.ts`: +235 lines (functions, interfaces, auto-detection)
- `src/App.tsx`: +145 lines (database fetch, TypeScript types)
- `.claude/skills/migration-tracker/SKILL.md`: Documentation updates

**How It Works**:
1. User clicks "Load Data" button
2. App fetches strategies from Supabase
3. For each strategy, fetches ALL trades separately (no 60-row limit)
4. Builds filename from metadata (e.g., SI_Long_Test_TestStrategy1.csv)
5. Transforms to cleanedData format with 3 columns (no Entry/Exit column)
6. `calculateMetrics()` auto-detects format and processes correctly
7. Pre-populates contract multipliers from database
8. Auto-selects strategies and displays metrics/charts

**Backward Compatibility**:
- ✅ CSV upload with 4 columns (includes Entry/Exit) → 2-row processing
- ✅ Database with 3 columns (no Entry/Exit) → 1-row processing
- ✅ Both formats work simultaneously
- ✅ All existing components, hooks, charts unchanged

### Database Integration Planning (Nov 16, 2025)
**Status**: Planning complete, ready for implementation
**What Changed**:
- Created comprehensive migration plan (`dev-docs/supabase-migration-plan.md`)
- Analyzed new Supabase database schema (portfolios, strategies, trades tables)
- Designed dual-mode support (CSV upload + database fetch)
- Planned data transformation strategy (single-row trades vs entry/exit pairs)

**New Database Schema**:
- `portfolios`: Portfolio definitions with is_master flag
- `strategies`: Strategy metadata (market, direction, contract_multiplier, etc.)
- `trades`: Individual trade records (trade_date, trade_time, profit)
- `portfolio_strategies`: Links portfolios to strategies

**Implementation Plan**:
1. Add `calculateMetricsFromDatabase()` function in dataUtils.ts (~80 lines)
2. Update `fetchFromSupabase()` query in App.tsx (~60 lines changed)
3. Transform database data to match cleanedData format
4. Pre-populate contract multipliers from database
5. Test with 119 existing trades

**Current State**:
- Python script on Windows VPS uploads trades automatically ✓
- Database contains 1 strategy with 119 trades ✓
- Frontend still queries old `csv_files` table (needs update)

**Next Steps**:
- Implement Phase 1: New calculation function
- Implement Phase 2: Update Supabase query
- Test dual CSV/Database support
- Deploy to production

### Strategy Delete Feature (Nov 19, 2025) ✅
**Commit:** c372ab7a92d267eda3e540b298872484ef09e38d
**Files:** App.tsx (+47), MetricsTable.tsx (+18), PortfolioSection.tsx (+8)

**What it does:**
- Delete database strategies permanently (red trash icon with confirmation)
- Remove CSV strategies from view (gray trash icon, immediate)
- strategyIdMap tracks DB vs CSV (App.tsx line 67)
- handleDeleteStrategy with Supabase deletion (App.tsx lines 423-458)
- Trash2 icon in Actions column (MetricsTable.tsx lines 1, 239-246)

### Git Forensic Recovery (Dec 2, 2025) ✅
**Problem:** Delete feature was "lost" (local repo behind origin/main)

**Solution:**
```bash
git fetch origin
git merge origin/main  # Fast-forward to c372ab7
```

**Key lesson:** Always check `git log origin/main` when work seems missing

### Sortino Ratio (Oct 2025)
**Commits**: 258ba3a, 9f25040
**What Changed**:
- Added risk-free rate input field in PortfolioSection (line 131: `useState<number>(0)`)
- Implemented inline Sortino calculation in PortfolioSection (lines 133-158)
- Fixed downside deviation calculation (now properly annualized using sqrt(365))
- Corrected variance calculation (divides by total returns, not just negative returns)
- Displays in portfolio stats section (line 535)

**Files Modified**:
- `PortfolioSection.tsx`: Added riskFreeRate state, downside deviation calculation, and display

**Implementation Details**:
- **NOT in dataUtils.ts** - Sortino is calculated inline in PortfolioSection using `useMemo`
- **NOT in MetricsTable** - Only dis

Related in General