jpskill.com
📦 その他 コミュニティ

migration-tracker

旧Portfolio Buddyアプリからの移行作業を円滑に進めるため、移行中の機能や既知の問題点に関する情報を集約し、バグ修正や機能追加、コード理解を支援するSkill。

📜 元の英語説明(参考)

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.

🇯🇵 日本人クリエイター向け解説

一言でいうと

旧Portfolio Buddyアプリからの移行作業を円滑に進めるため、移行中の機能や既知の問題点に関する情報を集約し、バグ修正や機能追加、コード理解を支援するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o migration-tracker.zip https://jpskill.com/download/16750.zip && unzip -o migration-tracker.zip && rm migration-tracker.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/16750.zip -OutFile "$d\migration-tracker.zip"; Expand-Archive "$d\migration-tracker.zip" -DestinationPath $d -Force; ri "$d\migration-tracker.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して migration-tracker.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → migration-tracker フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Portfolio Buddy 2 - Migration Tracker

移行状況: 40 機能

✅ 完了 (36/40 - 90%)

移行済みで動作中のコア機能:

  • PapaParse を使用した CSV アップロードと解析

  • Supabase ストレージ統合

  • 基本的なメトリクスの計算 (Sharpe, Max DD, CAGR, 勝率など)

  • ソルティノレシオ (完了したコミット 258ba3a, 9f25040)

  • リスクフリーレート入力 (完了したコミット 258ba3a)

  • 資産相関行列 (Spearman & Pearson)

  • ポートフォリオ比較チャート (Chart.js)

  • エクイティカーブの可視化

  • Tailwind CSS によるレスポンシブ UI

  • shadcn/ui カラーシステム統合

  • 日付範囲フィルタリング (完了したコミット 258ba3a)

  • 先物の契約乗数 (useContractMultipliers hook)

  • 高度な複数列ソート (useSorting hook)

  • エラー処理とバリデーション

  • ファイルアップロードの進捗状況の追跡

  • 複数ファイルの管理

  • データベース統合 (2025年11月16日) - 本番環境対応 ✓

    • Python スクリプトによる自動取引アップロード ✓
    • 新しいデータベーススキーマ (portfolios, strategies, trades) ✓
    • フロントエンドデータベースフェッチ ✓ (コミット c4fa57c から ee7cec8)
    • CSV/データベースのデュアルサポート ✓
    • フォーマットの自動検出 (1行 vs 2行) ✓
    • ユーザーテストと検証済み ✓
    • main にマージしてデプロイ済み ✓
    • 参照: dev-docs/supabase-migration-plan.md

🚧 進行中 (3/40)

  1. 高度なフィルタリング - 部分的な実装
    • 日付フィルタリング完了 ✓
    • シンボルフィルタリングが必要
    • 戦略フィルタリングが必要
  2. エクスポート機能 - CSV エクスポートのみ
    • Excel エクスポート保留
    • PDF レポート保留
  3. 過去の比較 - バックエンド準備完了、UI 保留
    • 複数の期間を比較するための UI が必要

❌ 未着手 (2/40)

  1. 複数期間分析 - 複雑、優先度低
    • 異なる時間枠でのパフォーマンスを比較
    • 大幅な UI 作業が必要
  2. リスクシナリオモデリング - 新しいバックエンドロジックが必要
    • モンテカルロシミュレーション
    • ストレステスト

最近完了した機能

データベースフェッチの実装 (2025年11月16日) ✅ 完了

