ktg-plugin-marketplace/plugins/linkedin-studio/assets
Kjell Tore Guttormsen 911871ff53 fix(linkedin-studio): ship placeholder voice profile, gitignore real, sentinel detection
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>
2026-05-30 00:23:32 +02:00
..
analytics refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
audience-insights refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
case-studies refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
checklists refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
drafts refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
examples refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
frameworks refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
plans refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
templates refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
voice-samples fix(linkedin-studio): ship placeholder voice profile, gitignore real, sentinel detection 2026-05-30 00:23:32 +02:00
quick-post-resources.md refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00
README.md refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0) 2026-05-29 11:32:02 +02:00

Personal LinkedIn Assets

This folder contains YOUR personalized content, frameworks, and insights that make this skill uniquely valuable to you.

How Assets Are Used

When you ask Claude to create content, it will:

  1. Check your PERSONALIZATION SETTINGS in SKILL.md
  2. Reference relevant assets from these folders
  3. Blend your authentic voice/examples with LinkedIn best practices
  4. Generate content that sounds like YOU, optimized for the algorithm

Folder Structure

/examples/

Store your best-performing posts for pattern analysis. Claude will study these to understand what works for YOUR audience and replicate those patterns in new content.

/templates/

Your custom post templates. When you develop a structure that works consistently, save it here so Claude can apply it to new content.

/frameworks/

Your proprietary frameworks, models, and methodologies. When creating content, Claude will reference YOUR frameworks instead of generic ones.

/case-studies/

Real examples from your work. Claude uses these for credibility and specificity instead of making up generic scenarios.

/research/

Industry research, data, and trends specific to your domain. Helps Claude create data-driven posts with current, relevant information.

/voice-samples/

Examples of your authentic writing from various contexts. Claude analyzes these to match your natural voice and style.

/audience-insights/

Your analytics, demographics, and engagement patterns. Claude uses this to optimize content for YOUR specific audience, not generic best practices.

/competitors/

Analysis of peers and influencers in your space. Helps identify content gaps and opportunities for differentiation.

Maintenance Schedule

Weekly (5 minutes)

  • Add your best post from the week to /examples/
  • Update posting time insights in /audience-insights/engagement-patterns.md

Monthly (15 minutes)

  • Analyze patterns in /examples/ and document learnings
  • Update demographics in /audience-insights/ based on LinkedIn analytics
  • Add any new frameworks developed to /frameworks/

Quarterly (30 minutes)

  • Refresh industry data in /research/
  • Update competitor analysis in /competitors/
  • Review and refine voice samples in /voice-samples/

Priority Hierarchy

If there's a conflict between:

  • Generic best practices (in /references/)
  • Your personal patterns (in /assets/)

→ Claude will prioritize YOUR patterns (with optimization suggestions if needed)

Exception: If your patterns actively harm algorithmic reach (external links, engagement bait), Claude will flag this and suggest alignment with platform mechanics while maintaining your authentic voice.

Getting Started

  1. Week 1: Fill in PERSONALIZATION SETTINGS in SKILL.md (15 minutes)
  2. Week 2-4: Add 2-3 voice samples to /voice-samples/ (20 minutes)
  3. Month 2: Start populating /examples/ with your successful posts (ongoing)
  4. Month 3: Add frameworks and case studies as they develop (ongoing)

The more you populate these folders, the more personalized and valuable this skill becomes. Think of it as a system that learns YOUR patterns over time.