Private Wealth Advisory — Task-Group Structured Output Skill
Overview
This skill covers generating structured JSON planning outputs for private wealth advisory engagements: Roth conversion RMD analysis, ILIT Crummey funding, GRAT vs. CRAT trust comparisons, and estate liquidity action plans. The advisory API hosts client records, account exports, life-insurance records, trust candidates, tax policy constants, and RMD factors. Records may conflict across source systems — source resolution is always required.
Environment
The remote advisory API base URL is provided by the harness. Read environment_access.md for the active base URL. The API is reachable over HTTP via curl or equivalent local command-line HTTP clients. Do not start a local environment or use localhost/127.0.0.1 unless the environment file itself explicitly points there.
Workflow (SOP)
Step 1 — Read the task inputs
Always read these files in order:
input/prompt.txt — extracts: client ID, engagement name, analysis type, horizon year (if any).
input/payloads/request_memo.md — extracts: client ID, engagement description, planning horizon year, any special instructions.
input/payloads/answer_template.json — extracts: required top-level keys, field definitions, enum constraints, and ordering rules.
Step 2 — Query the advisory API
Construct an API call using the base URL from environment_access.md. The advisory environment provides computed planning data keyed by client ID and engagement type. Query the relevant endpoint(s) for the client to retrieve:
- Client profile and demographic data
- Account balances and holdings (Traditional IRA, Roth IRA, taxable accounts)
- Life insurance policy records
- Trust candidates (GRAT, CRAT parameters)
- Tax policy constants and RMD factor tables
- Source metadata (which system each record came from)
Key API usage habits:
- Pass the
client_id and analysis_type (or engagement parameters) as query parameters or in the request body as the API expects.
- The API returns structured JSON with source annotations — each data field may have a
source or origin key indicating whether it came from SIGNED_PROFILE, ATTORNEY_MEMO, CUSTODIAN_EXPORT, CRM_NOTE, or STALE_MARKETING_INTAKE.
- Some fields may have multiple conflicting values from different sources; the API returns all of them and the task is to select the controlling value by source priority.
Step 3 — Resolve source conflicts
When the same field appears in multiple source records with different values, resolve by this strict priority order (highest to lowest):
| Priority |
Source |
Use for |
| 1 (highest) |
SIGNED_PROFILE |
Client demographics, goals, beneficiaries, policy elections, stated preferences |
| 2 |
ATTORNEY_MEMO |
Legal documents, asset characterizations, trust parameters, estate planning instruments |
| 3 |
CUSTODIAN_EXPORT |
Account balances, holdings, transaction history, IRA values — this is the gold source for financial account data |
| 4 |
CRM_NOTE |
Advisor notes; use only when no higher-tier source exists |
| 5 (lowest) |
STALE_MARKETING_INTAKE |
Legacy marketing-system imports; use only when nothing else exists |
Default resolution rules observed across all training examples:
controlling_profile_source → SIGNED_PROFILE (always preferred for client identity/preferences)
controlling_account_source → CUSTODIAN_EXPORT (always preferred for financial account values)
controlling_goal_source → SIGNED_PROFILE (always preferred for stated planning goals)
controlling_policy_source → SIGNED_PROFILE (for insurance policy elections)
controlling_beneficiary_source → SIGNED_PROFILE (for beneficiary designations)
controlling_asset_source → ATTORNEY_MEMO (for legal characterization of assets)
Step 4 — Fill the answer template
Construct a JSON object with every key listed in the template's required_top_level_keys. Populate fields according to the template's field definitions and enum constraints. Adhere to these formatting rules:
- Numbers: JSON numbers (not strings), rounded to two decimal places (cents).
- Dates: ISO 8601
YYYY-MM-DD strings.
- Enums: exact-case string from the template's
enum: list — no abbreviations or variants.
- Booleans: JSON
true/false.
- Lists: JSON arrays; when the template says "sorted alphabetically", sort the array elements alphabetically.
- Extra context fields: The API may return additional numeric fields (e.g.,
planning_year, exemption_used, liquid_assets_available) that are not in the template's required-top-level-keys list but provide useful context inside nested objects. Include them in the relevant section when the API provides them.
Step 5 — Apply calculation conventions
Tax Rate Constants
| Constant |
Rate |
Applied To |
| Income tax rate |
32% (0.32) |
Roth conversion amounts, conversion tax |
| Estate tax rate |
40% (0.40) |
Taxable estate, estate tax exposure, death benefit liquidity, estate tax reduction from trust remainder |
| Annual gift-tax exclusion (per beneficiary) |
$20,000 (2026) |
ILIT Crummey gift planning |
Conversion Plan (roth_conversion_rmd)
total_converted = annual_conversion_amount × conversion_years
total_conversion_tax = total_converted × 0.32
conversion_years_positive = conversion_years (always equal)
first_conversion_year = planning_year (typically 2026)
RMD Projection (roth_conversion_rmd)
rmd_tax_savings_through_horizon = baseline_rmd_tax_through_horizon - conversion_rmd_tax_through_horizon
The horizon_year comes from the request memo. The first_rmd_year depends on the client's age (age 73 triggers RMDs under current rules — the API provides this).
Gift Plan (ilit_crummey_implementation)
annual_exclusion_capacity = annual_exclusion_per_beneficiary × beneficiary_count
premium_gap = max(0, annual_premium - annual_exclusion_capacity)
notices_required = beneficiary_count
tax_liquidity_support = death_benefit × 0.40
When estate_inclusion_risk is LOW_IF_FORMALITIES_MET:
projected_outside_estate_if_implemented = death_benefit
ILIT Administration Timeline
Starting from the contribution_date:
notice_due_date = contribution_date + 7 days
withdrawal_window_end = contribution_date + 37 days (30 days after notice due)
earliest_premium_payment_date = withdrawal_window_end + 1 day
dedicated_bank_account_required = true (standard for proper Crummey administration)
Estate Context (trust_comparison, estate_liquidity_action_plan)
estate_tax_exposure = taxable_estate × 0.40
liquidity_gap_before_planning = max(0, estate_tax_exposure - liquid_assets_available)
Trust Projections (trust_comparison, estate_liquidity_action_plan)
estimated_estate_tax_reduction = projected_remainder_to_heirs × 0.40
GRAT term: typically 5 years. CRAT term: typically 20 years (or life of grantor). The estimated_income_tax_deduction for a CRAT is a present-value calculation the API provides.
Legacy Projection (roth_conversion_rmd)
The projected_roth_balance_horizon and projected_traditional_balance_horizon are API-computed future values at the horizon year. The heir_tax_profile is determined by the ratio of Roth to traditional assets:
- Roth significantly larger than traditional →
MOSTLY_TAX_FREE
- Roughly balanced →
MIXED_TAXABLE_AND_TAX_FREE
- Traditional significantly larger →
MOSTLY_TAXABLE
Step 6 — Validate and output
Before writing the final answer:
- Check every required top-level key is present.
- Verify all enums match the template's allowed values exactly (case-sensitive).
- Verify all derived calculations:
rmd_tax_savings_through_horizon = baseline - conversion, total_converted = annual × years, total_conversion_tax = total_converted × 0.32, etc.
- Verify source_resolution keys match the template's controlling source fields.
- Check numbers are JSON numbers, not strings. Use two decimal places for cents.
- Check
task_id matches the actual task directory name (e.g., from prompt.txt or the directory stem).
- Check
action_set arrays (if present) are sorted alphabetically.
- Output only the JSON object — no prose before or after.
Analysis-Type Quick Reference
roth_conversion_rmd
- Used for: Roth conversion and RMD tax comparison
- Required sections:
recommendation, conversion_plan, rmd_projection, legacy_projection, source_resolution
- Source fields:
controlling_profile_source, controlling_account_source
- Recommendation enums:
primary_action ∈ {STAGED_ROTH_CONVERSION, DEFER, NO_CONVERSION}, suitability ∈ {SUITABLE, BORDERLINE, DEFER}, risk_flag ∈ {TAX_BRACKET_MANAGEMENT, LIQUIDITY_CONSTRAINT, RMD_NEAR_TERM}
ilit_crummey_implementation
- Used for: ILIT setup and first premium cycle
- Required sections:
recommendation, gift_plan, administration, estate_result, source_resolution
- Source fields:
controlling_beneficiary_source, controlling_policy_source
- Recommendation enums:
primary_action ∈ {FUND_WITH_CRUMMEY_NOTICES, USE_LIFETIME_EXEMPTION_FOR_SHORTFALL, USE_NEW_POLICY_OR_ACCEPT_LOOKBACK, DISCLOSE_LOOKBACK_AND_USE_EXEMPTION}, suitability ∈ {SUITABLE_WITH_ADMINISTRATION, BORDERLINE, NOT_SUITABLE}, risk_flag ∈ {LOW_IF_FORMALITIES_MET, EXCLUSION_SHORTFALL, THREE_YEAR_LOOKBACK, THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL}
estate_result.estate_inclusion_risk uses the same enum as recommendation.risk_flag
trust_comparison
- Used for: GRAT vs CRAT numerical comparison and recommendation
- Required sections:
recommendation, estate_context, grat, crat, source_resolution
- Source fields:
controlling_goal_source, controlling_asset_source
- Recommendation enums:
preferred_strategy ∈ {GRAT, CRAT}, rationale_code ∈ {CHILDREN_TRANSFER_PRIORITY, PHILANTHROPIC_PRIORITY}, alternate_role ∈ {SECONDARY_CHARITABLE_TOOL, SECONDARY_FAMILY_TRANSFER_TOOL}
- GRAT fields:
term_years (int), projected_remainder_to_heirs, estimated_estate_tax_reduction, mortality_inclusion_risk ∈ {TERM_SURVIVAL_REQUIRED}
- CRAT fields:
term_years (int), projected_charitable_remainder, estimated_income_tax_deduction, family_transfer_fit ∈ {LOW, MODERATE, HIGH}
estate_liquidity_action_plan
- Used for: Combined ILIT + trust transfer + liquidity analysis
- Required sections:
recommendation, estate_context, ilit, trust_transfer, action_set, source_resolution
- Source fields:
controlling_goal_source, controlling_policy_source
- Recommendation enums:
primary_action ∈ {COMBINE_ILIT_AND_GRAT, CRAT_WITH_LIQUIDITY_REVIEW, ILIT_WITH_EXEMPTION_REVIEW}, sequencing ∈ {ILIT_FIRST_THEN_GRAT, TRUST_DECISION_FIRST, ILIT_FIRST_THEN_ATTORNEY_REVIEW}, risk_flag ∈ {LOW_IF_FORMALITIES_MET, EXCLUSION_SHORTFALL, THREE_YEAR_LOOKBACK, THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL}
action_set: array of enums ∈ {ATTORNEY_DRAFT_REVIEW, CRAT_FOR_CHARITABLE_REMAINDER, GRAT_FOR_APPRECIATING_SHARES, ILIT_CRUMMEY_NOTICE_CYCLE, LIFETIME_EXEMPTION_ALLOCATION}, sorted alphabetically
ilit.estate_inclusion_risk uses the same risk_flag enums
Common Pitfalls
- Not resolving conflicting sources. Multiple source systems may return different values for the same field. Always pick the highest-priority source using the table above. Never average or merge conflicting numeric values.
- Wrong tax rate. Use 32% for income tax (conversions), 40% for estate tax. Do not apply estate tax to Roth conversions or income tax to estate calculations.
- Forgetting
premium_gap floor. premium_gap = max(0, annual_premium - annual_exclusion_capacity). Never let it go negative.
- Forgetting
liquidity_gap_before_planning floor. max(0, estate_tax_exposure - liquid_assets_available). Never negative.
- Using strings for numbers. All dollar amounts must be JSON numbers, not strings. Round to two decimal places.
- Wrong
task_id. The task_id is the task directory name (e.g., train_001), not the client ID or a hardcoded string.
- Unsorted
action_set. When the template specifies alphabetical sorting, sort the array. The template for estate_liquidity_action_plan explicitly requires this.
- Missing extra context fields. The API returns fields like
planning_year, exemption_used, liquid_assets_available that are not in the template's required-top-level-keys but should be included in the relevant nested object when available.
- Including prose outside JSON. The output must be the raw JSON object only — no markdown fences, no explanatory text.
- Case sensitivity on enums. All enum values are UPPER_SNAKE_CASE and must match exactly.
LOW_IF_FORMALITIES_MET is not low_if_formalities_met.
conversion_years_positive ≠ conversion_years. In all solved examples these are equal, but the field exists separately — verify from API output.
- Administration date arithmetic. The ILIT timeline follows a fixed cadence from the contribution date: +7d notice due, +37d withdrawal window end, +38d earliest premium payment. Count days inclusively from contribution date.
1---2name: fewshot-attempt-03-323description: Private Wealth Advisory — Task-Group Structured Output Skill4---5# Private Wealth Advisory — Task-Group Structured Output Skill67## Overview89This skill covers generating structured JSON planning outputs for private wealth advisory engagements: Roth conversion RMD analysis, ILIT Crummey funding, GRAT vs. CRAT trust comparisons, and estate liquidity action plans. The advisory API hosts client records, account exports, life-insurance records, trust candidates, tax policy constants, and RMD factors. Records may conflict across source systems — source resolution is always required.1011## Environment1213The remote advisory API base URL is provided by the harness. Read `environment_access.md` for the active base URL. The API is reachable over HTTP via `curl` or equivalent local command-line HTTP clients. Do **not** start a local environment or use localhost/127.0.0.1 unless the environment file itself explicitly points there.1415## Workflow (SOP)1617### Step 1 — Read the task inputs1819Always read these files in order:20211. **`input/prompt.txt`** — extracts: client ID, engagement name, analysis type, horizon year (if any).222. **`input/payloads/request_memo.md`** — extracts: client ID, engagement description, planning horizon year, any special instructions.233. **`input/payloads/answer_template.json`** — extracts: required top-level keys, field definitions, enum constraints, and ordering rules.2425### Step 2 — Query the advisory API2627Construct an API call using the base URL from `environment_access.md`. The advisory environment provides computed planning data keyed by client ID and engagement type. Query the relevant endpoint(s) for the client to retrieve:2829- Client profile and demographic data30- Account balances and holdings (Traditional IRA, Roth IRA, taxable accounts)31- Life insurance policy records32- Trust candidates (GRAT, CRAT parameters)33- Tax policy constants and RMD factor tables34- Source metadata (which system each record came from)3536**Key API usage habits:**3738- Pass the `client_id` and `analysis_type` (or engagement parameters) as query parameters or in the request body as the API expects.39- The API returns structured JSON with source annotations — each data field may have a `source` or `origin` key indicating whether it came from `SIGNED_PROFILE`, `ATTORNEY_MEMO`, `CUSTODIAN_EXPORT`, `CRM_NOTE`, or `STALE_MARKETING_INTAKE`.40- Some fields may have multiple conflicting values from different sources; the API returns all of them and the task is to select the controlling value by source priority.4142### Step 3 — Resolve source conflicts4344When the same field appears in multiple source records with different values, resolve by this **strict priority order** (highest to lowest):4546| Priority | Source | Use for |47|----------|--------|---------|48| 1 (highest) | `SIGNED_PROFILE` | Client demographics, goals, beneficiaries, policy elections, stated preferences |49| 2 | `ATTORNEY_MEMO` | Legal documents, asset characterizations, trust parameters, estate planning instruments |50| 3 | `CUSTODIAN_EXPORT` | Account balances, holdings, transaction history, IRA values — this is the **gold source for financial account data** |51| 4 | `CRM_NOTE` | Advisor notes; use only when no higher-tier source exists |52| 5 (lowest) | `STALE_MARKETING_INTAKE` | Legacy marketing-system imports; use only when nothing else exists |5354**Default resolution rules observed across all training examples:**5556- **`controlling_profile_source`** → `SIGNED_PROFILE` (always preferred for client identity/preferences)57- **`controlling_account_source`** → `CUSTODIAN_EXPORT` (always preferred for financial account values)58- **`controlling_goal_source`** → `SIGNED_PROFILE` (always preferred for stated planning goals)59- **`controlling_policy_source`** → `SIGNED_PROFILE` (for insurance policy elections)60- **`controlling_beneficiary_source`** → `SIGNED_PROFILE` (for beneficiary designations)61- **`controlling_asset_source`** → `ATTORNEY_MEMO` (for legal characterization of assets)6263### Step 4 — Fill the answer template6465Construct a JSON object with every key listed in the template's `required_top_level_keys`. Populate fields according to the template's field definitions and enum constraints. Adhere to these formatting rules:6667- **Numbers**: JSON numbers (not strings), rounded to two decimal places (cents).68- **Dates**: ISO 8601 `YYYY-MM-DD` strings.69- **Enums**: exact-case string from the template's `enum:` list — no abbreviations or variants.70- **Booleans**: JSON `true`/`false`.71- **Lists**: JSON arrays; when the template says "sorted alphabetically", sort the array elements alphabetically.72- **Extra context fields**: The API may return additional numeric fields (e.g., `planning_year`, `exemption_used`, `liquid_assets_available`) that are not in the template's required-top-level-keys list but provide useful context inside nested objects. Include them in the relevant section when the API provides them.7374### Step 5 — Apply calculation conventions7576#### Tax Rate Constants7778| Constant | Rate | Applied To |79|----------|------|-----------|80| Income tax rate | 32% (0.32) | Roth conversion amounts, conversion tax |81| Estate tax rate | 40% (0.40) | Taxable estate, estate tax exposure, death benefit liquidity, estate tax reduction from trust remainder |82| Annual gift-tax exclusion (per beneficiary) | $20,000 (2026) | ILIT Crummey gift planning |8384#### Conversion Plan (`roth_conversion_rmd`)8586```87total_converted = annual_conversion_amount × conversion_years88total_conversion_tax = total_converted × 0.3289conversion_years_positive = conversion_years (always equal)90first_conversion_year = planning_year (typically 2026)91```9293#### RMD Projection (`roth_conversion_rmd`)9495```96rmd_tax_savings_through_horizon = baseline_rmd_tax_through_horizon - conversion_rmd_tax_through_horizon97```9899The `horizon_year` comes from the request memo. The `first_rmd_year` depends on the client's age (age 73 triggers RMDs under current rules — the API provides this).100101#### Gift Plan (`ilit_crummey_implementation`)102103```104annual_exclusion_capacity = annual_exclusion_per_beneficiary × beneficiary_count105premium_gap = max(0, annual_premium - annual_exclusion_capacity)106notices_required = beneficiary_count107tax_liquidity_support = death_benefit × 0.40108```109110When `estate_inclusion_risk` is `LOW_IF_FORMALITIES_MET`:111```112projected_outside_estate_if_implemented = death_benefit113```114115#### ILIT Administration Timeline116117Starting from the `contribution_date`:118- `notice_due_date` = contribution_date + 7 days119- `withdrawal_window_end` = contribution_date + 37 days (30 days after notice due)120- `earliest_premium_payment_date` = withdrawal_window_end + 1 day121- `dedicated_bank_account_required` = `true` (standard for proper Crummey administration)122123#### Estate Context (`trust_comparison`, `estate_liquidity_action_plan`)124125```126estate_tax_exposure = taxable_estate × 0.40127liquidity_gap_before_planning = max(0, estate_tax_exposure - liquid_assets_available)128```129130#### Trust Projections (`trust_comparison`, `estate_liquidity_action_plan`)131132```133estimated_estate_tax_reduction = projected_remainder_to_heirs × 0.40134```135136GRAT term: typically 5 years. CRAT term: typically 20 years (or life of grantor). The `estimated_income_tax_deduction` for a CRAT is a present-value calculation the API provides.137138#### Legacy Projection (`roth_conversion_rmd`)139140The `projected_roth_balance_horizon` and `projected_traditional_balance_horizon` are API-computed future values at the horizon year. The `heir_tax_profile` is determined by the ratio of Roth to traditional assets:141- Roth significantly larger than traditional → `MOSTLY_TAX_FREE`142- Roughly balanced → `MIXED_TAXABLE_AND_TAX_FREE`143- Traditional significantly larger → `MOSTLY_TAXABLE`144145### Step 6 — Validate and output146147Before writing the final answer:1481491. **Check every required top-level key** is present.1502. **Verify all enums** match the template's allowed values exactly (case-sensitive).1513. **Verify all derived calculations**: `rmd_tax_savings_through_horizon = baseline - conversion`, `total_converted = annual × years`, `total_conversion_tax = total_converted × 0.32`, etc.1524. **Verify source_resolution** keys match the template's controlling source fields.1535. **Check numbers are JSON numbers**, not strings. Use two decimal places for cents.1546. **Check `task_id`** matches the actual task directory name (e.g., from `prompt.txt` or the directory stem).1557. **Check `action_set`** arrays (if present) are sorted alphabetically.1568. Output **only** the JSON object — no prose before or after.157158## Analysis-Type Quick Reference159160### `roth_conversion_rmd`161- Used for: Roth conversion and RMD tax comparison162- Required sections: `recommendation`, `conversion_plan`, `rmd_projection`, `legacy_projection`, `source_resolution`163- Source fields: `controlling_profile_source`, `controlling_account_source`164- Recommendation enums: `primary_action` ∈ {STAGED_ROTH_CONVERSION, DEFER, NO_CONVERSION}, `suitability` ∈ {SUITABLE, BORDERLINE, DEFER}, `risk_flag` ∈ {TAX_BRACKET_MANAGEMENT, LIQUIDITY_CONSTRAINT, RMD_NEAR_TERM}165166### `ilit_crummey_implementation`167- Used for: ILIT setup and first premium cycle168- Required sections: `recommendation`, `gift_plan`, `administration`, `estate_result`, `source_resolution`169- Source fields: `controlling_beneficiary_source`, `controlling_policy_source`170- Recommendation enums: `primary_action` ∈ {FUND_WITH_CRUMMEY_NOTICES, USE_LIFETIME_EXEMPTION_FOR_SHORTFALL, USE_NEW_POLICY_OR_ACCEPT_LOOKBACK, DISCLOSE_LOOKBACK_AND_USE_EXEMPTION}, `suitability` ∈ {SUITABLE_WITH_ADMINISTRATION, BORDERLINE, NOT_SUITABLE}, `risk_flag` ∈ {LOW_IF_FORMALITIES_MET, EXCLUSION_SHORTFALL, THREE_YEAR_LOOKBACK, THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL}171- `estate_result.estate_inclusion_risk` uses the same enum as `recommendation.risk_flag`172173### `trust_comparison`174- Used for: GRAT vs CRAT numerical comparison and recommendation175- Required sections: `recommendation`, `estate_context`, `grat`, `crat`, `source_resolution`176- Source fields: `controlling_goal_source`, `controlling_asset_source`177- Recommendation enums: `preferred_strategy` ∈ {GRAT, CRAT}, `rationale_code` ∈ {CHILDREN_TRANSFER_PRIORITY, PHILANTHROPIC_PRIORITY}, `alternate_role` ∈ {SECONDARY_CHARITABLE_TOOL, SECONDARY_FAMILY_TRANSFER_TOOL}178- GRAT fields: `term_years` (int), `projected_remainder_to_heirs`, `estimated_estate_tax_reduction`, `mortality_inclusion_risk` ∈ {TERM_SURVIVAL_REQUIRED}179- CRAT fields: `term_years` (int), `projected_charitable_remainder`, `estimated_income_tax_deduction`, `family_transfer_fit` ∈ {LOW, MODERATE, HIGH}180181### `estate_liquidity_action_plan`182- Used for: Combined ILIT + trust transfer + liquidity analysis183- Required sections: `recommendation`, `estate_context`, `ilit`, `trust_transfer`, `action_set`, `source_resolution`184- Source fields: `controlling_goal_source`, `controlling_policy_source`185- Recommendation enums: `primary_action` ∈ {COMBINE_ILIT_AND_GRAT, CRAT_WITH_LIQUIDITY_REVIEW, ILIT_WITH_EXEMPTION_REVIEW}, `sequencing` ∈ {ILIT_FIRST_THEN_GRAT, TRUST_DECISION_FIRST, ILIT_FIRST_THEN_ATTORNEY_REVIEW}, `risk_flag` ∈ {LOW_IF_FORMALITIES_MET, EXCLUSION_SHORTFALL, THREE_YEAR_LOOKBACK, THREE_YEAR_LOOKBACK_AND_EXCLUSION_SHORTFALL}186- `action_set`: array of enums ∈ {ATTORNEY_DRAFT_REVIEW, CRAT_FOR_CHARITABLE_REMAINDER, GRAT_FOR_APPRECIATING_SHARES, ILIT_CRUMMEY_NOTICE_CYCLE, LIFETIME_EXEMPTION_ALLOCATION}, **sorted alphabetically**187- `ilit.estate_inclusion_risk` uses the same risk_flag enums188189## Common Pitfalls1901911. **Not resolving conflicting sources.** Multiple source systems may return different values for the same field. Always pick the highest-priority source using the table above. Never average or merge conflicting numeric values.1922. **Wrong tax rate.** Use 32% for income tax (conversions), 40% for estate tax. Do not apply estate tax to Roth conversions or income tax to estate calculations.1933. **Forgetting `premium_gap` floor.** `premium_gap = max(0, annual_premium - annual_exclusion_capacity)`. Never let it go negative.1944. **Forgetting `liquidity_gap_before_planning` floor.** `max(0, estate_tax_exposure - liquid_assets_available)`. Never negative.1955. **Using strings for numbers.** All dollar amounts must be JSON numbers, not strings. Round to two decimal places.1966. **Wrong `task_id`.** The `task_id` is the task directory name (e.g., `train_001`), not the client ID or a hardcoded string.1977. **Unsorted `action_set`.** When the template specifies alphabetical sorting, sort the array. The template for `estate_liquidity_action_plan` explicitly requires this.1988. **Missing extra context fields.** The API returns fields like `planning_year`, `exemption_used`, `liquid_assets_available` that are not in the template's required-top-level-keys but should be included in the relevant nested object when available.1999. **Including prose outside JSON.** The output must be the raw JSON object only — no markdown fences, no explanatory text.20010. **Case sensitivity on enums.** All enum values are UPPER_SNAKE_CASE and must match exactly. `LOW_IF_FORMALITIES_MET` is not `low_if_formalities_met`.20111. **`conversion_years_positive` ≠ `conversion_years`.** In all solved examples these are equal, but the field exists separately — verify from API output.20212. **Administration date arithmetic.** The ILIT timeline follows a fixed cadence from the contribution date: +7d notice due, +37d withdrawal window end, +38d earliest premium payment. Count days inclusively from contribution date.