Skip to content

Carry Schedule E line 32 by entity on the US PUF donor; retire the S-corp exact-zero universe - #1261

Merged
MaxGhenis merged 24 commits into
mainfrom
us-puf-entity-split-line32
Oct 31, 2026
Merged

MaxGhenis merged 24 commits into
mainfrom
us-puf-entity-split-line32

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Resolves #1258. Stacked on #1251. This PR targets main so CI runs, which means its diff also contains #1251's commits until #1251 merges. This PR's own commits start at 85eb94b7b; to see only them, compare against us-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 − E26110
  • s_corp_income = E26170 + E26190 − E26160 − E26180 − E26100

Before this PR, the whole line-32 total sat in partnership_income, and s_corp_income was 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.

Max ruled yes on d1489 and d2183 (see "Decision"). This PR lands last, after #1251 and #1259.

Why

From TY2021, SOI Table 1.4 publishes partnership and S corporation net income and net loss separately. For TY2022:

Net income Net loss
Partnership $487.1B (3.31M returns) $175.6B (2.09M)
S corporation $812.7B (4.03M) $93.0B (1.52M)

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.

Line 28 column Partnership S corporation
(f) passive loss allowed E25920 E26160
(g) passive income E25940 E26170
(h) nonpassive loss E25960 E26180
(i) section 179 expense deduction E26110 E26100
(j) nonpassive income E25980 E26190

Each entity's share is (g) + (j) − (f) − (h) − (i) of its own columns. Checked on the pinned TY2015 file (puf_2015.csv, sha256 0a7fd643…, all 207,692 regular records; out/entity_split_stats.txt):

  • The entity shares partition the same fields as passive and nonpassive. So partnership + S corp equals passive + nonpassive exactly.
  • They equal E26270 within the booklet's per-field rounding on every record. E26270 differs from the field sum on 38,378 records (18.5%). The largest residual is 0.985 of the record's bound, and the weighted absolute residual is $0.135B on $621.9B net.
  • The donor carries the field sums, not E26270. No field says which entity a rounding residual belongs to. Pushing E26270's residual into either entity would make 3,860 S-corp-only records partnership carriers, and 12,987 partnership-only records S-corp carriers.
TY2015, regular records Net Income (returns) Loss (returns)
Partnership $238.3B $316.8B (3.29M) $78.5B (1.91M)
S corporation $383.6B $434.1B (3.53M) $50.5B (1.27M)
Line 32 (E26270) $621.9B $735.8B (6.15M) $113.9B (2.69M)

Other shares of regular returns:

  • 25,315 records (1.17M weighted) carry both entities.
  • 10,274 records (0.49M weighted) carry the two with opposite signs.

The change

Donor (puf_source_schedule_e.py, puf_support.py)

  • schedule_e_partnership_s_corp_columns returns each entity's share. The line-32 rounding identity is now checked against their sum.
  • source_year_puf_partnership_s_corp_income returns partnership_income, s_corp_income and passive_partnership_s_corp_income.
  • For the four disclosure aggregate rows, each entity's total, and the passive total, is allocated over the row's synthetic records in proportion to their processed nonpassive amounts. This is the same rule Carry Schedule E line 32 and its passive subset on the US PUF donor #1251 used for line 32: every bucket keeps its published totals by entity.
  • The receipt adds per-entity legs and counts, and the stored-E26270 residual.
  • The donor supplement must carry all three leaves. The processed nonpassive column no longer aliases s_corp_income to zero, so a processed donor that requests any entity leaf without the supplement now fails with "cannot derive".
  • The raw-field path takes its entity legs from the same constants.
  • Passive placement and zeroing refuse an imputation pass that lacks either component (a partial or misordered basis is refused before any QRF fit).

On the real inputs (211,677 processed tax units, TY2015 dollars on the processed weights; out/real_donor_vectors.json):

Leaf Net Income (returns) Loss (returns)
Partnership $250.6B $340.2B (3.52M) $89.6B (2.04M)
S corporation $426.0B $491.6B (3.78M) $65.6B (1.36M)

