Repository navigation
Track B B0.2: source, exposure, access and power records for B3 through J - #584
Merged
Merged
Conversation
B0.2's tree from PR #554 at 9a0ef5f, as one commit on master. #554's history is kept on its branch; this commit carries no registry file. - Plan and landscape synthesis (docs/design/track_b_b0_2_plan.md, track_b_b0_2_landscape.md). - The structural-audit protocol, version 1, DRAFT, with the answers to Sol review rounds 1 to 3 and the conditions on B0.1's sets in its block (docs/design/track_b_b0_2_protocol.md; pin 036b2070...). - The count script, built on invented frames (scripts/ track_b_b0_2_counts.py), its tests, the evidence tools and the standing exclusion record. No count has run. Tiers: unit 18,254 -> 18,407 (+153 for B0.2's tests). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
3 of 7 tasks
Round 3's rerun of the 800-household calibration withheld on a loaded host when six of the nine seed programs found no point within 60 seconds. A limit sets no window and sees no size, so raising it changes only how often a slow machine withholds. The block, the public protection rule and the options test say 300; a mutation spec puts 60 back (76 specs). The preamble also records round 3's two nonblocking answers. Repins the block (994a7326...). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two holes in the write boundary, closed before any evidence run: - A warning's category and place were printed. Whether a warning fires, and where, can depend on the data, so the guard now drops warnings unseen. - The guard caught only Exception. An interruption, or a library's own exit, would print Python's default report, which chains the error it interrupted, whose message could quote a size. It now catches every exception and reports its type and the script's line alone. The block states a stop's report as an output the boundary allows, and the stated limit now says that whether, and where, a run stops can depend on the data. Tests: warnings are dropped while those outside the guard are untouched; an interruption and a library's exit print no chain; the static check finds one print, the output's path. Mutation specs: 77. Repins the block (f5396be9...). Tiers: unit 18,409. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hashes The coordinator's rulings on the decision record and provenance: - Rounds: the local copy no longer writes the per-round disclosure lists, the reseed flags, each target's settling round or the round count. Rounds add resolution to the one channel the decisions open, and a rerun of the frozen code on the frozen inputs gives them again. Each target keeps its kind, unit type, sets, true size and final classification, with the class sizes by unit type. The stated limit narrows to which targets are narrow and whether the release is withheld (and whether and where a run stops). - Provenance, which goes into the committed file: only the requested shape, fixed before any count (labels; waves, reference years, the age convention, the lags), and SHA-256 hashes of inputs and code. No hash of the local copy, the attempt record or any file holding a figure not committed. A test checks the committed field list, the geometry, and that every hash in either file is of an input or code. Mutation specs: 80 (three added: rounds written, a settling round written, provenance gaining a figure from the panel). Repins the block (dcfac276...). Tiers: unit 18,410. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The coordinator ruled that a stop counts as a decision, a withhold of
the version. The block now says so: the attempt record refuses a rerun,
and the next attempt is a new version, ruled on before it runs, that
treats the stop as public.
- The guard runs per phase. A failure while reading the inputs or
writing the files names its type and the script's line. One in the
release (the rebuild of B0.1's sets, the gate, the counts and the
audit) prints "B0.2 stopped in the release" alone. The script's own
raises keep their fixed messages in every phase.
- Inside each phase, file descriptors 1 and 2 point at the null device
and Python's streams at a null stream. Every stream, the C library's
included, is flushed before the descriptors are restored for the
report.
- The stated limit names the run's total time as a channel, with no time
written or printed. Operations: the run is detached from the session,
with no wall limit, since the number of programs is bounded.
- Tests:
- the fixed release text, for a library failure and for one deep in
the disposition rebuild;
- reading-phase reports;
- silencing through Python, descriptors and C stdio;
- the committed record's exact key set;
- main's three phases;
- seven new guard mutants, and three old ones repointed.
- Three tests that failed on their first run are fixed in the tests:
- a macOS temporary-folder symbolic link;
- verdicts that are both wide and irrelevant;
- SciPy's milp removing "disp" from the dict it is given.
The relabeling tests now include panels that release.
- Pin ebdc3565; unit tier 18,421.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The coordinator agreed there is no wall limit. Since any stop spends the version and each program's 300-second limit is wall-clock time, it set three conditions in its place. The script enforces the first two before the attempt record, so a host that fails them spends nothing: - it starts `caffeinate -i -s -w` on its own process, holding off sleep until it ends, and refuses to start if caffeinate cannot start; - it refuses to start unless it runs at nice 0 and the five-minute load average is below the CPU count (18 here); Fleet ops is asked for a quiet window if the load does not come down; - before the freeze, an expected run time extrapolated from the 800/3,000/9,000-household calibrations goes to the coordinator. The block also says the run prints nothing until it ends, so liveness is checked by process ID alone. Tests cover each refusal (before the attempt record and any read), the caffeinate arguments and order, the host-state reader, and a real caffeinate on macOS. Six mutants are added (93 specs). Pin 31af2b85; unit tier 18,429. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Round 4 approved the block and the script as they stand and asked for four test changes before the freeze, none of which changes the pin or the script: - T1: the relabeling tests run main() under an audit hook that refuses any file write other than the run's three outputs (and their temporary files), and any new process or connection; a test checks the hook. The static check's write list adds NumPy's, pandas', pickle's and shutil's writers, and refuses one imported by name. - T2: a property test that the local copy is the same byte for byte whatever rounds settled the targets, and fixed cases for a mark on late results and an order by round. - T3: round 4's table, on which B0.1's exact household count withholds a small band's households; without B0.1's household sets it releases. - T4: the Hypothesis relabeling draws its swap between heads of different ages, and counts apart any draw that leaves the atoms as they were. It also adds the 12 files of docs/design/track_b_b0_2_evidence/ to B0.2's standing exclusion record (round 4's S3), with a test that every B0.2 file is on it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first run of 80c5ab7's tests found two mistakes of mine: - The household class's unit type is "households_2011", not "households". - B0.2's exclusion record already has a test module, which checks the record's exact list. So the check that every B0.2 file is listed goes there, not into the count tests. Its name rule now also catches any file in a folder named as B0.2's, such as the evidence folder, whose files round 4 found left in review roots. The record's expected list gains the 12 evidence files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Round 4 approved 60d77cf and asked for four script changes and three wordings in the block. All of them go in before the freeze. S1, the decision record. - Each target's result is now its decision from the round that ended the audit, or from the round that disclosed it or proved it irrelevant. Every other target is "unreached", so the pattern no longer shows which round ended the audit. - Each class target names the paths of this release's sets that hold it, in the release's order, and never B0.1's, even where a B0.1 set is the same set. S2, the run's conditions. - caffeinate is gone. The script holds two IOKit sleep assertions in its own process and reads, through ctypes, the providing power source, the Darwin background priority and the main thread's QoS class. - Six named conditions (ac_power, sleep_assertions, nice, background, qos, load) must all hold before the attempt record, or the script refuses to start. - They are rechecked before every program, never during one. While one fails, the script rechecks every 60 seconds and takes a lapsed assertion again. After 1,440 failed rechecks (24 hours), it stops with the condition's name. - The QoS condition goes beyond round 4: a CPU loop on this host ran about a twelfth as fast under a background QoS clamp, with niceness and the Darwin priority both 0. S3, separation. The exclusion test now includes decoys that share basenames with B0.2's files, and requires each decoy to be kept. S4, identifiers. The reading phase stops on either of these: - a present row without its person or interview number; - a present person without a design stratum and cluster. The block. - B1: the committed status of a withheld release is listed among the audit's limits. - B2: the stop channel names the script's own checks. - B3: running without a wall limit rests on the calibrations' timings, not on the program bound. The block also states the six conditions, the wait and its bound, and the operator's duties. The block's SHA-256 moves to 038ee180be5b9f8b86e132dde71cceba234c2aa465a4866f22e907c86b430e42. The mutation specs drop five that targeted the removed code. They add 17 for the new code and round 4's four mutants, for 109 in all. The evidence is rerun at the final head after the delta review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The coordinator accepted the QoS condition and the recheck design, with three requirements. This commit meets them. - QoS: the run's main thread must have an unspecified QoS class, or the default or above, by two named constants (QOS_CLASS_UNSPECIFIED, QOS_CLASS_DEFAULT). Before, the check excluded utility, background and maintenance by name, so a class outside <sys/qos.h>'s list would have passed. Two refusal cases with such classes are added, and three mutants: an unknown class passes, an unspecified class fails, and the wait stops one recheck early. - The block names the wait's constants (RECHECK_SECONDS, RECHECKS) and the QoS constants beside the values it states. - The stop message is built from RECHECKS and RECHECK_SECONDS, not a fixed "24 hours". It reads "run condition <name> still failed after 1440 rechecks, 60 seconds apart, between programs", so a shortened bound reports itself truthfully. The static check allows the two constants in a raise message: they are settings. - A test runs the bounded wait with a shortened bound and real waits: three rechecks a hundredth of a second apart. A condition failing through all three stops the run before any program; one that clears at the third lets the run finish and write both files. The block's SHA-256 moves to a92539b27121f8d6c903f763537405a1fb992491cff45bdb0626a23de8169871. The mutation specs number 112. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…confinement Review round 5 (Sol, at c6aec97) stopped before its report, but its draft found two gaps in round 4's items. Both are fixed here, with two corrections to the block's wording. - Sleep assertions (S2): _Host.held() counted any assertion that still existed, but IOKit lets an assertion's owner set it to the off level, where it no longer prevents sleep. held() now reads the assertion's AssertLevel property (CFDictionaryGetValue, CFNumberGetValue) and requires 255. Before an assertion that fails the check is taken again, it is given back. New tests: a fake-host test for the release and retake, and a macOS test that sets a real assertion to the off level. Two new mutation specs (114 in all). The static check pins the two new C functions and the two new ctypes calls. - Test confinement (T1): the audit hook let a write into an existing __pycache__ folder pass. It also missed a database (sqlite3.connect), the system log, removing a file or changing its metadata (remove, rmdir, chmod, chown, chflags, utime, xattrs), a rename's source, and a socket before it connected or sent. Each is now refused, and bytecode writing is off while the confinement holds. The companion test exercises each route. A write that native code makes through its own descriptor raises no audit event, so the static check now also refuses the modules that could make one (socket, sqlite3, syslog, mmap, dbm, shelve, http, urllib, ssl, asyncio, multiprocessing, ftplib, smtplib). - Block: the identifier check can fire on the real files. The person-wave reader builds the person number as an integer, but passes each wave's interview number through as pandas.read_fwf reads it, and a blank field reads as missing. The old sentence said it never fires. Round 4's two 97-head status tables are now described separately. The block also states the assertion level, and the release before a retake. The block's SHA-256 moves to 71e350ef5beca201be584195b233aa9e4975cc5977bece2597eb6e913822c36f. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A fresh master merge before the round-5 delta review. Master brings P2 and the ledger delta; it changes no B0.2 file, nothing B0.2 imports, and not tests/tier_counts.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI's full collection at c6aec97 matched 18,561 unit tests. 9322a0b adds two, both in the count module: the fake-host release-and-retake test and the macOS off-level test (skipped off macOS, collected everywhere). Master 7e050df leaves the tier file at 18,339, as 9967dfd had it. So 18,561 + 2 = 18,563, derived; CI's collection at this head checks it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mutation record at e79f41b found check 37 ("relations dropped from the audit") alive: all 229 tests passed with model_relations' result emptied inside audit_counts. At bfd439c only the withheld-release test of main() killed it, as a side effect, and it no longer depends on the relations. test_the_audit_uses_the_relations_it_registers builds a table where the relation alone decides: twelve households and eleven of them, both published as 10, leave the twelfth anywhere from 0 to 4 (wide); with an earlier release's exact twelve persons and "at most as many households as persons", it is 0 to 2 (narrow at true size 1), so the release is withheld. Without the relation the same table releases. It fails on the mutant and passes on the script. Tests only; the script and the protocol block are unchanged (pin 66cadfa4). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mutation record at e79f41b killed 113 of 116 checks. Besides check 37 (abbbf79), two survived, each a gap in the tests: - Check 53, "a modeled set B0.1 never published accepted", empties the check that every set the audit models is one of B0.1's published counts. The test's only unpublished set also named an unpublished term, so the loop over terms stopped it first. A set B0.1 never published, whose size is a published count, now reaches the check of the sets' own paths and nothing else (test_the_b0_1_record_must_be_the_one_these_inputs_give). - Check 66, "the local copy sums every target into class sizes". In the tests' tables every difference held the same units as a class, so no difference was a target of its own. test_the_class_sizes_are_this_releases_classes_alone nests sets of 30, 20 and 10: the outer difference of 20 is a target but not a class, and the class sizes are three tens summing to 30. Each test fails on its mutant and passes on the script. Tests only; the count script (7ec6ee28) and the protocol block (pin 66cadfa4) are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The relations test (two cases) and the class-size test add three unit tests to the count module, which collects 232: unit 19,013 + 3 = 19,016, total 25,586. The README table matches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Master brings #589, #590 and #580: an OP1 report section, a docs ledger, and the held-out registry's module, tests and mutation record. None is a B0.2 file or anything B0.2's script imports. The tier files conflicted. Resolved as master's counts plus this branch's unit delta: 18,789 + 236 = 19,025 unit, total 25,595. The other tiers are unchanged, and the README table matches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…agnostic Evidence at e79f41b, on invented panels only, each program's limit 300 s. The count script, calibrate.py and invented_panel.py are unchanged since. - calibration.txt now holds the five runs. With B0.1's sets registered, as main() registers them, 800 and 3,000 households withhold, each on one narrow one-person class, and 9,000 release. Without them, the same 800 and 3,000 panels release with every target wide. - singleton.py, reviewed by Sol, classifies the withholding target again under smaller publications. singleton.txt holds both panels' output. On both panels the class is narrow at [0, 3], not exact, and B0.1's sets are what make it narrow. On 800 households the B0.1 sets that contain the person are neither enough nor needed. On 3,000 households it takes both groups, and two containing sets are each needed. A second Sol review found these readings accurate. - Both new files are on the exclusion record, and the test that lists B0.2's files names them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Max ruled on 2026-10-26 that a target is exempt when this release's counts narrow it no further than B0.1's published counts already do. The block gains an "Exempt targets" section and the script implements it: - earlier_counts_system: B0.1's rows at their exact counts over the same atoms, with none of this release's counts, relations or disclosures, and every atom no B0.1 set holds fixed at 0 and flagged. - exempt(): for a narrow target with proven optima, two more programs find its least and greatest size under B0.1's counts alone; the target is exempt when both are proven and equal its range under the round. A target holding an uncounted atom, or anything unproven, is not exempt. - audit_counts: an exempt target neither withholds nor is disclosed, and every later round tests it again, so a disclosure that narrows it further ends its exemption. Tests: the exhaustive reader with earlier counts enumerates B0.1's counts alone and must match the script's exemptions (three new examples: an exempt class, an exempt target of true size 10 that is not disclosed, and a disclosure that ends an exemption); exemption programs are the same across tables with the same publications; each fail-closed case; and, through main(), a panel whose small classes B0.1 already fixes releases and withholds with the exemption off. The relabeling test's withholding panel is replaced by a six-head panel this release narrows (the old one now releases there), and the small-B0.1-cell test names the target that still withholds it: the 1-24 band's clusters, which B0.1 does not count. The program bound becomes 9(T + 2) + 7T(T + 1)/2. Pin b1ac4bc0... in the script and the test. Eleven mutation specs cover the exemption (127). Tier: unit 19,025 + 6 = 19,031, total 25,601. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ruling's question names a class. The block now says the exemption covers every audited target, each class and each published-set difference, which is what the protection rule protects, because the test that grants it is the same for both kinds. It also says which atoms a difference holds, for the refusal of an atom no B0.1 set counts: each atom of its superset outside its subset, which is how build_model forms a difference's columns. No script logic changes. Tests, on the main() panel that releases with exempt targets: - switching off one exemption alone, for a class of true size 1 or 2 or for a difference of this release's sets of true size 3, withholds on that target in the same round; every target that audit reaches is decided as in the release, and that target too, apart from its result and the two B0.1 programs it no longer runs; - the difference against a B0.1 set, of true size 10, disclosed in place of exempt, ends the size-1 class's exemption in the next round, with a range strictly inside its B0.1-only range. The existing main() test shares the panel builder. The new tests alone kill 9 of the 11 exemption mutants; the other two (an uncounted atom, an unproven program) cannot arise on that panel and are killed by the fail-closed test. Pin 6840f5fa... in the script and the test. Count module: 242 passed. Tier: unit 19,031 + 4 = 19,035, total 25,605. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Evidence only; the protocol block, its pin (6840f5fa...) and the count script (647b52fd...) are unchanged. - track_b_b0_2_counts_mutations.json: the full rerun of all 127 specs at 1ed6a26, 127/127 killed, each check restoring 647b52fd.... It replaces the 45-spec record from bfd439c. - track_b_b0_2_counts_report.txt: a "Final head" section covering the validation at 1ed6a26 (393 and 22 passed, black and ruff clean), the calibrations at e79f41b and 6cca06a, the singleton runs, the mutation record and its three former survivors, and the no-data declaration. - calibration.txt: the runs at 6cca06a (800 and 3,000 households release with 5 and 4 targets exempt). The first 9,000-household run withheld because the host slept partway through; two reruns with the host awake, at 6cca06a and e79f41b, both release with the same decisions. The header no longer says the count script is unchanged. - singleton.txt: the header no longer says the count script is unchanged, the wording round 6 flagged. Every table and panel is invented; no real data file was opened. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Evidence wording only; the block, its pin, the script and the tests are unchanged. - Report: the 71.3 s figure is the slowest classification of one target; calibrate.py times classify() and not the exemption's programs that follow it for a narrow target. - Report: the 13 to 81 starting-load range is for the post-exemption calibration jobs. - Report and calibration.txt: the first 9,000-household run's end time comes from the job runner's log, and that the host's sleep caused its timeout is stated as an inference; the power log does not time programs. 18fa204's message said "because the host slept"; this wording replaces that claim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
calibration.txt only. - 2d8d982 said the first 9,000-household run ended "3,277 s after it began". The job runner's log puts its start at 23:00:19Z and its end at 00:06:24Z, 3,965 s apart; 3,277 s is the runner's elapsed field. The text now gives both and says what each is: the log's times are UTC from the system clock (time.gmtime()), and the elapsed field, like every time calibrate.py prints, comes from time.monotonic(). During this run that clock advanced about 688 s less than the system clock, so this run's times need not equal elapsed time on the system clock. No cause is asserted for the difference. - The header said times are wall clock; it now names the clock. - "300 s of wall clock" is now "the 300 s program limit". - Round 8's low note: the rerun launch at 00:10:14Z that the author stopped before any output is now recorded, as the author's account. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Changes only the protocol's Status line, which is outside the pinned block, from DRAFT to FROZEN. The block's SHA-256 stays 6840f5fa41c897407c5896d4c3729ca5a5c0f1d166faa294e65e42309908ad23 and the count script stays 647b52fd7c260a1e46887f8781a92990cae2fa38165f740d65f530703cc96321. Every commit since round 6's approval at 1ed6a26 has had a Sol delta review: round 7 approved 18fa204, and round 9 approved 18fa204..ff5bce4 (round 8 had asked for the change in ff5bce4). No count has run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Version 1 ran once on 2026-10-29 from a clean clone at the freeze, e8a9fac, and released. This commit adds the run's published file, docs/design/track_b_b0_2_counts.json, byte for byte (SHA-256 c8415139...). Its counts are 0, "<10" or multiples of 10, and its disclosure block holds the base, the two rules and the status alone. - tests/test_track_b_b0_2_counts.py: four tests hold the committed file to the frozen run. They check the provenance (schema, freeze head, clean flag, the script's SHA-256 against the tree, B0.1's counts hash, geometry, one SHA-256 per opened file), the disclosure block and forbidden keys, that every count is in coarsening's image, and that every leaf path matches the counts the script builds from an invented panel. Sixteen edited versions of the file each fail at least one. - tests/test_track_b_b0_2_exclusions.py: the counts file is now committed; only the exposure inventory is still to come. - docs/design/track_b_b0_2_protocol.md: the status line records the run. The block, its pin and the script are unchanged. - docs/design/track_b_b0_2_counts_report.txt: the run and the committed release, including a first launch that refused to start before its attempt record (zsh started it at nice 5), so it spent no version. No time from the run's end is recorded. - tests/tier_counts.json, tests/README-tiers.md: unit 19,035 -> 19,039 (total 25,609). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Round 10 (Sol) approved e72aec1 with three nonblocking gaps in the committed-release tests. This commit closes them, in tests only: - test_the_committed_file_is_the_runs_published_file pins the published file's SHA-256 (c8415139...) and requires its bytes to be the script's own serialization, so another admissible value no longer passes. - test_the_committed_allowlist_is_the_requested_labels_alone checks the allowlist's constant parts against the script, each wave's roles, that every other leaf is a PSID variable name and its label, and that B0.1's committed record names the same variables in its waves. - _skeleton records containers as well as leaves, so an added empty object fails the shape test. Ten edited versions of the file, including round 10's three escapes, each fail at least one of the six tests; the unchanged file passes. The report records the answer. Tiers: unit 19,039 -> 19,041 (total 25,611). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
marked this pull request as ready for review
October 29, 2026 11:28
Contributor
Author
|
Merged by the Microcosm Dynamics coordinator at the reviewed head
|
Merged
8 tasks done
MaxGhenis
added a commit
that referenced
this pull request
Oct 29, 2026
Master 53c7f2d (#584) has unit 19,041. This branch adds six unit tests: the nested-event test for push and pull_request, and four 64-digit cases of the zero-boundary test. The new total is 25,617, and the README table matches. A full-suite collect, which enforces the manifest, and a `-m unit` collect both confirm the counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Counts released (2026-10-29). Approved at
7d1e2898(Sol rounds 10 and 11). Waiting on CI and a tier slot: the dynamics coordinator has been idle since 10/22, so the slot question is with Max (d2173). #592 goes first. B0.2 per d1802 (Max 2026-10-21) and design revision 3 §3.1, §5.2 and §5.3.This supersedes #554. It is #554's tree at
9a0ef5f4as one commit on masterfe5ab5ab. #554's branch history carries an early draft of the held-out registry file, which the registry's history check rejects. This branch's final tree touches no registry file.What this will deliver
This PR lands the plan, the landscape synthesis, the frozen protocol, the count script, its one run and the released counts, as the coordinator ruled (after the run: recount, commit the counts, take a tier slot). The power procedure, the per-gate records, pricing and the reviews follow in the next B0.2 PR.
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.The protocol is
docs/design/track_b_b0_2_protocol.md, FROZEN ate8a9fac0(item 10 below). Its block is pinned at SHA-2566840f5fa…(b1ac4bc0…at6cca06af,66cadfa4…at1e3ff4d8,31af2b85…at60d77cff,a92539b2…atc6aec979,71e350ef…at9b9d53f5).Sol review rounds 1 to 3 asked for changes, and each was answered in the block before any freeze. Round 3 found that B0.1's exact public counts were not modeled, and that disclosures could empty the witness pool. B0.1's sets now enter the audit as exact counts, and an emptied pool reseeds or withholds.
The coordinator ruled that B0.1's sets may constrain the audit on conditions, which the block now states and the script meets:
Since this PR opened: each program's limit is 300 seconds, up from 60, because round 3's 800-household rerun withheld on a loaded host when seed programs timed out (
3fe9541d); warnings print nothing, since whether one fires and where can depend on the data; and an interruption, or a library's own exit, is reported like any failure, with no chained error (f9d6dc4c). Following the coordinator's rulings (74ed29be): the rounds are dropped from every output, and the committed provenance holds only the requested shape, fixed before any count, and hashes of inputs and code.The coordinator then ruled that a stop counts as a decision, a withhold of the version (
7f657916).In place of a wall limit, the coordinator set three conditions on the run (
60d77cff), since each program's limit is wall-clock time and any stop spends the version:Round 4's S2 replaced the first two with six run conditions checked before every program (below). The run prints nothing until it ends.
The count script
scripts/track_b_b0_2_counts.pywas built on invented frames. No count has run.Evidence on invented tables is in
docs/design/track_b_b0_2_evidence/: an enumeration oracle written apart from the integer programs, three searches over it, a calibration on invented panels, and the mutation runner, now with 127 specs. The build report isdocs/design/track_b_b0_2_counts_report.txt.Review round 4, at
60d77cff, approved the block and the script as they stand. It ran on an Opus 5.5 lane, since the Codex lanes were closed. Nothing is blocking. It asked for four test changes before the freeze, none of which changes the pin or the script. They are done in80c5ab72and3747d0ee, and the count, review-root and exclusion test modules pass (322 tests):The coordinator ruled that round 4's other seven items also go in before the freeze, in one head with a fresh master merge. They are in
1f3b529c, on the master mergea3b62363, whose second parent9967dfd6is still master's head. (That merge's message names51323bedin error.)unreached, whichever round that was, so the record no longer shows the round. Each class names the paths of this release's sets that hold it, in the release's order, and never B0.1's, even where a B0.1 set is the same set.caffeinateis gone. Throughctypes, the script holds two IOKit sleep assertions in its own process, and reads the providing power source, the Darwin background priority and the main thread's QoS class.ac_power,sleep_assertions,nice,background,qos,load) must hold before the attempt record, or it refuses to start.taskpolicy -c background, with niceness and the Darwin priority both 0.0f942549),qosholds only when the class is unspecified or the default or above, by two named constants, so an unknown class below the default fails. The block names the wait's constants (RECHECK_SECONDS,RECHECKS), the stop message is built from them, and a test runs the wait with a shortened bound and real sleeps.The mutation specs drop the five that targeted removed code, and add 20 for the new code plus round 4's four mutants, for 112. Round 4's four mutants are killed at
3747d0ee.The count, review-root and exclusion modules pass at
1f3b529c: 359 tests. In the relabeling property, 14 of 16 draws changed the atoms and kept the decisions. At0f942549, the 37 tests its change touches pass (run conditions, QoS, both bounded-wait tests, the static message check, the pin and the real-host reads); the full modules rerun with the evidence.Round 5's first attempt, a Sol delta review at
c6aec979, stopped before its report: the provider's content filter refused it after 1 h 38 min. Its draft found two gaps in round 4's items and two wording errors in the block, all fixed in9322a0b6(pin71e350ef…):held()now requires theAssertLevelproperty to read 255, and an assertion that fails is given back before it is taken again. A macOS test sets a real assertion off.__pycache__folder pass, and did not see a database, the system log, a file's removal or metadata, a rename's source, or a socket before it connected. It now refuses each, with bytecode writing off while it holds, and the static check refuses the modules that could write past an audit hook (socket, sqlite3, syslog, mmap and others).7e050df5is merged atc8d6dbb3; it changes no B0.2 file, nothing B0.2 imports, and not the tier file.Round 5's second attempt (Sol, at
9b9d53f5) found all eleven items and those four fixes resolved, apart from one sentence: the block credited the reader's fixed-atom rerun's result (withheld at 0 to 2 heads) to the natural tables, which round 5 found withheld at 1, 2 and 7. Fixed in3e169c74(pin66cadfa4…), with its three nonblocking suggestions:Two mutation specs cover them, for 116. Master
1ec57a5d(PSID income and wealth readers and field registry (D1a) #575, D1a) is merged at226d844d. It adds two data modules and changes a birth-evidence script, tests and the tier files; nothing B0.2 imports.Calibrations at
60d77cffon invented panels, with B0.1's sets registered:Whether a class that B0.1's published counts already fix should still withhold this release was a methodology call for Max. He ruled on 2026-10-26: exempt a class only when B0.2's rows narrow it no further than B0.1's published rows already do, as tested in the frozen protocol. This is implemented in
6cca06af(pinb1ac4bc0…):exempt), the Tests list and the program bound (9(T + 2) + 7T(T + 1)/2) change with it, and the preamble records the ruling.earlier_counts_systembuilds B0.1's rows at their exact counts over the same atoms, and fixes at 0, and flags, every atom none of them holds;exempt()applies the test;audit_countsapplies the outcome.main(), a panel whose small classes B0.1 already fixes releases, and withholds with the exemption off.Scope (
1ed6a266, pin6840f5fa…). The ruling's question names a class. The dynamics coordinator read it as any audited target, each class and each published-set difference, because the test that grants the exemption is the same for both kinds. The block now says so. For the uncounted-atom refusal it also says a difference holds each atom of its superset outside its subset. No script logic changes. New tests, on themain()panel that releases with exempt targets:Next:
A delta review (round 5d) ofAPPROVED (Sol): the requested sentence is right, the only change between the markers, and both pins match; the ownership test catches all five ownership mutations tried; the stratum spec fails exactly the new case; the four lookups are refused; the merge changes nothing B0.2 imports; the tier arithmetic holds. No new findings: the block and script may be frozen as they stand.3e169c74and the master merge, at226d844d.Master
444f970d(SM1: differential mortality by lifetime earnings, education and race (normalized within age-sex-year cells) #570 SM1, OP1: open-population harness around the sealed loop #566 OP1) is merged ate79f41b5. It adds the mortality_ses and open_population packages, and changes a birth-evidence script, its test and the tier files: no B0.2 file and nothing B0.2 imports. The B0.2 files and the pin are identical to226d844d's.Evidence at
e79f41b5, on the serial runner (one job at a time, one core, nice 10), with each program's limit at 300 s:The B0.2 modules: 380 passed.
Calibrations on invented panels with B0.1's sets registered, as
main()registers them: 800 and 3,000 households withhold, each on one narrow one-person class, as at60d77cff. 9,000 households release: 3,838 targets (3,820 wide, 18 irrelevant) in 2,245 s of audit. No target took more than 31.5 s over all its programs, and no seed program more than 20.4 s.The same two panels without B0.1's sets release: 800 households, 2,843 targets, all wide, in 276 s; 3,000 households, 3,112 targets, all wide, in 668 s. B0.1's sets are what makes them withhold. A diagnostic of which B0.1 sets pin the one-person class (a Sol review found it sound for this question) runs next on the same runner, for Max's ruling.
Mutation record: 113 of 116 specs killed. The three survivors were untested paths, not faults in the script. As the coordinator ruled, they are answered with tests only:
abbbf793checks that with the relation a household class withholds, and without it releases;8a30da57adds a case that only this check catches;8a30da57adds nested sets where one is.Each new test kills its mutant. The count script is unchanged (SHA-256
7ec6ee28…). The count module: 232 passed.Master
172f690fis merged at1e3ff4d8. It adds OP1's report and the held-out registry's module, tests and record: no B0.2 file and nothing B0.2 imports.The full mutation record reruns at
1e3ff4d8, after the modules, on the same runner. Then one evidence commit: the calibration file, with each run's limit and sets (300 s with B0.1's sets now, 60 s without before); the rerun record; and the report's final-head section. Then a delta review of everything since226d844d, and out of draft.Max's ruling.Ruled 2026-10-26; implemented in6cca06af(above). The record at1e3ff4d8was stopped once the block and the script changed (56 checks run, all killed), so it is superseded.Evidence at
6cca06af:6cca06af: 2,562 s of audit, slowest target 44.7 s, median five-minute load 105;e79f41b5: 2,276 s, slowest target 34.0 s, median load 52.1ed6a266, in a clean clone on the same runner: the four B0.2 modules pass (393), the B0.1 count module passes (22), black and ruff are clean on the 13 changed Python files, and the full mutation record kills all 127 specs (6 h 13 min), each check restoring the script's SHA-256647b52fd….Round 6, a Sol delta review ofAPPROVED (Sol), no findings. The exemption implements the ruling under the coordinator's reading:226d844d..1ed6a266.All 11 new mutants and the three former survivors fail tests; the pin and the tier arithmetic hold. One editorial note outside the block, on the evidence files' "none has changed since" (to read "as of the evidence commit"), goes in the evidence commit.
The evidence commit
18fa204fis evidence only: the block, its pin, the script and the tests are unchanged.1ed6a266.6cca06afcalibrations tocalibration.txt.Round 7, a short Sol delta review ofAPPROVED (Sol). All 127 records match their specs, code, pins and restoration hashes; its replays of specs 127 and 37 reproduced every recorded failure, and its1ed6a266..18fa204f.calibrate.py 800 1rerun reproduced the recorded decision. It had three nonblocking wording notes, which2d8d982caddresses, again in two evidence files only:calibrate.pydoes not time the exemption's programs;Round 8, a Sol delta review ofREQUEST CHANGES, one medium finding. The new text said the first 9,000-household run ended "3,277 s after it began", but the job runner's log timestamps span 3,965 s; 3,277 s is the runner's elapsed field.18fa204f..2d8d982c.ff5bce43(calibration.txtonly) fixes this:calibrate.pyprints, comes fromtime.monotonic();Round 9, a Sol delta review of the whole rangeAPPROVED (Sol), no findings: the clock statements match the runner's and18fa204f..ff5bce43.calibrate.py's code, no cause is asserted, the stopped launch is attributed to the author, and every other file is byte-identical to18fa204f.FROZEN at
e8a9fac09b600ddfdaa586f962a49a351d9386b7. That commit changes only the protocol's Status line, which is outside the pinned block:The block still hashes to
6840f5fa41c897407c5896d4c3729ca5a5c0f1d166faa294e65e42309908ad23and the count script is still647b52fd…. The script's own protocol check passes on the frozen file, as do the pin, frozen-protocol, provenance and exclusion tests (12). Every commit since round 6's approval has an approving Sol review (rounds 7 and 9). Master has not been merged since. The run uses a clean clone checked out at this commit. A dry run of the read-only preflight there passes every check except the window and the load.The script runs once, in Fleet ops' reservation (Thu 10/29 08:00–11:00Z).
The run, 2026-10-29: released. Version 1 ran once from a clean clone detached at
e8a9fac0, inside Fleet ops' reservation.B0.2 refuses to start: run condition nice fails. The launcher now turns BG_NICE off.e72aec18is the one commit since the freeze. Master172f690fis already an ancestor, so there is nothing to merge.docs/design/track_b_b0_2_counts.json: the run's published file, byte for byte (SHA-256c8415139…). Every count is 0, "<10" or a multiple of 10; the disclosure block holds the base, the two rules and the status alone.7d1e2898) hold the committed file to the frozen run: provenance (freeze head, script and B0.1 hashes, geometry, opened-file hashes), the disclosure block and forbidden keys, coarsening's image for every count, and every leaf path against the counts the script builds from an invented panel. Sixteen edited versions of the file each fail at least one.6840f5fa…) and the script (647b52fd…) are unchanged, and the script's protocol check passes.docs/design/track_b_b0_2_counts_report.txthas the run and the committed release.Round 10, a Sol delta review ofAPPROVED (Sol). It found every claim and check confirmed, and three low, nonblocking gaps in the four tests: the allowlist's content went unchecked, the shape test ignored empty objects, and another admissible value in place of a count passed.e8a9fac0..e72aec18.7d1e2898(tests, report and tiers only) closes all three. A new test pins the published file's SHA-256 and requires the script's own serialization. Another checks the allowlist against the script's constants and B0.1's committed variables, and requires every other leaf to be a PSID variable and its label. The shape test now records containers. Ten edited versions of the file, round 10's three escapes among them, each fail at least one of the six tests. Both modules: 252 passed.Round 11, a Sol delta review ofAPPROVED (Sol), no blocking findings. It confirmed the pin, the allowlist checks and the container paths against the script, and found that 26 edited versions of the file each fail at least one of the six tests. Two informational notes (the shape test does not encode node types; a made-up label outside B0.1's waves passes the allowlist test alone) need no change, since the file pin rejects both.e72aec18..7d1e2898.172f690fis already an ancestor. If master moves before the slot, I merge it, recount and get the new head reviewed.docs/design/track_b_b0_2_exclusions.jsonlists every B0.2 file, including the future counts and exposure inventory. Since round 4 it also lists the 12 files indocs/design/track_b_b0_2_evidence/, which round 4 found were left in blinded review roots.scripts/track_b_b0_1_review_root.py.tests/test_track_b_b0_2_exclusions.pychecks the record's exact list and requires every tracked B0.2 file to be on it. Since3747d0ee, its name rule also catches any file in a folder named as B0.2's. Before, it checked basenames only, which is how the evidence folder was missed. Since1f3b529c, a built root with decoys that share basenames with B0.2's files must keep every decoy.e72aec18(item 11 below)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.raiseadds its message, which a static test confines to paths and settings. Nothing printed inside a phase is seen, through Python, a file descriptor or the C library's buffers. Warnings print nothing.Tier counts change: unit 18,789 → 19,041 (+252) against master
172f690f, merged at1e3ff4d8; total 25,611. The +252 is the earlier +233, the three survivor tests, the six exemption cases, the four both-kinds cases and the six committed-release tests (e72aec18,7d1e2898). CI's full collection passed the tier policy at 18,666 at226d844d(+233 against master1ec57a5d), and at 19,013 ate79f41b5. The README tier table matches. CI checks the counts, and they are recounted at the merge slot. 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