Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/aiskillstore-migration-tracker/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 222% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 212% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 118% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 139% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 103% | 0% |
Core features migrated and working:
dev-docs/database-architecture.md for schema referenceStatus: Production ready - Tested and deployed Commits: c4fa57c, a5ce0ec, 676de06, eba4c8d, ee7cec8, ae9202d Merged to main: d56497a (PR #1)
Implementation Journey (6 commits):
calculateMetricsFromDatabase() and buildFilenameFromMetadata() to dataUtils.tsfetchFromSupabase() in App.tsxcsv_files table to new strategies + trades schemaorder('trades.trade_date') to order('trade_date') with foreignTable parameter.limit(10000) to get all tradestrades? propertycalculateMetrics() to check for "Entry/Exit" columnFinal Results:
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 updatesHow It Works:
calculateMetrics() auto-detects format and processes correctlyBackward Compatibility:
Status: Planning complete, ready for implementation What Changed:
New Database Schema:
portfolios: Portfolio definitions with is_master flagstrategies: Strategy metadata (market, direction, contract_multiplier, etc.)trades: Individual trade records (trade_date, trade_time, profit)portfolio_strategies: Links portfolios to strategiesImplementation Plan:
calculateMetricsFromDatabase() function in dataUtils.ts (~80 lines)fetchFromSupabase() query in App.tsx (~60 lines changed)Current State:
csv_files table (needs update)Next Steps:
Commit: c372ab7a92d267eda3e540b298872484ef09e38d Files: App.tsx (+47), MetricsTable.tsx (+18), PortfolioSection.tsx (+8)
What it does:
Problem: Delete feature was "lost" (local repo behind origin/main)
Solution:
bashgit fetch origin git merge origin/main # Fast-forward to c372ab7
Key lesson: Always check git log origin/main when work seems missing
Commits: 258ba3a, 9f25040 What Changed:
useState<number>(0))Files Modified:
PortfolioSection.tsx: Added riskFreeRate state, downside deviation calculation, and displayImplementation Details:
useMemoCommit: 258ba3a What Changed:
Files Modified:
usePortfolio.ts: Added date filtering logicPortfolioSection.tsx: Added date picker controlsCommit: 9fb7fdb What Changed:
Files Modified:
UploadSection.tsx: Enhanced error handlingErrorList.tsx: New component for error displayusePortfolio.ts: Better error propagationEquityChartSection.tsxPortfolioStats.tsxContractControls.tsxnpm uninstall rechartsany violationsStatus: Partially fixed (commit 9fb7fdb) Root cause: Row limit exceeded on free tier Current workaround:
Long-term fix: Implement data aggregation before storage
Status: Documented but not fixed Problem: Components grew during migration Affected:
Fix needed: Systematic refactoring into smaller components
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.
Status: Recoverable via git forensics Problem: Can't find recently added features or code seems to have disappeared Solution:
git log origin/main --oneline -10git log --all --grep="keyword"git merge origin/maingit reflogExample: On Dec 2, 2025, the delete feature was recovered by fast-forwarding from f4e752a to c372ab7
| 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:
| 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 |
Note: Skills previously claimed migration to TanStack Query + Zustand, but actual implementation uses plain React hooks only.
Portfolio Buddy 2 is simple enough to use React's built-in state:
any escapesany violationsComparing 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)
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 13,629 | 12,466 | -9% | 1 | 1 | 0% | 1,961 | 6,318 | +222% | 0 | 0 | — |
case-02 | fail→pass | 11,189 | 6,475 | -42% | 1 | 1 | 0% | 1,772 | 5,533 | +212% | 0 | 0 | — |
case-03 | fail→pass | 19,060 | 14,218 | -25% | 1 | 1 | 0% | 3,238 | 7,058 | +118% | 0 | 0 | — |
case-04 | pass→pass | 12,288 | 9,945 | -19% | 1 | 1 | 0% | 2,439 | 6,362 | +161% | 0 | 0 | — |
case-05 | pass→pass | 14,562 | 15,667 | +8% | 1 | 1 | 0% | 3,007 | 7,355 | +145% | 0 | 0 | — |
case-06 | pass→pass | 9,440 | 8,146 | -14% | 1 | 1 | 0% | 1,810 | 5,944 | +228% | 0 | 0 | — |
case-07 | fail→pass | 13,518 | 3,415 | -75% | 1 | 1 | 0% | 2,081 | 4,967 | +139% | 0 | 0 | — |
case-08 | fail→pass | 19,980 | 11,784 | -41% | 1 | 1 | 0% | 3,137 | 6,374 | +103% | 0 | 0 | — |
case-09 | fail→pass | 16,323 | 6,105 | -63% | 1 | 1 | 0% | 2,602 | 5,524 | +112% | 0 | 0 | — |
case-10 | fail→pass | 10,675 | 3,927 | -63% | 1 | 1 | 0% | 1,720 | 5,083 | +196% | 0 | 0 | — |
case-11 | fail→pass | 4,677 | 4,171 | -11% | 1 | 1 | 0% | 621 | 5,165 | +732% | 0 | 0 | — |
case-12 | fail→pass | 5,303 | 5,297 | -0% | 1 | 1 | 0% | 831 | 5,279 | +535% | 0 | 0 | — |
case-13 | fail→fail | 6,345 | 5,206 | -18% | 1 | 1 | 0% | 999 | 5,171 | +418% | 0 | 0 | — |
case-14 | fail→pass | 9,112 | 3,603 | -60% | 1 | 1 | 0% | 1,391 | 5,038 | +262% | 0 | 0 | — |
case-15 | pass→pass | 5,479 | 2,151 | -61% | 1 | 1 | 0% | 778 | 4,777 | +514% | 0 | 0 | — |
case-16 | fail→pass | 13,138 | 7,751 | -41% | 1 | 1 | 0% | 2,207 | 5,605 | +154% | 0 | 0 | — |
case-17 | fail→pass | 11,409 | 6,460 | -43% | 1 | 1 | 0% | 1,844 | 5,517 | +199% | 0 | 0 | — |
case-18 | fail→pass | 14,436 | 4,215 | -71% | 1 | 1 | 0% | 2,674 | 5,012 | +87% | 0 | 0 | — |
case-19 | fail→pass | 15,459 | 10,797 | -30% | 1 | 1 | 0% | 2,815 | 6,197 | +120% | 0 | 0 | — |
case-20 | fail→pass | 8,502 | 4,301 | -49% | 1 | 1 | 0% | 1,267 | 4,799 | +279% | 0 | 0 | — |
case-21 | fail→pass | 17,033 | 8,860 | -48% | 1 | 1 | 0% | 2,836 | 5,921 | +109% | 0 | 0 | — |
case-22 | fail→pass | 13,816 | 6,859 | -50% | 1 | 1 | 0% | 2,250 | 5,639 | +151% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +77 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.