2026-03-11 — Hardening, Linear backend, and the bots talk to each other
What shipped today
The main theme was hardening: making every subprocess call in the codebase timeout-safe, fixing a Python deprecation, and documenting cross-repo ownership boundaries. Nine issues closed across two sessions.
Subprocess timeout sweep. Systematically audited every subprocess.run() call across the codebase and added explicit timeouts. This prevents launchd-scheduled jobs from hanging indefinitely when a git command or external tool stalls. Four PRs covered the full surface: launchd_cmd + health_check (#364), tts + transport + social_pipeline (#365), skopos_cmd (#366), and podcast/commands (#361). Each PR includes an AST-based guard test that statically verifies all subprocess.run() calls have a timeout= keyword — these prevent regressions without relying on runtime coverage.
Deprecation fix. Replaced datetime.utcnow() with datetime.now(timezone.utc) in fastmail.py (#367). Python 3.12+ warns on the old form, and the timezone-aware version is unambiguous.
Cross-repo outreach documentation. Created FEATURE-outreach.md establishing the boundary contract between paulos (operational orchestrator) and authexis (content engine). Also updated authexis’s CLAUDE.md with a matching “outreach boundary” section (#369). This formalizes lessons from the March 10-11 incidents where unclear ownership led to mystery Fastmail drafts.
Knowledge harvest command. Built paulos cos harvest — scans git history across all registered workspaces and surfaces recent content artifacts (blog drafts, guides, templates, course materials) classified by type (#371). Includes 28 tests covering classification, title extraction, report formatting, and integration scenarios.
Test and orchestrate fixes. Fixed a pre-existing test failure in orchestrate loop decompose priority ordering (#363). Added tests for the stale_issues module (#355).
Session 2: Linear backend and paul proxy design
Linear backend for the orchestrate loop. Built paulos/core/linear_client.py — a GraphQL API client that handles issue selection, blocker detection via inverseRelations, priority sorting, and state transitions. The orchestrate loop got _run_linear_cycle with a five-phase pipeline: rescue stuck In Progress issues, pester on In Review, exec Todo issues, prep+exec unblocked Backlog issues, and chain prep into exec while context is warm. The courses project (39 issues, zero code, all documents) was the test subject. Eight orchestration cycles ran successfully — six content artifacts produced (module outlines 2-6, LinkedIn strategy, case study template), three human-only tasks correctly identified and routed.
Compact-before-inject. Added _compact_if_needed() that fires before every tmux injection across all backends. Captures the status line, regex-matches the “N% until auto-compact” indicator, and fires /compact if remaining context is at or below 10%. This caught a real problem in cycle 8 — the agent was at 9% before Module 6 exec, and the compact saved it.
/linear skill. Created skills/linear/SKILL.md with prep, exec, decompose, and list modes. The agent-side counterpart to the Python-side loop — the loop selects issues and injects /linear exec SYN-242 --auto, the skill handles reading the issue, consulting context briefs, producing deliverables, and updating Linear.
Blog post draft. Wrote “Today I got the bots to talk to each other” for paulwelty.com — a deep technical walkthrough of the tmux-based multi-agent coordination system. Covers all eight layers of the stack with real code, real issue numbers, real cycle timings. Max geek detail per Paul’s request. Draft in polymathic-h, not published.
Paul proxy design spec. Designed a knowledge proxy agent — a Claude Code session loaded with Paul’s entire corpus (book manuscript, 642 blog posts, project docs, decisions, voice notes) that other agents consult via /paul <question> before escalating. The proxy answers with a confidence signal (high/medium/escalate). Spec passed review with all issues resolved. Ready for implementation plan.
Completed
- #350 — Add tests for stale_issues module
- #356 — Replace deprecated datetime.utcnow() with datetime.now(timezone.utc)
- #357 — Add timeout to subprocess.run() calls in skopos_cmd.py
- #358 — Add timeout to subprocess.run() calls in tts.py, transport.py, social_pipeline.py
- #359 — Add timeout to subprocess.run() calls in launchd_cmd.py and health_check.py
- #360 — Add timeout to subprocess.run() call in podcast/commands.py
- #362 — Fix pre-existing test failure in test_orchestrate_loop
- #368 — Document authexis vs paulos boundary for outreach pipeline
- #370 — Knowledge harvest — surface recent production across projects
Release progress
- March 2026: 24/24 closed — milestone complete
- April 2026: 2/2 closed
Carry-over
test_outreach_cmd.py::test_enroll_inserts_commandhas a pre-existing failure unrelated to today’s work- #372 (Linear backend) is still open — the code shipped but the issue wasn’t formally closed. GitHub issues for courses are also still open pending decision on whether to close them now that Linear is the source of truth.
- Blog post “Today I got the bots to talk to each other” is
draft: truein polymathic-h. Needs Paul’s review and voice pass before publishing.
Risks
- The paul proxy spec is approved but not implemented. If it sits too long, the design assumptions (file paths, corpus contents) may drift.
- Courses agent context will need monitoring — eight cycles of content generation with compaction means the agent may need a fresh session start.
Flags and watch-outs
- All milestones are fully closed — new issues landing will need milestone assignment or a new milestone
- AST guard tests are a strong pattern but only check for the keyword, not the value. A
timeout=Nonepasses the guard (by design fortail -f). - The courses project now has all 6 module outlines done. The Module Outlines milestone in Linear should be closed.
Next session
- Review paul proxy spec (
docs/superpowers/specs/2026-03-11-paul-proxy-design.md), then write implementation plan - Build the paul proxy: create
~/Projects/paul/, populate corpus with symlinks, write CLAUDE.md and KNOWLEDGE-INDEX.md, create/paulskill - Close #372 (Linear backend) and decide on GitHub↔Linear issue overlap for courses
- Review the 6 module outlines — agent produced structural drafts, Paul needs to add consulting stories and philosophical depth
- Review and edit blog post draft before publishing
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.