From 8748a4db00754e7296bbbb5977c8dc31e7e6fc58 Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Tue, 25 Aug 2026 15:56:15 +0000 Subject: [PATCH 1/4] Set authored_import_names at the six synthetic TypeEnv sites in infer_semantics_witness The field was added to TypeEnv by #8952 and its hand-maintained callers in this bin were never updated, because nothing compiles them: witnesses.yml builds two of fifteen bins, the Rust suite left CI 2026-07-11, clippy 2026-07-08, and the compile-clean gate went with the floor cut. So main has been red at 'cargo check -p v1-compiler' with no required phase that could notice. All six sites already set the sibling source_visible_names to an empty map -- these are synthetic envs, not module envs -- so the empty map is the established value at this shape rather than a choice made here. MEASURED, same command and same base, discriminating both ways: origin/main cargo check -p v1-compiler --bins -> exit 101, 6 x E0063 origin/main + this fix cargo check -p v1-compiler --bins -> exit 0, Finished The --bins scope also measures the other twelve unbuilt binaries: all of them compile. The class is thirteen unguarded bins, of which exactly one had gone stale. --- src/v1/stage0/src/bin/infer_semantics_witness.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/v1/stage0/src/bin/infer_semantics_witness.rs b/src/v1/stage0/src/bin/infer_semantics_witness.rs index cf6ec53032a..0233da9bf29 100644 --- a/src/v1/stage0/src/bin/infer_semantics_witness.rs +++ b/src/v1/stage0/src/bin/infer_semantics_witness.rs @@ -326,6 +326,7 @@ fn empty_type_env() -> Rc { source_indices: Rc::new(im::HashMap::new()), intern_table: v1_compiler::v1_std_core::empty_intern_table(), source_visible_names: Rc::new(im::HashMap::new()), + authored_import_names: Rc::new(im::HashMap::new()), symbol_index: v1_compiler::v1_compiler_infer_env::empty_symbol_index(), }) } @@ -1049,6 +1050,7 @@ fn optional_match_exhaustiveness_reports_missing_absent() { source_indices: Rc::new(im::HashMap::new()), intern_table: v1_compiler::v1_std_core::empty_intern_table(), source_visible_names: Rc::new(im::HashMap::new()), + authored_import_names: Rc::new(im::HashMap::new()), symbol_index: v1_compiler::v1_compiler_infer_env::empty_symbol_index(), }), zero_span(), @@ -1077,6 +1079,7 @@ fn optional_match_exhaustiveness_rejects_some_and_none() { source_indices: Rc::new(im::HashMap::new()), intern_table: v1_compiler::v1_std_core::empty_intern_table(), source_visible_names: Rc::new(im::HashMap::new()), + authored_import_names: Rc::new(im::HashMap::new()), symbol_index: v1_compiler::v1_compiler_infer_env::empty_symbol_index(), }), zero_span(), @@ -1105,6 +1108,7 @@ fn optional_match_exhaustiveness_accepts_present_and_absent() { source_indices: Rc::new(im::HashMap::new()), intern_table: v1_compiler::v1_std_core::empty_intern_table(), source_visible_names: Rc::new(im::HashMap::new()), + authored_import_names: Rc::new(im::HashMap::new()), symbol_index: v1_compiler::v1_compiler_infer_env::empty_symbol_index(), }), zero_span(), @@ -1238,6 +1242,7 @@ fn resolve_node_uses_node_name_for_lookup() { source_indices: Rc::new(im::HashMap::new()), intern_table: user_intern.table.clone(), source_visible_names: Rc::new(im::HashMap::new()), + authored_import_names: Rc::new(im::HashMap::new()), symbol_index: v1_compiler::v1_compiler_infer_env::empty_symbol_index(), }); @@ -1941,6 +1946,7 @@ fn resolve_applied_generic_struct_expands_to_conj_for_field_lookup() { source_indices: empty_source_indices(), intern_table: box_intern.table.clone(), source_visible_names: Rc::new(im::HashMap::new()), + authored_import_names: Rc::new(im::HashMap::new()), symbol_index: v1_compiler::v1_compiler_infer_env::empty_symbol_index(), }); From b2bd3c011b2f3e5cc4658e4702004f4b7a42fdde Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Tue, 25 Aug 2026 16:21:53 +0000 Subject: [PATCH 2/4] Add the all-binary-targets standing after the floor --- dag/gunbc/witness_floor_workflow.dag | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/dag/gunbc/witness_floor_workflow.dag b/dag/gunbc/witness_floor_workflow.dag index b87f045612c..8869bee38e4 100644 --- a/dag/gunbc/witness_floor_workflow.dag +++ b/dag/gunbc/witness_floor_workflow.dag @@ -669,10 +669,70 @@ fn witness_floor_bound_steps() -> List { role: capability_neutral, step_name: "Upload the long-home storage agreement", }, + WitnessFloorBoundStep { + step: witness_floor_all_binary_targets_step(), + role: capability_neutral, + step_name: "Every v1-compiler binary target compiles", + }, ], ) } +// EVERY BINARY TARGET COMPILES, AND IT IS A SECOND STANDING RATHER THAN A WIDER BUILD STEP. +// Two populations were being answered by one roster and only one of them was ever authored: +// RuntimeArtifactPopulation -- the executables this job RUNS: claim_executor and gunbc. +// BinaryCompilePopulation -- every bin target v1-compiler DECLARES. +// witness_floor_required_bins is the first and is correct as the first; the rule above it +// ("naming a binary that no step runs buys nothing and costs a compile") is a rule about +// ARTIFACT PRODUCTION and stays intact. What was missing is that nothing answered the second, +// so a bin outside the runtime pair could stop compiling and no required phase would notice. +// +// MEASURED SPECIMEN THAT PRICED THIS STEP: #8952 added `authored_import_names` to TypeEnv and +// did not update `infer_semantics_witness`, whose six synthetic TypeEnv constructions then +// failed E0063. Main stood red at `cargo check -p v1-compiler` and nothing could see it -- the +// Rust suite left CI 2026-07-11, clippy 2026-07-08, the compile-clean gate went with the floor +// cut, and this job builds two of sixteen declared targets. A .dag caller would have refused +// loudly at resolve; a Rust mirror has no such wall once nothing invokes rustc on it, so the +// exposure is SILENT STALENESS rather than a refused closure. +// +// NO NEW ARGV WORD, AND THAT IS DELIBERATE. gunbc.repo_self_build is the single authority for +// how this repository builds itself and its note instructs reviewers to refuse a new argv word +// the modeled surface already owns. An empty bin set already renders the no-selector package +// build, which repo_self_build_empty_bins_note records as cargo's own meaning for "build every +// target in the package" -- so the population is DERIVED from the manifest and a new [[bin]] +// joins this standing with no edit here. +// +// BUILD RATHER THAN CHECK, DECIDED BY MEASUREMENT AND NOT BY PREFERENCE. From a cold target dir +// with the two-bin build already paid, the marginal cost of building every target was 12s +// against 52s for `cargo check --release --bins`, and the build additionally LINKS. Cheaper and +// strictly stronger, so there is no tradeoff to split: check would have bought less for more. +// Re-derive with a fresh CARGO_TARGET_DIR, the two-bin build, then this command. +// +// PLACEMENT IS THE LOAD-BEARING PART AND IT IS LAST ON PURPOSE. Ahead of the fold this step +// would be a preparation mask: an auxiliary target failing to compile would stop the job before +// the floor ran, and the planned/executed/terminal ledger -- every semantic measurement this +// job exists to publish -- would vanish behind an unrelated compile error. It therefore runs +// AFTER the fold and after the roster uploads, guarded only by `!cancelled()` so a red floor +// still reaches it. Either standing may red the workflow; neither may stop the other from +// publishing its evidence. +// +// WHAT IT ESTABLISHES: every declared v1-compiler binary target compiles and links under the +// release profile. WHAT IT DOES NOT: that any of them RUNS correctly, and nothing about test +// targets, which this command does not build. +fn witness_floor_all_binary_targets_step() -> Step { + RunStep { + name: Present { value: "Every v1-compiler binary target compiles" }, + id: Present { value: "build_all_binary_targets" }, + run: concat(repo_self_build_command(bins: []), "\n"), + shell: none, + env: none, + working_directory: none, + if_condition: Present { value: "!cancelled()" }, + continue_on_error: none, + timeout_minutes: none + } +} + fn witness_floor_steps() -> List { list_map(xs: witness_floor_bound_steps(), f: fn(b) { b.step }) } From 4db9261e592a517ae2c0580f9850ab55338d46b1 Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Tue, 25 Aug 2026 16:43:43 +0000 Subject: [PATCH 3/4] Regenerate witnesses.yml for the all-binary-targets standing --- .github/workflows/witnesses.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/witnesses.yml b/.github/workflows/witnesses.yml index 7c6f9b17aa0..edae2751e49 100644 --- a/.github/workflows/witnesses.yml +++ b/.github/workflows/witnesses.yml @@ -76,3 +76,8 @@ jobs: if-no-files-found: error retention-days: 14 if: "!cancelled() && steps.build_witness_fold.outcome == 'success'" + - name: Every v1-compiler binary target compiles + id: build_all_binary_targets + run: | + cargo build --release -p v1-compiler + if: "!cancelled()" From fd8bb6de57ade6cc6686cf140adfa5d1aea70af3 Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Tue, 25 Aug 2026 16:43:59 +0000 Subject: [PATCH 4/4] PLANTED MUTATION, DO NOT MERGE: drop authored_import_names at one site to prove the new all-binary-targets step fails while the floor still publishes its ledger --- src/v1/stage0/src/bin/infer_semantics_witness.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/v1/stage0/src/bin/infer_semantics_witness.rs b/src/v1/stage0/src/bin/infer_semantics_witness.rs index 0233da9bf29..6fa58d0e3cb 100644 --- a/src/v1/stage0/src/bin/infer_semantics_witness.rs +++ b/src/v1/stage0/src/bin/infer_semantics_witness.rs @@ -1050,7 +1050,6 @@ fn optional_match_exhaustiveness_reports_missing_absent() { source_indices: Rc::new(im::HashMap::new()), intern_table: v1_compiler::v1_std_core::empty_intern_table(), source_visible_names: Rc::new(im::HashMap::new()), - authored_import_names: Rc::new(im::HashMap::new()), symbol_index: v1_compiler::v1_compiler_infer_env::empty_symbol_index(), }), zero_span(),