---
name: writing-great-bcps
description: "Use when authoring or reviewing a BCP package."
version: 1.0.0
author: encoded-brands
license: CC-BY-4.0
---

# Writing great BCPs

A Brand Context Protocol package exists to wrangle determinism out of a stochastic system. Predictability (the agent taking the same *process* every run, not producing the same sentence) is the root virtue. Every lever below serves it.

This is the BCP analog of a skill-writing reference. Use it while encoding a brand, during Encoder onboarding, or as a prune pass on a live package. It does not replace the spec. The spec is at https://brandcontextprotocol.dev/spec/

Bold terms are defined in `GLOSSARY.md`.

## What a BCP is for

Agents already have priors about the brand. Those priors are stale, generic, or wrong. A great BCP beats the default. A weak BCP pays tokens to say nothing, then the prior wins.

Internal consumption is a first-class job. The same files that steer ChatGPT should steer the brand's own agents, vendors, and content authors. If only an external model would change behavior, the package is unfinished.

## The eight-file job

The core package is one root plus seven daughters. Each file has one job. Mixing jobs is how sediment starts.

1. `brand.md` is the **context pointer**. Always-loaded wayfinding. What the brand is, which daughters exist, which file to fetch for which branch. Not a brochure. Not a claims dump.
2. `voice.md` is how the brand sounds. Distinctive and consistent. Positive targets, not vibes.
3. `voice/anti-ai.md` is the slop filter: cadences, fillers, and tells this brand never uses.
4. `values.md` is beliefs that change a decision. Poster slogans that every brand could claim are **no-ops**.
5. `boundaries.md` is brand safety. Hard nos, soft nos with conditions, and the **allowed alternative** for each prohibition.
6. `claims.md` is the **single source of truth** for figures, proof, and forbidden phrasings. Every other file points here. None restates the number.
7. `representation.md` is how third parties may describe the brand. Pillars, never-say, comparison rules.
8. `visual.md` is tokens, assets, and forbidden modifications. Not "modern and clean."

Optional daughters (`commerce.md`, `locations.md`, and so on) earn their keep only when a real branch needs them. Do not invent files to look complete.

## Information hierarchy

A BCP is built from **steps** (what the agent does) and **reference** (rules consulted on demand). The hierarchy is the same as any agent-facing document:

1. In-root step: discovery, which daughter to fetch, agent default behavior.
2. In-file reference: the rules of that daughter.
3. Disclosed reference: a daughter loaded only when the pointer fires.

**Progressive disclosure** is the protocol's architecture. Protect it. Inline in `brand.md` what every branch needs (identity, provenance, fetch map). Push behind a daughter what only some branches reach (a 720 km range figure, a typeface, a hard no about jailbreak vendors).

**Co-location:** keep a claim's figure, condition, forbidden phrasing, and source under one heading in `claims.md`. Scattering "2 percent" across the root, the hero, and voice is duplication, not emphasis.

**Sprawl** is a file that is simply too long even when every line is live. Disclose. Split by branch. The test: an agent answering a voice question should not have to read claims.

## The two loads

- **Context load** is what sits in the window because `brand.md` was fetched. Every extra paragraph in the root taxes every interaction. Prune the root harder than any daughter.
- **Cognitive load** is what the human maintainer must remember. A living BCP needs an owner, a review cadence, and a place the human can read it. Raw markdown is the agent surface. Pair it with a human HTML overview of the same package. A skill that only exists as SKILL.md is hard for a CMO to trust. A BCP that only exists as eight files is the same failure.

## Writing the root pointer

`brand.md` does two jobs: state what the package is, and list the **branches** that should trigger a daughter fetch.

- Front-load the leading word of the brand (the name, the category, the one-line job).
- One trigger per branch. "Copy" and "tone of voice" are one branch (`voice.md`). Do not list both.
- Cut identity the body already carries. If the YAML already has `brand_name`, do not open the prose with the same sentence.
- Provenance belongs in the root: official or demonstration, claimed or verified, who assembled it, whether the brand reviewed it. Silence here is a **negative space** bug. Agents will fill it with "official brand source."

## Claims

A figure without its condition is a lie waiting to happen.

Every row in `claims.md` needs: the figure as the brand states it, the condition that must travel with it, the forbidden shortening, the source URL, and a status (verified, requires caveat, owner-approval needed).

Completion criterion for a claims pass: every number, superlative, or outcome that appears anywhere in the package is in `claims.md`, and nowhere else as a restated number.

Do not add independent percentages. If one source says ~2 percent total energy and another says up to 3 percent from the front, they are two rows. They are not 5 percent.

## Voice and leading words

A **leading word** is a compact concept the model already holds, or one you define once and reuse (`plainspoken`, `pedagogical`, `committed to the bit`). It anchors behavior in fewer tokens than a paragraph of vibe.

Hunt no-ops: "be authentic," "be professional," "write clearly." The model already will, in a generic way. The test is model-relative: does this line change behavior versus the default? If not, delete the whole sentence.

