Sixth step (after the swap — text AFTER the creative). Takes the Idea Pool card + the finished creative (05) and
writes publish-ready text in the author's voice. Does not write from scratch itself — a router over the process
linkedin-post-writing (Viktor's steps: idea → problem+meat → copywriting framework →
summary → trailer → humanize → format), tied to the idea/creative, and closes grade gate
(blind judge by rubric, step 8) before showing.
Input: $ARGUMENTS — idea (with creative from 05) + client. If there is no creative yet and the format ≠
text-only — first content-engine:05-creative.
What we read
- Idea Pool card: hook draft · pillar · funnel · format · competence proof · notes · source.
- Creative (05): for a carousel — slide content (text = only a one-line caption); for single image / infographic — the full post for the visual.
- Strategy (Notion) Section 6 Voice + skill
about-viktor: tone, signature, brand patterns, "WHAT WE NEVER WRITE". - Rules:
${CLAUDE_PLUGIN_ROOT}/reference/hook-bank.md(hooks) +${CLAUDE_PLUGIN_ROOT}/reference/methodology.md§3 (frameworks/structure/formatting), §4 (distribution).
Process (reuse linkedin-post-writing)
- Framework by type: PAS (contrarian/problem) · BAB (case/how-i) · AIDA (giveaway/hand raiser).
- Hook: take the hook draft from the card → generate 2-3 variants per the hook-bank (7-10 words, a number in 8/10, no emoji in the 1st line, 2 keywords) → pick the best, save the rest in Notes for reuse.
- Structure (all formats EXCEPT carousel): trailer(hook+rehook) → problem(+reinforcement) → meat → summary(+CTA). Case study (BOFU) — 8 elements (§3.7). Carousel — only a one-line caption.
- Numbers — only from patron facts (strategy Section 9), not invented.
- Humanize: run through
anticopywriting-ai— remove AI traces (long dashes, the "not X, but Y" template, bureaucratese); check against "WHAT WE NEVER WRITE". - Format: "herringbones", short lines, rhythm; target 120-250 words (900-1700 characters), ceiling 300 (§3.5).
- CTA: directives — a command, a comment-gate, or "write in DMs". NEVER a question.
- Grade gate (blind judge): run the assembled draft through
${CLAUDE_PLUGIN_ROOT}/reference/grader-rubric.md.- First the structural pre-gate (section in the rubric): myth flip, triad, mirror pair, reversal, upsell via comma, empty buildup, dash, even rhythm. It worked → we fix and check again, we spawn the judge only on a clean draft. Automatable by a detector from the skill
anticopywriting-ai. - Separate subagent (Task, clean context) — do NOT grade in the same call, otherwise self-deception. It gives ONLY: text + type/format + "WHAT WE NEVER WRITE" + rubric. It does not give backstory (why the idea, reference, hook draft).
- The judge returns JSON:
scoresacross 7 categories ·total·hard_fails·lowest·one_fix. - Gate = pre-gate clean AND total ≥ 90 AND hard_fails empty. Not taken → we fix hard_fails first, then
lowest(applyone_fix) → rescore with a fresh subagent (not "tweaking"). Repeat. - Stop after 3 iterations without a gate → show the draft with the note "gate not taken, weakest = X", the decision is with the human. Silent auto-ship below 90 is forbidden.
- Skipping the gate is not allowed: we show the post to the user only after it is taken (or with an explicit flag).
- First the structural pre-gate (section in the rubric): myth flip, triad, mirror pair, reversal, upsell via comma, empty buildup, dash, even rhythm. It worked → we fix and check again, we spawn the judge only on a clean draft. Automatable by a detector from the skill
Distribution playbook (add to the post)
З methodology.md §4: T-20min comments to the cluster · time · first hour nurture · link in body (conversion)
or without links (reach) — NOT in the first comment · self-repost 4-6h ×1 · 0 hashtags · saves-CTA.
Output
- Publish-ready post (text + link to the creative) — show it to the user only AFTER the gate is taken; in the summary the final
totalscore. - Posts DB: create a draft (Name=hook, pillar/funnel/format copy, Idea relation, draft status,
grader_score= final total,grader_iterations= how many rounds). - Idea Pool: card →
Status = written,Last used= date. - Telegram channel "LinkedIn Drafts" (when we connect a token/n8n): post + creative + playbook.
- Summary: finished post, what's next (manual publication → then metrics into the tracking tool).
Definition of Done
- Text in the author's voice; anticopywriting passed; "WHAT WE NEVER WRITE" observed.
- Hook per hook-bank (≤10 words, a number if appropriate); 2-3 variants, the best chosen.
- Structure by type (carousel = caption; case = 8 elements); numbers only from fact-patterns.
- No comment-to-get; distribution playbook attached.
- Grade gate passed (blind subagent, total ≥ 90, 0 hard_fails) OR explicit flag "gate not passed" after 3 iterations.
- Posts DB draft created (with
grader_score); Idea Pool → written; summary returned (with final score).