Repository navigation
Conversation
Max's d2603 (7 November 2026, "From the next build") moves Route A from income years 2022-2024 to main's default pool, income years 2023-2025 (ASEC 2024-2026). route_a.sh now passes census_cps_2025/2024/2023.h5 and asecpub24-26csv.zip with their registry pins, and check_commit refuses a build commit whose registries lack a pooled pin. The Modal base template names a new registration, us-puf-support-base-income-2023-2025, which stages the 2023 ASEC archive as its own LKWEEKS cache seed; the historical and rerun registrations keep their inputs, argv and seeds. test_route_a_asec_pool.py holds the driver and the template to ASEC_DEFAULT_POOL_INCOME_YEARS and the four year-keyed registries. The November 2026 certified build keeps 2022-2024 and its own driver. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The student debt pilot's base (d2606) keeps the November build's pool on us-puf-support-base-rerun, through the template as it stood at 9b7a454 (EqRC, 2026-11-09). A byte copy of that template now sits in the modal_us_stage fixtures, and test_route_a_asec_pool.py checks that it still validates on main with its 2022-2024 years, order, seed and pins. The default-pool registration takes its stage from the rerun registration it extends. The README describes what the education fetcher does, the pins doc drops a build reference this PR can't verify, and the runbook states the run-id convention without claiming the validator enforces it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been 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.
Summary
Max's d2603 (7 November 2026, "From the next build") moves Route A from income years 2022-2024 to main's default ASEC pool, income years 2023-2025 (ASEC 2024-2026,
asec_sources.ASEC_DEFAULT_POOL_INCOME_YEARS). This PR moves the driver and its Modal base template, so the next certified US build becomes the first on the default pool. The November 2026 certified build keeps 2022-2024: it runs from its own worktree at9434c504bwith a frozen driver copy, and nothing here reaches it.Refs #296. I'll close it with a comment once this merges.
Status: draft. Targeted local tests pass. The GPT-6.1 Sol review waits in Subfleet's queue behind its disk hold.
What changes
tools/route_a/route_a.shpassescensus_cps_2025.h5,census_cps_2024.h5andcensus_cps_2023.h5, newest first as before, with their pins, and the Census person archivesasecpub24csv.ziptoasecpub26csv.zip.input_rowslists the new files with the registries' digests and byte counts. Next to its H5 check,check_commitnow also refuses a build commit whoseeducation_assistance_source.pylacks a pooled archive pin.docs/us-modal-stage-route-a-rerun-base-plan.jsonbecomes the next certified build's template. It names a new registration,us-puf-support-base-income-2023-2025, and lists every input in CAS form (volume://cas/sha256/<sha>/<name>) with the registries' digests. Its commit placeholder,PICK_MAIN_COMMIT_FOR_THE_NEXT_CERTIFIED_BUILD, makesvalidaterefuse it until an operator fills it.tools/modal_us_stage_plan.pyaddsAsecPooland builds the base command's input roles and argv from a pool.us-puf-support-base-income-2023-2025runs the rerun registration's command, crosswalk pin and resources on the default pool, plus one seed-only input,asec_weeks_unemployed_zip.us-puf-support-baseandus-puf-support-base-rerunkeep every field but the argv builder, and their builders return the same argv as before, so plans made before this PR still validate on main.tools/route_a/make_local_reference.pyreads the pool from the registration and hashes a seeded input where the local tool read it, in the home cache.Why the years stay written out
d2603's brief asked whether to derive the years or write them out. The driver and the template write them out, and CI holds them to the default pool:
verify_inputs,check_commit) before it creates the build worktree and its venv, so it has no Python to ask.test_route_a_asec_pool.pyfails as soon as the driver's or the template's years leaveASEC_DEFAULT_POOL_INCOME_YEARS, so the PR that pins a newer year has to move Route A too, or say why not.The LKWEEKS sidecar
The base reads the income-2022 Census archive,
asecpub23csv.zip, for weeks unemployed in every mode; it isn't a pooled year. The driver passes no--asec-2023-weeks-unemployed-source, so the base callsfetch_asec_2023_weeks_unemployed_source(), which reads~/.cache/microcosm/cps/asec_2023/, downloads from Census only when the file is missing, and checks the pin. The driver's prefetch stage warms that cache. The older registrations seed it fromasec_education_2022_zip, which the default pool drops, so the new registration stages the same file asasec_weeks_unemployed_zipand seeds the cache from that. Neither path passes the flag, so local and Modal bases record the same run config.ASEC order
The base pools the
--asec-h5years in the order given and records that order in the run context it locks, so the order belongs to the build. Route A keeps newest first (2025, 2024, 2023), as it passed 2024, 2023, 2022 before. The archives stay oldest first.Invariants
Each holds for every input, and
test_route_a_asec_pool.pyexecutes it:ASEC_DEFAULT_POOL_INCOME_YEARS.ASEC_SOURCE_ARTIFACTS,ASEC_EDUCATION_ASSISTANCE_ARCHIVES,ASEC_SPM_ROLE_SOURCESandASEC_PUBLIC_ASSISTANCE_TYPE_AUDIT_PINS.The same file also runs:
check_commitagainst a commit whose registries lack each pooled year's pins in turn, which must report exactly those two blockers;AsecPoolrefusing a repeated year, or archives that don't match the pooled years;us-puf-support-base-rerunwith its 2022-2024 years and pins.#1044's "not affected" note
The PR that set the default pool, #1044, said Route A "reads explicit local paths and is not affected". That held for the driver of its day, which named 2022-2024, and d2603 ends it. The pins doc and the 18 October rerun record (its "ASEC 2025" row) now say so.
The student debt pilot (d2606)
The EqRC hub chose (a) on 9 November: the pilot's base keeps the November build's pool, income years 2022-2024 (ASEC 2023-2025), because d2606's terms come from the November build on that pool, and a new pool would reopen them inside a booking with no room for it. The pilot runs a copy of the driver from the last main commit before this merge, with the pre-merge template on
us-puf-support-base-rerun. EqRC asked that this registration stay unchanged and that the pre-merge template keep validating on main. This PR keeps both, and the fixture test above holds them. EqRC also said the merge need not wait for the pilot.Left alone
us/spec/sources.yamlasec_raw_stage(51e9fafc…, which pools 2022-2024). The spec engine reads it; Route A's base passes no spec and writes its own raw-stage checkpoint. The Microcosm non-dynamics session pins the first default-pool base's checkpoint there once that base exists.CROSSWALK_SHA(c7cb040b…, the historical in-tree file). Each build'sroute_a.envsets the current pin, as the 18 October rerun's did.Tests
b377f7851acrosstest_route_a_asec_pool.py,test_route_a_driver.py,test_route_a_lineage_class_check.py,test_us_route_a_local_reference.py,test_us_modal_stage_puf_support_base.py,test_us_asec_sources.pyandtest_us_modal_stage_plan_tool.py. After the second commit, the three files it touches passed again (220), and the new fixture test passed by node id.ASEC_EDU_2025_SHAand one in the template'sasec_2023_h5digest failed the driver-pin, template-pin, differential andcheck_committests, as they should.9b7a4544band at this head: the pre-merge rerun template and the historical plan parse on both, with identical argv.ruff checkandruff format --checkpass on the changed Python files, andtools/ci_test_plan.py verifypasses.🤖 Generated with Claude Code