paulos — 2026-03-28
What shipped today
This was a major infrastructure cleanup day. The big theme: stripping away machinery that had accumulated around the autonomous dev loop and getting back to something leaner.
The launchd agents are gone — all 24 plist files, the install script, the paulos launchd CLI command group, the health check integration, and the rollover pause/play logic. These were the cron-style schedulers that kicked off orchestrate runs, health checks, social posting, outreach, and the EOD pipeline. They’d been effectively replaced by tmux-based sessions and /loop, so removing them was overdue. The health check module stubs check_launchd() to return an empty list for backwards compatibility, and the orchestrate rollover skips the pause/play phases with a log message.
The dev-loop workflow changed fundamentally: it now commits directly to main and pushes, instead of creating feature branches and opening PRs. This reflects where the project actually is — active development with one developer, where the overhead of self-approving PRs was pure friction. Tests are the safety net. The skill also picked up a needs-decompose handler (queue step 3) that breaks large issues into 2-5 sub-issues.
The reflect/podcast skill got tightened in two ways. First, every insight must lead with the bold claim — no buildup, no throat-clearing, no “there’s a pattern in…” Second, the framing must be entirely non-technical. No software concepts, no engineering metaphors, not even as analogies. The listener should have no idea the author works in technology. These changes came from reviewing the last podcast post (“silence-by-design”) which was barely non-technical despite the intent.
Finally, a quiet but important fix: call_llm() now auto-loads .env via python-dotenv before making API calls. The ANTHROPIC_API_KEY was sitting in paulos/.env but never got loaded when humanize() was called as a Python function from a Claude Code session (no shell environment). This was causing “no API key” warnings during the reflect pipeline.
Completed
- #644 — Rename orchestrate grind → dev-loop and remove grind references from CLI
- #645 — Audit and prune uncertain CLI command groups
- #646 — Update PRODUCT.md Layer 2 inventory to match actual CLI state
- #648 — Prune dead CLI commands: qa screenshot, newsletter
- #649 — Scout skill should look in RISKS.md for items it could turn into issues
- #638 — Have scout look at RISKS.md for ideas/issues
- #639 — Fix 10 pre-existing orchestrate_loop test failures
- #640 — Verify parallel scanner rate-limit risk and add safeguards
- #643 — Audit, prune, and refactor paulos CLI commands
- #647 — Deploy-alert workflow fires duplicate issues
Plus: launchd removal, dev-loop direct-to-main workflow, reflect skill tightening, humanize .env fix, PRODUCT.md launchd reference cleanup, stale docstring fix in humanize.py.
Release progress
- March 2026: 24/24 closed (complete)
- April 2026: 2/2 closed
Carry-over
setup_cmd.pystill has launchd installation logic in steps 4/5 of server setup — cosmetic, not functional, but should be cleaned up- Remaining docstring/comment references to launchd in
orchestrate_loop.py,fleet.py,assistant.py,social_pipeline.py— cosmetic only - The reflect skill prompt changes need a real test run (generate a new podcast) to verify the lede-leading and non-technical framing work in practice
Risks
- The
.envauto-loading incall_llm()usesoverride=False, so it won’t clobber existing env vars. But if someone has a stale key in.envand a fresh one in the shell, the shell one wins — which is correct. No risk here, just noting the design.
Flags and watch-outs
- Any session that was running before today’s skill changes (dev-loop, reflect) needs a full restart to pick up the new cached skill content.
/compactdoesn’t refresh skills. - The dev-loop now pushes to main without review gates. This is intentional but means test quality is the only safety net.
Next session
- Run
/reflectto test the updated prompt — verify lede-leading and non-technical framing produce the right output - Clean up launchd references in
setup_cmd.pyserver setup steps - Check open issues for new work — all milestone issues are closed, so new issues or backlog items are the next targets
- Consider whether the 5 backlog items (#487, #513, #564, #595, #603) are worth promoting
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.
Everything pointed at ghosts
Most organizations are measuring work they stopped doing years ago. The dashboard is green. The reports are filed. Nobody realizes the entire apparatus is pointed at ghosts.
Silence by design
Most systems have more suppression than their owners realize. It gets installed for good reasons. The cost accumulates slowly, in the form of systems you can't operate because you've removed the signals that would let you understand them.
Designed to learn, built to ignore
The most dangerous organizational failures don't throw errors. They look fine, return results, and quietly stay frozen at the moment of their creation.