Calculation catalog › Taxes

MCP batch cumulative tax objective

Sum of each evaluated candidate projection's taxes and penalties, published as batch_evaluate's cumulative_tax objective.

Field: Batch cumulative tax objective Unit: US dollars Basis: nominal dollars Computed by: Engine Status: Complete chain

Appears in: mcp (batch_evaluate.results[].objective)

Calculation records

  • MCP batch cumulative tax objective Composition record, justified by derivation

    Purpose: The figure RetireGolden-MCP's batch_evaluate ranks candidates on under objective cumulative_tax: each candidate plan's lifetime tax plus penalties.

    Statement: For objective=cumulative_tax, RetireGolden-MCP's batch_evaluate reports, for each candidate plan it projects, projection/compare.ts#summarizeProjection's lifetimeTaxesAndPenalties: the sum over every projection year, in ledger order from 0, of that year's YearResult.tax plus YearResult.penalties, each in that year's nominal dollars, undiscounted. tax already holds the federal AMT, penalties (early-withdrawal penalties and the IRC 4974 excise) are not in tax, and Medicare premiums and their IRMAA surcharges are in neither. The engine publishes the figure and the adapter selects it, since RetireGolden-MCP 0.11.0 (#81) and so at b2c7f717 (0.12.0, the census's MCP pin until 2026-10-11); through mcp-v0.10.0 (3197d359) the adapter reduced the same two fields itself. On the worksheet's four-year ledger the objective is 67,191.52. Units: nominal USD. Rounding: none.

    Formula: objective = Σ_y (tax_y + penalties_y), added in ledger order from 0

    • tax_y: Year y published tax, AMT included (unit: nominal USD of year y) (domain: finite, nonnegative)
    • penalties_y: Year y early-withdrawal penalties and IRC 4974 excise, not in tax (unit: nominal USD of year y) (domain: finite, nonnegative)

    Timing: once per evaluated candidate, over every projection year

    Rounding: none

    Limits:

    • Nominal and undiscounted, as the name cumulative says: a tax dollar paid in the last year counts the same as one paid in the first, so candidates that shift tax in time are ranked on nominal totals, not present values.
    • The mcp-v0.10.0 adapter (3197d359) added each year's tax and then its penalties to the running total; the engine adds each year's tax plus penalties as one term. The two orders can differ in the last binary digit, never by a cent on ledger-sized figures; on the worksheet's ledger they give the same double, which the evidence asserts, and RetireGolden-MCP #81's parity test holds them within a cent on its plans.
    • The engine function is the figure; which objective name selects it is RetireGolden-MCP code, covered by that repository's wiring test, not by this record.

    Provenance: derived by claude, implemented by claude.

    Independent review: codex

    Gates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass

    Worksheet: mcp-batch-cumulative-tax-objective.md Mutation receipt: mcp-batch-cumulative-tax-objective.mutation.md

    Evidence tests: compareSummary.mcpObjectives.evidence.test.ts

    Implemented in: compare.ts

    Is the number of: mcp-batch-cumulative-tax-objective

Engine source: engine/src/projection/compare.ts (ProjectionSummary.lifetimeTaxesAndPenalties)

The evidence links on this page (each record's worksheet, mutation receipt, evidence tests and implementation, and the source links) are pinned to engine commit 2624dbdba9fd, committed 2026-10-11. The live calculation index and output-family census links point at the repository's main branch, so you can check this snapshot against them.