Skip to content

feat: Roth · IRMAA planner tab (PlanningContract v1.0.0 composite)#3

Merged
rivendale merged 1 commit into
mainfrom
feat/roth-irmaa-planner
Jun 3, 2026
Merged

feat: Roth · IRMAA planner tab (PlanningContract v1.0.0 composite)#3
rivendale merged 1 commit into
mainfrom
feat/roth-irmaa-planner

Conversation

@rivendale
Copy link
Copy Markdown
Contributor

Intent

Add a "Roth · IRMAA" tab for the composite multi-year Roth-conversion analysis, where the binding constraint is IRMAA (Medicare surcharges), not the tax bracket.

Scope

  • New: src/contract/roth-conversion.ts (UI-side mirror of the case contract — @protocolwealthos/planning-contract / the nexus-core JSON-Schema — versioned separately as PLANNING_CASE_CONTRACT_VERSION = 1.0.0), RothIrmaaPlannerTool.tsx (form + results).
  • Changed: planning-gateway.ts (+analyzeRothConversion, PII-free, opaque case_id at dispatch), tool-validation.ts (+validateRothIrmaa), store/scenario.ts (slice), App.tsx (tab).
  • Renders per year: recommended amount under fill-to-22% / fill-to-24% / just-under-IRMAA (with a crosses-cliff flag), the IRMAA cliff cost, incremental federal + state tax, NIIT + LTCG deltas, breakeven, the binding constraint; plus the multi-year roll-up and the do-nothing RMD drag. The projected-IRMAA-with-buffer assumption is a prominent fiduciary disclosure banner, not fine print.
  • Components are contract-typed → a breaking contract change is a compile error. Stays a dependency-light thin shell (mirrors the types rather than depending on the unpublished package).

Test plan

typecheck / lint / format / 185 tests / build all green. Engine side in nexus-core (analyze_roth_conversion); the tab works once that deploys.

Compliance notes

PII-free contract by construction; assertNoPII tripwire + auditCall seam unchanged. "Software, not investment advice" disclaimer retained; the projected-tier assumption is surfaced as a fiduciary disclosure.

Handoff

Cross-repo ABI: shared/architecture/roth-irmaa-planning-abi.md.

🤖 Generated with Claude Code

A new pwplan-core tab for the composite multi-year Roth-conversion analysis,
where the binding constraint is IRMAA (Medicare surcharges), not the tax bracket.

- src/contract/roth-conversion.ts: UI-side mirror of the case contract
  (@protocolwealthos/planning-contract / nexus-core JSON-Schema), versioned
  separately as PLANNING_CASE_CONTRACT_VERSION = 1.0.0. PII-free invariant
  enforced by roth-conversion.test.ts.
- analyzeRothConversion gateway method: PII-free transport, opaque case_id
  generated at dispatch, envelope-version checked.
- RothIrmaaPlannerTool: contract-typed form + results. Per year: recommended
  amount under fill-to-22 / fill-to-24 / just-under-IRMAA (crosses-cliff flag),
  IRMAA cliff cost, incremental federal + state tax, NIIT + LTCG deltas,
  breakeven, binding constraint; plus the multi-year roll-up and the do-nothing
  RMD drag. The projected-IRMAA-with-buffer assumption is a prominent fiduciary
  disclosure banner, not fine print.
- validateRothIrmaa + store slice + App tab.
- typecheck / lint / format / 185 tests / build all green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Nick Rygiel <nick@protocolwealthllc.com>
@rivendale rivendale merged commit 54783b8 into main Jun 3, 2026
9 checks passed
@rivendale rivendale deleted the feat/roth-irmaa-planner branch June 3, 2026 23:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant