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>
This commit is contained in:
parent
798484bf0c
commit
911871ff53
8 changed files with 198 additions and 209 deletions
|
|
@ -139,7 +139,13 @@ Use AskUserQuestion:
|
|||
4. "Paste a paragraph you've written that sounds like YOU (email, doc, anything)"
|
||||
5. "Any words or phrases you'd NEVER use?"
|
||||
|
||||
Save responses to `assets/voice-samples/authentic-voice-samples.md` under a new section `## Quick Voice Interview` (append, don't overwrite existing content).
|
||||
Save the responses to `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 answers — the
|
||||
`<!-- VOICE_PLACEHOLDER -->` sentinel must NOT remain, or the voice score stays at
|
||||
0 after the user fills it in. **If the file is already a populated profile**, add a
|
||||
`## Quick Voice Interview` section instead of overwriting. Either way, the final
|
||||
file must contain no `<!-- VOICE_PLACEHOLDER -->`.
|
||||
|
||||
**If user profile selected:** Ask for:
|
||||
1. Full name
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ Read these 8 asset files and detect placeholder patterns to calculate the curren
|
|||
|
||||
| Category | Weight | File/Directory | Placeholder Detection |
|
||||
|----------|--------|----------------|----------------------|
|
||||
| Voice samples | 25 | `assets/voice-samples/authentic-voice-samples.md` | Check for `[Your Name]` or if file has <50 lines |
|
||||
| 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`) |
|
||||
|
|
@ -96,14 +96,19 @@ Based on their answer, run the corresponding sub-workflow below.
|
|||
- How they handle technical depth
|
||||
- How they conclude (CTA style, takeaway style)
|
||||
4. Read the existing `assets/voice-samples/authentic-voice-samples.md`
|
||||
5. **Merge** new findings with existing content (don't overwrite existing data):
|
||||
5. **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
|
||||
|
||||
6. Write the updated file back.
|
||||
6. 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.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue