Skip to content

Fixture-callable emitted-crate compilation: a witness route that reaches rustc over an emitted fixture closure (unblocks enrolling meaning-level emitter discriminators) - #9963

Closed
gunbai-bot[bot] wants to merge 6 commits into
mainfrom
session/proud-moth-614

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session proud-moth-614.
Pushing to session/proud-moth-614 advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

gunbc-ci-auto-heal and others added 6 commits September 1, 2026 09:36
…c over an emitted fixture closure

A witness can already compile an in-memory .dag source and assert on the emitted
TEXT (compile_dag_rust_emit_check). That is a SPELLING oracle: a meaning-level
emitter defect is invisible to it whenever the wrong bytes still contain the
right substring, and it is exactly what rustc's type checker refuses.
emitted_closure_compile_host does reach rustc, but only over the entry files its
roster names, so no fixture-authorable subject could be posed to it at all.

fixture_closure_rustc_verdict closes that: the same in-memory source shape,
emitted through the same compile_sources, written by the SAME crate writer
(write_probe_crate_files, factored out of write_probe_crate) and handed to the
SAME run_cargo -- so a green here and a green in the required phase cannot be
two facts about two crates. run_cargo's attribution symbol becomes the caller's,
because the required phase attributes its own injected fault while this route
attributes a red to the fixture's own emitted module.

Executed, both directions, on the real path:
  control  fixtures/fixture_closure_rustc/green_probe.dag           cargo status=0
  red      fixtures/fixture_closure_rustc/text_nonliteral_probe.dag cargo status=101
           E0308 expected `Rc<im::Vector<i64>>` found `std::string::String`
           at src/fixture_closure_rustc_text_nonliteral_probe.rs:13:5
The red is the fixture gunbc.rung_drop text_boundary_identity_wall names; that
row's emitted-Rust claim now has an executing probe rather than a sentence. No
rung is claimed here and no class changes rung.

NOT A GATE, stated positively: --required-emit-compile is not among
REQUIRED_CI_PHASES and no workflow invokes it, so what this enrolls is green by
execution and blocks nothing.

v1 growth admitted under the DESIGN section 3 PURPOSE test by the owning manager:
it adds no new host CAUSE, only a second entry point over a source shape the tree
already accepts. Dissolution is the trigger emitted_closure_compile_seed_growth
already carries -- a modeled write-file-set and invoke-cargo actuation -- which
does not exist yet, and that finding is the more important half.

Files: fixture_closure_rustc_verdict + FixtureClosureOutcome (gunbc's own refusal
stays separate from a rustc verdict), per-arm diagnostics, the enrolled pair, and
claim_executor's --fixture-closure-compile (report, do not adjudicate: a red is
one arm of someone else's discriminator) and --fixture-closure-pair (adjudicate:
here the pair is the subject). Seed-growth roster re-derived exact at 74/74.
Class row filed: instrument_reenters_its_own_build_tool.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HoAvoacTJ3UVqBhBSfCYZh
--fixture-closure-compile counted only CrateNotWritten as unanswered, so it
exited SUCCESSFULLY on a fixture gunbc refused (SourceRefused) and on a cargo
run that never finished (DidNotComplete). Neither carries a rustc verdict, so
the mode could report success without reaching rustc -- the fail-open DESIGN
section 5 forbids, and a direct contradiction of the contract written three
lines above it: "only an arm the route could not answer stops the line". The
code enumerated one of the three arms that cannot answer.

THE REPAIR IS A PREDICATE BESIDE THE CARRIER, not a widened matches! at the call
site: the defect was a caller enumerating a subset of the arms, and a second
caller would enumerate a different subset. fixture_closure_reached_rustc is true
only for a cargo run that COMPLETED and reported its own exit status. A red is
reached -- rustc ran and refused, which is half of what a discriminator is for.
SourceRefused, CrateNotWritten, NotAttempted and DidNotComplete are not.
fixture_discrimination_passed's red arm now goes through the same predicate.

EXECUTED, BOTH DIRECTIONS, in one run:
  arm gunbc refuses  SourceRefused hard=1 ... 'definitely_not_a_declared_callable'
                     REFUSED ARM EXIT=1   (exited 0 before this commit)
  enrolled pair      control status=0, red status=101, E0308 attributed
                     pair PASSED, PAIR EXIT=0
So the refusal is real and was not bought by breaking the route.

