Calculation catalog › Social Security

Social security FICA return ratio

The benefits a person is paid, on their own record or a former spouse's when larger (those already received plus the expected present value of the rest), divided by the OASDI tax their career pays (paid in so far and on the projected work the PIA counts), both in today's dollars.

Field: Benefits-to-contributions ratio Unit: factor Basis: no dollar basis Computed by: UI-native Status: Complete chain

Appears in: ss-page (Paid-in table "Ratio (get back ÷ paid in)" and "Benefits already received (YEAR dollars)")

Calculation records

  • Benefits received per dollar of Social Security tax paid Formula record, justified by derivation

    Purpose: Compare the benefits a person is paid, on their own record or a former spouse's when larger, with the Social Security tax their career pays, both in today's dollars.

    Statement: socialSecurity/analysis/oasdiReturn.ts#oasdiReturnForPerson takes, for a person with an earnings history and a PIA the projection can pay, the expected present value of their benefits from the start year (socialSecurity/analysis/expectedValue.ts#expectedPvSingle at the stream's claim age with its months, the former-spouse records and the earnings test on the person's wages; a person in a couple is married while the spouse lives, weighted by the spouse's survival), the benefits already received from the claim year to the year before the start at the start-year amount (#singleBenefitInYear for each of those years, with no discount), and the OASDI tax in today's dollars (#oasdiPaidIn): paid in so far, and on the projected work, the years socialSecurity/piaFromEarnings.ts#resolveStreamPiaMonthly's computation fills from the earnings projection, so the tax and the PIA cover the same career; #benefitsToContributionsRatio divides the sum of the first two by the sum of the last two, and gives no ratio when nothing is paid in. A benefit the ledger pays as a disability benefit from its onset (#disabilityReplacesClaimAge) gets no comparison, and the page says why. Units: a pure number. Rounding: none; the page prints two decimals and "x".

    Formula: ratio = (getBackPv + receivedBeforeStart) / (paidInToday + projectedToday), none when the sum <= 0

    • getBackPv: Expected present value of the benefits from the start year (unit: usd) (domain: nonnegative)
    • receivedBeforeStart: Benefits from the claim year to the year before the start, at the start-year amount (unit: usd) (domain: nonnegative)
    • paidInToday: OASDI tax paid so far, in start-year dollars (unit: usd) (domain: nonnegative)
    • projectedToday: OASDI tax on the projected work the PIA counts, in start-year dollars (unit: usd) (domain: nonnegative)

    Timing: once, at the start year

    Rounding: none

    Limits:

    • The tax paid is restated for prices only, with no interest, while the future benefits are discounted at the chosen real rate
    • The benefits the person is paid on their own record, or on a former spouse's when larger (a divorced spouse's while unmarried: in a single household, or in a couple after the spouse's death); the insurance value of disability and survivor benefits, benefits paid to others on the record and a current spouse's benefit are left out
    • The benefits from the start year carry the earnings test on the person's wages; the benefits already received are counted as paid in full, since the plan holds no record of what was withheld before it starts
    • A benefit paid as a disability benefit from its onset is not compared, since the claim age the get-back is priced at would not start it
    • Benefits already received are counted at the start-year amount, a constant real amount, not as they were paid
    • The employer's share is shown beside it as context, not counted in the tax paid

    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: benefits-to-contributions-ratio.md Mutation receipt: benefits-to-contributions-ratio.mutation.md

    Evidence tests: oasdiReturn.ratio.evidence.test.ts

    Implemented in: oasdiReturn.ts; piaFromEarnings.ts

    Is the number of: social-security-fica-return-ratio

