2026-04-01
Two-loop architecture shipped
Got the orchestrate system running with two independent dispatch loops:
- Dev loop (
paulos orchestrate run -p <project>) — picks GH issues, dispatchesclaude -p '/dev-loop'as ephemeral subprocess. Five focus projects: authexis, eclectis, simplebooks, diktura, synaxis-ai. - Agency loop (
paulos orchestrate agency -c <client>) — picks Notion deliverables, dispatches agency-triage + agency-loop. One client: Eclectis. - Scout (
paulos orchestrate scout -p <project>) — deep codebase scan, slower cadence.
Key config: focus = true in workspaces.toml controls auto-dispatch. New agency-clients.toml for client list.
Bugs fixed
- Discord 400 on idle cycles:
_result_msg("Dev-loop", "idle")returned"Dev-loop"with no “idle” substring, so_notifyclassified it as success and tried to send a malformed embed. Fixed by passing outcome explicitly. - Dev-loop idle for synaxis-ai: git remote was still
skopos-synaxis/synaxis-aiafter folder rename frommarketing/. Fixed topwelty/synaxis-ai. The dev-loop skill relies onghinferring the repo from the remote. - Streaming output:
_run_clinow streamsclaude -pstdout line-by-line so the operator can see progress instead of a silent wait.
API key rename
Renamed ANTHROPIC_API_KEY → PAULOS_ANTHROPIC_API_KEY in all project .env files. Claude Code was picking it up and using API credits instead of the Max subscription. Updated llm.py and agent_provider.py to check the new name first with fallback chain.
Docs updated
PRODUCT.md, CODEBASE.md, DECISIONS.md all updated to reflect the two-loop architecture, 12 active skills (up from 9), focus field, agency-clients.toml, and current project portfolio.
Afternoon session: deterministic dispatch and the great doc audit
The orchestrate loop got its brain transplant. Three things that used to burn LLM tokens every tick — reading context files, running the priority cascade, picking the right issue — are now deterministic Python. The model arrives with context pre-loaded and a specific issue number. It goes straight to work.
Deterministic prompt construction
Context files (PRODUCT.md, DECISIONS.md, CODEBASE.md, RISKS.md) are now read in Python and injected into the claude -p prompt. Saves 4+ tool calls per cycle. The priority cascade (ready-for-dev → ready-for-prep → needs-decompose → untriaged) runs in Python too, passing the issue number to the skill as /dev-loop #42.
Model selection
All claude -p runs default to Sonnet. Per-workspace override via model = "opus" in workspaces.toml (synaxis-ai uses Opus). CLI override with --model/-m. Codex CLI integration exists but is shelved — Codex can’t write to .git in sandbox mode, so it can’t commit.
The doc audit
The deterministic injection exposed a problem that was invisible before: bloated docs. Authexis was injecting 62K of context per tick, mostly a 43K DECISIONS.md full of tombstones for features that got ripped out weeks ago. Skillexis was worse — 2.4 million characters in CODEBASE.md (the entire source code pasted into a markdown file). It literally crashed the OS: Argument list too long.
Both got audited and tightened:
- Authexis: 62K → 25K (DECISIONS.md from 43K to 10K)
- Skillexis: 2.4M → 18K (CODEBASE.md from 2.4M to 7K, plus new DECISIONS.md and RISKS.md)
Filed #662 for a weekly automated context doc audit across all workspaces. The loop that enforces discipline should have some.
Notification improvements
Discord notifications now show what the dev-loop actually did (“What happened: removed 4 dead schema exports, 451 tests passing”) instead of just the issue list. Outcome classification fixed — dispatched work returns “success” with a green checkmark, not “idle” with a sleep emoji. Bot token removed from read-only issue queries (was blocking access to repos the bot hadn’t been invited to).
EOD pipeline rewrite
The close/sum-up/reflect pipeline is now fully ephemeral — no tmux sessions needed. /close fans out to all projects with today’s commits in parallel (ThreadPoolExecutor). Each project writes its work log to its own repo. /sum-up then gathers all logs into polymathic-h and synthesizes. /reflect uses Charlie’s voice, not Paul’s VOICE.md (#651).
Fleet dev-loop test runs
Ran the deterministic dispatch across seven different repos. Results:
- scholexis #244 — removed 5 dead schema tables, 103 tests passing
- scholexis #243 — prep→exec chain, added 20 server action tests
- phantasmagoria #263 — removed dead code, 202 lines, 451 tests
- phantasmagoria #264 — created RISKS.md risk register
- prakta #233 — error handling on API routes
- dinly #361 — dependency updates, 327 tests passing
- diktura #53 — four fixes + Supabase migration
- skillexis #199 — auth error handling, 29 tests
- skillexis #200 — error states in 3 UI components
- polymathic-h #242 — tagged 51 blog posts (triggered a pre-commit audio hook ambush, filed #247)
Completed
- #659 (partial) — deterministic prompt construction: context injection and issue selection done
- #651 — Charlie voice in /reflect
- #662 — filed: weekly context doc audit
- #661 — filed: speedy-gonzales provisioning (backlog)
- polymathic-h#247 — filed: pre-commit audio hook on frontmatter changes
Carry-over
- Skopos voice — skill updated but Sonnet still narrates like a build script. Voice reinforcement needs work.
- simplebooks — repo has 141 vs 6 diverged commits. Needs reconciliation before dev-loop can push.
- #660 — doc audit for remaining projects (authexis and skillexis done, others unchecked)
Risks
- Pre-commit hooks can ambush bulk operations — polymathic-h tried to generate 51 podcast episodes when we tagged 51 posts. The orchestrate loop should probably set
SKIP_AUDIO=1in subprocess env, or hooks need smarter change detection. - Bot token still used for writes —
_gh()in orchestrate_loop.py uses SKOPOS_GITHUB_TOKEN for labeling/commenting. The bot needs collaborator access on every repo where the loop does write operations.
Next session
- Run
paulos orchestrate closeto test the parallel fan-out in production - Test the full eod pipeline end-to-end (close → sum-up → reflect)
- Address simplebooks repo divergence
- Continue doc audits on remaining projects (#660)
- Improve Skopos narration voice — current skill tweak landed but Sonnet needs stronger reinforcement
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.
Delegation without comprehension is just prayer
The organizations that survive won't be the ones that automated the most. They'll be the ones that figured out what to stop delegating.
The case for corporate amnesia
Most organizations worship institutional memory. But what if the thing they're preserving is mostly decay?
Your design philosophy is already written
Builders who work across multiple projects leave fingerprints everywhere. The same mind solves the same problem differently in every domain — and usually doesn't notice. You need someone to read it back to you.