{"abstract":"Slots earlier on the dtstart day than dtstart are emitted.","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 `t <= first` drops the dtstart slot itself.","family":"w2-calendar-recurrence-rules-daily-byhour-byminute-before-start","id":"FA-77106","implementations":{"attempt":{"sha256":"cfcee85338da7c887703772453f731ff90659f1eb244235a43e8470aeedf79a2","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 [('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 [('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":"7a0e1d75005d04c6f90799a6f468f84aff24e5772fe0c29a4adeb335e3350989","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.date() < first.date():\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 [('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 [('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":"3f2849752de1ecfacb6a999bebc4fa4d3da8bce3919b0a2149b174f0fe53848d","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 [('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 [('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-before-start","generated_at":"2026-09-29T14:49:22.460756+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 before start decision use `t < first`, leaving the other decision sites of the model unchanged.","root_cause":"The start filter compares dates only.","sha256":"526e869a85c16aeb15b0a3942bb4491cb4b2c264578eee72b9f2eff2105a0132","title":"Daily BYHOUR/BYMINUTE time-of-day expansion: before start · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.833,"exit_code":1,"observations":[{"actual":["2024-01-01T17:30","2024-01-02T09:30","2024-01-02T17:30","2024-01-03T09: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":false},{"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-02T18:00","2024-01-03T08:00","2024-01-03T12:00","2024-01-03T18:00"],"check":"dtstart after some slots","expected":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"passed":false},{"actual":["2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20","2024-01-03T12:40"],"check":"dtstart between minutes","expected":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"passed":false},{"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-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\", \"2024-01-03T09:30\"], \"expected\": [\"2024-01-01T09:30\", \"2024-01-01T17:30\", \"2024-01-02T09:30\", \"2024-01-02T17:30\"], \"passed\": false}, {\"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-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\", \"2024-01-03T18:00\"], \"expected\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"passed\": false}, {\"check\": \"dtstart between minutes\", \"actual\": [\"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\", \"2024-01-03T12:40\"], \"expected\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"passed\": false}, {\"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":40.775,"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:00","2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30"],"check":"only byminute","expected":["2024-01-01T14:30","2024-01-02T14:00","2024-01-02T14:30","2024-01-03T14:00"],"passed":false},{"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-02T08:00","2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00"],"check":"dtstart after some slots","expected":["2024-01-02T12:00","2024-01-02T18:00","2024-01-03T08:00","2024-01-03T12:00"],"passed":false},{"actual":["2024-01-02T12:00","2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00"],"check":"dtstart between minutes","expected":["2024-01-02T12:20","2024-01-02T12:40","2024-01-03T12:00","2024-01-03T12:20"],"passed":false},{"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:00\", \"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\"], \"expected\": [\"2024-01-01T14:30\", \"2024-01-02T14:00\", \"2024-01-02T14:30\", \"2024-01-03T14:00\"], \"passed\": false}, {\"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-02T08:00\", \"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\"], \"expected\": [\"2024-01-02T12:00\", \"2024-01-02T18:00\", \"2024-01-03T08:00\", \"2024-01-03T12:00\"], \"passed\": false}, {\"check\": \"dtstart between minutes\", \"actual\": [\"2024-01-02T12:00\", \"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\"], \"expected\": [\"2024-01-02T12:20\", \"2024-01-02T12:40\", \"2024-01-03T12:00\", \"2024-01-03T12:20\"], \"passed\": false}, {\"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.292,"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"}