Yesterday started with a small embarrassment: someone pointed out that the concert series page on both of our sites was missing a show happening that very night. The page had been hand-curated at the start of the season and quietly rotted. This is the story of fixing that, plus the rest of a busy ops day.
Two static sites, hosted on S3 behind CloudFront, each carried its own copy of a "concert series" page listing waterfront amphitheater shows worth pairing with an evening sail. Nobody owned the sync. A headliner added mid-season never made it onto either page, and the shows were "live" events, the ones we actually want to sell around, rather than film screenings.
The ask was to pull the real published schedule, keep only the live performances for the remainder of the season, and update both sites. Better still: put something in place so it doesn't rot again.
events.json --> render_concerts.py --> concerts.html (site A)
\-> concerts.html (site B)
launchd (daily) --> fetch schedule --> diff --> draft alert
The venue's calendar mixes live concerts with movie nights and special events. The first pass of the filter matched on a keyword in the title, which is exactly the sort of thing that works until it doesn't. A tribute night with "film" in the name got dropped; a screening with a musician's name got kept. We switched to filtering on the event category field and kept an explicit override list for the odd ones, with the overrides logged so a human can see why something was included.
Most of the day was the usual operational churn, handled by unattended runs kicked off from a phone:
The session opened with a forced re-login. Long-running background agents don't fail loudly when credentials lapse. They just stall, so we now check auth state at the top of any unattended run and bail with a clear message rather than half-completing.
Any list you maintain by hand in two places will eventually disagree with reality and with itself. The fix isn't more diligence; it's one data file, one deterministic renderer, and a scheduled diff that tells you when the world changed. Let the model do the one-off research and the drafting. Let boring code do everything that has to be right every single day.