Repository navigation
#9886's second symptom: shell_service_unmodeled_output_key_refuses asserted the pre-wall shape - #10029
Closed
gunbai-bot[bot] wants to merge 1 commit into
Closed
#9886's second symptom: shell_service_unmodeled_output_key_refuses asserted the pre-wall shape#10029gunbai-bot[bot] wants to merge 1 commit into
gunbai-bot[bot] wants to merge 1 commit into
Conversation
…serted the pre-wall shape Part 1 of the main-is-red item. #9886 produced ONE root cause with TWO symptom classes, and #10017 closed the first. This closes the second. No emitter changes. WHAT WAS RED. `cargo test --release -p v1-compiler --lib` on main: 642 passed, 2 failed. Both failures are in the GENERATED src/v1/stage0/src/compiler_tests.rs. render_rust_applied_type_routes_qualified_base_through_leaf_name -- ALREADY FIXED by #10017, verified here rather than assumed. #9886's stale mirror deleted two lines from the TEST BODY, `env_value.unit_variant_index_observed = true` and the same on populated_env_value. Counting that string across the three refs gives fb481ae=2, 4059156=0, 52aac48=2. Without the observed flag the env carries no unit-variant evidence, so render_rust_applied_type CORRECTLY refused with a located compile_error! instead of emitting i64. The emitter was right and the regenerated test was wrong. shell_service_unmodeled_output_key_refuses -- what this commit fixes. It is a test #9886 ADDED, and #10017's mirror repair never touched it, so it is a separate defect rather than a second face of the stale mirror. WHY IT WAS UNSATISFIABLE THE DAY IT LANDED. It did `.find(|f| f.path == "src/probe.rs").expect("service module must emit src/probe.rs")` and then looked for the refusal text INSIDE that file. No such file exists, by construction: v1.compiler.compile emit_artifact returns `EmitResult { files: [], diagnostics: unmodeled_transports }` when a transport diagnostic fires -- the empty file list is PAIRED with a blocking diagnostic, not standing alone. §5 was already satisfied; the compile refuses, typed (TransportEmissionNotModeled) and located (span: ch.span, at the FIELD, with the individual key in missing_realization_fact). #9886 wrote the wall and the test in one PR, and the test asks for the shape the wall replaced. THE SHAPE IT ASKED FOR IS A FILED DEFECT CLASS, twice over, which is why the fix is not to make the emitter emit the file. - gunbc.recurring_failure_mode `accepted_source_emits_uncompilable_target`: "the .dag graph is the authority and Rust is one realization, so 'rustc catches it' is exactly the outsourcing this project exists to end." - 05_emit.dag's own annotation records that this exact shape was TRIED and filed as `refusal_deferred_to_emitted_runtime`: "7 files emitted, 0 diagnostics beside a panic!(): the line did not stop, the compile reported success, and the refusal was deferred to a runtime nobody reads until production." WHAT THE TEST NOW ASSERTS -- through the wall, not about the bytes: 1. an error diagnostic of variant TransportEmissionNotModeled exists 2. its rendered message names `not_a_channel` AND `has no modeled channel` 3. no `src/probe.rs` among r.files -- the line STOPPED rather than reported and continued 4. no emitted file anywhere contains `stdout.clone()` -- #9886's own fall-through assertion, widened from one file to all of them Its positive control is the sibling shell_service_output_projection_binds_each_ declared_channel: same fixture with every key modeled, zero diagnostics, src/probe.rs emitted. So "no file" here is the refusal firing and not an emitter that never emits for services. RED CONTROLS, EXECUTED, in an isolated detached worktree so nothing here was edited mid-run. Two mutations of the seed, each rebuilt and run: - delete the wall's diagnostic (unmodeled_shell_transport_diagnostics returns []): conjunct 1 goes RED, "must refuse with TransportEmissionNotModeled. Got: []". - remove only the line-stop in emit_artifact, then neutralise conjuncts 1 and 2 so the mutant is judged by the file conjunct alone: conjunct 3 goes RED with ["Cargo.toml", "src/lib.rs", "src/main.rs", "src/probe.rs", "src/v1_rt.rs", "src/dry_run.rs", "src/emitted_population.rs"] -- seven files emitted, which is the ledger's recorded pre-wall shape reproduced by execution. So neither the typed-refusal half nor the line-stop half is a passenger. AUTHORITY ONLY. The edit is src/v1/compiler_tests_rust.dag; the two .rs files are its regeneration and were installed from the candidate tree, never hand-edited. Regenerated across BOTH generations, since compiler_tests.rs is rendered from the running seed's baked string: regen -> install v1_compiler_compiler_tests_rust.rs -> REBUILD claim_executor (grep of the new binary confirms it bakes the new string) -> regen -> install compiler_tests.rs -> regen, which reports `first_generation_equal=true planned=150 executed=150 adjudicated=150`. The rebuild is the load-bearing step: a regen that greened against the file it just wrote would prove nothing. Neither 05_emit_rust.dag nor 04_resolve.dag is touched, so the two lanes working in those files are unaffected. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VSP89XiSm2YMnUvSwSR1ct
Contributor
Author
|
Superseded by #10025 — same fix, and it reads The executed mutation controls from this branch are posted on #10025 (#10025 (comment)) — they are evidence about the two walls, not about either diff, so they apply there unchanged. — sent from sunny-gull-270 |
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.
Part 1 of the main-is-red item. #9886 produced ONE root cause with TWO symptom classes, and #10017 closed the first. This closes the second. No emitter changes — a reviewer should not go looking for a behaviour change.
What was red
cargo test --release -p v1-compiler --libon main: 642 passed, 2 failed. Both are in the GENERATEDsrc/v1/stage0/src/compiler_tests.rs.render_rust_applied_type_routes_qualified_base_through_leaf_name— already fixed by #10017, verified here rather than assumed. #9886's stale mirror deleted two lines from the test body:env_value.unit_variant_index_observed = trueand the same onpopulated_env_value. Counting that string across the three refs:fb481ae0faf=2,4059156e491=0,52aac48b67b=2. Without the observed flag the env carries no unit-variant evidence, sorender_rust_applied_typecorrectly refused with a locatedcompile_error!instead of emittingi64. The emitter was right and the regenerated test was wrong.shell_service_unmodeled_output_key_refuses— what this PR fixes. A test #9886 added; #10017's mirror repair never touched it, so it is a separate defect rather than a second face of the stale mirror.Why it was unsatisfiable the day it landed
It did
.find(|f| f.path == "src/probe.rs").expect("service module must emit src/probe.rs")and then looked for the refusal text inside that file. No such file exists, by construction:v1.compiler.compileemit_artifactreturnsEmitResult { files: [], diagnostics: unmodeled_transports }when a transport diagnostic fires — the empty file list is paired with a blocking diagnostic, not standing alone. §5 was already satisfied: the compile refuses, typed (TransportEmissionNotModeled) and located (span: ch.span, at the FIELD, with the individual key inmissing_realization_fact). #9886 wrote the wall and the test in one PR, and the test asks for the shape the wall replaced.The shape it asked for is a filed defect class, twice over
gunbc.recurring_failure_modeaccepted_source_emits_uncompilable_target: "the .dag graph is the authority and Rust is one realization, so 'rustc catches it' is exactly the outsourcing this project exists to end."05_emit.dag's own annotation records that this exact shape was tried and filed asrefusal_deferred_to_emitted_runtime: "7 files emitted, 0 diagnostics beside a panic!(): the line did not stop, the compile reported success, and the refusal was deferred to a runtime nobody reads until production."So the fix is not to make the emitter emit the file.
What the test now asserts — through the wall, not about the bytes
TransportEmissionNotModeledexistsnot_a_channelandhas no modeled channelsrc/probe.rsamongr.files— the line stopped rather than reported and continuedstdout.clone()— XL-0-SERVICE: the service-emission path in 05_emit_rust binds stdout to every declared output field and does not box the error arm — it emits non-compiling Rust #9886's own fall-through assertion, widened from one file to all of themIts positive control is the sibling
shell_service_output_projection_binds_each_declared_channel: same fixture with every key modeled, zero diagnostics,src/probe.rsemitted. So "no file" here is the refusal firing and not an emitter that never emits for services. That reasoning is cited in the test's own annotation, so the next reader inherits it.Red controls, executed
In an isolated detached worktree, so nothing here was edited mid-run. Two seed mutations, each rebuilt and run:
unmodeled_shell_transport_diagnosticsreturns[]): conjunct 1 goes RED —must refuse with TransportEmissionNotModeled. Got: [].emit_artifact, then neutralise conjuncts 1 and 2 so the mutant is judged by the file conjunct alone: conjunct 3 goes RED with["Cargo.toml", "src/lib.rs", "src/main.rs", "src/probe.rs", "src/v1_rt.rs", "src/dry_run.rs", "src/emitted_population.rs"]— seven files emitted, the ledger's recorded pre-wall shape reproduced by execution.Neither the typed-refusal half nor the line-stop half is a passenger.
Regeneration
Authority only. The edit is
src/v1/compiler_tests_rust.dag; the two.rsfiles are its regeneration, installed from the candidate tree, never hand-edited. Regenerated across both generations, sincecompiler_tests.rsis rendered from the running seed's baked string:regen → install
v1_compiler_compiler_tests_rust.rs→ rebuildclaim_executor(a grep of the new binary confirms it bakes the new string) → regen → installcompiler_tests.rs→ regen, reportingfirst_generation_equal=true planned=150 executed=150 adjudicated=150.The rebuild is the load-bearing step: a regen that greened against the file it just wrote would prove nothing.
Verification
ctrl-build --remote -- cargo test --release -p v1-compiler --lib -- compiler_tests::compiler_tests::shell_service compiler_tests::compiler_tests::render_rust_applied_type_routes→ 4 passed; 0 failed, on this branch. The same command on52aac48b67bgave 3 passed / 1 failed.Neither
05_emit_rust.dagnor04_resolve.dagis touched, so the two lanes working in those files are unaffected.🤖 Generated with Claude Code
https://claude.ai/code/session_01VSP89XiSm2YMnUvSwSR1ct