Two new pipeline phases gate the spine before any prose is written: - Step 2.5 — Skeleton + section pitch: writes <serie>/NN-skjelett.md with 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 can advance. - Step 3a — Spine prose: 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. Old Step 3 (Draft) split into 3a (spine) and 3b (full expansion); 3b owns the multi-session draft-cursor logic. Third persona-reviewer mode added: skjelett (alongside resonans + konverter). Five spine axes scored HOLDER / TVILER / MANGLER, max 3 direction-only flags, per-pitch section-pay-in check. Reads the skeleton + pitches only. Pipeline grows from 11 to 13 phases; commands (24) and agents (14) counts unchanged. Encodes the Maskinrommet writing-contract section A discipline (premiss / problem / anbefaling / gevinst / vei videre) into the pipeline. Empirically motivated by the Seres-serien Del 3 + Del 4 production: a spine error caught at the skeleton stage costs 5-15 min, the same error caught at Step 6 (resonance) costs 4-12 h, post-lock it costs a day of cascading rework (delingstekst, hooks, carousel, doc refs). 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. Steps 1, 2, 4-10 bit-for-bit unchanged. Renderers (build-html.mjs, build-linkedin.mjs) untouched. New phase strings in edition-state.template.json _doc.phases: - skeleton-pitch (between research and draft) - spine-prose (between skeleton-pitch and draft) Files changed (10): - plugin.json: 2.0.0 -> 2.1.0 - CHANGELOG.md: new [2.1.0] entry - CLAUDE.md (plugin + marketplace): pipeline 11->13 phases noted - README.md (plugin + marketplace): What's New v2.1.0 + version row - agents/persona-reviewer.md: third mode skjelett added; resonans + konverter unchanged - commands/newsletter.md: Step 2.5 + 3a + 3b sections, resumption + pipeline tables - config/edition-state.template.json: 11 -> 13 phases in _doc.phases - references/longform-quality-rules.md: Rule 8 (Skjelett foer prosa) Verification: 9/9 criteria PASS pre-commit. Phase strings consistent across template + command + resumption table. Renderer files git-untouched. All 11 original step headings preserved (Step 0/1/2/4-10). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
15 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.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