Skip to main content
Paul Welty, PhD AI, WORK, AND STAYING HUMAN

2026-03-13 — Paulos

What shipped today

This was a high-volume pipeline session — seven issues prepped, executed, and merged in one sitting. The work fell into three themes: hardening, test coverage, and the briefing email redesign.

Hardening. Two quick wins addressed encoding and timeout gaps that could cause silent failures. The fastmail JMAP client was the only HTTP call in the codebase without an explicit timeout (#399), and four modules were doing file I/O without encoding="utf-8", which would bite on any non-ASCII content (#400). Both were one-line-per-site fixes, but the kind of thing that prevents 2am pages.

Test coverage. Three new test files added 45 tests across previously untested command and core modules. The cos command (briefing/editorial/marketing subcommands, #401), skopos_cmd (init/run/costs, #402), and marketing_email module (#403) all went from zero to solid coverage. Test count grew from 890 to 935. Along the way, identified two pre-existing flaky tests (test_resolve_api_key_falls_back_to_env and test_file_handler_writes_log_line) that fail in full suite but pass in isolation — test pollution from shared state.

Briefing email redesign. The big feature work: making the daily briefing email scannable instead of overwhelming. First, issue counts and commit counts became clickable links to the relevant GitHub views (#409). Then the full information pyramid redesign (#410) — a compact “skinny” summary with emoji traffic-light indicators at the top (commits shipped, issues in progress, sentry errors, meetings, unread emails), clear tier headers separating the three information layers, and a dramatically shorter LLM prompt that focuses on synthesis (fires + recommended focus) rather than regurgitating data that’s already in the structured cards. The system prompt went from ~60 lines to ~15, and max_tokens was halved from 3000 to 1500.

Completed

  • #399 — Add missing timeout to fastmail.py _get_session request
  • #400 — Add encoding=utf-8 to file I/O in skopos_cmd, launchd_cmd, scanners, orchestrate_loop
  • #401 — Add tests for cos command (briefing, editorial, marketing)
  • #402 — Add tests for skopos_cmd (init, run, costs)
  • #403 — Add tests for marketing_email.py
  • #409 — Make briefing email counts clickable
  • #410 — Reduce briefing email density with information pyramid

Release progress

  • March 2026: 24/24 closed (all issues complete)
  • April 2026: 2/2 closed

Carry-over

  • #396 needs decomposition — the marketing email feature parent issue
  • Two flaky tests need investigation (test pollution in test_linear and test_logging_setup)
  • Git stash from before the #409 branch may still contain changes to core.py and scanners.py — check on next session

Risks

  • The briefing email redesign hasn’t been tested with a live email send yet. The emoji indicators and tier headers look right in the HTML but need verification in an actual email client.

Flags and watch-outs

  • All milestones are at 100% — may need to create April 2026 milestone or assign backlog issues.
  • Only 6 open issues remain, all labeled backlog. The pipeline is empty of active work.

Next session

  • Send a test briefing email (paulos cos briefing --email) and verify the new information pyramid renders correctly
  • Decompose #396 (marketing email parent) into grindable child issues
  • Investigate the two flaky tests and file issues if warranted
  • Review backlog issues and decide which to pull into April milestone
  • Pop the git stash and check if those changes are still needed

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 machine is eating faster than you can feed it

Sixty-three issues closed across thirteen projects in one day. Four milestones completed. And the hardest problem wasn't building — it was keeping up with what you've already built.

The proxy problem

Every organization has this problem: knowledge locked inside one person's head. Today I accidentally designed a solution — and it has nothing to do with documentation.

True 1-to-1 outreach is finally possible with AI

The 1-to-1 personalization promise is thirty years old. It never worked because understanding each person was too expensive. AI changed the economics.