# Phrases PR #292 (and its successors) made FALSE, and may not reappear in
# prose as a current statement.
#
# A row is `regex<TAB>sample<TAB>reason`:
#   regex   an ERE, case-sensitive, matched by scripts/check_retired_phrases.sh
#           against every prose line AND against every line joined with the
#           next one (a phrase re-wrapped at column 74 is still a phrase).
#   sample  one line of text the regex must flag.  The self-test plants it in
#           a temp tree and fails if the gate does not report it, so a regex
#           that rots -- or that this repo's awk cannot compile -- reds
#           scripts/test_check_retired_phrases.sh instead of going quietly
#           toothless on the real tree.
#   reason  printed beside every hit.  Say what is TRUE now and where the
#           record is, not just that the old text is wrong.
#
# Adding a row is the job of the PR that retires the phrase; a row is never
# removed while the phrase is still wrong, only when the fact it names comes
# back (then the statements were right all along).
#
# Two constraints on the regex column:
#   - No interval expressions ({2}, {1,3}).  CI's awk is mawk.
#   - No `\`` escape.  GNU grep reads it as the start-of-buffer anchor, so an
#     escaped backtick can never match; write the backtick plainly.
#
# The retired wave-row LABEL is deliberately not a row here (and is not spelled
# in this file, which the label gate also reads): scripts/check_retired_hud_labels.sh
# is its one implementation -- it scans src/, tests/ and cmake/ too, and carries
# the count allowlist those historical mentions need.  Two gates for one rule
# would be a rule twin.
#
# The rule these rows enforce -- rewrite a living doc, annotate a dated design
# snapshot -- lives in .claude/skills/openglad-pr-workflow/SKILL.md, "Pre-merge
# sweep", item 5.
exits 1 by design	run_mutation_canary.sh --all still exits 1 by design	the canary --all exits 0 on a healthy tree since ed0076cb (PR #292); 1 is a real teeth failure
manual, not CI	Mutation canary (manual, not CI): clean worktree	the canary runs in CI: .github/workflows/parity-canary.yml (PR #292)
manual canary run	full ctest; manual canary run; fall-depth audit	the canary runs in CI: .github/workflows/parity-canary.yml (PR #292)
exempt Invariant rows	mutation-less exempt Invariant rows go 4 -> 5	branch-internal rows are excluded from every canary mode, so no run tallies them; the tallies that must stay 0 are zero_flips and predicate_toothless (PR #292)
kMut_save_corrupt	the kMut_save_corrupt canary anchor	kMut_save_corrupt was deleted as an orphan pin on 2026-09-15 (tests/parity/golden/DRIFT_LEDGER.md, "Removed pins"); save_data.cpp carries no canary pin at all (PR #292)
save_data\.cpp` canary pin	`save_data.cpp` canary pin is line **118**	kMut_save_corrupt was deleted as an orphan pin on 2026-09-15 (tests/parity/golden/DRIFT_LEDGER.md, "Removed pins"); save_data.cpp carries no canary pin at all (PR #292)
save_data\.cpp[ :]118	all edits below the save_data.cpp:118 pin	kMut_save_corrupt was deleted as an orphan pin on 2026-09-15 (tests/parity/golden/DRIFT_LEDGER.md, "Removed pins"); save_data.cpp carries no canary pin at all (PR #292)
OptionsMenu\.zz_capture	OptionsMenu.zz_capture_menu_tour is env-gated	the capture scenes are MenuCapture.zz_capture_* and run their oracles on every lane; OG_FX_CAPTURE_DIR gates only the film (PR #292)
max\(lm, ?rm ?- ?2 ?- ?6 ?\* ?len\)	right-aligned with max(lm, rm - 2 - 6*len)	the per-row right-align idiom was replaced by one fit rule in include/openglad/interface/hud_counter_box.h (PR #292)
Gamesmaster	the Gamesmaster's fourth row	the modes campaign is unthemed (PR #307): no narrator; the camp is ONE row, SETUP - <title>, into the SETUP wizard (docs/match-setup-design.md §10)
MATCH SETUP	the camp's MATCH SETUP page	the MATCH SETUP page retired into the SETUP wizard (og::ui::MatchSetupSession, PR #307); the macros live in picker_common
Multiplayer Game Modes	("Multiplayer Game Modes"), 40 scenarios	the campaign's display title is Multiplayer Arenas (PR #307); the id stays modes
stamp vocabulary	per-game stamp tallies -- stamp vocabulary everywhere	Multiplayer Arenas carries no progress vocabulary (PR #307 round 2): a GAME row's note is N arenas, the camp has no readout
fully stamped page	a fully stamped page says	Multiplayer Arenas carries no progress vocabulary (PR #307 round 2): a GAME row's note is N arenas, the camp has no readout
is stamped\.	Every field here is stamped.	Multiplayer Arenas carries no progress vocabulary (PR #307 round 2): a GAME row's note is N arenas, the camp has no readout
[0-9]+/[0-9]+ stamped	3/40 stamped	Multiplayer Arenas carries no progress vocabulary (PR #307 round 2): a GAME row's note is N arenas, the camp has no readout
RANDOM SCENARIO	the camp's RANDOM SCENARIO row	the roll rows are the wizard's RANDOM (GAME step) and RANDOM ARENA (each game's ARENA page); the camp has no roll row (PR #307)
TARGET SCORE	TARGET SCORE is the map's authored limit	the score knob has one home, the SETUP wizard's RULES step SCORE: row (PR #307); the SCENARIO copy is parked
SIGN THE BOOK	SIGN THE BOOK lives on the index page	the signature retired with the untheme (PR #307); no tally exists
Squad size follows the roster	Squad size follows the roster: a solo fighter faces one opponent	#305: soccer and basketball buy fighters above FAIR and deal STRONG (docs/mp-game-modes.md "Matched squads", docs/lineup-design.md Amendment 8, PR #307)
Only levels move	Only levels move, and only between 1 and 9.	#305: soccer and basketball buy fighters above FAIR and deal STRONG (docs/mp-game-modes.md "Matched squads", docs/lineup-design.md Amendment 8, PR #307)
legacy versus packs	keeps its own copies for legacy versus packs	the SCENARIO SCORE row is parked and the SETUP wizard serves every versus pack (PR #307)
[0-9]+/[0-9]+ cleared	SOCCER - 0/4 cleared	no progress words in Multiplayer Arenas (PR #307 round 2); a GAME row's note reads N arenas
Cleared: [0-9]+ of	Cleared: 0 of 40.	the GAME step has no tally line (PR #307 round 2)
Every arena here is cleared	Every arena here is cleared.	the ARENA page's only line is the game's own rule line (PR #307 round 2)
Next uncleared	Next uncleared: THE PITCH.	the ARENA page's only line is the game's own rule line (PR #307 round 2)
CLEARED [0-9]+/[0-9]+	the camp readout CLEARED 0/40	the camp has no readout; the roster leads the panel (PR #307 round 2)
cleared of [0-9]+ discovered	Level Progress: 3 cleared of 40 discovered	PROGRESS on a versus campaign reads Arenas: N; classic campaigns keep the tally (og::ui::progress_marks_shown, PR #307 round 2)
Yours too\.	One squad at STRONG. Yours too.	the wizard's knobs speak through their faces; the said-lines are deleted (PR #307 round 2, R2-1)
squads? at [A-Z]	Three squads at BRUTAL.	the wizard's knobs speak through their faces; the said-lines are deleted (PR #307 round 2, R2-1)
No squads\.	No squads.	the wizard's knobs speak through their faces; the said-lines are deleted (PR #307 round 2, R2-1)
Clock: 	Clock: 5 minutes.	the wizard's knobs speak through their faces; the said-lines are deleted (PR #307 round 2, R2-1)
Score to [0-9]	Score to 5.	the wizard's knobs speak through their faces; the said-lines are deleted (PR #307 round 2, R2-1)
Score: the map's own	Score: the map's own.	the wizard's knobs speak through their faces; the said-lines are deleted (PR #307 round 2, R2-1)
lowest (authored )?opponent (turns|at|when)	it turns on the lowest opponent at x	fix B (PR #307 round 2): with no band on, a FILL turn lights EVERY authored opponent. Narrowed so the SIDES rule -- dealing the lowest opponents in team order, still true -- never trips
SETUP[^.;:]*Base Camp (command )?strip	SETUP, on the Base Camp command strip	SETUP is the camp's one docket row (PR #307 round 2); the strip's second door is DIFFICULTY on every campaign. A true sentence naming both puts a . ; or : between them
strip.s SETUP	the strip's SETUP door	SETUP is the camp's one docket row (PR #307 round 2); the strip's second door is DIFFICULTY on every campaign
kCreateMenuSetupIndex	kCreateMenuSetupIndex == 73	ordinal 73 and the strip twin are deleted; the Base Camp ceiling is 73 (PR #307 round 2)
ceiling 74	ceiling 74 across the tied triple	ordinal 73 and the strip twin are deleted; the Base Camp ceiling is 73 (PR #307 round 2)
The fight's rules are on SETUP	The fight's rules are on SETUP: RULES.	terminal item 11 Difficulty is ungated and the guard string is deleted; RULES is SCORE + TIME LIMIT (PR #307 round 2)
This campaign has no arena setup	This campaign has no arena setup.	Team Build has no Setup item; the terminal door is the camp's SETUP row (PR #307 round 2)
Team Build has 13 items	Team Build has 13 items now	Team Build has 12 items; item 13 Setup is retired (PR #307 round 2)
up to slaughter	DIFFICULTY: BATTLE - up to slaughter	DIFFICULTY is not a wizard row; it went back to the Base Camp DIFFICULTY door (PR #307 round 2)
RANDOM ARENA - any game	RANDOM ARENA - any game, any arena	the camp roll row is gone; the wizard's RANDOM ARENA note is any arena of this game (PR #307 round 2)
three-row docket	is now a three-row docket	the camp docket is ONE row, SETUP - <title> (PR #307 round 2)
must be cleared\)	Replay level (must be cleared): 	the prompt is unchanged on classic campaigns, but a versus campaign refuses first with Arenas are set, never replayed. (PR #307 round 2)
N- steps a wheel back	Setup # [1-5] (0 = back, N- steps a wheel back):	the wizard prompt is Setup # [1-N] (0 = back): and the wheels turn forward only (PR #307 round 3); a trailing - takes the Invalid setup row. notice
42-glyph (docket|row|face)	rows are the docket 42-glyph face	the wizard row and the camp docket row are 298px, 48 glyphs, since PR #307 round 4 (docs/match-setup-design.md §12)
30 ?px cell column	the only tenants of the 30 px cell column	the cell column is deleted with the pager pair; rows run 12..310 (PR #307 round 4)
setup_page_(prev|next)	click setup_page_next to step the window	the wizard pages on its last ROW, MORE ARENAS - n/m  >; the pager ordinals are deleted (PR #307 round 4)
zone_pager_(prev|next)_[01]	interact("zone_pager_next_0")	the docket pages on its last ROW, MORE - n/m  >; ordinals 65..68 are parked as zone_pager_spare_0..3 (PR #307 round 4)
pager.s gutter carries	the pager's gutter carries the p/N count	the window count is the MORE pager ROW own note (PR #307 round 4)
level rows and GO wear the GO green	level rows and GO wear the GO green	inside the SETUP wizard green is GO alone: ARENA level rows are plain (PR #307 round 4). Classic campaigns keep the green, so a sentence about THEM must say so
find_far_foe	The engine calls find_far_foe to acquire a target.	issue #293 renamed the native full-list nearest-distance scan to find_nearest_foe; dated design snapshots annotate historical references.
[Bb]ranch-sourced|BRANCH-SOURCED	The row is BRANCH-SOURCED and has a ledger row.	since 2026-10-04 every golden is an old-game capture (DRIFT_LEDGER.md header); a departure is ported into the old game, never captured from the current game
captured from the (fixed )?branch	Intentional changes are captured from the fixed branch.	since 2026-10-04 every golden is an old-game capture (DRIFT_LEDGER.md header); a departure is ported into the old game, never captured from the current game
not yet ported to the old game	This branch (goldens regenerated) (not yet ported to the old game; see the ledger, Open)	#349 (2026-10-05) ported every departure whose goldens were still current-game captures; the ledger's Open list is empty and every golden cmp-equals a capture at the ledger pin (tests/parity/golden/DRIFT_LEDGER.md)
No workflow fetches	No workflow fetches, clones or builds parity-companion.	every fetch-depth: 0 checkout fetches origin/parity-companion (none builds it), and scripts/check_parity_companion_refs.sh checks the ledger pin against it as an og_test_parity build dependency (#349)
so the engine is left as it is	A guard there would need a per-family rule, so the engine is left as it is.	walker::special() refuses a slot priced 5000 (kSpecialCostDisabled) before the MP compare, as NO SPECIAL AVAILABLE (SpecialFailure::Unavailable), whatever the Gameplay Fixes setting (docs/gameplay-fixes.md, "Not gated"; docs/new-specials.md, "An engine note")
zz_capture_(new_specials|gameplay_fixes)	GameLoop.zz_capture_new_specials records one film per special	the scenes are the NewSpecials.* and GameplayFixes.* tests of og_test_special_scenes and run on every lane; OG_FX_CAPTURE_DIR only adds the frames the scripts/media tools encode (PR #364)
(recaps|states) every rule line	Five steps stay; the MATCH step's recap still states every rule line.	the SETUP wizard's MATCH step states the match: its title, its team lines and the RULES step's own rows, SCORE and TIME LIMIT; the DIFFICULTY door's knobs, the Game Settings and CROSS CONTROL are not on it (PR #364, docs/match-setup-design.md)
TELEPORT MARKER coin is kept	The TELEPORT MARKER coin is kept	a bot's marker has its own payoff rule since PR #364's bot gates (docs/gameplay-fixes.md, Bots); the coin is drawn and overwritten
HEAL with any friend within 60	Slot 1 is unchanged: HEAL with any friend within 60 px	the cleric bot heals only an ally below full health (docs/gameplay-fixes.md, Bots, PR #364)
CLOAK and POISON CLOUD are unchanged	CLOAK and POISON CLOUD are unchanged.	both have bot rules since PR #364 (a hunter within 130; two foes at blows)
WARP SPACE and ENERGY WAVE want a foe within the same 110	WARP SPACE and ENERGY WAVE want a foe within the same 110 px	WARP SPACE asks its point-blank ring and ENERGY WAVE a faced foe (PR #364)
the coin picks (it|MINE|WAIL)	the coin picks MINE over the bomb	MINE and WAIL have their own bot rules (docs/new-specials.md, PR #364)
CHARGE wants an aim|soldier.s heading pointed at|CHARGE without a heading toward	CHARGE wants an aim at its foe	a soldier bot's CHARGE wants the classic window and a living foe in the path its rush runs, the window's foe or any other, since PR #364's calibration (docs/gameplay-fixes.md, Bots)
