One system for rules, requests, and iteration

By Tyler Fong • 5 min read

Share this post

Most residency block schedules follow the same working loop: set the schedule rules, collect resident requests, then iterate until coverage, fairness, and preferences line up. The loop itself is straightforward. What makes it slow is how often each step lives in a different tool.

Rules start in a spreadsheet. Requests arrive through a Google Form, email thread, or shared doc. Review happens somewhere else—another sheet, a printed grid, or a chief's notes. Every handoff adds translation work, and every translation step is a place where intent gets lost or retyped.

Why fragmented tools slow the scheduling loop

The cost shows up before anyone opens a draft. Someone has to generate a request form that mirrors this year's electives, blocks, and blackout windows. If the rules change mid-cycle—an added night-float constraint, a new clinic continuity requirement—the form is already out of date, or residents submit free text that does not map cleanly to the model.

Even when responses land on time, program staff still translate those answers into structured input: which resident wants which rotation, which weeks are unavailable, which pairings to avoid. That translation is quiet labor. It is also error-prone, especially when the same preference appears in three places with slightly different wording.

Review compounds the problem. An APD checks coverage in one file. A chief reviews request fulfillment in another. Office staff reconcile both against the rule sheet. When something fails—too many ICU weeks for one PGY-2, a vacation that breaks a required sequence—the fix often means re-entering data so the next draft can incorporate the change.

Keep rules, intake, and review in one place

A cleaner workflow puts schedule rules, request intake, and draft review in the same system. Rules define what the schedule must satisfy. The request form is generated from those rules, so residents answer against the actual electives, block structure, and constraints the program is using—not a stale copy.

Structured requests then feed iteration directly. Instead of copying preferences into a solver spreadsheet by hand, staff adjust a rule or accept a preference and regenerate. The goal is not fewer conversations; it is fewer rounds of re-entry between conversations.

Tools built for this loop—platforms like OSO among them—treat rules and requests as shared inputs to the same draft, so a change in one place shows up in the next review without a separate import step.

One source of truth for staff, chiefs, and APDs

Fragmentation is also a coordination problem. When office staff, chiefs, and APDs each hold a partial view, disagreements about "what we already promised" are inevitable. A single source of truth does not remove judgment calls, but it makes the current rules, submitted requests, and latest draft visible to everyone in the same frame.

That shared context shortens the iterate step. A coverage gap and the resident requests that trade against it can be discussed together, rather than reconstructed from email. Soft constraints stay soft; hard constraints stay explicit; and the next revision starts from the same baseline for everyone who needs to sign off.

If your program's scheduling season still feels like assembling a puzzle from four inboxes, the bottleneck is rarely the algorithm. It is the distance between rules, requests, and the room where people decide what to change next. Closing that distance is how iteration becomes review—not rework.

Share this post

  • Program management
  • Resident requests
  • Block scheduling