Operator guide
Everything below is a sentence you say to your agent or a file you edit. Total setup time is dominated by one thing: how fast you can gather your own funnel numbers with sources. The system runs fine with gaps — it will write "missing" instead of guessing — but every sourced number you feed it makes the memos sharper.
You need Claude Code or Codex on your machine (claude.ai works too — see step 9), Git, and a private place to push the repo. Nothing else. No API keys beyond your agent, no databases, no services.
Clone it, push it to a private remote. Once personalized it holds your strategy, spend, and decision record — treat it like your CRM export, not like a website.
config/ — the only place company facts are typedSeven files, in this order. Each has [FILL — …] placeholders with fictional examples; flip
its frontmatter to status: FILLED when done.
| File | What goes in | The rule that matters |
|---|---|---|
| company-profile.md | Name, products, value props, proof points, GTM motion, ACV, sales cycle | Proof points need a source and a date — unsourced ones can never enter an asset |
| icp-and-segments.md | ICPs, named segments with addressable counts, personas, buying committee | Segment names are load-bearing: fatigue caps and briefs key off the exact strings |
| competitors.md | Named competitors, where you win/lose, comparative-claims do/don't | If it isn't here or pasted into a brief, no agent will ever state it |
| brand-voice.md | Tone, style rules, lexicon, banned phrases, two example paragraphs | Applied mechanically — a banned phrase is an automatic REVISE at the asset gate |
| compliance-profile.md | Markets, privacy regimes, claims rules, regulated topics, approval chain | The officer screens against this file only; write it with counsel |
| budget-and-channels.md | Quarterly budget, channels, benchmark costs and funnel rates with sources, primary KPI, rails overrides | No source → delete the row. The committee says "missing"; it never guesses |
| portfolio-snapshot.md | Active campaigns, spend, channel mix, reserve, cash calls — dated | Living document; runs halt if the as-of date is over 30 days old |
In the repo root: personalize the marketing office
The agent validates config (it stops and lists missing fields if any file is still TEMPLATE or has
[FILL left), injects each charter's context slice, applies your rails overrides, and regenerates
every synced copy. Success looks like: company name applied, files touched listed, overrides shown old→new,
and a reminder to re-date the snapshot monthly. Re-run it after any change to config/ or
agents/.
run the smoke test
It replays the built-in fictional campaign (EXFL-Q3) end to end: ten
memos, a WAIT or NO-GO (the fixture's economics sit at 4.6:1, below the 5:1 hurdle by design), a journal
entry, then a production leg with gated assets. Two checks matter: every memo ends with its
Confidence: and This view is wrong if: lines, and nothing anywhere quotes a number
you didn't paste. If something does, the no-fabrication rule failed — fix before real use. Delete
campaigns/EXFL-Q3/ and the smoke-test journal entry when done.
Copy templates/campaign-brief-intake.md. Required fields: name and code, thesis in one
sentence ("what do we believe about the buyer that competitors do not?"), why now with a date, primary KPI
with a number and a date, target segment (exact name from config), budget range, and the data paste — funnel
rates, past results, benchmarks with sources. Optional: market/climate signals for the timing chair.
Do not put your preferred outcome in the constraints field. The CMO agent is firewalled from your leaning; binding constraints only (ceilings, embargo dates, forbidden claims).
Save as campaigns/<CODE>/brief.md, then:
run the committee on campaigns/<CODE>/brief.md
Halts are one-liners — a stale snapshot, a missing profile. Supply the thing; the run resumes. Output:
nine memos in memos-appendix.md, the CMO decision, a two-page decision-memo.md, a
journal entry.
The dissent section quotes the devil's advocate and skeptic verbatim with attack strengths. Read it before the rationale; it is positioned there because it is the part you will want to skip. Then: the checklist numbers, the binding conditions, the kill criteria.
Check one: Approve / Modify / Reject / Override. Sign and date. A Modify becomes binding as written. An Override is logged verbatim by the recorder — the system's job is not to prevent overrides but to price them, and the quarterly audit will tell you what yours cost or earned.
run production for <CODE>
The launch plan's asset brief drives drafting, one asset at a time. Brand-risk and compliance gate each
draft independently (SHIP-READY / REVISE / VETO); two revision rounds max, then it escalates to you. Assets
land in campaigns/<CODE>/assets/, each ending in a claims-and-sources table.
Resolve every [NEEDS SOURCE: …] placeholder — the producer flags what it could not source
rather than inventing it. Then you send, publish, schedule, post. The system never does; that boundary is
structural, not a setting.
A WAIT-WITH-TRIGGER names an observable, dated condition and expires in 90 days. When it prints, tell the agent ("the trigger for <CODE> fired") — the recorder notes it and the campaign proceeds at the decided size. Expired WAITs go back to committee; the audit scores them either way.
Every campaign carries a metric stop and a thesis stop. When one trips: kill or re-underwrite (a fresh committee run). Drifting past a tripped stop is the exact failure mode this system exists to stop.
Architect + brand-risk against a re-dated snapshot: every active campaign vs. its gates, channel shares
vs. caps, segment fatigue, aggregate unvalidated spend, reserve vs. floor, expired WAITs, unresolved
[NEEDS SOURCE] items in shipped assets.
You paste actuals into campaigns/<CODE>/results.md; the recorder replays every journal
entry: predicted number and date vs. printed. NO-GOs and expired WAITs are scored with what happened after.
Overrides get their own tally.
| You say | What happens |
|---|---|
| personalize the marketing office | Config → charters, rails overrides, copy sync. Safe to re-run any time. |
| run the committee on campaigns/<CODE>/brief.md | Full run: 9 isolated memos → CMO decision → launch plan on GO → journal → 2-page decision memo |
| run just <agents> on X | Partial consultation. Same isolation and caps; recorder files a note; no decision is issued |
| run production for <CODE> | Brief check → drafts → independent two-officer gate → max 2 revision rounds → filed assets |
| run the monthly review | Architect + brand-risk vs. a fresh snapshot |
| run the quarterly audit | Recorder replays every entry vs. pasted actuals; overrides tallied separately |
| run the smoke test | The fictional end-to-end dry run; works before personalization |
Halts are one line long, name what is missing, and stop the run cleanly:
| Halt | Fix |
|---|---|
| Config still in TEMPLATE state | Fill config/, re-run personalize |
| Snapshot older than 30 days | Re-date and refresh config/portfolio-snapshot.md |
| No compliance profile | Fill config/compliance-profile.md |
| Intake missing a required field | The halt names the field; fill it in the brief |
| Production without a GO on file | No fix. NO-GO campaigns never enter production; a WAIT needs its trigger declared fired first |
config/. Behavior changes → edit agents/ or the protocol
files. Then re-run personalize. See Adapting before structural edits.skills/*/references/charter.md, .claude/).
Instead, edit the sources and re-run personalize — it regenerates every copy.config/portfolio-snapshot.md at least every 30 days, and after every commit, kill, or
completed campaign.skills/campaign-committee-orchestrator/references/budget-rules.md top to bottom. Every number is a
default; that file wins over anything a charter says..claude/skills/;
13 read-only subagents from .claude/agents/ for one-off consultations.AGENTS.md routes the same phrases; one
conversation plays every role under the orchestrator's isolation discipline.SETUP.md,
upload config/ and templates/, zip-upload the 14 skill folders. Committee runs work
fully in the browser; production is better local, where assets land on disk. Re-upload journal entries to
project knowledge after each session or the record silently stops.The payoff arrives at the first quarterly audit: your predictions against your actuals, in your own numbers. Everything before that is setup.