Work log — 2026-03-12
What shipped today
Today was a deep infrastructure day focused on two themes: consolidating the Linear API modules and cleaning up test debt.
Linear module consolidation (#376). The two Linear API modules — linear.py (910 LOC with retry logic and error handling) and linear_client.py (256 LOC with its own auth, its own _graphql, and overlapping functions) — were merged into a single canonical module. This was a 4-step chain executed sequentially: urllib→requests (#386), auth unification (#387), function merge (#388), and shim deletion (#389). Each step had its own PR, tests passed throughout, and the re-export shim kept backward compatibility until the final deletion. The result is one linear.py with unified auth (_resolve_api_key), retry logic, and all orchestration helpers. 35 tests cover the module. Test count went from ~892 to 890 (net: added 18 real tests, removed 20 obsolete ones from the old module).
Podcast audio player cleanup (#394). The generate-audio command was still injecting hardcoded <div class="podcast-player"> HTML into post markdown bodies, even though Hugo templates now render the player from frontmatter fields. Removed build_audio_player_html(), the injection block, and the regex strip that was cleaning up the injected HTML before TTS. Clean deletion: +2/-45 lines.
Triage and prep. Triaged #396 (marketing daily email) — clarification questions posted and answered, then the issue was prepped and marked needs-decompose because it spans PostHog setup for 3 sites, API integrations, email rendering, a new CLI command, and scheduling. Only authexis.app currently has PostHog.
Completed
- #376 — Consolidate linear.py and linear_client.py into a single module (parent)
- #386 — Switch linear.py _graphql from urllib to requests (PR #390)
- #387 — Unify auth pattern across linear.py and linear_client.py (PR #391)
- #388 — Merge linear_client.py functions into linear.py (PR #392)
- #389 — Delete linear_client.py shim (PR #393)
- #394 — Stop injecting HTML audio player into post content (PR #395)
Release progress
- March 2026: 0 open / 24 closed — fully cleared
- April 2026: 0 open / 2 closed
Carry-over
- #396 — Marketing daily email: labeled
needs-decompose. Needs/issue decompose 396to create child issues. Partially blocked — only authexis.app has PostHog; other 3 sites need instrumentation.
Risks
- None identified.
Flags and watch-outs
- The venv Python (
.venv/bin/python) is required for running tests — system Python lacksrequestsand other deps. The test commands throughout this session used.venv/bin/python -m pytest. - 6 issues remain in backlog with no milestone — all are longer-term infrastructure ideas (#190, #212, #221, #304, #325, #344).
Next session
/issue decompose 396— break the marketing email into child issues (PostHog setup, analytics query module,cos marketingcommand, launchd agent)- Check if any new issues have been created by other sessions and triage them
- Consider picking up backlog items if the board is clear — #344 (log all CLI commands to Airtable) is the most actionable
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.