Work log — 2026-03-23
What shipped
The session ran the full pipeline continuously — prepping, executing, decomposing, and scouting — and shipped 30+ issues across three major themes: briefing improvements, fleet config consolidation, and the marketing CLI.
Briefing system overhaul
Three new features landed in the morning briefing: a daily synthesis scanner (#494) that reads per-project narratives from the rollover synthesis files, a “needs your input” card (#499) that surfaces all needs-clarification issues across every project with clickable links, and a git-based fallback (#496) that generates brief narratives from commit messages when no synthesis file exists. The briefing email now leads with what happened overnight, followed by what’s blocked on human input, before the standard dashboard.
Fleet config consolidation
The project portfolio was consolidated from 4 scattered sources into a single fleet.toml file (#486). The schema covers name, repo, path, port, host (server/laptop/both), orchestrate interval, and active status — 15 projects total. Four consumers migrated: launchd status (#515) now enumerates orchestrate agents from fleet config, setup fleet (#516) reads projects dynamically instead of a hardcoded dict, enabled_workspaces() (#518) reads from fleet.toml with graceful fallback, and the close/rollover skills (#517) now detect server hostname to preserve dev servers and orchestrate agents. The hardcoded FLEET_PROJECTS dict and workspaces.toml dependence are gone.
Marketing CLI
A complete marketing agency CLI was built from scratch (#534): 5 commands across 5 PRs. status shows a portfolio overview with stage inference from directory contents. intake generates positioning briefs from playbook + client brief via LLM. engage produces deliverables from role docs + templates. train extracts patterns from training material to refine role docs. review lists pending drafts awaiting human review. 33 tests cover the full CLI.
Rollover pipeline fixes
Five issues (#547-551) fixed the nightly rollover pipeline: fleet.toml host filtering, bare shell detection, polymathic-h exclusion (it’s the aggregation target, not an injection target), serialized git pushes to prevent race conditions, and supervisor idle detection before sum-up/reflect.
Other improvements
The session also shipped: orchestrate priority sorting (#492), sweep question detection and dev server checks (#484), sweep priority redirect (#493), scout static site and public site review guidance (#489, #490), launchd status “last action” column (#495), config warning suppression for fleet commands (#488), server bind detection in start/serve skills (#491), deprecated outreach command removal (#511), and a security hardening pass — webhook auth fail-secure (#524), SSH shell escaping (#525), JSON error handling in prospect code (#526), dead code cleanup (#528), and PRODUCT.md sync (#527).
Completed
- #483 — Audit all CLAUDE.md files for explicit dev server port section
- #494 — Briefing: add 24-hour project summary from daily synthesis
- #488 — Suppress ’no project config found’ message for non-project CLI commands
- #499 — Briefing: include needs-clarification issues across all projects
- #491 — Start and serve skills: bind to 0.0.0.0 on server, respect fleet config
- #484 — Sweep: detect idle questions and verify dev server running
- #489 — Scout skill: add guidance for static site / Hugo projects
- #490 — Scout skill: add public site review for language, positioning, and messaging
- #492 — Orchestrate run: prioritize by label (priority-high, bug before features)
- #493 — Sweep: check for unaddressed high-priority issues in each project
- #495 — Add “last command run” to the paulos launchd status table row
- #496 — Briefing: git-based fallback when daily synthesis is missing
- #509 — Audit all paulos CLI commands and document their purpose
- #510 — Audit all launchd agents for redundancy with skills and orchestrate
- #511 — Remove redundant CLI commands and launchd agents
- #514 — Create fleet.toml schema, file, and loader function
- #515 — Migrate launchd status to enumerate from fleet.toml
- #516 — Migrate setup fleet to read from fleet.toml
- #517 — Update close and rollover skills to respect fleet host field
- #518 — Deprecate workspaces.toml — migrate consumers to fleet.toml
- #524 — Security: webhook auth bypass when LINEAR_WEBHOOK_SECRET is unset
- #525 — Security: shell-escape project names in setup fleet SSH commands
- #526 — Add JSON error handling to webhook handler and prospect pipeline
- #527 — Update PRODUCT.md: sync Layer 1 skill inventory and fix command names
- #528 — Remove unused imports and dead function from orchestrate_loop
- #535 — Create marketing CLI group, config loader, and role doc reader
- #536 — Implement marketing status command — portfolio overview
- #537 — Implement marketing intake command — new client onboarding
- #538 — Implement marketing engage command — deliverable production
- #539 — Implement marketing train and review commands
- #547 through #551 — Rollover pipeline fixes (host filter, shell detection, polymathic-h exclusion, push serialization, supervisor idle)
- #552 — Audit and eliminate unnecessary Anthropic API usage
- #558-560 — Graceful API key handling (call_llm, humanize, social, briefing)
- #567 — Remove dead podcast generate command
- #568 — Clean up /tmp/nvn-* prompt files after marketing engage
- #569 — Migrate run_eod() from load_workspaces() to fleet.toml
- #572 — Marketing engage: use SCP instead of SSH heredoc for large prompts
Release progress
- March 2026: 24/24 closed (milestone still open)
- April 2026: 2/2 closed
Carry-over
- #545 — Marketing QA/reviewer role needs clarification (directory structure mismatch + command name conflict)
- #487 — Paul knowledge proxy MCP server needs design decisions (search strategy, LLM in server, auth, corpus sync)
- #513 — Assistant agent needs review before re-enabling (frequency, throttling, quiet hours)
- fleet.toml gained a
rolloverfield (polymathic-h hasrollover = false) —FleetProjectdataclass needs updating to parse this
Risks
- The
rollover = falsefield in fleet.toml for polymathic-h is not yet parsed byFleetProject— it works because the rollover orchestrator reads the toml directly, but the dataclass should be kept in sync.
Flags and watch-outs
- Marketing CLI paths (
~/Projects/marketing/roles/,clients/,playbooks/) don’t match the actual agency structure (agencies/synaxis/methodology/). The CLI works for the top-level marketing dir but #545 flagged this as a conflict needing resolution. workspaces.tomlis now legacy —enabled_workspaces()reads from fleet.toml with fallback. The file can be deleted once fleet.toml is proven stable on the server.
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.
When the queue goes empty
Most products don't fail at building. They fail at the handoff between building and becoming real. What happens when the code is done and the only things left are judgment calls?
When your agents start breaking each other's code
Two agents modified the same file independently and created database locks. The fleet hit 135 issues in one day — and the coordination problem that comes with it.
The removal tax
The most productive thing you can do with a product is take features away. Eighty-nine issues closed across eight projects, and the hardest lesson came from a pipeline that ran perfectly and produced nothing.