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>
70 lines
2.9 KiB
Markdown
70 lines
2.9 KiB
Markdown
<!-- 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 (≈800–1500 characters).
|
||
|
||
## Don'ts
|
||
|
||
- ❌ Corporate buzzwords ("game-changer", "leverage", "synergy", "disrupt").
|
||
- ❌ Criticizing people, companies, or decisions.
|
||
- ❌ Claims without evidence.
|
||
- ❌ More than 1–2 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. -->
|