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

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.py still 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 .env auto-loading in call_llm() uses override=False, so it won’t clobber existing env vars. But if someone has a stale key in .env and 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. /compact doesn’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 /reflect to test the updated prompt — verify lede-leading and non-technical framing produce the right output
  • Clean up launchd references in setup_cmd.py server 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.