Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
f68832e
Document Social Security benefit lever implementation plan
MaxGhenis Oct 23, 2026
ad80c62
Add audited Social Security COLA and bend-point histories
MaxGhenis Oct 23, 2026
6758e66
Audit stored Social Security scoring sources before applying levers
MaxGhenis Oct 23, 2026
1d17f32
Separate reported Social Security inputs and compose benefit levers
MaxGhenis Oct 23, 2026
2a81c22
Isolate and extend Social Security compatibility coverage
MaxGhenis Oct 23, 2026
ee98c1d
Preserve separate compatibility reports and reported-input uprating c…
MaxGhenis Oct 23, 2026
6101d97
Preserve overlapping Social Security sources and exact multi-year inputs
MaxGhenis Oct 23, 2026
b9c7191
Honor selected bases and zero rows for multi-year benefit sources
MaxGhenis Oct 23, 2026
89edc6c
Share identical COLA policy fixtures across exposure cases
MaxGhenis Oct 23, 2026
8401cd8
Treat Social Security benefit multipliers as dimensionless levels
MaxGhenis Oct 23, 2026
fa7ddfa
Run Social Security lever YAML serially on the existing CI runner
MaxGhenis Oct 23, 2026
561a664
Clarify the Core public retirement override fixture
MaxGhenis Oct 23, 2026
fbca48f
Verify original Social Security dataset columns extend once
MaxGhenis Oct 23, 2026
460f573
Preserve benefit metadata and explicit multi-year test weights
MaxGhenis Oct 23, 2026
4789c54
Check declared Social Security uprating metadata
MaxGhenis Oct 23, 2026
99d7384
Use raw calculation arrays inside multi-year benefit factors
MaxGhenis Oct 23, 2026
849ad59
Preserve legacy Social Security inputs across ingress and extraction
MaxGhenis Oct 23, 2026
1a7b912
Compare legacy benefit ingress against unmodified main
MaxGhenis Oct 23, 2026
43a07be
Retain automatic benefit source provenance across later writes
MaxGhenis Oct 23, 2026
d0187ab
Require an independent main reference and nonzero dataset evidence
MaxGhenis Oct 23, 2026
9bb01d8
Require compatible Core input provenance APIs
MaxGhenis Oct 23, 2026
4372e6b
Isolate extraction comparisons with the review reproducer
MaxGhenis Oct 23, 2026
dfd2e17
Compare every Core builder form with legacy main inputs
MaxGhenis Oct 23, 2026
1ed0b37
Fetch the independent main reference for CI comparisons
MaxGhenis Oct 23, 2026
90c64b5
Preserve every recorded benefit override in household extraction
MaxGhenis Oct 24, 2026
a8b1ec8
Preserve legacy Social Security inputs across Core write routes
MaxGhenis Oct 24, 2026
3db106d
Merge current main into Social Security benefit levers
MaxGhenis Oct 24, 2026
02b7415
Cover branch slots and direct Social Security input helpers
MaxGhenis Oct 24, 2026
5f4b175
Supply exact-period weights in compound Microsimulation fixtures
MaxGhenis Oct 24, 2026
01b60b2
Keep calendar-year factor checks for rolling compound inputs
MaxGhenis Oct 24, 2026
f164c21
Clear compound test caches before rechecking annual factors
MaxGhenis Oct 24, 2026
1f28500
Preserve Social Security sources across Core input routes
MaxGhenis Oct 25, 2026
cd6d298
Keep legacy dump fixtures compatible with removed empty holders
MaxGhenis Oct 25, 2026
6ff667b
Synchronize raw Social Security seeds during initial loading
MaxGhenis Oct 25, 2026
7dce1d6
Refresh automatic benefit sources during composed loading
MaxGhenis Oct 25, 2026
9f8c6c3
Reconcile successful benefit inputs when initial loading fails
MaxGhenis Oct 25, 2026
9f7db36
Search composed Social Security input routes with a state machine
MaxGhenis Oct 25, 2026
8396422
Resolve reported benefit sources at read time
MaxGhenis Oct 25, 2026
8c4640f
Preserve benefit sources through branch and cache cleanup
MaxGhenis Oct 25, 2026
b338d0a
Skip source routing before populations exist
MaxGhenis Oct 25, 2026
607106f
Supply group role metadata to the Core test backend
MaxGhenis Oct 25, 2026
ce2ad34
Refresh derived benefits after source writes
MaxGhenis Oct 25, 2026
ffb62a5
Check benefit readers against surviving source inputs
MaxGhenis Oct 25, 2026
5cff908
Load Core calendar metadata for reader tests
MaxGhenis Oct 26, 2026
25fde8a
Report all values on mismatching benefit routes
MaxGhenis Oct 26, 2026
f0cda5e
Verify benefit state machine under both Core versions
MaxGhenis Oct 26, 2026
70b4949
Remove unapproved Social Security CI job
MaxGhenis Oct 26, 2026
2ecebb1
Compare fresh benefit formulas and assert intended cache differences
MaxGhenis Oct 26, 2026
d91e28f
Exercise inherited sources across branch builder rewrites
MaxGhenis Oct 26, 2026
d52f0c0
Bound composed branch coverage per generated example
MaxGhenis Oct 26, 2026
5826256
Observe compound source refresh across Core versions
MaxGhenis Oct 26, 2026
2a289b5
Preserve Social Security helper precedence and bounded refreshes
MaxGhenis Oct 26, 2026
2e7cccd
Compare compound benefit helpers with pinned current law
MaxGhenis Oct 26, 2026
a439dae
Refresh rebuilt and exact source caches within dependency bounds
MaxGhenis Oct 26, 2026
82d52db
Exercise real Core bookkeeping in benefit input state machine
MaxGhenis Oct 26, 2026
57dc195
Isolate synthetic Social Security checks from microsimulation CI
MaxGhenis Oct 26, 2026
13216f9
Fix refresh of Social Security formula returns without holder storage
MaxGhenis Oct 27, 2026
fb4d238
Generate skipped-storage cache policies in Social Security input machine
MaxGhenis Oct 27, 2026
06092f1
Cover reported-source writes with fast-only benefit caches
MaxGhenis Oct 27, 2026
871ee0e
Date fast returns at memo insertion and preserve cache serialization
MaxGhenis Oct 27, 2026
d55a673
Keep restored memo dates ahead of subsequent Core stores
MaxGhenis Oct 27, 2026
5c0e93e
Preserve formula dates across duplicate memo assignments
MaxGhenis Oct 27, 2026
a7cf9ad
Merge main into ss-benefit-levers
MaxGhenis Oct 27, 2026
6498687
Preserve formula return dates across bulk cache deletion
MaxGhenis Oct 27, 2026
df0ec80
Generate bulk deletion and source-write state transitions
MaxGhenis Oct 27, 2026
a6dcc92
Retain shared benefit parameters in calculator reference
MaxGhenis Oct 27, 2026
8cae08d
Merge reported Social Security benefit levers into calculator base
MaxGhenis Oct 27, 2026
b565619
Add baseline-only reported benefit PIA ratio inference
MaxGhenis Oct 27, 2026
a853b4d
Merge current reported-benefit ingress fixes into PIA ratio stack
MaxGhenis Oct 27, 2026
cb4c658
Share explicit worker computation bases across benefit levers
MaxGhenis Oct 27, 2026
86320a4
Connect reported Social Security PIA ratios and population diagnostics
MaxGhenis Oct 27, 2026
3b5fc99
Bypass inference work for zero and calculated benefit records
MaxGhenis Oct 27, 2026
1297873
Keep population inference cohorts and rounded endpoints consistent
MaxGhenis Oct 27, 2026
2a07135
Flag inferred birth years with partially supplied birth dates
MaxGhenis Oct 27, 2026
e09c1fa
Preserve stacked COLA behavior when the PIA lever is off
MaxGhenis Oct 27, 2026
df07a1f
Test reported retirement cohort and claiming inputs without a country…
MaxGhenis Oct 27, 2026
5a6b4d7
Merge current main into the PIA ratio stack after #10400 landed
MaxGhenis Oct 28, 2026
27bd7fd
Disable timing deadlines for PIA ratio invariant tests
MaxGhenis Oct 28, 2026
ff6d5e3
Merge upstream main into reported-benefit PIA ratio branch
MaxGhenis Oct 28, 2026
ae2d60b
Keep shared PIA switches in calculator reference model
MaxGhenis Oct 28, 2026
bc32567
Resolve disability proxies from operative PIA formula years
MaxGhenis Oct 28, 2026
22bcfb4
Bound cached PIA reform models per retirement YAML file
MaxGhenis Oct 28, 2026
aa5d225
Flag assumed retirement claiming scenarios as proxies
MaxGhenis Oct 28, 2026
4b905d4
Cover PIA ratio ingress and factor composition
MaxGhenis Oct 28, 2026
e41131b
Isolate parameter reforms in PIA ratio input tests
MaxGhenis Oct 29, 2026
fea0d26
Preserve input carry-forward in isolated PIA test systems
MaxGhenis Oct 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ REST_SS_CALCULATOR_DIFFERENTIAL_TESTS := $(TESTS)/unit/test_ss_calculator_differ
# Local 4 GiB-capped run peaked at 2.385 GiB before its 1800s loaded-host cap;
# CI run 40318424511 passed all 126 cases in 312.62s (6:20 process wall).
REST_SOCIAL_SECURITY_INPUT_TESTS := $(TESTS)/core/test_social_security_inputs.py
# Two-household H5 ingress and neutral-hook comparisons retain a reform tree.
# Isolate this file in the existing input target; no national dataset is loaded.
REST_SOCIAL_SECURITY_PIA_RATIO_INPUT_TESTS := $(TESTS)/core/test_ss_pia_ratio_inputs.py
# These three parameter modules construct full reform trees; one also loads
# a default Microsimulation only to read parameters. Release their heap before
# the remaining policy tests, rather than stacking both in the 13.9 GB group.
Expand All @@ -98,7 +101,8 @@ REST_REMAINING_HEAVY_TESTS := $(TESTS)/test_niit_section_911_magi.py \
$(TESTS)/test_schedule_d_filer_net_capital_gain.py
REST_LISTED_TESTS := $(REST_CACHED_ARRAY_TESTS) $(REST_HEAVY_A_TESTS) $(REST_HEAVY_B_TESTS) \
$(REST_CORE_HEAVY_TESTS) $(REST_SS_CALCULATOR_ENGINE_TESTS) $(REST_SS_CALCULATOR_DIFFERENTIAL_TESTS) \
$(REST_SOCIAL_SECURITY_INPUT_TESTS) $(REST_POLICY_PARAMETER_TESTS) $(REST_REMAINING_HEAVY_TESTS)
$(REST_SOCIAL_SECURITY_INPUT_TESTS) $(REST_SOCIAL_SECURITY_PIA_RATIO_INPUT_TESTS) \
$(REST_POLICY_PARAMETER_TESTS) $(REST_REMAINING_HEAVY_TESTS)
REST_IGNORES := $(addprefix --ignore=,$(TESTS)/policy/contrib $(TESTS)/microsimulation $(REST_SPM_TESTS))
# $(call rest_pytest,<group>,<paths>,<more paths to ignore>) is the pytest
# command for one group. With REST_REPORT_DIR set, each group writes its own
Expand Down Expand Up @@ -330,7 +334,14 @@ test-other-python-rest-ss-calculator-engine:
test-other-python-rest-ss-calculator-differential:
$(call rest_pytest,ss-calculator-differential,$(REST_SS_CALCULATOR_DIFFERENTIAL_TESTS))
test-other-python-rest-social-security-inputs:
@failed=""; for group in compatibility pia-ratio; do \
$(MAKE) --no-print-directory test-other-python-rest-social-security-inputs-$$group || failed="$$failed $$group"; \
done; \
if [ -n "$$failed" ]; then echo "Failed Social Security input groups:$$failed"; exit 1; fi
test-other-python-rest-social-security-inputs-compatibility:
$(call rest_pytest,social-security-inputs,$(REST_SOCIAL_SECURITY_INPUT_TESTS))
test-other-python-rest-social-security-inputs-pia-ratio:
$(call rest_pytest,social-security-pia-ratio-inputs,$(REST_SOCIAL_SECURITY_PIA_RATIO_INPUT_TESTS))
test-other-python-rest-core:
$(call rest_pytest,core,$(TESTS)/core,$(REST_LISTED_TESTS))
test-other-python-rest-policy-parameters:
Expand Down
1 change: 1 addition & 0 deletions changelog.d/ss-pia-ratio-claiming-proxy.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Flag assumed retirement claiming-age sensitivities as proxies even when the birth date is exact.
2 changes: 2 additions & 0 deletions changelog.d/ss-pia-ratio-lever-c.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add an eligibility-year PIA-ratio lever for reported Social Security benefits, supplied claim-age inputs, and named population inference and coverage diagnostics.

