{"abstract":"Stubs that contain a leap day from the previous year, or none at all, use the wrong year length.","category":"Bond day-count conventions","checks":8,"contract":"Inputs start < end [y,m,d]. Count whole years n stepping back from the end date (an end of 29 February maps to 28 February in non-leap years) while the stepped date is not before start. The stub runs from start to the end stepped back n years; its denominator is 366 if a 29 February lies in (start, stub end], else 365. Return n + stub days/denominator rounded to 9 decimals.","evaluation_group":"w2-bond_day_count_conventions-act-act-afb","failed_approach":"Testing the start year has the mirror-image problem.","family":"w2-bond_day_count_conventions-act-act-afb-stub-denominator-source","id":"FA-61306","implementations":{"attempt":{"sha256":"b10d3b30b6057efb1a69e5a1db5caeed741a7aadbfa144cc2dfa7c56c34221d8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport datetime\nN = 1\nobservations = []\ndef solve(a, b):\n    A = datetime.date(*a)\n    B = datetime.date(*b)\n    def leap(y):\n        return (y % 4 == 0 and y % 100 != 0) or y % 400 == 0\n    def back_years(n):\n        y = B.year - n\n        if B.month == 2 and B.day == 29 and not leap(y):\n            return datetime.date(y, 2, 28)\n        return datetime.date(y, B.month, B.day)\n    n = 0\n    while back_years(n + 1) >= A:\n        n += 1\n    stub_end = back_years(n)\n    has29 = any(leap(y) and A < datetime.date(y, 2, 29) <= stub_end for y in range(A.year, stub_end.year + 1))\n    den = 366 if leap(A.year) else 365\n    return round(n + (stub_end - A).days / den, 9)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression stub denominator source 1', [[2032, 5, 5], [2036, 10, 2]], 4.410958904], ['regression stub denominator source 2', [[2052, 9, 30], [2060, 10, 9]], 8.024657534], ['partial repair probe 1', [[1999, 8, 31], [2007, 4, 1]], 7.584699454], ['partial repair probe 2', [[1996, 12, 22], [2004, 2, 29]], 7.18630137], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2045, 1, 30], [2052, 5, 23]], 7.309589041], ['normal control 2', [[2001, 6, 1], [2003, 5, 15]], 1.953424658]], [['regression stub denominator source 1', [[2055, 10, 31], [2062, 2, 9]], 6.276712329], ['regression stub denominator source 2', [[2020, 6, 30], [2021, 9, 8]], 1.191780822], ['partial repair probe 1', [[1991, 12, 29], [1993, 10, 14]], 1.792349727], ['partial repair probe 2', [[2007, 3, 19], [2008, 2, 29]], 0.948087432], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2090, 4, 30], [2094, 9, 11]], 4.367123288], ['normal control 2', [[2020, 2, 15], [2024, 2, 29]], 4.038251366]], [['regression stub denominator source 1', [[2048, 11, 1], [2050, 11, 11]], 2.02739726], ['regression stub denominator source 2', [[2068, 4, 18], [2069, 12, 1]], 1.621917808], ['partial repair probe 1', [[2048, 12, 15], [2055, 4, 3]], 6.298630137], ['partial repair probe 2', [[2003, 7, 18], [2008, 2, 29]], 4.617486339], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2021, 2, 21], [2024, 2, 29]], 3.019178082], ['normal control 2', [[2014, 5, 4], [2016, 2, 29]], 1.821917808]], [['regression stub denominator source 1', [[2080, 5, 22], [2086, 7, 16]], 6.150684932], ['regression stub denominator source 2', [[2032, 4, 16], [2038, 9, 3]], 6.383561644], ['partial repair probe 1', [[1992, 7, 29], [1997, 7, 8]], 4.942465753], ['partial repair probe 2', [[2000, 12, 6], [2008, 2, 29]], 7.230136986], ['boundary control 1', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['boundary control 2', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['normal control 1', [[2002, 2, 11], [2008, 2, 29]], 6.046575342], ['normal control 2', [[2079, 4, 12], [2082, 5, 2]], 3.054794521]], [['regression stub denominator source 1', [[2024, 2, 29], [2027, 7, 20]], 3.389041096], ['regression stub denominator source 2', [[2016, 5, 31], [2018, 11, 21]], 2.476712329], ['partial repair probe 1', [[2027, 8, 10], [2028, 2, 29]], 0.554644809], ['partial repair probe 2', [[2067, 10, 31], [2069, 10, 1]], 1.918032787], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2009, 2, 17], [2016, 2, 29]], 7.030136986], ['normal control 2', [[2012, 2, 21], [2020, 2, 29]], 8.021857923]]]\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":"82b38913abd3060366c0631b060f3b8e5f050487a228d82dc836af679fcdfd76","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport datetime\nN = 1\nobservations = []\ndef solve(a, b):\n    A = datetime.date(*a)\n    B = datetime.date(*b)\n    def leap(y):\n        return (y % 4 == 0 and y % 100 != 0) or y % 400 == 0\n    def back_years(n):\n        y = B.year - n\n        if B.month == 2 and B.day == 29 and not leap(y):\n            return datetime.date(y, 2, 28)\n        return datetime.date(y, B.month, B.day)\n    n = 0\n    while back_years(n + 1) >= A:\n        n += 1\n    stub_end = back_years(n)\n    has29 = any(leap(y) and A < datetime.date(y, 2, 29) <= stub_end for y in range(A.year, stub_end.year + 1))\n    den = 366 if leap(stub_end.year) else 365\n    return round(n + (stub_end - A).days / den, 9)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression stub denominator source 1', [[2032, 5, 5], [2036, 10, 2]], 4.410958904], ['regression stub denominator source 2', [[2052, 9, 30], [2060, 10, 9]], 8.024657534], ['partial repair probe 1', [[1999, 8, 31], [2007, 4, 1]], 7.584699454], ['partial repair probe 2', [[1996, 12, 22], [2004, 2, 29]], 7.18630137], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2045, 1, 30], [2052, 5, 23]], 7.309589041], ['normal control 2', [[2001, 6, 1], [2003, 5, 15]], 1.953424658]], [['regression stub denominator source 1', [[2055, 10, 31], [2062, 2, 9]], 6.276712329], ['regression stub denominator source 2', [[2020, 6, 30], [2021, 9, 8]], 1.191780822], ['partial repair probe 1', [[1991, 12, 29], [1993, 10, 14]], 1.792349727], ['partial repair probe 2', [[2007, 3, 19], [2008, 2, 29]], 0.948087432], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2090, 4, 30], [2094, 9, 11]], 4.367123288], ['normal control 2', [[2020, 2, 15], [2024, 2, 29]], 4.038251366]], [['regression stub denominator source 1', [[2048, 11, 1], [2050, 11, 11]], 2.02739726], ['regression stub denominator source 2', [[2068, 4, 18], [2069, 12, 1]], 1.621917808], ['partial repair probe 1', [[2048, 12, 15], [2055, 4, 3]], 6.298630137], ['partial repair probe 2', [[2003, 7, 18], [2008, 2, 29]], 4.617486339], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2021, 2, 21], [2024, 2, 29]], 3.019178082], ['normal control 2', [[2014, 5, 4], [2016, 2, 29]], 1.821917808]], [['regression stub denominator source 1', [[2080, 5, 22], [2086, 7, 16]], 6.150684932], ['regression stub denominator source 2', [[2032, 4, 16], [2038, 9, 3]], 6.383561644], ['partial repair probe 1', [[1992, 7, 29], [1997, 7, 8]], 4.942465753], ['partial repair probe 2', [[2000, 12, 6], [2008, 2, 29]], 7.230136986], ['boundary control 1', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['boundary control 2', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['normal control 1', [[2002, 2, 11], [2008, 2, 29]], 6.046575342], ['normal control 2', [[2079, 4, 12], [2082, 5, 2]], 3.054794521]], [['regression stub denominator source 1', [[2024, 2, 29], [2027, 7, 20]], 3.389041096], ['regression stub denominator source 2', [[2016, 5, 31], [2018, 11, 21]], 2.476712329], ['partial repair probe 1', [[2027, 8, 10], [2028, 2, 29]], 0.554644809], ['partial repair probe 2', [[2067, 10, 31], [2069, 10, 1]], 1.918032787], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2009, 2, 17], [2016, 2, 29]], 7.030136986], ['normal control 2', [[2012, 2, 21], [2020, 2, 29]], 8.021857923]]]\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"},"fixed":{"sha256":"ccb5ad41e9112fd0e877c3e3f8b313d4b83254f67a8b8e9d5616448444e39464","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport datetime\nN = 1\nobservations = []\ndef solve(a, b):\n    A = datetime.date(*a)\n    B = datetime.date(*b)\n    def leap(y):\n        return (y % 4 == 0 and y % 100 != 0) or y % 400 == 0\n    def back_years(n):\n        y = B.year - n\n        if B.month == 2 and B.day == 29 and not leap(y):\n            return datetime.date(y, 2, 28)\n        return datetime.date(y, B.month, B.day)\n    n = 0\n    while back_years(n + 1) >= A:\n        n += 1\n    stub_end = back_years(n)\n    has29 = any(leap(y) and A < datetime.date(y, 2, 29) <= stub_end for y in range(A.year, stub_end.year + 1))\n    den = 366 if has29 else 365\n    return round(n + (stub_end - A).days / den, 9)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression stub denominator source 1', [[2032, 5, 5], [2036, 10, 2]], 4.410958904], ['regression stub denominator source 2', [[2052, 9, 30], [2060, 10, 9]], 8.024657534], ['partial repair probe 1', [[1999, 8, 31], [2007, 4, 1]], 7.584699454], ['partial repair probe 2', [[1996, 12, 22], [2004, 2, 29]], 7.18630137], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2045, 1, 30], [2052, 5, 23]], 7.309589041], ['normal control 2', [[2001, 6, 1], [2003, 5, 15]], 1.953424658]], [['regression stub denominator source 1', [[2055, 10, 31], [2062, 2, 9]], 6.276712329], ['regression stub denominator source 2', [[2020, 6, 30], [2021, 9, 8]], 1.191780822], ['partial repair probe 1', [[1991, 12, 29], [1993, 10, 14]], 1.792349727], ['partial repair probe 2', [[2007, 3, 19], [2008, 2, 29]], 0.948087432], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2090, 4, 30], [2094, 9, 11]], 4.367123288], ['normal control 2', [[2020, 2, 15], [2024, 2, 29]], 4.038251366]], [['regression stub denominator source 1', [[2048, 11, 1], [2050, 11, 11]], 2.02739726], ['regression stub denominator source 2', [[2068, 4, 18], [2069, 12, 1]], 1.621917808], ['partial repair probe 1', [[2048, 12, 15], [2055, 4, 3]], 6.298630137], ['partial repair probe 2', [[2003, 7, 18], [2008, 2, 29]], 4.617486339], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2021, 2, 21], [2024, 2, 29]], 3.019178082], ['normal control 2', [[2014, 5, 4], [2016, 2, 29]], 1.821917808]], [['regression stub denominator source 1', [[2080, 5, 22], [2086, 7, 16]], 6.150684932], ['regression stub denominator source 2', [[2032, 4, 16], [2038, 9, 3]], 6.383561644], ['partial repair probe 1', [[1992, 7, 29], [1997, 7, 8]], 4.942465753], ['partial repair probe 2', [[2000, 12, 6], [2008, 2, 29]], 7.230136986], ['boundary control 1', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['boundary control 2', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['normal control 1', [[2002, 2, 11], [2008, 2, 29]], 6.046575342], ['normal control 2', [[2079, 4, 12], [2082, 5, 2]], 3.054794521]], [['regression stub denominator source 1', [[2024, 2, 29], [2027, 7, 20]], 3.389041096], ['regression stub denominator source 2', [[2016, 5, 31], [2018, 11, 21]], 2.476712329], ['partial repair probe 1', [[2027, 8, 10], [2028, 2, 29]], 0.554644809], ['partial repair probe 2', [[2067, 10, 31], [2069, 10, 1]], 1.918032787], ['boundary control 1', [[2024, 1, 1], [2025, 1, 1]], 1.0], ['boundary control 2', [[2023, 2, 28], [2024, 2, 29]], 1.0], ['normal control 1', [[2009, 2, 17], [2016, 2, 29]], 7.030136986], ['normal control 2', [[2012, 2, 21], [2020, 2, 29]], 8.021857923]]]\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 toy contract stated explicitly in the contract field; no claim of conformance to any published convention text. 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-bond_day_count_conventions-act-act-afb-stub-denominator-source","generated_at":"2026-09-29T14:46:54.143374+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Bond accrual and pricing systems depend on exact day-count arithmetic; a single-day error changes settlement cash.","repair":"Use 366 only when a 29 February lies inside the stub.","root_cause":"The denominator tests leap(stub_end.year) instead of searching the stub for 29 February.","sha256":"1aba9944d12c668363c49fd2855eddd5942bfae7e96bf5187ce2fa678a1c000d","title":"Act/Act AFB whole-year decomposition: the stub denominator follows the leap status of the stub end year · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.03,"exit_code":1,"observations":[{"actual":4.409836066,"check":"regression stub denominator source 1","expected":4.410958904,"passed":false},{"actual":8.024590164,"check":"regression stub denominator source 2","expected":8.024657534,"passed":false},{"actual":7.58630137,"check":"partial repair probe 1","expected":7.584699454,"passed":false},{"actual":7.18579235,"check":"partial repair probe 2","expected":7.18630137,"passed":false},{"actual":1.0,"check":"boundary control 1","expected":1.0,"passed":true},{"actual":1.0,"check":"boundary control 2","expected":1.0,"passed":true},{"actual":7.309589041,"check":"normal control 1","expected":7.309589041,"passed":true},{"actual":1.953424658,"check":"normal control 2","expected":1.953424658,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression stub denominator source 1\", \"actual\": 4.409836066, \"expected\": 4.410958904, \"passed\": false}, {\"check\": \"regression stub denominator source 2\", \"actual\": 8.024590164, \"expected\": 8.024657534, \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": 7.58630137, \"expected\": 7.584699454, \"passed\": false}, {\"check\": \"partial repair probe 2\", \"actual\": 7.18579235, \"expected\": 7.18630137, \"passed\": false}, {\"check\": \"boundary control 1\", \"actual\": 1.0, \"expected\": 1.0, \"passed\": true}, {\"check\": \"boundary control 2\", \"actual\": 1.0, \"expected\": 1.0, \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": 7.309589041, \"expected\": 7.309589041, \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": 1.953424658, \"expected\": 1.953424658, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.931,"exit_code":1,"observations":[{"actual":4.409836066,"check":"regression stub denominator source 1","expected":4.410958904,"passed":false},{"actual":8.024590164,"check":"regression stub denominator source 2","expected":8.024657534,"passed":false},{"actual":7.584699454,"check":"partial repair probe 1","expected":7.584699454,"passed":true},{"actual":7.18630137,"check":"partial repair probe 2","expected":7.18630137,"passed":true},{"actual":1.0,"check":"boundary control 1","expected":1.0,"passed":true},{"actual":1.0,"check":"boundary control 2","expected":1.0,"passed":true},{"actual":7.309589041,"check":"normal control 1","expected":7.309589041,"passed":true},{"actual":1.953424658,"check":"normal control 2","expected":1.953424658,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression stub denominator source 1\", \"actual\": 4.409836066, \"expected\": 4.410958904, \"passed\": false}, {\"check\": \"regression stub denominator source 2\", \"actual\": 8.024590164, \"expected\": 8.024657534, \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": 7.584699454, \"expected\": 7.584699454, \"passed\": true}, {\"check\": \"partial repair probe 2\", \"actual\": 7.18630137, \"expected\": 7.18630137, \"passed\": true}, {\"check\": \"boundary control 1\", \"actual\": 1.0, \"expected\": 1.0, \"passed\": true}, {\"check\": \"boundary control 2\", \"actual\": 1.0, \"expected\": 1.0, \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": 7.309589041, \"expected\": 7.309589041, \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": 1.953424658, \"expected\": 1.953424658, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.601,"exit_code":0,"observations":[{"actual":4.410958904,"check":"regression stub denominator source 1","expected":4.410958904,"passed":true},{"actual":8.024657534,"check":"regression stub denominator source 2","expected":8.024657534,"passed":true},{"actual":7.584699454,"check":"partial repair probe 1","expected":7.584699454,"passed":true},{"actual":7.18630137,"check":"partial repair probe 2","expected":7.18630137,"passed":true},{"actual":1.0,"check":"boundary control 1","expected":1.0,"passed":true},{"actual":1.0,"check":"boundary control 2","expected":1.0,"passed":true},{"actual":7.309589041,"check":"normal control 1","expected":7.309589041,"passed":true},{"actual":1.953424658,"check":"normal control 2","expected":1.953424658,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression stub denominator source 1\", \"actual\": 4.410958904, \"expected\": 4.410958904, \"passed\": true}, {\"check\": \"regression stub denominator source 2\", \"actual\": 8.024657534, \"expected\": 8.024657534, \"passed\": true}, {\"check\": \"partial repair probe 1\", \"actual\": 7.584699454, \"expected\": 7.584699454, \"passed\": true}, {\"check\": \"partial repair probe 2\", \"actual\": 7.18630137, \"expected\": 7.18630137, \"passed\": true}, {\"check\": \"boundary control 1\", \"actual\": 1.0, \"expected\": 1.0, \"passed\": true}, {\"check\": \"boundary control 2\", \"actual\": 1.0, \"expected\": 1.0, \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": 7.309589041, \"expected\": 7.309589041, \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": 1.953424658, \"expected\": 1.953424658, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}