cargo clippy --all-targets -- -D warnings exits 0. Seed-growth roster re-derived
exact at 75 declarations / 75 rows, zero stale, zero unaccounted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HoAvoacTJ3UVqBhBSfCYZh
…m and the ledger row built on it

TWO THINGS: a retraction, and the rework the approval's conditions required.

THE RETRACTION. This branch asserted that a cargo-test-hosted consumer DEADLOCKS -- that a
test binary launched by cargo, spawning cargo at the same target directory, blocks on the
outer lock. THAT IS FALSE AND WAS NEVER MEASURED. It was inferred from a 30-minute run that
produced no output and was terminated. Measured properly, from inside a cargo-launched test:

  elapsed=215.076672126s  status=Some(0)  blocking_line=None

It COMPLETED. Cargo never emitted a Blocking line because it never waited for one. The
original silence was an ordinary rebuild: an inner `cargo build --release` from an outer
`cargo test --release` does not share fingerprints, so it recompiles part of the dependency
graph before reaching the emitted closure. Two long builds in series, working throughout.
The run was piped through `tail`, which destroyed the interim visibility that would have
shown it.

WHAT THAT FALSIFIES, AND WHAT IS DONE ABOUT EACH:
- gunbc.recurring_failure_mode instrument_reenters_its_own_build_tool -- a class row filed
  and pushed on this specimen, claiming 'it does not fail; it BLOCKS'. DELETED, not amended:
  per unbacked_execution_claim's own remedy arms, an assertion that was NEVER BACKED is
  deleted rather than past-tensed, because there is no past to record. A recognition rule
  firing on an unreproducible mechanism routes every future reader to the wrong repair, in a
  ledger whose entire purpose is rules that hold. Both projections drop it.
- The seed-growth paragraph asserting it: replaced by the falsification IN THE PAST TENSE
  with the numbers, so the next author cannot re-infer it from a deleted sentence.

THE REWORK, to the approval's bounded conditions:
- Both CLI flags (--fixture-closure-compile, --fixture-closure-pair) and the
  --required-emit-compile conjunct are REMOVED. No new CLI surface, no phase variant.
- Every route item is #[cfg(test)] pub(crate) behind its own `use`, kept OUT of the
  production re-export: a production re-export would put these on the emitted seed's
  exported surface, which is PublicSurfaceGrowth against a seed frozen for growth.
- The discriminator is authored in v1.compiler.compiler_tests_rust and emitted into
  compiler_tests.rs through the seed's own generator -- not hand-written into the
  projection. required-regen reaches its fixed point (first_generation_equal=true).
- The carrier's known-FALSE claim that nothing under #[cfg(test)] executes on the merge path
  is corrected: rust-unit-tests runs repo_self_test_command on every push and PR.

THE HONEST GRAIN OF THE EVIDENCE, stated identically in carrier, PR and rung claim: the
discriminator is ENROLLED AND AVAILABLE via `-- --ignored`; it DOES NOT EXECUTE BY DEFAULT
(it spawns cargo and compiles two emitted crates); rust-unit-tests is not a `needs` of the
required aggregate, so even un-ignored a red there would not block through the required
context. Candidate evidence, reviewable on demand, NO WALL. An #[ignore] is a cost decision
and NOT a rung, and nothing here may be cited as merge-path coverage. It therefore does not
discharge any next-rung trigger naming this capability.

Seed-growth roster re-derived after the visibility change rather than carried forward:
75 declarations, 75 rows, zero stale, zero unaccounted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HoAvoacTJ3UVqBhBSfCYZh
… 58151)

The rework withdrew the --fixture-closure-compile and --fixture-closure-pair modes under the
approval's test-facing-visibility condition. THE PROSE DESCRIBING THEM SURVIVED THE CODE BY ONE
REVISION: current_boundary still listed both modes, the carrier still said the pair "runs inside
claim_executor --required-emit-compile ... and its verdict JOINS that mode's exit status", and
fixture_closure_reached_rustc's docstring still attributed its fail-open repair to a
--fixture-closure-compile call site. None of that is in the tree -- `grep fixture-closure
src/v1/stage0/src/bin/claim_executor.rs` returns nothing. Specification pointing at wiring that
does not exist is exactly the class this file's receipts are supposed to prevent.

THE CITATIONS ARE CORRECTED RATHER THAN THE WIRING ADDED, because the modes are forbidden by the
condition that removed them:
- current_boundary now names the real consumer: v1.compiler.compiler_tests_rust
  ct_fixture_closure_rustc_discrimination_test and its emitted form in compiler_tests.rs.
