Repository navigation
Conversation
The processed PUF's partnership_s_corp_income is the archived nonpassive-only sum (E25980 - E25960) + (E26190 - E26180). PolicyEngine-US reads partnership_income + s_corp_income as Schedule E line 32 and passive_partnership_s_corp_income as its section 469 subset. - puf_source_schedule_e: read E26270 and the passive legs (E25940 - E25920) + (E26170 - E26160) from the pinned TY2015 rows, aligned by RECID; refuse a record whose line 32 departs from its line 28 columns beyond the PUF's documented per-field rounding, and refuse a processed column that no longer equals the archived nonpassive sum. Aggregate-row buckets get their row's line-32 and passive totals in proportion to processed nonpassive amounts. - puf_source_agi: factor the source-year layout so both seams share it (the AGI vector is bit-identical on the pinned inputs). - puf_support: new passive output after s_corp_income in the chain, placed on the line-32 carrier, zeroed where the unit drew no line-32 total, and signed-mass calibrated like the other sparse sign-mixed leaves; the processed nonpassive column no longer stands for partnership_income; raw Schedule E fields derive line 32 per entity and the passive subset. - Both donor loaders thread the supplement and record its receipt. WIP: registries, tests and the Modal rebuild follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ins (#1239) The new PUF chain target moves every count and digest that enumerates the primary QRF chain, the late transfer surface and the stacked authority. Each value below is the one the repo's own checker observed: - late transfer: 19 groups / 71 targets (52 numeric); the passive leaf joins partnership_income in puf_tax_itemization__batch_3; stacked surface 135 / post-PUF 71 / PUF-clone producers 44 / full transfer 119 - pool projection provisioning (762 declared absent, 123 materialized) and the remaining-stage manifest digest; tools/repin_us_pool_engine_contracts.py reports them current - primary QRF target-order digest (puf_qrf_chain) and the generator's stage counts, catalog closure and graph counts - source_stages.json declares the leaf as a PUF stage output (frozen generation-0 digest re-pinned in the generator and its test) - regenerated spec bundle (US spec_sha256 e909a04e...), engine ABI lock, field-usage claims, inventory coverage digests and the coverage evidence; tools/spec_engine_coverage.py --check: 42229/42229 fields, 41/41 checks - multispine pool tool spec_sha256 and the minimal-loader golden Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- test_us_puf_schedule_e: booklet field roles; the line-32 identity holds within the documented per-field rounding after independent disclosure rounding and refuses a line 32 beyond it (Hypothesis); passive never exceeds a positive line 32 when (h) and (i) are zero; the passive subset stays within its loss and income columns; the intended counterexample (passive $300, nonpassive loss $100, line 32 $200) is carried, not clipped; donor alignment carries literal E26270 on regular records and each aggregate row's weighted totals on its bucket; determinism; fail-closed refusals; and a pinned-vector check on the restricted inputs when present. - test_us_puf_support: raw fields derive line 32 per entity and the passive subset; the processed nonpassive column no longer stands for line 32; supplement validation; passive zeroed wherever the unit drew no line 32 (Hypothesis); passive placed on the line-32 carriers; passive is signed-mass calibrated. - Loader tests thread the new seam and its receipt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keeps #1209's archived Schedule SE derivation for partnership_self_employment_net_earnings beside this branch's line-32 raw derivation, and re-pins the identities the combined puf_support bytes and source manifest move: seed protocol/map, US spec_sha256 98ab131c..., the minimal-loader golden, and the regenerated coverage evidence (tools/spec_engine_coverage.py --check: 42229/42229, 41/41). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eleases (#1239) Review round 1 (Sol): the new leaf is also a late ACS-transfer target (it joins partnership_income in puf_tax_itemization__batch_3), but the zero-total coherence rule ran only in primary PUF finalization, so a person-grain transfer draw could place a passive amount where no line-32 total exists. - acs_transfer: reconcile_acs_passive_partnership_s_corp zeros newly imputed passive cells whose person's own line 32 or tax unit's line-32 total is zero, keeps pre-existing cells, and records its counts in the provenance. It is bound into the transfer execution-contract identity (post_transfer_structure.passive_partnership_s_corp) and declared in the generated imputation spec and its schema. - Release reform probe niit_passive_pass_through_exclusion: dropping the leaf from the 2024 NIIT sources must move NIIT by at least $1M, so a build that loses it fails as a structural zero. - stacked_spine: the late-transfer completion receipt's canonical target count is 71 (it was a runtime literal 70); docstrings follow. - Tests: reconciliation examples, refusals, a Hypothesis property over random draws, and the contract binding. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ure tool (#1239) Review round 1 (Sol): stale pins remained outside the spec-engine checker. - Tests that enumerate the stacked, late-transfer and primary surfaces now carry the values the tests observe (71 late / 135 terminal / 119 transfer targets, 66 primary targets, 44 PUF-clone producers, 177 catalog columns, 376 battery legs, field-usage mode counts and the rest), plus the golden digests that moved with them. - Field-usage and inventory pins follow the post-transfer contract change; tools/spec_engine_coverage.py --check: 42236/42236 fields, 41/41 checks. - tools/graph_us_post_transfer_fixture.py loaded helpers from a test file that has since moved; it now loads them from test_support. The regenerated H3 fixture changes only the pool digest line. - docs/us-multispine-operator-ordering.md quotes the new counts and batches. - The new module is classified in the spine-blindness registry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1239) Review round 2 (Sol): the passive leaf's fallback placement read its line-32 basis through the shared allocator, which clips negative values to zero. In a unit whose line 32 is a loss carried by its second person, the passive amount fell to the first person, who has no pass-through activity. - _write_person_tax_unit_totals takes fallback_basis_is_signed_superset. For outputs that are a subset of their basis's signed sum (only passive_partnership_s_corp_income), the weight is |own line 32|, and a unit whose people all have a zero line 32 gets nothing rather than a first-person park. It refuses when no basis column is on the table. - _allocation_basis_values carries the shared validation unclipped; _nonnegative_allocation_basis_values clips it as before. - Tests: the reproduced case and mixed signs, a refusal, a Hypothesis property (no passive without own line 32, shares share the total's sign, units sum to their draw or to zero), and the finalize path parametrized over a positive and a negative line-32 draw. A mutant that drops the call site's flag fails the negative case. - The zero-total docstring now gives the donor receipt's sign: -$14.0M net. On the Modal-built evidence frame no person carried passive without their own line 32, so the tax-unit receipts in the PR are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oves (#1239) Review round 2 (Sol): - Transfer tests: an explicit unit whose people's line-32 amounts cancel (an own-amount-only rule would keep both subsets), property draws with equal and opposite amounts, and a public transfer_acs_inputs regression that checks final values, the kept measured cell and the provenance counts. Dropping the unit clause or the hook now fails a test. - engine_scenario reform-probe drift test: the new niit_passive_pass_through_exclusion probe declares its one removed item; the installed engine's NIIT source list differs by exactly the leaf. - stacked_spine: the late-transfer completion receipt derives its group and target counts from the canonical partition and surface; their sizes stay pinned once at import. - Pins moved by the puf_support.py edit (the seed protocol attests its source bytes): seed protocol and seed map digests, coverage evidence, US spec sha (1516b2f6...), the minimal-loader golden. - Pins the leaf moves that the engine-contract suite enumerates: inventory counts (71 late, 66 primary, 177 columns, 229 compiled outputs, 2,746 producer inputs, 335 references, 935 tail-control fields), the typed closure and catalog counts, the calibration legacy projection (the leaf joins its tail-control field list), the pool tool's 75-module runtime graph and the scorer's 108 requests. tools/spec_engine_coverage.py --check: 42236/42236 fields, 41/41 checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The new monetary leaf is one more catalog column (177) and one more column whose unit the engine metadata does not declare (90). Observed by test_us_catalog_has_complete_explicit_contracts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nts (#1239) Review round 3 (APPROVE WITH NITS): - Finalization refuses a person-output order that places the passive leaf before partnership_income or s_corp_income, or without either in the same pass, so it can never be split by a stale line-32 column. - Signed-subset placement ignores the values the passive column already holds and always follows the magnitudes of the people's own line 32. - Tests: the refusal on a reordered chain through finalize and on the helper, and a stale mixed-sign passive column that no longer steers the split. - Docstrings say 42 smoke probes; docs/spec-engine.md marks its 70/37 counts as of its ruling (71/38 since #1239). - The puf_support.py edit moves the seed-protocol digests again: seed protocol and map, coverage evidence, US spec sha (e38e234b...), the minimal-loader golden. tools/spec_engine_coverage.py --check: 42236/42236 fields, 41/41 checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…corp exact-zero universe (#1258) The donor now carries the partnership and S corporation shares of line 32 as separate leaves from the TY2015 source rows: - partnership_income = E25940 + E25980 - E25920 - E25960 - E26110 - s_corp_income = E26170 + E26190 - E26160 - E26180 - E26100 Their sum equals passive + nonpassive exactly and E26270 within the booklet's per-field rounding; the passive subset is byte-identical. Aggregate-row buckets allocate each entity's total in proportion to the processed nonpassive amounts, as #1239 did for line 32. Retired: the stacked-spine universe-zero materializer and its whole-pool doctrine (spec, schema, semantics, receipts), the late ACS transfer's s_corp_income exclusion, the pool's primary_puf_exact_zero_universe provision, the donor's zero alias and the fiscal-refresh degenerate-input exclusion. s_corp_income is now a PUF-clone primary output that the late transfer carries to native rows; the passive reconciliation requires both line-32 components. SOI Table 1.4's partnership and S corporation legs (Chronicle measure ids) bind each entity's own leaf. Re-pinned with the repo's tools: generate_us_bundle_from_constants, repin_us_pool_engine_contracts (remaining-stage manifest, engine ABI lock), inventory and field-usage observations, the H3 fixture tool, and the counts that move with one more late-transfer target (71 -> 72 late, 119 -> 120 transfer, 135 -> 136 terminal, 44 -> 45 PUF producers). Coverage evidence regeneration follows in the next commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1258) tools/spec_engine_coverage.py --check: 42244/42244 configuration fields, 41/41 inventory checks. The field-usage pointer inventory digest, the engine-workflow multispine-pool tool's spec_sha256 and the loader golden vector follow the regenerated bundle. Adds a Hypothesis property test that each Table 1.4 entity's net-income and net-loss legs partition its signed leaf (income - loss == leaf; the return indicators partition nonzero units). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nish re-pins (#1258) Review round 1, finding 2: the primary pass accepted a passive output with only one of partnership_income and s_corp_income in the same pass, and the draw-coherence step summed whichever was present. That was harmless while the S-corp leaf was an exact zero; now an S-corporation-only unit would look line-32-free and lose its passive amount. Both now refuse a partial basis, matching the late transfer's reconciliation, with tests for each missing component. Pins that move with this commit or the previous ones: - seed protocol and seed map (puf_support's attested bytes), the loader golden vector and the US spec digest c74b09ea...; - spec-engine coverage evidence (42244/42244 fields, 41/41 checks); - counts that move with the 72nd late-transfer target in the shared spec-engine, head-to-head battery (136 scalar targets, 380 metric legs, 81 sign-separated), spec-bundle and completion-receipt fixtures; - the legacy pool-tool publication manifest golden (identity only; pool_h5 and agreement goldens unchanged). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 2, finding 4: both PUF entry points (in-process imputation and the chained-worker preparation) now run the signed-subset basis check up front, so a partial or misordered line-32 basis fails before any fit rather than at finalization after the QRF has run. The test now proves no fit runs. Re-derived: seed protocol and seed map (puf_support's attested bytes), the loader golden vector, the US spec digest 02c4227f..., and the spec-engine coverage evidence (42244/42244 fields, 41/41 checks). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1258) Found by running the files CI stops in at its first failure: - engine-free: the late-callback occurrence counts (167 registered, 92 unique; s_corp_income is newly in the battery registry and has a primary and a transfer output), the sorted transfer-target digest, 45 PUF producers and 123 transfer-plus-deferred inputs. - engine-contract: the stacked-authority component digests (declared surface, late schedule, metric registry, post-PUF surface), the lineage dashboard counts (186 imputed variables, 135 amounts), the coverage-tool field and mode counts, and 230 compiled outputs. Review round 3: the pre-fit refusal test is renamed and now also proves the basis check runs ahead of donor validation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- test_support/spec_engine_inventory_coverage.py: the engine-contract inventory counts follow the S-corp transfer target (late targets 72, itemization targets 39, producer inputs 2747, compiled outputs 230). - Inherited from #1251, whose own CI is red on them at 45a5b98: - test_puf_qrf_chain.py locked the primary target order at 65; #1239's passive leaf made it 66 (the order digest was already current). - engine_workflow test_us_post_export_scoring.py pinned 18 smoke baseline keys; #1239's NIIT passive probe made it 19. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test_constant_derived_domain_counts_are_complete: primary-PUF targets are all PUF-clone scoped now (66, no whole-pool S-corp), the late DAG covers 72 targets, and the battery registry holds 136 targets (81 sign-separated). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolves #1258. Stacked on #1251. This PR targets
mainso CI runs, which means its diff also contains #1251's commits until #1251 merges. This PR's own commits start at85eb94b7b; to see only them, compare againstus-puf-line32-passive-1239.The US PUF donor now carries the partnership and S corporation shares of Schedule E line 32 as separate leaves:
partnership_income= E25940 + E25980 − E25920 − E25960 − E26110s_corp_income= E26170 + E26190 − E26160 − E26180 − E26100Before this PR, the whole line-32 total sat in
partnership_income, ands_corp_incomewas an exact-zero universe enforced in four places. This PR retires that machinery. It also binds SOI Table 1.4's partnership and S corporation legs to each entity's own leaf.Draft, not for merge by the author. It changes what the next US build carries, so the merge is queued for Max (see "Decision").
Why
From TY2021, SOI Table 1.4 publishes partnership and S corporation net income and net loss separately. For TY2022:
A frame whose S-corp leaf is zero by construction can bind only their sum. The raw TY2015 PUF carries every field the split needs.
The PUF fields
The roles come from the IRS SOI General Description Booklet for the 2014 Public Use Tax File (annotated Schedule E Part II). The same table appears in #1251.
Each entity's share is (g) + (j) − (f) − (h) − (i) of its own columns. Checked on the pinned TY2015 file (
puf_2015.csv, sha2560a7fd643…, all 207,692 regular records;out/entity_split_stats.txt):Other shares of regular returns:
The change
Donor (
puf_source_schedule_e.py,puf_support.py)schedule_e_partnership_s_corp_columnsreturns each entity's share. The line-32 rounding identity is now checked against their sum.source_year_puf_partnership_s_corp_incomereturnspartnership_income,s_corp_incomeandpassive_partnership_s_corp_income.s_corp_incometo zero, so a processed donor that requests any entity leaf without the supplement now fails with "cannot derive".On the real inputs (211,677 processed tax units, TY2015 dollars on the processed weights;
out/real_donor_vectors.json):6c76e077…).Retired: the S-corp exact-zero universe
Stacked spine:
_materialize_us_puf_s_corp_universe_zero,us_puf_s_corp_universe_zero_rule_identityandUS_PUF_S_CORP_UNIVERSE_ZERO_RULE_ID;whole_pool_output_universesdoctrine, in the primary execution config, the PUF-pass receipt and the late-resource validator;s_corp_income_universe_zeroreceipt.Native rows now stay null until the late transfer fills them, as
partnership_income's always have.Spec: the doctrine is gone from
imputation.yaml(regenerated),imputation.schema.jsonandimputation_semantics.py.Late ACS transfer:
s_corp_incomeis no longer excluded frompuf_tax_itemization. It joinspartnership_incomein batch 3, so the passive draw conditions on both entities. The post-transfer passive reconciliation now requires both line-32 components rather than reading a missing S-corp leg as zero.Late producer registry:
s_corp_incomeis a PUF-clone primary output like every other primary target.Pool: QBI reconciliation's
s_corp_incomeinput is provisioned by the pool input surface, likepartnership_income. Theprimary_puf_exact_zero_universeprovision is gone.Fiscal refresh: the reviewed degenerate-input exclusion for
s_corp_income("constant zero") is removed. The gate fails a stale exclusion, and the leaf is no longer constant.The execution-config payload keeps
schema_version5, and the registry keeps schema 17. Receipts embed the full content, and the exact doctrine-equality check refuses a pre-#1258 receipt; a test covers this. Bumping the versions would have cascaded into worker-identity authentication for no added safety.Table 1.4 entity legs (
fiscal_targets.py,variable_labels.py)The measure ids are Chronicle's (PolicyEngine/chronicle#180, as specified in chronicle#346):
partnership_net_income_{returns,amount}partnership_incomepartnership_incomepartnership_net_loss_{returns,amount}partnership_lossespartnership_incomes_corporation_net_income_{returns,amount}s_corp_incomes_corp_incomes_corporation_net_loss_{returns,amount}s_corp_lossess_corp_incomeThe materializer sums each person leaf to the tax unit before taking the part, which is return grain, as for the estate/trust legs.
out/compile_*.json):f5bd921d6b21(33,250 specs);national_statee1f9906bf0e0(6,102);scripts/compile_with_entity_legs.py). All eight compile ontonational_state, each binding its own leaf (out/compile_with_entity_legs.json).tax_unit_partnership_s_corp_income, which is consistent with the entity legs: line 32 is their sum.Re-pinned, every value re-derived by the repo's tools or from the observing code
tools/generate_us_bundle_from_constants.py:imputation.yaml,battery.yaml(s_corp sign-separated metric),catalogs.yaml(domainpuf_tax_itemization), and its reviewed counts (late 19/72, the itemization split [8,8,8,8,7], graph inputs 2747, compiled outputs 230).tools/repin_us_pool_engine_contracts.py: the remaining-stage manifest digest and the engine ABI lock.inventory_coverage.EXPECTED_HASHESand counts, frombuild_inventory_coverageobservations: authority, full checkpoint, graph nodes, late families, late resource semantics, late schedule, seed protocol and seed map.field_usagepins (battery, imputation family execution, imputation producer graph, totals) and the pointer-inventory digest.tools/spec_engine_coverage.py --checkpasses: 42,244/42,244 fields, 41/41 checks.tools/graph_us_post_transfer_fixture.py: the H3 fixture's pool digest line.02c4227f…(engine-workflow multispine tool test) and the loader golden vector.Invariants
These hold for every input. The Hypothesis property tests run 300–500 examples each.
test_entity_shares_partition_line_32_exactly).test_an_entity_without_columns_carries_nothing).puf_support's raw-field derivation equalspuf_source_schedule_e's columns for all three leaves (test_raw_array_path_agrees_with_the_source_year_columns).test_table_1_4_entity_legs_partition_each_signed_leaf).Do the tests catch wrong code? I seeded 13 mutants across the donor module,
puf_support, the transfer reconciliation, the target map and the materializer's sign rule. All 13 fail, each first on the test aimed at it, and the unmutated code passes (scripts/mutation_check.py,out/mutation.txt; the Hypothesis example database is cleared before each mutant). The mutants:s_corp_income;Modal evidence
I built a PUF-support base on Modal: run
entity-split-1258-base-d239b0f77b7a, rc 0, 8,644 s, about $7.81.us-puf-entity-split-1258-route-a(d239b0f). That is Carry Schedule E line 32 and its passive subset on the US PUF donor #1251's evidence commit d02fb2b (Route A's 4b57d15 plus US frame partnership/S-corp income is nonpassive-only: the donor builds it from E25980-E25960 + E26190-E26180, not line 32 (E26270) #1239), plus only this PR's donor-side files.line32-1239-base-d02fb2bca843. The two bases share every household, tax-unit and person id, so the only difference is the donor split.scripts/modal_compare_bases.py→out/compare_bases.json.Imputed against the donor. PUF-clone half (89.76M weight); donor scaled per unit weight (×89.76/161.18). Base initial weights:
person_columns_movedinout/compare_bases.json).w2_wages_from_qualified_business: −$54.3B (−30%)sstb_w2_wages_from_qualified_business: −$33.7B (−40%)Microsimulation. PolicyEngine-US 2.2.1, 2024, on both bases (
scripts/modal_microsim.py,scripts/microsim_totals.py→out/microsim_totals.json). Treatment minus control:These are base-level effects at fixed weights. A release re-solves its weights against the targets (HT2/CD A26270, and the Table 1.4 entity legs once Chronicle publishes them), so they are not release figures.
Under the Route A final weights, line 32 is $1,000.8B, against HT2 A26270 TY2022 of $1,033.3B. The entity split is partnership $439.8B and S corp $561.0B, against Table 1.4 TY2022 nets of $311.5B and $719.7B. The donor's TY2015 mix (37/63) carries a lower S-corp share than TY2022's (30/70); calibrating to the entity legs is what corrects that.
Review
Round 1 (Opus 5.5 lane, because the Codex lanes were full): APPROVE WITH NITS at aa47a3f. Response in
review-r1-response.md:Round 2 (Opus 5.5 lane): APPROVE WITH NITS at ba4dfa9. It confirmed:
Addressed in 48046eb:
Round 3 (Opus 5.5 lane): APPROVE WITH NITS at 48046eb. It confirmed the finding-4 fix in both entry points, that the re-pins agree with one another, and the corrected body. Its notes, and what was done:
_load_manifestalready refuses a production manifest whose target order differs from the current canonical order.out/pins-final.txtnow does.CI
Later commits fix count pins that CI and local sweeps found (f333029, e953167, 2126a5a). Two were inherited from #1251: its own CI is red on them at 45a5b98.
test_puf_qrf_chain.pylocks the primary target order at 66, not 65.test_us_post_export_scoring.pyhas 19 smoke baseline keys, not 18.At 2126a5a,
engine-free (3.13)passes the whole engine-free suite.Not in this PR
Table 1.4 vs HT2/CD. Once chronicle#180 lands, the Table 1.4 entity legs and HT2/CD's signed A26270 describe the same line 32. At one vintage, the signed net equals income less loss of the four legs exactly, so binding both nationally is an equality conflict. For TY2022, Table 1.4 implies $1,031.2B and HT2 says $1,033.3B. Which binds nationally is a choice for the HT2/Table 1.x control work (Rebase stale Historic Table 2 rows onto their concept-matched national controls #1247, Bind Historic Table 2 and district-file business, partnership and rental 'net income (less loss)' rows to signed model concepts #1230); recorded there.
Dollar basis. Both leaves keep the processed column's TY2015 dollars. The PUF donor's amounts stop at TY2021 levels, two columns at TY2015, and nothing ages them to the build year #1248 (PR Record the PUF donor uprating audit for #1248 #1223) owns aging the donor and can age each entity with its own series.
When the legs bind. Table 1.4 entity legs bind only once Chronicle publishes them (chronicle#180 / Informed-init L0 selection: warm-start reselection for pool changes (ACS/ASEC ingest forcing function) #346).
Legacy scoring. Pre-US PUF donor carries Schedule E line 32 as one number: s_corp_income is an exact-zero universe, so Table 1.4's partnership and S-corp legs cannot bind by entity #1258 attested artifacts need re-attestation for legacy scoring, as after Carry Schedule E line 32 and its passive subset on the US PUF donor #1251.
Decision
Merging changes what the next US build carries: S-corp income on every PUF-clone and native row, instead of zero. The merge is queued for Max as d1489 (high, deadline 2026-10-27). It follows #1251, whose own merge is d1472.
axiom: n/a: microsim data donor, imputation and calibration-target mapping only; no policy rule changes
🤖 Generated with Claude Code