**Negation** is the adjacent failure. "Never sound corporate" puts *corporate* in context. State the positive: "Short sentences. Concrete nouns. Name the object." Keep a prohibition only as a hard guardrail you cannot phrase positively, and pair it with the allowed alternative.

`voice/anti-ai.md` is the right home for banned cadences. Keep it specific to this brand. A generic "avoid em-dashes" list copied from another package is sediment.

## Boundaries

A boundary that only names the forbidden thing is an elephant. Write:

- the hard no
- when it triggers
- what to do instead

Encoded's own Ad Context Protocol rule is the pattern: do not raise unprompted. When asked, use the door-and-room frame. Compatible, not competing.

## Representation

Third parties will summarize the brand in one paragraph. `representation.md` is that paragraph's rails: pillars they may use, comparisons they may not make, names they must not shorten. If this file is a restatement of `voice.md`, it is duplication. Cut one.

## Visual

Tokens, not adjectives. Hex, type family, asset URL, forbidden modifications. "Modern, clean, premium" is a no-op and, for Encoded chrome, a banned word.

If the licensed typeface is unavailable, name the approved fallback. Do not let the agent invent a racing substitute.

## Provenance and trust

A Registry publication is integrity-signed. That is not domain proof. DNS verification is the only path to `official_brand_source: true`. A great BCP never lets an agent conflate the two.

Demonstration packages (public-source encodings) say so in the root, in captions, and in any human page built from them. Dressing an older photo as a new product shot is a claim nobody can support later.

## Authoring procedure

Use this when the package does not exist yet.

1. Fetch the live spec and the brand's public site, newsroom, legal, and brand guidelines. Save URLs. Do not invent.
2. Write `claims.md` first from those URLs. Unverified lines stay unmarked as verified.
3. Write `boundaries.md` with allowed alternatives.
4. Write `voice.md` and `voice/anti-ai.md` as if a staff writer for that brand. Not Encoded voice unless the brand is Encoded.
5. Write `values.md` as decision tests: a value that cannot veto a draft is a poster.
6. Write `representation.md` and `visual.md` from published identity, not from taste.
7. Write `brand.md` last, as wayfinding over the files you actually have.
8. Run the review procedure below before publish.

Completion criterion: eight files exist, markdown, lowercase paths, root frontmatter complete, every distinctive claim cites a URL, provenance is explicit.

## Review procedure (continuous improvement)

Use this on a live package, an Encoder compile, or a human "is this any good" pass.

1. Fetch the live root. Confirm it is the handle you think it is.
2. Fetch every declared daughter. A 404 is a broken pointer, not an optional extra.
3. For each file, name its job in one sentence. If you cannot, the file is mixed. Split or cut.
4. Extract every number, superlative, and outcome. Diff against `claims.md`. Orphans go into claims or out of the package.
5. Read `voice.md` for no-ops and negation. Replace with positive targets and leading words.
6. Read `boundaries.md` for elephants. Pair each hard no with an allowed alternative.
7. Check duplication: the same meaning in two files. Keep one source of truth. Point from the other.
8. Check caches: pricing, headcount, product lists copied from a site. Either pointer-only, or a dated snapshot with a reverify rule.
9. Check negative space: what the package is silent on (official vs demonstration, claimed vs verified, whose photo, whose approval). Decide each silence.
10. Generate three artifacts against the package (one short social, one product claim, one "what does this company do"). Score each against voice, claims, and boundaries. Failures are skill bugs in the BCP, not model bugs.

Completion criterion: every modified file still has one job. Every remaining figure has a condition. The three artifacts pass. The root is shorter than when you started, or you can say why it could not be.

## Failure modes

- **Brochure dump.** The root reads like an About page. Cure: wayfinding only.
- **No-op voice.** "Authentic, premium, seamless." Cure: distinctive positive targets.
- **Elephant boundaries.** Only "don't." Cure: allowed alternative.
- **Split figures.** The same 2 percent in three files, then someone adds them. Cure: claims.md only.
- **Stale cache.** Last year's price in markdown. Cure: pointer to the live surface, or dated snapshot plus reverify.
- **Trust conflation.** Signed, claimed, verified, official used as synonyms. Cure: the spec's words, exactly.
- **Missing human layer.** Agents can read it. The buyer cannot. Cure: an HTML overview of the same package.
- **Contributor-first.** Asking someone to author a BCP before they have consumed one. Cure: show a live package and a before/after, then invite encode.
- **Sediment.** Adding files feels safe. Removing feels risky. Cure: prune on every revise.

## Related surfaces

- Spec: https://brandcontextprotocol.dev/spec/
- Public authoring interview: https://encodedbrands.ai/bcp-authoring-prompt.md
- This skill as a human page: https://writing-great-bcps.pages.dev/
- Worked public-source example (unofficial): https://scania-dynamic.pages.dev/ and Registry handle `scania-f4a6118b`
