{"abstract":"Late payments report lateness up to the statement date instead of the payment date.","category":"Loan amortization schedules","checks":7,"contract":"x = {'due_day', 'grace', 'paid_day' or None, 'payment_due', 'paid_amount', 'tolerance', 'fee_bp', 'fee_min', 'fee_max', 'as_of'}. A payment is on time when paid_day is not None, paid_day <= due_day + grace and payment_due - paid_amount <= tolerance. Otherwise fee = clamp(round_half_up(payment_due*fee_bp/10000), fee_min, fee_max) and days_late = max(0, (paid_day or as_of when unpaid) - due_day). Return {'late', 'fee', 'days_late'}.","evaluation_group":"w2-loan-amortization-schedules-late-fee-grace-period","failed_approach":"Using the grace deadline for unpaid loans understates delinquency.","family":"w2-loan-amortization-schedules-late-fee-grace-period-unpaid-lateness-end","id":"FA-58531","implementations":{"attempt":{"sha256":"00db3166230233a76dca67510e42735fe472bbbc1fc5ce95139da89d0ce9ee26","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\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    deadline = x['due_day'] + x['grace']\n    paid = x['paid_day']\n    short = x['payment_due'] - x['paid_amount']\n    on_time = paid is not None and paid <= deadline and short <= x['tolerance']\n    if on_time:\n        return {'late': False, 'fee': 0, 'days_late': 0}\n    end = paid if paid is not None else deadline\n    fee = rnd(x['payment_due'] * x['fee_bp'], 10000)\n    fee = max(x['fee_min'], min(fee, x['fee_max']))\n    return {'late': True, 'fee': fee, 'days_late': max(0, end - x['due_day'])}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: unpaid lateness end', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 150000, 'paid_amount': 99999, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 25}, {'late': True, 'fee': 5000, 'days_late': 0}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 1, 'grace': 15, 'paid_day': None, 'payment_due': 150000, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 5000, 'days_late': 40}], ['control 1', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 5, 'grace': 15, 'paid_day': 20, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 0, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 5, 'grace': 0, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 0, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 2500, 'days_late': 40}], ['control 5', {'due_day': 1, 'grace': 0, 'paid_day': 0, 'payment_due': 100000, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 1, 'grace': 0, 'paid_day': 2, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 2500, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 15, 'grace': 10, 'paid_day': None, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 55}, {'late': True, 'fee': 2500, 'days_late': 40}], ['control 1', {'due_day': 15, 'grace': 15, 'paid_day': 18, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 5, 'grace': 15, 'paid_day': 8, 'payment_due': 150000, 'paid_amount': 150000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 5, 'grace': 10, 'paid_day': 5, 'payment_due': 100000, 'paid_amount': 99999, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 25}, {'late': True, 'fee': 4000, 'days_late': 0}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 0, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 1500, 'days_late': 40}], ['control 1', {'due_day': 5, 'grace': 0, 'paid_day': 5, 'payment_due': 2500, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 15, 'grace': 0, 'paid_day': 14, 'payment_due': 100000, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 1, 'grace': 15, 'paid_day': 16, 'payment_due': 2500, 'paid_amount': 150000, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 2500, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 1, 'grace': 15, 'paid_day': 0, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 5, 'grace': 0, 'paid_day': 6, 'payment_due': 2500, 'paid_amount': 0, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 100, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 15, 'paid_day': None, 'payment_due': 100000, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 25}, {'late': True, 'fee': 5000, 'days_late': 20}], ['control 1', {'due_day': 1, 'grace': 10, 'paid_day': 1, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 20000, 'paid_amount': 20000, 'tolerance': 100, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 20000, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 150000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 2500, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 1, 'grace': 0, 'paid_day': 2, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 21}, {'late': True, 'fee': 4000, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 10, 'paid_day': None, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': True, 'fee': 5000, 'days_late': 40}], ['control 1', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 15, 'grace': 10, 'paid_day': 14, 'payment_due': 150000, 'paid_amount': 150000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 1, 'grace': 15, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 1500, 'days_late': 40}], ['control 4', {'due_day': 1, 'grace': 15, 'paid_day': 16, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 10, 'paid_day': None, 'payment_due': 20000, 'paid_amount': 0, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 25}, {'late': True, 'fee': 1500, 'days_late': 20}]]]\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":"6f8d6229b0d53f2b28c5b25f8161086f2d94796919b6ff9d06019f7b10836c1d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\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    deadline = x['due_day'] + x['grace']\n    paid = x['paid_day']\n    short = x['payment_due'] - x['paid_amount']\n    on_time = paid is not None and paid <= deadline and short <= x['tolerance']\n    if on_time:\n        return {'late': False, 'fee': 0, 'days_late': 0}\n    end = x['as_of']\n    fee = rnd(x['payment_due'] * x['fee_bp'], 10000)\n    fee = max(x['fee_min'], min(fee, x['fee_max']))\n    return {'late': True, 'fee': fee, 'days_late': max(0, end - x['due_day'])}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: unpaid lateness end', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 150000, 'paid_amount': 99999, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 25}, {'late': True, 'fee': 5000, 'days_late': 0}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 1, 'grace': 15, 'paid_day': None, 'payment_due': 150000, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 5000, 'days_late': 40}], ['control 1', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 5, 'grace': 15, 'paid_day': 20, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 0, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 5, 'grace': 0, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 0, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 2500, 'days_late': 40}], ['control 5', {'due_day': 1, 'grace': 0, 'paid_day': 0, 'payment_due': 100000, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 1, 'grace': 0, 'paid_day': 2, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 2500, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 15, 'grace': 10, 'paid_day': None, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 55}, {'late': True, 'fee': 2500, 'days_late': 40}], ['control 1', {'due_day': 15, 'grace': 15, 'paid_day': 18, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 5, 'grace': 15, 'paid_day': 8, 'payment_due': 150000, 'paid_amount': 150000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 5, 'grace': 10, 'paid_day': 5, 'payment_due': 100000, 'paid_amount': 99999, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 25}, {'late': True, 'fee': 4000, 'days_late': 0}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 0, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 1500, 'days_late': 40}], ['control 1', {'due_day': 5, 'grace': 0, 'paid_day': 5, 'payment_due': 2500, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 15, 'grace': 0, 'paid_day': 14, 'payment_due': 100000, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 1, 'grace': 15, 'paid_day': 16, 'payment_due': 2500, 'paid_amount': 150000, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 2500, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 1, 'grace': 15, 'paid_day': 0, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 5, 'grace': 0, 'paid_day': 6, 'payment_due': 2500, 'paid_amount': 0, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 100, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 15, 'paid_day': None, 'payment_due': 100000, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 25}, {'late': True, 'fee': 5000, 'days_late': 20}], ['control 1', {'due_day': 1, 'grace': 10, 'paid_day': 1, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 20000, 'paid_amount': 20000, 'tolerance': 100, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 20000, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 150000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 2500, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 1, 'grace': 0, 'paid_day': 2, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 21}, {'late': True, 'fee': 4000, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 10, 'paid_day': None, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': True, 'fee': 5000, 'days_late': 40}], ['control 1', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 15, 'grace': 10, 'paid_day': 14, 'payment_due': 150000, 'paid_amount': 150000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 1, 'grace': 15, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 1500, 'days_late': 40}], ['control 4', {'due_day': 1, 'grace': 15, 'paid_day': 16, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 10, 'paid_day': None, 'payment_due': 20000, 'paid_amount': 0, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 25}, {'late': True, 'fee': 1500, 'days_late': 20}]]]\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":"7d2bf22649126d8ee021350ebe552614276566093c318b4ce8265268b3272196","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\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    deadline = x['due_day'] + x['grace']\n    paid = x['paid_day']\n    short = x['payment_due'] - x['paid_amount']\n    on_time = paid is not None and paid <= deadline and short <= x['tolerance']\n    if on_time:\n        return {'late': False, 'fee': 0, 'days_late': 0}\n    end = paid if paid is not None else x['as_of']\n    fee = rnd(x['payment_due'] * x['fee_bp'], 10000)\n    fee = max(x['fee_min'], min(fee, x['fee_max']))\n    return {'late': True, 'fee': fee, 'days_late': max(0, end - x['due_day'])}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: unpaid lateness end', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 150000, 'paid_amount': 99999, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 25}, {'late': True, 'fee': 5000, 'days_late': 0}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 1, 'grace': 15, 'paid_day': None, 'payment_due': 150000, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 5000, 'days_late': 40}], ['control 1', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 5, 'grace': 15, 'paid_day': 20, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 0, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 5, 'grace': 0, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 0, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 2500, 'days_late': 40}], ['control 5', {'due_day': 1, 'grace': 0, 'paid_day': 0, 'payment_due': 100000, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 1, 'grace': 0, 'paid_day': 2, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 2500, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 15, 'grace': 10, 'paid_day': None, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 55}, {'late': True, 'fee': 2500, 'days_late': 40}], ['control 1', {'due_day': 15, 'grace': 15, 'paid_day': 18, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 20000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 5, 'grace': 15, 'paid_day': 8, 'payment_due': 150000, 'paid_amount': 150000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 25}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 0, 'paid_day': 4, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 5, 'grace': 10, 'paid_day': 5, 'payment_due': 100000, 'paid_amount': 99999, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 25}, {'late': True, 'fee': 4000, 'days_late': 0}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 0, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 1500, 'days_late': 40}], ['control 1', {'due_day': 5, 'grace': 0, 'paid_day': 5, 'payment_due': 2500, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 15, 'grace': 0, 'paid_day': 14, 'payment_due': 100000, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 1, 'grace': 15, 'paid_day': 16, 'payment_due': 2500, 'paid_amount': 150000, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 2500, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 1, 'grace': 15, 'paid_day': 0, 'payment_due': 2500, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 5, 'grace': 0, 'paid_day': 6, 'payment_due': 2500, 'paid_amount': 0, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 45}, {'late': True, 'fee': 100, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 15, 'paid_day': None, 'payment_due': 100000, 'paid_amount': 150000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 25}, {'late': True, 'fee': 5000, 'days_late': 20}], ['control 1', {'due_day': 1, 'grace': 10, 'paid_day': 1, 'payment_due': 20000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 20000, 'paid_amount': 20000, 'tolerance': 100, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 20000, 'paid_amount': 99999, 'tolerance': 10, 'fee_bp': 400, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 4', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 150000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 10000, 'as_of': 21}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 15, 'paid_day': 5, 'payment_due': 2500, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': False, 'fee': 0, 'days_late': 0}]], [['regression: unpaid lateness end', {'due_day': 1, 'grace': 0, 'paid_day': 2, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 100, 'fee_bp': 400, 'fee_min': 0, 'fee_max': 5000, 'as_of': 21}, {'late': True, 'fee': 4000, 'days_late': 1}], ['regression: unpaid lateness end, partial-repair probe', {'due_day': 5, 'grace': 10, 'paid_day': None, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 2500, 'fee_max': 10000, 'as_of': 45}, {'late': True, 'fee': 5000, 'days_late': 40}], ['control 1', {'due_day': 1, 'grace': 0, 'paid_day': 1, 'payment_due': 100000, 'paid_amount': 149990, 'tolerance': 0, 'fee_bp': 400, 'fee_min': 2500, 'fee_max': 5000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 2', {'due_day': 15, 'grace': 10, 'paid_day': 14, 'payment_due': 150000, 'paid_amount': 150000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 0, 'fee_max': 5000, 'as_of': 35}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 3', {'due_day': 1, 'grace': 15, 'paid_day': None, 'payment_due': 2500, 'paid_amount': 20000, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 5000, 'as_of': 41}, {'late': True, 'fee': 1500, 'days_late': 40}], ['control 4', {'due_day': 1, 'grace': 15, 'paid_day': 16, 'payment_due': 20000, 'paid_amount': 100000, 'tolerance': 10, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 41}, {'late': False, 'fee': 0, 'days_late': 0}], ['control 5', {'due_day': 5, 'grace': 10, 'paid_day': None, 'payment_due': 20000, 'paid_amount': 0, 'tolerance': 100, 'fee_bp': 500, 'fee_min': 1500, 'fee_max': 10000, 'as_of': 25}, {'late': True, 'fee': 1500, 'days_late': 20}]]]\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-late-fee-grace-period-unpaid-lateness-end","generated_at":"2026-09-29T14:46:27.551744+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 the payment day when paid and as_of only when unpaid.","root_cause":"The as-of day is used even when a payment was received.","sha256":"604b498bba1bde580a5becc8303fdbb0bbca1c922813827099423b08a278fdeb","title":"Late fee after grace period: unpaid lateness end · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.016,"exit_code":1,"observations":[{"actual":{"days_late":0,"fee":5000,"late":true},"check":"regression: unpaid lateness end","expected":{"days_late":0,"fee":5000,"late":true},"passed":true},{"actual":{"days_late":15,"fee":5000,"late":true},"check":"regression: unpaid lateness end, partial-repair probe","expected":{"days_late":40,"fee":5000,"late":true},"passed":false},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 1","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 2","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 3","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":0,"fee":2500,"late":true},"check":"control 4","expected":{"days_late":40,"fee":2500,"late":true},"passed":false},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 5","expected":{"days_late":0,"fee":0,"late":false},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: unpaid lateness end\", \"actual\": {\"late\": true, \"fee\": 5000, \"days_late\": 0}, \"expected\": {\"late\": true, \"fee\": 5000, \"days_late\": 0}, \"passed\": true}, {\"check\": \"regression: unpaid lateness end, partial-repair probe\", \"actual\": {\"late\": true, \"fee\": 5000, \"days_late\": 15}, \"expected\": {\"late\": true, \"fee\": 5000, \"days_late\": 40}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"late\": true, \"fee\": 2500, \"days_late\": 0}, \"expected\": {\"late\": true, \"fee\": 2500, \"days_late\": 40}, \"passed\": false}, {\"check\": \"control 5\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.656,"exit_code":1,"observations":[{"actual":{"days_late":20,"fee":5000,"late":true},"check":"regression: unpaid lateness end","expected":{"days_late":0,"fee":5000,"late":true},"passed":false},{"actual":{"days_late":40,"fee":5000,"late":true},"check":"regression: unpaid lateness end, partial-repair probe","expected":{"days_late":40,"fee":5000,"late":true},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 1","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 2","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 3","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":40,"fee":2500,"late":true},"check":"control 4","expected":{"days_late":40,"fee":2500,"late":true},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 5","expected":{"days_late":0,"fee":0,"late":false},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: unpaid lateness end\", \"actual\": {\"late\": true, \"fee\": 5000, \"days_late\": 20}, \"expected\": {\"late\": true, \"fee\": 5000, \"days_late\": 0}, \"passed\": false}, {\"check\": \"regression: unpaid lateness end, partial-repair probe\", \"actual\": {\"late\": true, \"fee\": 5000, \"days_late\": 40}, \"expected\": {\"late\": true, \"fee\": 5000, \"days_late\": 40}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"late\": true, \"fee\": 2500, \"days_late\": 40}, \"expected\": {\"late\": true, \"fee\": 2500, \"days_late\": 40}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.089,"exit_code":0,"observations":[{"actual":{"days_late":0,"fee":5000,"late":true},"check":"regression: unpaid lateness end","expected":{"days_late":0,"fee":5000,"late":true},"passed":true},{"actual":{"days_late":40,"fee":5000,"late":true},"check":"regression: unpaid lateness end, partial-repair probe","expected":{"days_late":40,"fee":5000,"late":true},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 1","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 2","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 3","expected":{"days_late":0,"fee":0,"late":false},"passed":true},{"actual":{"days_late":40,"fee":2500,"late":true},"check":"control 4","expected":{"days_late":40,"fee":2500,"late":true},"passed":true},{"actual":{"days_late":0,"fee":0,"late":false},"check":"control 5","expected":{"days_late":0,"fee":0,"late":false},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: unpaid lateness end\", \"actual\": {\"late\": true, \"fee\": 5000, \"days_late\": 0}, \"expected\": {\"late\": true, \"fee\": 5000, \"days_late\": 0}, \"passed\": true}, {\"check\": \"regression: unpaid lateness end, partial-repair probe\", \"actual\": {\"late\": true, \"fee\": 5000, \"days_late\": 40}, \"expected\": {\"late\": true, \"fee\": 5000, \"days_late\": 40}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"late\": true, \"fee\": 2500, \"days_late\": 40}, \"expected\": {\"late\": true, \"fee\": 2500, \"days_late\": 40}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"expected\": {\"late\": false, \"fee\": 0, \"days_late\": 0}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}