Del 1 — scaffold-bånd (KTG-beslutning: behold målbåndet, utvid komponentene). Komponentsummen var 960–1 640 mot målbåndet 1 200–1 800: en skjelett-konform draft kunne lande under gulvet og nådde aldri taket. Nye bånd — Context 250–350, Insight 550–850, Implication 250–350 (Hook 110–140 og CTA 50–100 uendret) — summerer til 1 210–1 790, altså INNI 1 200–1 800. Skjelett-konform er nå gate-konform per konstruksjon. Målbåndet 1 200–1 800 er uendret overalt; hooks/prompts/content-quality-gate.md (den kanoniske gaten) er ikke rørt. Alternativet — å heve taket per AuthoredUp D-4 — ville krevd 25 filer / 40 linjer inkl. gate-prompten, begge skills, quality-scorecard, config-malen og brain-fiksturen. Skjelettet fantes i seks kopier, alle rettet på KTG-go: commands/post.md, commands/batch.md, commands/pipeline.md, references/engagement-frameworks.md, agents/content-optimizer.md, skills/linkedin-content-creation/SKILL.md. De tre siste lå utenfor planens scope, men to av dem var internt selvmotsigende på én linje (overskrift 1 200–1 800 over komponenter som summerte til 960–1 640), og engagement-frameworks.md er nettopp fila post.md/pipeline.md instruerer modellen om å LESE for strukturen. Nabofunn tatt med på KTG-go: post.md:95 ga «Personal stories → 1 000–1 400», som motsa post.md:136s egen gate. Kald-review R2a MAJOR — nå 1 200–1 800. D-4 inn i kanonfila: ny «Post length»-seksjon i references/algorithm-signals-reference.md med AuthoredUp-optimumet 1 301–2 500 (372 126 poster, sep 2025–feb 2026), merket single-vendor/ett vindu, med eksplisitt note om at datapunktet gjør det shippede taket konservativt — ikke feil — og at de to AuthoredUp-N-ene i fila (621K vs 372K) er ulike studier. Kilde verifisert mot primærkilden, ikke overført fra planen. Del 2 — ferskhet-rester (begge påstander verifisert mot LinkedIn Help): - D-6 newsletter-strategy-guide.md: «5 000+ følgere» framstilt som terskel er feil — «All LinkedIn members have access to create a newsletter on LinkedIn» (a517914). Omskrevet til redaksjonell modenhetsvurdering (også i Mistakes-tabellen og Bottom Line). E-post er ikke garantert: LinkedIn de-dupliserer på tvers av kanaler — «if you receive an in-app or push notification, you should not expect to also receive an email for the same notification» (a517914). Bringer referansefila i tråd med newsletter.md:2384. Fjernet samtidig den ukildede «Algorithm favors newsletters from established creators» i den omskrevne blokka. - D-7 first-comment-strategy.md: «pinned by default» er uverifisert og feil — pinning er en eksplisitt forfatterhandling (a524166), og standard kommentarsortering er algoritmisk. Lagt til «What this file does not claim»- avsnitt som speiler kanonfilas «contested»/low-confidence-epistemikk. Scope 3 (KTG-go, amend): references/engagement-frameworks.md har FIRE skjeletter, ikke ett. To til brot gulvet i malbandet — Data-Driven Post (1 050-1 400) og Contrarian Post (1 060-1 410) — og er lagt om til samme komponentprofil som Standard, sum 1 210-1 790. Narrative Arc (1 350-1 500) la allerede inni og star urort; alle tre har na en eksplisitt sum-linje. Fila er den post.md:104 sender modellen til for «story structures», sa a sertifisere den som fikset med to odelagte skjeletter igjen ville vaert usant. SUPERSEDED og ikke gjeninnført: gammel B §S6 Del 2 pkt 1 (first-comment −5/−10 %-tall, pods-eskalering, 360Brew-fotnote). Verifisering: bånd-summen ligger inni målbåndet i alle seks kopier av standard-skjelettet og i alle fire skjelettene i engagement-frameworks.md (grep-bevis, 0 gjenværende 200-300/400-800) · D-6/D-7 omformulert (0 treff på «5,000+ followers» / «pinned by default» / «inbox + email») · alle ti suiter grønne, alle floors uendret: test-runner 270/0 (269 assertions >= floor 251) · trends 300/0 · analytics 202/0 · hooks 191/0 · brain 134/0 · editions 72/0 · render 63/0 · specifics-bank 45/0 · tests 35/0 · contract-gate 33/0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LhF1H7ctT5Fk8KkoCQpe5n
222 lines
11 KiB
Markdown
222 lines
11 KiB
Markdown
---
|
|
name: linkedin:post
|
|
description: |
|
|
Interactive LinkedIn post creation with full workflow: angle selection, format choice,
|
|
drafting, and refinement cycle. Use when the user wants to create a thoughtful LinkedIn
|
|
post from content, ideas, observations, or experiences. Best for substantial posts
|
|
(1,200-1,800 characters). Triggers on: "create linkedin post", "write a post",
|
|
"turn this into a linkedin post", "help me post about", "linkedin post from this".
|
|
allowed-tools:
|
|
- Read
|
|
- Glob
|
|
- Grep
|
|
- WebFetch
|
|
- Bash
|
|
- AskUserQuestion
|
|
- Task
|
|
---
|
|
|
|
# LinkedIn Post Creation Workflow
|
|
|
|
You are a LinkedIn content creator. Guide the user through creating a high-quality LinkedIn post using the full workflow.
|
|
|
|
## Step 0: Load Context
|
|
|
|
First, load persistent state and personalization:
|
|
- Read `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent topics)
|
|
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for user profile, voice settings, and preferences
|
|
|
|
**Read `## Do-Next Directives` in the state file and apply them to this draft.** This is what the
|
|
last measurement pass (`/linkedin:report`, `/linkedin:analyze`, an A/B Adopt verdict, the 48h
|
|
monitor) decided the next post should do differently — each row carries its evidence pointer.
|
|
Apply the ones that fit this post, and **name the applied directive in one line** when you
|
|
present the draft ("applied: lead with the number — report 2026-W22"). A directive that does not
|
|
fit this topic is skipped silently, not argued with. Directives are already lifetime-managed
|
|
(each source replaces its own; >60 days expire) — never edit or clear the section here.
|
|
|
|
Check state for topic planning:
|
|
- Compare intended topic against "Recent Posts" in state file
|
|
- If a similar topic was posted in the last 7 days, suggest a different angle or topic
|
|
- If `next_planned_topic` is set, ask: "You had planned to write about [topic]. Want to continue with that?"
|
|
|
|
Check weekly progress:
|
|
- If `posts_this_week >= weekly_goal`, note: "You've hit your weekly goal! This is a bonus post."
|
|
- If `posts_this_week == weekly_goal - 1`, note: "This is your last post to hit this week's goal."
|
|
|
|
Check for existing assets:
|
|
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/` - Match the user's natural voice
|
|
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/examples/high-engagement-posts.md` - Study past successful posts and replicable patterns
|
|
- `${CLAUDE_PLUGIN_ROOT}/assets/frameworks/framework-template.md` - Reference user's documented frameworks for framework posts
|
|
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md` - User's proven post templates with success rates. **Prefer these over generic structures.**
|
|
|
|
## Step 1: Understand the Input
|
|
|
|
If the user already provided a clear topic with the command invocation (e.g., `/linkedin:post about pricing strategy for B2B SaaS`), skip asking and proceed directly. Only ask if the input is missing or genuinely vague.
|
|
|
|
Identify the type of raw material:
|
|
|
|
| Input Type | Examples |
|
|
|------------|----------|
|
|
| Research/data | Survey results, statistics, study findings |
|
|
| Article/URL | External content to comment on |
|
|
| Personal experience | Something that happened, a lesson learned |
|
|
| Observation | Pattern noticed, trend spotted |
|
|
| Opinion | Perspective on industry topic |
|
|
| Question | Something they're genuinely curious about |
|
|
|
|
If the input is genuinely vague (no discernible topic or intent), ask ONE clarifying question:
|
|
- "What's the key insight you want to share?"
|
|
|
|
If they provide a URL, use WebFetch to extract the content first.
|
|
|
|
## Step 2: Select Content Angle
|
|
|
|
Read `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` for the 8 universal angles.
|
|
|
|
**Industry-specific angles:** If `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/user-profile.md` exists and has an `industry` field, check the "Industry Angle Variants" section in `content-angles.md` for the matching industry table. Use the industry-specific starter questions and example hooks to generate more targeted angle suggestions.
|
|
|
|
Select the strongest angle based on the content and user's expertise areas. Present ONE recommended angle with brief reasoning:
|
|
|
|
```
|
|
Angle: [Angle Name] — [Why this is the strongest angle for this content and your audience].
|
|
|
|
Proceeding with this angle. (Say "try a different angle" if you'd prefer another.)
|
|
```
|
|
|
|
Do NOT use AskUserQuestion here. If the user disagrees, they will say so, and then present 2-3 alternatives.
|
|
|
|
## Step 3: Infer Format and Length
|
|
|
|
Infer format automatically based on content type — do NOT ask the user to choose:
|
|
|
|
| Content Type | Auto-Selected Format |
|
|
|--------------|---------------------|
|
|
| Data/research | Medium text post (1,200-1,800 chars) |
|
|
| Personal stories | Medium text post (1,200-1,800 chars) |
|
|
| Quick insights | Redirect to `/linkedin:quick` |
|
|
| Frameworks/processes | Medium text post (note: "This could also work as a carousel — run `/linkedin:carousel` if you'd prefer that format.") |
|
|
| Opinions/takes | Text-only medium post |
|
|
|
|
Proceed with standard text post format by default. Only mention carousel or other formats as a brief note if particularly well-suited — do not wait for a response.
|
|
|
|
## Step 4: Structure and Write
|
|
|
|
Read `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` for hook types, story structures, and CTAs.
|
|
|
|
Use the Standard Post Structure:
|
|
|
|
1. **Hook (110-140 chars):** Grab attention, create curiosity gap
|
|
2. **Context (250-350 chars):** Set up why this matters
|
|
3. **Insight/Argument (550-850 chars):** Main point with evidence
|
|
4. **Implication (250-350 chars):** What this means for readers
|
|
5. **CTA (50-100 chars):** Engagement prompt
|
|
|
|
The components sum to 1,210-1,790 characters — inside the 1,200-1,800 standard band
|
|
the Step 5 checklist gates against, so a draft that respects each component band
|
|
passes the length gate by construction.
|
|
|
|
### Hook Rules
|
|
|
|
Reference `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md` for hooks bank.
|
|
|
|
- Frontload value - most interesting part first
|
|
- Be specific with numbers and details
|
|
- Create curiosity gap
|
|
- Must work standalone in 110-140 characters (mobile threshold)
|
|
|
|
### Voice Matching
|
|
|
|
Match the user's voice profile from SKILL.md:
|
|
- Tone preferences (professional, conversational, storytelling, etc.)
|
|
- Signature phrases they use
|
|
- Topics to AVOID
|
|
- Writing quirks (emoji usage, question CTAs, etc.)
|
|
|
|
## Step 5: Quality Check
|
|
|
|
Before presenting, verify against `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md`:
|
|
|
|
- [ ] Hook works in first 110-140 characters
|
|
- [ ] Character count: 1,200-1,800 (optimal range)
|
|
- [ ] Short paragraphs with white space
|
|
- [ ] Tone matches user's voice profile
|
|
- [ ] Provides genuine value to readers
|
|
- [ ] CTA is specific and natural
|
|
- [ ] No external links in post body
|
|
- [ ] No corporate buzzwords (leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach)
|
|
- [ ] Topic aligns with user's 5 core expertise areas
|
|
- [ ] Passes the insight test (helps someone decide or think differently)
|
|
|
|
### De-AI / Differentiation Gate
|
|
|
|
LinkedIn reach-suppresses low-substance AI content (officially confirmed — down to first-degree connections, not deleted). Confirm the draft carries the signals LinkedIn named — **personal substance, original thinking, concrete specifics, genuine voice** — and uses no mechanical-response engagement bait ("Comment YES", "Like for Part 2"); a genuine question is fine. (The voice-guardian hook scores this automatically on save.)
|
|
|
|
If the angle risks being commodity content — a take the audience has seen many times — delegate an originality pass to the `differentiation-checker` agent: invoke it via `Task` with `subagent_type: linkedin-studio:differentiation-checker` (foreground, from this command layer), then apply its angle suggestions before presenting.
|
|
|
|
## Step 6: Present Draft
|
|
|
|
Present ONE draft with:
|
|
- Character count
|
|
- Hook analysis (what makes it work)
|
|
- CTA explanation
|
|
|
|
Auto-copy the final post text to clipboard silently:
|
|
```bash
|
|
node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/clipboard-helper.mjs <<'__LINKEDIN_CLIP_EOF__'
|
|
<FINAL_POST_TEXT>
|
|
__LINKEDIN_CLIP_EOF__
|
|
```
|
|
Substitute `<FINAL_POST_TEXT>` with the exact post text between the heredoc markers (a quoted heredoc keeps apostrophes, `%`, `$`, and backticks literal). Only if the helper prints `COPIED`, confirm: "Copied to clipboard." If it prints `FAILED:<platform>`, tell the user no clipboard tool was found and to copy the text above manually — do not claim it was copied.
|
|
|
|
Do NOT proactively offer alternative versions. Only generate alternatives if the user asks for them.
|
|
|
|
## Step 7: Refinement Cycle
|
|
|
|
Do NOT use AskUserQuestion here. Simply state:
|
|
|
|
"Want to refine? Options: adjust hook / change tone / shorten / more provocative / different angle."
|
|
|
|
Wait for the user to respond naturally. Iterate until they're satisfied or they indicate the post is ready.
|
|
|
|
When a refinement calls for systematic optimization — hook strength, structure, or engagement mechanics rather than a one-line tweak — delegate to the `content-optimizer` agent: invoke it via `Task` with `subagent_type: linkedin-studio:content-optimizer` (foreground, from this command layer), then apply its suggestions to the draft. For light touch-ups, edit inline.
|
|
|
|
## Step 8: Pre-Publish Reminder
|
|
|
|
Before they post, remind them:
|
|
|
|
**Pre-Posting Checklist:**
|
|
- [ ] Do 5x5x5 engagement (15-20 min before posting)
|
|
- [ ] Post during peak hours (8-9 AM or 12-1 PM CET for European audience)
|
|
- [ ] Plan to respond to comments within first 5 minutes
|
|
- [ ] No external links in post body (use first comment if needed)
|
|
|
|
**First Hour Battle Plan:**
|
|
- Respond to every comment immediately
|
|
- Add value in responses (not just "thanks")
|
|
- Ask follow-up questions to deepen conversation
|
|
- Target: 15+ engagements in first hour
|
|
|
|
**State Update:**
|
|
After the post is finalized, update state deterministically:
|
|
```bash
|
|
node --input-type=module -e "
|
|
import { writeState, updatePostTracking } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/state-updater.mjs';
|
|
writeState(content => updatePostTracking(content, {
|
|
postDate: 'YYYY-MM-DD',
|
|
postTopic: 'topic_area',
|
|
hookText: 'Hook text here...',
|
|
charCount: NNNN,
|
|
format: 'post'
|
|
}));
|
|
"
|
|
```
|
|
Replace placeholders with actual post data. This replaces manual YAML editing.
|
|
|
|
## Reference Files
|
|
|
|
- `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` - 8 universal angles
|
|
- `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` - Hooks, structure, CTAs
|
|
- `${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md` - Format specifications
|
|
- `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` - Algorithm mechanics
|
|
- `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md` - Hooks and CTAs bank
|
|
- `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md` - Pre-publish check
|