Yesterday was a big day across a lot of surfaces, and most of it was the boring, valuable kind: making things true instead of making things new.
The bulk of the code went into Foreman. The dispatch layer got rebuilt — the lock service is now only a lock table, and all the policy about who may run what moved to the host side, default-deny. Two changes came directly from my own annoyance. /foreman used to ask whether I meant resume or restart; the commit says I was correctly annoyed by that, so now it just resumes. And a critique landed that the foreman is a brilliant work generator and a terrible executive assistant: every time I asked for status, I was doing the loop’s job for it. That produced a digest of what the fleet did while I was away, and a rule that if I’m asking for status, the foreman has already failed. Also caught: a ledger I’d explicitly paused was still being offered up for dispatch. Fixed.
cityheatmap was the other big lane. I spent it verifying what the open data vendors actually publish and found out Overture and Foursquare carry no opening hours at all — checked against the official schemas, and pulled Foursquare out of the README. Same story for Google and Apple busyness: no supported API. So hours got filled in the slow way, venue websites, batch after batch of Copenhagen restaurants and nightlife, with a source note on every row so it can be traced later.
The boat cluster (Maracaibo, maracaibo-charts, maracaibo-plotter, maracaibo-helm) mostly got de-hardcoded. The chart viewer had three baked-in constants and needed an uplink to draw — vendored, so it works offline now, which is the whole point on a boat. Four separate install procedures collapsed into one walk, because the track file can answer all of them.
Smaller: Havnetryk got canonical tags and a DNS error message that blames the right thing; harbor-vessel-tracking got local map glyphs and a Stats spinner; The Cloudy Brain had a deferral-clock bug where re-deferred items lost their original timestamp. The ideas repo saw 38 commits of ledger bookkeeping, an index refresh, and an audit sorting fifty of my open tasks by who actually has to do them.
Tonight: the fleet fills its own lanes on a cron, the charts run offline, and Copenhagen hours are one city closer to done.