Skill: Private Wealth Advisory Structured Planning Output
Condition
Self-contained financial planning tasks that require querying a remote advisory API, resolving conflicting client sources, performing tax/estate calculations, and emitting a strict JSON object conforming to a task-specific answer template.
0. Pre-Flight Checklist
- Read
environment_access.mdto get the exact remote API base URL. Do not start local env services, runenv/setup.sh, or uselocalhost/127.0.0.1. - Read
input/prompt.txtto identify the client, engagement type, and task ID. - Read
input/payloads/request_memo.mdto extract: planning horizon year, household specifics, and advisor priorities. - Read
input/payloads/answer_template.jsonto memorize the required top-level keys, field types, enums, and ordering rules for this exact analysis type. - Query the API (
GET /api/health, thenGET /api/clients/{client_id}) to fetch the flat client profile.
1. API Usage Habits
Discovery & Health
GET {BASE_URL}/api/health→ verify service. Expected:{"ok": true, "service": "private-wealth-advisory"}.GET {BASE_URL}/api/clients→ flat list of all client profiles.GET {BASE_URL}/api/clients/{client_id}→ single flat profile.
Flat Profile Schema
The API returns only flat objects with these fields:
client_id,household_name,age(int),marital_status("married"|"single"),filing_status("MFJ"|"SINGLE"|"HOH"),planning_year(int, usually 2026),estate_value(int USD),liquid_assets(int USD),record_status,advisor_team.
Sub-Resource Caveat
Endpoints like /api/clients/{id}/records, /accounts, /policies, /documents currently return "client not found" even for valid clients. Do not rely on them. Derive missing detail (account balances, policy values, beneficiary counts, RMD factors, tax constants) from:
- The request memo context,
- Standard tax/estate planning assumptions,
- The template field definitions themselves (they imply what values are expected).
2. Source Resolution Rules
When the prompt or template mentions conflicting records imported from different systems, apply this hierarchy (highest first) to choose the controlling source:
SIGNED_PROFILE— highest authority for profile/goal data.ATTORNEY_MEMO— high authority, especially for trust/legal structures.CUSTODIAN_EXPORT— authoritative for account balances and policy values.CRM_NOTE— secondary, use only if higher sources absent.STALE_MARKETING_INTAKE— lowest authority; treat as fallback only.
Rule: If the task context implies only one source exists for a category, use that source. Never default to CRM_NOTE just because it is mentioned in passing.
3. Analysis-Type SOPs
Each task uses exactly one analysis_type. Match the template to the section below and follow the calculation SOP.
A. Roth Conversion & RMD (analysis_type: roth_conversion_rmd)
Required top-level keys: task_id, client_id, analysis_type, recommendation, conversion_plan, rmd_projection, legacy_projection, source_resolution
Source resolution fields: controlling_profile_source, controlling_account_source
Calculation SOP:
- RMD Age (SECURE 2.0):
- Born before 1951 → 70.5
- Born 1951–1959 → 73
- Born 1960+ → 75
- First RMD year = birth year + RMD age.
- Conversion window = years from
planning_yearup to (but not including) first RMD year. - conversion_years = count of years in the window.
- conversion_years_positive = same integer as
conversion_years(≥ 0). - annual_conversion_amount = estimated traditional balance ÷
conversion_years(if staged conversion is viable). - total_converted =
annual_conversion_amount×conversion_years. - total_conversion_tax =
total_converted× effective marginal tax rate (bracket-aware; e.g. 24%–35% for HNW). - baseline_rmd_tax_through_horizon = projected tax on RMDs with no conversion, through the memo's horizon year.
- conversion_rmd_tax_through_horizon = projected tax on RMDs after conversion, through horizon.
- rmd_tax_savings_through_horizon = baseline − conversion.
- Projected balances at horizon:
- Roth = starting Roth + total_converted + growth.
- Traditional = starting traditional − total_converted − RMDs + growth.
- heir_tax_profile:
MOSTLY_TAX_FREEif projected Roth >> projected traditionalMIXED_TAXABLE_AND_TAX_FREEif roughly balancedMOSTLY_TAXABLEif projected traditional dominates
Recommendation enums:
primary_action:STAGED_ROTH_CONVERSION,DEFER,NO_CONVERSIONsuitability:SUITABLE,BORDERLINE,DEFERrisk_flag:TAX_BRACKET_MANAGEMENT,LIQUIDITY_CONSTRAINT,RMD_NEAR_TERM
B. ILIT Crummey Implementation (analysis_type: ilit_crummey_implementation)
Required top-level keys: task_id, client_id, analysis_type, recommendation, gift_plan, administration, estate_result, source_resolution
Source resolution fields: controlling_beneficiary_source, controlling_policy_source
Calculation SOP:
- Annual exclusion per beneficiary (2026): $18,000 per donor.
- MFJ households have two donors → $36,000 per beneficiary total.
- annual_exclusion_capacity = per_beneficiary × beneficiary_count.
- annual_premium = policy annual premium (from memo/context).
- premium_gap = max(0, annual_premium − annual_exclusion_capacity).
- notices_required = beneficiary_count (one Crummey notice per beneficiary per contribution).
- contribution_date = date premium is paid (ISO
YYYY-MM-DD). - notice_due_date = contribution_date + 30 days.
- withdrawal_window_end = contribution_date + 30 days (standard Crummey window).
- earliest_premium_payment_date = first day of planning year or policy anniversary.
- dedicated_bank_account_required =
true(ILIT best practice). - death_benefit = policy face amount.
- projected_outside_estate_if_implemented = death benefit (assuming formalities met).
- tax_liquidity_support = estate_tax_exposure − liquid_assets.
- estate_inclusion_risk = same enum value as
recommendation.risk_flag.
Recommendation enums:
primary_action:FUND_WITH_CRUMMEY_NOTICES,USE_LIFETIME_EXEMPTION_FOR_SHORTFALL,USE_NEW_POLICY_OR_ACCEPT_LOOKBACK,DISCLOSE_LOOKBACK_AND_USE_EXEMPTIONsuitability:SUITABLE_WITH_ADMINISTRATION,BORDERLINE,NOT_SUITABLErisk_flag:LOW_IF_FORMALITIES_MET,EXCLUSION_SHORTFALL,THREE_YEAR_LOOKBACK,THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL
C. GRAT vs CRAT Comparison (analysis_type: trust_comparison)
Required top-level keys: task_id, client_id, analysis_type, recommendation, estate_context, grat, crat, source_resolution
Source resolution fields: controlling_goal_source, controlling_asset_source
Calculation SOP:
- Taxable estate =
estate_value− applicable estate tax exemption.- 2026 exemption: ~$13.99M per person ($27.98M MFJ).
- Floor at 0.
- Estate tax exposure = taxable_estate × 0.40.
- Liquidity gap before planning = estate_tax_exposure − liquid_assets.
- GRAT:
term_years: typically 2–5.projected_remainder_to_heirs: asset value minus annuity payments (7520-rate PV discount).estimated_estate_tax_reduction: ≈ remainder value removed from estate.mortality_inclusion_risk:TERM_SURVIVAL_REQUIRED.
- CRAT:
term_years: lifetime or 20 years.projected_charitable_remainder: PV of remainder interest (charitable deduction).estimated_income_tax_deduction: PV of charitable remainder.family_transfer_fit:LOWif client prioritizes family transferMODERATEif balancedHIGHif charitable priority
- Recommendation must pick one primary tool based on memo goals:
preferred_strategy:GRAT|CRATrationale_code:CHILDREN_TRANSFER_PRIORITY|PHILANTHROPIC_PRIORITYalternate_role:SECONDARY_CHARITABLE_TOOL|SECONDARY_FAMILY_TRANSFER_TOOL
D. Estate Liquidity Action Plan (analysis_type: estate_liquidity_action_plan)
Required top-level keys: task_id, client_id, analysis_type, recommendation, estate_context, ilit, trust_transfer, action_set, source_resolution
Source resolution fields: controlling_goal_source, controlling_policy_source
Calculation SOP:
- Compute
estate_contextexactly as in GRAT/CRAT section. - Compute
ilitsub-object using ILIT rules (annual_exclusion_capacity, premium_gap, estate_inclusion_risk, projected_outside_estate_if_implemented). - Compute
trust_transfer:preferred_strategy:GRAT|CRATprojected_remainder_to_heirs,estimated_estate_tax_reduction,projected_charitable_remainder.
- action_set = alphabetically sorted list of applicable actions chosen from:
ATTORNEY_DRAFT_REVIEWCRAT_FOR_CHARITABLE_REMAINDERGRAT_FOR_APPRECIATING_SHARESILIT_CRUMMEY_NOTICE_CYCLELIFETIME_EXEMPTION_ALLOCATION
Recommendation enums:
primary_action:COMBINE_ILIT_AND_GRAT,CRAT_WITH_LIQUIDITY_REVIEW,ILIT_WITH_EXEMPTION_REVIEWsequencing:ILIT_FIRST_THEN_GRAT,TRUST_DECISION_FIRST,ILIT_FIRST_THEN_ATTORNEY_REVIEWrisk_flag: same ILIT risk flags (LOW_IF_FORMALITIES_MET, etc.)
4. Output Field Conventions
Universal Rules
- Return only the final JSON object. No markdown code fences, no prose before or after.
- Include all
required_top_level_keysfrom the template. task_id= the prompt's task identifier (e.g.train_001,test_001).client_id= the stable identifier (e.g.CLT-1001).analysis_type= exact enum string from the template.
Numeric Formatting
- All USD amounts must be JSON numbers (not strings), rounded to two decimal places (cents).
- Correct:
18400000.00 - Wrong:
"18400000.00",18400000(if the evaluator expects cents)
- Correct:
- Years, counts, and other integers can be bare JSON integers.
Date Formatting
- All dates must be ISO 8601:
YYYY-MM-DD. - Example:
2026-01-15.
Enum Strictness
- Use only the enum values explicitly listed in the template. Any deviation causes validation failure.
- Watch for compound enums like
THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL.
Ordering
action_set(inestate_liquidity_action_plan) must be sorted alphabetically.- No ordering constraints for object keys unless the template explicitly states one.
5. Pitfalls & Verification Checklist
- Sub-resources missing: Do not assume
/api/clients/{id}/records,/accounts,/policiesreturn data. They return"client not found"even for valid clients. Derive values from the flat profile + memo context. - String vs Number: Never quote numeric fields. The evaluator checks types strictly.
- RMD Age Errors: SECURE 2.0 changed RMD ages. Verify birth year before computing first RMD year.
- Estate Exemption: Use current-year figures (~$13.99M per person in 2026). Do not use outdated $11.7M or $5M values.
- Source Resolution Defaulting: Do not lazily default to
CRM_NOTE. Apply the hierarchy explicitly. - Action Set Sorting: For
estate_liquidity_action_plan, forgetting to alphabetizeaction_setis a common scoring failure. - Horizon Year Mismatch: Use the planning horizon year from the request memo. If the memo says 2046, all horizon projections must target 2046.
- Missing task_id: Every template requires
task_id. Omitting it causes immediate validation failure. - ISO Date Precision: Crummey windows are 30 days. Compute
withdrawal_window_endas contribution_date + 30 days, not +31 or +29. - MFJ Exclusion Doubling: For ILIT tasks with MFJ clients, both spouses can gift, so per-beneficiary capacity doubles.