THE AUDIENCE
Internal marketing system · v0.3.0 · July 2026

Four people. One standard. Written down where it can't be argued with.

The problem was never storage. Your operators use the same Claude you do — the difference is that your method lived in your head and theirs lived in whatever they typed into the box. The Audience encodes the method as skills, serves brand truth through a server that enforces it, and lets Claude do the work.

12
SKILLS
14
BRIDGE TOOLS
49/49
TESTS PASSING
0
DEPENDENCIES
1
THING BLOCKING
01The diagnosis

Three problems, and they had to be solved in this order

Outsourced work came back as competent, forgettable lists. Not because the tools were worse — because the model fills an absent method with the statistical average of all marketing writing ever published. The statistical average of marketing writing is a listicle.

The method wasn't encoded

Fifteen years of pattern-matching in one head. Everyone else started from a blank prompt box, so the model supplied the average.

Fixed: 12 skills with forcing functions, banned-word lists, and a test each output must survive.

No shared source of truth

Four people, four slightly different ideas of what each brand actually is. Drift compounds quietly and nobody notices until a campaign ships.

Fixed: canon served by a server, read-only by capability — not by folder permission.

No quality floor

Review was a convention. "PASS 34/40" is a string anyone can type, and nothing checked whether the review happened.

Fixed: the gate is a precondition. Fabricated evidence is rejected at the boundary.

Solve the first and their output improves immediately. Solve the third and you stop being the bottleneck.

Solve the second and it scales past four people. That ordering is the whole design — and it's why nothing here is a dashboard.
02The shape

Plugins ship judgment. The bridge serves truth. Claude does the work.

Four layers, each locked by construction rather than by discipline. A plugin is installed, not opened. A tool absent from your scope cannot be called. Credentials you don't hold cannot be spent.

01

The Method — three plugins, twelve skills

How we do marketing, written down. Every skill carries forcing functions rather than descriptions: the Inversion Test, the Cover Test, the Attribution Test, and a list of words that are never used.

brand-coreaudience-map campaign-architectureasset-forge quality-gatevisual-identity sonic-identityrelease-campaign
Installed, not edited
02

The Bridge — local MCP server, stdio, zero dependencies

Serves canon and enforces the gate. Two scopes set by token, and the member scope doesn't contain the owner tools — they're absent from the listing, so there's no config to edit and no settings file to delete.

stem_getcanon_get prompt_searchlibrary_search brief_submitdeliverable_submit brief_approveledger_append
49/49 tests
03

The Forge — Google's GenMedia MCP servers

Veo for video, Gemini Image for stills, Lyria for beds, TTS for voice, and AVTool — local ffmpeg, free. Claude generates inside the workspace with canon already loaded, instead of app-switching and losing the strategy in the copy-paste.

gemini-imageveo lyriachirp3 avtool — free
Owner credentials only
04

The Library — the layer that compounds

Proven work, honest retros including the failures, and a prompt ledger recording every generation: prompt, model, seed, parameters, cost, verdict. This is the part that makes the system worth more every month instead of the same amount forever.

winners/retros/ prompts/<brand>/ledger.md
Owner promotes
The Audience solution architecture — work surface, method, bridge, forge, state, and the four locks
Full architecture — diagrams/solution.svg for the editable source.
03Why it holds

Four locks, none of them dependent on anyone remembering

Every guardrail that relies on discipline eventually fails, usually quietly. These four fail loudly or don't fail at all.

The stem is fetched as bytes

Each brand's identity ends in a literal prompt stem, returned by stem_get verbatim with a sha256. Nobody reads a document and retypes it, so nobody paraphrases it. Byte-identical reuse across four people is the entire reason the output reads as one brand.

Quotes must exist in the body

The gate requires a verbatim quote from the deliverable for each of eight dimensions — and checks that each one is actually there. You cannot cite what you did not read, so a fabricated review fails at the boundary rather than at someone's desk.

$

Credentials live in one place

Media generation bills per call. Operators have no Google Cloud credentials at all, so overspend isn't discouraged — it's structurally impossible. They write briefs; the brief is where the creative thinking lives anyway.

Nothing improvises

Every empty result returns not_found with a next step, never a plausible substitute. Ask for a stem that doesn't exist and you get "do not generate for this brand" — not a generic stem, not an inferred one.

04The gate

The check that turns a convention into a mechanism

Both submissions below score 32/40 with all eight dimensions filled in. One is accepted. The difference is the only thing that matters.

