{"abstract":"BYHOUR=17,9 emits the evening slot before the morning slot and repeats duplicated hours.","category":"Calendar recurrence rules","checks":7,"contract":"FREQ=DAILY. Each day produces the cartesian product of BYHOUR and BYMINUTE in chronological order; a missing BYHOUR defaults to the dtstart hour and a missing BYMINUTE to the dtstart minute. Duplicates in either list are ignored. Times before dtstart are dropped. Return the first count ISO date-times.","evaluation_group":"w2-calendar-recurrence-rules-daily-byhour-byminute","failed_approach":"The partial repair `sorted(byhour)` sorts but keeps duplicate hours, producing repeated instances.","family":"w2-calendar-recurrence-rules-daily-byhour-byminute-hour-normalization","id":"FA-77086","implementations":{"attempt":{"sha256":"ea518baea2606db2b8fe8f83c4f83f499beb9f717dc5484ec271a84fc892c653","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport datetime as dt\nimport calendar\nN = 1\nobservations = []\ndef solve(dtstart, byhour, byminute, count):\n    first = dt.datetime.fromisoformat(dtstart)\n    hours = sorted(byhour) if byhour else [first.hour]\n    minutes = sorted(set(byminute)) if byminute else [first.minute]\n    out = []\n    for k in range(400):\n        day = first.date() + dt.timedelta(days=k)\n        for h, mi in [(h, mi) for h in hours for mi in minutes]:\n            t = dt.datetime.combine(day, dt.time(h, mi))\n            if t < first:\n                continue\n            if len(out) >= count:\n                return out\n            out.append(t.isoformat(timespec='minutes'))\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00']),\n  ('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05'])],\n [('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00']),\n  ('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists',\n   ['2024-02-28T23:45', [], [], 3],\n   ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45'])],\n [('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15'])],\n [('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15'])],\n [('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00'])]]\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":"11be287bca46c30255cd28f9130633bcc3ca977d6b720b233e6d9b7019725b35","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport datetime as dt\nimport calendar\nN = 1\nobservations = []\ndef solve(dtstart, byhour, byminute, count):\n    first = dt.datetime.fromisoformat(dtstart)\n    hours = list(byhour) if byhour else [first.hour]\n    minutes = sorted(set(byminute)) if byminute else [first.minute]\n    out = []\n    for k in range(400):\n        day = first.date() + dt.timedelta(days=k)\n        for h, mi in [(h, mi) for h in hours for mi in minutes]:\n            t = dt.datetime.combine(day, dt.time(h, mi))\n            if t < first:\n                continue\n            if len(out) >= count:\n                return out\n            out.append(t.isoformat(timespec='minutes'))\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00']),\n  ('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05'])],\n [('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00']),\n  ('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists',\n   ['2024-02-28T23:45', [], [], 3],\n   ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45'])],\n [('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15'])],\n [('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15'])],\n [('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00'])]]\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":"9f39fd235cc0fa4db8ace75edb2937cf2b9bfc2a4185372a25745116e4df9e93","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport datetime as dt\nimport calendar\nN = 1\nobservations = []\ndef solve(dtstart, byhour, byminute, count):\n    first = dt.datetime.fromisoformat(dtstart)\n    hours = sorted(set(byhour)) if byhour else [first.hour]\n    minutes = sorted(set(byminute)) if byminute else [first.minute]\n    out = []\n    for k in range(400):\n        day = first.date() + dt.timedelta(days=k)\n        for h, mi in [(h, mi) for h in hours for mi in minutes]:\n            t = dt.datetime.combine(day, dt.time(h, mi))\n            if t < first:\n                continue\n            if len(out) >= count:\n                return out\n            out.append(t.isoformat(timespec='minutes'))\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00']),\n  ('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05'])],\n [('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00']),\n  ('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists',\n   ['2024-02-28T23:45', [], [], 3],\n   ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45'])],\n [('dtstart after some slots',\n   ['2024-01-02T12:00', [8, 12, 18], [0], 4],\n   ['2024-01-02T12:00', '2024-01-02T18:00', '2024-01-03T08:00', '2024-01-03T12:00']),\n  ('dtstart between minutes',\n   ['2024-01-02T12:20', [12], [0, 20, 40], 4],\n   ['2024-01-02T12:20', '2024-01-02T12:40', '2024-01-03T12:00', '2024-01-03T12:20']),\n  ('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15'])],\n [('three by three',\n   ['2024-03-10T00:00', [6, 12, 18], [5, 10, 50], 7],\n   ['2024-03-10T06:05',\n    '2024-03-10T06:10',\n    '2024-03-10T06:50',\n    '2024-03-10T12:05',\n    '2024-03-10T12:10',\n    '2024-03-10T12:50',\n    '2024-03-10T18:05']),\n  ('count zero', ['2024-01-01T09:00', [9], [0], 0], []),\n  ('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15'])],\n [('no lists', ['2024-02-28T23:45', [], [], 3], ['2024-02-28T23:45', '2024-02-29T23:45', '2024-03-01T23:45']),\n  ('unsorted minutes',\n   ['2024-02-28T07:00', [7, 8], [50, 10], 5],\n   ['2024-02-28T07:10', '2024-02-28T07:50', '2024-02-28T08:10', '2024-02-28T08:50', '2024-02-29T07:10']),\n  ('late hour only list',\n   ['2024-05-05T22:15', [23, 1], [], 4],\n   ['2024-05-05T23:15', '2024-05-06T01:15', '2024-05-06T23:15', '2024-05-07T01:15']),\n  ('regression: default minute from dtstart',\n   ['2024-01-01T09:30', [9, 17], [], 4],\n   ['2024-01-01T09:30', '2024-01-01T17:30', '2024-01-02T09:30', '2024-01-02T17:30']),\n  ('only byminute',\n   ['2024-01-01T14:10', [], [0, 30], 4],\n   ['2024-01-01T14:30', '2024-01-02T14:00', '2024-01-02T14:30', '2024-01-03T14:00']),\n  ('unsorted duplicate hours',\n   ['2024-01-01T08:00', [17, 9, 17], [15], 4],\n   ['2024-01-01T09:15', '2024-01-01T17:15', '2024-01-02T09:15', '2024-01-02T17:15']),\n  ('product of two lists',\n   ['2024-01-01T00:00', [9, 13], [0, 45], 5],\n   ['2024-01-01T09:00', '2024-01-01T09:45', '2024-01-01T13:00', '2024-01-01T13:45', '2024-01-02T09:00'])]]\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":"Stipulated, bounded recurrence-expansion model evaluated offline on explicit fixtures; it is not a complete iCalendar implementation and makes no claim of standards conformance. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-calendar-recurrence-rules-daily-byhour-byminute-hour-normalization","generated_at":"2026-09-29T14:49:22.329137+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Recurring calendar series are expanded into concrete instances for display, reminders and conflict checks.","repair":"At the hour normalization decision use `sorted(set(byhour))`, leaving the other decision sites of the model unchanged.","root_cause":"The BYHOUR list is used as given, unsorted and with duplicates.","sha256":"7b6e6b92360cae8eca3046437d3ee65f1688267465913a182a59498b4ba292b7","title":"Daily BYHOUR/BYMINUTE time-of-day expansion: hour normalization · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.935,"exit_code":1,"observations":[{"actual":["2024-01-01T09:30","2024-01-01T17:30","2024-01-02T09:30","2024-01-02T17:30"],"check":"regression: default minute from dtstart","expected":["2024-01-01T09:30","2024-01-01T17:30","2024-01-02T09:30","2024-01-02T17:30"],"passed":true},{"actual":["2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30","2024-01-03T14:00"],"check":"only byminute","expected":["2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30","2024-01-03T14:00"],"passed":true},{"actual":["2024-01-01T09:15","2024-01-01T17:15","2024-01-01T17:15","2024-01-02T09:15"],"check":"unsorted duplicate hours","expected":["2024-01-01T09:15","2024-01-01T17:15","2024-01-02T09:15","2024-01-02T17:15"],"passed":false},{"actual":["2024-01-01T09:00","2024-01-01T09:45","2024-01-01T13:00","2024-01-01T13:45","2024-01-02T09:00"],"check":"product of two lists","expected":["2024-01-01T09:00","2024-01-01T09:45","2024-01-01T13:00","2024-01-01T13:45","2024-01-02T09:00"],"passed":true},{"actual":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"check":"dtstart after some slots","expected":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"passed":true},{"actual":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"check":"dtstart between minutes","expected":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"passed":true},{"actual":["2024-03-10T06:05","2024-03-10T06:10","2024-03-10T06:50","2024-03-10T12:05","2024-03-10T12:10","2024-03-10T12:50","2024-03-10T18:05"],"check":"three by three","expected":["2024-03-10T06:05","2024-03-10T06:10","2024-03-10T06:50","2024-03-10T12:05","2024-03-10T12:10","2024-03-10T12:50","2024-03-10T18:05"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: default minute from dtstart\", \"actual\": [\"2024-01-01T09:30\", \"2024-01-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\"], \"expected\": [\"2024-01-01T09:30\", \"2024-01-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\"], \"passed\": true}, {\"check\": \"only byminute\", \"actual\": [\"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\", \"2024-01-03T14:00\"], \"expected\": [\"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\", \"2024-01-03T14:00\"], \"passed\": true}, {\"check\": \"unsorted duplicate hours\", \"actual\": [\"2024-01-01T09:15\", \"2024-01-01T17:15\", \"2024-01-01T17:15\", \"2024-01-02T09:15\"], \"expected\": [\"2024-01-01T09:15\", \"2024-01-01T17:15\", \"2024-01-02T09:15\", \"2024-01-02T17:15\"], \"passed\": false}, {\"check\": \"product of two lists\", \"actual\": [\"2024-01-01T09:00\", \"2024-01-01T09:45\", \"2024-01-01T13:00\", \"2024-01-01T13:45\", \"2024-01-02T09:00\"], \"expected\": [\"2024-01-01T09:00\", \"2024-01-01T09:45\", \"2024-01-01T13:00\", \"2024-01-01T13:45\", \"2024-01-02T09:00\"], \"passed\": true}, {\"check\": \"dtstart after some slots\", \"actual\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"expected\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"passed\": true}, {\"check\": \"dtstart between minutes\", \"actual\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"expected\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"passed\": true}, {\"check\": \"three by three\", \"actual\": [\"2024-03-10T06:05\", \"2024-03-10T06:10\", \"2024-03-10T06:50\", \"2024-03-10T12:05\", \"2024-03-10T12:10\", \"2024-03-10T12:50\", \"2024-03-10T18:05\"], \"expected\": [\"2024-03-10T06:05\", \"2024-03-10T06:10\", \"2024-03-10T06:50\", \"2024-03-10T12:05\", \"2024-03-10T12:10\", \"2024-03-10T12:50\", \"2024-03-10T18:05\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.761,"exit_code":1,"observations":[{"actual":["2024-01-01T09:30","2024-01-01T17:30","2024-01-02T09:30","2024-01-02T17:30"],"check":"regression: default minute from dtstart","expected":["2024-01-01T09:30","2024-01-01T17:30","2024-01-02T09:30","2024-01-02T17:30"],"passed":true},{"actual":["2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30","2024-01-03T14:00"],"check":"only byminute","expected":["2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30","2024-01-03T14:00"],"passed":true},{"actual":["2024-01-01T17:15","2024-01-01T09:15","2024-01-01T17:15","2024-01-02T17:15"],"check":"unsorted duplicate hours","expected":["2024-01-01T09:15","2024-01-01T17:15","2024-01-02T09:15","2024-01-02T17:15"],"passed":false},{"actual":["2024-01-01T09:00","2024-01-01T09:45","2024-01-01T13:00","2024-01-01T13:45","2024-01-02T09:00"],"check":"product of two lists","expected":["2024-01-01T09:00","2024-01-01T09:45","2024-01-01T13:00","2024-01-01T13:45","2024-01-02T09:00"],"passed":true},{"actual":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"check":"dtstart after some slots","expected":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"passed":true},{"actual":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"check":"dtstart between minutes","expected":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"passed":true},{"actual":["2024-03-10T06:05","2024-03-10T06:10","2024-03-10T06:50","2024-03-10T12:05","2024-03-10T12:10","2024-03-10T12:50","2024-03-10T18:05"],"check":"three by three","expected":["2024-03-10T06:05","2024-03-10T06:10","2024-03-10T06:50","2024-03-10T12:05","2024-03-10T12:10","2024-03-10T12:50","2024-03-10T18:05"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: default minute from dtstart\", \"actual\": [\"2024-01-01T09:30\", \"2024-01-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\"], \"expected\": [\"2024-01-01T09:30\", \"2024-01-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\"], \"passed\": true}, {\"check\": \"only byminute\", \"actual\": [\"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\", \"2024-01-03T14:00\"], \"expected\": [\"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\", \"2024-01-03T14:00\"], \"passed\": true}, {\"check\": \"unsorted duplicate hours\", \"actual\": [\"2024-01-01T17:15\", \"2024-01-01T09:15\", \"2024-01-01T17:15\", \"2024-01-02T17:15\"], \"expected\": [\"2024-01-01T09:15\", \"2024-01-01T17:15\", \"2024-01-02T09:15\", \"2024-01-02T17:15\"], \"passed\": false}, {\"check\": \"product of two lists\", \"actual\": [\"2024-01-01T09:00\", \"2024-01-01T09:45\", \"2024-01-01T13:00\", \"2024-01-01T13:45\", \"2024-01-02T09:00\"], \"expected\": [\"2024-01-01T09:00\", \"2024-01-01T09:45\", \"2024-01-01T13:00\", \"2024-01-01T13:45\", \"2024-01-02T09:00\"], \"passed\": true}, {\"check\": \"dtstart after some slots\", \"actual\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"expected\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"passed\": true}, {\"check\": \"dtstart between minutes\", \"actual\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"expected\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"passed\": true}, {\"check\": \"three by three\", \"actual\": [\"2024-03-10T06:05\", \"2024-03-10T06:10\", \"2024-03-10T06:50\", \"2024-03-10T12:05\", \"2024-03-10T12:10\", \"2024-03-10T12:50\", \"2024-03-10T18:05\"], \"expected\": [\"2024-03-10T06:05\", \"2024-03-10T06:10\", \"2024-03-10T06:50\", \"2024-03-10T12:05\", \"2024-03-10T12:10\", \"2024-03-10T12:50\", \"2024-03-10T18:05\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.358,"exit_code":0,"observations":[{"actual":["2024-01-01T09:30","2024-01-01T17:30","2024-01-02T09:30","2024-01-02T17:30"],"check":"regression: default minute from dtstart","expected":["2024-01-01T09:30","2024-01-01T17:30","2024-01-02T09:30","2024-01-02T17:30"],"passed":true},{"actual":["2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30","2024-01-03T14:00"],"check":"only byminute","expected":["2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30","2024-01-03T14:00"],"passed":true},{"actual":["2024-01-01T09:15","2024-01-01T17:15","2024-01-02T09:15","2024-01-02T17:15"],"check":"unsorted duplicate hours","expected":["2024-01-01T09:15","2024-01-01T17:15","2024-01-02T09:15","2024-01-02T17:15"],"passed":true},{"actual":["2024-01-01T09:00","2024-01-01T09:45","2024-01-01T13:00","2024-01-01T13:45","2024-01-02T09:00"],"check":"product of two lists","expected":["2024-01-01T09:00","2024-01-01T09:45","2024-01-01T13:00","2024-01-01T13:45","2024-01-02T09:00"],"passed":true},{"actual":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"check":"dtstart after some slots","expected":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"passed":true},{"actual":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"check":"dtstart between minutes","expected":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"passed":true},{"actual":["2024-03-10T06:05","2024-03-10T06:10","2024-03-10T06:50","2024-03-10T12:05","2024-03-10T12:10","2024-03-10T12:50","2024-03-10T18:05"],"check":"three by three","expected":["2024-03-10T06:05","2024-03-10T06:10","2024-03-10T06:50","2024-03-10T12:05","2024-03-10T12:10","2024-03-10T12:50","2024-03-10T18:05"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: default minute from dtstart\", \"actual\": [\"2024-01-01T09:30\", \"2024-01-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\"], \"expected\": [\"2024-01-01T09:30\", \"2024-01-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\"], \"passed\": true}, {\"check\": \"only byminute\", \"actual\": [\"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\", \"2024-01-03T14:00\"], \"expected\": [\"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\", \"2024-01-03T14:00\"], \"passed\": true}, {\"check\": \"unsorted duplicate hours\", \"actual\": [\"2024-01-01T09:15\", \"2024-01-01T17:15\", \"2024-01-02T09:15\", \"2024-01-02T17:15\"], \"expected\": [\"2024-01-01T09:15\", \"2024-01-01T17:15\", \"2024-01-02T09:15\", \"2024-01-02T17:15\"], \"passed\": true}, {\"check\": \"product of two lists\", \"actual\": [\"2024-01-01T09:00\", \"2024-01-01T09:45\", \"2024-01-01T13:00\", \"2024-01-01T13:45\", \"2024-01-02T09:00\"], \"expected\": [\"2024-01-01T09:00\", \"2024-01-01T09:45\", \"2024-01-01T13:00\", \"2024-01-01T13:45\", \"2024-01-02T09:00\"], \"passed\": true}, {\"check\": \"dtstart after some slots\", \"actual\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"expected\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"passed\": true}, {\"check\": \"dtstart between minutes\", \"actual\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"expected\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"passed\": true}, {\"check\": \"three by three\", \"actual\": [\"2024-03-10T06:05\", \"2024-03-10T06:10\", \"2024-03-10T06:50\", \"2024-03-10T12:05\", \"2024-03-10T12:10\", \"2024-03-10T12:50\", \"2024-03-10T18:05\"], \"expected\": [\"2024-03-10T06:05\", \"2024-03-10T06:10\", \"2024-03-10T06:50\", \"2024-03-10T12:05\", \"2024-03-10T12:10\", \"2024-03-10T12:50\", \"2024-03-10T18:05\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}