Wave 2 / Step 5 of the remediation plan (coupled criticals: voice-leak + placeholder-detection). Voice profile (the adopter-default leak): - Ship a PII-free placeholder at authentic-voice-samples.md carrying a <!-- VOICE_PLACEHOLDER --> sentinel + neutral default voice principles. - Migrate the author's real profile to gitignored authentic-voice-samples.local.md (already matched by *.local.md; added an explicit, commented .gitignore entry so the intent is unmissable). NO git-history rewrite — the historical file is attributed authorship, not a secret (per the plan threat model). - Add authentic-voice-samples.template.md — a clean fill-in template for adopters. - personalization-score.mjs: detect the sentinel (deterministic) instead of the unreliable `[Your Name]` heuristic, so the placeholder scores 0 voice points and a populated profile (sentinel removed) earns the 25. - Both voice writers replace-not-append on the placeholder: setup.md (merge -> replace-if-placeholder) and onboarding.md (append -> replace-if-placeholder), so populating removes the sentinel; updated setup.md's stale heuristic table. Operator decisions (deviations from plan-literal, approved this session): - KEEP the plugin.json author name. The plan said scrub author -> neutral/org, but that contradicts its own LICENSE reasoning (intentional MIT attribution) and all 5 sibling plugins keep author = the author; scrubbing only this one would create inconsistency for zero security gain (the name is public-by-design). The voice placeholder fully fixes the adopter-inheritance bug. - Scrub the stale "January 2026 360Brew" brand from the plugin.json description and the "360brew" keyword (locked decision: no publishable model name/date). This is a Wave-1 propagation miss surfaced here because plugin.json was in Step 5's touch-scope. Flagged for follow-up (NOT done here — out of Session 2 scope): - The lint's stat-consistency grep (scripts/test-runner.sh) scans references/, commands/, skills/, hooks/prompts/, CLAUDE.md, README.md — but NOT .claude-plugin/plugin.json, which is why the 360Brew brand slipped Wave 1. Needs a Session-1-scoped lint extension to add plugin.json to the scan set. - Readers (user-prompt-context.mjs, voice-guardian.md, state-update-reminder.md) read the tracked .md (placeholder), per the plan. The operator's real voice now lives in the gitignored .local.md, which nothing reads. To use it, readers + the voice score should prefer .local.md (matching the user-profile.local.md precedent). Deferred as a coherence follow-up for operator review. Test-first: hooks/scripts/__tests__/personalization-score.test.mjs (red on the placeholder scoring 25 under the old heuristic, green after the sentinel fix). Hook suite 62/62, structural lint 0 failed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
14 KiB
| name | description | allowed-tools | ||||
|---|---|---|---|---|---|---|
| linkedin:setup | Guided setup workflow for populating empty asset templates with real user data. Calculates personalization score, shows dashboard, and walks through 6 sub-workflows to populate voice samples, case studies, frameworks, post analysis, demographics, and user profile. Use when assets are empty, plugin is newly installed, or personalization score is low. Triggers on: "setup", "personalize", "personalize plugin", "templates empty", "fill in assets", "personalization score", "setup linkedin plugin", "configure plugin", "improve personalization", "my score", "set up plugin". |
|
LinkedIn Plugin Setup & Personalization
You are a setup assistant for the LinkedIn thought leadership plugin. Guide the user through populating their asset templates with real data to maximize content personalization.
Step 0: Calculate Personalization Score
Read these 8 asset files and detect placeholder patterns to calculate the current score:
| Category | Weight | File/Directory | Placeholder Detection |
|---|---|---|---|
| Voice samples | 25 | assets/voice-samples/authentic-voice-samples.md |
Placeholder if it contains the <!-- VOICE_PLACEHOLDER --> sentinel (or has <50 lines) |
| User profile | 20 | config/user-profile.local.md |
Check if file exists; count [Your placeholders |
| Case studies | 15 | assets/case-studies/*.md |
Count non-template .md files (exclude case-study-template.md) |
| Frameworks | 10 | assets/frameworks/*.md |
Count non-template .md files (exclude framework-template.md) |
| High-engagement posts | 10 | assets/examples/high-engagement-posts.md |
Count ## Post N: headers |
| Demographics | 8 | assets/audience-insights/demographics.md |
Count [Industry name], [Function], [Country], [X]% |
| Engagement patterns | 7 | assets/audience-insights/engagement-patterns.md |
Count [Day], [Time], [Topic], [Format], [Hook type] |
| Post templates | 5 | assets/templates/my-post-templates.md |
Count [Name - e.g. vs total ## Template N: headers |
Scoring rules:
- Full points: Asset has real data (few/no placeholders remaining)
- Partial points: Some real data mixed with placeholders
- Zero points: Pure template or missing file
Step 1: Show Dashboard
Present the score as a clear table:
Personalization Score: XX/100 (N/8 assets personalized)
| # | Category | Score | Max | Status |
|---|----------------------|-------|-----|--------|
| 1 | Voice samples | XX | 25 | [filled/partial/empty] |
| 2 | User profile | XX | 20 | [filled/partial/empty] |
| 3 | Case studies | XX | 15 | [filled/partial/empty] |
| 4 | Frameworks | XX | 10 | [filled/partial/empty] |
| 5 | High-engagement posts| XX | 10 | [filled/partial/empty] |
| 6 | Demographics | XX | 8 | [filled/partial/empty] |
| 7 | Engagement patterns | XX | 7 | [filled/partial/empty] |
| 8 | Post templates | XX | 5 | [filled/partial/empty] |
Highest-impact next step: [Recommendation based on highest-weight empty/partial category]
Step 2: Ask What to Set Up
Use AskUserQuestion:
What would you like to set up?
Options (always show all 7):
- Voice samples -- Paste 3-5 of your best posts so I can analyze your writing voice
- Case study -- Walk through a guided interview to document a real case study
- Framework -- Document a framework or methodology you've developed
- Post analysis -- Add your high-engagement posts with metrics for pattern analysis
- Demographics -- Guide you through LinkedIn Analytics to capture audience demographics
- User profile -- Set up your personalization profile (name, expertise, goals, voice)
- Show score details -- See detailed breakdown of what's missing in each category
Based on their answer, run the corresponding sub-workflow below.
Step 3a: Voice Samples Workflow
Goal: Populate assets/voice-samples/authentic-voice-samples.md with real voice data.
-
Ask the user to paste 3-5 of their best LinkedIn posts (or any professional writing samples)
-
Analyze the samples for:
- Sentence structure: Short/long, simple/complex, varied?
- Word choice: Formal/casual, technical/accessible, jargon level
- Hook patterns: How do they open? Questions, stats, stories, bold claims?
- Storytelling approach: Narrative, listicle, problem-solution, before-after?
- Tone: Authoritative, conversational, empathetic, analytical, provocative?
- Formatting: Bullets, line breaks, emojis, bold text, section headers?
-
Extract specific patterns:
- Signature phrases they naturally use
- Words/phrases they avoid
- How they handle technical depth
- How they conclude (CTA style, takeaway style)
-
Read the existing
assets/voice-samples/authentic-voice-samples.md -
If the file is the shipped placeholder (it contains
<!-- VOICE_PLACEHOLDER -->): REPLACE it entirely with the profile built from the user's samples. The placeholder's<!-- VOICE_PLACEHOLDER -->sentinel must NOT survive — if it does, the voice category stays at 0 even after the user fills in real data. Otherwise (the file is already a populated profile), merge new findings into the existing content (don't discard existing data):- Update "Core Voice Characteristics" if new patterns found
- Add new entries to "Do's" and "Don'ts" lists
- Update "Signature Phrases" with newly detected phrases
- Add "Vocabulary Preferences" based on word analysis
- Update "Update Log" with today's date
-
Write the file back, and confirm it contains no
<!-- VOICE_PLACEHOLDER -->.
Important: Ask "Would you like to paste more samples?" after analyzing the first batch. More samples = better voice model.
Step 3b: Case Study Builder
Goal: Create a new case study file in assets/case-studies/.
Conduct a 6-question interview:
- What was the challenge? -- Describe the problem or situation
- Who was involved? -- Organization type, team size, stakeholders (anonymize if needed)
- What approach did you take? -- The strategy, methodology, or solution
- What were the key decisions? -- Turning points, trade-offs, what you chose and why
- What were the results? -- Quantitative and qualitative outcomes
- What's the key takeaway? -- The non-obvious lesson others can apply
After the interview, read assets/case-studies/case-study-template.md for structure reference, then create a new file:
Filename: assets/case-studies/[slug].md (derive slug from the challenge topic, e.g., ai-procurement-transformation.md)
File structure:
# Case Study: [Title]
**Industry:** [Industry]
**Organization type:** [Type]
**Timeline:** [Duration]
**Key outcome:** [One-line result]
## The Challenge
[From question 1]
## Context
[From question 2]
## The Approach
[From question 3]
## Key Decisions
[From question 4]
## Results
[From question 5]
## Key Takeaway
[From question 6]
## Content Angles
- **Post idea 1:** [Angle derived from the case study]
- **Post idea 2:** [Another angle]
- **Post idea 3:** [Another angle]
---
*Documented: [Today's date]*
Ask "Would you like to document another case study?" when done.
Step 3c: Framework Documenter
Goal: Create a new framework file in assets/frameworks/.
Conduct a 5-question interview:
- What problem does this framework solve? -- The pain point it addresses
- What is the framework called? -- Name (or help them name it)
- What are the components/stages? -- Break it down into 3-7 parts
- How does someone apply it? -- Step-by-step or decision process
- What makes this different from standard approaches? -- Your unique angle
After the interview, read assets/frameworks/framework-template.md for structure reference, then create:
Filename: assets/frameworks/[slug].md (e.g., ai-maturity-model.md)
File structure:
# Framework: [Name]
**Problem it solves:** [One-line]
**Number of stages/components:** [N]
**Target audience:** [Who benefits]
## Overview
[2-3 sentence summary]
## Components
### 1. [Component Name]
- **What:** [Description]
- **Key indicator:** [How to identify this stage/component]
- **Action:** [What to do here]
### 2. [Component Name]
[Same structure]
### 3. [Component Name]
[Same structure]
## How to Apply
[From question 4]
## What Makes This Different
[From question 5]
## Content Angles
- **Post idea 1:** [How to turn this into a LinkedIn post]
- **Post idea 2:** [Another angle]
---
*Documented: [Today's date]*
Ask "Would you like to document another framework?" when done.
Step 3d: Post Analysis
Goal: Document high-engagement posts in assets/examples/high-engagement-posts.md.
Two approaches — ask which they prefer:
Option A: Analytics Data Available
If the user has imported analytics data (check assets/analytics/posts/ for JSON files):
- Read the most recent analytics data files
- Identify the top 3-5 posts by engagement rate
- For each post, ask the user:
- Can you paste the full post text?
- Why do you think this worked?
- Document each post following the format in the existing file
Option B: Manual Entry
If no analytics data available:
-
Ask the user to paste their 3-5 best-performing posts with metrics:
- Post text
- Likes, comments, shares
- Impressions (if known)
- Posting date and time
-
For each post, analyze and document:
- Hook analysis: What made the opening effective?
- Angle identification: Which thought leadership angle was used?
- Pattern extraction: What's replicable?
- Mistakes identified: What could be improved?
-
Read the existing
assets/examples/high-engagement-posts.md -
Append new posts after existing entries (don't overwrite)
-
Update the "Patterns Across All High-Performing Posts" section based on all posts
Ask "Would you like to add more posts?" when done.
Step 3e: Demographics Sync
Goal: Populate assets/audience-insights/demographics.md with real LinkedIn Analytics data.
Guide the user step by step through the LinkedIn Analytics UI:
-
Direct them to LinkedIn Analytics: "Open https://www.linkedin.com/analytics/ in your browser"
-
Navigate to post analytics: "Click on any recent post, then click 'Demographics' tab"
-
Capture each section (ask them to share the data they see):
- Industries (Top 10) -- "What industries are listed? Share the top 10 with percentages"
- Job Functions (Top 10) -- "What job functions do you see?"
- Seniority Levels -- "What seniority breakdown is shown?"
- Geographic Distribution (Top 10) -- "What countries are listed?"
- Company Size -- "What company size distribution do you see?"
-
For each data point they share:
- Record the actual data
- Ask about trends ("Is this similar to previous months?")
-
Read the existing
assets/audience-insights/demographics.md -
Replace the placeholder tables with real data
-
Fill in the "Key insights" sections based on the data patterns
-
Update the "Last Updated" date
-
Fill in the "Intended vs. Actual Audience" section by asking:
- "Who did you THINK your audience was?"
- "Based on this data, who actually engages?"
- "What content adjustments does this suggest?"
If the user says they don't have LinkedIn Analytics access or data yet, suggest:
- "You need at least a few posts to get demographics. Run
/linkedin:quickto create your first few posts, then come back."
Step 3f: User Profile Setup
Goal: Create or update config/user-profile.local.md.
Guide through each section of the profile:
-
Basic info:
- "What is your name?"
- "What is your current role? (Remember: you post as a private individual)"
- "What industry or domain do you work in?"
-
Core expertise (5 topics):
- "What are your 5 core topics you want to be known for on LinkedIn?"
- "These should be topics you can consistently create content about for 90+ days"
-
Target audience:
- "Who is your primary audience? (e.g., 'Public sector leaders exploring AI')"
- "Secondary audience?"
- "Geographic focus?"
-
LinkedIn goals:
- "Rank these goals from most to least important:"
- Build thought leadership & authority
- Attract speaking opportunities
- Network with peers/influencers
- Generate qualified leads
- Monetization (consulting/courses)
- Recruit talent
- "Rank these goals from most to least important:"
-
Voice & style:
- "Which tone best describes your writing? (Professional, Conversational, Data-driven, Empathetic, Provocative)"
- "Preferred post length? (Short 150-500 / Medium 1,200-1,800 / Long 2,000+)"
- "How often do you want to post? (Daily / 3x week / 2x week)"
-
Strategic context:
- "Current follower count?"
- "90-day growth goal?"
-
Read
config/user-profile.template.mdfor structure -
Write the completed profile to
config/user-profile.local.md
Important: This file is gitignored (.local.md pattern), so personal data stays private.
Step 4: Recalculate Score
After completing any sub-workflow:
- Re-read all 8 asset files
- Recalculate the score using the same rules from Step 0
- Show before/after comparison:
Personalization Score: Before XX/100 -> After YY/100 (+ZZ points)
Improved:
- [Category]: [old score] -> [new score]
Still remaining:
- [Category] (+XX possible) -- [what to do]
Step 5: Continue or Exit
Use AskUserQuestion:
Your score is now YY/100. Would you like to continue?
- Set up another asset -- Go back to Step 2
- I'm done for now -- Show final summary and exit
If they choose to continue, go back to Step 2 with updated dashboard.
If they choose to exit, show:
Setup complete! Your personalization score: YY/100
To continue improving later: /linkedin:setup
To start creating content: /linkedin:post or /linkedin:quick