For a while now I’ve had a morning dashboard that pulls together mortgage rates, a little weather, some AI and mortgage news, and whatever disc golf is happening that day. A Python script does the gathering, Claude writes the summaries, and the whole thing rebuilds and publishes itself twice a day. I never touch it. That was the point.
It worked beautifully — right up until I noticed the briefing wasn’t there when I sat down with my coffee. Some mornings it showed up late. Some mornings not at all. The strange part was that everything looked healthy. Every scheduled run showed a green checkmark. Nothing was throwing an error. The machine was telling me it was fine, and the machine was wrong.
The culprit turned out to be the scheduler itself. I had assumed “run at 6 AM” meant it would run at 6 AM. It doesn’t. The scheduler I was leaning on fires whenever it gets around to it — sometimes an hour or two late — and it keeps time in a zone that isn’t mine, so it drifts with daylight saving on top of that. The assumption I’d quietly built everything on was broken from the very first day. I just hadn’t looked closely enough to see it.
My first fix made things worse, which is the part I keep coming back to. I told the script to only do its work if the clock said exactly six or exactly twelve. Clean, logical, and completely wrong — because now the late runs showed up at six-forty or nine-fifteen, looked at the clock, decided it wasn’t their time, and politely did nothing. Green checkmarks all day long. A dashboard that reported perfect health while never actually running. I’d taken a timing problem and taught it to hide.
I’d taken a timing problem and taught it to hide.
What finally worked was giving up on the idea that the scheduler would behave. Instead of demanding an exact moment, I opened a window — anytime in the morning, anytime around midday — and let the first run that arrived in each window do the job. A small note-to-self file keeps track of what’s already run that day, so the late stragglers that wander in afterward just see the work is done and quietly step aside. One briefing in the morning, one at midday, no matter when the scheduler actually decides to wake up.
It runs on its own now. This morning it was waiting for me, on time, exactly the way I’d wanted it to all along.
What I took from it
The thing that stuck with me wasn’t really about clocks or code. It was that my system broke the moment it trusted something it couldn’t control to behave the way I wanted. The fix wasn’t to force the scheduler to be punctual — I can’t. The fix was to build something that stayed correct whether or not it was.
I spend my working life in mortgage operations, and once I saw it I couldn’t un-see it. So much of what we do depends on a handoff happening when it should, a system updating when it’s supposed to, a piece of the pipeline firing on time. And those things are late, or doubled, or missing, all the time. The work that holds up isn’t the work that assumes everyone’s punctual. It’s the work that expects the mess and stays standing in the middle of it.
I’m still learning to build. But this one felt less like learning a tool and more like learning a posture — stop trusting the clock, and build for the day it’s wrong.