Repository navigation
SM1: differential mortality by lifetime earnings, education and race (normalized within age-sex-year cells) - #570
Merged
Conversation
Adds the opt-in package populace_dynamics.mortality_ses. - Relative risks are specified over three dimensions: lifetime-earnings group (primary), education, and race and Hispanic origin. They are log-additive and indexed by sex, age and year. Years past the table hold the last year's coefficients. A coefficient path is pluggable. - The unclassified rule is `refuse` by default; `reference` contributes zero log risk. - A pure normalizer rescales probabilities so that each single-age x sex x year cell keeps the baseline's expected deaths. Fixed rows keep their fixed probability, and the others get min(1, q_base x RR x k), with iterative capping. It logs the residual and flags infeasible cells. - DifferentialMortality wraps a year-aware baseline. Its fixed rows are DI-origin persons at baseline q, so the DI-aware adapter sees the baseline rate for them. It exposes bands and __call__(frame, context), and deliberately no probabilities attribute. - apply_differential_mortality draws apply_mortality's uniforms. Nothing is wired into a registered run, runner, config or gates.yaml. Tests are on invented data: Hypothesis properties for cell conservation, feasibility, bit-identity at unit risk, bounds, DI composition, intended monotonicity, permutation and weight invariance, and determinism; plus a differential test against the DI adapter's _net_of_di_origin arithmetic. Built by a Subfleet build lane (GPT-6.1 Sol) from the lane brief; that lane's sandbox could not write .git, so the lane session commits it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Documents the interfaces, the cells and fixed persons, the unclassified rule, normalization and its tolerance, traceability to the lane design (docs/design/mortality_groups_financing.md, approved at 2c19f5b under d1922), the invariant evidence, and what stays outside SM1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the five mortality_ses sources to POST_REVIEW_SOURCE_EXCLUSIONS and its exact-tuple test, and asserts that they stay unreachable from the birth-evidence reducer. It also recounts the tiers: unit 18,088 -> 18,178, total 24,619 -> 24,709, from recount-tiers.py with the empty PSID root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
MaxGhenis
added a commit
that referenced
this pull request
Oct 24, 2026
…known gaps - Tracking and next-step cells for the twelve rows the mortality, groups and financing (#558), income-and-resources (#559) and open-population (#557) designs cover, citing their merged files. - The poverty row records U2's completed second structural pass and its ratification by #556's merge; next are the evidence file, a fresh forecast and the #42 registration. - Known gaps keeps only what no issue, PR or approved design plans. - Rulings d1922, d1923 and d1925; link refs for #556, #566–#568, #570. - Scorecard: the wealth row names the approved design; progress page regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When every free row with positive baseline q in a cell had zero weight, the weighted target was zero and the normalizer set the factor to zero, so those persons could never die. An invented cell with baseline 0.2 and relative risks 1 and 2 returned q = [0, 0], logged factor 0 and raised no flag; through the model, an all-zero-weight frame did the same. No factor changes such a cell's weighted deaths, so the weighted target says nothing about it. The cell now sets the factor as if each person had weight one: its free rows keep their relative risks, and their unweighted expected deaths equal their unweighted baseline total. Both arithmetic paths (float and Decimal) apply the rule. If fixed probabilities off baseline leave a nonzero weighted target, the cell stays infeasible and the residual records the gap. With unit risks this reproduces the DI adapter, which keeps the factor at one when the other rows carry no expected deaths. Tests: - examples on both arithmetic paths, mixed cells, infeasible cells of both signs, and the model; - a property that zero weights give exactly the unit-weight probabilities and factors; - a differential property against _net_of_di_origin on every unclipped cell, over zero weights and arbitrary fixed probabilities; - the normalizer properties now draw zero weights. An ad hoc search of 20,000 invented trials (53,481 unclipped cells) found 1,207 mismatches with the adapter before this change and none after. Found by the SM1 review r1, whose attempt was lost to an API error before it reported. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tests/mortality_ses collects 96 unit tests, up from 90, and no others. unit 18,178 -> 18,184; total 24,709 -> 24,715. The full-collection tiers_match_policy_manifest check passes with the empty PSID root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1b2 found two float-path faults. Roundoff in the capping loop could zero a capped cell's probabilities and hide the loss, and a rounded tie between target and capacity saturated rows it should not. The float path now hands the Decimal path every call it cannot make reliably: a target within 1e-3 of capacity or of zero, a capping round that leaves less than 1e-3 of the target, and a feasible result that misses conservation by more than 1e-12. Capped rows stay at one. Infeasibility is now decided before the unit-weight rule. A negative weighted target zeroes the free rows and a positive one saturates the support, whatever their weights; these are the limits as the support's weight vanishes. Unit weights apply only where the weighted target is zero. A target that exactly fills the weighted support takes the smallest capping factor, so zero-weight rows are not pushed to one. The cell log gains normalization_basis and persons_target. DifferentialMortality takes an optional cell_log mapping, so a run under the DI adapter keeps that log. Grouping checks missing values once per distinct cell, and the stable sum converts its terms in bulk. The tests add an exact rational oracle, a vanishing-weight limit property, a regression for each finding, and a composed DI run with unequal weights and clipping in both steps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tests/mortality_ses now collects 110 unit tests, up from 96. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Round 2 of the review found a float-path cell whose largest row's scaled
probability rounded to exactly one. The loop capped nothing, so rows of
tiny weight took a factor ten times too small while the weighted totals
still conserved.
- A row within 1e-9 of one at any capping round now sends the cell to
the Decimal path. The float path's error bound is about 1.3e-12, so
every other cap decision is the exact one.
- The remaining-target guard is now measured against the totals the
target is taken from, not the target. Fixed-death and capping
cancellation can no longer compound; they once reached an error of
1.8e-11.
- The comment and the design note state the error bound and its
derivation. The separate 1e-12 conservation check covers weighted
deaths only.
- Tests:
- two new unit regressions;
- two new oracle properties, one for cap boundaries beside tiny
weights and one for cancellation near the margin;
- the oracle tolerance tightens from 1e-9 to 1e-11.
- The composition test now checks that applied deaths equal baseline
deaths minus SM1's residual and the adapter's own clipping gap. It
also checks that the gap is positive where the adapter clips.
On invented million-row frames, the normalizer's time and fallback
counts are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unit 18,198 to 18,202; total 24,729 to 24,733. These counts are against the PR's base and will be recounted on fresh master at the tier-count slot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The design note now gives the largest float-path error from 10,000 invented near-margin cells at cee73cb: 2.4e-13 relative, under the 1.3e-12 bound. The earlier figure came from a search run before the cap-decision margin was set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he oracle Round 3 found that the float path's cap-decision check examined only the rows that set the factor. A zero-weight row takes the factor without setting it, so one whose exact scaled probability lay a rounding step above one could go uncounted in the log's clipped count, though its probability stayed within the error bound. After the last capping round, any uncapped free row within the 1e-9 cap margin of one now sends the cell to the Decimal path. The exact oracle now returns the clipped count, and the oracle check compares it exactly, with the reviewer's cell as an example and a new generator that places zero-weight rows a few rounding steps either side of one, sometimes after a round that caps a dominant row. At ad827f1 that generator finds 605 miscounted cells in 2,000; here it finds none in 4,000, and the other three generators find no disagreement in 24,000 cells. On a million invented rows the fallback and clip counts are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unit 18,202 to 18,204; total 24,733 to 24,735. These counts are against the PR's base and will be recounted on fresh master at the tier-count slot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The delta review of 8edc9d9..8ca39c2 approved it, with two wording findings and a nit. The design note and the normalizer's docstring now define `clipped_persons`: free rows whose scaled probability exceeds one at the cell's final factor, not counting a row exactly at one; in a cell whose target exceeds its free capacity, every free row with positive baseline q. The note's measured error now comes from a derandomized search (1.8e-13 relative, near the margin), with the unseeded range beside it, and a paragraph is rewrapped. The search figures in 8edc9d9's message came from unseeded runs. In derandomized runs, ad827f1 miscounts 1,174 of the same 4,000 zero-weight cells this head gets right, and the other three generators give identical results at both heads. No code path changes here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The confirmation of e1155b4 found that the definition holds only at the cell's exact final factor. The logged factor is its float64 rounding, so a row exactly at one, such as a q = 1 row at a terminal age, can appear to exceed one when recomputed from the log. The design note and the normalize_probabilities docstring now say so. No code changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The confirmation of 5bda0fe found the differential test against the DI adapter's _net_of_di_origin flaky. On 1,000 fresh CI-sized runs at 5bda0fe, 4 failed. In every failing cell SM1 equals the adapter's formula evaluated exactly; the adapter forms max(P - D, 0) / E in float64 with no guard, so its factor can cancel, absorb the free deaths or overflow. The test now holds every unclipped cell to the adapter's formula in rational arithmetic (exact_adapter_cell), at the oracle's tolerance. It compares the adapter's float64 result only where neither P - D nor E lies within a thousandth of max(P, D), with the sums taken exactly so a subnormal E is not lost. That is a third named intended divergence. Four examples cover overflow, absorption, subnormal absorption beside a weightless row, and cancellation. The adapter's intended overflow warning is silenced around its call. Over 140,000 fresh draws the test passes; at 1e-3 the worst float64 comparison it keeps uses under 3% of its tolerance. A relative error of 5e-11 in SM1 fails all four examples through the exact check alone. The clipped-count definition now says the logged factor approximates the exact one in float64, within the float path's error bound, as the same review proposed. No change to SM1's code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The confirmation of 3078d18 found that the adapter guard missed cells whose sums are all subnormal, where float64 rounds products absolutely, and that at a thousandth the float64 comparison held only empirically. - exact_adapter_cell flags a cell when P - D or E lies within a hundredth of max(P, D), or when max(P, D) is below 2**-1000. At a hundredth, a first-order bound keeps the adapter within RTOL and ATOL for every probability up to one; the design note states it. - The reviewer's three minimized subnormal cells become examples. - np.errstate also ignores invalid, for the 0 * inf the overflow forms. - The design note no longer says every unclipped cell meets the exact formula: weightless infeasible cells are skipped. Correction to 3078d18's message, which this one supersedes: its "4 failed" of 1,000 fresh CI-sized runs at 5bda0fe was a measurement error by the old runner. That runner caught only AssertionError and stopped at the first ExceptionGroup, after 46 runs. A runner that counts every failure measures 70 of 1,000 at 5bda0fe (seeds 1000-1999), as the reviewer found, and 0 of 3,000 at this commit (seeds 1000-3999). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wording only, from the confirmation of 3384364: below 2**-1000 float64 can round a cell's products absolutely, but only those below 2**-1022 (subnormal) do; and where P = D exactly the adapter's factor is at most about 19u/0.01, under the test's absolute tolerance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Four files conflicted. Each is resolved as follows. - scripts/first_estimates_birth_evidence.py and tests/estimates/test_birth_evidence_artifact.py: both sides added entries at the same place in POST_REVIEW_SOURCE_EXCLUSIONS and in its exact-tuple test. The resolution keeps both, SM1's five mortality_ses paths first and then master's two D1a reader paths, in the same order in the script and the test. - tests/tier_counts.json and tests/README-tiers.md: master's versions, regenerated with recount-tiers.py on the merged tree. unit goes from 18,433 to 18,549 and the total from 25,003 to 25,119. The +116 equals SM1's own delta on its base (tests/mortality_ses, 116 unit tests). Against master the merged tree differs only in SM1's 14 files. Checks on the merged tree, with an empty PSID root: - full collection, -k tiers_match_policy_manifest: 1 passed, 4 skipped; - test_birth_evidence_artifact.py -k post_review: 2 passed; - tests/mortality_ses with RuntimeWarning as an error: 116 passed; - test_m6_engine_steps.py and test_m6_engine_di_entitlement.py: 83 passed; - tests/baselines -m unit: 29 passed; - black -l 79, ruff and git diff --check clean on the changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Landing audit (Microcosm Dynamics coordinator, 2026-10-25 16:15Z). Merged at the reviewed head Gates checked at 16:14Z:
Reviews:
Other open tier-slot PRs must merge master at |
MaxGhenis
added a commit
that referenced
this pull request
Oct 25, 2026
Master brings #587 (ledger delta), #575 (D1a) and #570 (SM1). None of them changes the registry module, its tests or its mutation specs, and the registry module imports only the standard library and yaml. The tier conflict resolves to master's counts plus this branch's nine unit tests: unit 18,549 + 9 = 18,558, total 25,128. The README tier table now matches the tier file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 25, 2026
Held-out data registry: round 7's follow-ups (unset event path, record ids, zero push boundary)
#580
Merged
MaxGhenis
added a commit
that referenced
this pull request
Oct 25, 2026
Master brings SM1 (#570). The merge has no conflicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 26, 2026
Master brings #570 (SM1: the mortality_ses package, its design note and tests), #566 (OP1: the open_population package, its evidence and tests), changes to scripts/first_estimates_birth_evidence.py and its artifact test, and the tier files. None of it is a B0.2 file, and none of it is imported by the B0.2 script or by anything that script imports. The tier conflict resolves to master's counts plus this branch's unit delta: 18,780 + 233 = 19,013 unit, with the other tiers as on master, for a total of 25,583. The README tier table matches the tier file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 26, 2026
This branch was successfully 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.
SM1 of the mortality, groups and financing lane: an opt-in mechanism for mortality that differs by lifetime earnings, education and race and Hispanic origin, normalized so each age × sex × year cell keeps the baseline's expected deaths. It fits nothing and is wired into nothing.
The lane design is
docs/design/mortality_groups_financing.md(#558), which Max approved on 2026-10-23 (d1922) at2c19f5b6. Max's rulings that apply here:The brief is
EV/mortality-groups-financing-20261021/builds/sm1-brief-20261024.md, kept outside the repository.What it adds
src/populace_dynamics/mortality_ses/, with four modules:specification.py: log relative risks by dimension, category, sex and single age, combined log-additively. Coefficients are pluggable by year. The default path holds the last year's table. Reference categories must have zero log risk. Unclassified values refuse by default, or count as the reference underreference; unknown categories always refuse.normalizer.py: a pure normalizer. Fixed rows keep their fixed probability. Free rows getmin(1, q_base × RR × k), with iterative capping, so the cell's weighted deaths equal the baseline's. It writes a per-cell log: deaths, factor, clipped persons, residual, the infeasible flag, and the normalization basis with its persons target.normalization_basis = "persons".model.py:DifferentialMortalitywraps a year-aware baseline. It exposesbands = SINGLE_YEAR_AGE_BANDSand__call__(frame, context). It deliberately has noprobabilitiesattribute, so the DI-aware adapter calls it with the year. It refuses an age that disagrees withyear − 1 − birth_year. DI-origin persons, as the adapter defines them, keep baseline q, so the adapter still owns their rates. It consumes no RNG. An optionalcell_logmapping keeps each call's cell log by year, because the adapter keeps only probabilities.step.py:apply_differential_mortalitydraws the same uniforms asengine/steps.py'sapply_mortality, person-keyed through the RNG registry when one is present.docs/design/mortality_ses_sm1.md.POST_REVIEW_SOURCE_EXCLUSIONS, its exact-tuple test, and a check that they stay unreachable from the birth-evidence reducer.Nothing touches a registered run, runner, config,
gates.yaml,engine/*,baselines/*ortrack_b/. SM mortality enters a projection only after SM3 passes and the change-admission protocol is frozen (lane design, section 7.1).Invariants
Each holds for every valid input, within the stated tolerance. All are tested with Hypothesis properties on invented data, plus example tests.
rtol = atol = 1e-12, and the logged residual is exactly zero. An infeasible cell logs its signed gap (baseline minus applied) as the residual. The float path checks conservation itself rather than assuming it, and recomputes on the Decimal path any cell that misses.personsand the unweighted target.rtol = 1e-11,atol = 1e-15, about seven times the float error bound, and its clipped count, infeasible flag and normalization basis exactly. The oracle uses rational arithmetic and searches over how many rows cap rather than iterating. Four generators feed it:Differential test: with unit risks for the free rows, the normalizer reproduces
engine/di_entitlement.py's_net_of_di_originon every cell where no clip binds, including cells with zero weights, infeasible cells and arbitrary fixed probabilities. Every such cell, apart from the weightless infeasible ones below, is also held to the adapter's formula evaluated in exact rational arithmetic, at the oracle's tolerance. They differ by design in three places, and the test labels each as intended:max(P - D, 0) / Eis unreliable in float64, its factor can cancel, absorb the free deaths, overflow or be off by percents. That is whereP - Dor the free deathsElies within a hundredth ofmax(P, D), or wheremax(P, D)is below 2^-1000, so that float64 can round the cell's products absolutely (a product below 2^-1022 is subnormal). There the test compares SM1 with the exact formula only. Elsewhere a first-order bound, given in the design note, keeps the adapter within the test's tolerance for every probability up to one, and whereP = Dexactly its factor stays under the absolute tolerance.Checks (run on the host at
8ca39c26, with an empty PSID root;e1155b4band5bda0fedchange only the design note and a docstring, andtests/mortality_ses, Black and Ruff were rerun at each;3078d18band3384364achange the differential test, and the checks marked † were rerun at each;cd12003achanges only the design note and a docstring, andtests/mortality_ses, Black and Ruff were rerun there;75df561emerges master, and the checks under "On the merged tree" were run there)tests/mortality_ses: 116 passed, all in theunittier †tests/test_m6_engine_steps.pyandtests/test_m6_engine_di_entitlement.py: 83 passed †tests/baselines -m unit: 29 passed-k post_review): 2 passed-k tiers_match_policy_manifest: 1 passed, 2 skipped †git diff --checkclean †3384364a†, with a runner that counts every failure, Hypothesis'sExceptionGroupincluded:5bda0fed; at3384364a, none of 3,000 (seeds 1000–3999);3078d18b's guard (its float64 adapter misses the tolerance by a factor of 6e9 to 3e11) and are guarded now, and SM1 equals the exact formula in each;PandD, gives its free rows probability zero, which a relative change can't move. 2e-12, below the exact check's tolerance, passes all seven.rtol = 1e-11, comparing clipped counts exactly. They are derandomized: each draws the same cells on every run and for both heads, so these figures reproduce. Hypothesis also draws some values from the literals of loaded local modules that aren't tests, so a seeded figure reproduces only with the same source for the runner script and forsrc/.8ca39c26, no disagreement in 8,000 cells drawn across magnitudes, 6,000 at cap boundaries, 10,000 near the margin and 4,000 with zero-weight rows at one.ad827f1e, the same 4,000 zero-weight cells give 1,174 miscounted clips. The other three generators' cells give identical results at both heads: the fix changes a cell only when an uncapped zero-weight row lies within 1e-9 of one, which the boundary and margin generators never draw and none of these 8,000 wide cells contains.fda767c2, the cap-boundary generator found 189 disagreements in 2,000 cells, the largest a relative error of nearly one.8edc9d90's message quotes unseeded counts (605 of 2,000 atad827f1e); the derandomized figures above supersede them.fda767c2, found no disagreement in 7,000 cells._net_of_di_origin, found 1,207 mismatches before8f341b0f, all in cells whose positive-q free rows weigh zero, and none after8ca39c26:fda767c2in all four frames. These frames have no zero weights; the delta review's variant with 10% zero weights also left fallback and clipped counts unchanged;evaluatetakes 1.53 s.tests/test_m6_engine_steps.pyandtests/baselines/ -m unit(122 passed);git diff --check.75df561e, which merges master1ec57a5d, with an empty PSID root:-k tiers_match_policy_manifest: 1 passed, 4 skipped;-k post_review): 2 passed;tests/mortality_ses, withRuntimeWarningas an error: 116 passed;tests/test_m6_engine_steps.pyandtests/test_m6_engine_di_entitlement.py: 83 passed;tests/baselines -m unit: 29 passed in one run. Master'stest_ungrouping_is_homogeneous_of_degree_one(tests/baselines/test_interpolation.py) fails in about a fifth of fresh Hypothesis runs, independent of this PR: 13 of 60 in the delta check, 7 of 30 in the lane's rerun. Its test file and module are byte-identical to master, and nomortality_sesmodule loads while it runs. A subnormal band total makes the negativity tolerance (1e-12times the largest total) underflow to zero, so a rounding-level negative raises. If a CI shard fails on it, rerun that shard;git diff --checkover the changes: clean.Tiers (
recount-tiers.py):1ec57a5d75df561eThe other tiers are unchanged. The +116 equals SM1's own delta on its original base (unit 18,088 to 18,204, total 24,619 to 24,735):
tests/mortality_sesadds 116 unit tests. This PR editstests/tier_counts.json, so its merge waits for the coordinator's tier-count slot.The master merge (
75df561e) resolves four conflicts:scripts/first_estimates_birth_evidence.pyand its exact-tuple test intests/estimates/test_birth_evidence_artifact.py: both sides added entries toPOST_REVIEW_SOURCE_EXCLUSIONSat the same place. The merge keeps both, SM1's fivemortality_sespaths and then master's two D1a reader paths, in the same order in the script and the test;tests/tier_counts.jsonandtests/README-tiers.md: master's versions, recounted on the merged tree.Against master, the merged tree differs only in SM1's 14 files.
Provenance
20261024-073814-mgf-sm1-build). That lane's sandbox could not write.git, so the lane session reran the checks above and committed the work in three steps.8f341b0f) and its tier counts (6801a686);b99300cc) and their tier counts (fda767c2);bf49d608), their tier counts (cee73cb7) and a design-note figure (ad827f1e);8edc9d90) and its tier counts (8ca39c26);e1155b4b), the confirmation's wording follow-up (5bda0fed), the second confirmation's differential-test fix (3078d18b), the third confirmation's guard fix (3384364a), and the fourth confirmation's wording follow-up (cd12003a);1ec57a5d(75df561e).Review
Round 1 (job
20261024-105442-mgf-sm1-review-r1, Opus 5.5) ran for 2 h 41 min and was lost to an API error before it reported. Its progress notes found the weightless-cell defect, now fixed in8f341b0f; they also confirmed thattests/mortality_ses, the DI adapter tests, the baselines unit tests and thepost_reviewchecks passed at0c226e3f.Round 1b2 (job
20261024-142615-mgf-sm1-review-r1b2, GPT-6.1 Sol) reviewed6801a686and returned REVISE, with one high, three medium and two low findings:b99300ccaddresses all six. The review judged the unit-weight convention right for feasible weightless cells, with explicit logging, and that the negative-target rule should be kept separately. Under the coordinator's ruling, that judgment makes the convention the lane's call.Round 2 (job
20261024-170311-mgf-sm1-review-r2, GPT-6.1 Sol) reviewedfda767c2and returned REVISE, with one medium and two low findings. It confirmed all six round-1b2 fixes, found that the fallback cannot recurse, and found that the exact oracle is independent and correct.bf49d608addresses all three, and this body is corrected. On the conventions, the review's judgment was to accept both the weightless-cell rule split and the smallest-factor tie rule.Round 3 (job
20261024-180937-mgf-sm1-review-r3, GPT-6.1 Sol) reviewedad827f1eand returned APPROVE, with no high or medium finding. It confirmed all three round-2 fixes, the error bound to first order (including 80-bitlongdouble), the 1e-9 cap margin and the oracle's coverage.clipped_persons, so "every cap decision is exact" was too broad. Probabilities stayed within the bound.8edc9d90fixes it as the review proposed and adds a regression test, an exact clipped-count check in every oracle property, and a fourth generator for the case.Delta review of
ad827f1e..8ca39c26, by an in-session Claude Opus 5.5 subagent (every Subfleet lane was closed), returned APPROVE, with no high or medium finding. It probed every branch of the new check and confirmed that the Decimal path counts clips as the oracle does. It also found the generator valid and reaching both sides of one, and reproduced the tests, tiers and lint. It had two low findings and a nit, all wording:clipped_personswas compared exactly but never defined;e1155b4bdefines the count in the design note and the docstring, rewraps the paragraph, and restates the note's figure from a derandomized search. This body's figures come from derandomized searches too. Its commit message names the reviewed range as8edc9d90..8ca39c26; the range wasad827f1e..8ca39c26.Confirmation of
e1155b4bby the same reviewer returned APPROVE. It found every seeded search figure reproduced exactly at both heads, and the definition matching the code in every branch. It had two low findings, both wording:5bda0fedqualifies the definition in the design note and the docstring, and this body uses the reviewer's wording for the first.Confirmation of
5bda0fedby the same reviewer returned REVISE, with one medium and one low finding:3078d18bholds every unclipped cell to the exact formula, compares the float64 adapter only where its arithmetic is well-conditioned, and names that as a third intended divergence, with four examples. It also corrects the wording. The reviewer proposed skipping those cells; the exact comparison keeps them tested.Confirmation of
3078d18bby the same reviewer returned REVISE. It found the exact helper equal to the adapter's formula, the new check not vacuous, and every test and lint check passing. It had one medium and two low findings:5bda0fed", in this body and in3078d18b's commit message, was a measurement error by the old runner, which caught onlyAssertionErrorand stopped at the firstExceptionGroup, after 46 runs. The reviewer measured 70 of 1,000, and the lane's corrected runner 70 of 1,000. The figures above are the corrected ones.3384364a's commit message records the correction and supersedes3078d18b's, which is not rewritten;3384364araises the threshold to a hundredth, where the first-order bound covers every probability up to one. It also adds a clause for subnormal sums, the three cells as examples, and the silencing of the0 * infwarning, and narrows two "every unclipped cell" claims.Confirmation of
3384364aby the same reviewer returned APPROVE, with no high, medium or low finding:bincountbit-identical to an index-order sum from zero in 20,000 invented trials (the bound doesn't depend on summation order).It had two wording nits: the subnormal clause overstated which products round absolutely, and the bound didn't cover cells with
P = Dexactly. It also traced the seed difference between the two margin scripts to Hypothesis's local-constant pool (internal/constants_ast.py,internal/conjecture/providers.py, 6.170.9), which the lane checked in that source.cd12003afixes both nits, and this body notes the reproducibility condition.Confirmation of
cd12003aby the same reviewer returned APPROVE, with no high, medium or low finding.3384364a's.normalizer.pyis the same atad827f1e,8ca39c26andcd12003a, so the seeded figures hold across those heads; it reran two of them atcd12003ato the same values.Delta check of the master merge (
75df561e) by the same reviewer returned APPROVE, with no high or medium finding.cd12003a.POST_REVIEW_SOURCE_EXCLUSIONSat the base, master, SM1 and the merge: 185 entries plus master's 4 and SM1's 5 give the merge's 194, with no duplicates, both orders kept, and the script equal to the test's tuple.axiom: n/a: projection mechanism with invented-data tests only; no statutory rule is encoded
🤖 Generated with Claude Code