Found while implementing #14294 (refuse --tier --commands / --tier --json) in scripts/pm/dispatch-gates.mjs. Filed unassigned, out of scope for that PR, and deliberately not fixed there — that card's remedy was scoped by the seat to the two stdout-shape pairs, and this is a different axis.
The shape
--residue is read in exactly one place, inside the branch that runs the derivation:
conststatus=derive(paths,{showResidue: process.argv.includes('--residue'), mode, runRecord });The --tier branch beside it calls tierLines(deriveTier(paths)) and never calls derive, so under --tier the --residue flag is evaluated nowhere. The run exits 0 and prints the tier verdict, with nothing on either stream saying the flag was dropped.
This is the same silent-drop shape #14294 fixes one flag over, and it is the shape the --ran --tier refusal already exists to prevent — that refusal's own stated reason is that "--tier derives no gate family", which is exactly why there is no residue for --residue to name either.
Reproduce
Measured on origin/main at 7a17f3b, with a control so the no-op is not confused with "the flag has nothing to add here":
# CONTROL — --residue demonstrably changes the answer when the derivation runs
node scripts/pm/dispatch-gates.mjs scripts/measure-partial-retirement-annotation.mjs > plain.out
node scripts/pm/dispatch-gates.mjs --residue scripts/measure-partial-retirement-annotation.mjs > residue.out
# 15007 bytes vs 66141 bytes — DIFFERENT
# THE DEFECT — under --tier the same flag is a no-op, at exit 0
node scripts/pm/dispatch-gates.mjs --tier scripts/measure-partial-retirement-annotation.mjs > t-plain.out
node scripts/pm/dispatch-gates.mjs --tier --residue scripts/measure-partial-retirement-annotation.mjs > t-residue.out
# EXIT=0 both; byte-IDENTICAL
Not claimed
Refs
Found while implementing #14294 (refuse
--tier --commands/--tier --json) inscripts/pm/dispatch-gates.mjs. Filed unassigned, out of scope for that PR, and deliberately not fixed there — that card's remedy was scoped by the seat to the two stdout-shape pairs, and this is a different axis.The shape
--residueis read in exactly one place, inside the branch that runs the derivation:The
--tierbranch beside it callstierLines(deriveTier(paths))and never callsderive, so under--tierthe--residueflag is evaluated nowhere. The run exits 0 and prints the tier verdict, with nothing on either stream saying the flag was dropped.This is the same silent-drop shape #14294 fixes one flag over, and it is the shape the
--ran --tierrefusal already exists to prevent — that refusal's own stated reason is that "--tierderives no gate family", which is exactly why there is no residue for--residueto name either.Reproduce
Measured on
origin/mainat 7a17f3b, with a control so the no-op is not confused with "the flag has nothing to add here":Not claimed
--tier --commandssilently prefers--tier— the one two-stdout-shape blend the CLI does not refuse #14294's did.--ran --tierand (after dispatch-gates:--tier --commandssilently prefers--tier— the one two-stdout-shape blend the CLI does not refuse #14294)--tier --commandsare refused, or leave it on the reading that--residueis a modifier rather than a stdout shape and a modifier with nothing to modify is harmless. The first matches the file's stated rule that silently preferring one input over another is the class of failure the whole file is about; the second is a real position and the reason this is filed rather than fixed.--residueonly ever ADDS accounting to a human-read stream — unlike dispatch-gates:--tier --commandssilently prefers--tier— the one two-stdout-shape blend the CLI does not refuse #14294, no machine consumer redirects stdout expecting it, so a dropped--residuecosts a reader information, never a parse.Refs
--tier --commandssilently prefers--tier— the one two-stdout-shape blend the CLI does not refuse #14294 — the card whose repair surfaced this; its PR refuses--tier --commandsand--tier --jsonand deliberately leaves this pair alone. That PR is not addressed to this card and does not close it.