PortLevchevron_rightBuild Logschevron_rightMarketing/Sales Swarm OS
buildBuild Log #012

How I Built
A Marketing/Sales
Agent Swarm OS

A Portfolio Executive's walkthrough of building a CMO + CRO agent swarm from a blank repo in a day. Supervisor-swarm-auditor pattern. Channel-executor sub-agents running in parallel. An auditor that gates every output. One JSON report per day for each role, schema-locked for the CEO integrator.

YK

Yuri Kruman

Operator of 8 portfolio properties · Jun 2026

0

supervisor roles (CMO + CRO)

0

channel executor sub-agents

0d

repo to running swarm

0

extra orchestration frameworks needed

bolt

The 30-Second Version

The Marketing/Sales Agent Swarm OS is a pair of vertical agent systems — CMO and CRO — built on the same supervisor-swarm-auditor pattern that powers the broader executive OS. Each supervisor has a swarm of channel-executor sub-agents (LinkedIn, email, content, paid, partnerships for CMO; outbound, inbound, partnerships, expansion for CRO). An auditor agent scores every executor's output. The supervisor approves. The result: one schema-locked JSON report per role per day, ready for the CEO integrator to read.

report

The Problem

Single-agent marketing assistants that produce 8 things a day and you check none of them.

memory

The Stack

Claude Code subagents + Node + JSON-schema validation + brand-voice prompt cache.

block

What It Doesn't Need

No LangGraph. No CrewAI. No vendor agent platform. No HubSpot.

timer

Build Time

One day, starting from a blank repo, by reusing the supervisor-swarm-auditor pattern.

If you have ever stared at "marketing automation" tools and thought "I want an agent that does my LinkedIn AND drafts cold emails AND outlines next month's content, all in my voice, and answers to ONE supervisor who reports up," this build log is for you. The pattern is the product. Channels are configurations.

Part 1

Why a Swarm, Not a Single Marketing Agent

My first take was a single "marketing agent" with a long system prompt: write LinkedIn, draft emails, plan content, propose paid spend, suggest partnerships. It worked badly. Five problems compressed into one prompt is five compromises. The LinkedIn writer compromised on the email voice. The content planner compromised on the paid math. There was no separation of concerns. Worse, there was no quality gate. Single-agent output flows straight to me with no filter.

5

channels jammed into one system prompt

0

independent quality gates

~30%

of outputs needed regeneration after I read them

1

human (me) doing the integration the system should do

  1. 1One channel per executor. One prompt, one tool-allowlist, one quality bar. Sharper outputs.
  2. 2One supervisor per role. The CMO routes channels. The CRO routes deals. Same pattern, different domain.
  3. 3One auditor per vertical. Independent quality gate. The auditor refuses to forward anything that violates the schema or the voice rules.
starThe Single Most Important Design Call

The auditor is a SEPARATE agent with REJECTION authority. Without it, the swarm is a meeting.

Supervisor + executors without an auditor is the same as the single-agent problem with extra steps. The auditor agent reads every executor's output, scores it against the schema and voice rules, and rejects (with reason) anything that fails. The supervisor only sees audited outputs. The CEO only sees one supervisor report. Three layers of quality gates, one human at the end.

Part 2

The Stack (and Why Each Piece)

Click each layer.

supervisor_account

Supervisors

CMO + CRO (one per role)

expand_more

Each supervisor reads its executors' audited outputs, integrates them, identifies cross-channel conflicts and produces ONE schema-locked JSON report per day. The supervisor never executes; it routes and synthesizes.

group_work

Executors (CMO)

LinkedIn, email, content, paid, partnerships

expand_more

5 marketing executors. Each runs in parallel. Each has a narrow tool-allowlist (LinkedIn agent can only write LinkedIn drafts, etc.). Brand-voice doc cached.

handshake

Executors (CRO)

Outbound, inbound, partnerships, expansion

expand_more

4 revenue executors. Outbound writes cold-email drafts and triages reply queue. Inbound triages site form fills and routes to me / auto-reply / pipeline. Partnerships proposes cross-promotion targets. Expansion proposes upsell on existing customers.

verified_user

Auditor

One per vertical (CMO auditor + CRO auditor)

expand_more

Reads every executor output. Scores against schema (required fields, value ranges) + voice rules (em dashes, Oxford commas, AI tells) + factual claim sanity (no statistics without sources). Hard reject → executor retries once with the audit feedback. Second fail → halt and surface.

schema

Schema

roles/_shared/output-schema.json

expand_more

Same schema as the broader executive OS. Status RAG, top movements, asks of the CEO, dollar-impact-if-ignored, conflicts, thesis_alignment. CMO and CRO supervisor reports both validate to this schema. Lets the CEO integrator read them without translation.

Part 3

The Six-Phase Build Sequence