250 changes: 250 additions & 0 deletions docs/usage/social-security-pia-ratio.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
# Population Social Security PIA ratio

The reported-benefit route implements design v3 C1–C3, with A1's factor
composition, A5.2's record/proxy distinctions, P2's annual cross-section
convention, and amendments M2, M4, M8 and M9. It approximates a formula reform
for benefits already in payment. It does not reconstruct a worker's earnings
history or establish benefit entitlement.

For each annual Person component `X` (`retirement`, `disability`,
`survivors`, `dependents`), the population lever applies

```text
z = reported_X / (12 * a * s * baseline_COLA(E, t))
factor_X = new_PIA(inferred_AIME, E; t) / baseline_PIA(inferred_AIME, E)
```

The public formula multiplies the reported base by this factor, the joint COLA
factor, the across-the-board factor and the payable factor. Calculated source
routes compute their PIA and COLAs directly and bypass these population
factors. An initial public-name input is migrated to its `_reported` twin,
including public-name dataset columns in the scoring year; a later explicit
public write is a final override. See the benefit-lever ingress documentation.

The forward PIA calculations and inverse use the same service as the
[supplied-record calculator](social-security-calculator.md).
`bend_points_at` selects the original eligibility-year bend points;
`formula_path_at` supplies the combined reform and its `recompute_mode`.
C does not add a second retroactive-recomputation switch. The inverse always
uses the fixed unreformed formula and the unreformed reported amount.

