Implements the 6-change spec from the Seres-serien production (linkedin-plugin-endringsspec.md). All acceptance criteria met. 1. Avoid-patterns (modell-/navne-katalog, completeness-over-reader-action, self-referential overhead openings) → longform-quality-rules.md (rule 1+3) + user-profile.template.md. 2. Persona gate now BLOCKING with explicit hard-fail list (primær mistet meg / doesn't own action / sjargong-mur / modell-navne-katalog → BLOCK; "JA med store forbehold" = NEI) → persona-reviewer.md + personas.template.md. 3. Fact-check declared orthogonal to narrative strength + post-cutoff web-search mandate + high-frequency-error checklist → fact-checker.md. 4. NEW agent voice-scrubber.md (Opus) — de-AI scrub + Norwegian-chronicle voice-drift; gold standard = approved Norwegian editions, NOT the English post corpus. Wired into newsletter.md Step 4. 5. Operator gates = render+annotate rounds (build-html.mjs to file://) as primary flow, AskUserQuestion as receipt/fallback → newsletter.md 2.5+3a. 6. Edition state reconciled with STATE.md (ONE-system). edition-HANDOVER template deleted; narrative to <serie>/STATE.md, machine data (factcheckLog, personaSweep, immutableRules) to edition-state.json. Agents 14 to 15; commands unchanged (24). Backward-compatible (additive state-shape only). Docs updated across all three levels + CHANGELOG. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[2.2.0] - 2026-05-28
Summary
Longform gates hardened with the lessons from the second /linkedin:newsletter production run (Seres-serien). A chronicle built as a model/name catalog passed persona review (its flags were read as notes, not stop-signs) and nearly shipped; the rewrite was stronger but introduced fresh factual errors. v2.2.0 closes six concrete weaknesses: the persona gate becomes blocking with an explicit hard-fail list, fact-check is made orthogonal to narrative strength (more polish → more verification) with a post-cutoff web-search mandate, a new Norwegian-chronicle de-AI voice-scrubber is added and wired into Step 4, operator gates become render+annotate rounds, and per-edition production state is reconciled with the global STATE.md continuity system (no more edition-HANDOVER.md). 14 → 15 agents; commands unchanged (24). Backward-compatible — the only state-shape change is additive.
Added
agents/voice-scrubber.md(new, Opus) — aggressive de-AI scrubber + voice-drift corrector for long-form Norwegian chronicle drafts. Pass 1 strips objective AI-tells («la meg være ærlig», reflex rule-of-three, em-dash-spam, self-referential overhead, modell-/navne-katalog); Pass 2 corrects drift toward the chronicle voice; Pass 3 appends to a chronicle-voice-drift-log so it sharpens over editions. Calibration rule (cardinal): gold standard = the approved Norwegian editions, NEVERassets/voice-samples/authentic-voice-samples.md(English short-form, forbids the em-dash). New agent — requires a session reload before it is invokable.- De-AI / voice scrub sub-pass in
commands/newsletter.mdStep 4 — fans outvoice-scrubber(foreground, namespaced) with the draft + approved-Norwegian-edition paths as the gold standard. - Blocking hard-fail list in
agents/persona-reviewer.md+config/personas.template.md— primær «mistet meg» / doesn't own the action / sjargong-mur / modell-/navne-katalog → BLOCK regardless of other axes. «JA med store forbehold» = NEI. - Post-cutoff fact-check mandate + high-frequency-error checklist in
agents/fact-checker.md— claims dated after the model's knowledge cutoff MUST be web-searched; explicit checks for person titles, org-varying "standards", over-credited studies, source scope, and founding/release years. Fact-check declared orthogonal to narrative strength. - Render+annotate operator gates in
commands/newsletter.mdSteps 2.5 + 3a — HTML annotation viarender/build-html.mjs→file://link is the primary operator-review flow;AskUserQuestionbecomes a receipt + fallback. - Avoid-patterns — modell-/navne-katalog, completeness-over-reader-action, self-referential overhead openings added to
references/longform-quality-rules.md(rules 1 + 3) andconfig/user-profile.template.md. personaSweep.skeleton+immutableRulesfields inconfig/edition-state.template.json(additive).
Changed
- Edition production state reconciled with STATE.md (ONE-system).
commands/newsletter.mdStep 0 now reads<serie>/STATE.md(auto-injected by the session-start hook); every phase writes narrative status to<serie>/STATE.md(overwrite) and machine state (fact-check log, persona verdicts, immutable rules) toedition-state.json. AllHANDOVER §4/§5/§6references replaced. agents/fact-checker.mdprinciple 3 strengthened to make web search mandatory for post-cutoff claims.- README, CLAUDE.md, root README, plugin.json version + descriptions.
Removed
config/edition-HANDOVER.template.md— deleted. The plugin no longer ships or requires a separate handover mechanism;<serie>/STATE.md+edition-state.jsoncarry its content per the global continuity rule.
[2.1.0] - 2026-05-28
Summary
Skeleton gate before prose in /linkedin:newsletter. Two new pipeline phases (Step 2.5 — Skeleton + section pitch; Step 3a — Spine prose) split the old Step 3 into pre-prose / spine-prose / full-prose stages, each with an operator-gate. Adds a third persona-reviewer mode (skjelett) that judges the five-line skeleton + section pitches BEFORE prose is written. Empirically motivated by the Seres-serien Del 3 + Del 4 production: spine errors caught post-prose cost ~1 day; the same error caught at the skeleton stage costs 5–15 minutes. Backward-compatible: existing editions stop at currentPhase: "research" and now resume at Step 2.5 instead of Step 3 — an intended deterministic improvement, never a contract break.
Added
- Step 2.5 — Skeleton + section pitch in
commands/newsletter.md. Writes<serie>/NN-skjelett.mdwith the five-line spine (premiss / problem / anbefaling / gevinst / vei videre) + one-line section pitches. Operator-gate (JA / REVIDER / NEI) AND parallel persona-skjelett-sweep must both return JA before the pipeline advances. Encodes the Maskinrommet writing-contract §A discipline into the pipeline itself. - Step 3a — Spine prose in
commands/newsletter.md. One paragraph per section against the gated skeleton, ~20–30 % of final edition length. Operator-gate on whether the axis lands now that there is prose on it. Cheap second checkpoint before full expansion. - Step 3b — Full prose expansion in
commands/newsletter.md. Splits the old Step 3 (Draft) into spine prose (3a) and full prose expansion (3b). 3b owns the existing draft-cursor logic for multi-session expansion; 3a is short enough to restart on interruption. persona-reviewerskjelett-mode (third mode alongsideresonansandkonverter). Five spine axes (Premiss / Problem / Anbefaling / Gevinst / Vei videre) scored HOLDER / TVILER / MANGLER, ≤3 direction-only flags, per-pitch section-pay-in check, gate ladder PASS / REWORK / BLOCK. Caller passesmode: skjelett.skeleton-pitch+spine-prosephase strings inconfig/edition-state.template.json_doc.phases— 11 → 13 phases. Resumption table incommands/newsletter.mdextended with deterministic rows for both new phases.- Rule 8 — Skjelett før prosa in
references/longform-quality-rules.md. Documents the skeleton-before-prose pre-condition that all other rules implicitly rely on, with the same five-slot format the pipeline enforces.
Changed
/linkedin:newsletterpipeline overview — 11 → 13 phases; pipeline tables incommands/newsletter.mdandCLAUDE.mdreflect the new ordering (0, 1, 2, 2.5, 3a, 3b, 4–10).- Resumption table in
commands/newsletter.md—currentPhase: "research"now resumes at Step 2.5 (was Step 3). Two new rows added forskeleton-pitch(→ Step 3a) andspine-prose(→ Step 3b). Draft-cursor note clarifies that the cursor applies only to Step 3b. agents/persona-reviewer.mddescription, principles, and anti-patterns — extended to cover the third mode (skjelett). Existing resonans + konverter modes unchanged in contract.CLAUDE.mdheader + persona-reviewer row + newsletter command row — reflect v2.1.0 surface.
Not changed (explicit non-deltas)
- Step 1, Step 2, Steps 4–10 in
/linkedin:newsletter— bit-for-bit unchanged in contract. - Renderers —
render/build-html.mjsandrender/build-linkedin.mjsuntouched; both still consumeNN-utkast.md(3a writes the spine state, 3b overwrites with the full state, but onlycurrentPhase: "draft"triggers rendering). - Hooks, scripts, command count (24), agent count (14) — all unchanged.
[2.0.0] - 2026-05-28
Summary
Full-spectrum LinkedIn content engine — short-form feed posts AND long-form newsletter editions in one cohesive surface, with net-fewer commands and net-stronger pipeline. Built across 21 Voyage sessions (S1..S20+S1a) with 1 step = 1 session discipline. Locked decisions A–H in docs/voyage-build-brief.md §3.
Added
/linkedin:newsletter— long-form orchestrator command. Multi-session pipeline: load → calibrate → research fan-out → draft → consistency/quality → fact-check sweep → persona sweep → annotate → lock → delivery → hook-gate → schedule. Maintainededition-state.jsonacross sessions. Supports newsletter editions, essays, and series articles/linkedin:outreach— outreach orchestrator (absorbed/linkedin:collaband/linkedin:speaking). Covers collaborations, partner pitches, and CFPs/speaking opportunities in one surfaceagents/fact-checker.md(Opus, brown) — verifies every factual claim in long-form drafts against primary sources. Outputs 🟢/🔴/🟡 verdicts per claim. Runs BEFORE lockagents/persona-reviewer.md(Opus, olive) — evaluates reader-persona resonance + hook-conversion gate. Two modes: per-persona deep review, multi-persona scoreboard. Runs BEFORE lockrender/pipeline migrated in-plugin —build-html.mjs,build-pdf.mjs,build-linkedin.mjs,build-carousel.mjs. Self-hosted fonts (Newsreader, Inter, JetBrains Mono) under OFL-1.1 withrender/OFL.txt. WeasyPrint degradation: missing binary → skip-signal, not throwconfig/personas.template.md— reader persona library. Knowledge level, time-pressure, resonance criteria per persona. Consumed bypersona-reviewerconfig/edition-state.template.json— schema for long-form edition state across sessionsreferences/longform-quality-rules.md— quality bar specific to long-form (different from short-form rules)- Router gating —
/linkedin:monetizeand/linkedin:outreachsurface "unlocks at ~1K followers" guidance and point sub-1K users at/linkedin:strategyfirst docs/agents-capability-matrix.md— single source of truth for which agent owns which capability. Pipeline diagram + intent table + model tier table
Changed
- Agent merges (16 → 14):
performance-reporter→analytics-interpreter(interpret + report modes, same data sources, mode-selector by trigger phrase)comment-strategist→engagement-coach(5x5x5 + first-hour + CEA method + target scoring + daily routine + comment quality scorecard; upgraded haiku → sonnet since the agent now handles deeper work)content-tracker→ absorbed bystate-updater.mjs+analytics-interpreterpersonalization-scorer→ absorbed bypersonalization-score.mjs(deterministic, no AI)
- Command merges (27 → 24):
/linkedin:templates→ mode in/linkedin:quick(8 post-type templates)/linkedin:publish→ action in/linkedin:calendar(mark scheduled posts as published)/linkedin:authority→ absorbed into/linkedin:strategy(canon for authority building, trajectory dedup)/linkedin:collab+/linkedin:speaking→/linkedin:outreach
/linkedin:importStep 6 analysis — delegated to/linkedin:report(both consume the sametrendsCLI; no more duplicated analysis pipeline)commands/linkedin.mdrouter — newsletter row added, removed-command rows pruned, gating-rule paragraph for monetize/outreach- All 6 skill catalogs reconciled —
linkedin-content-creation,linkedin-analytics,linkedin-strategy,linkedin-networking,linkedin-thought-leadership,linkedin-voiceall reflect the v2.0.0 command/agent set
Removed
commands/templates.md(absorbed intocommands/quick.md)commands/publish.md(absorbed intocommands/calendar.md)commands/authority.md(absorbed intocommands/strategy.md)commands/collab.md(absorbed intocommands/outreach.md)commands/speaking.md(absorbed intocommands/outreach.md)agents/content-tracker.mdagents/personalization-scorer.mdagents/performance-reporter.mdagents/comment-strategist.md
Fixed
references/glossary.md"Authority Score" entry — corrected stale ref tocommands/authority.md(removed) →commands/strategy.md(canon)scripts/test-runner.shEXPECTED_AGENTSlist — reconciled to 14 agents
Migration notes
- Plugin remains fully backward-compatible from a user-perspective: removed commands now route to their absorbing command via
commands/linkedin.md - v1.x users who had
commands/templates.mdetc. in muscle memory will be auto-redirected by the router
[1.2.0] - 2026-04-11
Summary
Friction reduction release. Fewer interactive steps, auto-clipboard, deterministic state management, and progressive onboarding.
Added
clipboard-helper.mjs— cross-platform clipboard utility (macOSpbcopy, Linuxxclip/xsel, WSLclip.exe). All 8 content commands auto-copy output to clipboardstate-updater.mjs— deterministic state mutations:updatePostTracking,pruneContentHistory,updateFollowerCount. Pure functions with 19 tests. No AI involvement in state updatesical-generator.mjs— RFC 5545 calendar file generation for batch scheduling. VALARM reminders, VTIMEZONE support, line folding, special character escaping. 16 tests- MCP image carousel pipeline —
/linkedin:carouselgenerates professional slide images via mcp-image (1080x1350, 3:4 ratio) with text overlays. Mermaid Chart and text-based fallbacks - Progressive onboarding — personalization score hidden until 3+ posts; voice guardian suppressed until 5+ voice samples; reasonable defaults in state template
- iCal integration in batch —
/linkedin:batchgenerates.icsfile importable into macOS Calendar, Google Calendar, and Outlook - Auto-prune content history — session-start dynamically imports
pruneContentHistoryto remove entries older than 90 days
Changed
- Reduced interactive steps — angle, format, and post type inferred from context. Max 2 questions per post (down from 4-6) in
post,quick,react,pipeline - State management — Stop hook and 8 commands now reference
state-updater.mjsfor deterministic writes instead of AI-driven YAML editing - State file template — default expertise area changed from domain-specific to
"general"for better new-user experience
[1.1.0] - 2026-04-08
Summary
Q2 2026 feature release. 9 improvements across onboarding, content quality, and analytics pipeline.
Added
/linkedin:onboarding— multi-step onboarding wizard: profile → setup → first-post as one guided flow/linkedin:carousel— structured multi-slide carousel generator with 5 templates and design specs- Voice drift scoring — 6-dimension rubric (sentence structure, word choice, openings, storytelling, tone, formatting) with AUTHENTIC/CAUTION/ALERT/REWRITE verdicts in voice-guardian hook
- Industry angle variants — 48 concrete variants (6 industries × 8 angles) in thought-leadership-angles reference
- Multi-URL comparison —
/linkedin:reactnow supports 2-3 URL synthesis with contrarian and pattern analysis angles - Day-of-week heatmap —
heatmapCLI command andHeatmapReporttype in analytics pipeline - Month-over-month reports —
report --month YYYY-MMCLI command with MoM deltas, weekly breakdown, top performers - Automated week-rollover — session-start hook now writes
posts_this_week: 0and updatescurrent_weekon ISO week change - Collected Post Samples — Stop hook passively accumulates published posts in voice-samples file for drift scoring
Changed
- README Quick Start — replaced 4-step manual flow with single
/linkedin:onboardingentry point /linkedin:report— Step 2 now offers report type choice (weekly/monthly/heatmap)/linkedin:post— Step 2 shows industry-specific angles when user-profile has industry set; Step 3 redirects to carousel when appropriate/linkedinrouter — added onboarding and carousel to menus and direct routing- Command count — 25 → 27 (onboarding, carousel)
[1.0.0] - 2026-04-07
Summary
Public release for open-source marketplace. All runtime bugs fixed, documentation aligned, agent model tiering implemented.
Fixed
- Agent model assignments — all 16 agents corrected from opus to proper tiering (12 Sonnet, 4 Haiku)
- Queue manager references — 10 stale
queue-manager.shreferences replaced withqueue-manager.mjsNode.js invocations - Quick-import references — 2 stale
quick-import.shreferences updated to.mjs - Personalization score import bug — standalone execution block now guarded to prevent stdout contamination on import
- Regex anchor — invalid
\ZJavaScript regex replaced with$in user-prompt-context.mjs - Agent color mismatches — 8 agent frontmatter colors unified with CLAUDE.md documentation
- Version inconsistency — unified from 3 conflicting versions (0.6.0/1.7.0/2.0.1) to 1.0.0
Added
- plugin.json — added
license,repository,keywordsfields for marketplace compliance - README — attribution note, "What This Plugin Does Not Cover" section, Node.js 18+ prerequisite, hooks badge
- CONTRIBUTING.md — replaced GitHub PR template with solo-project boilerplate
- Quality scorecard — added "Voice Authenticity" criterion (total now /81)
- Commands —
/linkedin:reactand/linkedin:first-postadded to README command tables - agents/README.md — updated from 14 to 16 agents, added personalization-scorer and post-feedback-monitor
- SKILL.md — added 5 missing commands to router command table
Changed
- CLAUDE.md — compacted from 237 to 90 lines, removed duplicated content
- All hooks — 100% Node.js (.mjs), no bash dependencies (cross-platform: macOS/Linux/Windows)
- Error handling — added JSON.parse guards in queue-manager.mjs and analytics storage.ts
Removed
- Skill version fields — removed non-standard
version:from all 6 SKILL.md frontmatter - Development artifacts — removed internal evaluation note from collab.md
- Orphaned files — deleted outdated docs/commands-reference.md
- BACKLOG.md and DEVELOPMENT-LOG.md — gitignored (internal development files)
[0.6.0] - 2026-02-07
Note
First formal version. Previously unversioned.
What exists today
- 20 commands covering full content lifecycle
- 15 specialized agents
- 8 hooks for workflow automation
- Analytics system with CSV import
- 360Brew profile optimization (January 2026 algorithm update)
- Content matrix system (40+ post ideas from single topic)
- Personalization engine
- 20 reference documents for LinkedIn best practices
- Full content pipeline from ideation to post-publish monitoring