Repository navigation
Every v1-compiler binary target compiles — a standing derived from the manifest, after the floor - #9196
Conversation
witnesses.yml builds 2 of the 16 bin targets v1-compiler declares, so 14 are absent from the build selection and nothing required compiles them. Combined with the Rust suite removed from CI 2026-07-11, clippy 2026-07-08, and the compile-clean gate deleted in the floor cut, a bin can go stale silently -- and one had: #8952 added authored_import_names to TypeEnv without updating infer_semantics_witness, leaving main red at 'cargo check -p v1-compiler'. That specimen is being repaired separately in #9205; this is the standing that stops the next one. Two populations were answered by one roster: RuntimeArtifactPopulation -- the executables this job RUNS (claim_executor, gunbc) BinaryCompilePopulation -- every bin target the manifest DECLARES witness_floor_required_bins is correct as the first and is left alone. Derived, not a second roster: the step calls repo_self_build_command(bins: []), whose no-selector form gunbc.repo_self_build already documents as cargo's meaning for 'build every target'. A new [[bin]] joins the standing with no edit anywhere, and no new argv word is minted. Build rather than check, decided by measurement: from a cold target dir with the two-bin build already paid, building every target cost 12s against 52s for 'cargo check --release --bins', and it additionally links. Placed LAST, after the fold and the roster uploads, guarded by !cancelled(): ahead of the fold it would be a preparation mask, and an auxiliary compile error would take the floor's ledger with it.
4db9261 to
c896d83
Compare
The failing check is this PR working, not this PR broken — please do not "fix" itAutomated notice says CI is failing at This PR adds a step that compiles every binary target The repair for that specimen is #9205 (operator-authored, one file). This PR deliberately does So this stays red until #9205 lands, and then goes green with no change to this branch. Holding That the guard does not simply fail-always is established separately, by execution: on run — sent from loyal-dove-837 |
# Conflicts: # .github/workflows/witnesses.yml # dag/gunbc/witness_floor_workflow.dag
…rror Main tip 151e771. ONE conflicting path: the generated mirror src/v1/stage0/src/v1_compiler_infer.rs. src/v1/04_infer.dag (+104 from main) and cli_run.rs (-373 from main) both AUTO-MERGED, verified by a tree-wide grep for conflict markers returning only the mirror. THE MERGE DRIVER DID NOT FIRE, and that is the second time on this PR. It is enrolled by BASENAME while the population is defined by a HEADER, so it protects 2 of 136 stage0 mirrors and v1_compiler_infer.rs is outside it. On #9196 the same driver DID refuse a generated .yml and printed the regeneration recipe; here git left ordinary conflict markers and would have accepted a hand-resolution. REGENERATED, NOT HAND-RESOLVED -- and the binary vintage mattered, measurably: binary built from f57bc0e (pre-merge): drift = extdeps_uri.rs, v1_compiler_compile.rs, v1_compiler_infer.rs, v1_rt.rs (4) binary built from the MERGED tree: drift = v1_compiler_infer.rs (1) Same tree, two binaries. Three of the four were EMITTER VINTAGE, not tree drift: this diff touches inference and has nothing to do with extdeps_uri.rs or v1_rt.rs. Installing the first candidate would have written an old emitter's bytes over mirrors main had already advanced -- silently, and it would have read as a clean regen. A drift list wider than the change is a claim about the instrument. So the recipe's order is wrong when the binary predates the merge: REBUILD FIRST, then regenerate once. The binary was dated before use -- it now accepts --required-lane and routes phases by lane, which the pre-merge one rejected. RECEIPTS, from a rebuild off the installed seed: required-regen: first_generation_equal=true planned=135 executed=135 declared_divergent=1 [main.rs] installed sha256 12110f0a3dc440ef... recorded BEFORE the confirming run and re-emitted identically by the rebuilt binary; diff -rq shows no other file differing. v1_src_dag_parse: 3998 file(s) parse-clean. The three #9192 functions stay 1/1 dag-to-rs: select_formal_for_call_argument, call_argument_formal_at_position, call_formal_claimed_by_a_label.
Adds one standing to
witnesses.yml: every binary targetv1-compilerdeclares must compile.The gap
witnesses.ymlbuilds two targets:The manifest declares 16
[[bin]]targets (gunbc, plus 15 undersrc/bin— the manifest isthe denominator, not the directory listing), so 14 are absent from the build selection. With
the Rust suite removed from CI 2026-07-11, clippy 2026-07-08, and the compile-clean gate deleted in
the floor cut, no required phase compiled any of those 14.
The mechanism deserves its own words: a field was added to an authority and its hand-maintained
callers were not updated, because nothing compiles them. A
.dagcaller would have refused loudlyat resolve. A Rust mirror has no such wall once nothing invokes rustc on it — silent staleness,
not a refused closure.
Historical positive specimen (recorded here because #9205 repairs it and the live evidence then
disappears): at main
f84c91b774a,#8952had addedauthored_import_namestoTypeEnvwithoutupdating
infer_semantics_witness, whose six syntheticTypeEnvconstructions failedE0063.Measured, same command both arms:
origin/main→ exit 101, 6 ×E0063; with the field set →exit 0. The repair is #9205's; this PR is the standing that stops the next one.
Two populations, one of which had no answer
RuntimeArtifactPopulationclaim_executor,gunbcBinaryCompilePopulationwitness_floor_required_binsis the first and is left untouched — the rule above it ("naming abinary that no step runs buys nothing and costs a compile") is about artifact production and stays
intact. Nothing answered the second.
Derived from the manifest — and no new argv word
The step calls
repo_self_build_command(bins: []).gunbc.repo_self_buildis the single authorityfor how this repository builds itself, and its note instructs reviewers to refuse a new argv word
the modeled surface already owns —
--binsis one. It is also unnecessary:repo_self_build_empty_bins_notealready records that an empty bin set renders the no-selectorpackage build, which is cargo's own meaning for "build every target in the package." So the
population is derived from Cargo, a new
[[bin]]joins the standing with no edit anywhere, and nosecond cargo authority is minted.
Build, not check — decided by measurement
From a cold
CARGO_TARGET_DIRwith the two-bin build already paid (CI's starting state):cargo check --release --binscargo build --release(every target)Cheaper and strictly stronger, so there was no tradeoff to split. Verified 5/5 named binaries
present on disk afterwards — including the previously unbuilt
v1_src_dag_parse,parse_witnessand
infer_semantics_witness— because a no-op and a successful link produce the same exit codeand the same silence.
Placement: last, and that is the load-bearing part
Ahead of the fold this step would be a second preparation mask — an auxiliary target failing to
compile would stop the job before the floor ran, and
planned/executed/terminalwould vanish behindan unrelated compile error. It runs after the fold and after the three roster uploads, guarded
only by
!cancelled()so a red floor still reaches it. Either standing may red the workflow;neither may stop the other publishing its evidence.
Discriminating receipt — run
32873753939Not asserted; executed. One field removed from one
TypeEnvinitializer in a bin outside theruntime pair, then a real
workflow_dispatchrun:The floor published a complete ledger while the new step failed:
and the failure names the binary:
Exactly one error, not six — the other five sites were intact, so the planted mutation is the
sole cause rather than a coincidental break. That is the guard adding binary-target coverage
without becoming a preparation mask, which is the specific risk of putting a compile step in
this workflow at all.
What this establishes, and what it does not
Establishes: every declared
v1-compilerbinary target compiles and links under the releaseprofile. Does not: that any of them runs correctly, and nothing about test targets — this
command does not build them.
Not claimed: that the other 14 are permanently safe. They compile at this commit; the standing
is what makes that true tomorrow.
The guard's own before/after, across one external event
The strongest evidence a guard can offer is a state transition it did not author. This one has it,
and the boundary is an exact commit rather than a time window.
f84c91b77— beforefa31aaee56c32878478753src/v1/stage0/src/bin/infer_semantics_witness.rsat 317, 1040, … withE0063: missing field authored_import_namesfa31aaee56c— #9205's merge commit32890178823fa31aaee56cis #9205, which added the missing field at all sixTypeEnvconstruction sites inthat bin. Zero commits on this branch changed the guard between those two runs — the only
variable that moved is the base, and it is named.
Verified rather than inferred:
git merge-base --is-ancestor fa31aaee56c f84c91b77returnsnon-zero, so the earlier run provably could not see #9205. Both earlier runs on this PR predate it
by 1h33m and 17m respectively — that red was inherited, not a finding.
The step is confirmed to have executed in the green run, not skipped:
Two independent demonstrations, not one. Beside the transition above, run
32873753939planted a mutation —one field removed from one of the six sites, in a bin outside the two-bin pair — and the arm
reported exactly one error rather than six. Discriminating, not merely correlated.
A guard authored after its subject was fixed can never show either of these.