Manuel Porras

All work / Agent fleet · Client Control

Case study · Agent fleet

One Slack channel, 18 expert agents behind it

The newest system I run — used daily — for a US marketing agency serving home-service businesses: the team asks about any client in plain language — and gets an answer from an agent that knows that client.

In short: Everything about a client of a US marketing agency for home-service businesses was spread across Zoom transcripts, ProofHub, Slack and four ad platforms, so a simple question meant opening several tools. I built one Slack channel with a router agent and 18 client-expert agents, one per client, each with its own instructions and knowledge files and read-only access enforced in code. It is in daily use, as part of a fleet of 38 Claude Code agents on two servers with a watchdog every minute.

38Claude Code agents in 24/7 operation
18client-expert agents, one per client
1 minwatchdog interval
2servers

The problem

Everything about a client is spread across tools: Zoom transcripts of every meeting, tasks in ProofHub, conversations in Slack — including the client’s own Slack area — and four ad platforms.

Questions like “What did the client write yesterday?”, “Which action items are not in ProofHub yet, and who owns them?” or “Who still has to reply to the client?” meant opening several tools and reading a lot.

How it is built

Agency team one Slack channel Router agent finds the client, forwards the question 18 client-expert agents own instructions + knowledge files per client read-only Sources per client Zoom transcriptsProofHub tasks Slack historyGoogle Ads · LSA Microsoft AdsMeta Ads Write access: blocked in code Operations layer Message queues (Node.js + SQLite) ~30 services under pm2 · watchdog every minute Rebuild after crash · max. 3 restarts / 30 min
Questions go in through one channel; answers come from the agent that owns the client. Write access is blocked in code, not by a prompt.
  1. One agent per client. Each of the 18 clients has its own Claude Code session with its own instructions and knowledge files.
  2. A router in the channel. A central agent reads each question, works out which client it is about and forwards it to that client’s agent.
  3. Knowledge in files, kept current by the agents. For example a roadmap per client. After a restart nothing is lost — without constantly editing the instructions.
  4. Read-only for the team — enforced in code. No changes to ads, landing pages or WordPress. The limit is set programmatically, not just written into a prompt.
  5. One exception, for me only: I can have landing pages built through the agents; those requests are forwarded to a dedicated landing-page agent.

What it looks like

FromMessage
Jamie (account manager), 09:12Which action items from Acme HVAC’s last meeting are not in ProofHub yet — and who owns them?
client-control, 09:12 → forwarded to the Acme HVAC agentFrom Tuesday’s call, two items are not in ProofHub yet: send the revised summer budget — Dana; check call tracking on the new landing page — Luis. Dana also still owes the client a reply to Monday’s Slack message.
Jamie (account manager), 09:14Pause the Saturday ads for Acme.
client-control, 09:14 → Acme HVAC agentI can’t change campaigns — this channel is read-only. Current Saturday spend and the campaign link are below, so the PPC team can make the change.
Illustration with invented test data (channel # client-control, fictional client “Acme HVAC”, fictional names). Real conversations contain client data and are not shown.

Running it day and night

  • 38 agents running on two servers (31 + 7)
  • 57 tmux sessions in total
  • ~30 services under pm2
  • 1 min watchdog interval
  • 3 / 30 min restart limit against loops
  • Minutes to set up a new client agent by script

Crashed agents are rebuilt automatically. A restart-loop guard stops after three restarts within 30 minutes, so a broken agent cannot keep the machine busy.

New client agents are created by a script in minutes. I can operate the fleet remotely, including via Claude Code remote control.

The operations story in detail: liveness checks, stuck-job recovery and three porting failures →

What I would tell anyone building this

  • Give each agent one client. Each agent has its own session, instructions and knowledge files — it is always clear where knowledge about a client belongs.
  • Set limits in code, not in the prompt. The team can ask anything; the agents technically cannot change anything.
  • Keep memory in files. Agents restart. Knowledge that lives in files they maintain survives that.
  • Assume agents will crash. Plan the watchdog, the rebuild and the loop guard before the first agent goes live.

Technology

Claude CodeNode.jsSQLitetmuxpm2Slack APIProofHub APIZoomGoogle Ads APIMicrosoft Ads APIMeta Ads API