Repository navigation
Track B G v2: close #495, compute five refused configurations, one contract across G, R2 and R3 - #530
Conversation
POMS GN 02603.045, .050, .060 (dual-entitlement deduction before reduction and its worked examples), RS 00615.003, .010, .310, .315, .590, .712, .758, .770-.778, RS 00202.005, .100, RS 00209.001, .015, GN 02608.100 and RS 00605.360 (as revised in 2025 for the Social Security Fairness Act). The manifest records each URL, UTC retrieval time, byte count, SHA-256, transmittal and page date. Captured by the orchestrating session on 2026-10-11; manifest and README by a GPT-6.1 Sol Subfleet lane (20261011-074803-trackb-g-build). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fuse Issue #495: record refusals are deferred until the family's inputs are checked, 402(q) reduction months are bounded by cohort (FRA - 744), delayed credits for births 1914-1916 are bounded by the RS 00615.692E chart, and cross-field checks are added. A household helper evaluates one month against per-record 403(a)(5) guards; the guard's over-refusal scope is stated plainly. Newly computed: dual entitlement where the own RIB is reduced for age (the PTAP formula, GN 02603.050C, reproducing GN 02603.060 A.5, A.8, A.9, B.2); disabled widow(er)s at 50-59 from January 1984 (RS 00615.310); government pension offset ignored from January 2024 (Social Security Fairness Act, per GN 02608.100); independently entitled divorced spouses (402(b)(4)(A), RS 00202.005, .100); one or two parents (402(h), RS 00209.015). Still refused, with reasons: combined family maximums, multiple auxiliary records, 403(a)(5) (pending ruling d1338), and the historical cases listed in the design note. Statutory conformance only; no population claim. Built by a GPT-6.1 Sol Subfleet lane (20261011-074803-trackb-g-build). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One registry holds 27 statutory worked examples (205 figures checked verbatim against their captures) with configuration tags; a coverage test requires every supported class to have a registered example or a stated reason for having invented reference cases only. A script enumerates an invented configuration lattice (110,880 cells) and writes counts supported, refused by reason and invalid; a test regenerates the report byte for byte. These are invented-configuration denominators and make no population claim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The lane's delivery report is not committed; the PR body carries the mutation list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e, the depletion-cut provenance gate Widow(er) reduction periods: with SSA's January 2 to January 1 cohort convention a birth year fixes the RS 00615.301B.2 period, so exactly that period is required and reduction months are bounded by it, raised as InvalidFamilyInput before any refusal in both construction styles. RS 00615.712: families with a beneficiary protected by the widow(er) DRC saving clause are refused by name and kept in denominators; direct RecordState snapshots must attest whether such pre-June-1978 history is possible, else refuse. Known prior DIB entitlement can no longer be hidden by a modern eligibility year (RS 00615.736B.2b). Depletion-cut artifact: its provenance gate pinned G's source file. A unit-tier compatibility proof now rebuilds every recorded G input of the committed illustrative couple and requires all seven recorded output fields to match exactly in every month; the gate runs that proof and then excludes exactly gross_benefits.py from the source pin. The artifact, its recorded commit and its 'track-b-g-v1' text are unchanged. Lows: the ssb-table-a1 registry tag (binding) and conformance JSON; the WEP comment (RS 00202.100); the RIB-LIM Parisi refusal narrowed to a limit that binds (RS 00615.320A.3); pre-July-1980 DIB refused for direct snapshots. Fixes from the independent GPT-6.1 Sol review at a0ad004; built by a Subfleet lane (20261012-050610-trackb-g-fix1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eriods, unknown history stays unknown RS 00615.340: a reduced widow(er) or surviving divorced spouse with an entitled child in care in a month gets at least the mother's/father's amount for that month (from 1/73); a higher widow(er) amount is unchanged. Beneficiaries carry an explicit child_in_care input naming the entitled child; unknown care status with an entitled child on the record is refused by name. Reproduces RS 00615.340's two examples and pays $750 rather than $715 in the reviewer's case. The floor months are R3 ARF crediting months. Reduction periods: RS 00615.301B.2 permits only 60, 62, ..., 84 months; any other period is InvalidFamilyInput in every entry style, with or without a birth year. RS 00615.712: a modern eligibility year with no first-DIB date no longer implies there was no earlier DIB (RS 00615.736B.2b). Where the saving clause could apply, the caller must attest widow_drc_savings_clause=False or supply complete history, else the month is refused and counted. Fixes from the independent GPT-6.1 Sol review at 383a59d; built by a Subfleet lane (20261012-075311-trackb-fix-g-2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…terfactual; record rulings d1418 and d1338 _agrees compared with abs(observed - expected) > tolerance, which is false for NaN; non-finite bundle values now raise the same input error before any coverage refusal. Each reading listed in Axiom's register of source disagreements is marked at the line that decides it (# Source conflict us:oasdi-...). A test-only helper executes both two-parent readings ($825 against $750); the public behaviour stays a refusal (ruling d1418). The design note records d1418 and d1338 (403(a)(5): SSA's operational reading, implemented in G part 2). Built by a Subfleet lane (20261012-105518-trackb-fix-g-3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… tiers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e months Surviving divorced caregiver: the hypothetical 202(g) mother/father the care floor compares against is subject to the family maximum (RS 00615.682, .340, .010); only the actual 202(e)/(f) surviving divorced spouse stays outside it under 403(a)(3)(C). The reviewer's case now pays $715 (not $750), total $2,215, and RS 00615.682's figures reproduce through this path. Divorced spouse with the worker's entitled child in care: 402(q)(5)(B) and RS 00615.010/.201A.2 exempt the month from age reduction; with own RIB the amount is the unreduced spouse benefit less the reduced own RIB ($340, total $1,840 in the reviewer's case), with outside-maximum status kept. A divorced spouse with an entitled child must attest current care, and without current care an unknown or protected first-entitlement care history refuses by name when it could change the aged amount (RS 00615.010: care in the first month keeps a divorced spouse unreduced after the child's benefit ends). Conformance report regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A person's cohort now resolves from either birth-year field (Beneficiary.birth_year or OwnBenefit.birth_year); conflicting values raise InvalidFamilyInput, and the resolved cohort bounds both own-RIB and auxiliary reduction months before any coverage refusal, in every entry point (direct RecordState, built record_state, household, evaluate_family). The reviewer's 1935 widow with a 37-month own-RIB reduction now raises instead of entering the GPO refusal denominator. The divorced-spouse care-history refusal now compares settled auxiliary payables, so a case paying $0 under every history (own RIB at or above the unreduced spouse benefit, 402(k)(3)(A)) is supported; the refusal still fires wherever the payable can differ. Round-3 $715 and $340 controls unchanged; conformance report regenerated byte-identical. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A person who is the worker on one record and a beneficiary on another now has one cohort across the household: birth years are compared wherever two sources supply one, a conflict raises InvalidFamilyInput, and the known cohort is carried into that person's beneficiary rows before family validation, so an impossible auxiliary RF37 for a 1935 worker raises before any coverage refusal or guard advancement (it was paying $298.30, or counting as a GPO refusal weighted 7/3). RF36 pays $300; valid GPO and multiple-record refusals keep their denominators. The settled-by-payable care-history note now appends to an earlier diagnostic instead of replacing it. Conformance report regenerated byte-identical. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re-1978 RIB A worker who is not entitled now keeps its cohort through household validation, so the same person's spouse row on another record with an impossible 37-month reduction (1935 cohort, at most 36) raises InvalidFamilyInput before computation, refusal or guard advancement, with and without GPO (it paid $372.90). Own-RIB reductions whose entitlement could precede January 1978 and whose amount the inputs cannot settle (RS 00615.005C.2's historical reduction and PIA) now refuse as own_rib_history_before_1978, kept in denominators. The design note states that the 1929 support boundary is a conservative implementation boundary narrower than the source's January 2, 1928 cohort. Conformance report regenerated (cells unchanged, one new refusal witness). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…history for every reduced benefit Retirement eligibility is validated against the resolved worker cohort independently of worker entitlement and before any refusal or guard advancement, so a direct RecordState for an unclaimed worker raises the same InvalidFamilyInput as the built record_state instead of counting a GPO refusal. A Hypothesis differential now checks that the direct and built record states, the household entry point and household_month_outcome give the same amounts, refusal reason or input error for generated families (unclaimed and deceased workers, omitted and conflicting birth years, dual entitlement, GPO, multiple records). reduced_benefit_history_before_1978 extends the pre-1978 refusal from own RIB to every reduced auxiliary and survivor role whose entitlement could precede January 1978 and whose amount the inputs cannot settle (RS 00615.005C.2), kept in denominators; settled exceptions and input-error priority are preserved. The reviewer's 1912 spouse and widow now refuse. Two readings the sources leave open (pre-1978 disabled widow(er) awards under RS 00615.301B.3 versus .005C.2, and some dual-entitlement sequences) stay refused, with both alternatives tested. Conformance report regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… tiers Brings in #494's statutory delayed-credit sibling, R2 (#528), R3 (#529) and the d1408 diagnostic. Conflicts: the design note keeps G's scope line and the corrected $802.80 sentence and takes #494's sealed-oracle paragraph; the property file takes #494's whole-window differential with G's deadline setting; the support helper imports Fraction as F for both sides. Tiers are recounted by collection. Known break, fixed in the next commit: G's round-9 and round-11 refusal and outcome contracts reject the R2 and R3 refusals and outcomes that master builds on G's types (76 failures in the R2 and R3 test files). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…denominator Merging master showed that G's round-9 and round-11 contracts rejected the refusals and outcomes that R2 (#528) and R3 (#529) build on G's types: RETConfigurationUnsupported subclassed G's refusal, arf.py wrapped ARF results in G's FamilyOutcome, and recompute and arf raised G's refusal with their own reason enums. 76 R2/R3 tests failed. The seal machinery moves to a package-private module, track_b/_provenance.py, shared by every layer. Each refusal class is bound to exactly one reason enum (G, RET, ARF, recomputation) under FamilyConfigurationUnsupported. count_family_outcomes counts sealed outcomes from every layer, and the layer counters agree with it. evaluate_arf, evaluate_recomputation and evaluate_ret admit only their own layer's unaltered results, and results taken back as money inputs (apply_arf on an ARFResult, R2 allocations, grace decisions) are checked. G's money consumers reject other layers' results. The birth-evidence exclusion lists add the new module. No amount changes in G, R2 or R3; G's conformance report regenerates byte for byte. The R2 widow/CDB test now declares child-in-care (False and the named child), which G v2 requires; every assertion is kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… inputs, detached state Round 11 found five gaps in the cross-layer contract, each also present on master. Each is closed as a class across G, R2, R3 and _provenance: - One shared helper admits only built-in numbers (and rejects numeric, text and collection subclasses), so a mutable Fraction subclass can no longer change a sealed weight, a protected 403(a)(5) total or an aggregate after admission. - Sealed results, refusals, outcomes and denominators refuse pickle (every protocol) and copyreg reduction; the restore helpers are gone. A tampered pickle can no longer restore an impossible ARF birth-date/FRA pair. Persisting work means storing declared inputs and recomputing. - Every public entry point rebuilds its declared input tree through the validating constructors before any coverage decision, so an input made invalid after construction is an input error, never a refusal or a denominator row. - Guard state and accessor results are detached; mutating a returned next_month can no longer skip a qualifying month. - The formula-maximum COLA property claimed a COLA alone never trips the guard. Dime-rounded shares can sum lower, so the property now states the guard contract (refuse a lower total after a qualifying increase, keep the row), the generator includes parents, both counterexamples are pinned, and the design note is corrected. No amount, refusal or example changes; G's conformance report regenerates byte for byte and a 2,000-case R2/R3 differential matches master. Tests that round-tripped pickles now assert that serialization raises; tests of seal-time validation call the private capability and say so. The added validation makes the conformance lattice slower (178s, from 41s). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ated once Round 12 found that the input boundary trusted isinstance and passed unknown objects through, so forged enum members and objects faking __class__ became counted refusals. Dicts and sets were rebuilt before their raw keys were checked, so an invalid element could vanish first. A callable-dataclass compute callback was rejected, and inputs were reconstructed repeatedly. Every public argument and declaration field now declares a schema. The boundary admits only built-in scalars by exact type, canonical enum members by identity, declared declaration classes by exact type (rebuilt field by field) and exact built-in containers whose raw contents are checked before anything is built or hashed. Anything else, iterators included, is an input error with no denominator row. Callbacks are checked as callables, not rebuilt as data. Each public call is validated once; computation runs on the owned snapshot through private helpers. The three design notes state the threat model. R3 used to accept iterators for credit-month and condition fields; they are now input errors, and R3's iterator tests use lists, with separate tests that iterators are rejected unconsumed. No amount, refusal or example changes; G's conformance report regenerates byte for byte, and its regeneration costs about 1.26x CPU against 5e68159, back to back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…k receivers first
Round 13 found two mediums. increase_by_colas(1, {10, "10"}) paid $1.10
instead of $1.20: both raw elements were valid, normalized to equal
values, and the set rebuild dropped one. And _check_seal read a
receiver's attributes before checking its type, so a foreign receiver
calling a public getter could re-raise a genuine earlier refusal and
have it counted.
Every collection field and argument in G, R2 and R3 is now declared
either ordered or a membership:
- Ordered fields are COLA events, monthly arrays, beneficiary and outcome
rows, histories and schedules. They admit tuples and lists only and
keep every element in order, since 215(i)(2)(A)(ii) floors to the dime
after each increase. Sets are rejected for them, a documented
narrowing like the iterator one.
- Memberships hold only calendar months or canonical enums and collapse
by value. Numeric aliases are rejected rather than collapsed.
Every public function, method, property getter and reachable dunder
checks the exact registered type of its receiver and arguments before
any attribute read or hook. The design notes state the evaluator scope:
provenance (computed by the right layer, unaltered), not freshness or
which family the caller attributes a value to.
No amount, refusal or example changes on inputs master or round 12
accepted. G's conformance report regenerates byte for byte. Back to
back, its regeneration costs about 1.43x CPU against 5e68159.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… tiers Master's 67 commits touch Track B only in b2.py and its tests, which do not use G. The tier files are recounted by collection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The insured-status rule has an owner: under d1802, Track B's rules lane builds it as a separate PR once #530 merges. OP8(d) now consumes it through an interface in section 6.1 that states how the pre-entry covered-work convention enters the quarters-of-coverage count (zero- and four-filled calls, with an undetermined status where they differ). Drops revision 2's decision 7 and its scale estimate for the rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merge audit: merged as 6967142 at head
🤖 Generated with Claude Code |
tests/tier_counts.json and tests/README-tiers.md conflicted. Recounted on the merged tree with pytest --collect-only -m <tier>: unit 18,189 (master's 18,088 + this PR's 101), artifact 4,263 (4,253 + 10), integration_psid 1,450, reproduction_legacy 520, oracle_policyengine 308; total 24,730. README-tiers.md had kept round-2 numbers on this branch; it now matches the manifest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tiers by collection at the merge of origin/master 6967142: unit 18,125 (+37), artifact 4,261 (+8); integration_psid 1,450, reproduction_legacy 520 and oracle_policyengine 308 unchanged; total 24,664. The tier policy test passes against the full collection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This PR completes the conformance review of Track B G (the gross-benefit layer, #492), closes #495 and computes five configurations G used to refuse. It also puts G, R2 (#528) and R3 (#529) under one shared contract for inputs, results and refusal denominators. It is statutory conformance only, on invented families and SSA's published worked examples, and makes no population claim. Version
track-b-g-v2.What changes in G
gross_benefits.pyfrom its source pin. The artifact itself is unchanged.One contract across G, R2 and R3
Merging master showed that R2 and R3, merged meanwhile, build on G's types. G, R2, R3 and the package-private
track_b/_provenance.pynow follow one contract. Each part is stated in the three design notes, with the tests that execute it:type(), and enum members by identity.count_family_outcomescounts sealed outcomes from every layer, and the layer counters agree with it.Invariants
Each invariant is a Hypothesis property; the full mapping is in
docs/design/track_b_g_gross_benefits.md.ss/benefits.pywithin documented tolerances.ss/statutory_delayed_credit.pyover the whole FRA-to-70 window (ss.benefits.delayed_credit caps credits at 48 months, short for births 1917-1942 #494).Still refused (named, kept in denominators)
Readings left open (each refused; both sides pinned)
No reading is chosen in this PR.
Review
GPT-6.1 Sol reviewed this PR over 14 rounds; round 14 approved at
4246b578. The earlier rounds found, among other things:Each was fixed as a class across the layers. Round 14 left one low finding: deleting a refusal's exception notes raises
IndexError. It changes no amount or denominator, and is fixed in G part 2. The reviews are in the Track B evidence folder (out/review-g-r*.json).Checks
At
2907297c, run locally:After merging master (
1e739d32) at4246b578: tier policy, birth-evidence and B2 (244 passed), and G with R2/R3 (10,521 passed). Black and ruff are clean, and protected files are untouched.Tiers:
Cost: G's conformance regeneration takes about 1.43× the CPU of
5e68159b, measured back to back with identical output.axiom: n/a: not a country-model change. G, R2 and R3 are Python statutory references per d515; rulespec-us has no 42 U.S.C. 403 encoding.
🤖 Generated with Claude Code