Operator guide

Setup to first audit

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.

01

Set up, once

Check prerequisites

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.

Get the repo, keep it private

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.

Fill config/ — the only place company facts are typed

Seven files, in this order. Each has [FILL — …] placeholders with fictional examples; flip its frontmatter to status: FILLED when done.

FileWhat goes inThe rule that matters
company-profile.mdName, products, value props, proof points, GTM motion, ACV, sales cycleProof points need a source and a date — unsourced ones can never enter an asset
icp-and-segments.mdICPs, named segments with addressable counts, personas, buying committeeSegment names are load-bearing: fatigue caps and briefs key off the exact strings
competitors.mdNamed competitors, where you win/lose, comparative-claims do/don'tIf it isn't here or pasted into a brief, no agent will ever state it
brand-voice.mdTone, style rules, lexicon, banned phrases, two example paragraphsApplied mechanically — a banned phrase is an automatic REVISE at the asset gate
compliance-profile.mdMarkets, privacy regimes, claims rules, regulated topics, approval chainThe officer screens against this file only; write it with counsel
budget-and-channels.mdQuarterly budget, channels, benchmark costs and funnel rates with sources, primary KPI, rails overridesNo source → delete the row. The committee says "missing"; it never guesses
portfolio-snapshot.mdActive campaigns, spend, channel mix, reserve, cash calls — datedLiving document; runs halt if the as-of date is over 30 days old

Personalize

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/.

Smoke test

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.

02

Your first real campaign

Write the intake

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).

Run the committee

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.

Read the decision memo — dissent first

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.

Decide on paper

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.

On a GO — produce

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.

Ship by hand

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.

On a WAIT — watch the trigger

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.

03

Operating cadence

the day it prints

Kill-criteria trips

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.

monthly

run the monthly review

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.

quarterly

run the quarterly audit

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.

04

Reference

Commands

You sayWhat happens
personalize the marketing officeConfig → charters, rails overrides, copy sync. Safe to re-run any time.
run the committee on campaigns/<CODE>/brief.mdFull run: 9 isolated memos → CMO decision → launch plan on GO → journal → 2-page decision memo
run just <agents> on XPartial 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 reviewArchitect + brand-risk vs. a fresh snapshot
run the quarterly auditRecorder replays every entry vs. pasted actuals; overrides tallied separately
run the smoke testThe fictional end-to-end dry run; works before personalization

Halts

Halts are one line long, name what is missing, and stop the run cleanly:

HaltFix
Config still in TEMPLATE stateFill config/, re-run personalize
Snapshot older than 30 daysRe-date and refresh config/portfolio-snapshot.md
No compliance profileFill config/compliance-profile.md
Intake missing a required fieldThe halt names the field; fill it in the brief
Production without a GO on fileNo fix. NO-GO campaigns never enter production; a WAIT needs its trigger declared fired first

Maintenance rules

Runtime notes

05

Next

The payoff arrives at the first quarterly audit: your predictions against your actuals, in your own numbers. Everything before that is setup.