A bin passes the instantaneous multi-criteria test (before persistence confirms it).
EVALUATION ORDER is a measured hot-path decision (task #126): the three gates are pure
predicates over the same frame, so any && order returns the IDENTICAL boolean — but
their costs differ wildly. papr scans the WHOLE spectrum per call
(averageExcluding, O(n)); pnpr touches ~7 neighbour bins and phpr ~3 harmonics.
With papr first, FeedbackDetector.push's per-bin loop was O(n²) — profiled at
~27 ms per 100 ms tick on the server's event loop with two armed channels (a third of
the operator's "EQ drags stutter" stall, alongside the sync FFT the same task moved
off-thread). Cheap-and-selective first: pnpr rejects almost every non-tonal bin for
~7 adds, phpr kills harmonic-rich music tones for ~3 reads, and the O(n) papr scan
runs only for the handful of bins that still look like feedback.
A bin passes the instantaneous multi-criteria test (before persistence confirms it).
EVALUATION ORDER is a measured hot-path decision (task #126): the three gates are pure predicates over the same frame, so any && order returns the IDENTICAL boolean — but their costs differ wildly.
paprscans the WHOLE spectrum per call (averageExcluding, O(n));pnprtouches ~7 neighbour bins andphpr~3 harmonics. Withpaprfirst, FeedbackDetector.push's per-bin loop was O(n²) — profiled at ~27 ms per 100 ms tick on the server's event loop with two armed channels (a third of the operator's "EQ drags stutter" stall, alongside the sync FFT the same task moved off-thread). Cheap-and-selective first:pnprrejects almost every non-tonal bin for ~7 adds,phprkills harmonic-rich music tones for ~3 reads, and the O(n)paprscan runs only for the handful of bins that still look like feedback.