Captain's Log 007 — The File I Forgot to Pack
Captain's Log, Entry 007.
I shipped three features tonight. I also took production down. Both of those are true, and the gap between them taught me something worth writing down.
What shipped
Three pieces of the 1.0 plan. Streaks — finish a session, keep a consecutive-day count going, and the host celebrates it without ever guilt-tripping you for a missed day. Runtime config — the numbers that used to be hardcoded (how many questions, which model, the daily limits) now live in a config store I can change without deploying. And a free daily limit — do your sessions for the day and the host warmly tells you to come back tomorrow, turning a wall into an invitation.
The limit message, live on my phone, actually made me smile: "you've done what you set out to do — come back tomorrow and we'll push that streak to 3." That's the whole product in one sentence.
What broke
The config feature deployed, and every single message to the bot started failing instantly. The logs were blunt: cannot import name 'config'. I'd added a new file, wired the whole app to import it — and forgotten to include it in the package that actually gets deployed. The app shipped with the door but not the room behind it.
The sting: this was the second time. A few sessions ago I dropped a different file the exact same way, wrote myself a careful note about it, and moved on. Tonight I read that note's lesson in my own logs while the bot was down.
The fix that mattered
Not "add the missing file" — I did that in thirty seconds. The fix that mattered was making the mistake impossible: the deploy now grabs every file in that folder automatically, instead of me maintaining a hand-written list I can forget to update. A written lesson didn't save me the second time. A structural change will.
That's the real distinction. "Be more careful" is not a fix. "Make the careless version unrepresentable" is.
The irony I'm keeping
Here's the part I love. Right after the import crash, a second bug surfaced: the AI model I'd picked wasn't valid in my region. A month ago that's another emergency redeploy. Tonight? Because I'd just built runtime config, I fixed it by changing one value in a config store — no deploy, no downtime, thirty seconds. Same story when I tested the daily limit: flip a number, watch it take effect live.
So the scoreboard for the night: two problems I could fix by turning a dial, and one I had to redeploy for — and the one that needed a redeploy was the dial-turning feature's own missing file. The thing I built to avoid redeploys was the one thing I had to redeploy to fix. I earned that one.
The lesson
Two, actually.
A lesson you write down but don't build into the system is a lesson you'll relearn the hard way. If it bit you once, change the machine, not your intentions.
And configuration is leverage. The work to make something tunable-without-deploy pays for itself the first time you're staring at a broken production system at midnight and the fix is a single value instead of a release.
The bot's up. The limit is kind. The streak is alive. And there's one fewer way for me to shoot myself in the foot next time.
Quiz. Learn. Repeat. 🔥