Repository navigation
Read the walk's own infra fault as data, and drop a matcher arm nothing produces - #7482
Conversation
…ng produces Sibling of #7476, found by looking for the same shape elsewhere: a typed fact formatted into prose and then recovered by grepping that prose. THE ROUND-TRIP. `handle.join()` returning `Err(_)` means a claim thread panicked — the walk KNOWS this. That bool became `format!("batch=N infra=thread_panic")`, and `falsifier_failure_mode` recovered it with `d.contains("infra=")`. The panic PAYLOAD is genuinely lost (`Err(_)` discards it), but *that a thread panicked* is not, so it now travels as `InfraFault::ClaimThreadPanicked { batch_index }` and `falsifier_failure_mode_with_faults` consults it before any text path. The rendered line goes back to being for humans. A MATCHER ARM THAT COULD NEVER FIRE. `d.contains("failed to spawn")` is deleted: no producer reachable from this input emits it. The interpreter's spawn failure says "failed to execute '{argv0}': {e}"; the in-tree producers of "failed to spawn" are a different bin, test helpers, and panic messages — and a panic payload is discarded before it could become a detail. A substring its own input cannot contain only looks like coverage. KEPT AS TEXT, DELIBERATELY. "Resource temporarily unavailable" and "sccache" are genuinely EXTERNAL text arriving as an io::Error Display through `failed to execute '{argv0}': {e}` (EAGAIN renders as the former). Matching them here is not principled, and the comment says so: typing them belongs at the interpreter boundary where the io::Error is caught. Not silently left as if it were the same kind of thing as the fact above. ALSO FIXES A LIVE MAIN RED, unrelated to the above but caught by it. `cargo test --bin claim_executor` does not compile on clean main: #7470 added the `finalization_record` helper with a `ClaimResult` literal while #7476 added the required `budget_refusal` field. Both merged, git saw no textual conflict, and CI runs no cargo test, so nothing caught it. Verified by stashing this branch's diff and building unmodified origin/main (E0063 at claim_executor.rs:4526). My field made it required, so the one-line fix rides here. VERIFIED BY EXECUTION, both crates this time — the omission that let review 45231 find a compile break last round: - claim_executor bin suite: 40 passed, 0 failed. - `cargo build --tests -p v1-compiler-tests`: Finished. - `falsifier_failure_mode_classifies_three_arms` now asserts BOTH directions, so the move from text to value is proven, not assumed: the panic text ALONE classifies WitnessRed, an observed fault classifies Infra even when no text hints at it, and no fault means no Infra whatever the prose says. - Proven discriminating: with the typed arm neutered the test FAILS; restored it passes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
The receipt
What verifying it surfaced
The seed's A deletion I made and retractedThis PR originally deleted the The evidence was truncated: my grep for producers ended in The reasoning was also wrong independently: the model declares The Residual, checked rather than assumed
Verification after the restore: — sent from quiet-ferret-16 |
Sibling of #7476, found by searching for the same shape elsewhere: a typed fact formatted into prose, then recovered by grepping that prose.
The round-trip
handle.join()returningErr(_)means a claim thread panicked — the walk knows this, as a bool. That bool becameformat!("batch=N infra=thread_panic"), andfalsifier_failure_moderecovered the classification withd.contains("infra=").The panic payload is genuinely lost (
Err(_)discards it). But that a thread panicked is not, so it now travels asInfraFault::ClaimThreadPanicked { batch_index }, andfalsifier_failure_mode_with_faultsconsults it before any text path runs. The rendered line goes back to being for humans.A deletion I made and then retracted
An earlier revision deleted the
d.contains("failed to spawn")arm, on the grounds that no producer reachable from this input emits it. That was wrong, twice over, and the arm is restored.The evidence was truncated. My grep for producers ended in
head -5, and I read five results as the whole population. There are 24, one of them insideclaim_executor.rsitself ("[floor-memory] heartbeat thread failed to spawn: {e}").And the reasoning was wrong independently of the evidence:
gunbc.ci_failure_classdeclaresProcessSpawnFailurea live signature whose match text isspawn_outcome_log_fragment(SpawnFailed)="failed to spawn", cited toextdeps.rust.std_process. Editing one side of a fork on surface-local evidence widens the divergence rather than closing it.The fork this surfaced — the larger finding
gunbc.ci_failure_classalready models this properly.InfraSignatureis a closed sum whose match text is derived from cited upstream authorities —errno_strerror(EAGAIN),spawn_outcome_log_fragment(SpawnFailed), the sccache fragments,runner_lifecycle_log_fragment(ShutdownReceived)— each carrying aninfra_signature_originnaming where the text comes from and aninfra_signature_sitesaying whether it is build-log or job-signal text.The seed's
falsifier_failure_modeis a hand-typed fork of it, and the fork is the one that runs:classify_failure_reasonhas no production consumer — only witness tests reach it. The grounded authority is inert while the ungrounded copy is live, which is exactly the coverage-by-illusion tier DESIGN §6 names.This PR does not close that fork — it records it, because closing it is a different change (making the seed resolve and call
gunbc.ci_failure_class, the wayclaim_executoralready resolvesgunbc.floor_component_receipt).Also fixes a live main red
Unrelated to the above, but caught by it.
cargo test --bin claim_executordoes not compile on cleanmain.#7470 added the
finalization_recordtest helper with aClaimResultliteral; #7476 added the requiredbudget_refusalfield. Both merged, git saw no textual conflict, and CI runs nocargo test— so nothing caught it. Verified by stashing this branch's diff and building unmodifiedorigin/main:E0063atclaim_executor.rs:4526. My field made it required, so the one-line fix rides here.Worth noting the gap beyond the fix: two crates of Rust tests are unguarded by CI, so a compile break can sit on main indefinitely. That is the same gap
review 45231caught by hand last round.Verified by execution — both crates this time
The omission that let
review 45231find a compile break last round was building the bins and treating that as coverage. Both are checked here:claim_executorbin suite: 40 passed, 0 failedcargo build --tests -p v1-compiler-tests: Finishedfalsifier_failure_mode_classifies_three_armsnow asserts both directions, so the move from text to value is proven rather than assumed:WitnessRed— the rendered line must not carry the classificationInfra— the value settles itWitnessRed— prose alone never promotes to InfraProven discriminating: with the typed arm neutered the test FAILS; restored, it passes.
Pure Bootstrap receipt (
review 45261)ci_failure_class_seed_fork_noteon the authority whose fork this is:InfraFaultsum recording a fault the walk observes (a claim thread panic, fromhandle.join()returningErr) plus the field carrying it — replacing aformat!-then-containsround-trip through the walk's own rendered line. That fault is the walk's own observation, not a signature this module models, so it is not a second fork of the roster.ZeroHandMaintainedRust, roadmap nodev1-zero-hand-maintained-rust(gunbc.v1_deletion_planv1_exit_finish_lines).falsifier_failure_modeconsumes this module and callsclassify_failure_reason, at which point the hand-typed list is deleted,classify_failure_reasongains its first production consumer, and the build-log/job-signal site axis becomes decidable at the call site instead of being flattened away.Honest residual, verified not a regression
batch_failure_mode_and_detail(the per-batch component receipt) does not seeinfra_faults— flagged inreview 45266. Checked againstorigin/main: the panic has always pushed to walk-levelfailure_details, never torec.results, so that path was blind to it before this change and is no worse after. Recorded rather than silently left; wiring it is a separate change now thatInfraFaultcarriesbatch_index.Verification after the restore
claim_executorbin suite: 40 passed, 0 failedcargo build --tests -p v1-compiler-tests: Finishedci_failure_classwitnesses: all 5 PASS by execution