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

@ -19,9 +19,9 @@ You are a LinkedIn performance analyst. Help the user diagnose why their content
## Load Context ## Load Context
Read these reference files: Read these reference files:
- `references/troubleshooting-guide.md` - Failure patterns and solutions - `${CLAUDE_PLUGIN_ROOT}/references/troubleshooting-guide.md` - Failure patterns and solutions
- `references/algorithm-signals-reference.md` - Algorithm mechanics - `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` - Algorithm mechanics
- `skills/linkedin-studio/SKILL.md` - User's profile and goals - `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` - User's profile and goals
## Step 1: Diagnose the Problem ## Step 1: Diagnose the Problem
@ -117,7 +117,7 @@ Based on their answer, ask relevant follow-up questions:
## Step 3: Apply Diagnostic Framework ## Step 3: Apply Diagnostic Framework
Based on `references/troubleshooting-guide.md`, diagnose the pattern: Based on `${CLAUDE_PLUGIN_ROOT}/references/troubleshooting-guide.md`, diagnose the pattern:
### Pattern: Good Content, Low Reach ### Pattern: Good Content, Low Reach
@ -312,6 +312,6 @@ Consider creating a new account if:
## Reference Files ## Reference Files
- `references/troubleshooting-guide.md` - Complete troubleshooting - `${CLAUDE_PLUGIN_ROOT}/references/troubleshooting-guide.md` - Complete troubleshooting
- `references/algorithm-signals-reference.md` - Algorithm mechanics - `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` - Algorithm mechanics
- `references/growth-roadmaps.md` - Stall points and fixes - `${CLAUDE_PLUGIN_ROOT}/references/growth-roadmaps.md` - Stall points and fixes

View file

@ -44,7 +44,7 @@ Use AskUserQuestion:
3. **Use existing plan** — Follow the weekly plan already created 3. **Use existing plan** — Follow the weekly plan already created
4. **Mix it up** — Diverse topics across pillars 4. **Mix it up** — Diverse topics across pillars
If they choose a theme, help them identify 3-5 unique angles from `references/content-angles.md`. For timely angles, delegate to the `trend-spotter` agent — invoke it via `Task` with `subagent_type: linkedin-studio:trend-spotter` (foreground, from this command layer) — to surface trending topics and score their relevance against the user's pillars. If they choose a theme, help them identify 3-5 unique angles from `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md`. For timely angles, delegate to the `trend-spotter` agent — invoke it via `Task` with `subagent_type: linkedin-studio:trend-spotter` (foreground, from this command layer) — to surface trending topics and score their relevance against the user's pillars.
## Step 2: Plan the Batch (with Scheduling) ## Step 2: Plan the Batch (with Scheduling)

View file

@ -29,7 +29,7 @@ You are a LinkedIn carousel content specialist. Create high-engagement carousel
## Step 1: Choose Template ## Step 1: Choose Template
Read `assets/templates/carousel-templates.md` for the 5 templates. Read `${CLAUDE_PLUGIN_ROOT}/assets/templates/carousel-templates.md` for the 5 templates.
Present the options: Present the options:

View file

@ -117,5 +117,5 @@ delayed spike) with the post-feedback monitor — invoke it via `Task` with
## Reference Files ## Reference Files
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/authentic-voice-samples.md` — voice matching for the draft comments - `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/authentic-voice-samples.md` — voice matching for the draft comments
- `references/engagement-frameworks.md` — hook types, engagement hierarchy - `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` — hook types, engagement hierarchy
- `references/algorithm-signals-reference.md` — first-hour weighting, signal order, timing data - `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` — first-hour weighting, signal order, timing data

View file

@ -21,7 +21,7 @@ You are a LinkedIn analytics data import assistant. Guide the user through impor
## Reference ## Reference
For data format details and directory structure, see `assets/analytics/README.md`. For data format details and directory structure, see `${CLAUDE_PLUGIN_ROOT}/assets/analytics/README.md`.
> **Why CSV (as of 2026-07).** Post-level analytics via LinkedIn's API is > **Why CSV (as of 2026-07).** Post-level analytics via LinkedIn's API is
> partner-gated (vetted Community Management app + verified org + Page) and **not > partner-gated (vetted Community Management app + verified org + Page) and **not
@ -32,7 +32,7 @@ For data format details and directory structure, see `assets/analytics/README.md
> percentages, and is absent from the CSV, with export status unverified; dwell is > percentages, and is absent from the CSV, with export status unverified; dwell is
> internal-only for organic posts. Saves and the reach share are therefore > internal-only for organic posts. Saves and the reach share are therefore
> **optional manual columns** the user adds to the CSV (`Saves`, > **optional manual columns** the user adds to the CSV (`Saves`,
> `Out-of-network` / `In-network`) — see `assets/analytics/README.md` for the > `Out-of-network` / `In-network`) — see `${CLAUDE_PLUGIN_ROOT}/assets/analytics/README.md` for the
> entry rules, and the README boundaries for the full data boundary. > entry rules, and the README boundaries for the full data boundary.
## Step 1: Check for CSV Files in Exports Directory ## Step 1: Check for CSV Files in Exports Directory

View file

@ -229,4 +229,4 @@ If the user's intent is clear from context:
## Reference ## Reference
For full skill documentation, see: For full skill documentation, see:
- `skills/linkedin-studio/SKILL.md` - Complete skill with personalization settings - `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` - Complete skill with personalization settings

View file

