# Allowlist for scripts/check_stimulus_sources.py -- a RATCHET.
#
# One private stimulus or measurement per line, outside the sanctioned home
# (the library: wfmgen for signal, ber for metrics), each with a reason.
#
# THIS LIST MAY ONLY SHRINK. Adding an entry means a new private copy of
# something doppler already ships -- and a private copy does not just
# duplicate code, it invents a CONVENTION (a level, a window, a scale),
# which is the part that goes wrong silently.
#
# Format:  <marker>::<path>::<normalised source line> | reason
#
# NOT NEEDED HERE: a function that WRAPS the library. The gate reads
# bodies, not just names, and follows delegation transitively through
# module-level helpers -- so `evm_db()` built on ber_evm_db(), or an
# `rrc_bpsk()` that reaches rrc_taps through two helpers, is recognised as
# the sanctioned home and never reported. Do not add such a function here:
# an allowlist entry for correct code reads as debt and dilutes the ratchet.
#
# ── SAFE: an independent ORACLE ───────────────────────────────────────
# A theory test compares a MEASURED curve against an analytic model. The
# model has to be derived independently or the comparison is circular --
# the same carve-out .phase-conversion-allow makes for oracles. These are
# not copies the rule is about.

pulse::src/doppler/examples/symsync_theory_demo.py::def _rc(t): | SAFE: independent ORACLE, the published twin of test_theory_symsync's reference. Same argument: the page's whole point is measurement against an analytic model derived independently.
pulse::src/doppler/track/tests/test_theory_symsync.py::def _rc(t): | SAFE: independent ORACLE. _reference_scurve() builds the analytic Gardner S-curve that SymbolSync's MEASURED one is correlated against (>0.99). Generating the reference with the library would make the test partly circular -- an oracle that cannot express the pulse cannot check the pulse.

# ── KNOWN VIOLATIONS: recorded as debt, NOT endorsed ──────────────────
# Each is a private copy of something the library already provides. They
# are listed so the gate can stop NEW ones appearing while these are
# outstanding; the ratchet's whole purpose is that removing them is the
# only permitted direction. Do not add to this section.

pulse::src/doppler/track/tests/test_symsync.py::def _rc(t, beta, T): | VIOLATION (review). A raised cosine taking (t, beta, T) -- unlike its theory sibling this is the FUNCTIONAL suite, so it is most likely stimulus rather than an oracle. Confirm which before removing; if it is an oracle, move it to the SAFE section with that reason.
