What cost the most. The bootstrap loop cost the most, and part of it was my own doing. I wrote the_types_meet_with_holes as a match (a, b) over two references. That exposed a real lowering defect: the generated code had ref x under implicit borrowing and a &bool that was never copied out. Fixing it meant a second checker change, a one-time hand patch of the generated lowered/check_arms.rs to get past the bootstrap, and then confirming the fixpoint by md5. Second was the first gate run, which went red on NK1245 (a whole Unknown arm was being treated as a hole) and needed another build-and-test round.
What I looked up that the brief could have handed me. I had to find where arms meet (check_core_flow_meet and the order it tries: text, null, disagree) and how copied_bindings and lent_bindings decide between let x = *x; and ref x. I also checked that NK1245 (arms_that_disagree) is the refusal that depends on an arm staying Unknown. The brief named the counter and the suspect lines well. That made the find step cheap: one temporary eprintln! showed the two prover calls.
sequences:: a few times, a probe of the defect against the unfixed compiler, the guard set (37), tests/compiler at both settings (369), clippy and pre-push-check.sh. None was really wasted; the red first gate found a real regression. Two things went poorly:
develop stays red until someone rebases it.commit.nika ran before the Disk freed: line was filled in. I put the DISK placeholder there myself, so the order was my mistake.git pull --rebase origin develop and push again when the push is rejected. CLAUDE.md’s trunk rules already say to do that, and they contradict builder.md’s “no rebase”. A fix that isn’t pushed fixes nothing. A smaller second change: one line in builder-facts.md saying that a new checker helper should avoid any form the checker change itself touches, to avoid the bootstrap problem.