chore(linkedin-studio): release v4.0.0 — counts, three-doc, CHANGELOG (clears [skip-docs] debt)
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 <noreply@anthropic.com>
This commit is contained in:
parent
0d3da7828d
commit
1fa2cc945e
8 changed files with 84 additions and 18 deletions
|
|
@ -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:<agent>`, 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"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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 `<!-- VOICE_PLACEHOLDER -->` 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:<agent>`) / 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -6,15 +6,15 @@
|
|||
|
||||
*AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)*
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
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:<agent>` + 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. |
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue