ktg-plugin-marketplace/plugins/linkedin-studio/assets/voice-samples/authentic-voice-samples.md
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

70 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- VOICE_PLACEHOLDER -->
<!--
This is the SHIPPED PLACEHOLDER voice profile — neutral defaults, not anyone's
personal voice. The VOICE_PLACEHOLDER sentinel above keeps your voice
personalization score at 0 until you replace this file with your own profile.
To personalize: run `/linkedin:setup` (Voice samples) or `/linkedin:onboarding`.
Those workflows overwrite this file with a profile built from your own samples.
Prefer to start from a clean form? Copy `authentic-voice-samples.template.md`.
If you want to keep your real profile out of version control, save it as
`authentic-voice-samples.local.md` (gitignored) instead of editing this file.
-->
# Authentic Voice Samples — Placeholder (neutral defaults)
These are neutral, widely-applicable defaults so the plugin produces reasonable
content before you personalize. Replace them with your own voice via
`/linkedin:setup`. Until you do, the voice category scores 0.
## Core Voice Characteristics
1. **Solution-oriented** — frame problems with a path forward, not just complaints.
2. **Factually grounded** — base claims on evidence; acknowledge uncertainty openly.
3. **Non-judgmental** — explain without criticizing people, companies, or decisions.
4. **Curious and open** — treat "I don't know" as a starting point, not a weakness.
5. **Story-led** — open with a concrete example before the abstract point.
6. **Actionable** — end with something the reader can do, or a clear takeaway.
## Do's
- ✅ Open with a story or concrete example before the concept.
- ✅ Use clear, accessible language even for technical topics.
- ✅ Explain jargon on first use — assume intelligence, not prior knowledge.
- ✅ Show rather than tell.
- ✅ End with a specific, actionable takeaway.
- ✅ Keep standard posts concise (≈8001500 characters).
## Don'ts
- ❌ Corporate buzzwords ("game-changer", "leverage", "synergy", "disrupt").
- ❌ Criticizing people, companies, or decisions.
- ❌ Claims without evidence.
- ❌ More than 12 emojis per post.
- ❌ Generic motivational filler or preachy lecturing.
## Signature Phrases
_(Add the phrases you naturally use once you personalize this profile.)_
## Vocabulary Preferences
_(List the terms you always explain, and the words/phrases you avoid.)_
## Language Guidelines
- Write in one consistent language per post; keep it accessible to non-native readers.
- Prefer simple sentence structures for complex ideas.
## Instructions for Claude
This is a placeholder. When it is in place (sentinel present), treat the defaults
above as a reasonable baseline, and prompt the user to personalize via
`/linkedin:setup`. Once personalized, these instructions are replaced by the
user's own profile.
## Collected Post Samples
<!-- Posts are appended here automatically by the Stop hook after sessions where content is created. -->
<!-- The voice-trainer agent uses these for 6-dimension drift scoring. Needs 5+ samples for reliable results. -->