M4 disability gate flip: lock ratified 2026-07-12 (ceremony record inside)#159
Conversation
Add gate_m4 (the M4 DI disability gate) as a NEW LOCKED top-level gate (unlike gate_2b/2c, it had no pre-existing unlocked stub). The full lock ceremony ran on PR #153 (floor runs/m4_gate_floors_v1.json): round-1 AMEND BEFORE LOCK (comment 4950447491, findings 1-6 / fixes A-F) -> fixes (comment 4950571161, 05d8292 + merge 45bbabe) -> verification AMEND metadata-only, the PR body (comment 4950648191) -> body amendment executed (comment 4950660426) -> ratifying squash merge 0fa4a29, under the standing campaign directive of 2026-07-07. gates.yaml gate_m4 (kind anchor_based): the 12-cell surface (8 internal mixed-k -- flow incidence/recovery @k=3 + prevalence.50-59 STOCK @k=4 -- + 4 concept-bridged anchor cells at the pinned >=3 sigma margin), tolerances machine-derived as round(floor mean + k*sd, 3) from the FROZEN floor and capped at ln(1.5), the 24 report-only cells (all tolerance_above_t_max), the K=20 mean-over-draws protocol (5200+k) + fresh_run schema [20,8,5], the k_selection rule (k=2 flow OC 0.2901 / k=3 flow OC 0.9717 / stock k=4), the in-repo sha-pinned di_asr_2023 anchor (reported, never gated), the ceremony_record (four comment ids + ratified-by-merge 0fa4a29 + delegated authority) and the 2026-07-12-m4-gate-lock history entry. ZERO threshold movement vs the ratified floor: the frozen artifact is READ, never rewritten. The five verification flip-time notes are implemented. Locked-hot bindings extend tests/test_gates_derivations.py (21 tests: tolerance derivations, 12/24 partition set-equality, OC 0.9408/0.9689 recompute, mixed-k + k_selection, anchor margins + epsilon-tilt failure, protocol equality, D1 SUBSET master-compare, history). The floor's own gates.yaml guard (test_m4_gate_derivations.py) flips to assert gate_m4 locked. The legacy manifest's contract_revision + gates.yaml entry track the flip via --transition (41 frozen entries byte-identical). Tier manifest artifact 744 -> 765 (CI-equivalent collection, openpyxl present), total 2,422. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Flip-fidelity referee: M4 disability gate lock (gate_m4 fresh insert)Verdict: AMEND BEFORE MERGE — one finding, one sentence, contract-prose only. Every number is faithful.Zero threshold movement verified end-to-end: the frozen floor is byte-identical to master, every committed value recomputes exactly — from the floor's raw per-seed vectors AND from raw PSID with independent implementations — the fresh insert touches nothing else in the contract, the FindingsFinding 1 (AMEND):
|
| cell | person-constant rate | frozen rate | |ln ratio| | share of its tolerance |
|---|---|---|---|---|
| incidence.40-49|f | 0.017270 | 0.020175 | 0.155 | 43% of 0.358 |
| recovery.50-59|f | 0.313627 | 0.276139 | 0.127 | 32% of 0.400 |
| prevalence.50-59|f | 0.059377 | 0.070178 | 0.167 | 45% of 0.371 |
| prevalence.50-59|m | 0.064509 | 0.069352 | 0.072 | 19% of 0.387 |
(remaining four: 0.095/0.101/0.016/0.053 — all nonzero; conversion-exit anchor shares also move, 0.7085→0.7041 (f) / 0.8587→0.8375 (m).)
Why it matters: the block's own closing line — "The weighting is load-bearing, so it is pinned here, not inherited implicitly" — is the point. A fresh-run scorer implementing rbar/rate_a from the locked contract text would build a statistic displaced by up to ~45% of a whole tolerance. The floor and foundation artifacts carry the correct definition, so the contract contradicts its own frozen evidence; description_claims_exactly_the_scored_surface (which gate_m4 itself invokes) is the standing rule this violates. The error is flip-authored: the ratified floor has no governance block and never claims person-constant weighting (its only "person-constant" is sex); the ratified stub proposal says only "the weighted per-interval PSID rate". 2a/2b/2c pin the person-constant most-recent-positive weight (e.g. the marriage histories' source file carries no per-wave weight — transitions.py attaches one); the employment-status panel carries a weight at every wave and the M4 builder uses it at w — "mirrors" holds for the rule-form (weighted-only, no unweighted gate, pinned in-block), not the weight construction.
Required fix (one sentence, no threshold movement, no floor rewrite, no sibling edit, breaks no binding — no gate_m4 test pins this text; the most-recent bindings at tests/test_gates_derivations.py:1009/2708 are 2a/2b's own, where person-constant is correct): reword to the foundation's definition, e.g.: "Every gated statistic is weighted by the start-wave (wave-w) cross-sectional individual PSID weight carried on each person-year / transition pair (the m4_disability_v1 hazard rule; weight > 0 filter at read); there is NO unweighted gated statistic; the unweighted counts (n_events / n_at_risk) are committed alongside. Mirrors tranche 2a/2b/2c in form (weighted-only, load-bearing, pinned here), not in construction: those retrospective sources carry no wave weight and use the person-constant most-recent-positive weight."
Finding 2 (non-blocking): precedent_oc_band's gate_2c entry is a p_seed among p_gates
k_selection.precedent_oc_band: { gate_2a: 0.9685, gate_2b: 0.9678, gate_2c: 0.9641 }. From the locked sibling blocks: 2a p_gate_pass_4_of_5: 0.9685 (p_seed 0.9404), 2b p_gate_pass_4_of_5: 0.9678 (p_seed 0.9397), but 2c commits p_seed_pass: 0.9641 / p_gate_pass_4_of_5: 0.988 (27 cells). So the band's 2c entry is a seed-level OC beside two gate-level OCs. On either level-consistent axis, m4 sits above 2a/2b and below 2c: p_gate 0.9689 vs {0.9685, 0.9678, 0.988}; p_seed 0.9408 vs {0.9404, 0.9397, 0.9641}. The blanket "at or above the 2a/2b/2c precedent band" (flip-note 2's wording) is exact only under the committed mixed-level composition.
Why non-blocking: the band was committed in the ratified frozen floor (k_selection.precedent_oc_band, identical values) — the flip copies it verbatim, as it must (the binding asserts yaml == floor), and this exact comparison was endorsed through both ceremony rounds (round-1: "k=3 … clears precedent"; verification note 2 restated the band as 0.9641–0.9685). No operative rule rides on it: no candidate verdict, tolerance, or partition uses the band, and the k=3 flow choice is forced independently (k=2 flow OC 0.2901 unusable, k=4 empties the flow surface, k∈[2,3] is the pre-registered range). Recommendation: while amending for finding 1, add one clause to the two oc_vs_precedent notes recording 2c's level ("2c's 0.9641 is its p_seed; its p_gate is 0.988; on a level-consistent basis the OC clears 2a/2b and sits below 2c") — an annotation beside the bound values, safe under no_self_rescue (no gate_m4 candidate run exists). Alternatively defer to a future floor amendment note; either way the public record now carries it.
Observation 3 (non-blocking, for the record)
(a) The history entry's proposed: 2026-07-12 prose date is unbound (mutating it alone passes the suite); the load-bearing date in the entry id is bound (mutation caught). Same class as the prose-pin caveat the verification round accepted. (b) The anchor half_split_floor blocks commit summary stats (mean/sd/min/max/n_seeds), not the 100 per-seed vectors the internal cells carry — a property of the frozen artifact ratified at #153, not of this flip; the committed margins recompute exactly from the committed gap/sd, and my raw-PSID seed replication confirms the split machinery.
Verification record (all recomputed independently)
1. Threshold fidelity — CLEAN. runs/m4_gate_floors_v1.json byte-identical to master (sha256 185d8182…, empty git diff). All 32 cells' mean/sd/realized_sigma/min/max recompute from the 100 raw per-seed values (≤1e-12). Every gated tolerance recomputes as round(mean + k·sd, 3) at the pre-registered mixed k — 6 flow@3: 0.358/0.334/0.354/0.400/0.332/0.400; 2 stock@4: 0.371/0.387 — all == yaml == floor draft, all ≤ ln(1.5). Partition rebuilt from scratch (defined-100 + ≥20 events + cap at family k): exactly the committed 12/24; machine reasons all 24 tolerance_above_t_max, zero below_20_events (min events over all 32 cells = 59), conversion cells demote at 0.596/0.611 > ln(1.5) (finding-1 pin); the withdrawn level_bridged_via_anchor_shape appears nowhere. OC recomputes: p_seed 0.940823 → 0.9408, p_gate 0.968944 → 0.9689 (per-cell probs all match). Stock sigma-units 3.2246/3.1231 → 3.225/3.123 (flip-note 4 exact). k_selection: uniform sensitivity 21/12/2 recomputed; k=2 flow 12 cells OC 0.2901; k=3 flow 6 cells OC 0.9717; k=4 leaves exactly the two prevalence.50-59 stock cells; option-(i) uniform-k3 12 cells OC 0.9008 < band bottom. Anchor margins recompute from committed gap/sd: 6.099 / 5.298 / 4.797 / 12.806σ, all ≥ 3; the ≥3σ rule is pinned candidate-side with 4-of-5 conjunction; ε-tilt reproduces 0.0917 / 0.0912 ≪ 3 (passes bare ordinal, fails pinned margin — the floor's builder-computed row matches). T19 band shares (f: 0.011/0.051/0.137/0.350/0.451; m: 0.016/0.061/0.133/0.333/0.457) and the T50 dominance constant 455,267/(455,267+99,721) = 0.8203186375200905 recompute from the sha-pinned tables.json (sha matches disk, the yaml pin, and the floor's own pin; provenance.md sha matches; n_bytes 26356). PSID side (.venv-gate, own implementations): panel 41,345 / 284,932 / 227,579 exact; all 32 reference cells exact; anchor gaps/shares and exit counts 289/182, 273/231 exact; seeds 0-2 half-splits exact on all 8 gated cells.
2. Fresh-insert integrity — CLEAN. Structural yaml-path diff vs origin/master: the only added path in the whole document is /gates/gate_m4 (history nested inside it); zero removed, zero changed paths; gate_1, gate_2 (2a thresholds + gate_2b + gate_2c), gate_3, and every non-gates top-level key deep-equal to master. D1 SUBSET guard: passes on the branch; passes in the simulated red-window post-merge state (origin/master := flip content — added == set() branch exercised); and correctly fails in the stale-branch red window (simulated master with an extra gate → removed != set()), forcing the documented reconciliation.
3. Ceremony record — CLEAN. All four comments re-fetched from GitHub: 4950447491 (07:57:21Z) "Round-1 adversarial referee … Verdict: AMEND BEFORE LOCK", findings 1-6 with required fixes A-F verbatim (finding 1 BLOCKER = the invalid level_bridged_via_anchor_shape family drop; fix A names the computed hybrid flow@3 + prevalence.50-59@4 at OC 0.9689 — round-1 endorsed exactly the adopted surface); 4950571161 (08:45:14Z) fixes round, commits 05d8292 + master merge 45bbabe (both real on #153's branch, plus 88756c9 for the 2,321 recount), mixed-k remedy, 5200+k VERBATIM, [20,8,5] schema, k=2 OC 0.2901, ε-tilt 0.0917/0.0912, "3.23/3.12" 2dp renderings; 4950648191 (09:14:25Z) "AMEND BEFORE LOCK — one amendment, metadata-only: the PR body. Every committed object verifies exactly", nine-row mutation table all caught, five flip-time notes; 4950660426 (09:19:01Z) amendment executed, tier recount 2,321, ratifying under the standing directive. 0fa4a29 confirmed as #153's squash mergeCommit (merged 09:19:05Z, MERGED, base master). Five flip notes each implemented at the claimed location: (1) tier files re-refreshed — verified by live collection both sides (below); (2) "at or above" wording in both oc_vs_precedent notes, 0.9689 − 0.9685 = 4e-4 recomputed (see finding 2 for the band-level caveat); (3) gate_rule separation — see next paragraph; (4) sigma_units_note carries 3.225/3.123 = the comments' 2dp numbers; (5) no bootstrap number committed anywhere in gate_m4 (the only gates.yaml bootstrap outside note-5's own text is gate_2c's pre-existing block, deep-equal to master).
Flip-note 3, adversarially re-tested. I reconstructed the verifier's sparse-exit two-readings candidate against the new text: simulated FRA-window exits ≈ a handful, all→retired, share 1.0, margin 0.5 ≥ 3σ (3σ = 0.130 f / 0.084 m) — under the frozen floor's old one-sentence gate_rule ("candidate … + holds on all 100 halves + ≥ 20 exits") a literal reading fails it for exit count; under the flip's candidate_condition ("This is the ONLY thing a candidate must satisfy") it passes the anchor with no second reading, evidence_time_conditions explicitly de-voices the 100-halves and ≥20-exit facts to floor-build time ("NOT a candidate-side exit-count floor"), and the catch is pinned where it actually lives: all-retire ⇒ zero return-to-work ⇒ recovery.60-66 rbar = 0 ⇒ |ln| = ∞ > 0.332/0.400 (internal fail), or an empty simulated denominator ⇒ run invalidated by the pre-specified undefined_draw_rule. The degenerate_candidates.rows table pins the same, and the converse (return-to-work-dominant, share 0.45) remains the anchor's unique catch. Ambiguity closed.
4. Manifest --transition — CLEAN. Diff confined to contract_revision 890aa394… → b1a81b02… (verified = the actual gates.yaml blob ids at master/HEAD) and the gates.yaml entry sha256 3990e15a… → e5edf668… / n_bytes 168354 → 216748 (both recomputed by me from git content); originating_commit unchanged (84a6721b…); the other 40 of 41 entries byte-identical; generated_at_commit unchanged. Parent-match is real: HEAD^ == origin/master (d13c3a3), the parent manifest's values equal the parent's actual gates.yaml (recomputed), and a negative test (parent whose gates.yaml moved without its manifest) raises "Parent manifest does not match parent gates.yaml". Idempotent: two --transition reruns in the worktree produce zero diff, clean tree.
5. Bindings discriminate — CLEAN. The 21+1 new tests (21 test_gate_m4_* artifact-tier bindings + the flipped floor-guard test_no_gate_mutated_and_gates_yaml_gate_m4_is_locked) pass: 22/22. Mutation table (each mutation applied to gates.yaml, suite selection rerun, file restored; baseline re-green after):
| mutation | result |
|---|---|
tolerance incidence.40-49|f 0.358 → 0.359 |
2 failed (tolerance binding + OC recompute) |
partition cell recovery.50-59|male → …|malX |
2 failed (partition set-equality + report reasons) |
k_selection k2_flow_oc 0.2901 → 0.2902 |
1 failed |
anchor sha pin tables.json …aa36 → …aa37 |
1 failed |
| history id date 2026-07-12 → 2026-07-13 | 1 failed |
probe: chosen_stock_k 4 → 3 |
1 failed |
| probe: anchor margin 6.099 → 6.098 | 1 failed |
probe: locked true → false |
2 failed |
probe: OC p_seed_pass 0.9408 → 0.9407 |
2 failed |
| probe: report-only cell added to gated tolerances | 4 failed |
probe: history proposed: date only |
not caught (observation 3a; id date is bound) |
6. Hygiene — CLEAN. Diff = exactly the six claimed files (gates.yaml +789/−0; manifest 3/3; tier_counts 1/1; README-tiers 2/2; test_gates_derivations +520; test_m4_gate_derivations 18/5). Tier manifest vs CI-equivalent live collection (openpyxl present): branch 199/765/782/520/156 = 2,422 exact; master-at-flip 199/744/782/520/156 = 2,401 exact — the +21 is precisely the new artifact-tier bindings. Always-runnable tiers run inline: 924 passed, 40 skipped (exact match to the PR claim; the D1 guard PASSED, not skipped). Fresh at review time: gh pr checks exit 0 (build/lint/pytest 3.11 + 3.13/Vercel pass; deploy skipped), mergeable: MERGEABLE, mergeStateStatus: CLEAN — the W1 flip has not merged, no both-blocks reconciliation needed yet (if it lands first, the D1 guard and gates.yaml will conflict by design; the documented both-blocks merge applies).
Amend scope: finding 1's one-sentence weight_definition rewrite (plus, optionally, finding 2's one-clause annotation) — then this flip is merge-clean under the same bar #122/#130 set. No threshold, artifact, test, or manifest change is needed; everything numerical is already exact.
Referee basis: fresh worktree at 14d2f37; every check recomputed with independent implementations (own pooling/OC/margins/splitter/manifest arithmetic; raw-PSID reproduction in the gate env; structural yaml diff; mutation battery with per-step restore and re-green baseline). No repo state modified.
… referee finding 1); annotate precedent_oc_band Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Referee finding 1 executed: gate_m4 weight_definition corrected to the ratified start-wave (wave-w) cross-sectional weight (the frozen floor's own foundation and committed numbers), with the deviation from the 2a/2b/2c person-constant convention stated explicitly; precedent_oc_band annotated per the non-blocking note; manifest transition rerun for the new contract revision (all bindings + manifest tests green, CI explicitly re-verified). Merging under the AMEND→fixed path of the ceremony. |
…by its own evidence (#166) Carry the paper through every merged wave since the gate-2b pass (#149). Add the gate-2c candidate ladder and its independently verified pass (#155/#157, verification 4950580430): two candidates — the shortest of the family ladders — candidate 1 failing 1/5 with the assortative diagonal held 35/35 on the first attempt and the gate bound entirely on the earnings-blind first-marriage cells the registration had named in advance, candidate 2's one marginal-preserving modifier (byte-carry 2,500 cells at 0.0) passing 4/5. With it, every gate-2 tranche is passed: all four demographic gates locked AND passed (memo 4950584695). Add the disability gate (M4): floors #153 (round-1 restoring the occupancy- stock teeth via mixed-k), lock #159 (the start-wave weight-definition fix), candidate 1 passing 5/5 (#161) — the program's first five-of-five — verified with a both-constructions gap adjudication (4951142927), the estimand always the PSID self-report, never an SSA DI level (seven concept deltas). Add the transport gate (W1): design #151, floors #154 with the owned #158 tier-manifest process violation, lock #160, candidate 1 failing 0/5 (#162, C2 swap realised / C1 non-reversal robust / earnings not degenerate), forensics 1 (#163, the entry-state lever and the Q4 gate-design finding), and amendment 1 in full ceremony (#164/#165) — the program amending its own structurally-unpassable gate, all ten family-B cells demoted on committed evidence with anchors retained verbatim and the failed candidate left failed. This is the fourth recurring referee class: a gate can itself be wrong, and the same ceremony catches that too, after the lock. Add the interim benefit seam (#156: gross $41.35B -> net $36.02B, offsets enumerated, 4/4 expectations, engine-vs-transport gap 6e-8), stating the PolicyEngine-executes / Axiom-cross-validates division; and the deployment infrastructure (contract identity, env sidecars, a generic K=20 evaluator reproducing the three committed gate verdicts; the household candidate-9 registry port). Recompute the tally per the paper's conventions: forty-two registered runs across six gates (13/16/9/2/1/1), thirty-seven failures against five passes, six gates locked with FIVE ratified amendments (two gate 1, two gate 2, one transport), ten forensics rounds, six external-anchor replications, and fifty forecasts registered with forty-nine graded — the one open registration the transport gate's second candidate. Frozen sections byte-identical. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Flip
gate_m4(the M4 DI disability gate) live: this PR adds it togates.yamlas a NEW LOCKED top-level gate. Unlike gate_2b/2c (amendment-2 unlocked stubs flipped in place), gate_m4 had no pre-existing stub — the block is inserted fresh as locked. ZERO threshold movement: every value is READ from the ratified, frozen floorruns/m4_gate_floors_v1.json; the artifact is never rewritten.kind: anchor_based(gate-1 external-check style).Ceremony chain — ratified by merge of #153 (squash
0fa4a29)4950447491level_bridged_via_anchor_shapereason)495057116105d8292+ master merge45bbabe); computed mixed-k remedy; OC 0.9689 / p_seed 0.9408495064819149506604260fa4a29Surface — 12 gate-eligible (8 internal mixed-k + 4 anchor) + 24 report-only
Internal reproduction —
|ln(rbar_candidate / r_PSID)| <= round(floor mean + k·sd, 3), capped atln(1.5), pre-registered MIXED k (FLOW=3 / STOCK=4):Anchor — concept-bridged SHAPE/DOMINANCE, candidate per-seed invariant with margin
>= MARGIN_K=3 × real half-split sd(the MARGIN reading, not bare ordinal):24 report-only cells, all machine reason
tolerance_above_t_max(power; nobelow_20_events). Faithful OC p_seed 0.9408 / p_gate 0.9689, at/above the 2a/2b/2c precedent band top (0.9685). k_selection: k=2 flow OC 0.2901 (unusable) / k=3 flow OC 0.9717 / stock k=4 the sole k a prevalence cell survives; option-(i) uniform-k3 OC 0.9008.Flip-time notes (5, from verification
4950648191) — all implementedtier_counts.json/README-tiers.mdre-refreshed against master-at-flip by CI-equivalent live collection (openpyxl present, per #158)gate_ruleseparates the candidate-voiced condition (its own ≥3σ margin) from the evidence-time cell conditions ("holds on all 100 real halves", "≥20 exits"); the sparse-exit all-retire candidate is pinned as caught INTERNALLY (recovery.60-66), no candidate-side exit floor imposedLegacy manifest
--transitionRegenerated via
scripts/build_legacy_manifest.py --transition(the #135 mode, not the internals workaround). Parent-match validated againstHEAD^(origin/master); onlycontract_revision(890aa39→b1a81b0) and thegates.yamlentry (sha + n_bytes 168354 → 216748) move — the 40 frozen legacy entries stay byte-identical (originating_commitunchanged).contract.pyartifact env sidecars were checked for and not added (Sol's contract is still only on the unmergedcontract-identitybranch — not on master).Bindings & tiers
Locked-hot bindings extend
tests/test_gates_derivations.py(21 new tests, artifact tier): tolerance derivations from the frozen floor, 12/24 partition set-equality, OC 0.9408/0.9689 recompute, mixed-k +k_selectionbinding, anchor-margin recompute + ε-tilt failure pin (0.0917/0.0912 ≪ 3), protocol equality with the ratified 5200+k estimator + schema [20,8,5], D1 SUBSET master-compare (gate_1/gate_2/gate_3 byte-identical to origin/master, gate_m4 the sole new key), history entry. The floor's own guard (test_m4_gate_derivations.py) flips to assert gate_m4 locked. Tier manifest artifact 744 → 765, total 2,401 → 2,422 (CI-equivalent collection).Always-runnable tiers (unit + artifact) green inline: 924 passed, 40 skipped. No locked sibling block touched.
🤖 Generated with Claude Code