ステータス: 本番環境対応 - テスト済みおよびデプロイ済み コミット: c4fa57c, a5ce0ec, 676de06, eba4c8d, ee7cec8, ae9202d main にマージ: d56497a (PR #1)

実装の道のり (6 コミット):

  1. 初期実装 (c4fa57c)

    • calculateMetricsFromDatabase()buildFilenameFromMetadata() を dataUtils.ts に追加
    • App.tsx で fetchFromSupabase() を書き換え
    • 古い csv_files テーブルから新しい strategies + trades スキーマに変更
    • TypeScript インターフェースを追加: DatabaseTrade, StrategyMetadata
  2. クエリ構文の修正 (a5ce0ec)

    • Supabase の order 句の構文エラーを修正
    • order('trades.trade_date') を foreignTable パラメータ付きの order('trade_date') に変更
    • エラー: "failed to parse order (trades.trade_date.asc)"
  3. 取引数制限の修正 (676de06)

    • Supabase の埋め込みリソース制限 (~60 行) を発見
    • クエリを分離: まず戦略をフェッチし、次に取引を個別にフェッチ
    • すべての取引を取得するために明示的な .limit(10000) を追加
    • 修正: 59 取引 → 119 取引 ✅
  4. TypeScript ビルドエラーの修正 (eba4c8d)

    • オプションの trades? プロパティを持つ StrategyFromDB インターフェースを追加
    • DatabaseTrade インターフェースを App.tsx に追加
    • 修正: "Property 'trades' does not exist" エラー
  5. メトリクス計算の修正 (ee7cec8) ⭐ 重大な修正

    • フォーマットの自動検出: 2行 (Entry/Exit) vs 1行 (データベース)
    • "Entry/Exit" 列を確認するように calculateMetrics() を変更
    • 存在する場合 → 2 ずつループ (古い CSV 形式)
    • 存在しない場合 → 1 ずつループ (新しいデータベース形式)
    • 修正: すべての 119 取引に対してメトリクスが正しく計算されるようになりました ✅
  6. ドキュメントの更新 (ae9202d)

    • 実装の詳細を migration-tracker スキルで更新
    • すべての変更と行番号をドキュメント化

最終結果:

  • ✅ データベースから 119 取引がロードされました (59 ではありません)
  • ✅ すべてのメトリクスが正しく計算されました (勝率、プロフィットファクターなど)
  • ✅ CSV アップロードの下位互換性が維持されました
  • ✅ デュアルモードサポート: CSV とデータベースの両方が同時に動作します
  • ✅ フォーマットの自動検出がシームレスに動作します
  • ✅ ユーザーテストと動作確認済み
  • ✅ 本番環境にデプロイ済み

変更されたファイル:

  • src/utils/dataUtils.ts: +235 行 (関数、インターフェース、自動検出)
  • src/App.tsx: +145 行 (データベースフェッチ、TypeScript 型)
  • .claude/skills/migration-tracker/SKILL.md: ドキュメントの更新

仕組み:

  1. ユーザーが「Load Data」ボタンをクリック
  2. アプリが Supabase から戦略をフェッチ
  3. 各戦略について、すべての取引を個別にフェッチ (60 行の制限なし)
  4. メタデータからファイル名を構築 (例: SI_Long_Test_TestStrategy1.csv)
  5. 3 列の cleanedData 形式に変換 (Entry/Exit 列なし)
  6. calculateMetrics() がフォーマットを自動検出し、正しく処理
  7. データベースから契約乗数を事前に入力
  8. 戦略を自動選択し、メトリクス/チャートを表示

下位互換性:

  • ✅ 4 列の CSV アップロード (Entry/Exit を含む) → 2 行処理
  • ✅ 3 列のデータベース (Entry/Exit なし) → 1 行処理
  • ✅ 両方の形式が同時に動作します
  • ✅ 既存のすべてのコンポーネント、hook、チャートは変更されていません

データベース統合計画 (2025年11月16日)

ステータス: 計画完了、実装準備完了 変更点:

  • 包括的な移行計画を作成 (dev-docs/supabase-migration-plan.md)
  • 新しい Supabase データベーススキーマを分析 (portfolios, strategies, trades テーブル)
  • デュアルモードサポートを設計 (CSV アップロード + データベースフェッチ)
  • データ変換戦略を計画 (単一行取引 vs エントリー/イグジットペア)

新しいデータベーススキーマ:

  • portfolios: is_master フラグ付きのポートフォリオ定義
  • strategies: 戦略メタデータ (市場、方向、contract_multiplier など)
  • trades: 個々の取引レコード (trade_date, trade_time, profit)
  • portfolio_strategies: ポートフォリオを戦略にリンク

実装計画:

  1. dataUtils.ts に calculateMetricsFromDatabase() 関数を追加 (~80 行)
  2. App.tsx で fetchFromSupabase() クエリを更新 (~60 行変更)
  3. データベースデータを c

(原文がここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

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:

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 displayed in portfolio stats area
  • Kept in component due to portfolio-level context requirements:
    • Needs user input (risk-free rate)
    • Operates on portfolio daily returns (not trade-level metrics)
    • Different calculation scope than win rate, profit factor, etc.

Date Range Filtering (Oct 2025)

Commit: 258ba3a What Changed:

  • usePortfolio hook now accepts date range params
  • Filters trades by start/end date
  • Recalculates metrics for filtered period only
  • UI controls in PortfolioSection

Files Modified:

  • usePortfolio.ts: Added date filtering logic
  • PortfolioSection.tsx: Added date picker controls

Enhanced Error Handling (Sept 2025)

Commit: 9fb7fdb What Changed:

  • Better Supabase error messages
  • Client validation before upload
  • Error list component shows all errors
  • Toast notifications for user feedback

Files Modified:

  • UploadSection.tsx: Enhanced error handling
  • ErrorList.tsx: New component for error display
  • usePortfolio.ts: Better error propagation

Current Tech Debt

High Priority

  1. PortfolioSection.tsx is 591 lines (3x the 200-line limit)

    • Needs refactoring into:
      • EquityChartSection.tsx
      • PortfolioStats.tsx
      • ContractControls.tsx
    • Estimated effort: 4-6 hours
  2. Remove unused Recharts dependency (11.5KB waste)

    • Currently using Chart.js
    • Recharts never imported anywhere
    • Run: npm uninstall recharts
  3. Fix 15 TypeScript any violations

    • usePortfolio.ts: 11 instances
    • useMetrics.ts: 4 instances
    • dataUtils.ts: 1 instance
    • Need proper interfaces for Trade and Metric types

Medium Priority

  1. App.tsx is 351 lines (175% of limit)

    • Extract sections into components
    • Estimated effort: 2-3 hours
  2. MetricsTable.tsx is 242 lines (121% of limit)

    • Improved from 350 lines
    • Still over limit, could extract more
  3. No error boundaries implemented

    • Should wrap risky components
    • Prevents full app crashes

Low Priority

  1. No testing setup

    • Should test critical calculations
    • Vitest recommended for Vite projects
  2. No CI/CD pipeline

    • Manual Cloudflare deployments
    • Could automate with GitHub Actions

Known Issues

Issue 1: Supabase 500 Errors

Status: Partially fixed (commit 9fb7fdb) Root cause: Row limit exceeded on free tier Current workaround:

  • Enhanced error handling shows user-friendly messages
  • Batch uploads in smaller chunks recommended Long-term fix: Implement data aggregation before storage

Issue 2: Large Component Files

Status: Documented but not fixed Problem: Components grew during migration Affected:

  • PortfolioSection.tsx: 591 lines (was 280, now worse!)
  • App.tsx: 351 lines
  • MetricsTable.tsx: 242 lines (improved from 350) Fix needed: Systematic refactoring into smaller components

Issue 3: No Select All Button

Status: Feature doesn't exist Note: Previous skill version documented a "Select All bug" but this feature was either removed or never implemented. MetricsTable has individual selection but no "Select All" functionality.

Issue 4: Lost/Missing Code

Status: Recoverable via git forensics Problem: Can't find recently added features or code seems to have disappeared Solution:

  1. Check remote: git log origin/main --oneline -10
  2. Search commits: git log --all --grep="keyword"
  3. Fast-forward if behind: git merge origin/main
  4. Use reflog to see recent HEAD positions: git reflog Example: On Dec 2, 2025, the delete feature was recovered by fast-forwarding from f4e752a to c372ab7

Migration Priorities (ICE Scored)

Feature Impact Confidence Ease ICE Score Status
Refactor PortfolioSection 6 8 4 19.2
Remove Recharts 3 10 10 30
Fix TypeScript any 5 9 6 27
Export to Excel 8 8 7 44.8 🚧
Advanced filters 7 6 5 21 🚧
Historical comparison UI 6 7 4 16.8 🚧
Error boundaries 7 9 8 50.4
Testing setup 6 8 5 24
Risk scenarios 5 4 2 4

Top Priorities by ICE Score:

  1. Error boundaries (50.4) - High impact, easy to implement
  2. Export to Excel (44.8) - User-requested feature
  3. Remove Recharts (30) - Quick win, technical cleanup
  4. Fix TypeScript violations (27) - Code quality
  5. Testing setup (24) - Long-term maintainability

What Changed from Old App

Tech Stack Evolution

Component Old App New App Reason
React 16.x 19.x Latest features, better performance
Language JavaScript TypeScript Type safety, better DX
Build Tool Create React App Vite 10x faster builds, modern
Styling Material-UI v4 Tailwind + shadcn More flexible, lighter
Charts Recharts Chart.js Better performance, more features
State Redux Plain React hooks Simpler, less boilerplate
Backend Custom Node.js Supabase Faster development, PostgreSQL

State Management Migration

  • Old: Redux with actions, reducers, middleware (complex)
  • New: Plain React hooks (useState, useMemo, useCallback)
  • Result: 70% less boilerplate, easier to understand

Note: Skills previously claimed migration to TanStack Query + Zustand, but actual implementation uses plain React hooks only.

Why No Global State Library?

Portfolio Buddy 2 is simple enough to use React's built-in state:

  • Small component tree (14 components)
  • State rarely shared across distant components
  • Custom hooks encapsulate shared logic effectively
  • No complex async state management needed

Migration Lessons Learned

What Went Well

  1. Vite adoption - Build times dropped from 30s to 2s
  2. TypeScript migration - Caught many bugs early
  3. Chart.js over Recharts - Better performance with large datasets
  4. Simplified state - No Redux complexity
  5. Supabase integration - Fast backend setup

What Could Be Better

  1. Component size discipline - Let components grow too large
  2. TypeScript strictness - Too many any escapes
  3. Testing from start - No tests written yet (tech debt)
  4. Code reviews - Need refactoring before more features
  5. Documentation - Should have updated skills continuously

Migration Velocity

  • Weeks 1-4: Core features (upload, parsing, basic metrics)
  • Weeks 5-8: Charts, correlation, UI polish
  • Weeks 9-12: Advanced features (Sortino, date filtering, sorting)
  • Current: Maintenance, refactoring, optimization

Next Steps

Immediate (This Sprint)

  1. Remove Recharts dependency
  2. Add error boundaries to risky components
  3. Fix highest-impact TypeScript any violations

Short Term (Next 2 Sprints)

  1. Refactor PortfolioSection into smaller components
  2. Implement Excel export
  3. Complete symbol/strategy filtering

Long Term (Next Quarter)

  1. Set up Vitest testing framework
  2. Add CI/CD with GitHub Actions
  3. Multi-period analysis UI
  4. Risk scenario modeling

Feature Parity Checklist

Comparing to old Portfolio Buddy v1:

Feature Old App New App Notes
CSV Upload Improved error handling
Sharpe Ratio Same calculation
Sortino Ratio Fixed calculation (9f25040)
Max Drawdown Same calculation
CAGR Same calculation
Correlation Matrix Added Pearson + Spearman
Equity Curves Better charts with zoom/pan
Contract Multipliers New feature
Date Filtering New feature
Multi-column Sort Improved with useSorting
Export to CSV Same functionality
Export to Excel Regression - needs reimplementation
Export to PDF Regression - low priority
Symbol Filtering Regression - in progress
Historical Compare Regression - backend ready

Parity Status: 85% (11/13 core features complete)