Portfolio Review
When to Use
Use this skill when the user wants to:
- review one or more crypto wallets;
- inspect visible DeFi, staking, claimable, or protocol positions;
- build a weekly/monthly portfolio informer;
- compare portfolio changes without storing raw balances or wallet data in state;
- troubleshoot DeBank/Jupiter browser extraction.
Procedure
- Confirm the review goal: quick review, full allocation review, thesis/rebalance review, or recurring informer.
- Load wallet addresses from a local ignored file such as
addresses.conf, or ask the user for addresses explicitly.
- For EVM wallets, open
https://debank.com/profile/<address> through the configured browser path.
- For Solana wallets, open
https://jup.ag/portfolio/<address> and collect visible Jupiter Portfolio data.
- Extract the top summary first: total/net worth, chain/wallet split, top tokens, protocol positions, staked/claimable amounts, and visible PnL/change signals.
- Do not replace Jupiter Portfolio with a native-SOL-only RPC fallback in automated reports. That hides DeFi/staked/claimable positions and creates false confidence.
- Reconcile rows before trusting totals: protocol rows and their wallet-token wrappers must not both be counted; liabilities subtract from value; stale or disputed rows stay audit-only.
- Return a compact, actionable review: facts, issues, candidate actions, missing information, and 1–2 decisions for the next review cycle.
- For recurring jobs, store only privacy-safe state: hashes, timestamps, and decision metadata. Do not store raw wallet addresses, balances, token amounts, percentages, holdings, or page text.
Lightweight manual review
When screenshots and brief notes already answer the question, review them directly before launching browser collection. Record visible facts, uncertainty, thesis changes, candidate actions, and missing data. A quick check should not automatically become a full multi-wallet investigation. Ask only for material missing inputs, such as the target allocation or comparison period.
Freshness and accounting checks
- Confirm each browser tab shows the requested wallet before trusting its rows. A successful navigation call does not prove that the old wallet page has been replaced.
- Before computing allocation percentages, verify the denominator covers the same wallets, chains, positions, and observation period as the numerator. Never present an incomplete subtotal as the whole portfolio.
- Separate the source-reported total from the deduplicated reconciled subtotal. Unknown prices are unpriced, not zero; label partial coverage and avoid a precise total when a material component is unresolved.
- Deposits between a wallet and its pool/vault are internal movements, not income. Count fees only when identifiable, subtract liabilities, and include claimable rewards only when not already reflected in NAV.
- For yield wrappers and lending vaults, inspect underlying assets, curator/allocator authority, oracle and collateral risks, utilization, redemption terms, and actual exit liquidity. Displayed NAV or APR is not an executable exit quote.
- Recommendations are not authorization to connect a wallet, approve, sign, trade, deposit, or withdraw.
Local Configuration
Create a local addresses.conf from the example:
cp addresses.example.conf addresses.conf
Format:
evm_example=0xYOUR_EVM_ADDRESS
sol_example=11111111111111111111111111111111
addresses.conf, state files, logs, and debug outputs are intentionally ignored by git.
Source contracts
Use references/source-contracts-and-reconciliation.md when changing collectors or report logic. It defines source precedence, row contracts, stale/degraded reporting, correction-registry shape, and accounting invariants.
Scripts
Primary public script:
python3 scripts/chro-informer.py --dry-run --pretty
python3 scripts/validate-public-export.py
If your environment uses a wrapper script, keep it outside the repository or document it without private paths.
Pitfalls
- Browser-visible portfolio pages can merge totals, percentages, token rows, and protocol values into one accessibility-tree line; parser logic must handle that.
- Jupiter can show human-verification, marketing/login text, or an empty DOM in some browser profiles.
- A native Solana RPC balance is not equivalent to Jupiter Portfolio coverage.
- Do not publish live wallet addresses, state files, or debug dumps.
- Do not let a stale or disputed source row enter a clean total; mark it degraded/audit-only until reconciled.
Verification
- Run the script in dry-run mode against example or explicitly provided addresses.
- Confirm no raw wallet addresses/balances are written to state.
- Confirm the report includes source-specific sections for EVM/DeBank and Solana/Jupiter when both are configured.
- Confirm row accounting reconciles and stale/disputed rows are labeled degraded or audit-only.
- Run
python3 scripts/validate-public-export.py before publishing.
- Run a static security scan before publishing.
1---2name: portfolio-review3description: Browser-first crypto portfolio review and weekly informer workflow using DeBank for EVM wallets and Jupiter Portfolio for Solana. Use when the user wants to review a crypto portfolio, inspect wallet allocation, compare visible DeFi/staked/claimable positions, or run a recurring portfolio informer without paid wallet APIs.4license: MIT5---6# Portfolio Review78## When to Use910Use this skill when the user wants to:1112- review one or more crypto wallets;13- inspect visible DeFi, staking, claimable, or protocol positions;14- build a weekly/monthly portfolio informer;15- compare portfolio changes without storing raw balances or wallet data in state;16- troubleshoot DeBank/Jupiter browser extraction.1718## Procedure19201. Confirm the review goal: quick review, full allocation review, thesis/rebalance review, or recurring informer.212. Load wallet addresses from a local ignored file such as `addresses.conf`, or ask the user for addresses explicitly.223. For EVM wallets, open `https://debank.com/profile/<address>` through the configured browser path.234. For Solana wallets, open `https://jup.ag/portfolio/<address>` and collect visible Jupiter Portfolio data.245. Extract the top summary first: total/net worth, chain/wallet split, top tokens, protocol positions, staked/claimable amounts, and visible PnL/change signals.256. Do not replace Jupiter Portfolio with a native-SOL-only RPC fallback in automated reports. That hides DeFi/staked/claimable positions and creates false confidence.267. Reconcile rows before trusting totals: protocol rows and their wallet-token wrappers must not both be counted; liabilities subtract from value; stale or disputed rows stay audit-only.278. Return a compact, actionable review: facts, issues, candidate actions, missing information, and 1–2 decisions for the next review cycle.289. For recurring jobs, store only privacy-safe state: hashes, timestamps, and decision metadata. Do not store raw wallet addresses, balances, token amounts, percentages, holdings, or page text.2930## Lightweight manual review3132When screenshots and brief notes already answer the question, review them directly before launching browser collection. Record visible facts, uncertainty, thesis changes, candidate actions, and missing data. A quick check should not automatically become a full multi-wallet investigation. Ask only for material missing inputs, such as the target allocation or comparison period.3334## Freshness and accounting checks3536- Confirm each browser tab shows the requested wallet before trusting its rows. A successful navigation call does not prove that the old wallet page has been replaced.37- Before computing allocation percentages, verify the denominator covers the same wallets, chains, positions, and observation period as the numerator. Never present an incomplete subtotal as the whole portfolio.38- Separate the source-reported total from the deduplicated reconciled subtotal. Unknown prices are unpriced, not zero; label partial coverage and avoid a precise total when a material component is unresolved.39- Deposits between a wallet and its pool/vault are internal movements, not income. Count fees only when identifiable, subtract liabilities, and include claimable rewards only when not already reflected in NAV.40- For yield wrappers and lending vaults, inspect underlying assets, curator/allocator authority, oracle and collateral risks, utilization, redemption terms, and actual exit liquidity. Displayed NAV or APR is not an executable exit quote.41- Recommendations are not authorization to connect a wallet, approve, sign, trade, deposit, or withdraw.4243## Local Configuration4445Create a local `addresses.conf` from the example:4647```bash48cp addresses.example.conf addresses.conf49```5051Format:5253```conf54evm_example=0xYOUR_EVM_ADDRESS55sol_example=1111111111111111111111111111111156```5758`addresses.conf`, state files, logs, and debug outputs are intentionally ignored by git.5960## Source contracts6162Use [`references/source-contracts-and-reconciliation.md`](references/source-contracts-and-reconciliation.md) when changing collectors or report logic. It defines source precedence, row contracts, stale/degraded reporting, correction-registry shape, and accounting invariants.6364## Scripts6566Primary public script:6768```bash69python3 scripts/chro-informer.py --dry-run --pretty70python3 scripts/validate-public-export.py71```7273If your environment uses a wrapper script, keep it outside the repository or document it without private paths.7475## Pitfalls7677- Browser-visible portfolio pages can merge totals, percentages, token rows, and protocol values into one accessibility-tree line; parser logic must handle that.78- Jupiter can show human-verification, marketing/login text, or an empty DOM in some browser profiles.79- A native Solana RPC balance is not equivalent to Jupiter Portfolio coverage.80- Do not publish live wallet addresses, state files, or debug dumps.81- Do not let a stale or disputed source row enter a clean total; mark it degraded/audit-only until reconciled.8283## Verification8485- Run the script in dry-run mode against example or explicitly provided addresses.86- Confirm no raw wallet addresses/balances are written to state.87- Confirm the report includes source-specific sections for EVM/DeBank and Solana/Jupiter when both are configured.88- Confirm row accounting reconciles and stale/disputed rows are labeled degraded or audit-only.89- Run `python3 scripts/validate-public-export.py` before publishing.90- Run a static security scan before publishing.