## Supplied claim age and explicit scenarios

`social_security_retirement_claim_age_months` is a pure annual Person input:
age in whole months at first entitlement, so 62 years 3 months is 747.
It has no formula, uprating, or positive-amount selection rule. A projected H5
may store this column like any other input, with a value for each scoring year.

`gov.contrib.ssa.benefit_levers.pia_ratio.claiming_scenario` explicitly selects:

| Value | Claiming adjustment source |
|---|---|
| `supplied_claim_age` (default) | The supplied age in whole months. |
| `entitlement_dates` | Component entitlement year/month and supplied birth date. |
| `age_62` | Sensitivity assuming age 62. |
| `age_65` | Sensitivity assuming age 65. |
| `fra` | Sensitivity assuming cohort full retirement age. |
| `age_70` | Sensitivity assuming age 70. |

Core represents these named selector parameters as singleton lists. For example,
set `claiming_scenario` to `[age_65]` and `disability_eligibility_proxy`
to `[current_year]` in a parameter reform; the adapter reads the one selected
name. Bare scalar strings are unsupported by Core's parameter schema.

All scenarios preserve cohort FRA, early months and delayed-credit rates.
Under `supplied_claim_age`, a missing value, a value before 62, or a value
after 70 leaves the affected factor at one and raises
`_pia_ratio_missing_claim_age`. There is no silent change to another scenario.
The `entitlement_dates` scenario uses the entitlement year/month and birth
year/month. Supply `social_security_birth_month`; the optional
`social_security_birth_day` refines SSA age attainment. With a known birth
month and no day, day 2 is the explicit within-month convention and
`_pia_ratio_proxy` is true. Zero birth month means unavailable. A complete
`ss_calculator_birth_date` supplies the exact date instead; exact dates
preserve attainment on the day before a birthday, including January 1 births.

Where only a birth year is available for an age-month scenario, the cohort
calculation uses the documented non-January-1 approximation and raises
`_pia_ratio_proxy`. Exact birth information and an explicitly supplied
`birth_year` take precedence over a year derived from current age. When birth
information is unavailable but a worker eligibility year is supplied, E minus
62 can supply the approximate birth cohort for FRA and credit rates; this does
not change the supplied eligibility year. Supplied month/day without an
observed birth year or complete birth date still raises the proxy flag.
A claiming scenario is substantive:
in C2, replacing the
correct age-62 adjustment of 0.70 with 1 infers AIME $2,978 instead of $5,000
and changes the annual gain from $1,165.248 to $1,664.64 before rounding, an
overstatement of about 43%.

## Eligibility years and auxiliary identification

Supplied `social_security_X_worker_eligibility_year`,
`social_security_X_worker_id` links and the underlying worker's
`social_security_worker_computation_year` precede proxies. A supplied
entitlement/onset year supplies the component's applicable basis where
appropriate. A link must identify an existing Person and a supplied computation
basis; conflicting record years are unsupported.

For own retirement, a supplied worker eligibility year takes precedence. Without
one, exact birth information or an explicitly supplied `birth_year` identifies
the age-62 eligibility year before the current-age proxy; known entitlement
dates and a supplied observed claim age can also identify that year. If none of these
supplies a basis, each scoring year's proxy is `E = t - age_t + 62`. Rebuild
it independently for every annual cross-section. A row whose age stays 70 and
has no supplied basis has E=2018 in 2026 and E=2027 in 2035;
the model does not carry an inferred cohort or claiming history between those
rows. Integer age also leaves birthday/within-year ambiguity, so compare adjacent
eligibility years when scoring sensitivities.

Disability uses `a = 1` and a supplied onset, entitlement or worker computation
year when available. Missing onset is explicitly controlled by
`gov.contrib.ssa.benefit_levers.pia_ratio.disability_eligibility_proxy`:
`pre_reform` is the upper-exposure assumption, using a supported benchmark
before the active reform; `current_year` assumes newly entitled in the scoring
year. Both are labelled proxies, not observed onset histories.

For survivors and dependents, a recipient age cannot identify the underlying
worker's PIA. A supplied worker link/year alone does not establish the share.
The identified auxiliary route also requires:

- `social_security_X_worker_benefit_ratio`: the composite `a * s`, including
every applicable claiming adjustment and recipient share/reduction.
- `social_security_X_worker_ratio_identified`: an explicit assertion that this
is one identified worker PIA, with no unaccounted dual entitlement, binding
family cap or earnings-test withholding.

For reported retirement, a record that also has positive reported survivor,
dependent or disability amounts remains unmodeled for this lever. The mixed
recipient amounts do not identify whether retirement is one full worker PIA,
dual entitlement or a partial-year conversion.

The inversion divides by that composite ratio once. Without a supported
worker basis and identified ratio, the amount keeps factor one and raises
`_pia_ratio_unmodeled`. No recipient-age worker proxy is enabled by default.
For this composite route, the named claiming-adjustment output is one as a
decomposition convention: the entire supplied `a * s` is assigned to the
worker-benefit ratio. This does not establish that the underlying worker
claimed at FRA or identify `a` separately.
The restricted supplied-ratio survivor household calculator retains its own
more detailed record-basis and nonbinding-limit assertions.

When S.770 is active, reported survivors additionally require the same
recipient-side `ss_calculator_*` computation-basis fields as the household
route: worker birth year and death year, basis provenance, prior-disability
declaration, ordinary non-WINDEX assertion, and the applicable exact dates or
year-only/same-year assertions. An authoritative computation year is required
for prior disability. The basis must agree with the supplied worker eligibility
or computation year. Missing identification leaves factor one and raises
`_pia_ratio_unmodeled`; contradictory supplied information is rejected.
For a pre-2026 death before age 62 with no prior disability eligibility, the
existing S.770 interpretation switch controls only the 18% first-bend-point
increase. The 95% first factor applies with either switch value.

Supported benchmark years start in 1983. A positive record with an earlier
benchmark keeps factor one and raises `_pia_ratio_pre_1983`. The initial PIA
rounding rule before 1983 is outside this inverse's scope. COLAs accumulate
from eligibility, including pre-claim COLAs, using the unreformed statutory
ledger; they do not use benefit-income uprating or reformed COLAs.

## Named annual outputs

Replace `X` below with any of the four component names. Monetary outputs are
monthly dollars at the eligibility-year valuation basis, even though the
reported source benefit is annual.

| Person variable suffix after `social_security_X` | Meaning |
|---|---|
| `_inferred_aime` | Baseline inverse of the observed amount; the lower-endpoint convention for an exact dime-rounded eligibility PIA. |
| `_inferred_aime_lower_bound` | Inclusive conditional AIME interval bound. |
| `_inferred_aime_upper_bound` | Exclusive conditional AIME interval bound. |
| `_pia_ratio_eligibility_year` | Underlying worker eligibility/computation year E. |
| `_pia_ratio_claiming_adjustment` | Imputed worker claiming adjustment a; zero means unavailable on a positive retirement record, while one is the auxiliary composite-ratio decomposition convention. |
| `_pia_ratio_own_record_retired_worker` | Own-record retired-worker indicator. |
| `_pia_ratio_missing_claim_age` | Required claiming information is unusable. |
| `_pia_ratio_pre_1983` | Benchmark predates supported initial-PIA rounding. |
| `_pia_ratio_unmodeled` | This amount lacks a supported identified inversion. |
| `_pia_ratio_proxy` | An eligibility, birth or claiming approximation was used, including every resolved `age_62`, `age_65`, `fra` or `age_70` sensitivity even with an exact birth date. |
| `_pia_ratio_measurement_uncertainty` | Annual reported measurement is not an exact eligibility PIA. |

Zero monetary outputs on records without an inference are placeholders.
Inspect the flags before interpreting them as zero earnings. The own-record
indicator describes the modeling classification; it is not evidence of insured
status or an administrative validation of benefit type. It is independent of
whether claiming data are missing or the benchmark predates 1983. For an AIME
distribution or percentile calculation, also exclude `_pia_ratio_unmodeled`,
`_pia_ratio_missing_claim_age` and `_pia_ratio_pre_1983` records and inspect
the proxy and measurement-uncertainty flags.
For identified-only distributions, also exclude `_pia_ratio_proxy` records;
report their sensitivity results separately. The named AIME outputs include
supported proxy inferences, so this filter must be applied by the consumer.

On a positive retirement record, claiming adjustment zero is an unavailable
diagnostic sentinel until the selected scenario yields a usable adjustment.
Missing claiming data and unsupported pre-1983 records can therefore report
zero while keeping the benefit factor at one. Do not interpret this sentinel
as an actuarial factor, a complete benefit cut, or a default FRA assumption;
filter the associated flags. Disability keeps adjustment one, auxiliary
composite ratios use one by decomposition convention, and a zero-benefit
record keeps the neutral adjustment one.

For exact dime-rounded baseline eligibility PIA z, the interval is
`[inverse(z), inverse(z + 0.10))`; the point estimate is its lower endpoint.
C2's $2,156.80 baseline PIA therefore gives
`[5000, 5000.3125)`. When the source is a rounded paid benefit or a survey
annual amount, that narrow interval is conditional on the assumed measurement
basis. It does not quantify all survey error.
`gov.contrib.ssa.benefit_levers.pia_ratio.annual_rounding_bound` optionally
supplies a nonnegative symmetric annual-dollar bound for
`[max(0, b - bound), b + bound)`, propagated backward through the baseline
divisor, with one dime of initial PIA truncation added at the upper endpoint.
The point estimate continues to invert the observed amount; it does not move
to the lower endpoint of this wider measurement interval. The default zero
adds no annual measurement-resolution assumption; it does not certify exact
data.

Core stores monetary input arrays as float32. Before exact arithmetic, the
adapter uses each stored scalar's shortest float32 decimal representation.
This avoids expanding binary representation noise into an additional PIA
dime; it does not round every annual source to cents or recover precision
already lost when the input was stored.

Named AIME point estimates and interval bounds are stored at Core's float32
resolution. The adapter rounds them toward positive infinity so an ordinary
cast cannot move a lower endpoint below the baseline inverse. Represented
values can differ from the mathematical endpoint by up to one float32 step;
use the shared pure service for exact interval membership or boundary
calculations. It keeps rational endpoints internally, and the shared
`PIAInverse` exposes exact Fraction bounds as well as high-precision decimals.

A zero benefit produces factor one and zero monetary outputs without division.
Negative reported amounts and nonpositive divisors are unsupported and rejected.
Factors cannot be negative. With every PIA reform off, factors are exactly one.

## Weighted counts and scoring limits

For any Person indicator `flag`, the authoritative weighted count is

```text
sum(flag_i * person_weight_i)
```

The associated unmodeled annual amount is
`sum(flag_i * social_security_X_reported_i * person_weight_i)`.
Apply weights once. Report identified results, proxy sensitivities and unmodeled
amounts separately.

Household variables `social_security_X_pia_ratio_FLAG_count` are also available
for `FLAG` equal to `missing_claim_age`, `pre_1983`, `unmodeled`, `proxy`
or `measurement_uncertainty`. They sum the corresponding Person indicators
within a household. A normal weighted household aggregation gives the weighted
count when members use the household weight. If an artifact supplies distinct
Person weights within a household, use the Person-indicator formula above.

This approximation assumes the reported annual amount represents a full-year
benefit at the stated valuation basis; partial-year entitlement, survey error,
dual entitlement, withheld checks and binding caps can defeat unique inversion.
No package-specific parameter values or administrative percentile estimates are
encoded here. M8 allows progressive price-indexing thresholds from a supplied
bend-point fraction or dollar path; C's named outputs remain available for
population diagnostics and drift checks.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
description: "Nonnegative optional symmetric annual dollar rounding or measurement-resolution bound. A supplied reported amount b represents the half-open interval [max(0, b - bound), b + bound) before backward propagation through the baseline claiming, worker-share and COLA divisor. The upper endpoint also allows one dime of initial PIA truncation. Zero leaves only the conditional PIA-rounding interval; it does not assert survey measurement is exact."
values:
1983-01-01: 0
metadata:
unit: currency-USD
label: Social Security population PIA-ratio annual rounding bound
economy: false
period: year
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
description: "Explicit claiming-adjustment source: supplied_claim_age, entitlement_dates, age_62, age_65, fra, or age_70. supplied_claim_age reads the pure claim-age-months input and leaves missing or unusable records unreformed; there is no automatic fallback."
values:
1983-01-01: [supplied_claim_age]
metadata:
unit: str
label: Social Security population PIA-ratio claiming scenario
economy: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
description: "Explicit missing-onset sensitivity: pre_reform uses an eligibility benchmark before the earliest active reform path, bounded by supported years; current_year treats the record as newly entitled in the scoring year. Supplied entitlement and worker computation years take precedence. Both remain labelled proxies."
values:
1983-01-01: [pre_reform]
metadata:
unit: str
label: Social Security disability PIA-ratio eligibility proxy
economy: false
Loading
Loading