Retired: the S-corp exact-zero universe

  • Stacked spine:

    • _materialize_us_puf_s_corp_universe_zero, us_puf_s_corp_universe_zero_rule_identity and US_PUF_S_CORP_UNIVERSE_ZERO_RULE_ID;
    • the whole_pool_output_universes doctrine, in the primary execution config, the PUF-pass receipt and the late-resource validator;
    • the pass's s_corp_income_universe_zero receipt.

    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.json and imputation_semantics.py.

  • Late ACS transfer: s_corp_income is no longer excluded from puf_tax_itemization. It joins partnership_income in 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_income is a PUF-clone primary output like every other primary target.

  • Pool: QBI reconciliation's s_corp_income input is provisioned by the pool input surface, like partnership_income. The primary_puf_exact_zero_universe provision 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_version 5, 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):

Measure ids Concept Leaf Part
partnership_net_income_{returns,amount} partnership_income partnership_income positive
partnership_net_loss_{returns,amount} partnership_losses partnership_income negative-part magnitude
s_corporation_net_income_{returns,amount} s_corp_income s_corp_income positive
s_corporation_net_loss_{returns,amount} s_corp_losses s_corp_income negative-part magnitude

The materializer sums each person leaf to the tax unit before taking the part, which is return grain, as for the estate/trust legs.

  • The pinned feed carries none of these ids today, so the compiled registries are unchanged. On both Carry Schedule E line 32 and its passive subset on the US PUF donor #1251's head and this branch (out/compile_*.json):
    • full registry f5bd921d6b21 (33,250 specs);
    • national_state e1f9906bf0e0 (6,102);
    • the 1,098 HT2/CD A26270 rows are identical.
  • When the legs land, they bind. I cloned the feed's own TY2023 all-returns Table 1.4 estate/trust facts into the eight entity-leg facts, with SOI's published TY2023 values (scripts/compile_with_entity_legs.py). All eight compile onto national_state, each binding its own leaf (out/compile_with_entity_legs.json).
  • HT2/CD A26270 keeps binding the combined 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 (domain puf_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_HASHES and counts, from build_inventory_coverage observations: authority, full checkpoint, graph nodes, late families, late resource semantics, late schedule, seed protocol and seed map.
  • field_usage pins (battery, imputation family execution, imputation producer graph, totals) and the pointer-inventory digest. tools/spec_engine_coverage.py --check passes: 42,244/42,244 fields, 41/41 checks.
  • tools/graph_us_post_transfer_fixture.py: the H3 fixture's pool digest line.
  • The US spec digest 02c4227f… (engine-workflow multispine tool test) and the loader golden vector.
  • Counts in tests and docs, each moved by the one added transfer target:
Count Before After
Late transfer targets 71 72
Transfer surface 119 120
Terminal surface 135 136
PUF-clone producer targets 44 45
Numeric late targets 52 53
Sign-separated battery metrics 80 81
Whole-pool primary outputs 35 34

Invariants

These hold for every input. The Hypothesis property tests run 300–500 examples each.

  1. Entity partition. partnership + S corp == passive + nonpassive, bit for bit on whole-dollar fields. Both equal (g) + (j) − (f) − (h) − (i) summed over the two entities (test_entity_shares_partition_line_32_exactly).
  2. Line-32 identity. |E26270 − (partnership + S corp)| ≤ the booklet's per-field rounding, after independent disclosure rounding of every field. A residual beyond the bound is refused (existing tests, now against the entity sum). It holds on every regular record of the real file.
  3. Entity support. An entity whose five columns are zero carries exactly zero, even when E26270 carries a rounding residual (test_an_entity_without_columns_carries_nothing).
  4. Entity bounds. −(own loss columns) ≤ share ≤ (own income columns).
  5. Passive unchanged. The passive vector is byte-identical to Carry Schedule E line 32 and its passive subset on the US PUF donor #1251's on the real inputs (pinned hash), and passive's formula is untouched.
  6. Bucket conservation. Each aggregate-row bucket's weighted partnership, S-corp and passive totals equal the row's population times its per-return value, and each synthetic record keeps its processed sign pattern.
  7. Differential. puf_support's raw-field derivation equals puf_source_schedule_e's columns for all three leaves (test_raw_array_path_agrees_with_the_source_year_columns).
  8. Passive coherence. No passive amount survives where the person's or unit's partnership + S-corp total is zero. This holds after the primary draw (Hypothesis, with the two entities cancelling) and after the transfer. An S-corp-only carrier keeps its passive amount. Both the primary pass and the transfer refuse a basis missing either component; the primary pass does so before fitting.
  9. Target partition. For each entity, income leg − loss leg == the signed leaf, both legs are nonnegative, and the two return indicators partition nonzero units (test_table_1_4_entity_legs_partition_each_signed_leaf).
  10. Retirement.

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:

  • the partnership share drops section 179;
  • the section 179 legs are swapped between the entities;
  • S corp takes the E26270 residual;
  • the identity is checked against the passive split only;
  • the regular S-corp share is left at zero;
  • the synthetic buckets put all of line 32 in partnership;
  • the donor supplement drops s_corp_income;
  • the raw path drops E26100;
  • passive zeroing reads partnership only;
  • the transfer tolerates a missing S-corp leg;
  • the S-corp loss leg binds the positive part;
  • the partnership legs bind the combined line 32;
  • the loss legs take the positive part.

Modal evidence

I built a PUF-support base on Modal: run entity-split-1258-base-d239b0f77b7a, rc 0, 8,644 s, about $7.81.

Imputed against the donor. PUF-clone half (89.76M weight); donor scaled per unit weight (×89.76/161.18). Base initial weights:

Leaf Donor-scaled net / income / loss Imputed Ratio
Partnership $139.5B / $189.4B / $49.9B $134.6B / $194.4B / $59.8B 0.96 / 1.03 / 1.20
S corporation $237.2B / $273.7B / $36.5B $259.7B / $285.7B / $26.1B 1.09 / 1.04 / 0.71
Line 32 (P+S, tax unit) $376.8B / $453.8B / $77.1B $394.2B / $471.0B / $76.8B 1.05 / 1.04 / 1.00
Line 32, #1251 (one combined leaf) same $455.3B / $552.5B / $97.2B 1.21 / 1.22 / 1.26
Passive (signed-mass calibrated) $46.2B / $58.9B / $12.7B identical 1.00
  • Returns. Partnership income returns are 2.55M against 1.96M scaled, and loss returns 1.50M against 1.14M (1.3×). S corp returns are 2.17M against 2.10M and 0.81M against 0.76M.
  • Entity mix. 0.79M tax units carry both entities, and 0.34M carry them with opposite signs. The donor shares are similar.
  • Coherence. No passive amount sits under a zero line 32, at person or unit grain.
  • The split brings line 32 from 1.21× to 1.05× of the donor. This is observed; I have not traced the mechanism.
  • The entity loss legs err in opposite directions. Partnership loss mass is 1.20× (+$9.9B) with 1.31× loss returns; S-corp loss mass is 0.71× (−$10.5B). Line 32's 1.00 loss ratio is those two errors cancelling. Nothing binds the entity loss legs until chronicle#180 lands, so this PR leaves both leaves uncalibrated, like Carry Schedule E line 32 and its passive subset on the US PUF donor #1251's combined leaf. Whether to signed-mass calibrate them is a methodology call, and it must be settled before those legs bind; it is tracked in PUF entity leaves: partnership loss over-imputed (1.20x mass, 1.31x returns), S-corp loss under-imputed (0.71x); decide calibration before Table 1.4 entity legs bind #1265.
  • Chained draws. Other PUF leaves move through the chained draws (person_columns_moved in out/compare_bases.json).
    • At base weights:
      • w2_wages_from_qualified_business: −$54.3B (−30%)
      • sstb_w2_wages_from_qualified_business: −$33.7B (−40%)
      • SSTB self-employment: −$16.9B
      • self-employment: −$9.1B
      • SSTB property basis: +$7.6B
      • REIT/PTP: +$1.2B
    • Under the Route A final weights:
      • QBI property basis: −$77.4B
      • SSTB self-employment: −$47.0B
      • SSTB property basis: −$39.7B
      • passive: −$36.6B (−26%)
      • W-2 wages: −$34.2B
      • self-employment: −$18.0B
      • SSTB W-2 wages: +$14.7B (they fall at base weights and rise here)
    • Passive mass equals the donor's only at base weights. Its placement follows the new line-32 draws (positive returns 1.80M → 1.90M), so it moves under other weights. That accounts for the whole −$36.6B change in net investment income, and the NIIT row below.

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:

Weights Line 32 AGI Income tax NIIT QBID
Base initial −$61.1B −$102.4B −$37.3B −$0.2B −$0.2B
Route A final (control-calibrated, not re-solved) −$55.0B −$161.6B −$42.2B −$1.5B −$19.5B

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

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.py locks the primary target order at 66, not 65.
  • test_us_post_export_scoring.py has 19 smoke baseline keys, not 18.

Both PRs pass all 10 checks at their current heads.

At 2126a5a, engine-free (3.13) passes the whole engine-free suite.

Not in this PR

Decision

Merging changes what the next US build carries: S-corp income on every PUF-clone and native row, instead of zero. Max ruled yes on d1489 (10/24): land #1251, then this PR, with a fresh review that clears the top-tail draws, then a certified US build. Round 4 clears them only with #1259, and Max ruled yes on d2183 (10/31), so the order is #1251, #1259, #1261.

axiom: n/a: microsim data donor, imputation and calibration-target mapping only; no policy rule changes

🤖 Generated with Claude Code

MaxGhenis and others added 7 commits October 13, 2026 07:31
The #982 income-rank predictor sends the top-ranked survey tax units, each
standing for several hundred units, onto the PUF's top-ranked returns,
which stand for one return or less (the synthetic Forbes-tail records weigh
about 0.13). One draw put $141B of line-32 mass on a weight-644 unit in the
#1251 rebuild. Weight-aware leaf draws (#481) cannot fix this: the slice
such a donor belongs to is smaller than one recipient.

QRF finalization now caps each raw amount draw at the positive mass per
unit of slice weight of the donor's top slice of the recipient's own weight
share, and floors losses from the bottom slice, on every amount output.
The rule is bound into the primary PUF execution config (schema 6), and
each bounded output writes a tail-bound diagnostics record.

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>
- Snapped (sparse) outputs are bounded on their snap-grid donor values. A
  slice inside one grid value now caps at that value exactly; computing on
  unrounded values clipped every draw at an aged statutory maximum to the
  grid value below (1,163 qualified-tuition rows per seed in the sweep).
- Every test that finalizes amount outputs passes a tail-bound diagnostics
  sink, now required because the recipient-share bound is always active.
- Regenerated imputation.yaml (primary execution config schema 6), field
  usage counts and claim digest, inventory digests (seed protocol and map,
  producer registry, resource semantics, full checkpoint identity), the
  pointer inventory digest, coverage evidence, the pool-tool spec sha and
  the loader golden vector.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ests

- Stacked publication and the pool loader required execution-config schema
  5 while the builder wrote 6, so no current stacked pool could publish or
  load. All four sites now read PRIMARY_PUF_EXECUTION_CONFIG_SCHEMA_VERSION.
- The comment and docstrings now call the bound an interim censor that
  limits a record to its slice (not a fix for concentration the slice has),
  name the root fixes (#958/#964, #481), and record the loosened links
  across columns, the rung dependence and the Social Security re-split.
- Slices use positive-weight donors only; non-finite bounded draws are
  refused before any write; quantile records carry a rule discriminator.
- Tests: zero weights on both sides; an LP optimality check replaces the
  tautological mass test; production-geometry differential test; tax-unit
  outputs, Social Security total, and per-leg calibration factors through
  finalization; the identity is pinned to a literal.
- Re-pinned the seed protocol and map, coverage evidence, pool-tool spec
  sha and loader golden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 13, 2026 10:23
…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>
- test_us_spec_bundle asserted execution-config schema 5; it now reads the
  shared constant. The operator-ordering doc and a pass-through fixture
  said 5 too.
- Share-bound diagnostics records carry the recipient and donor weight
  totals, so rungs can be compared.
- Tests: the non-finite check is shown to stop before the quantile cap's
  write; the LP oracle is scaled to a unit objective so solver tolerance
  cannot flake; a restated assertion is removed; the base-builder fake
  record carries the rule field.
- Changelog: interim label; schema-5 stacked pools are no longer loadable.
- Re-pinned the seed protocol and map, coverage evidence, pool-tool spec
  sha and loader golden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis changed the base branch from us-puf-line32-passive-1239 to main October 13, 2026 14:23
@MaxGhenis MaxGhenis closed this Oct 13, 2026
@MaxGhenis MaxGhenis reopened this Oct 13, 2026
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>
MaxGhenis and others added 5 commits October 13, 2026 12:12
…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>
GitHub's runner queue for the repository was stalled, so the engine-free
and engine-us suites were run on Modal against this branch. They found:

- For a snapped output the cap was lowered to the largest grid value within
  it, which could be zero: a carrier whose slice mass sits below the
  smallest positive donor value was erased. The cap is now lowered onto the
  positive grid only, so the bound moves no draw to zero; how many records
  carry a sparse output stays the donor-rate sparsification's job.
- Two tests pinned the old field counts as literals.
- Non-production stacked passes that ask for no diagnostics now hand
  finalization a discarded sink; production still requires one.
- Four tests that isolate another mechanism on two- to twenty-unit frames
  (snapping control column, educator sparsification, farm signed-mass
  calibration, Social Security preservation) narrow the bound explicitly,
  through a new test-only passthrough on impute_us_puf_tax_detail_support.
- Share-bound diagnostics records carry the recipient count, which is what
  differs between sample rungs.
- Re-pinned the regenerated bundle and every digest derived from it.

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>
…ew r4)

A snapped output is bounded by the larger of its slice cap and its smallest
positive donor value, so the bound never erases a carrier. The module
comment promised the slice-mass bound without that exception. Comment only;
re-pinned the seed protocol and map, coverage evidence, pool-tool spec sha
and loader golden, which attest puf_support.py's bytes.

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>
MaxGhenis and others added 3 commits October 29, 2026 11:56
The conflicts are all spec pins. Counts take ours + theirs - base. The
repo's repin sequence regenerates the digests: the legacy pass,
generate_us_bundle_from_constants, the compiler pass run twice, and
spec_engine_coverage. Coverage reports 42,245 configuration fields and
41/41 inventory checks. puf_support.py is unchanged on main since this
branch's base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The merge brings in us-puf-line32-passive-1239 at c50bda1, which
carries main at 846b48a. The conflicts are spec pins plus one test
comment, where #1251's note on the 66th primary target stays. Counts take
ours + theirs - base. The repo's repin sequence regenerates the digests:
the legacy pass, generate_us_bundle_from_constants, the compiler pass run
twice, and spec_engine_coverage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 31, 2026 09:32
#1251 landed first, as d2183 ordered. Resolved count pins as ours + theirs -
base and re-derived every digest with the repin sequence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1259 lands first, as d2183 ordered, and its head already holds main at
f36a14a, so #1261's CI runs on the tree the land order produces. Resolved
count pins as ours + theirs - base, kept #1259's bound asserts beside the
retired-doctrine check, and re-derived every digest with the repin sequence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 31, 2026 13:47
MaxGhenis and others added 2 commits October 31, 2026 10:31
#1259 refuses a tail-bound finalize with no sink, and #1251's two passive
tests landed on main without one, so neither PR's own CI saw the clash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis merged commit c0513db into main Oct 31, 2026
10 checks passed
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Claude merged 1c41d5f87 on Max's rulings d1489 and d2183. Sol approved 487243ee9 in the fourth review, and Opus then read both merges of #1259 into this branch at 1c41d5f87 and found no defect. All 10 checks passed at 1c41d5f87, and main now holds that commit's tree.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant