{"abstract":"The passband gain is squared away from unity instead of corrected.","category":"Digital signal filters","checks":7,"contract":"Input [f0, fs, r]: second-order notch with zeros on the unit circle at +-w0 (w0 = 2 pi f0 / fs) and poles at radius r: b = [1, -2 cos w0, 1], a = [1, -2 r cos w0, r^2]; b is scaled for unity DC gain (sum(a)/sum(b)). Coefficients rounded to 9 decimals; \"bad-frequency\" unless 0 < f0 < fs/2, \"bad-radius\" unless 0 <= r < 1.","contract_signature":"x","evaluation_group":"w2-digital_signal_filters-iir-notch-design","failed_approach":"The attempted repair scales both a and b, which leaves the DC gain unchanged.","family":"w2-digital_signal_filters-iir-notch-design-dc-gain-scaling-direction","id":"FA-91821","implementations":{"attempt":{"sha256":"55d6470fb7840243851b766bbf85cac1a243d96c92ca6a8e424a8d17e01a0796","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    f0, fs, r = Fraction(x[0]), Fraction(x[1]), Fraction(x[2])\n    if not 0 < f0 < fs / 2:\n        return 'bad-frequency'\n    if not 0 <= r < 1:\n        return 'bad-radius'\n    w0 = 2 * math.pi * float(f0 / fs)\n    c = math.cos(w0)\n    b = [1.0, -2 * c, 1.0]\n    a = [1.0, -2 * float(r) * c, float(r * r)]\n    g = sum(a) / sum(b)\n    return {'b': [round(g * v, 9) + 0.0 for v in b], 'a': [round(g * v, 9) + 0.0 for v in a]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=50 fs=1000 r=9/10', ['50', '1000', '9/10'], {'b': [1.002158645, -1.90621902, 1.002158645], 'a': [1.0, -1.711901729, 0.81]}], ['regression: f0=50 fs=1000 r=1/2', ['50', '1000', '1/2'], {'b': [3.053966137, -5.80898879, 3.053966137], 'a': [1.0, -0.951056516, 0.25]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=50 fs=1000 r=1/2', ['50', '1000', '1/2'], {'b': [3.053966137, -5.80898879, 3.053966137], 'a': [1.0, -0.951056516, 0.25]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}]], [['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=60 fs=480 r=99/100', ['60', '480', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}]], [['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=1 fs=8 r=1/2', ['1', '8', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}]], [['regression: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=3 fs=8 r=9/10', ['3', '8', '9/10'], {'b': [0.902928932, 1.276934342, 0.902928932], 'a': [1.0, 1.272792206, 0.81]}], ['regression: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"5297befe9d5944689338d48d6dd8dec7f375a53108dfdeb7d496704c527729a0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    f0, fs, r = Fraction(x[0]), Fraction(x[1]), Fraction(x[2])\n    if not 0 < f0 < fs / 2:\n        return 'bad-frequency'\n    if not 0 <= r < 1:\n        return 'bad-radius'\n    w0 = 2 * math.pi * float(f0 / fs)\n    c = math.cos(w0)\n    b = [1.0, -2 * c, 1.0]\n    a = [1.0, -2 * float(r) * c, float(r * r)]\n    g = sum(b) / sum(a)\n    return {'b': [round(g * v, 9) + 0.0 for v in b], 'a': [round(v, 9) + 0.0 for v in a]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=50 fs=1000 r=9/10', ['50', '1000', '9/10'], {'b': [1.002158645, -1.90621902, 1.002158645], 'a': [1.0, -1.711901729, 0.81]}], ['regression: f0=50 fs=1000 r=1/2', ['50', '1000', '1/2'], {'b': [3.053966137, -5.80898879, 3.053966137], 'a': [1.0, -0.951056516, 0.25]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=50 fs=1000 r=1/2', ['50', '1000', '1/2'], {'b': [3.053966137, -5.80898879, 3.053966137], 'a': [1.0, -0.951056516, 0.25]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}]], [['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=60 fs=480 r=99/100', ['60', '480', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}]], [['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=1 fs=8 r=1/2', ['1', '8', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}]], [['regression: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['regression: f0=3 fs=8 r=9/10', ['3', '8', '9/10'], {'b': [0.902928932, 1.276934342, 0.902928932], 'a': [1.0, 1.272792206, 0.81]}], ['regression: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic bounded teaching model with a stipulated toy contract; exact rational arithmetic or fixed-decimal rounding keeps outputs strict JSON. It is not a production DSP library and claims no standards conformance. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-digital_signal_filters-iir-notch-design-dc-gain-scaling-direction","generated_at":"2026-09-29T14:51:39.577121+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Notch filters remove mains hum and interference tones; angle or radius slips miss the tone or widen the notch.","root_cause":"The numerator scale is sum(b)/sum(a) instead of sum(a)/sum(b).","sha256":"700c21b927efb95b20be1cb71b49a4eea5fca4f61225afc82691aaf7010423c9","title":"Notch design inverts the DC gain correction · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.426,"exit_code":1,"observations":[{"actual":{"a":[10.215864547,0.0,0.0],"b":[10.215864547,-19.431729095,10.215864547]},"check":"regression: f0=50 fs=1000 r=0","expected":{"a":[1.0,0.0,0.0],"b":[10.215864547,-19.431729095,10.215864547]},"passed":false},{"actual":{"a":[1.002158645,-1.715597118,0.811748503],"b":[1.002158645,-1.90621902,1.002158645]},"check":"regression: f0=50 fs=1000 r=9/10","expected":{"a":[1.0,-1.711901729,0.81],"b":[1.002158645,-1.90621902,1.002158645]},"passed":false},{"actual":{"a":[3.053966137,-2.904494395,0.763491534],"b":[3.053966137,-5.80898879,3.053966137]},"check":"regression: f0=50 fs=1000 r=1/2","expected":{"a":[1.0,-0.951056516,0.25],"b":[3.053966137,-5.80898879,3.053966137]},"passed":false},{"actual":"bad-frequency","check":"control: at nyquist","expected":"bad-frequency","passed":true},{"actual":"bad-radius","check":"control: bad radius","expected":"bad-radius","passed":true},{"actual":{"a":[0.991021586,-1.866184724,0.971300257],"b":[0.991021586,-1.885035075,0.991021586]},"check":"regression: f0=50 fs=1000 r=99/100","expected":{"a":[1.0,-1.883091902,0.9801],"b":[0.991021586,-1.885035075,0.991021586]},"passed":false},{"actual":{"a":[1.707106781,0.0,0.0],"b":[1.707106781,-2.414213562,1.707106781]},"check":"regression: f0=60 fs=480 r=0","expected":{"a":[1.0,0.0,0.0],"b":[1.707106781,-2.414213562,1.707106781]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: f0=50 fs=1000 r=0\", \"actual\": {\"b\": [10.215864547, -19.431729095, 10.215864547], \"a\": [10.215864547, 0.0, 0.0]}, \"expected\": {\"b\": [10.215864547, -19.431729095, 10.215864547], \"a\": [1.0, 0.0, 0.0]}, \"passed\": false}, {\"check\": \"regression: f0=50 fs=1000 r=9/10\", \"actual\": {\"b\": [1.002158645, -1.90621902, 1.002158645], \"a\": [1.002158645, -1.715597118, 0.811748503]}, \"expected\": {\"b\": [1.002158645, -1.90621902, 1.002158645], \"a\": [1.0, -1.711901729, 0.81]}, \"passed\": false}, {\"check\": \"regression: f0=50 fs=1000 r=1/2\", \"actual\": {\"b\": [3.053966137, -5.80898879, 3.053966137], \"a\": [3.053966137, -2.904494395, 0.763491534]}, \"expected\": {\"b\": [3.053966137, -5.80898879, 3.053966137], \"a\": [1.0, -0.951056516, 0.25]}, \"passed\": false}, {\"check\": \"control: at nyquist\", \"actual\": \"bad-frequency\", \"expected\": \"bad-frequency\", \"passed\": true}, {\"check\": \"control: bad radius\", \"actual\": \"bad-radius\", \"expected\": \"bad-radius\", \"passed\": true}, {\"check\": \"regression: f0=50 fs=1000 r=99/100\", \"actual\": {\"b\": [0.991021586, -1.885035075, 0.991021586], \"a\": [0.991021586, -1.866184724, 0.971300257]}, \"expected\": {\"b\": [0.991021586, -1.885035075, 0.991021586], \"a\": [1.0, -1.883091902, 0.9801]}, \"passed\": false}, {\"check\": \"regression: f0=60 fs=480 r=0\", \"actual\": {\"b\": [1.707106781, -2.414213562, 1.707106781], \"a\": [1.707106781, 0.0, 0.0]}, \"expected\": {\"b\": [1.707106781, -2.414213562, 1.707106781], \"a\": [1.0, 0.0, 0.0]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.521,"exit_code":1,"observations":[{"actual":{"a":[1.0,0.0,0.0],"b":[0.097886967,-0.186192076,0.097886967]},"check":"regression: f0=50 fs=1000 r=0","expected":{"a":[1.0,0.0,0.0],"b":[10.215864547,-19.431729095,10.215864547]},"passed":false},{"actual":{"a":[1.0,-1.711901729,0.81],"b":[0.997846004,-1.898015889,0.997846004]},"check":"regression: f0=50 fs=1000 r=9/10","expected":{"a":[1.0,-1.711901729,0.81],"b":[1.002158645,-1.90621902,1.002158645]},"passed":false},{"actual":{"a":[1.0,-0.951056516,0.25],"b":[0.327443054,-0.622833701,0.327443054]},"check":"regression: f0=50 fs=1000 r=1/2","expected":{"a":[1.0,-0.951056516,0.25],"b":[3.053966137,-5.80898879,3.053966137]},"passed":false},{"actual":"bad-frequency","check":"control: at nyquist","expected":"bad-frequency","passed":true},{"actual":"bad-radius","check":"control: bad radius","expected":"bad-radius","passed":true},{"actual":{"a":[1.0,-1.883091902,0.9801],"b":[1.009059756,-1.919345712,1.009059756]},"check":"regression: f0=50 fs=1000 r=99/100","expected":{"a":[1.0,-1.883091902,0.9801],"b":[0.991021586,-1.885035075,0.991021586]},"passed":false},{"actual":{"a":[1.0,0.0,0.0],"b":[0.585786438,-0.828427125,0.585786438]},"check":"regression: f0=60 fs=480 r=0","expected":{"a":[1.0,0.0,0.0],"b":[1.707106781,-2.414213562,1.707106781]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: f0=50 fs=1000 r=0\", \"actual\": {\"b\": [0.097886967, -0.186192076, 0.097886967], \"a\": [1.0, 0.0, 0.0]}, \"expected\": {\"b\": [10.215864547, -19.431729095, 10.215864547], \"a\": [1.0, 0.0, 0.0]}, \"passed\": false}, {\"check\": \"regression: f0=50 fs=1000 r=9/10\", \"actual\": {\"b\": [0.997846004, -1.898015889, 0.997846004], \"a\": [1.0, -1.711901729, 0.81]}, \"expected\": {\"b\": [1.002158645, -1.90621902, 1.002158645], \"a\": [1.0, -1.711901729, 0.81]}, \"passed\": false}, {\"check\": \"regression: f0=50 fs=1000 r=1/2\", \"actual\": {\"b\": [0.327443054, -0.622833701, 0.327443054], \"a\": [1.0, -0.951056516, 0.25]}, \"expected\": {\"b\": [3.053966137, -5.80898879, 3.053966137], \"a\": [1.0, -0.951056516, 0.25]}, \"passed\": false}, {\"check\": \"control: at nyquist\", \"actual\": \"bad-frequency\", \"expected\": \"bad-frequency\", \"passed\": true}, {\"check\": \"control: bad radius\", \"actual\": \"bad-radius\", \"expected\": \"bad-radius\", \"passed\": true}, {\"check\": \"regression: f0=50 fs=1000 r=99/100\", \"actual\": {\"b\": [1.009059756, -1.919345712, 1.009059756], \"a\": [1.0, -1.883091902, 0.9801]}, \"expected\": {\"b\": [0.991021586, -1.885035075, 0.991021586], \"a\": [1.0, -1.883091902, 0.9801]}, \"passed\": false}, {\"check\": \"regression: f0=60 fs=480 r=0\", \"actual\": {\"b\": [0.585786438, -0.828427125, 0.585786438], \"a\": [1.0, 0.0, 0.0]}, \"expected\": {\"b\": [1.707106781, -2.414213562, 1.707106781], \"a\": [1.0, 0.0, 0.0]}, \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}