Endring 7 from the change-spec: make visual assets an explicit pipeline phase. New Step 7.5 (visual-assets) between annotation (Step 7) and lock (Step 8): cover (+ optional inline figures) or carousel deck, generated and operator-gated BEFORE lock so build-linkedin.mjs picks up cover.png at lock without a post-lock re-render. Pipeline 13 → 14 phases. - commands/newsletter.md: Step 7.5 section, pipeline overview + build-status, resumption table (annotation → 7.5; new visual-assets → 8), Step 8 precondition, reference-file list. - config/edition-state.template.json: visual-assets phase + additive articles.NN.visualAssets schema (format / cover / figures / carousel). - config/image-credit-caption.template.md (new): motif + credit + caption table, honest-about-AI credit, naming convention. - Two generation routes, no lock-in: default mcp-image (cover-v<N>-kandidat.png) or external cover-raw.png. Operator-gate via SendUserFile → cp to cover.png. Carousel branch reuses render/build-carousel.mjs. - Doc/orchestration-only — no new code. Commands (24) + agents (15) unchanged. - Version sync 2.2.0 → 2.3.0 across plugin.json, CHANGELOG, README, CLAUDE.md, root README + root CLAUDE.md. Correction: spec claimed build-linkedin.mjs handles fig1-4; verified it does NOT — it embeds only cover.png by fixed name; figures are referenced in the draft markdown and uploaded manually. Step 7.5 documents actual behavior. All 8 acceptance criteria met. JSON valid (14 phases); 20/20 render tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
22 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.3.0] - 2026-05-28
Summary
Visual assets become an explicit pipeline phase in /linkedin:newsletter. Until now images (cover + inline figures) were produced ad-hoc outside the 13-phase pipeline and referenced manually from edition-config.json + linkedin/NN/cover.png — even though a cover is mandatory (KTG cover-directive 27.05: «TLDR on top + at least one figure per article») and must coordinate with the text. v2.3.0 adds Step 7.5 — Visual assets, between annotation (Step 7) and lock (Step 8), so the cover is generated, operator-gated, and approved before lock — render/build-linkedin.mjs picks up linkedin/NN/cover.png at lock, so generating images after lock would force a re-render and break the lock. Pipeline 13 → 14 phases. Doc/orchestration-only — no new code; mcp-image is the default generation route but the interface stays pluggable (external cover-raw.png accepted), and the carousel branch reuses the existing render/build-carousel.mjs. Backward-compatible: the only state-shape change is additive (visualAssets), and existing editions resume by currentPhase (annotation now resumes at Step 7.5 instead of Step 8 — an intended deterministic improvement).
Added
- Step 7.5 — Visual assets in
commands/newsletter.md(between Step 7 annotation and Step 8 lock). Decides image needs from the article type (method-heavy → 1–2 inline figures, diagnosis-heavy → cover only), writes a per-image brief, generates via two routes (defaultmcp__mcp-image__generate_image→cover-v<N>-kandidat.png; external →cover-raw.png), runs the operator-gate (candidates surfaced viaSendUserFile, approval copied to the fixedcover.pngname — the same render+annotate pattern as Steps 2.5/3a), and records credit + caption. Explicit carousel branch (format: "carousel"): render the deck viarender/build-carousel.mjsinstead of cover+inline. visual-assetsphase string +articles.NN.visualAssetsschema inconfig/edition-state.template.json_doc.phases(13 → 14 phases) —{ format, cover: { brief, route, candidates[], approved, status }, figures: [ { id, brief, placement, status } ], carousel }. Additive; defaultformat: "standard".config/image-credit-caption.template.md(new) — cover motif + credit + caption table, modelled on the established Seres-serienimage-credit-caption.md. Honest-about-AI credit per the verification duty; documents the cover/figure naming convention.- Naming convention documented in
commands/newsletter.mdStep 7.5 —cover.png(approved, fixed) /cover-v<N>-kandidat.png(attempts) /cover-raw.png(external pre-edit source) /fig<N>.png(inline). Consistent with existing series use.
Changed
/linkedin:newsletterpipeline overview — 13 → 14 phases; the overview table, build-status note, and reference-file list reflect Step 7.5.- Resumption table in
commands/newsletter.md—currentPhase: "annotation"now resumes at Step 7.5 (was Step 8); newvisual-assetsrow resumes at Step 8.persona-sweep-prelockflows Step 7 → Step 7.5. - Step 8 lock preconditions now require the gated
visualAssets(approvedcover.pngforstandardformat, or approvedcarousel.pdfforcarouselformat) alongside the existing fact-check (no open 🔴) and primær-JA gates. - README, CLAUDE.md, root README, root CLAUDE.md, plugin.json version + descriptions.
Not changed (explicit non-deltas)
- Steps 0–7, 8 body, 9, 10 in
/linkedin:newsletter— contract unchanged apart from the Step 7→7.5→8 wiring and the additive Step 8 precondition. - Renderers —
render/build-linkedin.mjs,build-html.mjs,build-carousel.mjsuntouched (Step 7.5 calls them; no code change).build-linkedin.mjsstill readscover.pngby fixed name and does not embedfig<N>.png(figures are referenced in the draft and uploaded manually) — Step 7.5 documents this actual behavior rather than overstating it. - Hooks, scripts, command count (24), agent count (15) — all unchanged.
[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