Build LogInbox
#76
2026-06-085 min read

Making Gmail tractable in a day. Four branches and one partial index.

The Inbox Hub shipped in five sprints, all on the same day. The classifier is four comparisons against a rules table. The speed comes from a partial index on pending senders, not from the sync logic. Neither changed how I read email.

Read post
Build LogDevOps
#77
2026-06-066 min read

I built six sprints of article scheduling. For four of them, nothing fired.

Four sprints of Telegram button wiring, queue state machines, and free-text time parsing — all recording intent into `article_queue` without dispatching a single article. Sprint 5 was the first one that actually fired. Separating mechanism-to-record from mechanism-to-execute isn't a new idea; applying it deliberately at the sprint level is.

Read post
Build LogDVLAW
#78
2026-06-055 min read

The schedule queue took four sprints to remember. One to act.

After four sprints of B-schedule, a scheduled article existed as a database row with a correct timestamp. No article had published. Sprint 5 added the sweep daemon and publisher_lock. That is when scheduling became real.

Read post
Build LogDVLAW
#79
2026-06-045 min read

A missed slot at 09:00 should not silently vanish: building past-due grace into the article pipeline publisher

The `schedule_sweep` runs on a laptop. Laptops sleep. Without a grace policy, an article scheduled for 09:00 silently strands when the machine wakes at 09:07. Sprint 6 of B-schedule — past-due grace plus 48-hour hard-expire — turns that silent drop into a recoverable state with a reason, an audit trail, and a path back to publish.

Read post
Build LogPython
#80
2026-05-318 min read

The classifier is the product: how four branches replaced an inbox

Inbox Hub is five SQLite tables, twelve route handlers, four Shadow DOM components, and a launchd cron. Strip those away and what remains is a four-branch decision tree that runs on every message. Everything else is plumbing around that core.

Read post