Work log: 2026-03-08
What shipped today
The big theme was personal automation infrastructure — building the systems that let PaulOS act as a personal assistant, not just a dev tool.
Fastmail CalDAV integration. Full read/write access to calendar events and tasks via caldav.fastmail.com. Calendar discovery, event queries with time-range filtering, event creation, task/reminder management. This gives every agent the ability to add items to Paul’s calendar and task list — the same things a human admin would do.
Reach module — unified communication routing. Agents no longer pick channels. They pick urgency, and reach() routes automatically: fyi → Discord only, today → Fastmail task, scheduled → calendar event + Pushover, nag → task + Pushover + Discord, urgent → everything at high priority. This codifies how agents get Paul’s attention and ensures the right channel for the right situation.
Personal assistant loop. A scheduled agent (paulos assistant) that runs every 30 minutes checking: calendar events in the next 2 hours (Pushover reminder), unanswered real emails filtered from noise (nag with sender + subject + Fastmail link), overdue tasks (nag), and morning COS briefing (7-10am, once per day). Deployed both locally via launchd and on speedy-gonzales via launchd.
Server deployment. Got paulos running on speedy-gonzales with launchd agents for assistant, sentry-social, and stale-issues. Synced missing env vars (Fastmail, Pushover, Brevo, SendGrid), fixed PATH issues (venv not in launchd PATH), installed Ghostty terminfo for tmux over SSH. Confirmed tmux works for future orchestrate migration.
Autonomous pipeline. The orchestrate agents ran a full triage→prep→exec→scout cycle, shipping 6 issues through the standard PR flow. Ruff linting added to CI (83 violations fixed across 41 files). Health check got auto-kick for stale agents.
Launchd semantic naming. Renamed hourly → sentry-social and daily → stale-issues. Added period column to paulos launchd status. Agents are named by what they do, not when they run.
Completed
- #294 — Orchestrate launchd agents stop auto-firing after idle period
- #295 — Triage skill short-circuits when called repeatedly
- #283 — Add ruff linting to CI workflow
- #284 — Log warnings instead of silently returning empty from PostHog and Sentry API calls
- #285 — Remove unused config fields web_qa_routes and qa_build_command
- #286 — Fix type: ignore hack on labels field in types.py
- #291 — Add Authexis content pipeline API to operational docs
- #290 — Add “last run” column to paulos launchd status
- Fastmail CalDAV integration (calendar + tasks read/write)
- Reach module (urgency-based communication routing)
- Personal assistant loop (calendar, email, tasks, briefing)
- Server deployment (speedy-gonzales launchd agents)
- Launchd semantic naming + period column
Release progress
- March 2026: 1 open / 24 closed (due 2026-03-30)
- April 2026: 0 open / 2 closed (due 2026-04-30)
Carry-over
- 4 issues
ready-for-prep: #287, #289, #292, #293 - #303 — Automate end-of-day pipeline (close, sum-up, reflect)
- Pushover reliability — notifications deliver but don’t always push to device. May be iOS settings, may be Pushover itself. Not diagnosed.
- macOS launchd throttling — still happens even on AC power with Low Power Mode off. Health agent auto-kick is the workaround. Real fix is Linux on speedy.
Risks
- Launchd is unreliable for time-critical scheduling on macOS. Agents go 30+ minutes without firing on 10-minute intervals. The health watchdog mitigates but doesn’t solve.
- Server (.env) and local (.env) can drift — no automated sync. Manual
grep + ssh cat >>today.
Flags and watch-outs
- Email nag format improved but notification quality depends on Discord embed rendering of markdown. Untested with multiple emails.
- Task datetime sorting had a naive/aware comparison bug — fixed, but any new CalDAV data with mixed timezone formats could surface similar issues.
- Server launchd agents may have the same throttling issues as local if speedy ever goes to sleep.
Next session
- #303 — Design the end-of-day pipeline (close → sum-up → reflect automation)
- Prep and execute the 4
ready-for-prepissues via orchestrate - Consider Linux migration plan for speedy-gonzales (Ubuntu Server LTS)
- Test assistant loop end-to-end: verify calendar reminders, email nags, and task nags all produce useful notifications
- Explore running orchestrate on speedy (requires Claude Code install + repo clones + tmux setup)
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
The job you didn't know you were hiring for
Most organizations hire for tasks. The ones that survive hire for attention. And attention turns out to be the hardest thing to delegate.
The second project problem
Your system works. Then you try it somewhere else and it falls apart. The gap between 'works here' and 'works anywhere' is where most automation dies — and most organizations never look.
The smartest code you'll ever delete
The most dangerous kind of waste isn't the thing that doesn't work. It's the thing that works beautifully and shouldn't exist.