Records that feed this number

  • One-year death probability: SSA's published q(x) Formula record, justified by derivation

    Purpose: The annual death probability of a man or a woman that every survival curve and stochastic-longevity draw reads, straight from SSA's published table.

    Statement: montecarlo/deathProbability.ts#annualMortality(age, sex) (re-exported by montecarlo/mortality.ts), for a man or a woman of age a with x = floor(a): the probability of dying within one year is the death probability SSA publishes for that sex and exact age x in Table 4C6 (ssa-period-life-table), for x from 0 to 118. At 119 and above it is 1: the table's last row is closed, so a life at 119 dies during that year, although SSA prints 0.926604 there. Below 0 it is 0. A person whose sex is 'average' has no single death probability, and the function refuses 'average' with a RangeError; the survival curve builds 'average' as the mixture of the two sexes (survival-probability-product). Units: probability. Rounding: none; the published six decimals.

    Formula: q(a) = q_SSA(sex, floor(a)) for 0 <= floor(a) <= 118; q(a) = 1 for floor(a) >= 119; q(a) = 0 for floor(a) < 0

    • a: Age as passed (unit: years) (domain: real)
    • q_SSA(sex, x): SSA's published probability of dying within one year at exact age x, male or female column (ssa-period-life-table) (unit: 1) (domain: [0, 1], six decimals)
    • q(a): Probability of dying between ages floor(a) and floor(a) + 1 (unit: 1) (domain: 0 <= q(a) <= 1)

    Timing: one-year transition between consecutive integer ages

    Rounding: none

    Limits:

    • The table end: SSA prints q(119) = 0.926604 for both sexes, and e(119) = 0.58, which counts life past 120; the engine closes the table at 119 instead, as the Monte Carlo horizon and the expected-value loops assume. Reading the printed q(119) and closing the table at 120 would change the chance of being alive at 120 from 0 to 6.8e-12 for a man and 2.3e-11 for a woman of 65, 2.8e-7 at 110, 0.00138 at 117 and 0.0734 for someone already 119, and would change no survival probability to an age below 120
    • The period table is applied unchanged to the person's whole remaining life: it describes 2023's death rates, not an individual's risk or future mortality improvement
    • No interpolation within a year of age: a fractional age reads the row of its whole years
    • A negative age returns 0 and is not flagged

    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: mortality-published-death-probability.md Mutation receipt: mortality-published-death-probability.mutation.md

    Evidence tests: mortality.evidence.test.ts

    Implemented in: deathProbability.ts

    Feeds: longevity-survival-percentile-age, monte-carlo-success-rate, monte-carlo-ending-investable-histogram, social-security-expected-present-value, social-security-survivor-switch-pv, social-security-fica-return-ratio, income-annuity-annual, spending-base-annual

  • Social Security tax paid in, in today's dollars Formula record, justified by derivation

    Purpose: Sum the Social Security tax paid over an earnings history, and the tax the projected work the benefit estimate counts will pay, at each year's rate and wage base, restated in today's dollars by consumer prices.

    Statement: socialSecurity/analysis/oasdiReturn.ts#oasdiPaidIn adds the history's rows by calendar year, and for each year from 1937 to the start year taxes the year's earnings capped at its contribution and benefit base (socialSecurity/ssaWageData.ts#WAGE_BASE_BY_YEAR, the latest base for a later year) at the year's effective rate (socialSecurity/oasdiTaxRates.ts#OASDI_TAX_RATE_BY_YEAR: the employee's, or the self-employed rate; the 2026 row for a later year), and restates the tax by I(y) = CPI(L)/CPI(y) x (1 + i)^(start year - L) for a year up to L, the latest year with a published CPI-U annual average (socialSecurity/cpiU.ts), and (1 + i)^(start year - y) after it, with i the plan's inflation. An entered year through the start year is paid in so far; the projected work, the years the PIA computation's earnings projection fills (passed by #oasdiReturnForPerson from socialSecurity/piaFromEarnings.ts#computePiaFromEarnings) and any entered year after the start, is taxed the same way and restated from the start year at the latest, a factor of 1 after it, since the PIA computation counts a later year at its face amount on the latest base and wage index. It publishes the person's tax and the employer's on each part, the one paid so far also as paid, and names the years it did not count: before 1937, or self-employed before 1951. Units: start-year dollars and dollars as paid. Rounding: none.

    Formula: paidInToday = sum over entered y <= start of min(E(y), base(y)) x rate(y) / 100 x I(y); projectedToday = sum over projected y of min(E(y), base(y)) x rate(y) / 100 x I(min(y, start)); I(y) = CPI(L)/CPI(y) x (1 + i)^(start - L) for y <= L, else (1 + i)^(start - y)

    • E(y): Covered earnings in year y, the rows for the year added (unit: usd/year) (domain: nonnegative)
    • base(y): Contribution and benefit base for year y (unit: usd/year) (domain: positive from 1937)
    • rate(y): Effective OASDI rate for year y: the employee's, or the self-employed rate (unit: percent) (domain: 1 to 12.4)
    • CPI(y), L: CPI-U annual average for year y; the latest year published (unit: index, year) (domain: positive; 2025)
    • i: The plan's yearly inflation (unit: rate/year) (domain: above -1)

    Timing: calendar years from 1937 to the start year, and the projected years after it

    Rounding: none; the page prints whole dollars

    Limits:

    • Restated for prices only: no interest is credited on the tax paid, while the benefits it is compared with are discounted at a real rate
    • The self-employed credits of 2.7, 2.3 and 2.0 percent in 1984, 1985 and 1986 to 1989 were allowed against the combined OASDI and HI tax and are not allocated to OASDI by the source, so the self-employed figure for those years is high by at most those credits
    • The employer exemption of 2010 for certain new hires is employer-specific and not modeled
    • Years after the latest published CPI-U annual average, and the step from it to the start year, use the plan's inflation
    • The history is taken as taxed Social Security earnings: for a self-employed year, net earnings from self-employment, with no separate self-employment deduction
    • The projected work is the PIA computation's: its assumed earnings at their face amount on the latest published base and today's rates, and only the years its window counts, through the year the person turns 61; with an entered PIA there is no projected work

    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: oasdi-paid-in-today-dollars.md Mutation receipt: oasdi-paid-in-today-dollars.mutation.md

    Evidence tests: oasdiReturn.paidIn.evidence.test.ts

    Implemented in: oasdiReturn.ts; oasdiTaxRates.ts; cpiU.ts; ssaWageData.ts

    Is the number of: social-security-oasdi-paid-in

    Feeds: social-security-fica-return-ratio

  • Benefits-only expected present value of Social Security Model record, justified by derivation

    Purpose: Value a claiming strategy by its benefits alone: each year's benefits, priced by the ledger's rules, weighted by the chance of being alive and discounted.

    Statement: socialSecurity/analysis/expectedValue.ts values a claiming strategy as the survival-weighted, discounted sum of the benefits on each path the household can take, each year of each path priced by the ledger's own year function (socialSecurity/householdYear.ts#socialSecurityYear, through analysis/householdPaths.ts#priceHouseholdPaths) with the plan's wages and exempt amounts, so the earnings test, the crediting months and the former-spouse records are the ledger's. #expectedPvSingle sums, for each year t from the start year while the person is at most 119, S(t) x paid(t) x (1 + r)^-t, where S is montecarlo/survival.ts#survivalCurve from the current age and paid(t) the year's benefits in start-year dollars (nominal over the plan's inflation factor, which carries the ledger's COLA factor over its inflation factor times the haircut); a claimant in a couple is married while the given spouse lives and unmarried after the spouse's death, weighted by the spouse's survival. #expectedPvCouple sums, for independent lives, S_A(t) S_B(t) both(t) plus, for each earlier death year k of one spouse, the survivor's S(t) x the other's probability of dying in year k x alone(t, k): both(t) is the year on the path on which both are alive, from the start year with no crediting months, and alone(t, k) the survivor's year on the path on which the other died in December of year k, from the crediting months both had reached at the end of year k, the deceased's included. A path stops changing once every claim, full-retirement-age and former-spouse gate is past, and from then its benefits are priced once in today's dollars and carried by the real COLA drift and haircut. #benefitsOnlyRanking prices every whole-year claim-age combination from 62 to 70 (none before the age reached in the start year; 70 alone past it) for one or two claimants on the PIA the projection pays from, and ranks them highest first, on the plan's own household (a lone claimant in a couple is weighted by the spouse's survival), and names for each row the people whose excess earnings the test charges on the path on which everyone lives; the paths do not depend on the rate, so #priceBenefitsOnlyRanking prices them for a plan and start year and #weighBenefitsOnlyRanking weighs them at a rate, and #benefitsOnlyRanking does both on each call and keeps nothing between calls. A claim already made (its claim year, birth year plus claim years, before the start year: socialSecurity/openClaims.ts#isClaimAlreadyMade, the claim-age searches' one test) is held at its own claim age and named, and nothing is ranked when every claim is; a claimant whose benefit is paid as a disability benefit from its onset is named instead. Units: start-year dollars. Rounding: none in the model; the earnings test's excess is reduced to the dollar and benefits are not rounded, as in the ledger.

    Formula: single: sum_t S(t) paid(t) (1 + r)^-t; couple: sum_t (1 + r)^-t [S_A S_B both(t) + sum_{k<t} S_A(t) D_B(k) alone_A(t, k) + sum_{k<t} S_B(t) D_A(k) alone_B(t, k)]

    • S(t): Probability of being alive t years after the start year, from the engine's survival curve (unit: 1) (domain: [0, 1])
    • D(k): Probability of dying in year k, alive through it (unit: 1) (domain: [0, 1])
    • paid(t), both(t), alone(t, k): A path's benefits in year t after the earnings test, in start-year dollars: nominal over the inflation factor, so the COLA drift and haircut are in them (unit: usd/year) (domain: nonnegative)
    • r: Real discount rate (unit: rate/year) (domain: above -1; 0 to 8% on the page)

    Timing: annual survival weights, from the start year to age 119; each year priced month by month where a month can differ

    Rounding: none; the earnings test's excess is reduced to the dollar and benefits are not rounded, as in the ledger

    Limits:

    • Independent lifetimes on the SSA period table applied to the cohort
    • A person whose sex is 'average' has the 50/50 mixture of the two sexes' survival curves (survival-probability-product), so a single's value is exactly the mean of a man's and a woman's; a couple of two 'average' people is the average over the four equally likely sex pairings, not "an opposite-sex couple, order unknown", which would differ by up to 0.135 percent of a row on the examples' two such couples and change no top claim age at 0, 2 or 4 percent
    • Annual steps: a whole year of benefits in each year the survival weight reaches, and deaths in December of the death year, the ledger's convention
    • One claim age per person: a widow(er) is paid from the later of the year after the death and their own claim year, and cannot take the widow(er) benefit first and their own later, as in the ledger (usc-42-402-r-survivor-deemed-filing-exemption); the survivor switching analysis covers a widow(er) living alone
    • The earnings test is the ledger's, on the plan's wage rows: whole calendar years spread evenly over their months, with no grace year (cfr-20-404-435-grace-year-monthly-earnings-test); only wage streams are earnings (usc-42-403-f-5-earnings-counted); exempt amounts after the latest published year grow at the plan's inflation (usc-42-403-f-8-earnings-test-exempt-amounts)
    • Deterministic: the plan's flat inflation carries the wages, the exempt amounts and the COLA; Monte Carlo market paths are not priced here
    • A claim at a whole age pays the whole calendar year it is attained; its months before the first month of entitlement are paid in full and never charged, so never credited, since no excess is charged to a month for which the person is not entitled (42 U.S.C. 403(f)(1)(A); usc-42-403-f-1-earnings-test-month-charging, poms-rs-00615-482-arf-crediting-months)
    • No taxes, disability benefit, child benefit or lump-sum death payment
    • The family maximum is applied with the ledger's own helper (socialSecurity/familyMaximum.ts#currentSpouseMonthlyUnderFamilyMaximum): half the worker's PIA is held first to the maximum less that PIA (20 CFR 404.404), which is at least half the PIA less the rounding of the maximum to the dime, so with one spouse it binds by at most 10 cents a month
    • A death before 62 passes on the PIA as entered, as the survivor benefit calculation does
    • A couple member's former-spouse records are priced as the ledger prices them: a survivor record while married only after a remarriage at 60 or later, or with the remarriage age blank, which is read as no remarriage (cfr-20-404-335-ordinary-widow-eligibility); a remarriage before 60 is read as the current marriage and bars the benefit until the January after the current spouse's death; a living ex's record pays from that January (usc-42-402-b-1-C-divorced-spouse-after-widowhood); the plan holds no divorce date, so a divorce of two years or more is taken
    • Months withheld before the start year, for a claim already made, are not in the plan: every path starts with no crediting months
    • Benefits are scheduled in full unless the plan sets a haircut, and are worth their start-year amount in real terms unless the plan's COLA differs from its inflation
    • A claim already made is not re-ranked: withdrawal of an application within 12 months and voluntary suspension from full retirement age are not modeled, as in the claim-age sweep

    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: social-security-expected-value.md Mutation receipt: social-security-expected-value.mutation.md

    Evidence tests: expectedValue.evidence.test.ts

    Implemented in: expectedValue.ts; householdPaths.ts; householdYear.ts; claimants.ts; familyMaximum.ts; survival.ts; openClaims.ts

    Is the number of: social-security-expected-present-value

    Feeds: social-security-fica-return-ratio

  • SSA period life table, 2023 (2026 Trustees Report) Data record, justified by derivation

    Purpose: The death probabilities and life expectancies by age and sex that every survival figure and the longevity questionnaire read.

    Statement: longevity/ssaPeriodLifeTable.ts#SSA_PERIOD_LIFE_TABLE carries SSA's Table 4C6 period life table for 2023, as used in the 2026 Trustees Report: the probability of dying within one year, q(x), and the period life expectancy, e(x), at each exact age x from 0 to 119, for men and for women, as printed (q to six decimals, e to two), read from SSA's page on 2026-09-27. Its source record names the page, the table's caption, the period and Trustees Report years, the read date, an Internet Archive capture of the page and the SHA-256 of the four columns in a canonical text, which the evidence rebuilds from the numbers. #LAST_TABLE_AGE is the last row, 119. #baselineRemainingYears reads e: the printed e(x) at a whole age, linear between the two rows at a fractional one, and for 'average' the mean of the male and female values; the longevity questionnaire prints it as its baseline. #CURRENT_LIFE_TABLE_EDITION names the edition a percentile pick or a saved questionnaire result records, and #storedLifeTableEdition reads a stored figure that names none as made on the 2022 period table of the 2025 Trustees Report, the table the engine carried before. Units: probability; years. Rounding: none; the printed figures.

    Limits:

    • The number-of-lives columns SSA also prints are not carried; nothing reads them
    • A period table: 2023's death rates at every age, applied to a person's whole remaining life, not a cohort projection with future mortality improvement
    • When SSA publishes the next edition, the embedded table trails it until a reviewed data change replaces it; the tax-rule record for the table's edition (SSA Table 4C6) names it and is re-verified yearly (annuallyIndexed, the rules:due queue and verify:quotes, whose quoted introduction and row 65 stop matching the page when the edition changes)
    • The last row is closed: the engine reads q(119) as 1 (mortality-published-death-probability) although the table prints 0.926604 there for both sexes; the printed value is carried, not read
    • Which projections read it. The year-by-year projection reads the table in two cases only: when a plan's amortization-based spending is set to amortize to the age reached with a 25 or 10 percent chance (projection/simulate.ts, through survival-percentile-age and joint-survival-percentile-age, worked out again on every projection), and when a plan holds a joint-and-survivor annuity whose exclusion ratio is fixed (projection/annuityForms.ts, through mortality-joint-last-survivor-expectancy). Such a plan gets new year-by-year figures when the table changes: under-saved-single with its spending amortized to the 25 percent age ends with an after-tax estate of $9,840 on the 2022 table and $212,538 on the 2023 table. The Social Security analysis page, the percentile picker, the questionnaire and Monte Carlo with longevity modelled read it on their own pages; a percentile pick is stored once with its edition and not recomputed

    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: ssa-period-life-table.md Mutation receipt: ssa-period-life-table.mutation.md

    Evidence tests: ssaPeriodLifeTable.evidence.test.ts

    Implemented in: ssaPeriodLifeTable.ts

    Feeds: longevity-survival-percentile-age, monte-carlo-success-rate, monte-carlo-ending-investable-histogram, social-security-expected-present-value, social-security-survivor-switch-pv, social-security-fica-return-ratio, income-annuity-annual, spending-base-annual

  • The survival curve: product of hazard-adjusted one-year survivals, and the 50/50 mixture for 'average' Formula record, justified by derivation

    Purpose: The probability someone alive today is still alive at a later integer age, on SSA's published death probabilities with an optional health hazard.

    Statement: montecarlo/survival.ts#survivalCurve is the engine's one survival curve, for a whole starting age a (at least 0), sex and hazard power h (a positive finite number, default 1). For a man or a woman, survivalTo(t) = product over x = a..a+t-1 of (1 - q(x))^h (mortality-published-death-probability), multiplied left to right, where the factor is 0 when q(x) >= 1; 1 for t <= 0, and 0 once the running product reaches 0; deathProbabilityInYear(t) = survivalTo(t) x (1 - (1 - q(a + t))^h); and deathProbabilityGivenAlive(t) = 1 - (1 - q(a + t))^h, which at h = 1 is q(a + t) itself. For 'average', survivalTo(t) is the mean of the man's and the woman's survivalTo(t) from a, each under the power h: the chance for someone equally likely to be either; deathProbabilityInYear(t) = survivalTo(t) - survivalTo(t + 1); and deathProbabilityGivenAlive(t) = 1 - survivalTo(t + 1)/survivalTo(t), or 1 once survivalTo(t) is 0. Both death probabilities are 0 for t < 0. A fractional age or an invalid hazard is refused. #survivalProbabilityTo(c, sex, g, h) is a view of it: with from = floor(max(c, 0)) and to = floor(g), it returns 1 when to <= from and otherwise the curve from `from` at t = to - from, the same product in the same order. The percentile ages, the hazard solver, the death-age draw, the joint expectancy and the Social Security analysis models read the curve. Units: probability. Rounding: none.

    Formula: S(t) = prod_{x=a}^{a+t-1} (1 - q(x))^h for a man or a woman; S_average(t) = (S_male(t) + S_female(t))/2; S = 1 when t <= 0

    • a, t: Whole starting age and whole years elapsed (unit: years) (domain: integer, a >= 0)
    • q(x): SSA's published one-year death probability at x for the sex (mortality-published-death-probability) (unit: 1) (domain: [0, 1])
    • h: Proportional-hazards power (q' = 1 - (1 - q)^h; h > 1 is worse health), applied to each sex before mixing (unit: 1) (domain: h > 0)
    • S: Probability of being alive t years on (unit: 1) (domain: [0, 1])

    Timing: annual; one factor per integer age from the current age up to, not including, the target

    Rounding: none

    Limits:

    • Ages are floored; a fractional current or target age is not interpolated
    • A target at or below the current age returns exactly 1 without consulting the table
    • survivalProbabilityTo does not validate the hazard power (a non-positive h is used as passed); survivalCurve refuses one
    • annualSurvival is module-private; survivalCurve and survivalProbabilityTo read it, and the evidence reaches it through both
    • 'average' is the 50/50 mixture of the two sexes' curves from the person's current age, not a q(x) table: its one-year chance of dying given alive depends on the starting age, because the survivors of a mixed group become more female with age (at 90: 0.14086 for a mixture formed at 22, 0.14155 at 65 and 0.14327 at 85, against the mean q 0.144317). Every survival probability, the life expectancy (0.5 plus the sum of the survivals) and every expected value linear in the curve are the means of the male and female ones; ages read off the curve and hazard powers solved on it are not (at 65 the ages reached with 50, 25 and 10 percent chance are 85, 91 and 95, against 83, 89 and 94 for a man and 86, 92 and 96 for a woman)
    • The hazard power applies to each sex's curve before mixing: the person is one sex or the other, with that sex's death rates raised to h, and one power serves both halves
    • Two 'average' people are independent mixtures: each is a man or a woman with probability 1/2, independently of the partner, so a couple's expected value, joint expectancy or either-alive probability is the average over the four equally likely sex pairings (man-man, man-woman, woman-man, woman-woman). It is not the reading "an opposite-sex couple, order unknown", which averages only the two mixed pairings; that reading differs by up to 0.135 percent of a benefits-only row on the examples' two couples of 'average' people (all-401k-no-bridge and brokerage-bridge-401k) and changes no top claim age at 0, 2 or 4 percent

    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: survival-probability-product.md Mutation receipt: survival-probability-product.mutation.md

    Evidence tests: survival.evidence.test.ts

    Implemented in: survival.ts

    Feeds: longevity-survival-percentile-age, social-security-expected-present-value, social-security-survivor-switch-pv, social-security-fica-return-ratio, income-annuity-annual, spending-base-annual

Transformations

  • socialSecurity/analysis/oasdiReturn.ts#oasdiReturnForPerson: (the expected PV at the person's claim age, with months, the former-spouse benefits the ledger would pay (in a couple, from the January after the spouse's death) and the retirement earnings test on the person's wage rows, plus the benefits received from the claim year to the year before the start at the start-year amount, paid in full) / (the OASDI paid in so far plus the OASDI on the projected work the PIA counts), in today's dollars (#benefitsToContributionsRatio); no ratio when nothing is paid in, and no comparison for a disability benefit from its onset.

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.