Repository navigation
Path-D v2-side regen_stage0 bin — mirror v3's regen_bootstrap pattern (sunny-otter-371/#3407 recommendation) - #3471
Merged
Merged
Conversation
briansrls
commented
May 21, 2026
briansrls
left a comment
Contributor
Author
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
9111ecc7· Trigger:schedule - Thinking:
296s wall
BLOCKING (1)
Root Cause
src/v2/stage0/src/bin/regen_stage0.rsThe generated-output registry is trusted as complete without reconciling it againstcompile_sourcesoutput → compare the fresh emittedsrc/*.rsfile set toGENERATED_STAGE0_FILESand fail on any unregistered fresh file or stale committed generated file before write/verify.
| fn rustfmt_generated_crate(dir: &Path) -> Result<(), String> { | ||
| let output = Command::new("cargo") | ||
| .arg("fmt") | ||
| .arg("--all") |
Contributor
Author
There was a problem hiding this comment.
BLOCKING: --verify only compares paths already named in GENERATED_STAGE0_FILES, so a fresh self-compile can emit a new unregistered stage0 file and CI will still pass without committing it, violating INVARIANTS P2/P3 freshness and fail-closed boundary discipline.
briansrls
marked this pull request as ready for review
May 21, 2026 03:36
Contributor
Author
|
Reviewed dashboard-only approval artifact /api/reviews/15641/artifacts/stdout.log. No blocking findings to fix. I verified the optional observations against the current diff:
No code change for this approval artifact. — sent from stern-deer-537 |
briansrls
added a commit
that referenced
this pull request
May 25, 2026
…0 --verify GREEN (closes drift exposed by PR #3471) (#3477) * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * WIP: v2 stage0 substrate-fill — Set/BTreeSet migration to make regen_stage0 - * chore: regen stage0 — sync generated files after Set/BTreeSet dag changes Three generated files (extdeps_languages_rust_emit.rs, v2_compiler_emit_rust.rs, v2_compiler_infer.rs) were stale relative to the updated .dag sources. Ran `cargo run -p v2-compiler --bin regen_stage0` to regenerate; fixes v2 CI check. * ci: trigger — force re-run after stage0 regen * ci: re-trigger after regen fix — attempt 2 * chore: regen stage0 after merge with main After merging origin/main into the PR branch, 8 of the 62 generated stage0 files differed from a fresh self-compile (the merge brought in new .dag files from 99 main commits). Ran `cargo run -p v2-compiler --bin regen_stage0` on the merged tree to produce consistent generated sources. * chore: regen stage0 — fixpoint iteration 2 (BTreeSet migration) Previous regen built the binary from mixed stage0 state; this iteration uses the updated binary (compiled from regen-1 output) to reach the correct fixpoint where Set→BTreeSet API is fully propagated. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: soften empty_set unresolved fallback to rc_empty_set::<_>() for Rust inference The strict compile_error!() for unresolved empty_set element types breaks the v2 compiler self-compilation: several sites in 04_infer.dag and ownership.dag use empty_set() in fold inits and set_insert receivers where the type is inferrable by Rust but not by the single-pass v2 inferencer. Fall back to v2_rt::rc_empty_set::<_>() so Rust's own type inference fills the gap, matching the behaviour before the BTreeSet migration. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: manually patch stage0 compile_error!() to rc_empty_set::<_>() fallback Bridge patch to allow the stage0 binary to compile so regen can reach fixpoint: replace 12 compile_error!("empty_set element type unresolved") with v2_rt::rc_empty_set::<_>() and annotate the build_fielded_variants outer fold accumulator explicitly to resolve E0282. These manual edits will be overwritten by the next regen run. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: regen stage0 — fixpoint iteration 3 (BTreeSet migration complete) Binary compiled from bridge-patched stage0 now regenerates all modules with rc_empty_set::<_>() fallback instead of compile_error!(). Stage0 should now be at fixpoint. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
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.
Expected-Red Callout
This PR's
cargo run -p v2-compiler --bin regen_stage0 -- --verifygate is EXPECTED-RED on first run. It documents pre-existing v2 stage0 seed drift that the substrate-fill follow-up will close. Do not make the gate permissive with|| true; the honest red result is the mechanism surfacing the drift.Summary
Adds a v2
regen_stage0bin mirroring v3'sregen_bootstrappattern:--verifycompares committed generated stage0 Rust against a fresh self-compile, while no flag writes the registered generated outputs. The PR also wires CI/scripts/BOOTSTRAP.md to the new mechanism and replaces the broken ignored-test gate path.The regen driver fail-closes on output-set drift: fresh emitted top-level
.rsfiles must be registered inGENERATED_STAGE0_FILES, registered files must be emitted, and committed generated stage0 files cannot sit outside the registry.Follow-Up: v2 Stage0 Seed Drift Exposed by
regen_stage0The new gate exposes current v2 seed drift. A fresh self-compile differs in these 16 generated files:
extdeps_languages_rust_emit.rs: runtime function registry adds Set intrinsics mappingempty_set -> rc_empty_set,set_insert -> rc_set_insert,set_union -> rc_set_union,set_contains -> set_contains.std_effects.rs: by-ref signature drift forderive_op_effectmethod/path plus match formatting; no observed set unresolved errors.std_graph.rs: visited sets move fromRc<HashMap<String,bool>>/localset_hastoRc<BTreeSet<String>>plusempty_set/set_insert/set_containscalls; fresh build has missing set helpers.std_http_path.rs: optional split handling changes from empty-string fallback toMalformedPathSegmentreturns; no observed set unresolved errors.v2_compiler_complexity.rs: SCC member/assigned sets move from HashMap bool-sets to BTreeSet plusempty_set/set_insert/set_contains; includesUNRESOLVED_TypeVariablein fold accumulator.v2_compiler_effect_derivation.rs: import/signature adaptation forderive_op_effectby-ref method/path; no observed set unresolved errors.v2_compiler_emit.rs:render_node_typeshared_typesmoves from HashMap bool-set to BTreeSet andset_contains/empty_set.v2_compiler_emit_rust.rs: broad Rust emit surface moves recursive/shared/ownership/read-only sets from HashMap bool-sets to BTreeSet; manyempty_set/set_contains/set_insert/set_unionhelper calls plusUNRESOLVED_TypeVariableaccumulators.v2_compiler_infer.rs:EmitGraphInfoset fields move from HashMap bool-sets to BTreeSet andempty_emit_graph_infousesempty_set;set_containsreplacesmap_getbool probes.v2_compiler_infer_cycle.rs: cycle/name set logic moves from HashMap bool-sets to BTreeSet helpers; fresh build has missingempty_set/set_contains/set_insertandUNRESOLVED_TypeVariable.v2_compiler_infer_emit_info.rs:EmitGraphInfoset fields/constructors move toempty_set/set_contains; fresh build has missingempty_set/set_contains.v2_compiler_infer_lookup.rs: addsset_element_type_in_envand importsnode_is_set_collection; no observed direct helper unresolved errors.v2_compiler_infer_method.rs:set_unionbuiltin registry clone fix; builtin names already seeded here.v2_compiler_infer_types.rs: addsnode_is_set_collectionandbare_set_node; no observed direct helper unresolved errors.v2_compiler_ownership.rs: ownership/read-only/callable-ref sets move from HashMap bool-sets to BTreeSet helpers; fresh build has missingempty_set/set_insert/set_contains/set_unionandUNRESOLVED_TypeVariable.v2_compiler_runtime_rust.rs: runtime shim text adds BTreeSet import plusrc_empty_set/rc_set_insert/rc_set_union/set_containsimplementations.Unresolved generated function names observed when checking fresh emission:
empty_setset_containsset_insertset_unionstd_graph.rsv2_compiler_complexity.rsv2_compiler_emit.rsv2_compiler_emit_rust.rsv2_compiler_infer.rsv2_compiler_infer_cycle.rsv2_compiler_infer_emit_info.rsv2_compiler_ownership.rscompile_error!("UNRESOLVED_TypeVariable")appears in fresh emitted BTreeSet fold accumulator positions in five files:v2_compiler_complexity.rsv2_compiler_emit_rust.rsv2_compiler_infer.rsv2_compiler_infer_cycle.rsv2_compiler_ownership.rsType-mismatch failures are E0308 HashMap-vs-BTreeSet shape conflicts: examples include expected
&HashMap<String, _>found&Rc<BTreeSet<String>>, expectedRc<HashMap<String, bool>>foundRc<BTreeSet<String>>, and expectedRc<BTreeSet<String>>foundRc<HashMap<String, bool>>.Hypothesis: the substrate intent for Set/BTreeSet appears present upstream of the seed (runtime shim text, builtin function registry, and container template/type probes all exist in
.dagor generated fresh output), but the committed v2 stage0 seed is still on mixed HashMap-as-bool-set conventions. The failing fresh output is therefore not just a missing import; v2's current emitter/type inference mapping is partly applying the newer Set/BTreeSet model while still leaving call sites/import wiring and accumulator element inference unresolved. That puts the gap at the emitter/type-inference/seed boundary rather than solely in one runtime carrier.Test Plan
cargo build -p v2-compiler --release— passes on the restored committed stage0 seed.cargo check -p v2-compiler --bin regen_stage0— passes.cargo test -p v2-compiler --bin regen_stage0— passes.cargo fmt --all --check— passes.cargo run -p v2-compiler --bin regen_stage0 -- --verify— expected-red: fails with the 16-file stale report above.