Private Wealth Advisory JSON Skill
Use this skill for private-wealth advisory tasks that ask for a structured JSON
planning answer using the staged prompt/memo/template plus the advisory API.
Return only the JSON object that conforms to input/payloads/answer_template.json.
Operating Procedure
- Read only the task prompt, request memo, and answer template. Extract the
client_id, requested analysis_type, any planning horizon year, and every
enum or required field from the template.
- Query only the advisory API endpoints listed in
environment_access.md:
/api/clients/<client_id>, /api/source-documents?client_id=...,
/api/retirement-accounts?client_id=..., /api/life-insurance?client_id=...,
/api/trust-candidates?client_id=..., /api/policies/tax, and
/api/rmd-factors.
- Resolve conflicting facts before calculating. Prefer current signed/profile
facts over stale CRM facts; use domain-specific API records for account,
policy, and trust terms.
- Calculate with full precision, then round currency outputs to two decimals.
Emit JSON numbers, booleans, arrays, and ISO dates; do not stringify numbers.
Source Resolution
- Profile facts: use
SIGNED_PROFILE when present for age, planning year, filing
status, marital status, annual non-IRA income, marginal tax rate, beneficiaries,
estate value, liquid assets, philanthropic intent, and family-transfer priority.
Fall back to ATTORNEY_MEMO, then CRM_NOTE; treat stale marketing/intake
material as lowest priority.
- Retirement facts: use
CUSTODIAN_EXPORT for traditional IRA balance, Roth
balance, expected return, RMD start age, and recommended conversion years.
- Life-insurance facts: use
/api/life-insurance for death benefit, premium,
contribution date, ownership, and existing-policy-transfer status. If the
template requires a controlling_policy_source but does not allow an insurance
source enum, report ATTORNEY_MEMO for legal/ILIT policy implementation unless
an allowed explicit source is present.
- Trust-candidate facts: use
/api/trust-candidates for asset value, growth,
GRAT term/rate, and CRAT term/payout. If the template requires
controlling_asset_source, use ATTORNEY_MEMO unless an allowed explicit asset
source is present.
- Goal source fields usually resolve to
SIGNED_PROFILE when signed goals are
present; otherwise use the attorney memo before CRM.
Shared Tax Formulas
Use /api/policies/tax for the planning-year annual gift exclusion, estate tax
exemption, estate tax rate, conversion bracket target by filing status, maximum
CRAT term, and charitable deduction rate.
taxable_estate = max(0, estate_value - estate_tax_exemption[planning_year]).
estate_tax_exposure = taxable_estate * estate_tax_rate.
liquidity_gap_before_planning = max(0, estate_tax_exposure - liquid_assets).
- Unless a task explicitly says otherwise, apply one household exemption/exclusion
schedule; do not double just because the client is married.
Roth Conversion and RMD
Inputs: signed profile, custodian retirement account, tax policy, RMD factors, and
memo horizon year.
first_rmd_year = planning_year + max(0, rmd_start_age - age).
years_until_rmd = max(0, first_rmd_year - planning_year).
conversion_years = min(recommended_conversion_years, years_until_rmd).
conversion_years_positive = max(0, conversion_years), but set it to 0 if
bracket room is zero.
bracket_room = max(0, conversion_bracket_targets[filing_status] - annual_non_ira_income).
annual_conversion_amount = min(traditional_balance / conversion_years_positive, bracket_room);
use 0 when conversion_years_positive is zero.
total_converted = annual_conversion_amount * conversion_years_positive.
total_conversion_tax = total_converted * marginal_tax_rate.
Projection convention:
- For the baseline, start with current traditional/Roth balances. For each year
through the horizon, use attained age
age + (year - planning_year). Beginning
with first_rmd_year, compute rmd = traditional_balance / rmd_factor[age],
subtract it from traditional balance, and add rmd * marginal_tax_rate to RMD
tax. Grow remaining traditional and Roth balances annually at expected_return.
- For the conversion case, make the annual conversion at the start of each
positive conversion year before RMD/growth. Move the converted amount from
traditional to Roth, then run the same RMD and growth loop.
rmd_tax_savings_through_horizon = baseline_rmd_tax_through_horizon - conversion_rmd_tax_through_horizon.
- Use the conversion-case ending balances for legacy projection. Set heir tax
profile by Roth share of total ending retirement assets:
MOSTLY_TAX_FREE if
Roth share is at least 80%, MIXED_TAXABLE_AND_TAX_FREE if at least 20%, else
MOSTLY_TAXABLE.
Recommendation mapping:
- Use
LIQUIDITY_CONSTRAINT if liquid assets cannot comfortably cover conversion
tax; otherwise RMD_NEAR_TERM when there are two or fewer years until RMD;
otherwise TAX_BRACKET_MANAGEMENT.
- Use
STAGED_ROTH_CONVERSION/SUITABLE when there are positive conversion
years, positive bracket room, no liquidity issue, and RMD tax savings are
positive. Use DEFER/BORDERLINE for near-term RMD or liquidity concerns with
some benefit. Use NO_CONVERSION or DEFER when bracket room, conversion years,
or projected benefit are zero.
ILIT and Crummey Funding
Inputs: signed profile beneficiaries, life-insurance record, estate context, and
tax policy.
annual_exclusion_per_beneficiary = annual_gift_exclusion[planning_year].
annual_exclusion_capacity = annual_exclusion_per_beneficiary * beneficiary_count.
premium_gap = max(0, annual_premium - annual_exclusion_capacity).
notices_required = beneficiary_count.
contribution_date = planned_contribution_date.
- Date convention when no task-specific rule overrides it:
notice_due_date = contribution_date + 5 calendar days;
withdrawal_window_end = notice_due_date + 30 calendar days;
earliest_premium_payment_date = withdrawal_window_end + 1 calendar day.
dedicated_bank_account_required = true.
projected_outside_estate_if_implemented = death_benefit.
tax_liquidity_support = min(death_benefit, liquidity_gap_before_planning).
Risk and action mapping:
- No existing policy transfer and no premium gap:
LOW_IF_FORMALITIES_MET,
FUND_WITH_CRUMMEY_NOTICES, SUITABLE_WITH_ADMINISTRATION.
- Premium gap only:
EXCLUSION_SHORTFALL,
USE_LIFETIME_EXEMPTION_FOR_SHORTFALL, usually BORDERLINE.
- Existing policy transfer only:
THREE_YEAR_LOOKBACK,
USE_NEW_POLICY_OR_ACCEPT_LOOKBACK, usually BORDERLINE.
- Both issues:
THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL,
DISCLOSE_LOOKBACK_AND_USE_EXEMPTION, usually BORDERLINE or
NOT_SUITABLE if the gap/lookback dominates the plan.
GRAT, CRAT, and Trust Comparison
Inputs: signed/attorney goals, trust-candidate record, estate context, and tax
policy.
grat.projected_remainder_to_heirs = max(0, asset_value * ((1 + expected_growth_rate)^grat_term_years - (1 + grat_annuity_rate)^grat_term_years)).
grat.estimated_estate_tax_reduction = grat.projected_remainder_to_heirs * estate_tax_rate.
crat.term_years = min(crat_term_years, max_crat_term_years).
crat.projected_charitable_remainder = asset_value * (1 + expected_growth_rate - crat_payout_rate)^crat.term_years.
crat.estimated_income_tax_deduction = asset_value * charitable_deduction_rate.
- Use
TERM_SURVIVAL_REQUIRED for GRAT mortality inclusion risk.
Recommendation mapping:
- Prefer
GRAT when family-transfer priority is stronger than philanthropic
intent; rationale CHILDREN_TRANSFER_PRIORITY; alternate role
SECONDARY_CHARITABLE_TOOL.
- Prefer
CRAT when philanthropic intent is stronger; rationale
PHILANTHROPIC_PRIORITY; alternate role SECONDARY_FAMILY_TRANSFER_TOOL.
- CRAT
family_transfer_fit is LOW when family transfer is the dominant goal,
MODERATE when goals are mixed, and HIGH only when philanthropy clearly
dominates and family transfer is not central.
Estate Liquidity Action Plan
Combine the estate context, ILIT, and trust-transfer calculations.
- Prefer
COMBINE_ILIT_AND_GRAT with sequencing ILIT_FIRST_THEN_GRAT when the
client has low ILIT implementation risk and the trust comparison favors GRAT.
- Prefer
CRAT_WITH_LIQUIDITY_REVIEW with sequencing TRUST_DECISION_FIRST when
philanthropy dominates and the CRAT is the preferred trust strategy.
- Use
ILIT_WITH_EXEMPTION_REVIEW with sequencing
ILIT_FIRST_THEN_ATTORNEY_REVIEW when ILIT funding has an exclusion shortfall,
an existing-policy transfer/lookback issue, or both.
- Build
action_set from the actual recommendations, then sort alphabetically.
Common actions are ILIT_CRUMMEY_NOTICE_CYCLE, GRAT_FOR_APPRECIATING_SHARES,
CRAT_FOR_CHARITABLE_REMAINDER, LIFETIME_EXEMPTION_ALLOCATION, and
ATTORNEY_DRAFT_REVIEW.
Output Checks
- Include every required top-level key and nested field in the answer template.
- Use exactly the enum spellings from the template.
- Sort only fields the template says to sort, especially
action_set.
- Return the final JSON object only, with no explanatory prose.
1---2name: self-attempt-033description: Private Wealth Advisory JSON Skill4---5# Private Wealth Advisory JSON Skill67Use this skill for private-wealth advisory tasks that ask for a structured JSON8planning answer using the staged prompt/memo/template plus the advisory API.9Return only the JSON object that conforms to `input/payloads/answer_template.json`.1011## Operating Procedure12131. Read only the task prompt, request memo, and answer template. Extract the14 `client_id`, requested `analysis_type`, any planning horizon year, and every15 enum or required field from the template.162. Query only the advisory API endpoints listed in `environment_access.md`:17 `/api/clients/<client_id>`, `/api/source-documents?client_id=...`,18 `/api/retirement-accounts?client_id=...`, `/api/life-insurance?client_id=...`,19 `/api/trust-candidates?client_id=...`, `/api/policies/tax`, and20 `/api/rmd-factors`.213. Resolve conflicting facts before calculating. Prefer current signed/profile22 facts over stale CRM facts; use domain-specific API records for account,23 policy, and trust terms.244. Calculate with full precision, then round currency outputs to two decimals.25 Emit JSON numbers, booleans, arrays, and ISO dates; do not stringify numbers.2627## Source Resolution2829- Profile facts: use `SIGNED_PROFILE` when present for age, planning year, filing30 status, marital status, annual non-IRA income, marginal tax rate, beneficiaries,31 estate value, liquid assets, philanthropic intent, and family-transfer priority.32 Fall back to `ATTORNEY_MEMO`, then `CRM_NOTE`; treat stale marketing/intake33 material as lowest priority.34- Retirement facts: use `CUSTODIAN_EXPORT` for traditional IRA balance, Roth35 balance, expected return, RMD start age, and recommended conversion years.36- Life-insurance facts: use `/api/life-insurance` for death benefit, premium,37 contribution date, ownership, and existing-policy-transfer status. If the38 template requires a `controlling_policy_source` but does not allow an insurance39 source enum, report `ATTORNEY_MEMO` for legal/ILIT policy implementation unless40 an allowed explicit source is present.41- Trust-candidate facts: use `/api/trust-candidates` for asset value, growth,42 GRAT term/rate, and CRAT term/payout. If the template requires43 `controlling_asset_source`, use `ATTORNEY_MEMO` unless an allowed explicit asset44 source is present.45- Goal source fields usually resolve to `SIGNED_PROFILE` when signed goals are46 present; otherwise use the attorney memo before CRM.4748## Shared Tax Formulas4950Use `/api/policies/tax` for the planning-year annual gift exclusion, estate tax51exemption, estate tax rate, conversion bracket target by filing status, maximum52CRAT term, and charitable deduction rate.5354- `taxable_estate = max(0, estate_value - estate_tax_exemption[planning_year])`.55- `estate_tax_exposure = taxable_estate * estate_tax_rate`.56- `liquidity_gap_before_planning = max(0, estate_tax_exposure - liquid_assets)`.57- Unless a task explicitly says otherwise, apply one household exemption/exclusion58 schedule; do not double just because the client is married.5960## Roth Conversion and RMD6162Inputs: signed profile, custodian retirement account, tax policy, RMD factors, and63memo horizon year.6465- `first_rmd_year = planning_year + max(0, rmd_start_age - age)`.66- `years_until_rmd = max(0, first_rmd_year - planning_year)`.67- `conversion_years = min(recommended_conversion_years, years_until_rmd)`.68- `conversion_years_positive = max(0, conversion_years)`, but set it to `0` if69 bracket room is zero.70- `bracket_room = max(0, conversion_bracket_targets[filing_status] - annual_non_ira_income)`.71- `annual_conversion_amount = min(traditional_balance / conversion_years_positive, bracket_room)`;72 use `0` when `conversion_years_positive` is zero.73- `total_converted = annual_conversion_amount * conversion_years_positive`.74- `total_conversion_tax = total_converted * marginal_tax_rate`.7576Projection convention:7778- For the baseline, start with current traditional/Roth balances. For each year79 through the horizon, use attained age `age + (year - planning_year)`. Beginning80 with `first_rmd_year`, compute `rmd = traditional_balance / rmd_factor[age]`,81 subtract it from traditional balance, and add `rmd * marginal_tax_rate` to RMD82 tax. Grow remaining traditional and Roth balances annually at `expected_return`.83- For the conversion case, make the annual conversion at the start of each84 positive conversion year before RMD/growth. Move the converted amount from85 traditional to Roth, then run the same RMD and growth loop.86- `rmd_tax_savings_through_horizon = baseline_rmd_tax_through_horizon -87 conversion_rmd_tax_through_horizon`.88- Use the conversion-case ending balances for legacy projection. Set heir tax89 profile by Roth share of total ending retirement assets: `MOSTLY_TAX_FREE` if90 Roth share is at least 80%, `MIXED_TAXABLE_AND_TAX_FREE` if at least 20%, else91 `MOSTLY_TAXABLE`.9293Recommendation mapping:9495- Use `LIQUIDITY_CONSTRAINT` if liquid assets cannot comfortably cover conversion96 tax; otherwise `RMD_NEAR_TERM` when there are two or fewer years until RMD;97 otherwise `TAX_BRACKET_MANAGEMENT`.98- Use `STAGED_ROTH_CONVERSION`/`SUITABLE` when there are positive conversion99 years, positive bracket room, no liquidity issue, and RMD tax savings are100 positive. Use `DEFER`/`BORDERLINE` for near-term RMD or liquidity concerns with101 some benefit. Use `NO_CONVERSION` or `DEFER` when bracket room, conversion years,102 or projected benefit are zero.103104## ILIT and Crummey Funding105106Inputs: signed profile beneficiaries, life-insurance record, estate context, and107tax policy.108109- `annual_exclusion_per_beneficiary = annual_gift_exclusion[planning_year]`.110- `annual_exclusion_capacity = annual_exclusion_per_beneficiary * beneficiary_count`.111- `premium_gap = max(0, annual_premium - annual_exclusion_capacity)`.112- `notices_required = beneficiary_count`.113- `contribution_date = planned_contribution_date`.114- Date convention when no task-specific rule overrides it:115 `notice_due_date = contribution_date + 5 calendar days`;116 `withdrawal_window_end = notice_due_date + 30 calendar days`;117 `earliest_premium_payment_date = withdrawal_window_end + 1 calendar day`.118- `dedicated_bank_account_required = true`.119- `projected_outside_estate_if_implemented = death_benefit`.120- `tax_liquidity_support = min(death_benefit, liquidity_gap_before_planning)`.121122Risk and action mapping:123124- No existing policy transfer and no premium gap: `LOW_IF_FORMALITIES_MET`,125 `FUND_WITH_CRUMMEY_NOTICES`, `SUITABLE_WITH_ADMINISTRATION`.126- Premium gap only: `EXCLUSION_SHORTFALL`,127 `USE_LIFETIME_EXEMPTION_FOR_SHORTFALL`, usually `BORDERLINE`.128- Existing policy transfer only: `THREE_YEAR_LOOKBACK`,129 `USE_NEW_POLICY_OR_ACCEPT_LOOKBACK`, usually `BORDERLINE`.130- Both issues: `THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL`,131 `DISCLOSE_LOOKBACK_AND_USE_EXEMPTION`, usually `BORDERLINE` or132 `NOT_SUITABLE` if the gap/lookback dominates the plan.133134## GRAT, CRAT, and Trust Comparison135136Inputs: signed/attorney goals, trust-candidate record, estate context, and tax137policy.138139- `grat.projected_remainder_to_heirs =140 max(0, asset_value * ((1 + expected_growth_rate)^grat_term_years -141 (1 + grat_annuity_rate)^grat_term_years))`.142- `grat.estimated_estate_tax_reduction =143 grat.projected_remainder_to_heirs * estate_tax_rate`.144- `crat.term_years = min(crat_term_years, max_crat_term_years)`.145- `crat.projected_charitable_remainder =146 asset_value * (1 + expected_growth_rate - crat_payout_rate)^crat.term_years`.147- `crat.estimated_income_tax_deduction =148 asset_value * charitable_deduction_rate`.149- Use `TERM_SURVIVAL_REQUIRED` for GRAT mortality inclusion risk.150151Recommendation mapping:152153- Prefer `GRAT` when family-transfer priority is stronger than philanthropic154 intent; rationale `CHILDREN_TRANSFER_PRIORITY`; alternate role155 `SECONDARY_CHARITABLE_TOOL`.156- Prefer `CRAT` when philanthropic intent is stronger; rationale157 `PHILANTHROPIC_PRIORITY`; alternate role `SECONDARY_FAMILY_TRANSFER_TOOL`.158- CRAT `family_transfer_fit` is `LOW` when family transfer is the dominant goal,159 `MODERATE` when goals are mixed, and `HIGH` only when philanthropy clearly160 dominates and family transfer is not central.161162## Estate Liquidity Action Plan163164Combine the estate context, ILIT, and trust-transfer calculations.165166- Prefer `COMBINE_ILIT_AND_GRAT` with sequencing `ILIT_FIRST_THEN_GRAT` when the167 client has low ILIT implementation risk and the trust comparison favors GRAT.168- Prefer `CRAT_WITH_LIQUIDITY_REVIEW` with sequencing `TRUST_DECISION_FIRST` when169 philanthropy dominates and the CRAT is the preferred trust strategy.170- Use `ILIT_WITH_EXEMPTION_REVIEW` with sequencing171 `ILIT_FIRST_THEN_ATTORNEY_REVIEW` when ILIT funding has an exclusion shortfall,172 an existing-policy transfer/lookback issue, or both.173- Build `action_set` from the actual recommendations, then sort alphabetically.174 Common actions are `ILIT_CRUMMEY_NOTICE_CYCLE`, `GRAT_FOR_APPRECIATING_SHARES`,175 `CRAT_FOR_CHARITABLE_REMAINDER`, `LIFETIME_EXEMPTION_ALLOCATION`, and176 `ATTORNEY_DRAFT_REVIEW`.177178## Output Checks179180- Include every required top-level key and nested field in the answer template.181- Use exactly the enum spellings from the template.182- Sort only fields the template says to sort, especially `action_set`.183- Return the final JSON object only, with no explanatory prose.