{"abstract":"Rolled entries land in a soft-closed period.","category":"Double-entry ledger accounting","checks":7,"contract":"x = {'periods': [[start_day, end_day, 'open'|'soft'|'closed']] (non-overlapping, any order), 'policy': 'reject'|'roll', 'entries': [[id, day, adjusting]]}. The period containing the day (start and end inclusive) is found; none gives [id, None, 'no_period']. Soft periods accept adjusting entries only. Open acceptance gives [id, day, 'posted']. Otherwise under 'roll' the entry posts on the start day of the earliest later open period ([id, start, 'rolled']) and with none, or under 'reject', gives [id, None, 'closed'].","evaluation_group":"w2-double-entry-ledger-accounting-period-lock","failed_approach":"Requiring the immediately adjacent period fails when a gap or closed period sits in between.","family":"w2-double-entry-ledger-accounting-period-lock-roll-target-status","id":"FA-58046","implementations":{"attempt":{"sha256":"cb06f538f9ab33cc6f0f43c926999470ddfc5e61e2eb7a7cf83a84d3e611697d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    periods = sorted(x['periods'])\n    out = []\n    for eid, date, adjusting in x['entries']:\n        found = None\n        for p in periods:\n            if p[0] <= date <= p[1]:\n                found = p\n                break\n        if found is None:\n            out.append([eid, None, 'no_period'])\n            continue\n        status = found[2]\n        if status == 'soft' and adjusting:\n            status = 'open'\n        if status == 'open':\n            out.append([eid, date, 'posted'])\n        elif x['policy'] == 'roll':\n            nxt = [p for p in periods if p[0] == found[1] + 1 and p[2] == 'open']\n            if nxt:\n                out.append([eid, nxt[0][0], 'rolled'])\n            else:\n                out.append([eid, None, 'closed'])\n        else:\n            out.append([eid, None, 'closed'])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: roll target status', {'periods': [[59, 88, 'soft'], [117, 146, 'open'], [31, 58, 'closed'], [89, 116, 'closed'], [1, 30, 'closed']], 'policy': 'roll', 'entries': [['E0', 120, False], ['E1', 31, True], ['E2', 59, False], ['E3', 120, False], ['E4', 59, True]]}, [['E0', 120, 'posted'], ['E1', 117, 'rolled'], ['E2', 117, 'rolled'], ['E3', 120, 'posted'], ['E4', 59, 'posted']]], ['control 1', {'periods': [[122, 151, 'soft'], [92, 121, 'soft'], [31, 60, 'closed'], [1, 30, 'soft'], [61, 91, 'open']], 'policy': 'reject', 'entries': [['E0', 151, False], ['E1', 125, False], ['E2', 121, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[31, 60, 'closed'], [61, 90, 'closed'], [1, 30, 'closed'], [91, 121, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 121, False], ['E2', 94, True], ['E3', 1, False], ['E4', 34, False], ['E5', 61, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[92, 121, 'closed'], [32, 61, 'soft'], [62, 91, 'closed'], [1, 31, 'soft']], 'policy': 'roll', 'entries': [['E0', 35, False], ['E1', 65, False], ['E2', 92, True], ['E3', 35, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 35, 'posted']]], ['control 4', {'periods': [[29, 58, 'open'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 58, True], ['E2', 58, False], ['E3', 29, True]]}, [['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]], ['control 5', {'periods': [[29, 58, 'closed'], [90, 119, 'closed'], [1, 28, 'open'], [59, 89, 'soft']], 'policy': 'reject', 'entries': [['E0', 93, True], ['E1', 89, True], ['E2', 59, False]]}, [['E0', None, 'closed'], ['E1', 89, 'posted'], ['E2', None, 'closed']]], ['control 6', {'periods': [[61, 91, 'open'], [31, 60, 'closed'], [92, 121, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 4, False], ['E1', 64, False], ['E2', 92, True], ['E3', 63, False]]}, [['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]]], [['regression: roll target status', {'periods': [[1, 31, 'closed'], [60, 90, 'soft'], [32, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 62, True], ['E2', 1, True], ['E3', 31, False], ['E4', 62, True]]}, [['E0', 60, 'posted'], ['E1', 62, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 62, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[29, 56, 'closed'], [90, 119, 'closed'], [1, 28, 'closed'], [62, 89, 'open']], 'policy': 'roll', 'entries': [['E0', 56, True], ['E1', 90, True], ['E2', 90, False]]}, [['E0', 62, 'rolled'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 1', {'periods': [[93, 120, 'closed'], [121, 148, 'soft'], [63, 92, 'soft'], [1, 31, 'soft'], [32, 62, 'open']], 'policy': 'roll', 'entries': [['E0', 149, True], ['E1', 63, True], ['E2', 148, True], ['E3', 4, False]]}, [['E0', None, 'no_period'], ['E1', 63, 'posted'], ['E2', 148, 'posted'], ['E3', 32, 'rolled']]], ['control 2', {'periods': [[29, 59, 'closed'], [1, 28, 'closed'], [65, 94, 'open']], 'policy': 'reject', 'entries': [['E0', 68, False], ['E1', 97, False], ['E2', 95, True], ['E3', 68, False], ['E4', 28, False], ['E5', 28, False]]}, [['E0', 68, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 68, 'posted'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[62, 89, 'open'], [1, 31, 'soft'], [32, 61, 'closed'], [90, 117, 'closed']], 'policy': 'reject', 'entries': [['E0', 62, False], ['E1', 117, False], ['E2', 93, False], ['E3', 65, False]]}, [['E0', 62, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 65, 'posted']]], ['control 4', {'periods': [[29, 59, 'open'], [1, 28, 'closed'], [60, 90, 'closed']], 'policy': 'roll', 'entries': [['E0', 31, False], ['E1', 62, True], ['E2', 29, False], ['E3', 93, False], ['E4', 59, False], ['E5', 60, True]]}, [['E0', 31, 'posted'], ['E1', None, 'closed'], ['E2', 29, 'posted'], ['E3', None, 'no_period'], ['E4', 59, 'posted'], ['E5', None, 'closed']]], ['control 5', {'periods': [[65, 92, 'open'], [34, 64, 'closed'], [1, 28, 'closed']], 'policy': 'reject', 'entries': [['E0', 67, False], ['E1', 1, False], ['E2', 64, True], ['E3', 68, False]]}, [['E0', 67, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 68, 'posted']]]], [['regression: roll target status', {'periods': [[1, 30, 'soft'], [31, 60, 'soft']], 'policy': 'roll', 'entries': [['E0', 30, False], ['E1', 31, False], ['E2', 31, True], ['E3', 30, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 31, 'posted'], ['E3', None, 'closed']]], ['regression: roll target status, partial-repair probe', {'periods': [[63, 90, 'open'], [1, 31, 'closed'], [32, 62, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, True], ['E1', 65, True], ['E2', 63, True], ['E3', 1, False]]}, [['E0', 63, 'posted'], ['E1', 65, 'posted'], ['E2', 63, 'posted'], ['E3', 63, 'rolled']]], ['control 1', {'periods': [[1, 28, 'closed'], [29, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, False], ['E2', 1, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[1, 28, 'open'], [29, 59, 'soft']], 'policy': 'roll', 'entries': [['E0', 1, False], ['E1', 29, False], ['E2', 31, False]]}, [['E0', 1, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 3', {'periods': [[65, 92, 'open'], [1, 28, 'closed'], [34, 64, 'soft']], 'policy': 'roll', 'entries': [['E0', 65, False], ['E1', 65, False], ['E2', 92, False]]}, [['E0', 65, 'posted'], ['E1', 65, 'posted'], ['E2', 92, 'posted']]], ['control 4', {'periods': [[29, 59, 'soft'], [123, 150, 'closed'], [1, 28, 'closed'], [60, 87, 'closed'], [93, 122, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, False], ['E1', 29, False], ['E2', 63, False], ['E3', 29, False], ['E4', 151, False], ['E5', 60, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'no_period'], ['E5', None, 'closed']]], ['control 5', {'periods': [[1, 28, 'open'], [93, 122, 'closed'], [29, 59, 'soft'], [60, 87, 'open']], 'policy': 'roll', 'entries': [['E0', 93, True], ['E1', 122, True], ['E2', 87, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 87, 'posted']]]], [['regression: roll target status', {'periods': [[29, 59, 'closed'], [60, 89, 'soft'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 4, False], ['E1', 4, False], ['E2', 32, False], ['E3', 31, True], ['E4', 62, False], ['E5', 28, False]]}, [['E0', 4, 'posted'], ['E1', 4, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', 28, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[63, 92, 'closed'], [1, 31, 'closed'], [98, 125, 'open'], [32, 62, 'soft']], 'policy': 'roll', 'entries': [['E0', 32, True], ['E1', 63, False], ['E2', 93, False]]}, [['E0', 32, 'posted'], ['E1', 98, 'rolled'], ['E2', None, 'no_period']]], ['control 1', {'periods': [[29, 58, 'closed'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 61, False], ['E1', 1, False], ['E2', 58, True]]}, [['E0', None, 'no_period'], ['E1', 1, 'posted'], ['E2', None, 'closed']]], ['control 2', {'periods': [[59, 86, 'open'], [29, 58, 'closed'], [1, 28, 'closed']], 'policy': 'roll', 'entries': [['E0', 59, False], ['E1', 87, False], ['E2', 87, False], ['E3', 61, False]]}, [['E0', 59, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 61, 'posted']]], ['control 3', {'periods': [[1, 31, 'soft'], [32, 59, 'open']], 'policy': 'reject', 'entries': [['E0', 60, True], ['E1', 32, False], ['E2', 62, False]]}, [['E0', None, 'no_period'], ['E1', 32, 'posted'], ['E2', None, 'no_period']]], ['control 4', {'periods': [[34, 61, 'soft'], [62, 92, 'open'], [1, 28, 'soft'], [93, 123, 'open']], 'policy': 'roll', 'entries': [['E0', 28, True], ['E1', 65, True], ['E2', 29, False], ['E3', 65, False], ['E4', 93, True]]}, [['E0', 28, 'posted'], ['E1', 65, 'posted'], ['E2', None, 'no_period'], ['E3', 65, 'posted'], ['E4', 93, 'posted']]], ['control 5', {'periods': [[37, 66, 'soft'], [1, 31, 'closed']], 'policy': 'roll', 'entries': [['E0', 37, False], ['E1', 67, True], ['E2', 69, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]]], [['regression: roll target status', {'periods': [[1, 28, 'closed'], [29, 59, 'closed'], [60, 89, 'soft']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 32, True], ['E2', 63, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 63, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[34, 61, 'closed'], [1, 28, 'soft'], [67, 94, 'open'], [95, 122, 'open']], 'policy': 'roll', 'entries': [['E0', 95, True], ['E1', 37, False], ['E2', 94, False]]}, [['E0', 95, 'posted'], ['E1', 67, 'rolled'], ['E2', 94, 'posted']]], ['control 1', {'periods': [[128, 155, 'open'], [31, 58, 'closed'], [1, 30, 'soft'], [59, 86, 'closed'], [92, 122, 'soft']], 'policy': 'reject', 'entries': [['E0', 125, False], ['E1', 31, False], ['E2', 156, True], ['E3', 1, False], ['E4', 95, False], ['E5', 95, False]]}, [['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 2', {'periods': [[31, 61, 'soft'], [62, 91, 'closed'], [92, 121, 'closed'], [1, 30, 'closed']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 92, False], ['E2', 30, False], ['E3', 1, False], ['E4', 31, True], ['E5', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'no_period']]], ['control 3', {'periods': [[93, 123, 'closed'], [1, 31, 'open'], [62, 92, 'closed'], [32, 61, 'closed']], 'policy': 'reject', 'entries': [['E0', 123, False], ['E1', 95, True], ['E2', 32, True], ['E3', 1, False], ['E4', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 1, 'posted'], ['E4', None, 'no_period']]], ['control 4', {'periods': [[73, 100, 'open'], [1, 31, 'closed'], [37, 67, 'open'], [129, 159, 'open'], [101, 128, 'soft']], 'policy': 'reject', 'entries': [['E0', 129, False], ['E1', 40, True], ['E2', 132, True], ['E3', 73, False], ['E4', 132, False], ['E5', 34, False]]}, [['E0', 129, 'posted'], ['E1', 40, 'posted'], ['E2', 132, 'posted'], ['E3', 73, 'posted'], ['E4', 132, 'posted'], ['E5', None, 'no_period']]], ['control 5', {'periods': [[1, 28, 'open'], [29, 56, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 57, False], ['E2', 4, False], ['E3', 29, True]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', 4, 'posted'], ['E3', None, 'closed']]]]]\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":"28384707c82defc1b1bb7c0f0c8c08edf6cc565e7c4e7a01cba07afe56d5127b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    periods = sorted(x['periods'])\n    out = []\n    for eid, date, adjusting in x['entries']:\n        found = None\n        for p in periods:\n            if p[0] <= date <= p[1]:\n                found = p\n                break\n        if found is None:\n            out.append([eid, None, 'no_period'])\n            continue\n        status = found[2]\n        if status == 'soft' and adjusting:\n            status = 'open'\n        if status == 'open':\n            out.append([eid, date, 'posted'])\n        elif x['policy'] == 'roll':\n            nxt = [p for p in periods if p[0] > found[1] and p[2] != 'closed']\n            if nxt:\n                out.append([eid, nxt[0][0], 'rolled'])\n            else:\n                out.append([eid, None, 'closed'])\n        else:\n            out.append([eid, None, 'closed'])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: roll target status', {'periods': [[59, 88, 'soft'], [117, 146, 'open'], [31, 58, 'closed'], [89, 116, 'closed'], [1, 30, 'closed']], 'policy': 'roll', 'entries': [['E0', 120, False], ['E1', 31, True], ['E2', 59, False], ['E3', 120, False], ['E4', 59, True]]}, [['E0', 120, 'posted'], ['E1', 117, 'rolled'], ['E2', 117, 'rolled'], ['E3', 120, 'posted'], ['E4', 59, 'posted']]], ['control 1', {'periods': [[122, 151, 'soft'], [92, 121, 'soft'], [31, 60, 'closed'], [1, 30, 'soft'], [61, 91, 'open']], 'policy': 'reject', 'entries': [['E0', 151, False], ['E1', 125, False], ['E2', 121, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[31, 60, 'closed'], [61, 90, 'closed'], [1, 30, 'closed'], [91, 121, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 121, False], ['E2', 94, True], ['E3', 1, False], ['E4', 34, False], ['E5', 61, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[92, 121, 'closed'], [32, 61, 'soft'], [62, 91, 'closed'], [1, 31, 'soft']], 'policy': 'roll', 'entries': [['E0', 35, False], ['E1', 65, False], ['E2', 92, True], ['E3', 35, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 35, 'posted']]], ['control 4', {'periods': [[29, 58, 'open'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 58, True], ['E2', 58, False], ['E3', 29, True]]}, [['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]], ['control 5', {'periods': [[29, 58, 'closed'], [90, 119, 'closed'], [1, 28, 'open'], [59, 89, 'soft']], 'policy': 'reject', 'entries': [['E0', 93, True], ['E1', 89, True], ['E2', 59, False]]}, [['E0', None, 'closed'], ['E1', 89, 'posted'], ['E2', None, 'closed']]], ['control 6', {'periods': [[61, 91, 'open'], [31, 60, 'closed'], [92, 121, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 4, False], ['E1', 64, False], ['E2', 92, True], ['E3', 63, False]]}, [['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]]], [['regression: roll target status', {'periods': [[1, 31, 'closed'], [60, 90, 'soft'], [32, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 62, True], ['E2', 1, True], ['E3', 31, False], ['E4', 62, True]]}, [['E0', 60, 'posted'], ['E1', 62, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 62, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[29, 56, 'closed'], [90, 119, 'closed'], [1, 28, 'closed'], [62, 89, 'open']], 'policy': 'roll', 'entries': [['E0', 56, True], ['E1', 90, True], ['E2', 90, False]]}, [['E0', 62, 'rolled'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 1', {'periods': [[93, 120, 'closed'], [121, 148, 'soft'], [63, 92, 'soft'], [1, 31, 'soft'], [32, 62, 'open']], 'policy': 'roll', 'entries': [['E0', 149, True], ['E1', 63, True], ['E2', 148, True], ['E3', 4, False]]}, [['E0', None, 'no_period'], ['E1', 63, 'posted'], ['E2', 148, 'posted'], ['E3', 32, 'rolled']]], ['control 2', {'periods': [[29, 59, 'closed'], [1, 28, 'closed'], [65, 94, 'open']], 'policy': 'reject', 'entries': [['E0', 68, False], ['E1', 97, False], ['E2', 95, True], ['E3', 68, False], ['E4', 28, False], ['E5', 28, False]]}, [['E0', 68, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 68, 'posted'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[62, 89, 'open'], [1, 31, 'soft'], [32, 61, 'closed'], [90, 117, 'closed']], 'policy': 'reject', 'entries': [['E0', 62, False], ['E1', 117, False], ['E2', 93, False], ['E3', 65, False]]}, [['E0', 62, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 65, 'posted']]], ['control 4', {'periods': [[29, 59, 'open'], [1, 28, 'closed'], [60, 90, 'closed']], 'policy': 'roll', 'entries': [['E0', 31, False], ['E1', 62, True], ['E2', 29, False], ['E3', 93, False], ['E4', 59, False], ['E5', 60, True]]}, [['E0', 31, 'posted'], ['E1', None, 'closed'], ['E2', 29, 'posted'], ['E3', None, 'no_period'], ['E4', 59, 'posted'], ['E5', None, 'closed']]], ['control 5', {'periods': [[65, 92, 'open'], [34, 64, 'closed'], [1, 28, 'closed']], 'policy': 'reject', 'entries': [['E0', 67, False], ['E1', 1, False], ['E2', 64, True], ['E3', 68, False]]}, [['E0', 67, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 68, 'posted']]]], [['regression: roll target status', {'periods': [[1, 30, 'soft'], [31, 60, 'soft']], 'policy': 'roll', 'entries': [['E0', 30, False], ['E1', 31, False], ['E2', 31, True], ['E3', 30, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 31, 'posted'], ['E3', None, 'closed']]], ['regression: roll target status, partial-repair probe', {'periods': [[63, 90, 'open'], [1, 31, 'closed'], [32, 62, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, True], ['E1', 65, True], ['E2', 63, True], ['E3', 1, False]]}, [['E0', 63, 'posted'], ['E1', 65, 'posted'], ['E2', 63, 'posted'], ['E3', 63, 'rolled']]], ['control 1', {'periods': [[1, 28, 'closed'], [29, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, False], ['E2', 1, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[1, 28, 'open'], [29, 59, 'soft']], 'policy': 'roll', 'entries': [['E0', 1, False], ['E1', 29, False], ['E2', 31, False]]}, [['E0', 1, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 3', {'periods': [[65, 92, 'open'], [1, 28, 'closed'], [34, 64, 'soft']], 'policy': 'roll', 'entries': [['E0', 65, False], ['E1', 65, False], ['E2', 92, False]]}, [['E0', 65, 'posted'], ['E1', 65, 'posted'], ['E2', 92, 'posted']]], ['control 4', {'periods': [[29, 59, 'soft'], [123, 150, 'closed'], [1, 28, 'closed'], [60, 87, 'closed'], [93, 122, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, False], ['E1', 29, False], ['E2', 63, False], ['E3', 29, False], ['E4', 151, False], ['E5', 60, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'no_period'], ['E5', None, 'closed']]], ['control 5', {'periods': [[1, 28, 'open'], [93, 122, 'closed'], [29, 59, 'soft'], [60, 87, 'open']], 'policy': 'roll', 'entries': [['E0', 93, True], ['E1', 122, True], ['E2', 87, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 87, 'posted']]]], [['regression: roll target status', {'periods': [[29, 59, 'closed'], [60, 89, 'soft'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 4, False], ['E1', 4, False], ['E2', 32, False], ['E3', 31, True], ['E4', 62, False], ['E5', 28, False]]}, [['E0', 4, 'posted'], ['E1', 4, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', 28, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[63, 92, 'closed'], [1, 31, 'closed'], [98, 125, 'open'], [32, 62, 'soft']], 'policy': 'roll', 'entries': [['E0', 32, True], ['E1', 63, False], ['E2', 93, False]]}, [['E0', 32, 'posted'], ['E1', 98, 'rolled'], ['E2', None, 'no_period']]], ['control 1', {'periods': [[29, 58, 'closed'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 61, False], ['E1', 1, False], ['E2', 58, True]]}, [['E0', None, 'no_period'], ['E1', 1, 'posted'], ['E2', None, 'closed']]], ['control 2', {'periods': [[59, 86, 'open'], [29, 58, 'closed'], [1, 28, 'closed']], 'policy': 'roll', 'entries': [['E0', 59, False], ['E1', 87, False], ['E2', 87, False], ['E3', 61, False]]}, [['E0', 59, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 61, 'posted']]], ['control 3', {'periods': [[1, 31, 'soft'], [32, 59, 'open']], 'policy': 'reject', 'entries': [['E0', 60, True], ['E1', 32, False], ['E2', 62, False]]}, [['E0', None, 'no_period'], ['E1', 32, 'posted'], ['E2', None, 'no_period']]], ['control 4', {'periods': [[34, 61, 'soft'], [62, 92, 'open'], [1, 28, 'soft'], [93, 123, 'open']], 'policy': 'roll', 'entries': [['E0', 28, True], ['E1', 65, True], ['E2', 29, False], ['E3', 65, False], ['E4', 93, True]]}, [['E0', 28, 'posted'], ['E1', 65, 'posted'], ['E2', None, 'no_period'], ['E3', 65, 'posted'], ['E4', 93, 'posted']]], ['control 5', {'periods': [[37, 66, 'soft'], [1, 31, 'closed']], 'policy': 'roll', 'entries': [['E0', 37, False], ['E1', 67, True], ['E2', 69, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]]], [['regression: roll target status', {'periods': [[1, 28, 'closed'], [29, 59, 'closed'], [60, 89, 'soft']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 32, True], ['E2', 63, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 63, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[34, 61, 'closed'], [1, 28, 'soft'], [67, 94, 'open'], [95, 122, 'open']], 'policy': 'roll', 'entries': [['E0', 95, True], ['E1', 37, False], ['E2', 94, False]]}, [['E0', 95, 'posted'], ['E1', 67, 'rolled'], ['E2', 94, 'posted']]], ['control 1', {'periods': [[128, 155, 'open'], [31, 58, 'closed'], [1, 30, 'soft'], [59, 86, 'closed'], [92, 122, 'soft']], 'policy': 'reject', 'entries': [['E0', 125, False], ['E1', 31, False], ['E2', 156, True], ['E3', 1, False], ['E4', 95, False], ['E5', 95, False]]}, [['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 2', {'periods': [[31, 61, 'soft'], [62, 91, 'closed'], [92, 121, 'closed'], [1, 30, 'closed']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 92, False], ['E2', 30, False], ['E3', 1, False], ['E4', 31, True], ['E5', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'no_period']]], ['control 3', {'periods': [[93, 123, 'closed'], [1, 31, 'open'], [62, 92, 'closed'], [32, 61, 'closed']], 'policy': 'reject', 'entries': [['E0', 123, False], ['E1', 95, True], ['E2', 32, True], ['E3', 1, False], ['E4', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 1, 'posted'], ['E4', None, 'no_period']]], ['control 4', {'periods': [[73, 100, 'open'], [1, 31, 'closed'], [37, 67, 'open'], [129, 159, 'open'], [101, 128, 'soft']], 'policy': 'reject', 'entries': [['E0', 129, False], ['E1', 40, True], ['E2', 132, True], ['E3', 73, False], ['E4', 132, False], ['E5', 34, False]]}, [['E0', 129, 'posted'], ['E1', 40, 'posted'], ['E2', 132, 'posted'], ['E3', 73, 'posted'], ['E4', 132, 'posted'], ['E5', None, 'no_period']]], ['control 5', {'periods': [[1, 28, 'open'], [29, 56, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 57, False], ['E2', 4, False], ['E3', 29, True]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', 4, 'posted'], ['E3', None, 'closed']]]]]\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":"220a1ea4f5b556eefd57b95579c4a0ef8d27282dec3bfd329e3e52a8b9bd932e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    periods = sorted(x['periods'])\n    out = []\n    for eid, date, adjusting in x['entries']:\n        found = None\n        for p in periods:\n            if p[0] <= date <= p[1]:\n                found = p\n                break\n        if found is None:\n            out.append([eid, None, 'no_period'])\n            continue\n        status = found[2]\n        if status == 'soft' and adjusting:\n            status = 'open'\n        if status == 'open':\n            out.append([eid, date, 'posted'])\n        elif x['policy'] == 'roll':\n            nxt = [p for p in periods if p[0] > found[1] and p[2] == 'open']\n            if nxt:\n                out.append([eid, nxt[0][0], 'rolled'])\n            else:\n                out.append([eid, None, 'closed'])\n        else:\n            out.append([eid, None, 'closed'])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: roll target status', {'periods': [[59, 88, 'soft'], [117, 146, 'open'], [31, 58, 'closed'], [89, 116, 'closed'], [1, 30, 'closed']], 'policy': 'roll', 'entries': [['E0', 120, False], ['E1', 31, True], ['E2', 59, False], ['E3', 120, False], ['E4', 59, True]]}, [['E0', 120, 'posted'], ['E1', 117, 'rolled'], ['E2', 117, 'rolled'], ['E3', 120, 'posted'], ['E4', 59, 'posted']]], ['control 1', {'periods': [[122, 151, 'soft'], [92, 121, 'soft'], [31, 60, 'closed'], [1, 30, 'soft'], [61, 91, 'open']], 'policy': 'reject', 'entries': [['E0', 151, False], ['E1', 125, False], ['E2', 121, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[31, 60, 'closed'], [61, 90, 'closed'], [1, 30, 'closed'], [91, 121, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 121, False], ['E2', 94, True], ['E3', 1, False], ['E4', 34, False], ['E5', 61, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[92, 121, 'closed'], [32, 61, 'soft'], [62, 91, 'closed'], [1, 31, 'soft']], 'policy': 'roll', 'entries': [['E0', 35, False], ['E1', 65, False], ['E2', 92, True], ['E3', 35, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 35, 'posted']]], ['control 4', {'periods': [[29, 58, 'open'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 58, True], ['E2', 58, False], ['E3', 29, True]]}, [['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]], ['control 5', {'periods': [[29, 58, 'closed'], [90, 119, 'closed'], [1, 28, 'open'], [59, 89, 'soft']], 'policy': 'reject', 'entries': [['E0', 93, True], ['E1', 89, True], ['E2', 59, False]]}, [['E0', None, 'closed'], ['E1', 89, 'posted'], ['E2', None, 'closed']]], ['control 6', {'periods': [[61, 91, 'open'], [31, 60, 'closed'], [92, 121, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 4, False], ['E1', 64, False], ['E2', 92, True], ['E3', 63, False]]}, [['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]]], [['regression: roll target status', {'periods': [[1, 31, 'closed'], [60, 90, 'soft'], [32, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 62, True], ['E2', 1, True], ['E3', 31, False], ['E4', 62, True]]}, [['E0', 60, 'posted'], ['E1', 62, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 62, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[29, 56, 'closed'], [90, 119, 'closed'], [1, 28, 'closed'], [62, 89, 'open']], 'policy': 'roll', 'entries': [['E0', 56, True], ['E1', 90, True], ['E2', 90, False]]}, [['E0', 62, 'rolled'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 1', {'periods': [[93, 120, 'closed'], [121, 148, 'soft'], [63, 92, 'soft'], [1, 31, 'soft'], [32, 62, 'open']], 'policy': 'roll', 'entries': [['E0', 149, True], ['E1', 63, True], ['E2', 148, True], ['E3', 4, False]]}, [['E0', None, 'no_period'], ['E1', 63, 'posted'], ['E2', 148, 'posted'], ['E3', 32, 'rolled']]], ['control 2', {'periods': [[29, 59, 'closed'], [1, 28, 'closed'], [65, 94, 'open']], 'policy': 'reject', 'entries': [['E0', 68, False], ['E1', 97, False], ['E2', 95, True], ['E3', 68, False], ['E4', 28, False], ['E5', 28, False]]}, [['E0', 68, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 68, 'posted'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[62, 89, 'open'], [1, 31, 'soft'], [32, 61, 'closed'], [90, 117, 'closed']], 'policy': 'reject', 'entries': [['E0', 62, False], ['E1', 117, False], ['E2', 93, False], ['E3', 65, False]]}, [['E0', 62, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 65, 'posted']]], ['control 4', {'periods': [[29, 59, 'open'], [1, 28, 'closed'], [60, 90, 'closed']], 'policy': 'roll', 'entries': [['E0', 31, False], ['E1', 62, True], ['E2', 29, False], ['E3', 93, False], ['E4', 59, False], ['E5', 60, True]]}, [['E0', 31, 'posted'], ['E1', None, 'closed'], ['E2', 29, 'posted'], ['E3', None, 'no_period'], ['E4', 59, 'posted'], ['E5', None, 'closed']]], ['control 5', {'periods': [[65, 92, 'open'], [34, 64, 'closed'], [1, 28, 'closed']], 'policy': 'reject', 'entries': [['E0', 67, False], ['E1', 1, False], ['E2', 64, True], ['E3', 68, False]]}, [['E0', 67, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 68, 'posted']]]], [['regression: roll target status', {'periods': [[1, 30, 'soft'], [31, 60, 'soft']], 'policy': 'roll', 'entries': [['E0', 30, False], ['E1', 31, False], ['E2', 31, True], ['E3', 30, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 31, 'posted'], ['E3', None, 'closed']]], ['regression: roll target status, partial-repair probe', {'periods': [[63, 90, 'open'], [1, 31, 'closed'], [32, 62, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, True], ['E1', 65, True], ['E2', 63, True], ['E3', 1, False]]}, [['E0', 63, 'posted'], ['E1', 65, 'posted'], ['E2', 63, 'posted'], ['E3', 63, 'rolled']]], ['control 1', {'periods': [[1, 28, 'closed'], [29, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, False], ['E2', 1, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[1, 28, 'open'], [29, 59, 'soft']], 'policy': 'roll', 'entries': [['E0', 1, False], ['E1', 29, False], ['E2', 31, False]]}, [['E0', 1, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 3', {'periods': [[65, 92, 'open'], [1, 28, 'closed'], [34, 64, 'soft']], 'policy': 'roll', 'entries': [['E0', 65, False], ['E1', 65, False], ['E2', 92, False]]}, [['E0', 65, 'posted'], ['E1', 65, 'posted'], ['E2', 92, 'posted']]], ['control 4', {'periods': [[29, 59, 'soft'], [123, 150, 'closed'], [1, 28, 'closed'], [60, 87, 'closed'], [93, 122, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, False], ['E1', 29, False], ['E2', 63, False], ['E3', 29, False], ['E4', 151, False], ['E5', 60, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'no_period'], ['E5', None, 'closed']]], ['control 5', {'periods': [[1, 28, 'open'], [93, 122, 'closed'], [29, 59, 'soft'], [60, 87, 'open']], 'policy': 'roll', 'entries': [['E0', 93, True], ['E1', 122, True], ['E2', 87, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 87, 'posted']]]], [['regression: roll target status', {'periods': [[29, 59, 'closed'], [60, 89, 'soft'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 4, False], ['E1', 4, False], ['E2', 32, False], ['E3', 31, True], ['E4', 62, False], ['E5', 28, False]]}, [['E0', 4, 'posted'], ['E1', 4, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', 28, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[63, 92, 'closed'], [1, 31, 'closed'], [98, 125, 'open'], [32, 62, 'soft']], 'policy': 'roll', 'entries': [['E0', 32, True], ['E1', 63, False], ['E2', 93, False]]}, [['E0', 32, 'posted'], ['E1', 98, 'rolled'], ['E2', None, 'no_period']]], ['control 1', {'periods': [[29, 58, 'closed'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 61, False], ['E1', 1, False], ['E2', 58, True]]}, [['E0', None, 'no_period'], ['E1', 1, 'posted'], ['E2', None, 'closed']]], ['control 2', {'periods': [[59, 86, 'open'], [29, 58, 'closed'], [1, 28, 'closed']], 'policy': 'roll', 'entries': [['E0', 59, False], ['E1', 87, False], ['E2', 87, False], ['E3', 61, False]]}, [['E0', 59, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 61, 'posted']]], ['control 3', {'periods': [[1, 31, 'soft'], [32, 59, 'open']], 'policy': 'reject', 'entries': [['E0', 60, True], ['E1', 32, False], ['E2', 62, False]]}, [['E0', None, 'no_period'], ['E1', 32, 'posted'], ['E2', None, 'no_period']]], ['control 4', {'periods': [[34, 61, 'soft'], [62, 92, 'open'], [1, 28, 'soft'], [93, 123, 'open']], 'policy': 'roll', 'entries': [['E0', 28, True], ['E1', 65, True], ['E2', 29, False], ['E3', 65, False], ['E4', 93, True]]}, [['E0', 28, 'posted'], ['E1', 65, 'posted'], ['E2', None, 'no_period'], ['E3', 65, 'posted'], ['E4', 93, 'posted']]], ['control 5', {'periods': [[37, 66, 'soft'], [1, 31, 'closed']], 'policy': 'roll', 'entries': [['E0', 37, False], ['E1', 67, True], ['E2', 69, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]]], [['regression: roll target status', {'periods': [[1, 28, 'closed'], [29, 59, 'closed'], [60, 89, 'soft']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 32, True], ['E2', 63, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 63, 'posted']]], ['regression: roll target status, partial-repair probe', {'periods': [[34, 61, 'closed'], [1, 28, 'soft'], [67, 94, 'open'], [95, 122, 'open']], 'policy': 'roll', 'entries': [['E0', 95, True], ['E1', 37, False], ['E2', 94, False]]}, [['E0', 95, 'posted'], ['E1', 67, 'rolled'], ['E2', 94, 'posted']]], ['control 1', {'periods': [[128, 155, 'open'], [31, 58, 'closed'], [1, 30, 'soft'], [59, 86, 'closed'], [92, 122, 'soft']], 'policy': 'reject', 'entries': [['E0', 125, False], ['E1', 31, False], ['E2', 156, True], ['E3', 1, False], ['E4', 95, False], ['E5', 95, False]]}, [['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 2', {'periods': [[31, 61, 'soft'], [62, 91, 'closed'], [92, 121, 'closed'], [1, 30, 'closed']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 92, False], ['E2', 30, False], ['E3', 1, False], ['E4', 31, True], ['E5', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'no_period']]], ['control 3', {'periods': [[93, 123, 'closed'], [1, 31, 'open'], [62, 92, 'closed'], [32, 61, 'closed']], 'policy': 'reject', 'entries': [['E0', 123, False], ['E1', 95, True], ['E2', 32, True], ['E3', 1, False], ['E4', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 1, 'posted'], ['E4', None, 'no_period']]], ['control 4', {'periods': [[73, 100, 'open'], [1, 31, 'closed'], [37, 67, 'open'], [129, 159, 'open'], [101, 128, 'soft']], 'policy': 'reject', 'entries': [['E0', 129, False], ['E1', 40, True], ['E2', 132, True], ['E3', 73, False], ['E4', 132, False], ['E5', 34, False]]}, [['E0', 129, 'posted'], ['E1', 40, 'posted'], ['E2', 132, 'posted'], ['E3', 73, 'posted'], ['E4', 132, 'posted'], ['E5', None, 'no_period']]], ['control 5', {'periods': [[1, 28, 'open'], [29, 56, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 57, False], ['E2', 4, False], ['E3', 29, True]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', 4, 'posted'], ['E3', None, 'closed']]]]]\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 bookkeeping rules stated in the contract; amounts are integer cents; it makes no claim of conformance to any accounting 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-double-entry-ledger-accounting-period-lock-roll-target-status","generated_at":"2026-09-29T14:46:22.870569+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Ledger software must keep debits equal to credits and apply normal-balance, period and cutoff rules exactly; small sign or boundary slips silently misstate financial statements.","repair":"Roll only into open periods.","root_cause":"The roll-forward search accepts any period that is not hard closed.","sha256":"26425d96712a4a96e4f9031a390d51d662b605198e67d02f247048c0bc2b34fa","title":"Posting period lock: roll target status · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.563,"exit_code":1,"observations":[{"actual":[["E0",120,"posted"],["E1",null,"closed"],["E2",null,"closed"],["E3",120,"posted"],["E4",59,"posted"]],"check":"regression: roll target status","expected":[["E0",120,"posted"],["E1",117,"rolled"],["E2",117,"rolled"],["E3",120,"posted"],["E4",59,"posted"]],"passed":false},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"]],"check":"control 1","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",null,"closed"],["E4",null,"closed"],["E5",null,"closed"]],"check":"control 2","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",null,"closed"],["E4",null,"closed"],["E5",null,"closed"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",35,"posted"]],"check":"control 3","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",35,"posted"]],"passed":true},{"actual":[["E0",29,"posted"],["E1",58,"posted"],["E2",58,"posted"],["E3",29,"posted"]],"check":"control 4","expected":[["E0",29,"posted"],["E1",58,"posted"],["E2",58,"posted"],["E3",29,"posted"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",89,"posted"],["E2",null,"closed"]],"check":"control 5","expected":[["E0",null,"closed"],["E1",89,"posted"],["E2",null,"closed"]],"passed":true},{"actual":[["E0",4,"posted"],["E1",64,"posted"],["E2",92,"posted"],["E3",63,"posted"]],"check":"control 6","expected":[["E0",4,"posted"],["E1",64,"posted"],["E2",92,"posted"],["E3",63,"posted"]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: roll target status\", \"actual\": [[\"E0\", 120, \"posted\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", 120, \"posted\"], [\"E4\", 59, \"posted\"]], \"expected\": [[\"E0\", 120, \"posted\"], [\"E1\", 117, \"rolled\"], [\"E2\", 117, \"rolled\"], [\"E3\", 120, \"posted\"], [\"E4\", 59, \"posted\"]], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", null, \"closed\"], [\"E4\", null, \"closed\"], [\"E5\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", null, \"closed\"], [\"E4\", null, \"closed\"], [\"E5\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 3\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", 35, \"posted\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", 35, \"posted\"]], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [[\"E0\", 29, \"posted\"], [\"E1\", 58, \"posted\"], [\"E2\", 58, \"posted\"], [\"E3\", 29, \"posted\"]], \"expected\": [[\"E0\", 29, \"posted\"], [\"E1\", 58, \"posted\"], [\"E2\", 58, \"posted\"], [\"E3\", 29, \"posted\"]], \"passed\": true}, {\"check\": \"control 5\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", 89, \"posted\"], [\"E2\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", 89, \"posted\"], [\"E2\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 6\", \"actual\": [[\"E0\", 4, \"posted\"], [\"E1\", 64, \"posted\"], [\"E2\", 92, \"posted\"], [\"E3\", 63, \"posted\"]], \"expected\": [[\"E0\", 4, \"posted\"], [\"E1\", 64, \"posted\"], [\"E2\", 92, \"posted\"], [\"E3\", 63, \"posted\"]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.879,"exit_code":1,"observations":[{"actual":[["E0",120,"posted"],["E1",59,"rolled"],["E2",117,"rolled"],["E3",120,"posted"],["E4",59,"posted"]],"check":"regression: roll target status","expected":[["E0",120,"posted"],["E1",117,"rolled"],["E2",117,"rolled"],["E3",120,"posted"],["E4",59,"posted"]],"passed":false},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"]],"check":"control 1","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",null,"closed"],["E4",null,"closed"],["E5",null,"closed"]],"check":"control 2","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",null,"closed"],["E4",null,"closed"],["E5",null,"closed"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",35,"posted"]],"check":"control 3","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",35,"posted"]],"passed":true},{"actual":[["E0",29,"posted"],["E1",58,"posted"],["E2",58,"posted"],["E3",29,"posted"]],"check":"control 4","expected":[["E0",29,"posted"],["E1",58,"posted"],["E2",58,"posted"],["E3",29,"posted"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",89,"posted"],["E2",null,"closed"]],"check":"control 5","expected":[["E0",null,"closed"],["E1",89,"posted"],["E2",null,"closed"]],"passed":true},{"actual":[["E0",4,"posted"],["E1",64,"posted"],["E2",92,"posted"],["E3",63,"posted"]],"check":"control 6","expected":[["E0",4,"posted"],["E1",64,"posted"],["E2",92,"posted"],["E3",63,"posted"]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: roll target status\", \"actual\": [[\"E0\", 120, \"posted\"], [\"E1\", 59, \"rolled\"], [\"E2\", 117, \"rolled\"], [\"E3\", 120, \"posted\"], [\"E4\", 59, \"posted\"]], \"expected\": [[\"E0\", 120, \"posted\"], [\"E1\", 117, \"rolled\"], [\"E2\", 117, \"rolled\"], [\"E3\", 120, \"posted\"], [\"E4\", 59, \"posted\"]], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", null, \"closed\"], [\"E4\", null, \"closed\"], [\"E5\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", null, \"closed\"], [\"E4\", null, \"closed\"], [\"E5\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 3\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", 35, \"posted\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", 35, \"posted\"]], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [[\"E0\", 29, \"posted\"], [\"E1\", 58, \"posted\"], [\"E2\", 58, \"posted\"], [\"E3\", 29, \"posted\"]], \"expected\": [[\"E0\", 29, \"posted\"], [\"E1\", 58, \"posted\"], [\"E2\", 58, \"posted\"], [\"E3\", 29, \"posted\"]], \"passed\": true}, {\"check\": \"control 5\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", 89, \"posted\"], [\"E2\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", 89, \"posted\"], [\"E2\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 6\", \"actual\": [[\"E0\", 4, \"posted\"], [\"E1\", 64, \"posted\"], [\"E2\", 92, \"posted\"], [\"E3\", 63, \"posted\"]], \"expected\": [[\"E0\", 4, \"posted\"], [\"E1\", 64, \"posted\"], [\"E2\", 92, \"posted\"], [\"E3\", 63, \"posted\"]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.139,"exit_code":0,"observations":[{"actual":[["E0",120,"posted"],["E1",117,"rolled"],["E2",117,"rolled"],["E3",120,"posted"],["E4",59,"posted"]],"check":"regression: roll target status","expected":[["E0",120,"posted"],["E1",117,"rolled"],["E2",117,"rolled"],["E3",120,"posted"],["E4",59,"posted"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"]],"check":"control 1","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",null,"closed"],["E4",null,"closed"],["E5",null,"closed"]],"check":"control 2","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",null,"closed"],["E4",null,"closed"],["E5",null,"closed"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",35,"posted"]],"check":"control 3","expected":[["E0",null,"closed"],["E1",null,"closed"],["E2",null,"closed"],["E3",35,"posted"]],"passed":true},{"actual":[["E0",29,"posted"],["E1",58,"posted"],["E2",58,"posted"],["E3",29,"posted"]],"check":"control 4","expected":[["E0",29,"posted"],["E1",58,"posted"],["E2",58,"posted"],["E3",29,"posted"]],"passed":true},{"actual":[["E0",null,"closed"],["E1",89,"posted"],["E2",null,"closed"]],"check":"control 5","expected":[["E0",null,"closed"],["E1",89,"posted"],["E2",null,"closed"]],"passed":true},{"actual":[["E0",4,"posted"],["E1",64,"posted"],["E2",92,"posted"],["E3",63,"posted"]],"check":"control 6","expected":[["E0",4,"posted"],["E1",64,"posted"],["E2",92,"posted"],["E3",63,"posted"]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: roll target status\", \"actual\": [[\"E0\", 120, \"posted\"], [\"E1\", 117, \"rolled\"], [\"E2\", 117, \"rolled\"], [\"E3\", 120, \"posted\"], [\"E4\", 59, \"posted\"]], \"expected\": [[\"E0\", 120, \"posted\"], [\"E1\", 117, \"rolled\"], [\"E2\", 117, \"rolled\"], [\"E3\", 120, \"posted\"], [\"E4\", 59, \"posted\"]], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", null, \"closed\"], [\"E4\", null, \"closed\"], [\"E5\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", null, \"closed\"], [\"E4\", null, \"closed\"], [\"E5\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 3\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", 35, \"posted\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", null, \"closed\"], [\"E2\", null, \"closed\"], [\"E3\", 35, \"posted\"]], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [[\"E0\", 29, \"posted\"], [\"E1\", 58, \"posted\"], [\"E2\", 58, \"posted\"], [\"E3\", 29, \"posted\"]], \"expected\": [[\"E0\", 29, \"posted\"], [\"E1\", 58, \"posted\"], [\"E2\", 58, \"posted\"], [\"E3\", 29, \"posted\"]], \"passed\": true}, {\"check\": \"control 5\", \"actual\": [[\"E0\", null, \"closed\"], [\"E1\", 89, \"posted\"], [\"E2\", null, \"closed\"]], \"expected\": [[\"E0\", null, \"closed\"], [\"E1\", 89, \"posted\"], [\"E2\", null, \"closed\"]], \"passed\": true}, {\"check\": \"control 6\", \"actual\": [[\"E0\", 4, \"posted\"], [\"E1\", 64, \"posted\"], [\"E2\", 92, \"posted\"], [\"E3\", 63, \"posted\"]], \"expected\": [[\"E0\", 4, \"posted\"], [\"E1\", 64, \"posted\"], [\"E2\", 92, \"posted\"], [\"E3\", 63, \"posted\"]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}