Findings No. 31
`IIRFilterNode` carries the K-weighting
A single IIRFilterNode carries BS.1770 K-weighting; pyloudnorm's shelf formula missed the standard's coefficient table, libebur128's derivation matched it.
The claim is that BS.1770 loudness weighting lives in stock Web Audio nodes: createIIRFilter configured with the standard's coefficients, one biquad for the shelf and one for the high pass, in series. K-weighting is not a separate processing stage, it is the coefficients you hand to IIRFilterNode.
Stem Shovel's loudness measurement first tried pyloudnorm's published shelf formula with the same b0, b1, b2, a1, a2 parameters. Those coefficients did not land on the values in BS.1770's own 48 kHz table, so the filter would have measured loudness against a shelf that only approximated the standard rather than matching it.
The fix was to rederive the coefficients from libebur128 instead, confirm they matched the standard's 48 kHz table, and wire them into createIIRFilter([b0, b1, b2], [1, a1, a2]) in utils/measureLoudness.ts. A test now checks the coefficients directly against the table, so a future edit cannot drift from the standard without failing.
The general rule: when a spec publishes exact coefficients, verify your implementation's numbers against the table itself, not against a derivation that merely claims to implement the same formula.
Receipt: Stem Shovel (utils/measureLoudness.ts, createIIRFilter, the coefficient test against BS.1770's 48 kHz table; FINDINGS.md, Web Audio).