{"abstract":"Insurance drops automatically at the borrower-request threshold.","category":"Loan amortization schedules","checks":7,"contract":"x = {'principal', 'rate_bp', 'months' n, 'orig_value', 'prepay': {'k': extra}}. Level payment is the exact annuity half-up; interest round_half_up(balance*bp/120000). The scheduled balance ignores prepayments; the actual balance applies each extra after payment k (capped at the balance). The request month is the first k with actual*100 <= 80*orig_value; the automatic month is the first k with scheduled*100 <= 78*orig_value, but never later than the midpoint month n//2 + 1. Return {'request', 'automatic'}.","evaluation_group":"w2-loan-amortization-schedules-mortgage-insurance-termination","failed_approach":"Measuring 78 percent of the loan amount instead of the property value delays termination.","family":"w2-loan-amortization-schedules-mortgage-insurance-termination-automatic-threshold","id":"FA-58741","implementations":{"attempt":{"sha256":"ac445dd5a911702174cccc6e42048da004078bdb810116d12e2f856dcdc23784","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    def rnd(n, d):\n        q, r = divmod(n, d)\n        return q + (1 if 2 * r >= d else 0)\n    def level(P, n):\n        if n <= 0 or P <= 0:\n            return 0\n        if bp == 0:\n            exact = Fraction(P, n)\n        else:\n            r = Fraction(bp, 120000)\n            exact = P * r / (1 - (1 + r) ** -n)\n        return math.floor(exact + Fraction(1, 2))\n    bp = x['rate_bp']\n    P = x['principal']\n    n = x['months']\n    pay = level(P, n)\n    sched = actual = P\n    auto = request = None\n    for k in range(1, n + 1):\n        sched -= pay - rnd(sched * bp, 120000)\n        if actual > 0:\n            actual -= pay - rnd(actual * bp, 120000)\n            actual -= min(x['prepay'].get(str(k), 0), max(actual, 0))\n        if request is None and actual * 100 <= 80 * x['orig_value']:\n            request = k\n        if auto is None and sched * 100 <= 78 * P:\n            auto = k\n    mid = n // 2 + 1\n    auto = mid if auto is None else min(auto, mid)\n    return {'request': request, 'automatic': auto}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: automatic threshold', {'principal': 200000, 'rate_bp': 1200, 'months': 120, 'orig_value': 220000, 'prepay': {'11': 5000, '18': 40000}}, {'request': 18, 'automatic': 29}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'21': 5000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 200000, 'prepay': {'6': 20000, '5': 5000}}, {'request': 5, 'automatic': 5}], ['control 3', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 4', {'principal': 160000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'orig_value': 200000, 'prepay': {'6': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'orig_value': 200000, 'prepay': {'24': 40000}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 190000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'12': 5000}}, {'request': 18, 'automatic': 35}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 24, 'orig_value': 205000, 'prepay': {'5': 20000}}, {'request': 5, 'automatic': 5}], ['control 2', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 205000, 'prepay': {'7': 40000}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 200000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'24': 5000, '2': 20000}}, {'request': 33, 'automatic': 181}], ['control 4', {'principal': 215000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'21': 20000}}, {'request': 7, 'automatic': 7}], ['control 5', {'principal': 100000, 'rate_bp': 1500, 'months': 48, 'orig_value': 205000, 'prepay': {'3': 40000, '20': 5000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 180000, 'rate_bp': 1200, 'months': 60, 'orig_value': 220000, 'prepay': {}}, {'request': 2, 'automatic': 4}], ['control 1', {'principal': 160000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 215000, 'rate_bp': 1200, 'months': 24, 'orig_value': 205000, 'prepay': {'2': 5000}}, {'request': 6, 'automatic': 7}], ['control 3', {'principal': 190000, 'rate_bp': 600, 'months': 24, 'orig_value': 205000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 4', {'principal': 100000, 'rate_bp': 1500, 'months': 360, 'orig_value': 250000, 'prepay': {'14': 5000, '22': 20000}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 220000, 'prepay': {'3': 20000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 200000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 3}], ['control 1', {'principal': 190000, 'rate_bp': 1500, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 215000, 'rate_bp': 600, 'months': 36, 'orig_value': 220000, 'prepay': {}}, {'request': 8, 'automatic': 8}], ['control 3', {'principal': 160000, 'rate_bp': 0, 'months': 120, 'orig_value': 220000, 'prepay': {'4': 5000}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 160000, 'rate_bp': 0, 'months': 36, 'orig_value': 200000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 199000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {'15': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 200000, 'prepay': {'12': 40000}}, {'request': 6, 'automatic': 6}]], [['regression: automatic threshold', {'principal': 199000, 'rate_bp': 600, 'months': 360, 'orig_value': 200000, 'prepay': {'22': 5000}}, {'request': 116, 'automatic': 148}], ['control 1', {'principal': 199000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {}}, {'request': 194, 'automatic': 181}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {'6': 20000}}, {'request': 3, 'automatic': 3}], ['control 3', {'principal': 200000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 190000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'18': 40000, '7': 40000}}, {'request': 7, 'automatic': 181}], ['control 5', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 1500, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'raised ' + type(exc).__name__\n    check(label, actual, 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":"6947e9f207e7e427919345fc5a0f6871b515ab172e7e64e885c92dc98f0a68be","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    def rnd(n, d):\n        q, r = divmod(n, d)\n        return q + (1 if 2 * r >= d else 0)\n    def level(P, n):\n        if n <= 0 or P <= 0:\n            return 0\n        if bp == 0:\n            exact = Fraction(P, n)\n        else:\n            r = Fraction(bp, 120000)\n            exact = P * r / (1 - (1 + r) ** -n)\n        return math.floor(exact + Fraction(1, 2))\n    bp = x['rate_bp']\n    P = x['principal']\n    n = x['months']\n    pay = level(P, n)\n    sched = actual = P\n    auto = request = None\n    for k in range(1, n + 1):\n        sched -= pay - rnd(sched * bp, 120000)\n        if actual > 0:\n            actual -= pay - rnd(actual * bp, 120000)\n            actual -= min(x['prepay'].get(str(k), 0), max(actual, 0))\n        if request is None and actual * 100 <= 80 * x['orig_value']:\n            request = k\n        if auto is None and sched * 100 <= 80 * x['orig_value']:\n            auto = k\n    mid = n // 2 + 1\n    auto = mid if auto is None else min(auto, mid)\n    return {'request': request, 'automatic': auto}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: automatic threshold', {'principal': 200000, 'rate_bp': 1200, 'months': 120, 'orig_value': 220000, 'prepay': {'11': 5000, '18': 40000}}, {'request': 18, 'automatic': 29}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'21': 5000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 200000, 'prepay': {'6': 20000, '5': 5000}}, {'request': 5, 'automatic': 5}], ['control 3', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 4', {'principal': 160000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'orig_value': 200000, 'prepay': {'6': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'orig_value': 200000, 'prepay': {'24': 40000}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 190000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'12': 5000}}, {'request': 18, 'automatic': 35}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 24, 'orig_value': 205000, 'prepay': {'5': 20000}}, {'request': 5, 'automatic': 5}], ['control 2', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 205000, 'prepay': {'7': 40000}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 200000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'24': 5000, '2': 20000}}, {'request': 33, 'automatic': 181}], ['control 4', {'principal': 215000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'21': 20000}}, {'request': 7, 'automatic': 7}], ['control 5', {'principal': 100000, 'rate_bp': 1500, 'months': 48, 'orig_value': 205000, 'prepay': {'3': 40000, '20': 5000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 180000, 'rate_bp': 1200, 'months': 60, 'orig_value': 220000, 'prepay': {}}, {'request': 2, 'automatic': 4}], ['control 1', {'principal': 160000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 215000, 'rate_bp': 1200, 'months': 24, 'orig_value': 205000, 'prepay': {'2': 5000}}, {'request': 6, 'automatic': 7}], ['control 3', {'principal': 190000, 'rate_bp': 600, 'months': 24, 'orig_value': 205000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 4', {'principal': 100000, 'rate_bp': 1500, 'months': 360, 'orig_value': 250000, 'prepay': {'14': 5000, '22': 20000}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 220000, 'prepay': {'3': 20000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 200000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 3}], ['control 1', {'principal': 190000, 'rate_bp': 1500, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 215000, 'rate_bp': 600, 'months': 36, 'orig_value': 220000, 'prepay': {}}, {'request': 8, 'automatic': 8}], ['control 3', {'principal': 160000, 'rate_bp': 0, 'months': 120, 'orig_value': 220000, 'prepay': {'4': 5000}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 160000, 'rate_bp': 0, 'months': 36, 'orig_value': 200000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 199000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {'15': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 200000, 'prepay': {'12': 40000}}, {'request': 6, 'automatic': 6}]], [['regression: automatic threshold', {'principal': 199000, 'rate_bp': 600, 'months': 360, 'orig_value': 200000, 'prepay': {'22': 5000}}, {'request': 116, 'automatic': 148}], ['control 1', {'principal': 199000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {}}, {'request': 194, 'automatic': 181}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {'6': 20000}}, {'request': 3, 'automatic': 3}], ['control 3', {'principal': 200000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 190000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'18': 40000, '7': 40000}}, {'request': 7, 'automatic': 181}], ['control 5', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 1500, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'raised ' + type(exc).__name__\n    check(label, actual, 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"},"fixed":{"sha256":"a0173125505d4de4fd9143eb5f2ad85b5a503350b534672c3fc6b8436e49cf18","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    def rnd(n, d):\n        q, r = divmod(n, d)\n        return q + (1 if 2 * r >= d else 0)\n    def level(P, n):\n        if n <= 0 or P <= 0:\n            return 0\n        if bp == 0:\n            exact = Fraction(P, n)\n        else:\n            r = Fraction(bp, 120000)\n            exact = P * r / (1 - (1 + r) ** -n)\n        return math.floor(exact + Fraction(1, 2))\n    bp = x['rate_bp']\n    P = x['principal']\n    n = x['months']\n    pay = level(P, n)\n    sched = actual = P\n    auto = request = None\n    for k in range(1, n + 1):\n        sched -= pay - rnd(sched * bp, 120000)\n        if actual > 0:\n            actual -= pay - rnd(actual * bp, 120000)\n            actual -= min(x['prepay'].get(str(k), 0), max(actual, 0))\n        if request is None and actual * 100 <= 80 * x['orig_value']:\n            request = k\n        if auto is None and sched * 100 <= 78 * x['orig_value']:\n            auto = k\n    mid = n // 2 + 1\n    auto = mid if auto is None else min(auto, mid)\n    return {'request': request, 'automatic': auto}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: automatic threshold', {'principal': 200000, 'rate_bp': 1200, 'months': 120, 'orig_value': 220000, 'prepay': {'11': 5000, '18': 40000}}, {'request': 18, 'automatic': 29}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'21': 5000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 200000, 'prepay': {'6': 20000, '5': 5000}}, {'request': 5, 'automatic': 5}], ['control 3', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 4', {'principal': 160000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'orig_value': 200000, 'prepay': {'6': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'orig_value': 200000, 'prepay': {'24': 40000}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 190000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'12': 5000}}, {'request': 18, 'automatic': 35}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 24, 'orig_value': 205000, 'prepay': {'5': 20000}}, {'request': 5, 'automatic': 5}], ['control 2', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 205000, 'prepay': {'7': 40000}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 200000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'24': 5000, '2': 20000}}, {'request': 33, 'automatic': 181}], ['control 4', {'principal': 215000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'21': 20000}}, {'request': 7, 'automatic': 7}], ['control 5', {'principal': 100000, 'rate_bp': 1500, 'months': 48, 'orig_value': 205000, 'prepay': {'3': 40000, '20': 5000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 180000, 'rate_bp': 1200, 'months': 60, 'orig_value': 220000, 'prepay': {}}, {'request': 2, 'automatic': 4}], ['control 1', {'principal': 160000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 215000, 'rate_bp': 1200, 'months': 24, 'orig_value': 205000, 'prepay': {'2': 5000}}, {'request': 6, 'automatic': 7}], ['control 3', {'principal': 190000, 'rate_bp': 600, 'months': 24, 'orig_value': 205000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 4', {'principal': 100000, 'rate_bp': 1500, 'months': 360, 'orig_value': 250000, 'prepay': {'14': 5000, '22': 20000}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 220000, 'prepay': {'3': 20000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]], [['regression: automatic threshold', {'principal': 200000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 3}], ['control 1', {'principal': 190000, 'rate_bp': 1500, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 215000, 'rate_bp': 600, 'months': 36, 'orig_value': 220000, 'prepay': {}}, {'request': 8, 'automatic': 8}], ['control 3', {'principal': 160000, 'rate_bp': 0, 'months': 120, 'orig_value': 220000, 'prepay': {'4': 5000}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 160000, 'rate_bp': 0, 'months': 36, 'orig_value': 200000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 5', {'principal': 199000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {'15': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 200000, 'prepay': {'12': 40000}}, {'request': 6, 'automatic': 6}]], [['regression: automatic threshold', {'principal': 199000, 'rate_bp': 600, 'months': 360, 'orig_value': 200000, 'prepay': {'22': 5000}}, {'request': 116, 'automatic': 148}], ['control 1', {'principal': 199000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {}}, {'request': 194, 'automatic': 181}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {'6': 20000}}, {'request': 3, 'automatic': 3}], ['control 3', {'principal': 200000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 190000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'18': 40000, '7': 40000}}, {'request': 7, 'automatic': 181}], ['control 5', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 6', {'principal': 180000, 'rate_bp': 1500, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}]]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'raised ' + type(exc).__name__\n    check(label, actual, 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 stipulated toy lending rules stated in the contract; money is integer cents and rates are basis points; it makes no claim of conformance to any regulation, servicing standard or product. 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-loan-amortization-schedules-mortgage-insurance-termination-automatic-threshold","generated_at":"2026-09-29T14:46:29.520489+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Amortization engines drive borrower statements, payoff quotes and investor remittances; a misplaced rounding step, boundary or ordering rule compounds across hundreds of periods.","repair":"Use 78 percent of original value for automatic termination.","root_cause":"The automatic test uses 80 percent.","sha256":"c6f7e23105a123d778e0eb7de3e54369f65a649e8605cd829940fef729271eec","title":"Mortgage insurance termination: automatic threshold · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.607,"exit_code":1,"observations":[{"actual":{"automatic":42,"request":18},"check":"regression: automatic threshold","expected":{"automatic":29,"request":18},"passed":false},{"actual":{"automatic":181,"request":1},"check":"control 1","expected":{"automatic":1,"request":1},"passed":false},{"actual":{"automatic":6,"request":5},"check":"control 2","expected":{"automatic":5,"request":5},"passed":false},{"actual":{"automatic":6,"request":4},"check":"control 3","expected":{"automatic":4,"request":4},"passed":false},{"actual":{"automatic":9,"request":1},"check":"control 4","expected":{"automatic":1,"request":1},"passed":false},{"actual":{"automatic":14,"request":1},"check":"control 5","expected":{"automatic":1,"request":1},"passed":false},{"actual":{"automatic":15,"request":1},"check":"control 6","expected":{"automatic":1,"request":1},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: automatic threshold\", \"actual\": {\"request\": 18, \"automatic\": 42}, \"expected\": {\"request\": 18, \"automatic\": 29}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"request\": 1, \"automatic\": 181}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": false}, {\"check\": \"control 2\", \"actual\": {\"request\": 5, \"automatic\": 6}, \"expected\": {\"request\": 5, \"automatic\": 5}, \"passed\": false}, {\"check\": \"control 3\", \"actual\": {\"request\": 4, \"automatic\": 6}, \"expected\": {\"request\": 4, \"automatic\": 4}, \"passed\": false}, {\"check\": \"control 4\", \"actual\": {\"request\": 1, \"automatic\": 9}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": false}, {\"check\": \"control 5\", \"actual\": {\"request\": 1, \"automatic\": 14}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": false}, {\"check\": \"control 6\", \"actual\": {\"request\": 1, \"automatic\": 15}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.183,"exit_code":1,"observations":[{"actual":{"automatic":25,"request":18},"check":"regression: automatic threshold","expected":{"automatic":29,"request":18},"passed":false},{"actual":{"automatic":1,"request":1},"check":"control 1","expected":{"automatic":1,"request":1},"passed":true},{"actual":{"automatic":5,"request":5},"check":"control 2","expected":{"automatic":5,"request":5},"passed":true},{"actual":{"automatic":4,"request":4},"check":"control 3","expected":{"automatic":4,"request":4},"passed":true},{"actual":{"automatic":1,"request":1},"check":"control 4","expected":{"automatic":1,"request":1},"passed":true},{"actual":{"automatic":1,"request":1},"check":"control 5","expected":{"automatic":1,"request":1},"passed":true},{"actual":{"automatic":1,"request":1},"check":"control 6","expected":{"automatic":1,"request":1},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: automatic threshold\", \"actual\": {\"request\": 18, \"automatic\": 25}, \"expected\": {\"request\": 18, \"automatic\": 29}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"request\": 5, \"automatic\": 5}, \"expected\": {\"request\": 5, \"automatic\": 5}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"request\": 4, \"automatic\": 4}, \"expected\": {\"request\": 4, \"automatic\": 4}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.108,"exit_code":0,"observations":[{"actual":{"automatic":29,"request":18},"check":"regression: automatic threshold","expected":{"automatic":29,"request":18},"passed":true},{"actual":{"automatic":1,"request":1},"check":"control 1","expected":{"automatic":1,"request":1},"passed":true},{"actual":{"automatic":5,"request":5},"check":"control 2","expected":{"automatic":5,"request":5},"passed":true},{"actual":{"automatic":4,"request":4},"check":"control 3","expected":{"automatic":4,"request":4},"passed":true},{"actual":{"automatic":1,"request":1},"check":"control 4","expected":{"automatic":1,"request":1},"passed":true},{"actual":{"automatic":1,"request":1},"check":"control 5","expected":{"automatic":1,"request":1},"passed":true},{"actual":{"automatic":1,"request":1},"check":"control 6","expected":{"automatic":1,"request":1},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: automatic threshold\", \"actual\": {\"request\": 18, \"automatic\": 29}, \"expected\": {\"request\": 18, \"automatic\": 29}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"request\": 5, \"automatic\": 5}, \"expected\": {\"request\": 5, \"automatic\": 5}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"request\": 4, \"automatic\": 4}, \"expected\": {\"request\": 4, \"automatic\": 4}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"request\": 1, \"automatic\": 1}, \"expected\": {\"request\": 1, \"automatic\": 1}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}