- The WHERE IT EXECUTES paragraph now states the actual grain -- one #[ignore]d consumer,
  available via `-- --ignored`, not executing by default, rust-unit-tests outside the required
  aggregate, candidate evidence and no wall, discharging no next-rung trigger.
- fixture_closure_reached_rustc's docstring says the specimen caller was a CLI mode SINCE
  WITHDRAWN and keeps the reason the predicate stays: the defect was a caller enumerating a
  SUBSET of the arms that cannot answer, and the next caller would enumerate a different subset.
- The module header states the route has exactly one consumer, reaches no CLI flag and no
  required phase, and is not on the emitted seed's public surface.

The withdrawal is RECORDED in the carrier rather than silently rewritten, naming both modes and
review 58151, because a receipt that quietly changes what it certifies is worse than one that was
wrong once -- which is this file's own standing argument.

Seed-growth roster re-derived: 75 declarations, 75 rows, zero stale, zero unaccounted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HoAvoacTJ3UVqBhBSfCYZh
Review 58161 read `import v2.std.text { string_is_empty }` in the red fixture as dead weight:
the binding is never mentioned again, and the red is `concat("x","y")` at the return boundary.
Every reader will have that instinct, so the answer is measured and written down rather than
argued.

THE IMPORT IS THE MECHANISM. `v1_compiler.cli_run` `resolve_virtual_source_with_imports` builds
this fixture's source set ONLY by following import statements transitively, so the import is the
single thing that puts v2.std.text into the resolved closure. Run the route on this file with the
import stripped:

  WITHOUT IMPORT => SourceRefused hard=1
    UnresolvedType { name: "v2.std.text.String" } | reached_rustc=false

So deleting it does not tidy the fixture -- it converts the red arm from a RUSTC VERDICT into a
GUNBC REFUSAL and destroys the discrimination, while looking like cleanup. That is the failure
shape this lane keeps meeting: a change that reads as obviously right and inverts what the code
does.

THE WALL HOLDS IF ANYONE DOES IT ANYWAY, which is worth stating because it is the fail-closed
repair from review 58120 doing its job: fixture_closure_reached_rustc refuses to count an arm
that never reached rustc, so the pair goes red rather than passing on a refusal. The annotation
exists so the wall is not hit in the first place.

No code change; the fixture gains the note and the measurement that produced it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HoAvoacTJ3UVqBhBSfCYZh
…ition

A decision to NOT RUN something goes silently stale: read in six months, an #[ignore] with no
reasoning beside it is indistinguishable from neglect. So the carrier now carries the number, the
argument and the condition that re-opens it.

MEASURED, one runner, one run, warm target dir so the figures are comparable:
  discriminator alone   184.65s  (test result: ok, pair PASSED)
  default --lib suite   456.28s  (what runs on every push and PR)
  => un-ignoring is ~+40% on that suite, fleet-wide, per push.
NOT measured cold, stated rather than estimated. The 185s is two emitted-crate cargo builds --
6-file and 17-file closures, both linking the seed crate -- so it is rustc doing the work that
makes the arm mean anything, not test logic, and it cannot be optimised away without removing
the subject.

THE ARGUMENT IS A RUNG ARGUMENT, NOT A COST ONE. Un-ignoring moves this from AVAILABLE to
EXECUTES-ON-A-NON-BLOCKING-JOB, which is a real honesty improvement and still not an acceptance
path, because rust-unit-tests is not a `needs` of the required aggregate. DESIGN 4b(1) establishes
a rung by evidence executing on the real acceptance path, so BOTH STATES LEAVE A TRIGGER NAMING
THIS CAPABILITY UNFIRED. The ignore costs nothing in rung terms and saves 40% of a per-push suite.

REVERSAL CONDITION, named so this is re-decided rather than inherited: when rust-unit-tests is
promoted into the required aggregate, cost and WALL arrive together and this trade no longer
holds. Nothing else reverses it -- not a faster suite, not a bigger roster, and not a lane
wanting to cite this as coverage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HoAvoacTJ3UVqBhBSfCYZh
@gunbai-bot

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Closing: zero-delta duplicate of the merged #9911 (2b56084). Verified by the decisive test rather than by a raw diff — merging this branch produces tree 9cd5687a52, byte-identical to current main's tree, so it adds nothing. The branch appearing 'ahead' is the stale merge base left by the squash, not unlanded work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants