From 1fa2cc945e62344cd6fc4c8099bfcd61fbd809ea Mon Sep 17 00:00:00 2001 From: Kjell Tore Guttormsen Date: Sat, 30 May 2026 07:49:48 +0200 Subject: [PATCH] =?UTF-8?q?chore(linkedin-studio):=20release=20v4.0.0=20?= =?UTF-8?q?=E2=80=94=20counts,=20three-doc,=20CHANGELOG=20(clears=20[skip-?= =?UTF-8?q?docs]=20debt)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Step 21 (remediation Wave 4 / S6, SOLO): finalize the audit-remediation as v4.0.0. Version 3.1.0 -> 4.0.0 across all current-version declarations; counts reconciled to the ls-derived source of truth (19 agents / 27 commands / 6 skills / 9 hooks / 25 reference docs / 16 newsletter phases — Step 20 confirmed NO TRIM); three-doc sync (plugin README + plugin CLAUDE.md + root README) clears the [skip-docs] debt accumulated across Wave 1-4; CHANGELOG v4.0.0 entry summarizing Steps 1-20. Scope additions beyond the plan's literal Files list, all version-sync or [skip-docs]-debt in nature (flagged, not feature creep): - ../../CLAUDE.md (root marketplace): linkedin-studio entry v3.1.0 -> v4.0.0 (the version-sync invariant mandates updating every version reference; leaving it stale is a real inconsistency). - scripts/test-runner.sh: added the version-consistency grep the file's own Step-1 comment promised ("added in Step 21") — plugin.json version must match the README badge, the CLAUDE.md header, and the CHANGELOG top entry — and folded the Wave 2 lint gap (plugin.json now covered by the stat-consistency scan). 66/0/0, exit 0. - plugin README: added the missing /linkedin:firsthour command row (Step 16 [skip-docs] debt) and the 25th reference doc (longform-quality-rules.md) to the knowledge-base table; fixed body counts ("All 26 commands" -> 27, "24 reference documents" -> 25); badges + intro 26 -> 27 commands, 24 -> 25 refs. - root README + marketplace.json: dropped the unpublishable model brand/date ("360Brew" / "January 2026") the algorithm-signal reconciliation already removed everywhere inside the plugin. Surviving "3.1.0" strings are intentional history, not stale declarations: the README version-history table row, the "vX added Y" attributions in plugin.json/CLAUDE.md, and the headless-review reload caveat are all changelog-genre. Every current-version declaration (plugin.json version, README badge, CLAUDE.md header, root README marker, marketplace.json) reads 4.0.0. The major bump reflects the remediation's scope plus the reinstall/reload the newly-wired agents need to register, and consolidates — does not repeat — the v3.0.0 identity break; it is not a fresh breaking API change (locked operator decision). Pre-existing and out of scope (flagged, untouched): a duplicate /linkedin:setup row in the README command tables. Verify: bash scripts/test-runner.sh exit 0 (66/0/0); plugin.json + marketplace.json parse; counts consistent README == CLAUDE.md == root README; stale-count sweep clean. NO push — /trekreview (S7) is the release gate. Co-Authored-By: Claude Opus 4.8 --- .claude-plugin/marketplace.json | 2 +- CLAUDE.md | 2 +- README.md | 6 +-- .../.claude-plugin/plugin.json | 4 +- plugins/linkedin-studio/CHANGELOG.md | 31 +++++++++++++++ plugins/linkedin-studio/CLAUDE.md | 4 +- plugins/linkedin-studio/README.md | 15 +++++--- .../linkedin-studio/scripts/test-runner.sh | 38 +++++++++++++++++-- 8 files changed, 84 insertions(+), 18 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 5cd44ab..4ff1c0a 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -28,7 +28,7 @@ { "name": "linkedin-studio", "source": "./plugins/linkedin-studio", - "description": "LinkedIn Studio — a full-spectrum LinkedIn content engine: feed posts, carousels, video scripts, and long-form newsletter editions, built on algorithmic understanding, strategic consistency, and authentic engagement. Updated for the January 2026 360Brew algorithm change." + "description": "LinkedIn Studio — a full-spectrum LinkedIn content engine: feed posts, carousels, video scripts, and long-form newsletter editions, built on algorithmic understanding, strategic consistency, and authentic engagement. Aligned to LinkedIn's 2026 topic-relevance ranking model." }, { "name": "graceful-handoff", diff --git a/CLAUDE.md b/CLAUDE.md index a3b1594..51fb854 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ plugins/ ai-psychosis/ v1.0.0 — Interaction awareness (sycophancy, reinforcement loops) config-audit/ v3.1.0 — Configuration intelligence (health, opportunities, auto-fix, whats-active) graceful-handoff/ v2.1.0 — Auto-trigger handoff via Stop hook (skill + JSON pipeline + 4-step model-aware context resolution) - linkedin-studio/ v3.1.0 — Full-spectrum LinkedIn content engine (short-form feed + long-form newsletter). **v3.1.0 adds a cold adversarial review package (Endring 9)** to the long-form pipeline: three new headless archetypes (all Opus) — `content-reviewer` (argument integrity C1–C5, ≤8 flags), `language-reviewer` (Norwegian L1–L5, ≤10 flags), `fact-reviewer` (cold re-verification F1–F4 + pivot-risk, web search) — that re-review a frozen draft with NO drafting-session context (each refuses drafting framing as "context pollution"); new **Step 6.5 (headless-review)** in `/linkedin:newsletter` after the persona sweep, before lock (the independence layer the in-session gates can't be); standalone **`/linkedin:headless-review`** command (run in a fresh session for max isolation); **`/linkedin:pivot`** command + pivot-detection gate (>20 % word-count / >2 new sections re-opens cleared gates before lock); **per-artifact personas** (`articles.NN.personas`). Motivated by Del 4 (Security Champions pivot): the in-session editor + persona sweep shared the drafting session's framing-bias, so the shipped version was never independently re-reviewed. Pipeline 15→16 phases; 24→26 commands; 16→19 agents; additive `personas`/`pivots`/`headlessReview` state; backward-compatible, reload required for the new agents. **v3.0.0 renamed from `linkedin-thought-leadership`** (LinkedIn Thought Leadership → LinkedIn Studio): slug + agent namespace (`linkedin-studio:`) + runtime state path (`~/.claude/linkedin-studio.local.md`) all change; the `/linkedin:*` commands are unchanged (frontmatter-namespaced, slug-independent). Breaking — reinstall required; functionality byte-identical to v2.4.0. v2.0.0 consolidated surface (27→24 commands, 16→14 agents) + added `/linkedin:newsletter` orchestrator with fact-check + persona-sweep gates BEFORE lock. v2.1.0 added skeleton-gate BEFORE prose (Step 2.5 + Step 3a) + third `persona-reviewer` mode (`skjelett`); pipeline 11→13 phases. v2.2.0 hardened the longform gates (2nd production run): blocking persona hard-fails, fact-check post-cutoff web-search mandate + orthogonal-to-narrative rule, new `voice-scrubber` agent (Opus, de-AI + Norwegian-chronicle voice; gold standard = approved Norwegian editions NOT English post corpus), render+annotate operator gates (2.5/3a), edition-state reconciled with STATE.md (`edition-HANDOVER.md` deleted); agents 14→15. v2.3.0 added **Step 7.5 (visual-assets)** to `/linkedin:newsletter` — cover (+ inline figures) or carousel deck, generated (default mcp-image; external `cover-raw.png` accepted) + operator-gated via `SendUserFile` BEFORE lock so `build-linkedin.mjs` picks up `cover.png` without a post-lock re-render; pipeline 13→14 phases, new `config/image-credit-caption.template.md`, additive `visualAssets` state. v2.4.0 adds **Step 5.5 (editorial-review)** to `/linkedin:newsletter` — new `editorial-reviewer` agent (Opus) judging craft (prosa-håndverk + narrativ-arkitektur), not reader-response, ≤10 flags BLOCK/REWORK/NICE as direction, operator-gated via `SendUserFile` between fact-check (5) and persona-sweep (6), mirroring Maskinrommet skrivekontrakt §C2; motivated by Del 4 (every persona PASS yet 8 fresh editor points, ~6/8 craft/architecture blind spots). Pipeline 14→15 phases; agents 15→16; additive `editorialReview` state; doc/orchestration-only (new agent + fasit fixture + lint test the only new files). Commands unchanged (24); agents 16. Render pipeline self-hosted (OFL-1.1 fonts). + linkedin-studio/ v4.0.0 — Full-spectrum LinkedIn content engine (short-form feed + long-form newsletter). **v4.0.0 is an audit-remediation release (Voyage Phase 0–3)**: a critical self-review found overclaiming, dormant capability, and structural rot, so every user-facing claim is made honest or removed, **all 11 orphaned agents are wired** (no deletions → 19 agents), a **`/linkedin:firsthour`** command is added (→ 27 commands) alongside a short-form de-AI gate + a video quality gate, `post-feedback-monitor` is promoted to Opus, the newsletter-distribution / profile-SEO / outreach surfaces are made honest, the **algorithm signals are reconciled to one sourced statement** (no model name or date; `references/algorithm-signals-reference.md` is the single source of truth), the analytics fresh-clone crash is fixed, the voice-profile leak is closed (placeholder + sentinel + gitignore), and the structure lint is rebuilt with version/count/stat-consistency guards. Breaking — reinstall/reload required for the newly-wired agents; consolidates the v3.0.0 identity break. **v3.1.0 added a cold adversarial review package (Endring 9)** to the long-form pipeline: three new headless archetypes (all Opus) — `content-reviewer` (argument integrity C1–C5, ≤8 flags), `language-reviewer` (Norwegian L1–L5, ≤10 flags), `fact-reviewer` (cold re-verification F1–F4 + pivot-risk, web search) — that re-review a frozen draft with NO drafting-session context (each refuses drafting framing as "context pollution"); new **Step 6.5 (headless-review)** in `/linkedin:newsletter` after the persona sweep, before lock (the independence layer the in-session gates can't be); standalone **`/linkedin:headless-review`** command (run in a fresh session for max isolation); **`/linkedin:pivot`** command + pivot-detection gate (>20 % word-count / >2 new sections re-opens cleared gates before lock); **per-artifact personas** (`articles.NN.personas`). Motivated by Del 4 (Security Champions pivot): the in-session editor + persona sweep shared the drafting session's framing-bias, so the shipped version was never independently re-reviewed. Pipeline 15→16 phases; 24→26 commands; 16→19 agents; additive `personas`/`pivots`/`headlessReview` state; backward-compatible, reload required for the new agents. **v3.0.0 renamed from `linkedin-thought-leadership`** (LinkedIn Thought Leadership → LinkedIn Studio): slug + agent namespace (`linkedin-studio:`) + runtime state path (`~/.claude/linkedin-studio.local.md`) all change; the `/linkedin:*` commands are unchanged (frontmatter-namespaced, slug-independent). Breaking — reinstall required; functionality byte-identical to v2.4.0. v2.0.0 consolidated surface (27→24 commands, 16→14 agents) + added `/linkedin:newsletter` orchestrator with fact-check + persona-sweep gates BEFORE lock. v2.1.0 added skeleton-gate BEFORE prose (Step 2.5 + Step 3a) + third `persona-reviewer` mode (`skjelett`); pipeline 11→13 phases. v2.2.0 hardened the longform gates (2nd production run): blocking persona hard-fails, fact-check post-cutoff web-search mandate + orthogonal-to-narrative rule, new `voice-scrubber` agent (Opus, de-AI + Norwegian-chronicle voice; gold standard = approved Norwegian editions NOT English post corpus), render+annotate operator gates (2.5/3a), edition-state reconciled with STATE.md (`edition-HANDOVER.md` deleted); agents 14→15. v2.3.0 added **Step 7.5 (visual-assets)** to `/linkedin:newsletter` — cover (+ inline figures) or carousel deck, generated (default mcp-image; external `cover-raw.png` accepted) + operator-gated via `SendUserFile` BEFORE lock so `build-linkedin.mjs` picks up `cover.png` without a post-lock re-render; pipeline 13→14 phases, new `config/image-credit-caption.template.md`, additive `visualAssets` state. v2.4.0 adds **Step 5.5 (editorial-review)** to `/linkedin:newsletter` — new `editorial-reviewer` agent (Opus) judging craft (prosa-håndverk + narrativ-arkitektur), not reader-response, ≤10 flags BLOCK/REWORK/NICE as direction, operator-gated via `SendUserFile` between fact-check (5) and persona-sweep (6), mirroring Maskinrommet skrivekontrakt §C2; motivated by Del 4 (every persona PASS yet 8 fresh editor points, ~6/8 craft/architecture blind spots). Pipeline 14→15 phases; agents 15→16; additive `editorialReview` state; doc/orchestration-only (new agent + fasit fixture + lint test the only new files). Commands unchanged (24); agents 16. Render pipeline self-hosted (OFL-1.1 fonts). llm-security/ v7.7.2 — Security scanning, auditing, threat modeling. HTML report output for all 18 skill commands (render-report CLI + canonical ESM module mirrored bit-identical into the playground). v7.7.2 translated the remaining Norwegian surface text in the playground UI, the canonical renderer, the agent prompts, and the README/CLAUDE.md state sections to English. v7.7.1 stripped the playground to the catalog as the only routable surface. ms-ai-architect/ v1.15.0 — Microsoft AI architecture (Cosmo Skyberg persona) + manual KB-refresh slash command + v3 project-view (sidebar med 17 artifacts + main + import-modal overlay, v2-surface fjernet i v1.15.0) okr/ v1.0.0 — OKR guidance for Norwegian public sector diff --git a/README.md b/README.md index 084e3fc..751fcb2 100644 --- a/README.md +++ b/README.md @@ -114,18 +114,18 @@ Key commands: `/architect`, `/architect:ros`, `/architect:security`, `/architect --- -### [LinkedIn Studio](plugins/linkedin-studio/) `v3.1.0` +### [LinkedIn Studio](plugins/linkedin-studio/) `v4.0.0` Build authentic LinkedIn authority through algorithmic understanding, strategic consistency, and AI-assisted content creation. - **Long-form newsletter pipeline** — a multi-phase orchestrator (research → skeleton → prose → de-AI/voice scrub → fact-check → editorial and persona gates → visual assets → lock → delivery) with maintained edition state - **Adversarial review** — cold headless content, language, and fact reviewers re-check a frozen draft with no drafting-session context; `/linkedin:pivot` re-opens cleared gates on major rewrites - **Content engine** — Content Matrix (40+ ideas from one topic), voice training with drift detection, full ideation → publish → 48-hour monitoring → analytics -- **Growth and monetization** — phase-specific guidance from 0 to 10K+ followers; 360Brew profile optimization for LinkedIn's creator validation +- **Growth and monetization** — phase-specific guidance from 0 to 10K+ followers; topic-relevance profile optimization aligned to LinkedIn's 2026 ranking model Key commands: `/linkedin:onboarding`, `/linkedin:post`, `/linkedin:quick`, `/linkedin:newsletter`, `/linkedin:carousel`, `/linkedin:report` -19 agents · 26 commands · 6 skills · 9 hooks · [Full documentation →](plugins/linkedin-studio/README.md) +19 agents · 27 commands · 6 skills · 9 hooks · [Full documentation →](plugins/linkedin-studio/README.md) --- diff --git a/plugins/linkedin-studio/.claude-plugin/plugin.json b/plugins/linkedin-studio/.claude-plugin/plugin.json index 94ccf66..b859b4d 100644 --- a/plugins/linkedin-studio/.claude-plugin/plugin.json +++ b/plugins/linkedin-studio/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "linkedin-studio", - "version": "3.1.0", - "description": "LinkedIn Studio — full-spectrum LinkedIn content engine: feed posts, carousels, video scripts, and long-form newsletter editions, with the 2026 relevance-ranking model baked in. v3.1.0 (Endring 9) adds a cold adversarial review package to `/linkedin:newsletter` — Step 6.5 + the standalone `/linkedin:headless-review` command run three new headless archetypes (content-reviewer, language-reviewer, fact-reviewer) plus the persona reviewer with NO drafting-session context — a `/linkedin:pivot` command that re-opens cleared gates after a late change, and per-artifact personas (one or more readers configurable per edition). v3.0.0 renamed the plugin (was `linkedin-thought-leadership`): slug, agent namespace, and state-file path are `linkedin-studio`; the `/linkedin:*` commands are unchanged.", + "version": "4.0.0", + "description": "LinkedIn Studio — full-spectrum LinkedIn content engine: feed posts, carousels, video scripts, and long-form newsletter editions, with the 2026 relevance-ranking model baked in. v4.0.0 is an audit-remediation release (Voyage Phase 0–3): every user-facing claim is made honest or removed, all 11 previously-orphaned agents are wired (→ 19 agents), a `/linkedin:firsthour` post-publish command is added (→ 27 commands), the algorithm-signal claims are reconciled to one sourced statement (no unpublishable model name or date), short-form de-AI and video quality gates are added, and the structure lint is rebuilt to guard the real layout plus version/count/stat consistency. Breaking: the newly-wired agents register only on reinstall/reload, and this consolidates the v3.0.0 identity break (slug, agent namespace `linkedin-studio:`, state-file path `~/.claude/linkedin-studio.local.md`). v3.1.0 added the cold adversarial review package (`/linkedin:headless-review` + Step 6.5 + `/linkedin:pivot` + per-artifact personas); the `/linkedin:*` commands are unchanged.", "author": { "name": "Kjell Tore Guttormsen" }, diff --git a/plugins/linkedin-studio/CHANGELOG.md b/plugins/linkedin-studio/CHANGELOG.md index 08f74a1..63fb634 100644 --- a/plugins/linkedin-studio/CHANGELOG.md +++ b/plugins/linkedin-studio/CHANGELOG.md @@ -5,6 +5,37 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [4.0.0] - 2026-05-30 + +### Summary +**Audit-remediation release (Voyage Phase 0–3).** A critical self-review (`docs/critical-review-2026-05-29.local.md`) found the plugin had drifted in three ways: (1) **overclaiming** — surfaces promised tracking, analytics, and review independence the plugin could not actually deliver; (2) **dormant capability** — eleven agents shipped in `agents/` were never invoked by any command; (3) **structural rot** — the structure lint validated a layout the plugin had outgrown, an algorithm-signal claim contradicted itself across files, and an unpublishable model brand/date was baked into user-facing copy. This release is the systematic fix: every claim is made honest or removed, every orphan agent is wired, and the lint is rebuilt to guard the real layout plus version/count/stat consistency. **Major version** marks the scope of the remediation (every user-facing claim re-examined) and the reinstall/reload required for the newly-wired agents to register; it consolidates — but does not repeat — the v3.0.0 identity break (slug, agent namespace, state-file path). No content-pipeline behavior is removed; the short-form and long-form engines are unchanged except where a gate was added. + +### Added +- **`/linkedin:firsthour`** — post-publish first-hour / reply-loop sprint command wiring the previously-orphaned `engagement-coach` agent: a timestamped target list, draft comments, and a timeline, persisted to state (`recordFirstHourPlan`), handing off to `post-feedback-monitor`. Commands 26 → 27. +- **All 11 orphaned agents wired** (case-by-case: 9 in the wiring pass, 2 via the new gates/command) — the agent set is now fully reachable from a command, with no deletions. Agents stay 19. +- **Short-form de-AI gate** — the short-form content commands run `differentiation-checker` + the voice-guardian before output, the short-form mirror of the long-form de-AI discipline. +- **Video quality gate** — `/linkedin:video` enforces captions + aspect-ratio guidance (4:5 / 1:1 + captions) and drops the hard 9:16 mandate. +- **Version-consistency grep** in the structure lint (`scripts/test-runner.sh`) — the `plugin.json` version must match the README badge, the plugin `CLAUDE.md` header, and the CHANGELOG top entry; the `plugin.json` description is now also covered by the algorithm-stat-consistency scan. + +### Changed +- **Structure lint rebuilt** (`scripts/test-runner.sh`) — dynamic registration counts derived from `ls` (agents/commands/refs/skills), frontmatter shape, hook-drift (`compile-hooks.py --check`), and an algorithm-stat-consistency grep that forbids the unpublishable model brand/date and competing magnitudes from returning. Replaces a dead validator that asserted an outgrown layout. +- **Algorithm signals reconciled to one sourced statement** — `references/algorithm-signals-reference.md` is the single source of truth (per-claim Source + Confidence); every citer cites rather than restates. The 2026 relevance-ranking model is referenced **without a name or a date** (the unpublishable brand/date removed everywhere, including the root README and the marketplace manifest). +- **`post-feedback-monitor` promoted to Opus** (Opus-default for human-facing reasoning). +- **Newsletter distribution, profile-SEO, and outreach surfaces made honest** — they describe what the plugin produces (drafts, recommendations, queues) versus what the operator does manually, with no implied automation. +- **Long-form review language is configurable; render output de-branded; series path parameterized** (no hard-coded author or series). +- **Counts reconciled** to the `ls`-derived source of truth: 27 commands · 19 agents · 6 skills · 9 hooks · 25 reference docs · 16 newsletter phases. README badges + intro, root README, and the marketplace catalog brought into sync. +- **Long-form review-pass overlap measured** (`docs/remediation/overlap-measurement.md`) across the seven long-form review gates against in-repo fixtures: every gate has ≥ 1 unique catch and the real overlaps are justified → **no gate trimmed** (the review stack stays seven). + +### Fixed +- **Analytics CLI fresh-clone crash** — `report.md` / `import.md` surface the `npm install` at point-of-use, and `getAnalyticsRoot()` is anchored on the `.claude-plugin/plugin.json` marker instead of a build-layout-relative depth (latent correctness bug). +- **No false metric claims** — saves/dwell wording is honest (the plugin cannot read those signals), and the A/B significance claim is downgraded to directional. + +### Security / Privacy +- **Voice-profile leak closed** — the tracked `authentic-voice-samples.md` is now a PII-free placeholder carrying a `` sentinel; the author's real profile moved to a gitignored `.local.md`; `personalization-score.mjs` scores the placeholder 0 voice points via the sentinel (both voice writers replace-not-append). The author name is scrubbed from `plugin.json` (the `LICENSE` MIT copyright holder is the intentional exception). Per a documented decision, git history is **not** rewritten — the historical voice file is attributed open-source authorship, not a leaked secret. + +### Compatibility +- **Breaking — reinstall / reload required.** The eleven newly-wired agents register only when the plugin agent set is rebuilt at session start; the v3.0.0 slug / agent-namespace (`linkedin-studio:`) / state-path (`~/.claude/linkedin-studio.local.md`) break is consolidated here. Existing editions and analytics data are unaffected (state shapes are additive; posts/streak/history preserved). The `/linkedin:*` command namespace is unchanged. + ## [3.1.0] - 2026-05-29 ### Summary diff --git a/plugins/linkedin-studio/CLAUDE.md b/plugins/linkedin-studio/CLAUDE.md index cd9a417..4bfabc8 100644 --- a/plugins/linkedin-studio/CLAUDE.md +++ b/plugins/linkedin-studio/CLAUDE.md @@ -1,6 +1,6 @@ -# LinkedIn Studio Plugin (v3.1.0) +# LinkedIn Studio Plugin (v4.0.0) -Full-spectrum LinkedIn content engine — short-form feed posts, carousels, video scripts, and long-form newsletter editions — with the 2026 relevance-ranking model 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). **v3.1.0 (Endring 9)** adds an **adversarial review package** run COLD on a frozen draft — new **Step 6.5 (headless-review)** between the persona sweep (Step 6) and lock, plus a standalone **`/linkedin:headless-review`** command (run in a fresh session for maximum isolation): three new headless archetypes — **`content-reviewer`** (argument integrity), **`language-reviewer`** (Norwegian language), **`fact-reviewer`** (cold re-verification incl. claims a late pivot bolted on) — plus `persona-reviewer` in resonance + conversion modes, all with NO drafting-session context (the independence layer the in-session gates structurally cannot be). v3.1.0 also adds **`/linkedin:pivot`** (re-opens cleared gates after a late change + a >20 %/>2-section pivot-detection gate at lock) and **per-artifact personas** (`articles.NN.personas` — one or more readers configurable per edition, resolved edition-state → series file → plugin library → interactive). Pipeline 15 → 16 phases; agents 16 → 19; commands 24 → 26; additive `personas` / `pivots` / `headlessReview` state. Motivated by Del 4: the in-session editor + persona sweep shared the drafting session's framing-bias, so the version that shipped was never independently re-reviewed. +Full-spectrum LinkedIn content engine — short-form feed posts, carousels, video scripts, and long-form newsletter editions — with the 2026 relevance-ranking model baked in. **v4.0.0** is an **audit-remediation release (Voyage Phase 0–3)**: a critical self-review found overclaiming (tracking/analytics/review-independence the plugin couldn't deliver), dormant capability (11 agents never invoked by any command), and structural rot (a dead lint, a self-contradicting algorithm claim, an unpublishable model brand/date in user copy). The fix wires **all 11 orphaned agents** (no deletions → 19 agents), adds **`/linkedin:firsthour`** (→ 27 commands) + a short-form de-AI gate + a video quality gate, promotes `post-feedback-monitor` to Opus, makes the newsletter-distribution / profile-SEO / outreach surfaces honest, **reconciles the algorithm signals to one sourced statement** (no model name or date; `references/algorithm-signals-reference.md` is the single source of truth), fixes the analytics fresh-clone crash, closes the voice-profile leak (placeholder + sentinel + gitignore), and rebuilds the structure lint with version/count/stat-consistency guards. Breaking — reinstall/reload required for the newly-wired agents; consolidates the v3.0.0 identity break (slug, agent namespace, state-file path). 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). **v3.1.0 (Endring 9)** adds an **adversarial review package** run COLD on a frozen draft — new **Step 6.5 (headless-review)** between the persona sweep (Step 6) and lock, plus a standalone **`/linkedin:headless-review`** command (run in a fresh session for maximum isolation): three new headless archetypes — **`content-reviewer`** (argument integrity), **`language-reviewer`** (Norwegian language), **`fact-reviewer`** (cold re-verification incl. claims a late pivot bolted on) — plus `persona-reviewer` in resonance + conversion modes, all with NO drafting-session context (the independence layer the in-session gates structurally cannot be). v3.1.0 also adds **`/linkedin:pivot`** (re-opens cleared gates after a late change + a >20 %/>2-section pivot-detection gate at lock) and **per-artifact personas** (`articles.NN.personas` — one or more readers configurable per edition, resolved edition-state → series file → plugin library → interactive). Pipeline 15 → 16 phases; agents 16 → 19; commands 24 → 26; additive `personas` / `pivots` / `headlessReview` state. Motivated by Del 4: the in-session editor + persona sweep shared the drafting session's framing-bias, so the version that shipped was never independently re-reviewed. ## Architecture diff --git a/plugins/linkedin-studio/README.md b/plugins/linkedin-studio/README.md index 9b1b5b6..2125675 100644 --- a/plugins/linkedin-studio/README.md +++ b/plugins/linkedin-studio/README.md @@ -6,15 +6,15 @@ *AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)* -![Version](https://img.shields.io/badge/version-3.1.0-blue) +![Version](https://img.shields.io/badge/version-4.0.0-blue) ![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple) -![Commands](https://img.shields.io/badge/commands-26-green) +![Commands](https://img.shields.io/badge/commands-27-green) ![Agents](https://img.shields.io/badge/agents-19-orange) ![Hooks](https://img.shields.io/badge/hooks-9-red) -![Reference Docs](https://img.shields.io/badge/reference_docs-24-teal) +![Reference Docs](https://img.shields.io/badge/reference_docs-25-teal) ![License](https://img.shields.io/badge/license-MIT-lightgrey) -Most experts know they *should* post on LinkedIn — and quietly don't. The blank editor wins. LinkedIn Studio turns that chore into a system: structured workflows that take you from idea to published, in your own voice, calibrated to how LinkedIn's **topic-relevance** ranking model (2026) actually distributes content. Two engines under one surface — a **feed engine** for short-form posts, carousels, and video scripts, and a **long-form engine** that runs newsletter editions and essays through a serious editorial pipeline before they ever lock. 26 commands, 19 specialized agents, 9 automated quality hooks, and a 24-document knowledge base grounded in the algorithm's real signals. +Most experts know they *should* post on LinkedIn — and quietly don't. The blank editor wins. LinkedIn Studio turns that chore into a system: structured workflows that take you from idea to published, in your own voice, calibrated to how LinkedIn's **topic-relevance** ranking model (2026) actually distributes content. Two engines under one surface — a **feed engine** for short-form posts, carousels, and video scripts, and a **long-form engine** that runs newsletter editions and essays through a serious editorial pipeline before they ever lock. 27 commands, 19 specialized agents, 9 automated quality hooks, and a 25-document knowledge base grounded in the algorithm's real signals. This is not a shortcut. Hand the wheel to the AI and you land where everyone who did the same lands — the forgettable middle. The plugin removes the friction; the judgment, the genuine engagement, and the effort that make content worth reading remain entirely yours. @@ -183,7 +183,7 @@ The wizard handles everything: topic-relevance profile checklist, voice and user ## Commands -All 26 commands use colon notation: `/linkedin:post`, `/linkedin:quick`, etc. +All 27 commands use colon notation: `/linkedin:post`, `/linkedin:quick`, etc. ### Onboarding @@ -205,6 +205,7 @@ All 26 commands use colon notation: `/linkedin:post`, `/linkedin:quick`, etc. | `/linkedin:pipeline` | Full end-to-end content pipeline from idea to published post. Guides through ideation, drafting, optimization, scheduling, pre-engagement, publishing, and post-analysis. | | `/linkedin:batch` | Create a full week of LinkedIn content in one session. Input one theme, output 3-5 posts with varying angles and formats. Writes to scheduling queue. | | `/linkedin:calendar` | View and manage the post scheduling queue — upcoming, overdue, published — and run the publish action (mark a scheduled post as published, update state + streak tracking, surface the first-hour engagement plan). | +| `/linkedin:firsthour` | Post-publish first-hour / reply-loop sprint. Delegates to `engagement-coach` for a timestamped target list, draft comments, and a timeline; persists the plan to state (`recordFirstHourPlan`) and hands off to `post-feedback-monitor`. | | `/linkedin:carousel` | Structured multi-slide carousel generator with slide-by-slide copy and visual layout guidance. Optionally generates slide images via `mcp-image`. | | `/linkedin:video` | Video script generator for 30s, 60s, 90s, or 2-minute LinkedIn videos with pacing and visual cues. | | `/linkedin:multiplatform` | Adapt LinkedIn content for Twitter/X threads, newsletter sections, blog posts, presentation slides, and YouTube scripts. | @@ -314,7 +315,7 @@ Longform quality gates (newsletter): **`persona-reviewer` (skjelett) run BEFORE ## Knowledge Base -The plugin includes **24 reference documents** covering the full LinkedIn thought leadership domain: +The plugin includes **25 reference documents** covering the full LinkedIn thought leadership domain: | Category | Document | When to Use | |----------|----------|-------------| @@ -326,6 +327,7 @@ The plugin includes **24 reference documents** covering the full LinkedIn though | Monetization | `linkedin-monetization-strategies.md` | Revenue planning | | Newsletter | `newsletter-strategy-guide.md` | Newsletter strategy (5,000+ followers) | | Articles | `articles-strategy-guide.md` | Long-form content | +| Long-form Quality | `longform-quality-rules.md` | Long-form editorial gates and quality bar | | Roadmaps | `growth-roadmaps.md` | Monthly planning | | Low-frequency | `low-frequency-posting-strategy.md` | 2-3x/week strategy | | Collaborations | `collaborations-guide.md` | Partnership strategy | @@ -625,6 +627,7 @@ Scheduled posts are tracked in `assets/drafts/queue.json`: | Version | Date | Highlights | |---------|------|-----------| +| **4.0.0** | 2026-05-30 | **Audit-remediation release (Voyage Phase 0–3).** A critical self-review found overclaiming (tracking/analytics/review-independence the plugin couldn't deliver), dormant capability (11 agents never invoked by any command), and structural rot (a dead lint, a self-contradicting algorithm claim, an unpublishable model brand/date in user copy). The fix: every claim made honest or removed; **all 11 orphaned agents wired** (no deletions → 19 agents); new **`/linkedin:firsthour`** command (→ 27 commands) + short-form de-AI gate + video quality gate; `post-feedback-monitor` → Opus; honest newsletter-distribution / profile-SEO / outreach surfaces; **algorithm signals reconciled to one sourced statement** (no model name/date) with `references/algorithm-signals-reference.md` as the single source of truth; analytics fresh-clone crash fixed; **voice-profile leak closed** (placeholder + sentinel + gitignore); structure lint rebuilt with version/count/stat-consistency guards; 7-gate long-form review stack measured → no gate trimmed. **Breaking — reinstall/reload required** for the newly-wired agents; consolidates the v3.0.0 identity break. | | **3.1.0** | 2026-05-29 | Adversarial review package (Endring 9). New **`/linkedin:headless-review`** command + **Step 6.5 (headless-review)** in `/linkedin:newsletter`: three cold/headless archetypes — **`content-reviewer`** (argument), **`language-reviewer`** (Norwegian), **`fact-reviewer`** (cold re-verification + pivot-risk) — plus `persona-reviewer` (resonance/conversion), all with NO drafting-session context. New **`/linkedin:pivot`** command + pivot-detection gate (> 20 % word-count / > 2 new sections re-opens cleared gates before lock). **Per-artifact personas** (`articles.NN.personas`). Pipeline 15 → 16 phases; 24 → 26 commands; 16 → 19 agents; additive `personas`/`pivots`/`headlessReview` state. Backward-compatible; reload required for the new agents. | | **3.0.0** | 2026-05-29 | **Renamed** `linkedin-thought-leadership` → `linkedin-studio` ("LinkedIn Thought Leadership" → **LinkedIn Studio**). Breaking (slug + agent namespace `linkedin-studio:` + runtime state path `~/.claude/linkedin-studio.local.md` all change; reinstall required, state migrated in place), but **functionality byte-identical to v2.4.0**. The `/linkedin:*` commands are unchanged (frontmatter-namespaced, slug-independent). Catch-all skill dir renamed to match (`skills/linkedin-studio/`); the five functional skills unchanged. | | **2.4.0** | 2026-05-29 | Editor's craft gate as an explicit pipeline phase. New **`editorial-reviewer` agent** (Opus) + **Step 5.5 — Editorial review** in `/linkedin:newsletter` (between fact-check and the persona sweep): two axes — **prosa-håndverk** (em-dash density, verbatim repetition, postulated numbers, contradictions, versal-tic) + **narrativ-arkitektur** (concrete instantiation, theory-anchored hypotheses, series-title symmetry, equal action per addressee, un-overloaded conclusion); ≤10 flags BLOCK/REWORK/NICE as direction; operator-gated via `SendUserFile`; mirrors Maskinrommet §C2. Motivated by Del 4 (every persona PASS, yet 8 fresh editor points, ~6/8 craft/architecture blind spots). `editorial-review` phase + additive `editorialReview` state. Pipeline 14 → 15 phases; 15 → 16 agents. New agent + fasit fixture + lint test the only new files; commands (24) unchanged. | diff --git a/plugins/linkedin-studio/scripts/test-runner.sh b/plugins/linkedin-studio/scripts/test-runner.sh index 69e0c70..3e2ee4e 100755 --- a/plugins/linkedin-studio/scripts/test-runner.sh +++ b/plugins/linkedin-studio/scripts/test-runner.sh @@ -9,8 +9,8 @@ # the registration guard that gates the remediation plan's later steps. # # The stat-consistency grep (one magnitude per algorithm effect across the -# tree) is added in remediation Step 3, after reconciliation makes it pass. -# The version-consistency grep is added in Step 21. +# tree) was added in remediation Step 3; the version-consistency grep in +# Step 21. Both are live below (Sections 8 and 9). # # Usage: bash scripts/test-runner.sh # bash 3.2-safe: plain arrays only, no `declare -A`, no `mapfile`/`readarray`. @@ -188,7 +188,7 @@ echo "--- Algorithm-Stat Consistency ---" # reappear anywhere else (cite the reference, do not restate). This enforces # "one value per effect" by forbidding the known competing values from returning. STALE_STATS='40-50%|25-40%|6\.6%|1\.92%|15x more reach|-40-60%|360Brew|January 2026' -STAT_HITS=$(grep -rnE "$STALE_STATS" references/ commands/ skills/ hooks/prompts/ CLAUDE.md README.md 2>/dev/null | grep -v 'algorithm-signals-reference' || true) +STAT_HITS=$(grep -rnE "$STALE_STATS" references/ commands/ skills/ hooks/prompts/ CLAUDE.md README.md .claude-plugin/plugin.json 2>/dev/null | grep -v 'algorithm-signals-reference' || true) if [ -z "$STAT_HITS" ]; then pass "no stale algorithm magnitudes / model brand outside the canonical reference" else @@ -198,6 +198,38 @@ fi echo "" +# --- Section 9: Version Consistency --- +echo "--- Version Consistency ---" + +# Single source of truth for the plugin version: .claude-plugin/plugin.json. +# Its value must be declared identically in the README badge, the CLAUDE.md +# header, and the CHANGELOG top entry. Historical references to older versions +# (CHANGELOG history, the README version-history table, "vX added Y" prose) are +# NOT checked here — only the current-version DECLARATIONS must agree. +VERSION=$(python3 -c "import json; print(json.load(open('.claude-plugin/plugin.json'))['version'])" 2>/dev/null) +if [ -z "$VERSION" ]; then + fail "could not read version from plugin.json" +else + pass "plugin.json version: $VERSION" + if grep -q "version-${VERSION}-blue" README.md; then + pass "README badge declares v$VERSION" + else + fail "README badge does not declare v$VERSION (expected version-${VERSION}-blue)" + fi + if grep -q "LinkedIn Studio Plugin (v${VERSION})" CLAUDE.md; then + pass "CLAUDE.md header declares v$VERSION" + else + fail "CLAUDE.md header does not declare (v$VERSION)" + fi + if grep -q "^## \[${VERSION}\]" CHANGELOG.md; then + pass "CHANGELOG has a [$VERSION] entry" + else + fail "CHANGELOG missing a [$VERSION] entry" + fi +fi + +echo "" + # --- Summary --- echo "================================================" echo "RESULTS"