@ -207,7 +207,7 @@ the edition left off before doing anything.
4. **None / insufficient** — Step 1 will **define personas interactively**. 4. **None / insufficient** — Step 1 will **define personas interactively**.
Exactly one persona is the **primær**. The resolved set feeds BOTH the Step 6 Exactly one persona is the **primær**. The resolved set feeds BOTH the Step 6
resonance sweep AND the Step 6.5 headless package; see resonance sweep AND the Step 6.5 headless package; see
`config/personas.template.md` → "Per-artifact personas". `${CLAUDE_PLUGIN_ROOT}/config/personas.template.md` → "Per-artifact personas".
6. **Read the series brief** — whatever the series folder defines as its brief / 6. **Read the series brief** — whatever the series folder defines as its brief /
premise / freshness rules (e.g. `<serie>/brief.md`, or the resolved brief premise / freshness rules (e.g. `<serie>/brief.md`, or the resolved brief
recorded in `edition-state.json`). This anchors angle and scope. recorded in `edition-state.json`). This anchors angle and scope.
@ -421,7 +421,7 @@ Settle these dimensions (most should come from context, not questions):
`articles.NN.personas` (each entry: name, tier, the five fields, source) at the `articles.NN.personas` (each entry: name, tier, the five fields, source) at the
**Step 1.5 checkpoint** (the first machine-state write; Step 2 then adds the **Step 1.5 checkpoint** (the first machine-state write; Step 2 then adds the
research notes) — it is then stable across sessions and is the single source research notes) — it is then stable across sessions and is the single source
every later sweep reads. See `config/personas.template.md` → every later sweep reads. See `${CLAUDE_PLUGIN_ROOT}/config/personas.template.md` →
"Per-artifact personas". "Per-artifact personas".
- **Key points** — the 24 load-bearing claims the edition must make. - **Key points** — the 24 load-bearing claims the edition must make.
- **Tone** — respected-peer vs. teaching-down; calibrated to the primær. - **Tone** — respected-peer vs. teaching-down; calibrated to the primær.
@ -633,7 +633,7 @@ Next: Step 2 — Research (scoped by the binding: fill ekstern/unresolved, verif
1. **Decompose** the binding's `ekstern`/`unresolved` slots + unverified numbers 1. **Decompose** the binding's `ekstern`/`unresolved` slots + unverified numbers
(step 0) into 25 *scoped, orthogonal* research sub-questions. Each sub-question (step 0) into 25 *scoped, orthogonal* research sub-questions. Each sub-question
must be answerable independently so the calls can run in parallel without must be answerable independently so the calls can run in parallel without
overlap. Reuse the multi-source synthesis discipline from `commands/react.md` overlap. Reuse the multi-source synthesis discipline from `${CLAUDE_PLUGIN_ROOT}/commands/react.md`
(Comparison Path, Steps 2b3b): per source, extract claims, stance, data points; (Comparison Path, Steps 2b3b): per source, extract claims, stance, data points;
then look across sources for common ground, tension, and blind spots. then look across sources for common ground, tension, and blind spots.
@ -1083,7 +1083,7 @@ turning-points the spine already named.
only afterward.) only afterward.)
3. **Expand with the `content-repurposer` muscle.** Reuse 3. **Expand with the `content-repurposer` muscle.** Reuse
`agents/content-repurposer.md` (its article→long-form conversion discipline) `${CLAUDE_PLUGIN_ROOT}/agents/content-repurposer.md` (its article→long-form conversion discipline)
for individual section expansions — invoke it via `Task` for individual section expansions — invoke it via `Task`
(`subagent_type: linkedin-studio:content-repurposer`) when useful, *from this (`subagent_type: linkedin-studio:content-repurposer`) when useful, *from this
command layer* (foreground, principle 4). The command owns assembly and command layer* (foreground, principle 4). The command owns assembly and
@ -1212,7 +1212,7 @@ mechanical noise.
> which is the §A/quality reference applied by reasoning. > which is the §A/quality reference applied by reasoning.
> **Adopter note.** The gate is a KTG-internal tool: it needs the contract-gate deps > **Adopter note.** The gate is a KTG-internal tool: it needs the contract-gate deps
> (`scripts/contract-gate/node_modules` — run `npm install` there once) and, for > (`${CLAUDE_PLUGIN_ROOT}/scripts/contract-gate/node_modules` — run `npm install` there once) and, for
> ratify, the maskinrommet contract. If either is absent (a plain adopter ships > ratify, the maskinrommet contract. If either is absent (a plain adopter ships
> neither), this Step is a **no-op** and the §B/§C1 discipline falls back to the Step 4 > neither), this Step is a **no-op** and the §B/§C1 discipline falls back to the Step 4
> quality-pass reasoning. It never blocks an adopter. > quality-pass reasoning. It never blocks an adopter.
@ -1496,7 +1496,7 @@ reopening locked texts — the biggest single process error of the series (plan
1. **Load the active personas** chosen in Step 1, with exactly one marked 1. **Load the active personas** chosen in Step 1, with exactly one marked
**primær**. Each persona's five fields (rolle, avkobler, overbeviser, **primær**. Each persona's five fields (rolle, avkobler, overbeviser,
ekspertise, sjargong) come from `config/personas.local.md` (or the template). ekspertise, sjargong) come from `${CLAUDE_PLUGIN_ROOT}/config/personas.local.md` (or the template).
2. **Fan out one `persona-reviewer` call per persona, in parallel** — issue them 2. **Fan out one `persona-reviewer` call per persona, in parallel** — issue them
in a SINGLE message (multiple `Task` tool-uses, `subagent_type: in a SINGLE message (multiple `Task` tool-uses, `subagent_type:
@ -1583,7 +1583,7 @@ in-session pass hid. `content-reviewer` is genuinely new (argument integrity,
which no in-session gate measures). Do NOT collapse the pairs. which no in-session gate measures). Do NOT collapse the pairs.
**Procedure** (this is the same package the standalone `/linkedin:headless-review` **Procedure** (this is the same package the standalone `/linkedin:headless-review`
command runs — see `commands/headless-review.md` for the full cold contract): command runs — see `${CLAUDE_PLUGIN_ROOT}/commands/headless-review.md` for the full cold contract):
1. **Freeze the draft.** Snapshot the persona-passed `NN-utkast.md` so the 1. **Freeze the draft.** Snapshot the persona-passed `NN-utkast.md` so the
reviewers judge a stable artifact and the report names exactly what was read: reviewers judge a stable artifact and the report names exactly what was read:
@ -1596,7 +1596,7 @@ command runs — see `commands/headless-review.md` for the full cold contract):
default `en` — tells `language-reviewer` and `voice-scrubber` which language's default `en` — tells `language-reviewer` and `voice-scrubber` which language's
rules to grade against; Norwegian-specific checks fire only when `language: no`), rules to grade against; Norwegian-specific checks fire only when `language: no`),
the writing contract *if it ships* (`<serie>/../../docs/skrivekontrakt.md` the writing contract *if it ships* (`<serie>/../../docs/skrivekontrakt.md`
plugin mirror → `references/longform-quality-rules.md`; absent for an adopter, plugin mirror → `${CLAUDE_PLUGIN_ROOT}/references/longform-quality-rules.md`; absent for an adopter,
the craft agents' in-tree checklists are self-contained), and the active the craft agents' in-tree checklists are self-contained), and the active
personas (`articles.NN.personas`, primær identified). Nothing else. personas (`articles.NN.personas`, primær identified). Nothing else.
@ -2269,7 +2269,7 @@ time. Step 11 empties that queue into permanent, enforced homes.
- **`mechanical-block` / `mechanical-warn`** — provable by string, regex, or - **`mechanical-block` / `mechanical-warn`** — provable by string, regex, or
count with ~zero false positives. **JA →** promote **atomically**: add the count with ~zero false positives. **JA →** promote **atomically**: add the
rule to `scripts/contract-gate/src/rules.ts`, the matching row to the rule to `${CLAUDE_PLUGIN_ROOT}/scripts/contract-gate/src/rules.ts`, the matching row to the
writing contract, and the manifest row that binds them; set the fold-in's writing contract, and the manifest row that binds them; set the fold-in's
`decision: "promoted"` and `ruleId`. Then prove it: `decision: "promoted"` and `ruleId`. Then prove it:

View file

@ -28,7 +28,7 @@ Load persistent state and personalization:
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for profile and preferences - Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for profile and preferences
- Check `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/` for voice matching - Check `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/` for voice matching
- Read `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md` for proven post templates — use these in Step 2 (Draft) - Read `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md` for proven post templates — use these in Step 2 (Draft)
- Read `assets/frameworks/framework-template.md` if the topic involves a framework or methodology - Read `${CLAUDE_PLUGIN_ROOT}/assets/frameworks/framework-template.md` if the topic involves a framework or methodology
Display status: Display status:
``` ```
@ -52,7 +52,7 @@ To situate the post in the broader plan — does it fill a content-mix gap or re
Once topic is chosen, create the draft: Once topic is chosen, create the draft:
1. **Select angle** — Auto-select the strongest angle from `references/content-angles.md` based on topic and user's expertise. Present ONE recommended angle with reasoning. Do NOT use AskUserQuestion — just proceed. If user disagrees, offer alternatives. 1. **Select angle** — Auto-select the strongest angle from `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` based on topic and user's expertise. Present ONE recommended angle with reasoning. Do NOT use AskUserQuestion — just proceed. If user disagrees, offer alternatives.
2. **Infer format** — Default to text post. Only mention carousel/video as a note if particularly well-suited. 2. **Infer format** — Default to text post. Only mention carousel/video as a note if particularly well-suited.
3. **Write draft** — Following the structure: 3. **Write draft** — Following the structure:
- Hook: 110-140 characters - Hook: 110-140 characters

View file

@ -24,7 +24,7 @@ You are a LinkedIn content creator. Guide the user through creating a high-quali
First, load persistent state and personalization: First, load persistent state and personalization:
- Read `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent topics) - 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
**Read `## Do-Next Directives` in the state file and apply them to this draft.** This is what the **Read `## Do-Next Directives` in the state file and apply them to this draft.** This is what the
last measurement pass (`/linkedin:report`, `/linkedin:analyze`, an A/B Adopt verdict, the 48h last measurement pass (`/linkedin:report`, `/linkedin:analyze`, an A/B Adopt verdict, the 48h
@ -46,7 +46,7 @@ Check weekly progress:
Check for existing assets: Check for existing assets:
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/` - Match the user's natural voice - `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/` - Match the user's natural voice
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/examples/high-engagement-posts.md` - Study past successful posts and replicable patterns - `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/examples/high-engagement-posts.md` - Study past successful posts and replicable patterns
- `assets/frameworks/framework-template.md` - Reference user's documented frameworks for framework posts - `${CLAUDE_PLUGIN_ROOT}/assets/frameworks/framework-template.md` - Reference user's documented frameworks for framework posts
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md` - User's proven post templates with success rates. **Prefer these over generic structures.** - `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md` - User's proven post templates with success rates. **Prefer these over generic structures.**
## Step 1: Understand the Input ## Step 1: Understand the Input
@ -71,7 +71,7 @@ If they provide a URL, use WebFetch to extract the content first.
## Step 2: Select Content Angle ## Step 2: Select Content Angle
Read `references/content-angles.md` for the 8 universal angles. Read `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` for the 8 universal angles.
**Industry-specific angles:** If `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/user-profile.md` exists and has an `industry` field, check the "Industry Angle Variants" section in `content-angles.md` for the matching industry table. Use the industry-specific starter questions and example hooks to generate more targeted angle suggestions. **Industry-specific angles:** If `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/user-profile.md` exists and has an `industry` field, check the "Industry Angle Variants" section in `content-angles.md` for the matching industry table. Use the industry-specific starter questions and example hooks to generate more targeted angle suggestions.
@ -101,7 +101,7 @@ Proceed with standard text post format by default. Only mention carousel or othe
## Step 4: Structure and Write ## Step 4: Structure and Write
Read `references/engagement-frameworks.md` for hook types, story structures, and CTAs. Read `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` for hook types, story structures, and CTAs.
Use the Standard Post Structure: Use the Standard Post Structure:
@ -113,7 +113,7 @@ Use the Standard Post Structure:
### Hook Rules ### Hook Rules
Reference `assets/quick-post-resources.md` for hooks bank. Reference `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md` for hooks bank.
- Frontload value - most interesting part first - Frontload value - most interesting part first
- Be specific with numbers and details - Be specific with numbers and details
@ -130,7 +130,7 @@ Match the user's voice profile from SKILL.md:
## Step 5: Quality Check ## Step 5: Quality Check
Before presenting, verify against `assets/checklists/quality-scorecard.md`: Before presenting, verify against `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md`:
- [ ] Hook works in first 110-140 characters - [ ] Hook works in first 110-140 characters
- [ ] Character count: 1,200-1,800 (optimal range) - [ ] Character count: 1,200-1,800 (optimal range)
@ -210,9 +210,9 @@ Replace placeholders with actual post data. This replaces manual YAML editing.
## Reference Files ## Reference Files
- `references/content-angles.md` - 8 universal angles - `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` - 8 universal angles
- `references/engagement-frameworks.md` - Hooks, structure, CTAs - `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` - Hooks, structure, CTAs
- `references/linkedin-formats.md` - Format specifications - `${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md` - Format specifications
- `references/algorithm-signals-reference.md` - Algorithm mechanics - `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` - Algorithm mechanics
- `assets/quick-post-resources.md` - Hooks and CTAs bank - `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md` - Hooks and CTAs bank
- `assets/checklists/quality-scorecard.md` - Pre-publish check - `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md` - Pre-publish check

View file

@ -19,7 +19,7 @@ You are a LinkedIn profile optimization specialist. Help the user optimize their
## Critical Context: Profile/Topic Relevance ## Critical Context: Profile/Topic Relevance
Read `references/algorithm-signals-reference.md` for algorithm mechanics. Read `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` for algorithm mechanics.
**The Fundamental Shift:** **The Fundamental Shift:**
- **In the older feed model:** Post something → a slice of your network sees it → the algorithm tracks engagement to decide wider reach - **In the older feed model:** Post something → a slice of your network sees it → the algorithm tracks engagement to decide wider reach
@ -239,6 +239,6 @@ If the answer is no, fix the profile FIRST before posting.
## Reference Files ## Reference Files
- `references/algorithm-signals-reference.md` - relevance-model mechanics and signals - `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` - relevance-model mechanics and signals
- `references/troubleshooting-guide.md` - Recovery if reach is already down - `${CLAUDE_PLUGIN_ROOT}/references/troubleshooting-guide.md` - Recovery if reach is already down
- `skills/linkedin-studio/SKILL.md` - User's expertise areas and topics - `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` - User's expertise areas and topics

View file

@ -32,12 +32,12 @@ Read `~/.claude/linkedin-studio.local.md` for:
Apply the ones that fit and name the applied directive in one line with the draft. Never edit Apply the ones that fit and name the applied directive in one line with the draft. Never edit
or clear the section (each source manages its own rows; rows older than 60 days expire). or clear the section (each source manages its own rows; rows older than 60 days expire).
Read `skills/linkedin-studio/SKILL.md` for: Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for:
- User's voice profile and tone preferences - User's voice profile and tone preferences
- Core expertise areas (for topical alignment) - Core expertise areas (for topical alignment)
- Phrases they commonly use - Phrases they commonly use
Read `assets/quick-post-resources.md` for: Read `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md` for:
- Hooks bank - Hooks bank
- CTAs bank - CTAs bank
- Quality checklist - Quality checklist
@ -61,7 +61,7 @@ Only ask if truly ambiguous (no discernible intent). Otherwise, state: "This rea
These 8 post types ARE the template library. Each maps to a hook pattern (Step 3), These 8 post types ARE the template library. Each maps to a hook pattern (Step 3),
an auto-selected CTA (Step 4), and a full fill-in-the-blank structure with per-type an auto-selected CTA (Step 4), and a full fill-in-the-blank structure with per-type
character targets in `assets/templates/post-type-templates.md`. If the user explicitly character targets in `${CLAUDE_PLUGIN_ROOT}/assets/templates/post-type-templates.md`. If the user explicitly
wants to browse template structures rather than draft now, present that asset's wants to browse template structures rather than draft now, present that asset's
per-type structures and let them pick before applying the 3-line formula. per-type structures and let them pick before applying the 3-line formula.
@ -85,7 +85,7 @@ Use this structure for all quick posts:
## Step 3: Select Hook Pattern ## Step 3: Select Hook Pattern
Based on post type, use appropriate hook from `assets/quick-post-resources.md`: Based on post type, use appropriate hook from `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md`:
### Reaction Post ### Reaction Post
- "[Industry event/news - state what happened]" - "[Industry event/news - state what happened]"
@ -133,7 +133,7 @@ Auto-select the best CTA based on post type — do NOT ask:
| CURATION | "Worth a read — what's your take?" | | CURATION | "Worth a read — what's your take?" |
| ONE-LINER | "Agree or disagree?" | | ONE-LINER | "Agree or disagree?" |
Reference `assets/quick-post-resources.md` for additional CTA options if the default doesn't fit. Reference `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md` for additional CTA options if the default doesn't fit.
## Step 5: Write and Check ## Step 5: Write and Check
@ -189,7 +189,7 @@ Replace placeholders with actual post data. This replaces manual YAML editing.
## Common Mistakes to Avoid ## Common Mistakes to Avoid
From `assets/quick-post-resources.md`: From `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md`:
1. **Too many ideas** - Pick ONE. Save others for separate posts. 1. **Too many ideas** - Pick ONE. Save others for separate posts.
2. **Burying the hook** - Lead with the most interesting element. 2. **Burying the hook** - Lead with the most interesting element.
@ -226,6 +226,6 @@ If during creation you realize:
## Reference Files ## Reference Files
- `assets/quick-post-resources.md` - Hooks and CTAs bank - `${CLAUDE_PLUGIN_ROOT}/assets/quick-post-resources.md` - Hooks and CTAs bank
- `assets/templates/post-type-templates.md` - Template examples - `${CLAUDE_PLUGIN_ROOT}/assets/templates/post-type-templates.md` - Template examples
- `references/engagement-frameworks.md` - Hook psychology - `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` - Hook psychology

View file

@ -272,6 +272,6 @@ Same as Step 8 — run `state-updater.mjs` with actual post data.
## Reference Files ## Reference Files
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/authentic-voice-samples.md` — Voice matching - `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/authentic-voice-samples.md` — Voice matching
- `references/content-angles.md` — 8 universal angles - `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` — 8 universal angles
- `references/engagement-frameworks.md` — Hooks, structure, CTAs - `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` — Hooks, structure, CTAs
- `assets/checklists/quality-scorecard.md` — Pre-publish check - `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md` — Pre-publish check

View file

@ -21,7 +21,7 @@ You are a LinkedIn analytics performance reporter. Generate actionable weekly pe
## Reference ## Reference
For data format details and directory structure, see `assets/analytics/README.md`. For data format details and directory structure, see `${CLAUDE_PLUGIN_ROOT}/assets/analytics/README.md`.
## Step 1: Check for Imported Data ## Step 1: Check for Imported Data

View file

@ -128,7 +128,7 @@ Conduct a 6-question interview:
5. **What were the results?** -- Quantitative and qualitative outcomes 5. **What were the results?** -- Quantitative and qualitative outcomes
6. **What's the key takeaway?** -- The non-obvious lesson others can apply 6. **What's the key takeaway?** -- The non-obvious lesson others can apply
After the interview, read `assets/case-studies/case-study-template.md` for structure reference, then create a new file: After the interview, read `${CLAUDE_PLUGIN_ROOT}/assets/case-studies/case-study-template.md` for structure reference, then create a new file:
**Filename:** `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/case-studies/[slug].md` (derive slug from the challenge topic, e.g., `ai-procurement-transformation.md`) **Filename:** `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/case-studies/[slug].md` (derive slug from the challenge topic, e.g., `ai-procurement-transformation.md`)
@ -182,7 +182,7 @@ Conduct a 5-question interview:
4. **How does someone apply it?** -- Step-by-step or decision process 4. **How does someone apply it?** -- Step-by-step or decision process
5. **What makes this different from standard approaches?** -- Your unique angle 5. **What makes this different from standard approaches?** -- Your unique angle
After the interview, read `assets/frameworks/framework-template.md` for structure reference, then create: After the interview, read `${CLAUDE_PLUGIN_ROOT}/assets/frameworks/framework-template.md` for structure reference, then create:
**Filename:** `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/frameworks/[slug].md` (e.g., `ai-maturity-model.md`) **Filename:** `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/frameworks/[slug].md` (e.g., `ai-maturity-model.md`)
@ -341,7 +341,7 @@ Guide through each section of the profile:
- Record exactly what they name. If they have none, that's fine — WebSearch + WebFetch are the always-available floor. - Record exactly what they name. If they have none, that's fine — WebSearch + WebFetch are the always-available floor.
- This populates the **Research Tooling** section of the profile; the trend/research engine routes to a declared MCP first and falls back to the floor. Do not invent MCP names — store only what the user declares. - This populates the **Research Tooling** section of the profile; the trend/research engine routes to a declared MCP first and falls back to the floor. Do not invent MCP names — store only what the user declares.
8. Read `config/user-profile.template.md` for structure 8. Read `${CLAUDE_PLUGIN_ROOT}/config/user-profile.template.md` for structure
9. Write the completed profile to `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/user-profile.md` 9. Write the completed profile to `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/user-profile.md`
**Important:** This file is gitignored (`.local.md` pattern), so personal data stays private. **Important:** This file is gitignored (`.local.md` pattern), so personal data stays private.

View file

@ -24,10 +24,10 @@ You are a LinkedIn growth strategist. Help the user create a personalized growth
## Load Context ## Load Context
Read these files: Read these files:
- `references/growth-roadmaps.md` - Detailed phase roadmaps - `${CLAUDE_PLUGIN_ROOT}/references/growth-roadmaps.md` - Detailed phase roadmaps
- `references/linkedin-growth-playbook-2025-2026.md` - Comprehensive tactics - `${CLAUDE_PLUGIN_ROOT}/references/linkedin-growth-playbook-2025-2026.md` - Comprehensive tactics
- `references/trajectory-strategy-adjustments.md` - Trajectory-based strategy adjustments - `${CLAUDE_PLUGIN_ROOT}/references/trajectory-strategy-adjustments.md` - Trajectory-based strategy adjustments
- `skills/linkedin-studio/SKILL.md` - User's goals and context - `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` - User's goals and context
## Step 0.5: Auto-Detect from State ## Step 0.5: Auto-Detect from State
@ -262,7 +262,7 @@ From the state file, compare current growth rate vs `growth_rate_needed`:
### Present Trajectory Overlay ### Present Trajectory Overlay
Using `references/trajectory-strategy-adjustments.md` as the source, show how the phase strategy should be adjusted: Using `${CLAUDE_PLUGIN_ROOT}/references/trajectory-strategy-adjustments.md` as the source, show how the phase strategy should be adjusted:
```markdown ```markdown
### Trajectory Adjustment: [STATUS] ### Trajectory Adjustment: [STATUS]
@ -513,10 +513,10 @@ Remind them of the long-term view:
## Reference Files ## Reference Files
- `references/growth-roadmaps.md` - Detailed phase roadmaps - `${CLAUDE_PLUGIN_ROOT}/references/growth-roadmaps.md` - Detailed phase roadmaps
- `references/linkedin-growth-playbook-2025-2026.md` - Comprehensive tactics - `${CLAUDE_PLUGIN_ROOT}/references/linkedin-growth-playbook-2025-2026.md` - Comprehensive tactics
- `references/trajectory-strategy-adjustments.md` - Trajectory-based strategy adjustments - `${CLAUDE_PLUGIN_ROOT}/references/trajectory-strategy-adjustments.md` - Trajectory-based strategy adjustments
- `references/algorithm-signals-reference.md` - topic-relevance signals (authority audit) - `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` - topic-relevance signals (authority audit)
- `references/collaborations-guide.md` - Partnership strategies - `${CLAUDE_PLUGIN_ROOT}/references/collaborations-guide.md` - Partnership strategies
- `references/opportunity-generation.md` - Business development - `${CLAUDE_PLUGIN_ROOT}/references/opportunity-generation.md` - Business development
- `references/newsletter-strategy-guide.md` - For 5K+ followers - `${CLAUDE_PLUGIN_ROOT}/references/newsletter-strategy-guide.md` - For 5K+ followers

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: First, load persistent state and personalization:
- Read `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent topics) - 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: Check state for topic planning:
- Compare intended topic against "Recent Posts" in state file - 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." - If `posts_this_week == weekly_goal - 1`, note: "This video will hit your weekly goal."
Load video-specific references: Load video-specific references:
- Read `references/video-strategy-guide.md` for script templates, pacing, and production guidance - Read `${CLAUDE_PLUGIN_ROOT}/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/linkedin-formats.md` (Video Content Deep Dive section) for algorithm data and technical specs
Check for existing assets: 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}/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 - `${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 ## 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`: Follow the same flow as `/linkedin:post`:
1. Ask what they want the video to be about (if not already clear) 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 3. Present 2-3 angle options via AskUserQuestion
4. Verify topic doesn't duplicate recent posts (check state file) 4. Verify topic doesn't duplicate recent posts (check state file)
5. Confirm topic aligns with user's 5 core expertise areas 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: 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) 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: 3. Write the full script with:
- Timing markers (`[0:00-0:03]`, etc.) - Timing markers (`[0:00-0:03]`, etc.)
- Visual cues (`[CAM:]`, `[SCREEN:]`, `[SLIDE:]`, `[TEXT:]`) - Visual cues (`[CAM:]`, `[SCREEN:]`, `[SLIDE:]`, `[TEXT:]`)
@ -232,9 +232,9 @@ Replace placeholders with actual post data. This replaces manual YAML editing.
## Reference Files ## Reference Files
- `references/video-strategy-guide.md` — Script templates, pacing, production - `${CLAUDE_PLUGIN_ROOT}/references/video-strategy-guide.md` — Script templates, pacing, production
- `references/linkedin-formats.md` — Video specs, algorithm, technical requirements - `${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md` — Video specs, algorithm, technical requirements
- `references/engagement-frameworks.md` — Hook types, CTAs - `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` — Hook types, CTAs
- `references/content-angles.md` — 8 universal angles - `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md` — 8 universal angles
- `references/algorithm-signals-reference.md` — Algorithm mechanics - `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` — Algorithm mechanics
- `assets/checklists/quality-scorecard.md` — Pre-publish check - `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md` — Pre-publish check