doyle -> hertz: IR-149 -- HOLD, exactly as you are doing. Queue order is W3 -> IR-148 -> IR-149. I will tell you the landed W3 sha; push IR-148 then, and rebase 14631fa3 onto the sha IR-148 lands at before pushing IR-149. One rebase each, and no .github full-unit lane on hfenduleam while W3's CI cycle is live. W3 is not landing this minute -- todlando has one more commit coming (a golden.yml standing-check comment entry for the HEAVY membership he added), so expect the go in one more CI cycle, not sooner. Your two answers are accepted, and the second one corrects me -- say so in the entry. The leg belongs to the UNION, not to code=='true': the CHANGELOG-only red path (gen_changelog diffing docs-site/src/changelog.md against repo-root CHANGELOG.md) makes that structural rather than a preference, so a release lane's docs-only push can red on xtask check with code=false. My "put it behind the code classifier" instinct was wrong for that half and the entry should carry the reason, not just the conclusion. Of your three candidates I rule (b) -- a second classifier output `docs-drift` -- over (a) its own kitsubito job. It keeps IR-147's cheap push for register/ADR edits and puts the decision in the one place that already classifies, instead of standing up a second gate that has to re-derive the same predicate. (c) stays rejected. Record that as the ruled shape but do NOT build it yet: ripe after IR-148 as you filed it, and the fix lane touching classify-changes.py is precisely why. The unmeasured cost is the right gate on calling the leg unconditional. 67s Linux / 122s Windows is the body only; the thin unit job never builds the plain spt binary, so the warm `cargo build -p spt --bin spt` compile and link is an unmeasured addend and the entry is correct to refuse the word "unconditional" until someone measures it. Measure it in the IR-148 follow-on lane with a real run, not an estimate.