{"abstract":"The notch appears at fs/2 - f0.","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 flips the pole cosine sign as well, moving the poles to the mirrored frequency too.","family":"w2-digital_signal_filters-iir-notch-design-zero-pair-cosine-sign","id":"FA-91816","implementations":{"attempt":{"sha256":"0654499847a6993964a813cef2e1fba1ee47ebfc9be5a2f1f25cf9002ad8f766","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(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=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}], ['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=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['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=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=1 fs=8 r=99/100', ['1', '8', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['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=99/100', ['1', '8', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['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":"18d90c5040b1decbe11ac9b50034cd663ba0a9ade92073b75581997795b9b006","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(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=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}], ['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=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['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=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=1 fs=8 r=99/100', ['1', '8', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['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=99/100', ['1', '8', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['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-zero-pair-cosine-sign","generated_at":"2026-09-29T14:51:39.541240+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":"b1 is +2 cos w0 instead of -2 cos w0.","sha256":"6aa9d8ab63903a48920c9e0522ea5106ec947898120de570eb82479daf781963","title":"Notch design places the zeros at pi - w0 · 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":43.949,"exit_code":1,"observations":[{"actual":{"a":[1.0,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":true},{"actual":{"a":[1.0,1.711901729,0.81],"b":[35.979271016,-68.436640302,35.979271016]},"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":[22.485695231,-42.770333946,22.485695231]},"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":[39.465845194,-75.068498485,39.465845194]},"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":[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":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: f0=50 fs=1000 r=0\", \"actual\": {\"b\": [10.215864547, -19.431729095, 10.215864547], \"a\": [1.0, 0.0, 0.0]}, \"expected\": {\"b\": [10.215864547, -19.431729095, 10.215864547], \"a\": [1.0, 0.0, 0.0]}, \"passed\": true}, {\"check\": \"regression: f0=50 fs=1000 r=9/10\", \"actual\": {\"b\": [35.979271016, -68.436640302, 35.979271016], \"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\": [22.485695231, -42.770333946, 22.485695231], \"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\": [39.465845194, -75.068498485, 39.465845194], \"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\": [1.707106781, -2.414213562, 1.707106781], \"a\": [1.0, 0.0, 0.0]}, \"expected\": {\"b\": [1.707106781, -2.414213562, 1.707106781], \"a\": [1.0, 0.0, 0.0]}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.353,"exit_code":1,"observations":[{"actual":{"a":[1.0,0.0,0.0],"b":[0.256271408,0.487457185,0.256271408]},"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.025139782,0.047818707,0.025139782]},"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.076610667,0.145722149,0.076610667]},"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":[0.024860402,0.047287294,0.024860402]},"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.292893219,0.414213562,0.292893219]},"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.256271408, 0.487457185, 0.256271408], \"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.025139782, 0.047818707, 0.025139782], \"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.076610667, 0.145722149, 0.076610667], \"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\": [0.024860402, 0.047287294, 0.024860402], \"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.292893219, 0.414213562, 0.292893219], \"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."}}