Rejected
// scores look fine, evidence is invented
gate: {
  scores: { craft: 4, proof: 4, ... },
  evidence: {
    craft: "a strong and compelling piece",
    ...
  },
  auto_fails: []
}

REJECTED — the gate did not pass.
  · evidence.craft: quoted text does
    not appear in the deliverable — a
    review citing text that isn't
    there was not performed
Rubber-stamping doesn't need to be detected by a human. It can't get through.
Accepted
// every quote is really in the body
gate: {
  scores: { craft: 4, proof: 4, ... },
  evidence: {
    craft: "Session notes are in the
      sleeve, unedited",
    ...
  },
  auto_fails: []
}

Accepted at 32/40 with all eight
dimensions evidenced.
  → queued for review
When a 34/40 arrives, you know the review happened. That's what buys autonomy over time.

The gate isn't distrust. It's the mechanism that makes a score mean something.

An operator who writes twenty evidenced reviews has learned to see the failures before writing them. That's the actual goal — the quality floor is a teacher, not a filter.
05Generated media

Text is free to redo. Media bills per call. So the order inverts.

For copy, the cheap path is to draft and let the gate kill it. For a Veo batch, that same loop spends money to learn something a paragraph of text could have told you.

Text — generate, then gate
Fetch canon and prior evidence
Draft three distinct angles
Run the gate on your own work
Fix, re-run, submit what passes
Redrafting costs nothing, so iterate freely.
Media — gate, then generate
Fetch the locked stem as bytes
Search the ledger for what worked
Write the brief — exact prompt, model, cost
Approval, before anything runs
One cheap test → variants → quality pass
A rejected brief costs nothing. A rejected Veo batch does.

Fix it with ffmpeg. Never regenerate.

Wrong crop, needs a logo, wants a GIF version, audio too loud — all free local operations. Reaching for a fresh Veo call to fix a crop is the single most common way to waste money here.
06Roadmap

One thing is blocking, and it isn't code

The infrastructure is ahead of the content — which is the right way round, but it means nothing produces output yet. The bridge correctly refuses to generate for a brand with no canon. Steps 1 and 2 are the only ones that can't be delegated.

System built and verified

71 files · 3 plugins · 12 skills · bridge 49/49 · verify green · review console · runbooks

Done
1

Close the canon gaps

Nine intake answers → derive → promote. Blocks everything below it.

You
2

Vertex setup and the calibration run

Budget alert first. Nine images, Cover Test, tighten the stem. No Veo yet.

You · 2.5h
3

Zero-build read path

github-mcp-server read-only + sync heartbeat. Canon in the team's hands, no code written.

You · 1h
4

B1 · Offline canon cache

An outage degrades to read-only, not to nothing. Cache miss still returns not_found.

Builder · S
5

B6 · Import Google's craft skills

Five skills, one namespace conversion each. Ours wins on conflict.

Builder · S
6

B2 · gate_audit

Re-score independently, track the delta per person. The quality floor, measured.

Builder · M
7

B3 · Postgres migration

The one-way door. Immutable stem bodies, cost on every row.

Builder · L
8

B4 · HTTP transport

Same tools, bearer token, no per-person install.

Builder · M
9

B5 · Coolify + approval queue

Approve briefs from a phone. UI for state — never a generate button.

Builder · L
10

B8 · Compiled prompt stem

Assembled from evidence, versioned. Proposes only — never auto-publishes.

Builder · L
The Audience roadmap — foundation, bridge, media and surfaces lanes across five weeks
Full roadmap with lanes and dependencies — diagrams/roadmap.svg for the source.
07The honest part

Being good at this is temporary. The record isn't.

Worth being precise about which half of the advantage erodes, because it changes where effort should go.

Commoditises

Producing a good brand strategy from a blank page

Models get better at this every few months and the floor rises for everyone, competitors included. The current edge here is real and it is temporary. Building the system around it would be building on something that melts.

Doesn't commoditise

Proprietary evidence about your own audiences

What worked, for whom, on which channel, with numbers attached. A better model raises everyone's blank-page output — it does nothing to give a competitor your record of what moved your audiences. That record cannot be prompted into existence.

The durable asset is the library, not the strategies.

Which means: instrument from day one. Every campaign gets a retro with real numbers, especially when they're bad. A year of honest retros is a moat. A year of good strategies with no measurement is a portfolio, and portfolios depreciate.