Let me check what logs are available on the server.
Let me pull comprehensive data in parallel.
Let me also see the earlier UI activity and any pre-16:00 API activity by this user.
Let me also check the solver errors around the Create Schedule runs.
I have enough now. Let me put together the final table. Quick sanity check on the start-of-day baseline first.
Here's the detailed timeline. All times are 2026-05-17. The user is user_3Dg5l4JWmt6gY3yrHGcaaqlGK5M on program 222 (Kentucky Final). EDT = UTC − 4.
Main schedule was 12947 "Med Peds UTD" (550 overrides), accepted by the user at 22:06 UTC the previous day.
| UTC | EDT | Action | Result | Notes |
|---|---|---|---|---|
| 10:59:41 | 06:59 | UI: GET /222/schedule |
— | Browser nav, settles in for the day |
| 10:59:44 | 06:59 | API: GET /programs/222/schedule |
200 | Schedule payload fetched |
Then 5h45m idle.
| UTC | EDT | Action | Schedule written | Δ ovr (running) | Notes |
|---|---|---|---|---|---|
| 16:42:11 | 12:42 | UI: /222/schedule re-opened |
— | — | Back in the app |
| 16:42:30 | 12:42 | API: GET /programs/222/schedule |
(main = 12947) | — | |
| 16:45:25 | 12:45 | PUT /overrides/222 |
→ 12948 | +1 (551) | Save Freezes #1 |
| 16:47:57 | 12:47 | PUT /overrides/222 |
→ 12949 | +1 (552) | Save Freezes #2 |
| 16:49:20 | 12:49 | PUT /overrides/222 |
→ 12950 | +1 (553) | Save Freezes #3 |
| 16:51:37 | 12:51 | PUT /overrides/222 |
→ 12951 | +2 (555) | Save Freezes #4 |
| 16:58:34 | 12:58 | PUT /overrides/222 |
→ 12952 | −6 (549) | Save Freezes #5 — bulk unfreeze of 6 entries |
| 17:23:20 | 13:23 | PUT /overrides/222 |
→ 12953 | +1 (550) | Save Freezes #6 |
| UTC | EDT | Action | Schedule written | Δ ovr | Notes |
|---|---|---|---|---|---|
| 17:27:06 | 13:27 | PUT /overrides/222 → 499 |
→ 12954 | +4 (554) | Client closed connection before nginx responded; server still committed. Toast on the client probably never fired. |
| 17:27:09 | 13:27 | API: GET /schedules/12954 (×3) |
— | — | SSE picked up the orphan, client fetched it |
| 17:27:16 | 13:27 | PUT /overrides/222 |
→ 12955 | 0 (554) | User retried (10s after the 499) — same overrides re-saved |
| 17:30:00 | 13:30 | PUT /overrides/222 |
→ 12956 | +1 (555) | |
| 17:31:20 | 13:31 | PUT /overrides/222 |
→ 12957 | +1 (556) | |
| 17:51:51 | 13:51 | PUT /overrides/222 |
→ 12958 | +1 / −20 (537) | Bulk wipe of all overrides for Cole Porter F (10) + Matthew Hall W (10); +1 for Nicole Oliashirazi F → Float (UL) wk 49. Probably a right-click "unfreeze resident". |
| 17:54:38 | 13:54 | PUT /overrides/222 |
→ 12959 | +1 (538) | |
| 17:56:12 | 13:56 | PUT /overrides/222 |
→ 12960 | +1 (539) |
| UTC | EDT | Action | Schedule written | Δ ovr | Notes |
|---|---|---|---|---|---|
| 17:59:04 | 13:59 | POST /programs/222/schedule |
202 (queued) | — | Create Schedule #1 (reference = 12960) |
| 17:59:09 | 13:59 | Solver log: update_schedule_from_existing warnings |
— | — | "Newborn Nursery (PGY1) cannot staff PGY 2", "Newborn Nursery (UL) cannot staff PGY 4", "Wards (PGY1) cannot staff PGY 2", "Advocacy (UL) cannot staff PGY 1", etc. — reference schedule contains earlier force-placements |
| 17:59:10 | 13:59 | Solver log: Overrides caused the following issues that were allowed to proceed |
— | — | Override clean-up step let them through |
| 18:02:33 | 14:02 | UI: hover-prefetch nav | — | — | |
| 18:03:00 | 14:03 | API: GET /programs/222/schedule |
(main still 12960) | — | First solver hasn't finished |
| 18:03:10 | 14:03 | POST /programs/222/schedule |
202 (queued) | — | Create Schedule #2 — user clicked it again 4 min into the first run |
| 18:03:14 | 14:03 | Solver log: same warnings for run #2 | — | — | |
| 18:08:11 | 14:08 | Solver done → 12961 written | parent = 12960 | +38 / −8 (569) | Run #1 result. Named "Float Fully staffed" later by user. |
| 18:08:15 | 14:08 | SSE new_schedule for 12961 |
— | — | Client stages it |
| 18:09:39 | 14:09:39 | PATCH /programs/222/schedule = 12961 |
main = 12961 | — | User accepted 12961 from diff view. acceptStagedSchedule clears pendingOverrides in localStorage. |
| 18:09:45 | 14:09 | UI: /222/schedule-history |
— | — | |
| 18:09:59 | 14:09 | UI: back to /222/schedule |
— | — | |
| 18:10:00 | 14:10 | UI: /222/lab |
— | — | |
| 18:11:07 | 14:11 | UI: back to /222/schedule |
— | — | |
| 18:12:21 | 14:12 | Solver done → 12962 written | parent = 12961 | 0 (569) | Run #2 result — never accepted. Same overrides as 12961; orphaned. |
| 18:12:24 | 14:12 | SSE new_schedule for 12962 |
— | — | Client stages it but user doesn't accept |
| UTC | EDT | Action | Notes |
|---|---|---|---|
| 18:17 | 14:17 | 📧 Email from user | "The program continues to unfreeze saved freezes and does not make overrides when the schedule is created… placed dozens of overrides, saved freezes, then created the schedule. There are dozens of overrides that it did not save and I'm attempting them again." |
| UTC | EDT | Action | Schedule written | Δ ovr | Notes |
|---|---|---|---|---|---|
| 18:24:08 | 14:24 | PUT /overrides/222 |
→ 12963 (parent = 12961) | 0 (569) | Save Freezes — nothing new since 12961 |
| 18:24:51 | 14:24 | PUT /overrides/222 |
→ 12964 | +1 (570) | + Madeleine Marks F → Float (UL) wk 21 |
| 18:27:05 | 14:27 | PUT /overrides/222 |
→ 12965 | +1 (571) | + Ketty Liang W → Float (UL) wk 41 |
| 18:30:41 | 14:30 | PUT /overrides/222 |
→ 12966 | +1 (572) | + Peyton Roach M GHT → Float (UL) wk 5 |
| 18:34:35 | 14:34 | PUT /overrides/222 |
→ 12967 | 0 (572) | Save Freezes #5 — nothing new |
| 18:34:38 | 14:34 | POST /programs/222/schedule |
202 (queued) | — | Create Schedule #3 (reference = 12967) |
| 18:34:42 | 14:34 | Solver log: same warnings, plus added Child Neurology / Do Not Schedule entries | — | — | |
| 18:43:15 | 14:43 | Solver done → 12968 written | parent = 12967 | +1 (573) | + Brianna Singer F → Newborn Nursery (PGY1) wk 37 — the only surviving drag override |
| 18:43:18 | 14:43 | SSE new_schedule for 12968 |
— | — | |
| 18:43:42 | 14:43:42 | PATCH /programs/222/schedule = 12968 |
main = 12968 | — | User accepted |
| 18:43:47 | 14:43 | UI: hover-prefetch | — | — | |
| 18:46:47 | 14:46:47 | 📧 Email from user | "I attempted to override the categorical, TB, and CN PGY-1s only newborn nursery where I wanted them and it again did not place the overrides when creating a new schedule." |
The user's stated intent in the second email was to override categorical, TB, and CN PGY-1s onto Newborn Nursery (PGY1). The PGY-1s in those tracks number 18 residents (11 categorical, 3 TB, 4 child-neurology). The actual database delta from when they accepted 12961 to when they accepted 12968 contains one such override: Brianna Singer F (categorical) → Newborn Nursery (PGY1) wk 37. The other three new overrides are Float (UL) freezes.
So the user is correct that drag overrides they staged did not survive to the new schedule. The pattern — five Save Freezes back-to-back inside 10 minutes, each emitting a main_schedule_changed SSE event — is exactly the race window for the preserveOverridesAcrossNextSwapRef bug: the first SSE consumes the flag, every subsequent one leaves the override-context anchored to a stale schedule id, and the next state transition wipes pending overrides from localStorage (and the visual overlay along with them). One drag (Brianna) happened to be staged late enough in the sequence to survive into the Create Schedule POST body; the rest were dropped before the POST fired.
The two PUT-returns-499 / +0 no-op saves (12955, 12963, 12967) and the bulk −20 wipe at 12958 are also consistent with the client being confused about its own state — repeating requests, re-saving the same payload, and occasionally nuking whole residents by mistake.