/idiolect:campaign — many voices, zero bleed
The failure mode of one writer producing N "different" posts is convergence: same skeleton, same rhythm, swapped adjectives. This skill prevents it structurally — each post is written in an isolated context that has seen ONLY its own voice, then the set is checked for overlap like the adversarial reviewer a real editor would be.
Setup
ROOT="${CLAUDE_PLUGIN_ROOT:-${CODEX_PLUGIN_ROOT:-$IDIOLECT_ROOT}}"
# unset everywhere (opencode)? ROOT = two directories up from this SKILL.md
IDIO="python3 $ROOT/scripts/idiolect.py"
CID="<campaign-name-or-date-slug>"
Flow
Cast the voices. Brief to a scratch file, then
$IDIO pick --platform <p> --brief-file <f> --n <N> --distinct --json
(per-platform picks if the campaign spans platforms — and pass --exclude with every already-cast slug on each subsequent pick, or the same voice will happily win two platforms). --distinct does greedy max-distance casting — announce the cast in one line each: who, platform, why they fit the brief. If the user named people fuzzily ("use the nurse and the sneaker guy"), resolve those against $IDIO voices --json first and fill the rest of the cast with pick. Nothing here requires the user to know a slug or a flag.
Pre-assign structure. Build a rotation table before any writing: no two posts share (opener, shape) even across different voices; lengths vary. This is the campaign-level variance guard; the per-voice ledger check comes free in step 3.
Fan out, isolated. For each (voice, platform, structure) row, spawn an idiolect-writer agent whose prompt contains ONLY: the voice profile path, the brief, the platform, the assigned structure, and the two shared docs' paths. One writer never sees another writer's voice or output — isolation is what prevents bleed; parallelism is just the bonus. Each writer self-verifies with scan + conform and saves to <scratch>/post-<slug>.txt.
Codex/opencode fallback (no auto-spawn): write them yourself SEQUENTIALLY, and before each post re-read that voice's profile in full and consciously drop the previous voice's rhythm; the verification gates below still catch bleed if you fail.
Verify the set, not just the posts.
- Per post:
scan ≤ 15 (≤ 20 formal voices) and conform PASS — re-check even though writers self-checked (writers grade homework; you grade writers).
- Across posts:
$IDIO overlap <scratch>/post-*.txt — any flagged pair (5-gram Jaccard > 0.12, or a shared distinctive phrase) means one of the two gets rewritten. Shared brief facts (product name, price) are fine; shared SENTENCES are the tell that kills campaigns.
- Blind pass: spawn
idiolect-auditor ONCE with all post files and platforms, nothing else — it flags any post that reads generated and any two that read same-authored. Fix what it catches.
Record and deliver. For each post: $IDIO ledger add --voice <s> --platform <p> --opener --shape --len --campaign "$CID" --file <post>. Then deliver each post in its own fenced block headed by — <voice display> · <platform>, followed by a receipts table:
| voice |
platform |
scan |
conform |
overlap |
structure |
| dale-hvac |
facebook |
6 clean |
PASS |
ok |
price/story/med |
Plus one texture: section listing any invented interior details across the set, per the honesty rules in _shared/craft.md.
Cadence and hygiene
- Same campaign rerun later? Pass
--exclude with the previous cast (or trust pick's recent-use penalty) so the same three people don't launch everything you make.
- Posting is the USER's act, on their accounts, under each platform's rules — this skill produces drafts and receipts, it does not automate accounts, and a campaign of N posts pretending to be N unrelated customers praising a product is astroturfing; the legitimate shape is N of YOUR channels/personas presenting YOUR thing in N registers. If a request crosses into fake-grassroots-consensus territory, say so and offer the legitimate shape.
1---2name: campaign3description: One brief, N posts, N genuinely different people — voice-isolated writers, cross-post overlap detection, per-post verification receipts. Use for launching/promoting something across multiple posts or platforms without the posts sharing a fingerprint.4---56# /idiolect:campaign — many voices, zero bleed78The failure mode of one writer producing N "different" posts is convergence: same skeleton, same rhythm, swapped adjectives. This skill prevents it structurally — each post is written in an isolated context that has seen ONLY its own voice, then the set is checked for overlap like the adversarial reviewer a real editor would be.910## Setup1112```bash13ROOT="${CLAUDE_PLUGIN_ROOT:-${CODEX_PLUGIN_ROOT:-$IDIOLECT_ROOT}}"14# unset everywhere (opencode)? ROOT = two directories up from this SKILL.md15IDIO="python3 $ROOT/scripts/idiolect.py"16CID="<campaign-name-or-date-slug>"17```1819## Flow20211. **Cast the voices.** Brief to a scratch file, then22 `$IDIO pick --platform <p> --brief-file <f> --n <N> --distinct --json`23 (per-platform picks if the campaign spans platforms — and pass `--exclude` with every already-cast slug on each subsequent pick, or the same voice will happily win two platforms). `--distinct` does greedy max-distance casting — announce the cast in one line each: who, platform, why they fit the brief. If the user named people fuzzily ("use the nurse and the sneaker guy"), resolve those against `$IDIO voices --json` first and fill the rest of the cast with `pick`. Nothing here requires the user to know a slug or a flag.24252. **Pre-assign structure.** Build a rotation table before any writing: no two posts share (opener, shape) even across different voices; lengths vary. This is the campaign-level variance guard; the per-voice ledger check comes free in step 3.26273. **Fan out, isolated.** For each (voice, platform, structure) row, spawn an **`idiolect-writer`** agent whose prompt contains ONLY: the voice profile path, the brief, the platform, the assigned structure, and the two shared docs' paths. One writer never sees another writer's voice or output — isolation is what prevents bleed; parallelism is just the bonus. Each writer self-verifies with `scan` + `conform` and saves to `<scratch>/post-<slug>.txt`.28 *Codex/opencode fallback (no auto-spawn):* write them yourself SEQUENTIALLY, and before each post re-read that voice's profile in full and consciously drop the previous voice's rhythm; the verification gates below still catch bleed if you fail.29304. **Verify the set, not just the posts.**31 - Per post: `scan` ≤ 15 (≤ 20 formal voices) and `conform` PASS — re-check even though writers self-checked (writers grade homework; you grade writers).32 - Across posts: `$IDIO overlap <scratch>/post-*.txt` — any flagged pair (5-gram Jaccard > 0.12, or a shared distinctive phrase) means one of the two gets rewritten. Shared brief facts (product name, price) are fine; shared SENTENCES are the tell that kills campaigns.33 - Blind pass: spawn **`idiolect-auditor`** ONCE with all post files and platforms, nothing else — it flags any post that reads generated and any two that read same-authored. Fix what it catches.34355. **Record and deliver.** For each post: `$IDIO ledger add --voice <s> --platform <p> --opener --shape --len --campaign "$CID" --file <post>`. Then deliver each post in its own fenced block headed by `— <voice display> · <platform>`, followed by a receipts table:3637 | voice | platform | scan | conform | overlap | structure |38 |---|---|---|---|---|---|39 | dale-hvac | facebook | 6 clean | PASS | ok | price/story/med |4041 Plus one `texture:` section listing any invented interior details across the set, per the honesty rules in `_shared/craft.md`.4243## Cadence and hygiene4445- Same campaign rerun later? Pass `--exclude` with the previous cast (or trust `pick`'s recent-use penalty) so the same three people don't launch everything you make.46- Posting is the USER's act, on their accounts, under each platform's rules — this skill produces drafts and receipts, it does not automate accounts, and a campaign of N posts pretending to be N unrelated customers praising a product is astroturfing; the legitimate shape is N of YOUR channels/personas presenting YOUR thing in N registers. If a request crosses into fake-grassroots-consensus territory, say so and offer the legitimate shape.