{
  "//": "One entry per crit group; the agent name (lowercase) is the group id. The slot is structured (day, start, end, cutoffTime) with session and cutoff as derived display strings; all times are local to `timezone`. Provisional until enrolments settle: groups may be added or dropped. A group's slot runs every teaching week except those named in its `exceptions`, which is always present and usually empty: each entry replaces one `week` with its own day/start/end (plus derived session, cutoff, cutoffTime, and `date`, the YYYY-MM-DD the replacement falls on), carries the `reason` students are told, and carries a `room` only where that one session is not in the top-level `room`. To resolve a group's session or cutoff for a given week, prefer a matching exception over the standing slot; the cutoff moves with the session. deliverables carries each crit/assessment's student-repo prefix (repo = <repoPrefix>-<handle>); entries sharing a prefix share a repo. A crit's `num` is its C-number — identity, not schedule, and the number in its repo prefix. riffPrefix, present only on a crit that has them, names that crit's pod riff repos (<riffPrefix>-<group>-<pod>, pod 1..riffPods), which sit outside the submission namespace; the same prefix on several crits means those crits reuse one set of repos, provisioned once from the group's crit agent. riffSeeds, present only where some groups start elsewhere, maps a group id to {riffPrefix, seed}: that group's pod repos are <its riffPrefix>-<group>-<pod>, seeded from the org repo `seed` instead of the group's crit agent; a group not listed uses the crit's riffPrefix. promptFor, present only on a prompt-riff crit, is the slug of the deliverable (another entry in deliverables) whose brief the pods' prompt.md aims at; the group's crit agent runs those prompts after the session. Assessment `due` is an ISO instant and `dueLocal` is its YYYY-MM-DDTHH:MM rendering in `timezone`. weeks maps each teaching week to the Monday it starts; teachingBreak is the no-teaching gap, [start, end).",
  "room": "Marie Reay Building (155), Room 4.03",
  "timezone": "Australia/Canberra",
  "riffPods": 5,
  "groups": [
    {
      "agent": "shitao",
      "name": "Shitao",
      "day": "Mon",
      "start": "14:00",
      "end": "15:30",
      "tutor": {
        "name": "Ushini Attanayake",
        "slug": "ushini-attanayake"
      },
      "session": "Mon 14:00–15:30",
      "cutoff": "Mon 12:00",
      "cutoffTime": "12:00",
      "exceptions": [
        {
          "week": 9,
          "day": "Tue",
          "start": "14:00",
          "end": "15:30",
          "reason": "Monday 5 October is the ACT Labour Day public holiday",
          "session": "Tue 14:00–15:30",
          "cutoff": "Tue 12:00",
          "cutoffTime": "12:00",
          "date": "2026-10-06"
        }
      ]
    },
    {
      "agent": "bada",
      "name": "Bada",
      "day": "Mon",
      "start": "15:30",
      "end": "17:00",
      "tutor": {
        "name": "Ushini Attanayake",
        "slug": "ushini-attanayake"
      },
      "session": "Mon 15:30–17:00",
      "cutoff": "Mon 13:30",
      "cutoffTime": "13:30",
      "exceptions": [
        {
          "week": 9,
          "day": "Wed",
          "start": "15:30",
          "end": "17:00",
          "reason": "Monday 5 October is the ACT Labour Day public holiday",
          "room": "Marie Reay Building (155), Room 3.05",
          "session": "Wed 15:30–17:00",
          "cutoff": "Wed 13:30",
          "cutoffTime": "13:30",
          "date": "2026-10-07"
        }
      ]
    },
    {
      "agent": "baishi",
      "name": "Baishi",
      "day": "Wed",
      "start": "09:00",
      "end": "10:30",
      "tutor": {
        "name": "Tom Griffiths",
        "slug": "tom-griffiths"
      },
      "session": "Wed 09:00–10:30",
      "cutoff": "Wed 07:00",
      "cutoffTime": "07:00",
      "exceptions": []
    },
    {
      "agent": "dachi",
      "name": "Dachi",
      "day": "Wed",
      "start": "10:30",
      "end": "12:00",
      "tutor": {
        "name": "Tom Griffiths",
        "slug": "tom-griffiths"
      },
      "session": "Wed 10:30–12:00",
      "cutoff": "Wed 08:30",
      "cutoffTime": "08:30",
      "exceptions": []
    },
    {
      "agent": "yunlin",
      "name": "Yunlin",
      "day": "Wed",
      "start": "14:00",
      "end": "15:30",
      "tutor": {
        "name": "Bill McAlister",
        "slug": "bill-mcalister"
      },
      "session": "Wed 14:00–15:30",
      "cutoff": "Wed 12:00",
      "cutoffTime": "12:00",
      "exceptions": []
    },
    {
      "agent": "liuru",
      "name": "Liuru",
      "day": "Wed",
      "start": "15:30",
      "end": "17:00",
      "tutor": {
        "name": "Bill McAlister",
        "slug": "bill-mcalister"
      },
      "session": "Wed 15:30–17:00",
      "cutoff": "Wed 13:30",
      "cutoffTime": "13:30",
      "exceptions": []
    }
  ],
  "deliverables": [
    {
      "kind": "crit",
      "slug": "01-forgotten-web",
      "title": "Forgotten web",
      "num": 1,
      "week": 2,
      "repoPrefix": "comp4020-crit1",
      "riffPrefix": "comp4020-riff1"
    },
    {
      "kind": "crit",
      "slug": "02-unsolicited-redesign",
      "title": "Unsolicited redesign",
      "num": 2,
      "week": 3,
      "repoPrefix": "comp4020-crit2",
      "riffPrefix": "comp4020-riff2"
    },
    {
      "kind": "crit",
      "slug": "03-a1-retro",
      "title": "Assignment 1 retro",
      "num": 3,
      "week": 4,
      "repoPrefix": "comp4020-ass1",
      "riffPrefix": "comp4020-riff3"
    },
    {
      "kind": "assessment",
      "slug": "assignment-1",
      "title": "Assignment 1",
      "week": 4,
      "due": "2026-08-17T02:00:00.000Z",
      "dueLocal": "2026-08-17T12:00",
      "repoPrefix": "comp4020-ass1"
    },
    {
      "kind": "crit",
      "slug": "04-instrument",
      "title": "An instrument",
      "num": 4,
      "week": 5,
      "repoPrefix": "comp4020-crit4",
      "riffPrefix": "comp4020-riff4"
    },
    {
      "kind": "crit",
      "slug": "05-game",
      "title": "A game",
      "num": 5,
      "week": 6,
      "repoPrefix": "comp4020-crit5",
      "riffPrefix": "comp4020-riff5"
    },
    {
      "kind": "crit",
      "slug": "06-a2-retro",
      "title": "Assignment 2 retro",
      "num": 6,
      "week": 7,
      "repoPrefix": "comp4020-ass2",
      "riffPrefix": "comp4020-riff6"
    },
    {
      "kind": "assessment",
      "slug": "assignment-2",
      "title": "Assignment 2",
      "week": 7,
      "due": "2026-09-21T02:00:00.000Z",
      "dueLocal": "2026-09-21T12:00",
      "repoPrefix": "comp4020-ass2"
    },
    {
      "kind": "crit",
      "slug": "07-anu-system",
      "title": "Build the ANU system you wish existed",
      "num": 7,
      "week": 8,
      "repoPrefix": "comp4020-crit7",
      "riffPrefix": "comp4020-riff7"
    },
    {
      "kind": "crit",
      "slug": "08-its-alive",
      "title": "It's alive!",
      "num": 8,
      "week": 9,
      "repoPrefix": "comp4020-final",
      "riffPrefix": "comp4020-riff8",
      "promptFor": "09-all-at-once"
    },
    {
      "kind": "crit",
      "slug": "09-all-at-once",
      "title": "All at once",
      "num": 9,
      "week": 10,
      "repoPrefix": "comp4020-final",
      "riffPrefix": "comp4020-riff8",
      "promptFor": "10-fly-by-instruments"
    },
    {
      "kind": "crit",
      "slug": "10-fly-by-instruments",
      "title": "Fly by instruments",
      "num": 10,
      "week": 11,
      "repoPrefix": "comp4020-final",
      "riffPrefix": "comp4020-riff8",
      "riffSeeds": {
        "shitao": {
          "riffPrefix": "comp4020-riff10",
          "seed": "comp4020-riff8-baishi-2"
        },
        "bada": {
          "riffPrefix": "comp4020-riff10",
          "seed": "comp4020-riff8-baishi-2"
        }
      },
      "promptFor": "final-project"
    },
    {
      "kind": "assessment",
      "slug": "final-project",
      "title": "Final Project",
      "week": 12,
      "due": "2026-11-09T01:00:00.000Z",
      "dueLocal": "2026-11-09T12:00",
      "repoPrefix": "comp4020-final"
    }
  ],
  "weeks": [
    {
      "week": 1,
      "monday": "2026-07-27"
    },
    {
      "week": 2,
      "monday": "2026-08-03"
    },
    {
      "week": 3,
      "monday": "2026-08-10"
    },
    {
      "week": 4,
      "monday": "2026-08-17"
    },
    {
      "week": 5,
      "monday": "2026-08-24"
    },
    {
      "week": 6,
      "monday": "2026-08-31"
    },
    {
      "week": 7,
      "monday": "2026-09-21"
    },
    {
      "week": 8,
      "monday": "2026-09-28"
    },
    {
      "week": 9,
      "monday": "2026-10-05"
    },
    {
      "week": 10,
      "monday": "2026-10-12"
    },
    {
      "week": 11,
      "monday": "2026-10-19"
    },
    {
      "week": 12,
      "monday": "2026-10-26"
    }
  ],
  "teachingBreak": {
    "start": "2026-09-07",
    "end": "2026-09-21"
  }
}