CMO
The marketing department's front door. Reads every incoming request — from a Slack message to a scheduled report — and routes it to the right specialist.
AgentWorkforce is our production-tested platform for building fleets of intelligent agents. A triage agent routes work to specialists, each focused on one job. Below, we walk through how AgentWorkforce runs a complete marketing department — from competitive intel to campaign launches — as a real example of what an AI workforce looks like.
Every input — a chat message, a webhook, a scheduled job, an alert — travels the same path through the same layers. That uniformity is what makes the platform legible.
CLI typed text, Telegram message, GitHub webhook, scheduled cron tick — each wrapped in a standard Envelope with source metadata and session ID.
Event bus subscribers act (logging, audit, hooks). The dispatcher continues, drained from a FIFO queue.
Hybrid search across the persistent memory store. Relevant snippets, persona context, and prior decisions land in the system prompt.
Calls a built-in route_to_agent tool. Specialist is selected; its system prompt and skill set become active for the next turn.
LLM at its declared tier; skill engine executes tool calls in a subprocess; results feed back. Loop continues until the agent finalizes a response.
Sanitizer scrubs secrets. Channel adapter formats (with Telegram chunking, CLI rendering, etc.). The session is persisted; the next turn picks up where this one left off — from any channel.
The point: a user request, a webhook from your billing system, and a cron-scheduled overnight cleanup all run on the same loop, with the same memory, in the same agents — only the channel and trigger differ.
Channels at the top. Triage in the middle. Specialists branching out. Foundation underneath. The whole system in one frame.
// The AgentWorkforce platform, populated as a marketing department. Same architecture, different roster.
Here's what an AgentWorkforce-powered marketing department looks like. The CMO agent fields every request and routes it to the specialist who owns that work. Each specialist has its own playbook, its own skill set, and the right model for the job.
The marketing department's front door. Reads every incoming request — from a Slack message to a scheduled report — and routes it to the right specialist.
Why a CMO agent? Without one, every specialist has to know about every channel and every other specialist — the system gets slow and expensive. The CMO stays cheap and fast (Sonnet, lookup only); the experts stay focused on their craft.
Owns the editorial calendar and campaign briefs. Decides what gets written, when, and to which audience.
Drafts blog posts, landing pages, ads, email sequences. Format-aware. Hands drafts off for brand review.
Reviews every public-facing draft against the brand guide. Returns a voice score and specific edits.
Writes briefs for designers, video producers, and freelancers. Includes objective, audience, deliverables, and references.
Channel-culture aware. Adapts copy to LinkedIn, X, Instagram, etc. Always queues for human approval — never auto-posts.
Drafts campaigns, builds segments, sets up A/B tests, analyzes results. Sends are gated by approval.
Generates ad creative variants, monitors budget pacing, builds weekly performance reports across Google & Meta.
Drafts press releases, builds and maintains media lists, monitors press mentions, schedules journalist outreach.
Keyword research, SERP tracking, on-page optimization recs. Pairs with Copywriter on every draft.
Pulls metrics from GA, HubSpot, Mixpanel. Builds attribution stories, ROI analyses, and weekly dashboards.
Runs nightly. Scrapes competitor blogs, releases, ad libraries, and pricing pages. Flags anything that changed.
Synthesizes survey results, support tickets, sales-call transcripts. Turns qualitative feedback into themes for Strategy.
// This is the pattern, not a template. In your engagement we map your marketing org — with your channels, your CRM, your brand guide, your approval rules.
Every agent is defined declaratively in agents.yaml. Adding a new specialist — or tweaking how the Copywriter handles a new format — is editing a config file. No rebuild.
# agents.yaml — the Copywriter specialist - id: copywriter name: "Copywriter" description: "Drafts blog posts, ads, emails, social copy" model: claude-sonnet-4-5 # tier choice, explicit skills: - content-calendar - brand-voice-check - seo-research - vault system_prompt: | # You draft for Acme Co. # Read BRAND.md before any new format. # Always pair with the SEO agent on web content. # Drafts go to /drafts/YYYY-MM-DD/, never published direct.
A skill is a directory with a SKILL.md file. YAML frontmatter declares what tools the skill exposes; the body is plain-English instructions for the agent. No core changes, no redeploy — the watcher hot-reloads as files land.
--- skills/seo-research/SKILL.md --- --- name: "seo-research" description: "Keyword research, SERP analysis, content recs" commands: - name: "keyword_research" description: "Find target keywords for a topic" handler: "python handlers/keyword_research.py" parameters: - name: "topic" type: "string" required: true - name: "intent" type: "string" enum: [informational, commercial, navigational] - name: "serp_analysis" description: "See who's ranking for a keyword and why" handler: "python handlers/serp.py" parameters: - name: "keyword" type: "string" required: true dependencies: [ahrefs, browser] --- # SEO Research Use this skill before any web content draft. Always start with keyword_research to find the target keyword cluster, then run serp_analysis on the top 1–2 keywords to see what the ranking pages cover. When pairing with the Copywriter, return: · the primary keyword + 3–5 secondary terms · the angle the top results miss · word-count and structural recommendations If the topic is too broad for a clear keyword cluster, ask the Strategist to narrow the scope before drafting.
Each skill is a folder with a SKILL.md file. Together, they're how an AgentWorkforce marketing department actually does work — not just talks about it.
The triage agent doesn't try to do everything. It reads the request, picks the right specialist via a built-in route_to_agent tool, and hands off — with the right system prompt, the right skill set, and the right model tier.
Each specialist has its own conversation history. A finance request never picks up context from a customer-support thread, and vice versa.
Each specialist only sees the skills it needs. Context window stays focused; reasoning stays fast; cost stays predictable.
A specialist can itself be a triage agent for a sub-domain — e.g. the "Business" agent routes between Strategy, Marketing, Growth, Operations. As deep as you need.
To show how the architecture pays off, here are three marketing operations an AgentWorkforce department handles routinely. Each is a chain of agents, skills, and approvals — running the same way every time.
Every Monday at 8am, the CMO drops a synthesis of the past week into Slack — what the competition did, what your campaigns did, and what needs your attention this week.
Scrapes competitor blogs, ad libraries, and pricing pages. Diffs against last week's snapshot. Logs anything new.
GA traffic, HubSpot funnel, email open/click, ad spend & CPA. Tags anomalies vs. trailing 4-week average.
Pulls in last week's brand decisions from memory. Writes ~300 words. Calls out three things that need a human eye.
Threaded summary. Anyone can reply with a follow-up question — routes back to the right specialist automatically.
You message the CMO: "We're launching the v2 dashboard next Tuesday. Spin up the campaign." Six specialists hand off in sequence; you approve once.
Reads the v2 product spec, prior launch briefs, audience profiles. Outputs angle, goals, KPIs, channels, timeline.
Primary + secondary keywords for the launch blog and landing page. Notes what top competitors covered — and what they missed.
Landing page, blog announcement, 6 social posts, 3 ad variants, a launch email. Each tagged by channel and dropped into drafts/2026-07-launch/.
Scores each draft on tone, voice, and message consistency. Flags any line that doesn't pass. Returns to Copywriter to revise.
Posts queued in scheduler with launch-day timing. Ads built in Meta + Google ad managers, paused, with creative variants ready.
You review everything in one place. Approve, edit, or reject any asset. Once you approve, scheduled posts go live — the ads unpause on launch day.
UTMs in place, dashboard live, daily Slack update for the launch week. Anomalies flagged. The data is in the room before any meeting.
A competitor announces a feature you've had for six months. AgentWorkforce sees it, decides if you should respond, drafts the response, and parks it for your approval — all within an hour.
Competitive Intel's scraper sees a new post on a competitor blog. News API confirms press coverage. Envelope lands at the Gateway.
Reads the post, checks memory for related history, decides this is worth a response (you have the feature already — reframe the narrative).
Decides on positioning: "we've shipped this for 6 months — here's what we've learned." Pulls supporting metrics from Analytics.
Two formats, two angles. Tagged for review. Brand Voice passes — it reads like you, not like a press release.
A 4-line summary: what happened, why it matters, the response drafted. Two formats below it. Approve, edit, or pass — nothing publishes without your click.
A pattern, not an accident. Every workflow runs the same loop: triage → specialist(s) → check → approval → publish. The discipline is built into the architecture — not into the discipline of the people using it.
Most chatbots forget everything the moment a conversation ends. AgentWorkforce doesn't. Every campaign decision, brand rule, audience insight, and prior outcome gets remembered — and brought back into the room the next time it's relevant.
You explain the launch positioning once. Six weeks later the Copywriter is still using the same framing, the Social agent still adapts it for each channel, and the Brand Voice agent still flags drift — without anyone re-briefing the team.
When the CMO chooses a content angle, that choice gets stored. Next time a similar question comes up, the Strategist agent surfaces the prior decision and the reasoning — so the team stays consistent across quarters, not just weeks.
Your brand guide, audience profiles, and approval rules live as plain text files alongside the system. Anyone on the team can edit them. The agents read the same files. There's no hidden “AI brain” — just the rules, in writing, the same ones the team uses.
All of this memory — the briefs, decisions, brand context — lives in your environment. Nothing about your business gets pushed into a third-party SaaS. The data stays yours, and the agents read it directly.
The Gateway makes every channel a peer. Adding a new one is a Channel subclass with send() / receive(). The agents, memory, and skills don't change.
Rich-rendered REPL with streaming responses, slash commands for system control, and tab completion on skills. The dev-day default.
Polling bot with per-user session isolation, message chunking for the 4096-char limit, exponential-backoff retries. Slack channel adapter on the same pattern.
FastAPI endpoint with bearer-token auth. Auto-normalizes GitHub PRs/issues, Slack events, and generic JSON into agent-readable text.
Persistent SQLite-backed jobs that survive restarts. Skills with a schedule field auto-register. Manage conversationally.
Background scheduler runs "check" skills (calendar, email, markets, etc.) at intervals. Claude evaluates the results; you only get pinged when something needs you.
YAML-declared hooks subscribe to system events. "On startup, run the daily briefing. On notification sent, log to vault." Configuration, not code.
Start a request in chat, get a follow-up question via webhook, finish in CLI — same session, same memory, same agent. The dispatcher keys sessions by channel + user and persists them in SQLite. 24-hour TTL, auto-clean.
Each agent declares the tier it needs. Routing is intentional, visible, and changeable in a single file. You spend Opus money where you need Opus reasoning — and Haiku money everywhere else.
Tiers are configured, not coded. Override the model for any agent by adding model: in agents.yaml. New model lands — bump one line; new run, new behaviour. The harness handles the rest.
The marketing department above is the example. The architecture is the same for any operations team you'd want to scale — sales, support, finance, internal ops. A custom agent platform engagement is 8–14 weeks.
AgentWorkforce is built on the dullest, most reliable building blocks we could find. The novel part is the architecture; the parts holding it up are old enough to vote.
A custom agent platform engagement is 8–14 weeks, fixed scope and fee. Tell us what your specialists should do; we'll build the roster.