# 05 · Council — a bounded loop of judges decides ship-or-revise

**Why this step exists:** the deterministic checks in `04-validate.md` catch mechanical slop
(banned words, missing citations). They can't judge whether a draft actually sounds like you,
whether the hook earns the read, or whether a claim is technically-cited-but-still-sketchy.
That needs a model's judgment — but one draft rubber-stamping itself is not a real review. Use
several narrow judges, each scoring only their own lane, and a hard stop-gate on compliance.

## Scoring scale

Score every dimension **1–10**. Same anchors across all dimensions:

- **1–3** — fails: slop, hype, a banned phrase, an unsupported claim, or plainly off-voice.
- **4–6** — generic: technically correct but could appear on *any* company's account.
- **7–8** — specific and in-voice: real nouns, a real number, the reader is the hero.
- **9–10** — unmistakably yours: save-worthy, honest, a hook and a close only you could have
  written.

**Rule:** for any dimension scored ≤3, quote the offending sentence(s). A low score with no
cited sentence isn't actionable — it's just a vibe, and vibes don't fix drafts.

## The four judges

Adapt the names/details, keep the four jobs — each judge owns a lane and does NOT grade
outside it.

### `structure-hook` — owns hook + structure
Does the first line earn the read (most of what shows before a "see more" tap is one line —
no unanswered opening question, no throat-clearing)? Does the piece flow: situation → turn →
point → close? One idea per short paragraph, one clear point.

### `specificity-fact-density` — owns specificity
The skeptic's judge. Rewards concrete nouns and real numbers; punishes abstractions
("solutions," "synergies," "operational efficiencies"). Every claim must trace to a
transcript line `[L#]` or an approved `[FACT]`. Flags any number that isn't first-party or
isn't framed as general industry data.

### `voice-match` — owns voice
Checks against your voice guide (register, contractions, sentence rhythm, banned words). The
reader is the hero, not you. The close opens a conversation; it doesn't bark a
call-to-action. Flags anything that sounds like a product launch.

### `compliance-slop` — owns compliance (hard gate)
The cheap first pass, and the only one that can veto regardless of the average score. Flags
ANY of: a banned/hype phrase, a fabricated credential/testimonial/outcome, an unsourced stat
stated as fact, a promised specific result, or a missing disclosure your industry legally
requires (human-in-the-loop, opt-out language, whatever applies to you). A single flag blocks
shipping no matter how high the other three scores are.

## Verdict schema (each judge emits ONLY this)

```json
{"judge":"<persona>","scores":{"hook":N,"specificity":N,"voice":N,"structure":N,"compliance":N},"compliance_flag":bool,"notes":"<offending sentences for scores<=3>"}
```

Omit a dimension you're not scoring rather than scoring it 0 — a 0 should only ever mean "I
judged this and it failed," never "I didn't look."

## Stopping rule

Aggregate the average across all scored dimensions. Ship when the average clears **your own
quality floor** and there's no compliance flag; otherwise revise. Tune both the floor and the
weighting between dimensions to your own risk tolerance — there's no universally-correct
number here. Hard-cap revisions at **two passes**: if it's still not clearing the floor after
two rewrites, hand the best draft to a human instead of looping forever.

## Model-choice rule

- Run `compliance-slop` first as a cheap gate — no point spending a stronger model on the
  other three if the draft is going to get vetoed anyway.
- The model that drafted the post should not be the only judge of it. Use a different model,
  or at least a fresh, un-primed context, so the council is a real second opinion.
