# Retired identifiers: <regex><TAB><what to use instead>
#
# A row is added by the commit that retires the name, and it only ever holds
# at zero occurrences -- see scripts/check_retired_names.py for why this is
# data rather than vigilance.
#
# doppler#828: `fec` named the CCSDS-specific half of the coding chain, which
# read as FEC == CCSDS once `conv` and `rs` held the general codes. The
# component is `ccsds_tm` (131.0-B-3) and the prefix follows it. FEC remains
# the honest word for the general subject in prose -- these patterns match the
# IDENTIFIER forms only, which is why `docs/design/fec-receive.md` and "no
# FEC" in a docstring are untouched.
\bfec_[a-z0-9_]+	the ccsds_tm_ prefix (or conv_/rs_ for the general codes)
\bFEC_[A-Z0-9_]+	the CCSDS_TM_ prefix (or CONV_/RS_ for the general codes)

# doppler: `MpskReceiver` and `MpskReceiverR` collapsed into one object with a
# tagged front end, so every `mpsk_receiver_r_*` C symbol is gone -- the
# constructor is `mpsk_receiver_create_real()` and the block API
# `mpsk_receiver_steps_real()` / `_bits_real()`.
#
# The suffix alternation is not verbosity. `mpsk_receiver_r` is a literal
# prefix of the LIVE `mpsk_receiver_reset`, so a bare `\bmpsk_receiver_r`
# would condemn twelve working call sites; and `MPSK_RECEIVER_R_STATE_MAGIC`
# survives DELIBERATELY, keyed on the face so a real blob is refused by the
# complex receiver at the envelope. Matching the identifier forms only also
# leaves the design record's own measurement alone -- mpsk-refactor.md S1-7
# names `mpsk_receiver_r_core.c` because that is what was measured, and a
# rename must not edit history to satisfy itself.
\bmpsk_receiver_r_(create|destroy|reset|steps|bits|get_|set_|configure_|state_)	mpsk_receiver_* (create_real / steps_real / bits_real for the real face)

# doppler#887 follow-through: the bespoke pinned-doxygen image is retired in
# favour of $(CI_IMAGE), which CI's doxygen job actually runs inside. Two
# things answered "give me CI's doxygen" and only one could answer it by
# construction; keeping the loser around invites a second, drifting pin.
doxygen-pin-image	make doxygen-check / gen-c-api, which shim $(CI_IMAGE)
DOXYGEN_PIN_IMAGE	CI_IMAGE (.github/ci-images.env)
doppler-doxygen:	the CI image — see deploy/docker/README.md

# doppler#1312: `next_pow2` was FIVE identical private statics -- det_private.h,
# delay_core.c, psd_core.c, specan_core.c, ppe_core.c -- none reachable from
# the others, none guarding the overflow that makes the doubling loop spin
# forever. The primitive is `next_pow_two` in util_core.h (header-only,
# JM_FORCEINLINE, so including the header is the whole cost). This row is what
# stops a sixth copy: a private one has to name itself something, and the
# obvious name is now refused.
\bnext_pow2\b	next_pow_two (native/inc/doppler/util/util_core.h)
# ...and the OTHER spelling, which is how two of the seven stayed hidden from
# a grep for the first: `burst_capture_pow2_ceil` and `dsss_br_pow2_ceil` were
# the same function again, module-prefixed. A name-based gate only works if it
# covers the names people actually reach for.
\b[a-z0-9_]*pow2_ceil\b	next_pow_two (native/inc/doppler/util/util_core.h)

# The claim, not an identifier, but retired the same way: Windows is a
# supported build platform for the C library (clang/clang-cl, windows.yml,
# #1360), and stale "unsupported" comments outlived that by a release.
(?i)(does not|doesn't) target Windows	Windows builds with clang/clang-cl: docs/install/source.md#windows
(?i)Windows[^.\n]{0,20}\bis (intentionally |deliberately )?(unsupported|not supported)	Windows builds with clang/clang-cl: docs/install/source.md#windows

# A module-level `import tomllib` is 3.11+, and doppler's floor is 3.9: a
# script a test imports, or runs with sys.executable, fails ONLY the Python
# 3.9/3.10 CI jobs -- three times now (check_wfm_enum_tables, gen_issue_tracker,
# gen_wfm_defaults). Guard it on sys.version_info, or import inside the one
# function that needs it.
^import tomllib\b	if sys.version_info >= (3, 11): import tomllib / else: import tomli as tomllib

# doppler#853 item 11: a frame is a description. The four-field struct, its
# named layout and the bridges that spoke it are deleted, and so is the
# source's by-name compiler; every caller reads a `wfm_frame_desc_t`, and the
# common frame is `dp_wfm_frame_fixed()`. `set_dsss` alone is retired -- its
# `_chips`/`_cont`/`_window` siblings are live, hence the look-ahead.
\bwfm_frame_t\b	wfm_frame_desc_t, built by dp_wfm_frame_fixed() for the common frame
\bwfm_frame_layout_t\b	wfm_frame_desc_layout_t, read by field name (dp_wfm_frame_field_index)
\bdp_wfm_frame_describe\b	dp_wfm_frame_fixed()
\bdp_wfm_source_describe_frame\b	the source's carried frame, or dp_wfm_frame_fixed() of its common fields
\bFrameLayout\b	Frame.field_off(Frame.field_index("payload")) -- a frame is read by name
\bdp_wfm_synth_set_dsss\b(?!_)	dp_wfm_dsss_desc_chips() then dp_wfm_synth_set_dsss_chips()

# doppler#1894 / #2102: the Spectrogram's state blob carries its configuration
# (version 2), and a restore REFUSES another window, mode or Kaiser beta. The
# version-1 contract said the opposite in the header, the manifest, the design
# page, the C test index and the certification, and 3a29bc8d0 changed the code
# while every one of those kept its old sentence. Each row is one of those
# sentences' own phrasing, matched per line: "NOT refused" alone is live in
# other objects (mpsk, wfm_compose, the interleaver), so it is never a row,
# and "the caller's to keep" alone is plain English. A tripwire for the exact
# old wording, case-sensitive and a line at a time: a paraphrase, another
# case or a copy wrapped mid-phrase passes. It does not prove the prose true;
# review does (a claims gate is #2182).
beta or mode is NOT refused	a blob from another window, mode or Kaiser beta is refused (#2102)
header says are NOT refused	the header refuses another window, mode or Kaiser beta (#2102)
window, beta and mode are the caller's to keep	the blob carries the configuration, and set_state refuses another (#2102)
the caller's to keep because the blob does not carry it	the blob carries the configuration, and set_state refuses another (#2102)
another window or mode restores without	another window, mode or Kaiser beta is refused (#2102)
framer's snapshot and nothing else	the configuration a row depends on, then the framer's snapshot (#2102)
does not carry consumed\(\), the PSD's window	it carries mode, nfft, hop, window and beta, not consumed() (#2102)
without a refusal\. Whether that refusal	set_state refuses a blob from another mode (#2102)
