Fourteen specialized agents on Cloud Run, coordinated through a single event bus, an issue-tracker substrate, and a manager agent on Slack. Hand-built around the needs of a real SaaS product. This is the architecture, the stack, and the patterns that hold it together.
Each agent is its own Cloud Run service, its own deploy, its own health endpoint. Conversation state and memory live in Postgres. No agent process state.
Three Postgres tables and one vector table do most of the coordination work. Everyone reads. Everyone writes. The substrate is adapted from Open Brain (OB1), Nate B. Jones’ open-source pattern of one Postgres + pgvector + MCP layer that any AI tool can plug into. We took the “one shared brain” primitive and grew it out into the four tables below, plus a Slack-Bolt manager and per-agent signal stamping.
Append-only event log. Every agent stamps every meaningful action. Director Dana reads it. Pete’s weekly proposer reads a rolling window of it as prompt context.
Issue trackers, agent-native. Each workstream is a structured row with scope, risk class, status, and a recorded outcome. Agents propose; humans approve; agents execute and close.
Unified human-in-loop. One Slack channel posts cards. One dashboard shows the queue. Approve / Reject / Regenerate (fresh-cycle, capped via events).
Reply pipelines (Nadia, Larry) use semantic search across past replies for context continuity. Agents query through a recall function, never raw SQL. The pattern follows Open Brain’s document-match primitive.
Coordination flows through three patterns. Default is event-bus signal. Conversational dispatch goes through Dana. Direct calls are reserved for latency-sensitive paths.
Fourteen agents, each with one job, a documented trigger, and a model picked for that job. Models are env-configured and flippable without redeploy.
| Agent | Trigger | Model | Notable pattern |
|---|---|---|---|
| Scout | Form-opt-in webhook | deterministic | Fit + reachability scoring, dedupe before lookup |
| Larry | New-lead tag | LLM | Sub-60s response, native tool use, 4-question qualifier |
| Nadia | Stripe webhook · tag + cron | LLM | 30-day onboarding feature tour; vector-memory reply enrichment |
| Alex | Daily cron | deterministic | Engagement score → churn handoff to Nadia |
| Rita | Tag + scheduler | templated + LLM | Real stats from the event bus, not placeholders |
| Carter | Inbound email · voice call | LLM + voice | Billing/account replies, curated how-to library, sub-second voice actions |
| Annie | Daily scans + deploy-triggered | LLM judge (decorrelated) | Judges product-AI conversations; findings dedup by fingerprint; confirmed findings become regression fixtures |
| Max | Slash command + cron | LLM | Approval queue + hero-image hand-off |
| Derek | Max approval signal | image gen | Pair-generation with quality grading |
| Dana | Slack + cron | LLM | NL dispatch, conversational state in DB |
| Pete | Event bus + weekly cron | LLM | Weekly self-proposer |
| Edith | Cron / 10 min | LLM | Pattern-match diagnosis, noise suppression |
| Edwin | Before every send | deterministic | Deliverability guard, suppression check ahead of fleet sends |
| Mike | Daily cron | deterministic | Workspace-partitioned spend, daily reconcile |
Three patterns, ordered by frequency. Default is event-bus signal. Conversational dispatch via Dana for human-initiated work. Direct calls are reserved for latency-sensitive paths.
Larry stamps a "lead qualified" event. Pete reads it and moves the CRM stage. No agent calls another agent directly when an event-stamp would do. The event is the durable record.
Human types /dana max draft an email. Dana’s tool-use loop picks the right tool, calls the agent, posts back in thread. One front door for the whole fleet.
Alex computes a daily digest and hands the affected users straight to Nadia’s reactivation path. Direct because timing matters and the payload is precise. Always paired with an event stamp.
A non-exhaustive list of design choices that go above the baseline of “wire some LLMs to a CRM.”
Workstreams are first-class structured rows with a recorded outcome on close. Closed workstreams are the first thing the next session reads.
On a weekly cycle Pete reads recent activity, drafts a small set of proposals within a constrained shape, and writes them out. Human approves. Pete executes and closes.
Low-risk, high-confidence actions auto-execute. Anything consequential queues for human review. The risk class travels with the proposal; the executor refuses misshapen ones. Defense in depth.
Edith pattern-matches known errors against a runbook. Routine noise is suppressed. Known-actionable patterns get structured diagnoses. Genuinely new failures escalate to a stronger model. Keeps the noise floor low.
Alex doesn’t just call Nadia; it stamps a churn-risk event and direct-calls. The event is the durable record; the direct call is for speed.
Planners, high-volume responders, hard-reasoning diagnostics and cheap grading each get a model matched to the job. The choice lives in config and flips without a redeploy.
Every agent reports its own version, and the version is kept honest in more than one place. Codified after a real incident where a health check lied after a deploy. Now a hard rule across all agents.
Tone tells, off-message phrasing and off-feature mentions are stripped at runtime, plus a whitelist so Max can only reference real features. Layered defense before any output ships.
When reconciling an external system into a substrate, read what's there first and preserve human-set fields before writing back. Prevents identifier churn and human-edit loss across runs.
Each morning Edith turns the last 24h of events into error trends, silent-agent flags and aggregate signals. The closest thing the fleet has to “what happened overnight.”
Live today: 14 agents, a shared substrate, a weekly self-proposer cycle, and a feedback-driven self-tuning loop under a human gate. The system is actively evolving: more workers proposing their own work, less dependence on any single channel, and tighter quality gates before anything graduates to running unattended. Scoped, deliberately, one step at a time.
Two long-form docs sit behind a quick request form. I review every request myself and reply within a day.
Same fleet, no jargon. For when you need to explain it to someone who isn’t in the weeds.
Read itEnd-to-end picture. Origin, substrate, agents, coordination, novel patterns, where it’s heading. The full story.
The hard-won lessons behind a live multi-agent fleet: what to automate, what to gate, and the trade-offs that aren’t obvious until you’ve run one.
A few quick details and I’ll send it your way personally.