Repository navigation
Conversation
B0.2 freezes the source, exposure, access and power records for B3, B3L, B4, I's observational timing gate, B5-empirical RET, B6a, B6b and J, including J's joint estimands and limits for blinded ratification before B3 registers, and prices the design's still-unpriced items. This first commit sets out the deliverables, the separation from the B2 successor design and the order of work. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 21, 2026
Entrant initialization, which Track B's design section 3.3 left unpriced, is now one milestone row (OP8, 25-39 engineer-days, an estimate) with its data sources and what it delivers to each Track B milestone, so Track B's B0.2 audit (draft PR #554) can cite it. The former OP8 and OP9 merge into it with a new sub-part for starting states in Track B's schemas; later rows are renumbered. The economic schedule now assumes B0.2 freezes before a B2 successor passes, and section 6.4 adds the two restricted-files entries of 21 October. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n gates The dynamics coordinator made B0.2's exposure record the single registry of held-out years for every lane. The registry starts with the five prior uses verified in gates.yaml and b2.py (gate_m6, B2, gate_epuf_fill, gate_m4, gate_w1); B0.2's mechanical inventory adds the rest before any B0.2 record freezes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sources per gate (staged, missing, external candidates and their access), the exposure catalogue and every accidental exposure the lanes recorded, the per-gate requirements and J's candidate estimands, H's roster options, pricing of the design's still-unpriced items (entrant initialization cited from the open-population lane), what must be verified before the protocol relies on it, and the scope of protocol version 1 (structural counts on staged PSID). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erved holdout Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structural counts on the staged PSID for H's candidate rosters, B3's support at ages 62-69 with lag pairs, B3L's 2006-origin roster and later support, and the persons and households outside B2's evaluation units. Reads roster, age, relationship, weight, design and labor-income validity only; counts no dispositions, transitions or outcomes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t for counts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Committed counts from 1 to 9 become "<10", with complementary suppression; unsuppressed counts stay outside the repository. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
scripts/track_b_b0_2_counts.py implements protocol v1 (draft) as pinned: the block's SHA-256 is 94e22e3fff7b8ec541f87abe9890270a9893e0ec1653ce7b91fb0170b2732cb9. - Counts: the H rosters (R_FULL, R_B2, R_TA_PROXY), B3 support at ages 62-69 with lag-2 and lag-4 pairs, B3L's 2006 origin (R2006_FULL, D2006) and the units outside B2, by age band. - Disclosure (d1899): counts 1-9, and effective sizes on sets below ten, are written "<10"; complementary suppression repeats to a fixed point over every encoded total-and-parts relation, checked by exact rational elimination. The committed file holds suppressed values and a disclosure block only. The unsuppressed copy goes to a required --local-copy path outside the repository; both files are created exclusively. Built blind on invented frames by a Subfleet lane; no data was read and no count has been run. The protocol is not frozen: the Sol review and the freeze come before the one count run. Tests: 59 unit (81 passed with the 22 B0.1 count tests). Mutations: 10 of 10 killed. Black 26.5.1 (-l 79) and ruff clean. Tier counts: unit 9,958 -> 10,017. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…not the script's arrival The preamble said the protocol froze with the commit adding the count script, which be7d4f4 now matches. The freeze is instead a later commit that changes only the status line to FROZEN, after an independent review with no blocking finding. The pinned block is unchanged (94e22e3f...). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ld B0.2's work The coordinator's separation rule (2026-10-21) needs an exclusion inventory in the q6_exclusions form before any B0.2 count reaches master. docs/design/track_b_b0_2_exclusions.json lists every B0.2 file, whole: plan, landscape, protocol, count script and tests, the build record, and, ahead of their arrival, the counts file and the exposure inventory. scripts/track_b_b0_1_review_root.py now applies it as a second standing record, so every blinded review root excludes these paths whatever inventories a build names. tests/test_track_b_b0_2_exclusions.py pins the record's contents literally, requires every tracked file named track_b_b0_2_* to be listed (so a new one cannot reach master unlisted), and checks that a build removes them. The B2 outcome test's exact assertions now include the second record. Mutation checks, each restored: dropping the record from STANDING_EXCLUSIONS (2 failed); omitting the counts file (2 failed); a lines scope (1 failed); an unlisted tracked B0.2 file (1 failed). Tests: 10 passed with the B2 exclusion tests; 141 review-root tests passed. Black and ruff clean. Tier counts: unit 10,017 -> 10,021. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol's round-1 review (ec9eb48) found two complete-release recoveries of small cells and a missing-age defect, all needing block changes: - Known age is 1-125, the range the repository's readers accept (cohorts.age67._MAX_AGE_CODE); 0 and 999 are unknown age, in no band and not in R_TA_PROXY. Roster tables gain an unknown-age cell, so the bands and unknown age partition each roster. - The disclosure rule now coarsens counts at base B (0 exact, 1..B-1 as "<B", else the nearest multiple of B) and audits the release by integer programs over atoms, the classes of units with identical membership in every published set. Every atom and every published-set-minus-subset remainder of true size 1-9 must keep a feasible range at least 4 wide, with effective sizes entering as lower bounds on counts; a program without a proven optimum in 60 seconds counts as unprotected. A failing audit climbs a fixed ladder (B = 10, 50, 100, 500); if none passes, only the disclosure block is committed. - One run: the script refuses to start unless the status line reads FROZEN and the pin matches, and it records an exclusive attempt before opening any PSID file. New block SHA-256: f2fd0a3eaf7cbfd99da21d7f885ca05e9e6b62764fe4db895b0f28b84ccd4bc6. The script and its tests change to match in the next commit; the protocol stays a draft until a review leaves no blocking finding. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…scored run #560's round-4 review found four legacy gates (gate_1, gate_2, gate_2b, gate_2c) with committed scored outputs beyond the registry's five seeded imports. The inventory must import each, or record that it holds out nothing a Track B or open-population gate could use. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Implements docs/design/track_b_b0_2_protocol.md at f5d22c1 (block sha256 f2fd0a3e...), answering Sol's round-1 findings: - Known age 1..cohorts.age67._MAX_AGE_CODE; 0, 999 and other values are unknown age, in no band and not in R_TA_PROXY; rosters gain an unknown_age cell. - Disclosure: a registry of every published count's unit set, atoms by membership signature per unit type (persons, wave households, strata, stratum-cluster), sensitive atoms and published-subset differences of true size 1-9, two scipy.optimize.milp programs each (integer, zero gap, one thread, 60 s), effective sizes as lower bounds, width >= 4, coarsening halves up, and the ladder 10/50/100/500. Public output names no quantity and holds no set or atom. - One run: FROZEN status and pin checked before inputs resolve; an exclusive attempt record before any PSID file opens; a second start refused. Built blind on invented data by a Sol lane. A post-build correction by the main session: a published multiple equal to B now covers B..3B/2-1, not B/2..3B/2-1, and an effective size published as B bounds its count from B; both had under-constrained the audit. The brute-force differential test now takes its oracle from enumerated preimages of coarsen rather than from count_interval. Invented realistic-size audit (30,000 persons, 415 sets): 132 s on one thread; the ladder reached B = 50. Tests: 100 passed (B0.2 and B0.1). Mutations: 22 of 22 killed. Black 26.5.1 (-l 79) and ruff clean. Tier counts: unit 10,021 -> 10,040. No data was read and no count has run; the protocol stays a draft until review round 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…view round 2) Round 2 (Sol, at 0644b71) asked for changes: three blocking findings and several nonblocking ones. - P1, audit metadata: the committed file reported how many targets were audited, and an executed fixture used that count to narrow a remainder to four sizes. The disclosure block now holds only the base, the coarsening rule, the protection rule and the status. Beyond that, no program the audit runs depends on a true size: a pool of points comes from nine programs set from the publication alone (one feasibility program and eight seeded +/-1 directions), each target's windows come from the pool, and targets run in the registry's order. True sizes enter only the test that withholds. So a reader can rerun the audit for any vector with the same publication, each round's narrow targets are the same for all of them, and a release discloses exactly that every narrow target lies outside 1-9. Those are added as disclosures and the rest reclassified until a round adds none. - P2, intervals: a published multiple m stands for max(B, m - B/2) to m + B/2 - 1, in the block as in the script. - P2, writes: both files are serialized, written to a temporary name, fsynced and hard-linked into place; a failure leaves no file under a final name. - Nonblocking: relations across unit types join the model, registered only where the rows that build a set guarantee them (a violated one is a defect and stops the script); one fixed base replaces the ladder; a target is wide on two exactly verified points, with no proven optimum needed; new tests cover age 62.5, negative and nonfinite coarsening inputs, the exact-optimum setting and the attempt record's fsync. - Reader model: atoms may be empty. Assuming every atom nonempty pinned atoms exactly on invented 800-household panels. The block names the limit this leaves: a reader who could list every possible class and rerun the audit per pattern of empty classes could learn which occur. Tests: an enumeration oracle written apart from the integer programs (random tables plus two that withhold) must match the script's decision, disclosures and classifications, the vectors whose rerun releases must equal the final constraint set, and every sensitive target must keep five sizes among them; two tables with one publication must hand the solver identical programs; direct tests cover a disclosed target and a second round. 119 passed (B0.2 count and exclusion modules), 38.8 s serial. Calibration on invented panels at B=10 (not committed): 800, 3,000 and 9,000 households released with every target wide, in 331, 717 and 835 s; the slowest single program took 21 s of its 60. The protocol block's SHA-256 is now 28c08c51...; the status stays DRAFT. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Landscape: public HRS counts as available for the estimands it supplies, and its use follows the project's data-access record. Restricted HRS-SSA access, eligibility and lead time remain to be verified. - Plan: the open-population design approved in d1925 (PR #557, question 5) publishes every projected year past 2030 as conditional on named assumptions, with drift diagnostics, never as a validated forecast, and registers its 2050, 2065 and 2070 DYNASIM comparisons as report-only and blind. This bears on B7's target years and J's record. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only the tier files conflicted. Recounted by collection on the merged tree: unit 18,244 (master 18,125, +119 for B0.2), artifact 4,261, integration_psid 1,450, reproduction_legacy 520, oracle_policyengine 308; total 24,783. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three sentences of the protocol block said a wide target keeps at least five possible sizes. The rule, and the tests, guarantee a range: two verified points at least 4 apart, so no range of fewer than five sizes holds every size the target can take. The block now says so. Its SHA-256 is e9a39f44...; the status stays DRAFT. The script and the test pin move with it; nothing else in the script changes. docs/design/track_b_b0_2_evidence/ holds the evidence for the round-2 revision, all on invented data: - oracle.py restates the rule by enumeration, apart from the integer programs. It lists candidate vectors in bounded chunks, with an optional early limit. - exhaust_closure.py tries every three-atom table for a release that needs a second round; search.py checks the replay theorem, the width guarantee and whether the closure rounds matter on larger random tables; ranges.py counts sensitive targets whose possible sizes skip a value in their range. - invented_panel.py and calibrate.py time the audit on an invented panel at 800, 3,000 and 9,000 households. - mutations.py runs the 45 checks in mutation_specs.json against the full count test module, each in a fresh pytest process. Their outputs, the mutation record and the report section follow in the next commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 45-check mutation run at 88211bf left three mutants alive, each a gap in the tests rather than a defect in the script: - targets classified in order of true size. The transcript test rarely reached two programs on its small tables. A new test classifies two tables with one publication and opposite size orders, and requires the model's order for both. - a timed-out search counted as proof that a window is empty. A new test stubs searches that return HiGHS status 1 without a point and requires a narrow, undetermined target with no extreme program. - every relation registered, guaranteed or not. A new test gives one person no design stratum, alone in the 62-64 bands: the registry must omit "persons only with strata" for those sets, and the model must build. Each new test fails on its mutant and passes on the script. The script is unchanged (SHA-256 d0a96afe...). Tiers: unit 18,244 -> 18,249 (five new unit tests in this module); total 24,788. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- docs/design/track_b_b0_2_evidence/: the outputs of exhaust_closure.py, search.py and ranges.py, and calibration.txt, the invented-panel calibration at 800, 3,000 and 9,000 households (all released, every target wide). Its header records which script bytes each run loaded. - docs/design/track_b_b0_2_counts_mutations.json: a full 45-check rerun at bfd439c, 45/45 killed. The three survivors of the 88211bf run are killed by bfd439c's tests. Every failed-test id matches a node id pytest collects from the module; the restored script is d0a96afe.... - docs/design/track_b_b0_2_counts_report.txt: a section answering review round 2, with the pin, validation, enumeration checks, calibration and mutations. The protocol block, its pin (e9a39f44...) and the count script are unchanged. Invented data only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Answers review round 3 (code and tests; the protocol text follows). - B0.1's committed counts are public and exact, so they now enter the audit. The script reruns B0.1's structural_counts on its own inputs and stops unless it equals the record. It rebuilds each count's set by B0.1's rules, checks that every other count B0.1 publishes is a sum, an effective size or a label, and checks the copied ledger fields. Each set is registered at its exact size (add_prior). Earlier sets refine the atoms; the targets stay this release's classes and the differences that involve one of its sets. - An empty pool proves nothing, so its target is narrow. When a round's disclosures rule out every pool point, the seed programs run again under them, and the release is withheld if none finds a point. - write_new flushes the directory after the link. Tests: the round-3 attacks (97 and 5 heads) withhold through main() with identical committed files; a differential of the rebuilt sets against B0.1's own counts on invented frames; a hand-counted example; the record check's refusals; an exhaustive reader with earlier counts; programs that depend only on the publications; reseeding and an empty reseeding through main(). The release fixture now has no B0.1 domain, since B0.1's small exact cells of the old panel rightly withhold it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
B0.1's sets now refine the audit's atoms, and some of them separate dispositions. They enter the audit in memory only. The local copy therefore leaves out every target that involves a set only B0.1 counts (with its places in the rounds), each target's atom columns, and the atom sizes. It gives instead the sizes of this release's classes, its atom targets. A test checks that the local copy is identical for two splits of a B0.2 class by a B0.1 set of the same count. This is option (a) of the disposition question put to the coordinator; the ruling is pending, and the protocol text follows it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Inputs: B0.1's committed counts, which must equal B0.1's script rerun on the same inputs. - What a reader can use: B0.1's counts, each the exact size of a set rebuilt by B0.1's rules; its sums, effective sizes and labels checked; the M6 fit's input-row count is not modeled. - Targets are this release's classes and the differences involving one of its sets; B0.1's sets refine the atoms. - The "may not" list's disposition rule has one exception: B0.1's sets, rebuilt in memory to constrain the audit, with nothing derived from them beyond B0.1's counts written to either file (option (a), pending the coordinator's ruling). - An empty pool makes its target narrow; disclosures that empty it reseed it; an empty reseeding withholds. - Limits: B0.1's counts are the one earlier release modeled; other committed counts over these persons enter only through B0.1's copies. - Local copy: this release's class sizes and the targets of its own sets; nothing of B0.1's sets. - Tests: the round-3 additions. - The narrative records review round 3. Pin 41eadabb... The calibration script now registers B0.1's sets as main() does, with --without-b0-1 for the earlier runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
B0.1's sets in the model, their exact bounds and checks, the record and ledger checks, registration in main(), the rebuilt sets (age support, dispositions, 2011 households), this release's targets, the emptied pool and reseeding, the fixed seed, and the local copy's filter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The coordinator ruled that B0.1's sets may constrain the audit on five conditions. The protocol block now states them (Disclosure rule, "B0.1's sets: the conditions on their use") and the script meets them: - Rerun gate: each rebuilt B0.1 set must be its published count before the audit; a mismatch stops the run with only the count-free attempt record written. - Write boundary: the local copy holds only this release's counts, the provenance and the decision record (no proof, programs, range, pool size, relation count or times). A failure prints its type and the script's line, keeping a message only from the script's own raise; a warning prints its category and place; the solver prints nothing. - Decision record, stated limit and not-a-precedent, as defined in the block. - Invariant: relabeling a death and a move-out on invented panels, with B0.1's counts, class sizes and decisions unchanged, changes no byte main() writes or prints (one example and a Hypothesis property), with the run's directory as its working directory. Targets: two of this release's sets always make a target, and their differences are taken first, so which targets are this release's own, and their order, depend on its sets alone. Repins the block's SHA-256. Mutation specs: four anchors repointed to the moved code, eight checks added for the conditions (75 in all). The new tests have not run on the host yet; CI runs them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 of 8 tasks
Contributor
Author
|
Superseded by #584: this branch's tree at 9a0ef5f (the round-3 answers and the conditions on B0.1's sets), as one commit on master fe5ab5a. This branch's history carries an early draft of the held-out registry file, which the registry's history check rejects; #584's final tree touches no registry file. Closing this draft; the review history stays here. 🤖 Generated with Claude Code |
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.
WIP. B0.2 per d1802 (Max 2026-10-21) and design revision 3 §3.1, §5.2 and §5.3.
What this will deliver
Plan
docs/design/track_b_b0_2_plan.md:This work is kept separate from the B2 successor design (d1659): neither lane reads the other's evidence (plan §2).
Status
docs/design/track_b_b0_2_landscape.md.docs/design/track_b_b0_2_protocol.md, status DRAFT. Its block is pinned at SHA-256e9a39f44….scripts/track_b_b0_2_counts.pywas built blind on invented frames. Its module has 120 unit tests, and the mutation record has 45/45 killed (docs/design/track_b_b0_2_counts_mutations.json). No count has run.docs/design/track_b_b0_2_evidence/: an enumeration oracle written apart from the integer programs, three searches over it, and a calibration on invented panels of 800, 3,000 and 9,000 households. The build reportdocs/design/track_b_b0_2_counts_report.txtsummarizes them.docs/design/track_b_b0_2_exclusions.jsonlists every B0.2 file, including the future counts and exposure inventory.scripts/track_b_b0_1_review_root.py.track_b_b0_2_*file to be listed.Invariants (stated in the protocol block, tested on invented tables)
test_audit_programs_depend_only_on_the_publicationcompares solver transcripts across tables that share a publication.docs/design/track_b_b0_2_evidence/search.py.The held-out data registry was split out to #560, now merged.
Tier counts change (unit +124 against master f8ffc7d; to be recounted against current master before merge), so merging waits for a slot from the dynamics coordinator.
axiom: n/a: Track B design and audit records; no policy encoding.
🤖 Generated with Claude Code