/portfolio-review — Unified Portfolio Review
This skill is the canonical investment-officer review workflow.
Default behavior:
- run a readiness check,
- run the core diagnostic,
- flag hard-gate breaches and action-triggering thresholds,
- produce a corrective path when action is required,
- verify the primary path with internal MCP tools,
- explain every action-triggering metric in plain language.
This is not a diagnostic-only note anymore. When a trigger breaches, the review must recommend a path.
Internal MCP Tool Map
- Baseline and state:
ghostfolio.portfolio(operation="summary"), portfolio-analytics.validate_account_taxonomy, portfolio-analytics.get_condensed_portfolio_state
- Core risk:
portfolio-analytics.analyze_portfolio_risk, portfolio-analytics.analyze_hypothetical_portfolio_risk
- Drift and TLH:
portfolio-analytics.analyze_allocation_drift, portfolio-analytics.analyze_bucket_allocation_drift, portfolio-analytics.find_tax_loss_harvesting_candidates
- Practitioner layers:
portfolio-analytics.compute_ruin_scenario, portfolio-analytics.classify_barbell_buckets, market-intel-direct.get_shiller_cape, market-intel-direct.compute_market_temperature, market-intel-direct.rank_convex_candidates
- Illiquid overlay inputs:
risk-model-config skill plus finance-graph.get_net_worth
- Hard-gate overlay:
practitioner-heuristics skill
- Corrective-action workflow:
rebalance skill
- Tax overlay:
household-tax.assess_exact_support only for narrow supported exact cases
- Context:
market-intel-direct.get_market_snapshot, market-intel-direct.search_market_news, policy-events.*, sec-edgar.*
Review Readiness
Run these checks before writing the review. If a blocking layer fails, state that the review is incomplete and surface the gap near the top.
Blocking:
portfolio-analytics.validate_account_taxonomy(strict=false)
portfolio-analytics.get_condensed_portfolio_state
portfolio-analytics.analyze_portfolio_risk
portfolio-analytics.classify_barbell_buckets
portfolio-analytics.find_tax_loss_harvesting_candidates
finance-graph.get_net_worth
market-intel-direct.get_shiller_cape
market-intel-direct.compute_market_temperature
- require
status == "complete" for a complete temperature read
If compute_market_temperature.status == "incomplete", do not present the temperature score as if it were complete. Report the missing components explicitly.
Action-Triggering Metrics
These metrics trigger corrective action, not just commentary.
Hard triggers:
- ES above
2.5%
- illiquidity above
25% of household net worth
- employer-linked liquid exposure above
15%
Threshold triggers:
- hyper-safe below
15%
- convex below
10%
- fragile-middle above
70%
- material allocation drift outside IPS bands
- actionable TLH set above the configured threshold
Context-only metrics:
- market temperature
- ruin scenarios
- Student-t fit
- volatility regime
These change urgency and sequencing, but they do not independently force trades.
Execution Workflow
1. Establish scope and baseline
- Run
ghostfolio.portfolio(operation="summary").
- Run
portfolio-analytics.validate_account_taxonomy.
- Run
portfolio-analytics.get_condensed_portfolio_state.
- For scoped calls, pass
scope_account_types as a native list value.
2. Run the quantitative risk engine
- If illiquid or private holdings matter, run
risk-model-config first and pass illiquid_overrides into portfolio-analytics.analyze_portfolio_risk.
- Use
risk_model="auto" and include_fx_risk=true.
- If
risk.status == "critical" or illiquid_overlay.adjusted_es_975_1d > 0.025, issue RISK ALERT LEVEL 3.
- If
risk.status == "unreliable", state clearly that the tail metrics are directional only.
- If
include_decomposition=true is needed for a corrective path, use it before ranking sells.
3. Run hard gates
Follow practitioner-heuristics:
- ES gate
- illiquidity gate
- employer concentration gate
If any hard gate fails, the review must say so before advisory context.
4. Run practitioner layers
portfolio-analytics.compute_ruin_scenario
portfolio-analytics.classify_barbell_buckets
- use
safe_gap_pct/value, convex_gap_pct/value, and fragile_excess_pct/value
market-intel-direct.get_shiller_cape
market-intel-direct.compute_market_temperature
- When convex is below target, run
market-intel-direct.rank_convex_candidates
5. Produce corrective path when required
If any hard trigger or threshold trigger breaches, the review MUST call the rebalance skill logic and produce:
Primary Path
Lower-Tax Alternative
Verification
Remaining Caveats
The primary path must be verified with portfolio-analytics.analyze_hypothetical_portfolio_risk before it is presented as the recommendation.
6. Plain-language explanations
For every metric that directly triggers corrective action, include a short block with:
What this metric means
Why it matters
Threshold breached
Why the recommended action addresses it
Apply this to:
- ES
- illiquidity
- employer concentration
- hyper-safe gap
- convex gap
- fragile-middle excess
- any drift metric that directly drives a trade recommendation
7. Tax and implementation overlay
- Run
portfolio-analytics.find_tax_loss_harvesting_candidates
- Use
scope_account_types=["brokerage"] for brokerage-only TLH scans
- If material taxable decisions are involved, check
household-tax.assess_exact_support first and only use the exact tools when the case is supported
8. Optional context
- Macro:
market-intel-direct.get_market_snapshot, market-intel-direct.search_market_news
- Policy:
policy-events.get_recent_bills, policy-events.get_federal_rules
- Disclosure/insider context for concentrated names:
sec-edgar.sec_edgar_filing, sec-edgar.sec_edgar_insider
Output Contract
The review output should use this structure when action is required:
## Portfolio Review — [Date]
### Review Readiness
- [complete / incomplete]
- Blocking gaps: [...]
### Summary
- Total liquid value: $X
- Household net worth: $Y
- Binding constraint: [ES / illiquidity / employer / none]
### Triggered Metrics
- [metric]: [status] | [threshold] | [brief explanation]
### Plain-Language Metric Explanations
- [one short block per triggering metric]
### Corrective Path
- Primary path: [wrapper-aware actions]
- Lower-tax alternative: [if different]
- Advanced alternatives: [for example options-based convex ideas, if allowed]
### Verification
- Proposed ES(97.5%): X.XX%
- Verification pass: true/false
- Post-plan barbell: X% safe / X% convex / X% fragile
### Remaining Caveats
- [tool gaps, tax caveats, mapping caveats, incomplete context]
If no hard trigger or threshold trigger breaches, keep the review diagnostic and do not invent trades.
Constraints
- Advisory only. No trading authority.
- Do not fabricate data or approximate missing blocking inputs.
- ES
<= 2.5% remains the binding constraint.
- Do not present a corrective path as the recommendation unless it has been verified with
analyze_hypothetical_portfolio_risk.
1---2name: portfolio-review3description: This skill should be used when the user asks for a portfolio review, portfolio health check, risk check, portfolio risk analysis, concentration check, allocation drift analysis, tax loss harvesting scan, or client review meeting prep. It produces a full diagnostic covering positions, risk (ES, VaR, volatility, vol regime, Student-t fit, illiquid overlay), allocation drift, TLH candidates, and actionable recommendations. For a formatted client-facing report without the diagnostic depth, use client-report instead.4---56# /portfolio-review — Unified Portfolio Review78This skill is the canonical investment-officer review workflow.910Default behavior:11121. run a readiness check,132. run the core diagnostic,143. flag hard-gate breaches and action-triggering thresholds,154. produce a corrective path when action is required,165. verify the primary path with internal MCP tools,176. explain every action-triggering metric in plain language.1819This is not a diagnostic-only note anymore. When a trigger breaches, the review must recommend a path.2021## Internal MCP Tool Map2223- Baseline and state: `ghostfolio.portfolio(operation="summary")`, `portfolio-analytics.validate_account_taxonomy`, `portfolio-analytics.get_condensed_portfolio_state`24- Core risk: `portfolio-analytics.analyze_portfolio_risk`, `portfolio-analytics.analyze_hypothetical_portfolio_risk`25- Drift and TLH: `portfolio-analytics.analyze_allocation_drift`, `portfolio-analytics.analyze_bucket_allocation_drift`, `portfolio-analytics.find_tax_loss_harvesting_candidates`26- Practitioner layers: `portfolio-analytics.compute_ruin_scenario`, `portfolio-analytics.classify_barbell_buckets`, `market-intel-direct.get_shiller_cape`, `market-intel-direct.compute_market_temperature`, `market-intel-direct.rank_convex_candidates`27- Illiquid overlay inputs: `risk-model-config` skill plus `finance-graph.get_net_worth`28- Hard-gate overlay: `practitioner-heuristics` skill29- Corrective-action workflow: `rebalance` skill30- Tax overlay: `household-tax.assess_exact_support` only for narrow supported exact cases31- Context: `market-intel-direct.get_market_snapshot`, `market-intel-direct.search_market_news`, `policy-events.*`, `sec-edgar.*`3233## Review Readiness3435Run these checks before writing the review. If a blocking layer fails, state that the review is incomplete and surface the gap near the top.3637Blocking:3839- `portfolio-analytics.validate_account_taxonomy(strict=false)`40- `portfolio-analytics.get_condensed_portfolio_state`41- `portfolio-analytics.analyze_portfolio_risk`42- `portfolio-analytics.classify_barbell_buckets`43- `portfolio-analytics.find_tax_loss_harvesting_candidates`44- `finance-graph.get_net_worth`45- `market-intel-direct.get_shiller_cape`46- `market-intel-direct.compute_market_temperature`47 - require `status == "complete"` for a complete temperature read4849If `compute_market_temperature.status == "incomplete"`, do not present the temperature score as if it were complete. Report the missing components explicitly.5051## Action-Triggering Metrics5253These metrics trigger corrective action, not just commentary.5455Hard triggers:5657- ES above `2.5%`58- illiquidity above `25%` of household net worth59- employer-linked liquid exposure above `15%`6061Threshold triggers:6263- hyper-safe below `15%`64- convex below `10%`65- fragile-middle above `70%`66- material allocation drift outside IPS bands67- actionable TLH set above the configured threshold6869Context-only metrics:7071- market temperature72- ruin scenarios73- Student-t fit74- volatility regime7576These change urgency and sequencing, but they do not independently force trades.7778## Execution Workflow7980### 1. Establish scope and baseline8182- Run `ghostfolio.portfolio(operation="summary")`.83- Run `portfolio-analytics.validate_account_taxonomy`.84- Run `portfolio-analytics.get_condensed_portfolio_state`.85- For scoped calls, pass `scope_account_types` as a native list value.8687### 2. Run the quantitative risk engine8889- If illiquid or private holdings matter, run `risk-model-config` first and pass `illiquid_overrides` into `portfolio-analytics.analyze_portfolio_risk`.90- Use `risk_model="auto"` and `include_fx_risk=true`.91- If `risk.status == "critical"` or `illiquid_overlay.adjusted_es_975_1d > 0.025`, issue `RISK ALERT LEVEL 3`.92- If `risk.status == "unreliable"`, state clearly that the tail metrics are directional only.93- If `include_decomposition=true` is needed for a corrective path, use it before ranking sells.9495### 3. Run hard gates9697Follow `practitioner-heuristics`:9899- ES gate100- illiquidity gate101- employer concentration gate102103If any hard gate fails, the review must say so before advisory context.104105### 4. Run practitioner layers106107- `portfolio-analytics.compute_ruin_scenario`108- `portfolio-analytics.classify_barbell_buckets`109 - use `safe_gap_pct/value`, `convex_gap_pct/value`, and `fragile_excess_pct/value`110- `market-intel-direct.get_shiller_cape`111- `market-intel-direct.compute_market_temperature`112- When convex is below target, run `market-intel-direct.rank_convex_candidates`113114### 5. Produce corrective path when required115116If any hard trigger or threshold trigger breaches, the review MUST call the `rebalance` skill logic and produce:117118- `Primary Path`119- `Lower-Tax Alternative`120- `Verification`121- `Remaining Caveats`122123The primary path must be verified with `portfolio-analytics.analyze_hypothetical_portfolio_risk` before it is presented as the recommendation.124125### 6. Plain-language explanations126127For every metric that directly triggers corrective action, include a short block with:128129- `What this metric means`130- `Why it matters`131- `Threshold breached`132- `Why the recommended action addresses it`133134Apply this to:135136- ES137- illiquidity138- employer concentration139- hyper-safe gap140- convex gap141- fragile-middle excess142- any drift metric that directly drives a trade recommendation143144### 7. Tax and implementation overlay145146- Run `portfolio-analytics.find_tax_loss_harvesting_candidates`147- Use `scope_account_types=["brokerage"]` for brokerage-only TLH scans148- If material taxable decisions are involved, check `household-tax.assess_exact_support` first and only use the exact tools when the case is supported149150### 8. Optional context151152- Macro: `market-intel-direct.get_market_snapshot`, `market-intel-direct.search_market_news`153- Policy: `policy-events.get_recent_bills`, `policy-events.get_federal_rules`154- Disclosure/insider context for concentrated names: `sec-edgar.sec_edgar_filing`, `sec-edgar.sec_edgar_insider`155156## Output Contract157158The review output should use this structure when action is required:159160```markdown161## Portfolio Review — [Date]162163### Review Readiness164- [complete / incomplete]165- Blocking gaps: [...]166167### Summary168- Total liquid value: $X169- Household net worth: $Y170- Binding constraint: [ES / illiquidity / employer / none]171172### Triggered Metrics173- [metric]: [status] | [threshold] | [brief explanation]174175### Plain-Language Metric Explanations176- [one short block per triggering metric]177178### Corrective Path179- Primary path: [wrapper-aware actions]180- Lower-tax alternative: [if different]181- Advanced alternatives: [for example options-based convex ideas, if allowed]182183### Verification184- Proposed ES(97.5%): X.XX%185- Verification pass: true/false186- Post-plan barbell: X% safe / X% convex / X% fragile187188### Remaining Caveats189- [tool gaps, tax caveats, mapping caveats, incomplete context]190```191192If no hard trigger or threshold trigger breaches, keep the review diagnostic and do not invent trades.193194## Constraints195196- Advisory only. No trading authority.197- Do not fabricate data or approximate missing blocking inputs.198- ES `<= 2.5%` remains the binding constraint.199- Do not present a corrective path as the recommendation unless it has been verified with `analyze_hypothetical_portfolio_risk`.