← board

The fact

compiler/ir_codegen.inc:10106:

if DumpIR or ((CurProc >= 0) and PxxDbgWants('a.ir', Procs[CurProc].Name)) then

DumpIR (--dump-ir) is ungated. Every PXXDBG=a.ir:… form, a.ir:* included, sits behind CurProc >= 0. A program's main body has no CurProc, so a.ir:* never matches it — while --dump-ir does.

And the comment two lines above (:10105) states the equivalence the code does not have:

a.ir:* is --dump-ir.

Why it costs more than it looks

It fails silently and the silence is ambiguous. No match, a misspelled topic, and a wrong flag all produce identical output: nothing. frankwasm lost two runs reading it as a bad invocation before finding the gate. The workaround, once known, is trivial — put the code in a named routine — which is exactly why the cost is all in the discovery.

This matters more than a p30 usually would because PXXDBG is the repo's designated alternative to reasoning. CLAUDE.md's debugging section exists to push people from theorising to measuring; a measurement tool that returns nothing on the most obvious first attempt pushes them back.

Fix

Either make a.ir:* cover the main body (the equivalence the comment claims), or — if the gate is load-bearing — say so where it fails: emit one line noting that a topic matched no routine, so "no match" stops being indistinguishable from "bad flag". Correct the :10105 comment either way.

Same family as feature-a-a-refusal-is-a-claim-with-a-date-on-it — a state carrying no information because several conditions read identically — and specifically its face nine (an inert flag, with the false claim living in a comment). This is that shape in a diagnostic tool: the comment asserts a property the code does not have, and the tool's silence hides it.