Skip to content

Commit 1818784

Browse files
MaxGhenisclaude
andauthored
gate_m6 floors: temporal-holdout truth-side floors (v1 pause -> v2 redesign clears) (#172)
* gate_m6 floors: temporal-holdout truth-side floors + block draft (ceremony pending) Ceremony step 1 for the proposed gate_m6 (docs/design/m6_projection_engine.md, merged #170 at 1d83a22, VERIFIED comment 4953958949). TRUTH-SIDE only: no engine, no candidate, no scored projection anywhere in this lane. - scripts/build_m6_holdout_floors.py -> runs/m6_holdout_floors_v1.json (+env sidecar via artifacts.write_new): the PSID held-out truth (2015-2022) and its deployment-scale real-vs-real 100-seed half-split floor. T*=2014 realized at the 2015 interview (biennial odd-year waves); shock window 2020-2022 report-only on the dual axis (exogenous_shock_outside_model_class); symmetric presence-conditioning; F6 realized-start-wave weight held fixed; the household-ID + weight carriage rule (finding 13); household-disjoint (mortality/marital) vs person-disjoint (disability/earnings) splits with the person-vs-household width diagnostic; mixed-k tolerances round(mean+k*sd,3) capped ln(1.5), FLOW k=3; 85+ mortality demoted attrition_confounded_truth; autocorr lag5 report-only horizon_exceeds_holdout_span. - Surface: 17 gated (1 marital flow + 16 earnings moments), 88 report-only margins, 87 published shock diagnostics. OC-before-lock (both directions): combined faithful p_gate 0.8449 < the named 0.90 weak-power floor AND only 1 gated FLOW cell (< 4) -> the ceremony PAUSES for surface redesign rather than locking a near-vacuous gate. ceremony_may_proceed = false. - docs/design/gate_m6_block_draft.yaml: the full gates.gate_m6 block (locked: false, paused) string-bound to the artifact; gates.yaml is UNTOUCHED (the block lands in the later lock flip, after a gate_w1 amendment flip in flight). - tests/test_gate_m6_floors.py (artifact tier): 14 tests binding artifact<->block on every operative field, tolerance recompute from floor sigmas, partition roll-ups, OC recompute, presence/F6/split declarations, shock-window exclusion, and >=5 mutations caught. Tier recount (CI-equivalent): artifact 879 -> 893. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * gate_m6 floors v2: candidate-blind surface redesign clears the OC pause The v1 OC-before-lock check fired the §9 PAUSE (v1 frozen as the evidence, sha256 16c28d8c...): near-vacuous flow surface (1 gated flow cell) + combined p_gate 0.8449 < 0.90. Per the ceremony adjudication, two PINNED ladders -- candidate-blind BY CONSTRUCTION (only truth-side power arithmetic: floor sigmas, weaker-half event counts, v1 tolerance/sigma ratios) -- produce the redesigned surface. v1 is neither mutated nor rewritten. - scripts/build_m6_holdout_floors_v2.py -> runs/m6_holdout_floors_v2.json (+ sidecar, one-shot). COARSENING LADDER (flows): per transition type pool adjacent strata minimally (sex-pool -> age-pool), adopt the MINIMAL rung clearing tolerance <= ln(1.5) AND >= 20 weaker-half events; 85+ stays attrition report-only. first_marriage clears at age x sex (.18-29|female), divorce sex-pooled 18-44, disability incidence/recovery fully pooled (.20-66); mortality/widowhood/remarriage clear nothing at any rung (honest). EARNINGS DECOMPOUNDING LADDER: prune weakest-power-first (largest v1 tol/sigma first), stop at the FIRST combined p_gate >= 0.90, keep >= 1 per concept family -- 9 pruned, 7 retained (largest surface meeting the floor). - Redesigned surface: 11 gated (4 flow + 7 earnings). v2 OC p_seed 0.8921 / p_gate 0.9067 >= 0.90, 4 gated flow cells -> CLEARS both directions; ceremony_may_proceed = true. Split-width diagnostic re-checked at the coarsened granularity: household/person ratio 1.0122 (unbiased). Invariants held fixed: T*=2014 (no window extension -- separate adjudication), lag-5 report-only, FLOW k=3, ln(1.5) cap, 4-of-5 conjunction, 0.90 floor. - docs/design/m6_projection_engine.md: new §4.10 (post-pause redesign: the power derivation + the v1->v2 registry, citing v1's sha as the pause evidence) + §10 outcome. docs/design/gate_m6_block_draft.yaml updated to v2 (locked: false, cleared, ready for the lock flip); gates.yaml UNTOUCHED. - tests/test_gate_m6_floors.py: v1 frozen-evidence bindings STAY; added v2 bindings (ladders, 11-cell registry, tolerance + OC recompute, v1 pause reference), >= 8 mutations caught incl. ladder-order drift + p_gate drift. Tier recount (CI-equivalent): artifact 893 -> 895. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * gate_m6 floors v3: complete the marital ladder enumeration (referee amendments 1-4) Referee comment 4958425437 ruled AMEND x4 then PROCEED TO LOCK. The four amendments, on top of the frozen v1 (pause) and v2 (cleared, but incomplete enumeration) artifacts: 1. not_certified declaration (amendment 1): the block draft carries, at headline prominence next to `covers`, an explicit not_certified list naming mortality drift FIRST (then widowhood, the 2020-22 shock window, entrants, autocorr lag-5, the 2100 forward-projection extrapolation, stock margins, the remarriage 65+ tail, in-sample spec selection). Mirrored at the close of design 4.10 + a supersession pointer in 4.5. 2. Floors v3 (amendment 2, adjudicated BUILD v3): the marital coarsening ladder now enumerates the asymmetric age-2 rung ([18-64],[65+]) the mortality ladder already used but v2 omitted -- the single rung where remarriage clears (remarriage.18-64, tol 0.403, sigma 0.1538, 143 weaker-half events, 100/100 seeds), reproduced independently from the frozen v1. The 5th gated flow cell forces one further pinned earnings prune (earn_dlog_mean.older: 0.8944 -> 0.9087), landing at 11 gated (5 flow + 6 earnings), p_seed 0.8934 / p_gate 0.9087, flows-only 0.9822. runs/m6_holdout_floors_v3.json (sha e931c886...) via write_new one-shot. v1 (16c28d8c) and v2 (3f273d47) stay byte-frozen as lineage. Widowhood still clears nothing (best 0.474). design 4.10 records the v2->v3 correction; the block binds the v3 registry; OC recomputed. 3. SSA/NCHS life-table anchor (amendment 3): the block's deliverables mirror names a report-only family-B SSA/NCHS mortality anchor for the holdout window, with the NCHS-input circularity disclosed, required before the lock flip can claim M7-seeding support. |ln|-gating external levels stays rejected (referee ruling). 4. Bind fit_holdout year pins (amendment 4, the referee's missed mutation): the block's T*/holdout/earnings-wave/shock/scoring pins are string-bound to the v3 artifact design_pins, so a year-pin mutation ([2016,2018]->[2016,2020]) now fails a test. Minor referee observations folded in: restored v1's third vacuity guard to the clears conjunction (n_at_cap=0, no effect, registry-faithful); noted incidence.20-66 gates at 99.6% of cap; cited the redesign + v3 adjudications in 4.10 for the public record. Tests: v1 frozen + v2 frozen-lineage + v3 bindings + ladder-completeness + year pins + not_certified + SSA/NCHS anchor; 16 mutations caught incl. the referee's missed year-pin. Full always-runnable suite green: 1112 passed / 41 skipped. Tier recount (CI-equivalent): artifact 921 -> 928 (+7). gates.yaml untouched; gate stays draft (locked: false). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent c3ed169 commit 1818784

14 files changed

Lines changed: 14731 additions & 4 deletions

docs/design/gate_m6_block_draft.yaml

Lines changed: 419 additions & 0 deletions
Large diffs are not rendered by default.

docs/design/m6_projection_engine.md

Lines changed: 164 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,16 @@ Four observable classes on the post-`T*`, post-demotion surface (§4.1 shock, §
579579
attrition). Cell naming follows the `gate_w1` family-A convention
580580
(`observable.stratum`).
581581

582+
> **Superseded by §4.10 (v3).** This section describes the *design-time candidate*
583+
> surface at age-band × sex granularity, and reads as if survival curves and all
584+
> four marital transitions were gated. They are **not**. The OC-before-lock pause
585+
> and the candidate-blind coarsening/decompounding ladders (§4.10) demoted this
586+
> surface to the actually-lockable one: **mortality gates nothing** (see
587+
> `not_certified`, mortality drift first); the marital surface gates only
588+
> `first_marriage.18-29|female`, `divorce.18-44`, and `remarriage.18-64` (the
589+
> completed asymmetric-age-2 rung); **widowhood gates nothing**; earnings is
590+
> decompounded to 6 cells. Read §4.10 for the binding registry.
591+
582592
- **Survival curves (mortality flow).** Cell = the realized death hazard
583593
`q(band, sex)` = deaths ÷ start-of-interval exposure among presence-conditioned
584594
holdout person-years (§4.4), per (age-band × sex) over bands {…, 55-64, 65-74,
@@ -693,6 +703,142 @@ search whose *structure* was chosen on the full window," and the 2100 production
693703
projection is report-only extrapolation beyond the validated window (decision 10,
694704
§7).
695705

706+
### 4.10 Post-pause surface redesign — the power-derivation and the v1→v2→v3 registry
707+
708+
The floors ceremony's step-1 OC-before-lock check (§4.9) **fired the §9 pause**.
709+
The frozen v1 floor artifact `runs/m6_holdout_floors_v1.json`
710+
(sha256 `16c28d8cd9095e5233ab224c659c8d5b9eb1621099e2524455a3a8ff8e88d318`, the
711+
**pause evidence**) priced the §4.5 age-band × sex surface and found it does not
712+
support a lock in **either** direction: the certifiable **flow** surface was
713+
near-vacuous (a single gated flow cell, `first_marriage.18-29|female`), because an
714+
8-year biennial holdout at that granularity yields ~0.1 half-split log-ratio noise
715+
per flow cell, so at the design-pinned FLOW `k=3` most flow tolerances land just
716+
over the `ln(1.5)` cap; and the combined faithful `p_gate` was **0.8449 < 0.90**
717+
(the named weak-power floor), because 16 earnings-moment cells compound under the
718+
4-of-5 conjunction. The pause is the correct outcome, not a defect: it is the W1
719+
lesson (identify an unlockable surface **before** locking) applied to the power of
720+
the surviving surface.
721+
722+
The adjudicated redesign is executed by two **candidate-blind** ladders
723+
(`scripts/build_m6_holdout_floors_v2.py``runs/m6_holdout_floors_v2.json`). They
724+
are candidate-blind *by construction*: every choice is a function only of
725+
truth-side power arithmetic — floor sigmas, weaker-half event counts, and v1
726+
`tolerance/σ` ratios — and never references an engine, a candidate, or what a model
727+
would find easy or hard.
728+
729+
- **Coarsening ladder (flows).** Per transition type, pool **adjacent** strata
730+
minimally in the pinned order *sex-pool → age-pool-adjacent*, climbing until a
731+
cell's tolerance `≤ ln(1.5)` **and** `≥ 20` weaker-half events; adopt the
732+
**minimal** rung with `≥ 1` clearing cell uniformly for that transition type.
733+
Mortality `85+` stays report-only (`attrition_confounded_truth`) at every rung.
734+
Outcome (v2): `first_marriage` clears already at age×sex (`.18-29|female`);
735+
`divorce` clears sex-pooled at ages `18-44`; disability `incidence`/`recovery`
736+
clear only fully pooled (`.20-66`); **mortality, `widowhood`, and — in v2 —
737+
`remarriage` cleared nothing at the rungs v2 enumerated.** The v2 gloss "too thin
738+
for them even pooled" is corrected at v3 for `remarriage` (see the v2→v3
739+
correction below): it was true of the *enumerated rungs*, not of the data.
740+
- **Earnings decompounding ladder.** Prune gated earnings cells
741+
**weakest-power-first** (largest v1 `tolerance/σ` first), recomputing the
742+
combined `p_gate` after each prune, stopping at the **first** `p_gate ≥ 0.90`,
743+
never below `≥ 1` gated cell per concept family (log-quantiles, dispersion,
744+
mobility, zero-rate, autocorrelation, change-mean). This retains the **largest**
745+
surface meeting the power floor under the ladder — *maximum falsifiability
746+
subject to power*. Outcome: 9 of 16 earnings cells pruned, 7 retained (one per
747+
concept family, plus a second `change_mean`).
748+
749+
**As-committed v2 gated registry: 11 cells — 4 flow + 7 earnings** (frozen,
750+
`runs/m6_holdout_floors_v2.json`, sha256 `3f273d47…`):
751+
752+
| Family | Gated cells | Adopted rung |
753+
|---|---|---|
754+
| marital | `first_marriage.18-29\|female`, `divorce.18-44` | age×sex; sex-pooled age `18-44` |
755+
| disability | `incidence.20-66`, `recovery.20-66` | sex-pooled, fully age-pooled |
756+
| earnings | `earn_p10.prime`, `earn_zero_rate.older`, `earn_dlog_sd.older`, `earn_mob_h1_diag`, `earn_autocorr_lag2`, `earn_dlog_mean.prime`, `earn_dlog_mean.older` | v1 person-disjoint floor (unchanged), decompounded |
757+
758+
The v2 faithful-candidate OC on this surface is **`p_seed 0.8921` / `p_gate 0.9067`**
759+
(flows-only `0.9882`, earnings-only `0.9518`), and the certifiable flow surface
760+
carries **4** gated cells. Every number is arithmetically clean and independently
761+
reproduced.
762+
763+
#### The v2→v3 correction — completing the marital ladder's rung enumeration
764+
765+
**v2's marital ladder enumeration was incomplete.** The adversarial referee
766+
(comment `4958425437`, amendment 2) rebuilt both artifacts bit-identically from
767+
PSID and swept **every** contiguous adjacent-band pooling with the ceremony's own
768+
machinery. Mortality and widowhood are pooling-invariant (nothing admissible
769+
clears anywhere — mortality best `~0.462`, widowhood best `~0.474`). **Remarriage
770+
is not.** It clears at exactly one rung the v2 marital ladder never enumerated: the
771+
**asymmetric age-2 partition** `[18-64],[65+]``remarriage.18-64` at tolerance
772+
**`0.403`** (`σ 0.1538`, 143 weaker-half events, 100/100 seeds, household-disjoint).
773+
So the v2 gloss "too thin for remarriage even pooled" was true only of the
774+
*enumerated* rungs, not of the data. Critically, this is **not a new design
775+
choice**: the asymmetric "merge the lower bands wide, isolate the elderly tail"
776+
shape is one the **mortality ladder itself already used** (its
777+
`[25-54],[55-74],[75-84]` and `[25-64],[65-84]` rungs). Completing the marital
778+
ladder to enumerate the same rung shapes — uniformly per transition type, as
779+
originally pinned — is fidelity to the adjudicated candidate-blind criteria, not a
780+
second design pass. This is the **orchestrator's v3 adjudication** of the referee's
781+
amendment 2.
782+
783+
The completion is a single machinery change (`scripts/build_m6_holdout_floors_v3.py`,
784+
`MARITAL_LADDER` gains `sex_pooled_age2p = [18-64],[65+]` after the symmetric
785+
age-2 rung; ordered by coarseness, since the symmetric split's widest merged group
786+
spans 2 raw bands while the elderly-isolating split's spans 3). Under the same
787+
minimal-rung rule it adopts, uniformly: `first_marriage → age×sex` (unchanged),
788+
`divorce → sex-pooled age 18-44` (unchanged), **`remarriage → sex-pooled age 18-64`
789+
(new)**, `widowhood → nothing` (now recorded as evaluated at the asymmetric rung
790+
too), `death → nothing`. The extra 5th gated flow cell lowers the combined
791+
`p_gate` at every earnings-prune step, so the **same pinned weakest-first earnings
792+
ladder is forced exactly one further prune** (`earn_dlog_mean.older`, the next
793+
non-last-in-concept cell: `0.8944 → 0.9087`), retaining 6 earnings cells (still one
794+
per concept family).
795+
796+
**v3 gated registry: 11 cells — 5 flow + 6 earnings** (`runs/m6_holdout_floors_v3.json`,
797+
sha256 `e931c88622fad84e8f8b2cf18940cbe27da1c93e0d009dfbaa3d6c6cae050c77`; v1
798+
`16c28d8c…` and v2 `3f273d47…` stay **frozen** as lineage):
799+
800+
| Family | Gated cells | Adopted rung |
801+
|---|---|---|
802+
| marital | `first_marriage.18-29\|female`, `divorce.18-44`, `remarriage.18-64` | age×sex; sex-pooled `18-44`; sex-pooled `18-64` (asymmetric age-2) |
803+
| disability | `incidence.20-66`, `recovery.20-66` | sex-pooled, fully age-pooled |
804+
| earnings | `earn_p10.prime`, `earn_zero_rate.older`, `earn_dlog_sd.older`, `earn_mob_h1_diag`, `earn_autocorr_lag2`, `earn_dlog_mean.prime` | v1 person-disjoint floor (unchanged), decompounded |
805+
806+
The v3 faithful-candidate OC is **`p_seed 0.8934` / `p_gate 0.9087`** (flows-only
807+
`0.9822`, earnings-only `0.9626`); the certifiable flow surface now carries **5**
808+
gated cells across **three** marital transition types plus both disability flows —
809+
a strictly larger, more falsifiable flow surface than v2, on the ceremony's own
810+
maximum-falsifiability-subject-to-power principle. The completion held every
811+
invariant fixed: `T* = 2014` (**no window extension** this round — that is a
812+
separate adjudication re-deriving decisions 1–2), lag-5 report-only, FLOW `k = 3`,
813+
the `ln(1.5)` cap, the 4-of-5 conjunction, and the `0.90` floor. `incidence.20-66`
814+
is the weakest gated flow cell (`0.404`, 99.6% of the `ln(1.5)` cap); no gated
815+
tolerance sits at its cap, so the restored third vacuity guard (not all tolerances
816+
capped) is satisfied.
817+
818+
**What v3 still certifies nothing about** (the `not_certified` declaration, block
819+
draft, at the same prominence as the PASS claim — referee amendment 1): **mortality
820+
drift first** (no admissible pooling clears the `25-84` surface even fully pooled,
821+
best `~0.472`; `85+` is `attrition_confounded_truth`; `85+`-inclusive pools clear on
822+
power but ~27% of their events are the confounded stratum, so pooling dilutes
823+
rather than cures), then **widowhood** (best `~0.474`), the **2020–2022 shock
824+
window**, **entrants / open panel**, **autocorrelation lag-5**, the **2100
825+
forward-projection extrapolation**, all **stock margins**, and the remarriage `65+`
826+
tail. Mortality is therefore seeded into M7 **report-only-with-anchor**, never as
827+
certified drift: the block names the **SSA/NCHS life-table mortality anchor** as a
828+
required report-only family-B deliverable before the lock flip can claim any
829+
M7-seeding support (`|ln|`-gating external mortality *levels* stays rejected — the
830+
W1 concept-bridge lesson; referee ruling in comment `4958425437`). The circularity
831+
that the engine's mortality input is itself NCHS×PSID-band anchored is disclosed
832+
with the anchor (the M2 `calibration_disclosure` lesson): agreement validates the
833+
alignment path, not independent drift.
834+
835+
*Public-record citations at flip time:* the **candidate-blind surface-redesign
836+
adjudication** (the two pinned ladders) lives in this §4.10 and the PR #172 body;
837+
the **v3 adjudication** (complete the pinned ladder's enumeration) is referee
838+
comment `4958425437` amendment 2, adopted by the ceremony orchestrator. Both must
839+
be cited on the public record when the lock flip lands, so the flip carries the
840+
adjudication text, not only its result.
841+
696842
## 5. PolicyEngine integration — the W2 pattern per projection year
697843

698844
The seam is the ADR-0001 W2 pattern applied once per projected calendar year. pe-us
@@ -833,7 +979,19 @@ The ceremony that seeds from this revised §4 must produce, before locking:
833979

834980
- **the floor artifact** `runs/m6_holdout_floors_v1.json` — presence-conditioned
835981
(§4.4), start-wave-weighted (§4.7, F6), correlation-respecting half-splits, floor
836-
seeds `0–99`, on the post-demotion surface (§4.1 shock, §4.4 attrition).
982+
seeds `0–99`, on the post-demotion surface (§4.1 shock, §4.4 attrition). v1 fired
983+
the pause; the candidate-blind ladders produced v2, and the completed marital
984+
ladder produced the binding **v3** artifact `runs/m6_holdout_floors_v3.json`
985+
(§4.10). v1 and v2 stay frozen as lineage.
986+
- **the SSA/NCHS life-table mortality anchor (referee amendment 3)** — a *named*
987+
report-only family-B deliverable: external SSA/NCHS published death hazards
988+
(age × sex) for the holdout and projection years, triangulated against the
989+
engine's projected hazards and published with the candidate run. Required before
990+
the lock flip can claim M7-seeding support, because mortality certifies nothing
991+
on the truth side (§4.10 `not_certified`). `|ln|`-gating external *levels* stays
992+
rejected (the W1 concept-bridge lesson); the NCHS×PSID-band input circularity is
993+
disclosed with the anchor (agreement validates the alignment path, not
994+
independent drift — the M2 `calibration_disclosure` lesson).
837995
- **the re-certification margin check (§2.6)** — candidate-9's household-composition
838996
output moments under injected-vs-internal marital state agree within a pre-named
839997
gate_m4-style margin; a floors-ceremony deliverable, not assumed here.
@@ -866,6 +1024,11 @@ lock ceremony.
8661024
"referee_round": "PR #170 comment 4953818376 (MAJOR REVISION)",
8671025
"adjudication": "issue #42 comment 4953722912",
8681026
"status": "design_draft",
1027+
"floors_ceremony_outcome": {
1028+
"step1_v1": "PAUSED (near-vacuous flow surface + p_gate 0.8449 < 0.90); evidence runs/m6_holdout_floors_v1.json sha256 16c28d8c...",
1029+
"redesign_v2": "candidate-blind coarsening + decompounding ladders (see 4.10); runs/m6_holdout_floors_v2.json; 11 gated (4 flow + 7 earnings), p_gate 0.9067 >= 0.90, ceremony may proceed",
1030+
"gates_yaml_still_untouched": true
1031+
},
8691032
"gates_yaml_untouched_by_this_document": true,
8701033
"fit_holdout": {
8711034
"boundary_T_star": 2014,

0 commit comments

Comments
 (0)