fix(linkedin-studio): N20 — CLAUDE_PLUGIN_ROOT-normalisering av load-bearing ref-stier [skip-docs]

81 load-bearing stier i 16 kommandofiler pinnet til ${CLAUDE_PLUGIN_ROOT}/.
Rene prefikser: 81 inn / 81 ut, ingen linje lagt til eller fjernet.

FASIT-VERIFISERING (premiss-sjekk mot BASELINE, ikke bare HEAD): planens
68 linjer / 17 filer er RIKTIG mot sin egen baseline 882f6ee. HEAD ga 73/18 —
altså ekte kode-drift siden baseline (newsletter.md 11→15, calendar.md 0→1),
ikke en telle-feil som i N19.

SCOPE UTVIDET ETTER GO: planens grep (references|hooks/scripts|scripts) har en
blindsone — skills/ assets/ config/ render/ agents/ commands/ er samme defekt-
klasse og allerede anerkjent som pin-verdig av mønsteret (audit.md:24 og
competitive.md:22 pinner skills/, batch.md:214 og pipeline.md:211 pinner
assets/). Under planens scope kunne dens EGEN verifisering ikke passere:
quick.md:229-230 ville stått upinnet rett over en pinnet linje, og setup.md
(3 load-bearing Read, 0 pins) var ikke i settet i det hele tatt.
Full defektklasse: 117 linjer / 19 filer → 81 pinnet, 36 bevisst urørt.

KLASSIFISERINGSREGEL (utledet av mønsteret, ikke oppfunnet):
- PIN = stien skal åpnes/kjøres/skrives — Read/Reference/See-pekere,
  ref-fil-lister, Bash/node/npm, edit-mål.
- PROSA = stien står som sitat bak en påstand, eller som beskrivelse av
  oppførsel/plassering. Ingen inline «(see …)» er pinnet noe sted i repoet
  (0 av 25 filer) — den grensen er arvet, ikke satt her.

36 BEVISST URØRTE, tre klasser:
1. Inline sitat/attribusjon (17): carousel.md:37 · pipeline.md:70,75 ·
   newsletter.md:999,1082,1211,1433 · report.md:273 · video.md:69 ·
   react.md:115 · calendar.md:87 · profile.md:28,34 · firsthour.md:112 ·
   monetize.md:343,492 · outreach.md:922
2. Beskrivelse av oppførsel/plassering (10): newsletter.md:50,1097,1205,1694,
   1744,1944 · report.md:45 · linkedin.md:218 · import.md:121,200
3. newsletter.md fase-tabellens Tooling-kolonne (9): :100,102,105,106,111,112,
   113,115,116 — tabellen er et register, og hvert steg pinner sitt eget
   faktiske kall i brødteksten.

S13-LINTEN (M0 data-dir): alle assets/-stiene som ble pinnet står eksplisitt i
lintens NEGATIVE13-unntaksliste, og lintens egen kommentar (test-runner.sh:552)
sier at shipped read-only assets SKAL bære ${CLAUDE_PLUGIN_ROOT}.

VERIFISERING: 76 unike pinnede stier hentet ut og resolvet med cwd=/tmp —
75 finnes. Den ene som ikke gjør det, config/personas.local.md, er en
gitignored valgfri fallback («else personas.template.md») som var pinnet på
newsletter.md:205 før denne endringen. Re-grep: gjenstående 36 er utelukkende
prosa, listet over.

Alle ti suiter grønne, alle floors uendret: test-runner 270/0 (269 assertions
>= floor 251) · trends 300/0 · analytics 202/0 · hooks 191/0 · brain 134/0 ·
editions 72/0 · render 63/0 · specifics-bank 45/0 · tests 35/0 ·
contract-gate 33/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M31cw43gqiSSDrKzcwUi7L
This commit is contained in:
Kjell Tore Guttormsen 2026-07-31 17:21:22 +02:00
commit e7276cf8bb
16 changed files with 81 additions and 81 deletions

View file

@ -23,7 +23,7 @@ You are a LinkedIn video scripting assistant. Guide the user through creating a
First, load persistent state and personalization:
- Read `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent topics)
- Read `skills/linkedin-studio/SKILL.md` for user profile, voice settings, and preferences
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for user profile, voice settings, and preferences
Check state for topic planning:
- Compare intended topic against "Recent Posts" in state file
@ -35,14 +35,14 @@ Check weekly progress:
- If `posts_this_week == weekly_goal - 1`, note: "This video will hit your weekly goal."
Load video-specific references:
- Read `references/video-strategy-guide.md` for script templates, pacing, and production guidance
- Read `references/linkedin-formats.md` (Video Content Deep Dive section) for algorithm data and technical specs
- Read `${CLAUDE_PLUGIN_ROOT}/references/video-strategy-guide.md` for script templates, pacing, and production guidance
- Read `${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md` (Video Content Deep Dive section) for algorithm data and technical specs
Check for existing assets:
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/` — Match the user's natural voice (read before scripting)
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/examples/high-engagement-posts.md` — Study successful patterns
**Graceful degradation (fresh adopter):** if `voice-samples/` is empty or absent, don't block — fall back to the voice settings in `skills/linkedin-studio/SKILL.md` (or neutral defaults), note that the script uses a default voice, and proceed. The voice-guardian is suppressed under 5 samples, so there is no hard gate to satisfy.
**Graceful degradation (fresh adopter):** if `voice-samples/` is empty or absent, don't block — fall back to the voice settings in `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` (or neutral defaults), note that the script uses a default voice, and proceed. The voice-guardian is suppressed under 5 samples, so there is no hard gate to satisfy.
## Step 1: Choose Video Type
@ -73,7 +73,7 @@ Default recommendation: **60 seconds** is the 2026 sweet spot — shorter videos
Follow the same flow as `/linkedin:post`:
1. Ask what they want the video to be about (if not already clear)
2. Read `references/content-angles.md` for the 8 universal angles
2. Read `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` for the 8 universal angles
3. Present 2-3 angle options via AskUserQuestion
4. Verify topic doesn't duplicate recent posts (check state file)
5. Confirm topic aligns with user's 5 core expertise areas
@ -83,7 +83,7 @@ Follow the same flow as `/linkedin:post`:
Delegate script generation to the `video-scripter` agent — invoke it via `Task` with `subagent_type: linkedin-studio:video-scripter` (foreground, from this command layer). The agent will:
1. Calculate word budget based on selected length (duration × 2.5 wps)
2. Select the appropriate script template from `references/video-strategy-guide.md`
2. Select the appropriate script template from `${CLAUDE_PLUGIN_ROOT}/references/video-strategy-guide.md`
3. Write the full script with:
- Timing markers (`[0:00-0:03]`, etc.)
- Visual cues (`[CAM:]`, `[SCREEN:]`, `[SLIDE:]`, `[TEXT:]`)
@ -232,9 +232,9 @@ Replace placeholders with actual post data. This replaces manual YAML editing.
## Reference Files
- `references/video-strategy-guide.md` — Script templates, pacing, production
- `references/linkedin-formats.md` — Video specs, algorithm, technical requirements
- `references/engagement-frameworks.md` — Hook types, CTAs
- `references/content-angles.md` — 8 universal angles
- `references/algorithm-signals-reference.md` — Algorithm mechanics
- `assets/checklists/quality-scorecard.md` — Pre-publish check
- `${CLAUDE_PLUGIN_ROOT}/references/video-strategy-guide.md` — Script templates, pacing, production
- `${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md` — Video specs, algorithm, technical requirements
- `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` — Hook types, CTAs
- `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` — 8 universal angles
- `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` — Algorithm mechanics
- `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md` — Pre-publish check