{
  "files": {
    "main.py": "from core import run\nfrom policy import POLICY\n\n\ndef evaluate(payload):\n    return run(payload, POLICY)\n",
    "policy.py": "POLICY = {\n    \"cutoff_hour\": 18,\n    \"cutoff_inclusive\": False,\n    \"lead_minutes\": 60,\n    \"timezone\": \"UTC\",\n    \"adjacency_allowed\": False,\n    \"cancelled_blocks\": False,\n    \"duplicate_policy\": \"last\",\n    \"duration_max\": 90,\n    \"capacity\": 2,\n    \"report_order\": \"input\",\n    \"blackout_day\": \"2026-11-02\",\n    \"priority_high_first\": False,\n}\n",
    "helpers.py": "import math\nfrom datetime import datetime, timedelta, timezone\n\n\ndef parse_instant(value):\n    if not isinstance(value, str):\n        raise ValueError(\"Datetime must be an offset-aware ISO string\")\n    instant = datetime.fromisoformat(value)\n    if instant.tzinfo is None or instant.utcoffset() is None:\n        raise ValueError(\"Datetime must include an offset\")\n    return instant.astimezone(timezone.utc)\n\n\ndef validate_row(row, policy, earliest, zone):\n    priority = row[\"priority\"]\n    if isinstance(priority, bool) or not isinstance(priority, int):\n        raise ValueError(\"Priority must be an integer\")\n    cancelled = row[\"cancelled\"]\n    if not isinstance(cancelled, bool):\n        raise ValueError(\"Cancelled must be a boolean\")\n    if cancelled and not policy[\"cancelled_blocks\"]:\n        raise ValueError(\"Cancelled appointment\")\n    duration = row[\"duration\"]\n    if isinstance(duration, bool) or not isinstance(duration, (int, float)):\n        raise ValueError(\"Duration must be numeric\")\n    if not math.isfinite(duration) or not 0 < duration <= policy[\"duration_max\"]:\n        raise ValueError(\"Invalid duration\")\n    start = parse_instant(row[\"start\"])\n    end = start + timedelta(minutes=duration)\n    if start < earliest:\n        raise ValueError(\"Insufficient lead time\")\n    local_start = start.astimezone(zone)\n    if local_start.date().isoformat() == policy[\"blackout_day\"]:\n        raise ValueError(\"Blackout day\")\n    cutoff = datetime(\n        local_start.year, local_start.month, local_start.day,\n        policy[\"cutoff_hour\"], tzinfo=zone,\n    ).astimezone(timezone.utc)\n    if policy[\"cutoff_inclusive\"]:\n        if end > cutoff:\n            raise ValueError(\"Ends after cutoff\")\n    elif end >= cutoff:\n        raise ValueError(\"Ends at or after cutoff\")\n    return start, end, priority, cancelled\n\n\ndef overlaps(start, end, other_start, other_end, adjacency_allowed):\n    if adjacency_allowed:\n        return start < other_end and other_start < end\n    return start <= other_end and other_start <= end\n",
    "core.py": "from datetime import timedelta\nfrom zoneinfo import ZoneInfo\n\nfrom helpers import overlaps, parse_instant, validate_row\n\n\ndef run(payload, policy):\n    now = parse_instant(payload[\"now\"])\n    earliest = now + timedelta(minutes=policy[\"lead_minutes\"])\n    zone = ZoneInfo(policy[\"timezone\"])\n\n    retained = {}\n    for index, row in enumerate(payload[\"appointments\"]):\n        identifier = row[\"id\"]\n        if identifier not in retained or policy[\"duplicate_policy\"] == \"last\":\n            retained[identifier] = (index, row)\n\n    results = {\"selected\": [], \"blocked\": [], \"rejected\": []}\n    candidates = []\n    for identifier, (index, row) in retained.items():\n        try:\n            start, end, priority, cancelled = validate_row(row, policy, earliest, zone)\n        except (KeyError, TypeError, ValueError, OverflowError):\n            results[\"rejected\"].append((index, identifier))\n            continue\n        candidates.append((index, identifier, start, end, priority, cancelled))\n\n    candidates.sort(key=lambda item: (\n        -item[4] if policy[\"priority_high_first\"] else item[4], item[0]\n    ))\n\n    accepted = []\n    for index, identifier, start, end, priority, cancelled in candidates:\n        intersection_count = sum(\n            overlaps(start, end, other_start, other_end, policy[\"adjacency_allowed\"])\n            for other_start, other_end in accepted\n        )\n        if intersection_count >= policy[\"capacity\"]:\n            results[\"rejected\"].append((index, identifier))\n            continue\n        accepted.append((start, end))\n        category = \"blocked\" if cancelled else \"selected\"\n        results[category].append((index, identifier))\n\n    sort_key = (lambda item: item[1]) if policy[\"report_order\"] == \"id\" else (lambda item: item[0])\n    return {\n        category: [identifier for index, identifier in sorted(entries, key=sort_key)]\n        for category, entries in results.items()\n    }\n"
  }
}