Each phase ~1-2 hours because we're reusing the supervisor-swarm-auditor pattern from the executive OS. From blank repo to running swarm in a single day.

SchemaPatternCMOCROAuditWire
1
~1 HOUR

Reuse the Output Schema

If you've already built any specialist agent in the executive OS, copy roles/_shared/output-schema.json verbatim. Don't fork it. Don't extend it per role. The CEO integrator only reads schema-locked reports; divergence breaks integration.

Part 4

What I'd Do Differently Today

1

One auditor per vertical, not one global auditor

I tried a single global auditor first. The context window stuffed. Domain-specific auditors are cheaper and sharper.

2

Don't let the supervisor execute

The first CMO supervisor would happily write a LinkedIn post if I asked. Cut that capability from the prompt. The supervisor synthesizes, never executes.

3

Cross-vertical conflicts get REPORTED, not silently merged

If CMO partnerships and CRO partnerships disagree on whether to pursue Vendor X, the CEO integrator wants to know there's a conflict. Both supervisors flag it in their reports.

4

Tool-allowlist per executor, day one

LinkedIn executor with file-write access tried to rewrite my brand-voice doc once. Lock down tools per agent in .claude/settings.json from day one.

Part 5

Adapt This for YOUR Function

The supervisor-swarm-auditor pattern fits any function with channels. Five adaptations off the same skeleton:

VerticalSupervisorExecutor ChannelsAuditor Rules
TalentCPO/CHROSourcing, interview, comp, perfSchema + EEO + voice
Customer successCCOOnboard, expansion, churn, escalationSchema + tone + factual
OperationsCOOVendors, tools, SOPs, hiringSchema + cost + risk
FinanceCFOAR, AP, cash, tax, fundraisingSchema + GAAP + variance
Marketing / SalesCMO + CROLinkedIn, email, content, paid, partnerships, outbound, inbound, expansionSchema + voice + factual
Part 6

Starter Prompts for Claude / Cursor

Four prompts to take a vertical from zero to schema-locked daily report.

PROMPT 1Supervisor

"Write the system prompt for a [ROLE] supervisor agent. The supervisor: (a) reads N audited executor outputs, (b) NEVER executes (no writing posts, drafting emails, etc.), (c) integrates the N outputs into ONE schema-locked daily report matching roles/_shared/output-schema.json, (d) names top 3 [ROLE] movements of the day, (e) files asks of the CEO with dollar-impact-if-ignored, (f) reports cross-vertical conflicts rather than silently merging. Voice rules: no Oxford commas, no em dashes, no AI tells."

PROMPT 2Channel executor

"Write the system prompt for an executor agent dedicated to [CHANNEL] (e.g. LinkedIn drafting, cold-email triage, content planning). Constraints: ONE channel only, NARROW tool-allowlist (list the exact tools), produce output in a strict JSON shape with fields {channel, today_actions, drafts_for_review, asks_of_supervisor, voice_check_passed}. Voice-lint your own output before returning. Refuse to act outside your channel."

PROMPT 3Auditor

"Write the system prompt for the [VERTICAL] auditor agent. Inputs: executor output JSON + the schema + brand-voice doc + last 7 days of supervisor reports. Output: PASS / FAIL with a reasons array. Hard-fail on: schema violation, voice violation (em dash / Oxford comma / banned phrase), unsupported factual claim, direct contradiction with the last 7 days of supervisor reports. Soft-warn on weaker tells. On FAIL, return a stricter-prompt rider the executor should retry with."

PROMPT 4Daily orchestrator

"Write workflows/daily.js (ESM Node) that: (1) fans out N executor calls in parallel, (2) calls the auditor on each return, (3) retries failed executors ONCE with the auditor's reasons rider, (4) halts on second fail and surfaces, (5) feeds all audited outputs to the supervisor call, (6) validates the supervisor's JSON against roles/_shared/output-schema.json, (7) writes to data/reports/YYYY-MM-DD/.json. Total budget: don't exceed $1.20 per vertical per day."

What the Marketing/Sales Swarm OS Is Not

It is not a CRM. It is not a marketing automation platform. It does not replace HubSpot, Salesforce or Apollo. It does not send anything by itself; the executors produce drafts and the human approves the send. It is not an end-to-end "growth bot."

What it is: a quality-gated work-product engine. The executors do the writing. The auditor catches the errors. The supervisor synthesizes. The CEO integrator decides. The narrowness is the point. Swarms that try to also send, also book and also report decay into chaos. Swarms that produce schema-locked daily reports compound.

The question is not
"do I need a marketing agent?"

The question is:

"What channels do I run, who supervises across them, and who has the authority to reject any one of them on quality?"

Answer those three. The pattern fits. One day from blank repo to running.

This walkthrough is part of the Portfolio Leverage Co. Build Bench series. For the cohort where we build these together, apply here.