# LinkedIn Studio Plugin (v2.4.0) Full-spectrum LinkedIn content engine — short-form feed posts, carousels, video scripts, and long-form newsletter editions — with the January 2026 360Brew algorithm baked in. v2.0.0 consolidated the surface (27 commands → 24, 16 agents → 14) while adding the long-form `/linkedin:newsletter` orchestrator + two longform-quality gate agents (`fact-checker`, `persona-reviewer`). v2.1.0 added two gates BEFORE prose (Step 2.5 skeleton + Step 3a spine prose) + a third `persona-reviewer` mode (`skjelett`). v2.2.0 hardened the longform gates with the lessons from the second production run (Seres-serien): blocking persona hard-fails, a post-cutoff fact-check mandate, a `voice-scrubber` agent, render+annotate operator gates, and STATE.md-reconciled edition state. v2.3.0 made **visual assets an explicit pipeline phase** — Step 7.5 (visual-assets) between annotation (Step 7) and lock (Step 8): cover (+ optional inline figures) or a carousel deck, generated (default `mcp-image`, external `cover-raw.png` accepted) and operator-gated BEFORE lock so `render/build-linkedin.mjs` picks up `cover.png` at lock without a post-lock re-render. **v2.4.0** makes an **editor's craft gate an explicit pipeline phase** — new **Step 5.5 (editorial-review)** between fact-check (Step 5) and the persona sweep (Step 6): a new **`editorial-reviewer` agent** (Opus) judges **craft** (prosa-håndverk + narrativ-arkitektur), not reader-response, returning ≤10 flags (BLOCK/REWORK/NICE) as direction, **operator-gated via `SendUserFile` BEFORE the persona sweep** so the personas measure resonance instead of stumbling on craft noise. Motivated by Del 4: every persona reported PASS, yet the editor found 8 fresh points on first reading, ~6/8 of them craft/architecture blind spots no agent measured. Mirrors the Maskinrommet writing-contract §C2. Pipeline 14 → 15 phases; agents 15 → 16; additive `editorialReview` state. Doc/orchestration-only for the wiring (the new agent + its fasit fixture + lint test are the only new files); commands unchanged (24). ## Architecture - **State file:** `~/.claude/linkedin-studio.local.md` (YAML frontmatter, auto-initialized from `config/state-file.template.md`) - **State updater:** `hooks/scripts/state-updater.mjs` — deterministic state mutations (post tracking, streak, content history pruning). Pure functions, tested, no AI involvement - **Clipboard helper:** `hooks/scripts/clipboard-helper.mjs` — cross-platform clipboard integration (macOS `pbcopy`, Linux `xclip`/`xsel`, WSL `clip.exe`). All content commands auto-copy to clipboard - **iCal generator:** `hooks/scripts/ical-generator.mjs` — RFC 5545 calendar file generation for batch scheduling. Standalone CLI + importable module - **Post queue:** `assets/drafts/queue.json` (managed by `hooks/scripts/queue-manager.mjs`) - **Analytics CLI:** `scripts/analytics/` (TypeScript, requires `tsx` and `npm install`) - **Analytics data:** `assets/analytics/` (gitignored) ## Hooks 9 hooks across 7 events. All Node.js (.mjs). PreToolUse/PostToolUse hooks use parameterized `content-gatekeeper.mjs` with `isLinkedInContent()` check. | Event | Purpose | |-------|---------| | `SessionStart` | Load state, REMEMBER.md, milestone tracker | | `PreToolUse` (Write\|Edit) | Content quality gate, voice guardian, topic rotation gate | | `Stop` | State update, pre-publish reminders, content history | | `UserPromptSubmit` | LinkedIn context enrichment (three-tier matching) | | `PostToolUse` (Write) | Post-creation automation (5x5x5, posting time) | | `PreCompact` | Preserve LinkedIn context during compaction | | `Notification` | Posting reminders (rate-limited 30min) | **Session markers:** `/tmp/linkedin-hooks/session-active` (Stop hook gating, 12h staleness). **Shared modules:** `linkedin-content-filter.mjs`, `queue-manager.mjs`, `personalization-score.mjs`, `state-updater.mjs`, `clipboard-helper.mjs`. **State updates:** Post tracking, streak management, and content history are handled deterministically by `state-updater.mjs` (called from Stop hook and commands). Content history entries older than 90 days are auto-pruned at session start. **Hook editing:** Edit `hooks/hooks.template.json` + `hooks/prompts/*.md`, then run `python3 hooks/scripts/compile-hooks.py`. Do not edit `hooks.json` directly. Prompts are loaded at runtime by gatekeeper scripts; the compile step is only needed when adding `type: prompt` hooks. ## Commands (24) All content commands (post, quick, react, pipeline, first-post, video, multiplatform, carousel, newsletter) auto-copy output to clipboard via `clipboard-helper.mjs`. Interactive steps are minimized — angle, format, and post type are inferred from context, with max 2 questions per post. **v2.0.0 net change:** 5 commands removed (`templates`, `publish`, `authority`, `collab`, `speaking` — absorbed into `quick`, `calendar`, `strategy`, `outreach` respectively) + 2 commands added (`newsletter`, `outreach`) = 27 → 24. | Command | Purpose | |---------|---------| | `/linkedin` | Router — status line + command menu | | `/linkedin:onboarding` | Multi-step onboarding wizard (profile → setup → first-post) | | `/linkedin:first-post` | First-post accelerator (10 min) | | `/linkedin:setup` | Guided personalization setup | | `/linkedin:react` | URL-to-post pipeline | | `/linkedin:post` | Full post creation (10-15 min) | | `/linkedin:quick` | 5-minute quick post (3-line formula) + 8 post-type templates | | `/linkedin:pipeline` | Full end-to-end content pipeline | | `/linkedin:newsletter` | Long-form orchestrator: newsletter edition / essay / series article — multi-session 15-phase pipeline with **skeleton + spine-prose gates BEFORE prose (v2.1)**, **editorial-review craft gate BEFORE the persona sweep (Step 5.5, v2.4)**, fact-check + persona-sweep BEFORE lock, and **visual-assets gate BEFORE lock (Step 7.5, v2.3)** | | `/linkedin:batch` | Create a full week of content | | `/linkedin:calendar` | View/manage post scheduling queue + publish action (mark scheduled posts as published) | | `/linkedin:carousel` | Structured multi-slide carousel generator | | `/linkedin:video` | Video script generator (30s-2min) | | `/linkedin:multiplatform` | Adapt content for other platforms (short-form/cross-format; long-form → `/linkedin:newsletter`) | | `/linkedin:analyze` | Content/performance analysis | | `/linkedin:audit` | Periodic content strategy audit | | `/linkedin:import` | Import CSV export → structured JSON (delegates analysis to `/linkedin:report`) | | `/linkedin:report` | Generate weekly performance report | | `/linkedin:ab-test` | Design and manage A/B content tests | | `/linkedin:strategy` | Growth strategy + authority building (phase guidance, trajectory, signature content compounding) | | `/linkedin:competitive` | Competitive analysis of niche | | `/linkedin:monetize` | Monetization strategy and funnels (unlocks at ~1K followers) | | `/linkedin:outreach` | Outreach orchestrator — collaborations + speaking opportunities (unlocks at ~1K followers) | | `/linkedin:profile` | 360Brew profile optimization | ## Agents (16) | Agent | Model | Color | Responsibility | |-------|-------|-------|----------------| | `content-optimizer` | Sonnet | Blue | Optimize existing posts | | `strategy-advisor` | Sonnet | Green | Growth recommendations | | `analytics-interpreter` | Sonnet | Yellow | Audience pattern analysis + weekly/monthly performance reports (interpret/report modes) | | `engagement-coach` | Sonnet | Magenta | 5x5x5 + first-hour tactics + CEA commenting + target selection | | `content-planner` | Sonnet | Cyan | Content audit + weekly/monthly plans | | `network-builder` | Sonnet | Teal | Strategic networking + outreach | | `content-repurposer` | Sonnet | Purple | Format conversion + evergreen refresh | | `trend-spotter` | Sonnet | White | Trending topics + opportunity scores | | `voice-trainer` | Sonnet | Pink | Voice profile building + drift detection | | `differentiation-checker` | Sonnet | Gray | Originality scoring + commodity detection | | `post-feedback-monitor` | Haiku | Lime | Post-publish 48h monitoring | | `video-scripter` | Sonnet | Violet | Video script creation with pacing | | `fact-checker` | Opus | Brown | Factual-claim verification against primary sources, post-cutoff web-search mandate (longform) | | `editorial-reviewer` | Opus | Orange | Editor's craft gate (v2.4, Step 5.5, before persona sweep): prosa-håndverk + narrativ-arkitektur, ≤10 flags BLOCK/REWORK/NICE as direction, operator-gated via `SendUserFile`; mirrors Maskinrommet §C2 (longform) | | `persona-reviewer` | Opus | Olive | Reader-persona skeleton (v2.1, before prose) + resonance (before lock) + hook-conversion (after lock) gate, blocking hard-fail list (longform) | | `voice-scrubber` | Opus | Red | De-AI scrub + Norwegian-chronicle voice-drift correction; gold standard = approved Norwegian editions, not the English post corpus (longform, v2.2) | **Rule:** Always read `assets/voice-samples/` before generating content. **Invocation form:** Commands invoke plugin agents by their **namespaced** type — `subagent_type: linkedin-studio:` — never the bare `` (a bare type does not resolve and the `Task` call fails). **Reload requirement:** Adding a NEW agent file under `agents/` registers it only after a Claude Code **session reload** — the plugin agent set is built at session start, so a freshly-added agent (e.g. `fact-checker`, `persona-reviewer` when first added) is not invokable until the session reloads. After adding an agent, reload before invoking it. ## Content Quality Rules 1. Hook: 110-140 characters (mobile cutoff) 2. Post length: 1,200-1,800 chars (standard), 150-500 chars (quick) 3. No external links in post body (40-50% reach suppression) 4. No corporate buzzwords: leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach 5. Topic must align with user's 5 core expertise areas (360Brew signal) 6. Topic rotation: no back-to-back same pillar, no pillar >50% in 14 days (warn-only) 7. Progressive onboarding: personalization score hidden until 3+ posts; voice guardian suppressed until 5+ voice samples