migration-tracker
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.
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 disRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.