Commit graph

29 commits

Author SHA1 Message Date
7ebd28cb0b feat(linkedin): v2.3.0 — Step 7.5 visual-assets phase in /linkedin:newsletter
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>
2026-05-28 22:49:19 +02:00
4ed9717627 feat(linkedin): v2.2.0 — harden longform gates from 2nd production run
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>
2026-05-28 20:50:56 +02:00
2a27a7cd6a feat(linkedin): v2.1.0 — skeleton + spine-prose gates BEFORE prose in /linkedin:newsletter
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>
2026-05-28 10:09:47 +02:00
8de481399e chore(linkedin): v2.0.0 — import trim, router gating, full doc pass (S20) 2026-05-28 06:53:55 +02:00
930836597e refactor(linkedin): merge analytics + engagement agents 2→1 each (S19)
- analytics-interpreter absorbs performance-reporter (interpret/report modes,
  identical data sources): mode-selector + both output templates kept inline.
- engagement-coach absorbs comment-strategist (5x5x5 + first-hour + CEA
  commenting + target selection + scoring + quality scorecard + daily
  routine). Self-ref at engagement-coach.md:24 rewritten — target is now
  in-file. Model upgraded from haiku to sonnet (absorbed deeper work);
  tools union: Read, Glob, WebSearch.
- 7 ref-files reconciled: commands/linkedin.md (router rules merged),
  skills/linkedin-analytics (row dropped), skills/linkedin-thought-leadership
  (2 rows merged), skills/linkedin-networking (row dropped), CLAUDE.md
  (agents table 16→14, merged rows), README.md (agents table, flow diagram,
  intent table, analytics consumers line), references/glossary.md (3 'Used in'
  refs), scripts/test-runner.sh (EXPECTED_AGENTS list reconciled to current
  14 — also closed lingering S5/S6 gaps for fact-checker/persona-reviewer/
  video-scripter, removed already-deleted content-tracker/personalization-scorer),
  docs/agents-capability-matrix.md (full restructure: header count 16→14,
  agent table, capability grid columns + capabilities, pipeline diagram,
  intent table, model selection table — fixed STATE residual #1 on the
  tracker/pers-scorer stale columns in the same pass).
- Q2 decision (video-scripter → content-repurposer?): KEEP separate.
  Distinct invocation paths (/linkedin:video vs format conversion), distinct
  outputs (timed video script with pacing+captions vs format-translation
  artifact), and newsletter.md already uses content-repurposer for prose
  drafting independently of video-scripter. Net agents/ 16→14.
- agents/README.md dropped from Files (moved to docs/agents-capability-matrix.md
  in S14); literal Verify exits 2 on missing path (logged), corrected Verify
  passes 4/4 predicates. Manifest audit: 2/2 expected paths exist, 13 'CEA'
  occurrences in engagement-coach.md.
- gitleaks: clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 06:19:20 +02:00
0b44f219b6 refactor(linkedin): absorb authority into strategy + profile canon (S18)
- commands/strategy.md: extend frontmatter with authority triggers; insert
  Step 3.6 Authority Building (signature content map, greatest hits, derivative
  planning, content + network signals, action plan, monthly scorecard); add
  algorithm-signals-reference.md to Reference Files.
- commands/audit.md: Step 5.5 trajectory-review and Step 7 report-block
  trajectory section now route to /linkedin:strategy (the canon); Step 6
  profile-alignment routes to /linkedin:profile (the canon); drop
  trajectory-strategy-adjustments.md + algorithm-signals-reference.md from
  loaded references (canons own them).
- commands/analyze.md: 'If Profile-Content Mismatch' subsection routes to
  /linkedin:profile for the per-section checklist; quick-triage list kept.
- commands/authority.md: removed (absorbed by strategy.md).
- commands/linkedin.md: drop authority table row, merge 'Build authority'
  into AskUser item #10 (Growth strategy & authority), renumber 14-23 to
  13-22, broaden strategy routing trigger keywords, drop standalone
  authority routing rule.
- skills/linkedin-strategy/SKILL.md, skills/linkedin-thought-leadership/SKILL.md,
  CLAUDE.md, README.md: drop /linkedin:authority rows; widen /linkedin:strategy
  descriptions to reflect new scope.

Verification:
- Literal Verify (plan.md:704) exits 1 (expected inversion).
- Corrected predicate (test ! -f && ! grep -rqn …) exits 0 — clean.
- Manifest: commands/strategy.md present; [Aa]uthority match count = 24.
- Hooks: python3 hooks/scripts/compile-hooks.py --check → clean.
- Command count: 25 → 24.
- End-to-end Verification §849 (templates|publish|authority|collab|speaking)
  grep across commands/ agents/ skills/ hooks/ README.md CLAUDE.md → empty.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 06:01:43 +02:00
d5ee9d19fa refactor(linkedin): merge collab + speaking into outreach (S17)
Step 18 (fasit S17): merged commands/collab.md + commands/speaking.md
into a single commands/outreach.md covering both tracks under one
outreach/pitch paradigm. Structural twins: same outreach/pitch flow
(readiness → identify → score → format/abstract → outreach by
temperature → production/portfolio → engagement-pod warning →
pipeline tracker → network/progression → results dashboard) with
track-specific detail at each step.

Capability checklist: every function of both predecessors preserved:
- Collab: 5-item readiness, partner search + 25-pt rubric,
  12 formats across 4 maturity tiers, cold/warm/established outreach,
  DM amplification protocol, 5-phase co-creation workflow,
  shared drafting ground rules, pipeline board, health signals,
  Inner Circle tiers, long-term partnership framework.
- Speaking: 100-pt readiness scorecard, event/CFP search +
  research template, Nordic/European tech conference calendar,
  4 talk abstract templates, speaker positioning content calendar,
  demo reel strategy, speaker bio variants (50/100/200 words),
  CFP cover note + organizer outreach (cold/warm),
  post-speaking follow-up sequence, pipeline tracker,
  progression ladder (4 levels).
- Both: engagement-pod warning (post-Mar-2025), quarterly results
  dashboard with both tracks.

Removed commands/collab.md, commands/speaking.md.

Reconciled all 16 route-refs across plugin (collab 8, speaking 8):
- commands/linkedin.md: table row, priority list (items 16-17 → 16),
  routing rules (lines 177-178 → one rule), removed 'outreach' keyword
  from network-builder agent suggestion (now belongs to /linkedin:outreach).
- skills/linkedin-thought-leadership/SKILL.md: pillar table + all-commands
  table (lines 30, 140, 142).
- skills/linkedin-networking/SKILL.md: commands table (lines 29-30).
- CLAUDE.md: commands table (lines 63-64).
- README.md: feature bullet (line 68), commands table (lines 168-169),
  skills pillar table (line 289), ToS table (line 514).

Verify: corrected predicate (test ! -f X && test ! -f Y && ! grep -rqn)
exit 0. Literal Verify (plan.md:681) exit 1 due to the same exit-inversion
bug observed at Step 16/17 — logged for plan-pass at Step 21.

Manifest audit PASS: commands/outreach.md present; [Ss]peaking 40 hits;
min_file_count=1 satisfied; forbidden/bash checks vacuous.

Net commands/: 26 → 25 (matches plan).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 05:41:09 +02:00
e4aa5a61c2 refactor(linkedin): merge publish into calendar — reconcile hook refs (S16)
Step 17 of voyage-build (S16 in plan). publish.md absorbed into calendar.md
as an inline action (Mark as Published flow: queue update, state update,
first-hour battle plan) reusing the same queue-manager.mjs + state-updater.mjs
primitives that publish.md called. calendar.md frontmatter triggers extended
with the publish trigger words; quick-routing block jumps straight to the
publish action when the user prompt names it.

All 21 route-refs reconciled across the 9 expected files, with the 9
hook-script refs (5 in session-start.mjs, 2 in posting-reminder.mjs, 1 in
user-prompt-context.mjs, 1 in hooks/prompts/state-update-reminder.md)
rewritten to call /linkedin:calendar so the runtime guidance no longer
points at a dead command. compile-hooks.py --check reports clean (no
type: prompt hook changes touched hooks.json).

Verify (intent: zero stray refs, file gone): exit 0. Literal Verify in
plan.md:727 logged exit 1 (same exit-inverted && pattern as S15 plan.md:635
— logged for plan-pass at Step 21).

Manifest audit: PASS (expected_paths=calendar.md present; must_contain
[Pp]ublish: 17 matches in calendar.md).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 05:27:36 +02:00
ddd84e4501 refactor(linkedin): merge templates into quick (S15) 2026-05-28 00:07:09 +02:00
92e0a0b4f5 fix(linkedin): close dogfood friction (S14)
Close all 9 friction points from the S13 newsletter dogfood (operator
elected to fix F6-F9 rather than defer):

- F1: namespace all subagent_type calls in newsletter.md to
  linkedin-thought-leadership:<name> (4 sites + canonical note)
- F2: document agent invocation form + reload requirement in CLAUDE.md
  + README.md (reload itself is an operator action)
- F3: add edition-config / edition-delingstekst / edition-HANDOVER
  templates under config/ + wire into Steps 0 and 8 + footer
- F4: reconcile draft path to <serie>/NN-utkast.md (series root)
- F5: de-hardcode series root (explicit arg / LTL_SERIES_ROOT / default)
- F6: config-derive carousel editions (remove Seres CAROUSEL set);
  correct samle comment
- F7: build-html.mjs exits non-zero when zero HTML produced
- F8: guard parseDelingstekst (graceful ENOENT) + correct Step 8 wording
- F9: relocate agents/README.md -> docs/agents-capability-matrix.md

Re-tested: 87/87 plugin tests pass; build-html/build-linkedin behavior
re-verified live. Per-item outcomes logged in dogfood-S13-friction.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 23:37:39 +02:00
8d25dd908e feat(linkedin): longform quality rules + edition resumption wiring (S12) 2026-05-27 22:30:42 +02:00
e031fae3de refactor(linkedin): single newsletter entry + skill trigger + router row (S11) 2026-05-27 22:08:16 +02:00
f24c6e30f7 feat(linkedin): newsletter Step 7-10 lock, delivery, hook-gate, schedule (S10) 2026-05-27 21:42:22 +02:00
fba70870ce feat(linkedin): newsletter Step 5-6 fact-check + persona sweep before lock (S9) 2026-05-27 21:33:43 +02:00
39ae875b96 feat(linkedin): newsletter Step 3-4 draft + consistency (S8) 2026-05-27 21:25:42 +02:00
9b1669a3f6 feat(linkedin): newsletter command skeleton Step 0-2 (S7) 2026-05-27 21:10:39 +02:00
ca5aa4e698 refactor(linkedin): edition-state schema + retire 2 deterministic agents to scripts (S6)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 20:26:14 +02:00
Kjell Tore Guttormsen
8606abf5ee feat(linkedin): progressive onboarding — hide score until 3+ posts, suppress voice guardian noise
- session-start.mjs: count published posts, gate personalization score
  display and reminder behind >= 3 published posts
- voice-guardian.md: suppress LOW CONFIDENCE messages, silently skip
  drift scoring when < 5 samples
- state-file.template.md: add "general" default for expertise_areas
- onboarding.md: show friendly defaults message for new users, move
  score dashboard to returning-user flow

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 00:50:18 +02:00
Kjell Tore Guttormsen
1474948ef8 feat(linkedin): integrate state-updater.mjs across all commands and hooks
Replace manual YAML editing instructions with deterministic
state-updater.mjs calls in 8 content commands (post, quick, react,
pipeline, first-post, video, publish, carousel) and 2 hook prompts
(state-update-reminder, post-creation-automation). Batch.md gets note
that state updates happen at publish time.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 00:42:17 +02:00
Kjell Tore Guttormsen
b3979d0e5d feat(linkedin): generate iCal file during batch creation
Step 5b in batch.md generates a .ics calendar file from the queue,
giving users 15-minute reminders in their calendar app before each
scheduled post. Supports macOS Calendar, Google Calendar, Outlook.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 00:28:00 +02:00
Kjell Tore Guttormsen
aca312ea57 feat(linkedin): add MCP image pipeline to carousel command
Add Step 5.5 (Generate Slide Images) using mcp-image Nano Banana Pro.
Each slide is generated with template-specific styling at 3:4 aspect
ratio. Graceful degradation: if mcp-image unavailable, falls back to
text-only output with manual design guide (existing behavior).

- mcp__mcp-image__generate_image added to allowed-tools
- Template-aware visual styles (5 templates → 5 visual directions)
- Images saved to assets/drafts/carousel-[date]-[slug]/
- Step 6 branches: generated images → publish instructions, no images → design guide
- Removed interactive AskUserQuestion from refinement (friction reduction)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:49:35 +02:00
Kjell Tore Guttormsen
b0df1ba304 test(linkedin): verify mcp-image text-overlay capability for carousel slides
Text overlay VERIFIED: Nano Banana Pro renders readable text on dark
gradient backgrounds at 3:4 aspect ratio (closest to LinkedIn 4:5).
Header and subtitle both legible. Mermaid Chart available but untested.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:29:28 +02:00
Kjell Tore Guttormsen
10b70dba10 feat(linkedin): reduce interactive steps in quick, react, pipeline commands
quick.md:
- Replace 8-option post type menu with context inference
- Auto-select CTA based on post type
- Remove proactive alternative version offering
- AskUserQuestion: 0 in main flow (was 1 implicit menu)

react.md:
- Auto-select strongest angle instead of 3-option AskUserQuestion
- Replace 6-option refinement AskUserQuestion with plain text options
- Same treatment for comparison path (Step 4b)
- AskUserQuestion: 1 in main flow (multi-URL only, was 3)

pipeline.md:
- Skip ideation ask if topic provided with command invocation
- Auto-propose planned topic without AskUserQuestion
- Inline angle selection (auto-select strongest)
- AskUserQuestion: 2 in main flow (ideation fallback + scheduling, was 3)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:18:50 +02:00
Kjell Tore Guttormsen
180e2fb4c2 feat(linkedin): reduce post.md to max 2 interactive steps
- Skip topic ask if user provided one with command invocation
- Auto-select strongest angle instead of 3-option AskUserQuestion menu
- Infer format from content type instead of interactive selection
- Present ONE draft without proactive alternative versions
- Replace refinement AskUserQuestion with plain text options

Net result: 0 AskUserQuestion calls in main flow (was 2).
User provides topic → gets ONE draft → clipboard-ready.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:16:49 +02:00
Kjell Tore Guttormsen
dcaa0d13c6 feat(linkedin): add auto-clipboard on all content commands
Adds Bash to allowed-tools and clipboard-helper.mjs auto-copy to:
post.md, quick.md, react.md, pipeline.md, first-post.md,
video.md, multiplatform.md, carousel.md.

Each command auto-copies the final post/caption text to clipboard
after presenting the draft. Replaces manual copy-paste instructions
in first-post.md (=== COPY FROM HERE ===) with auto-copy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:12:19 +02:00
Kjell Tore Guttormsen
5be9c8e47c feat(ultraplan-local): v1.6.0 — /ultraresearch-local deep research command
Add /ultraresearch-local for structured research combining local codebase
analysis with external knowledge via parallel agent swarms. Produces research
briefs with triangulation, confidence ratings, and source quality assessment.

New command: /ultraresearch-local with modes --quick, --local, --external, --fg.
New agents: research-orchestrator (opus), docs-researcher, community-researcher,
security-researcher, contrarian-researcher, gemini-bridge (all sonnet).
New template: research-brief-template.md.

Integration: --research flag in /ultraplan-local accepts pre-built research
briefs (up to 3), enriches the interview and exploration phases. Planning
orchestrator cross-references brief findings during synthesis.

Design principle: Context Engineering — right information to right agent at
right time. Research briefs are structured artifacts in the pipeline:
ultraresearch → brief → ultraplan --research → plan → ultraexecute.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 08:58:35 +02:00
Kjell Tore Guttormsen
1a8cc1942c feat(linkedin-thought-leadership): v1.1.0 — Q2 2026 feature release
9 improvements across 3 tracks:

Onboarding: /linkedin:onboarding wizard, README Quick Start rewrite
Content Quality: voice drift scoring, industry angle variants,
  /linkedin:carousel, /linkedin:react multi-URL comparison
Analytics: automated week-rollover, day-of-week heatmap,
  month-over-month reports

25→27 commands. All Q2 ROADMAP items completed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 06:16:35 +02:00
Kjell Tore Guttormsen
c747ab6ee6 feat(linkedin-thought-leadership): onboarding improvements for new users
- Session-start hook: welcome message with getting-started steps on first run
- Session-start hook: prominent personalization score section when score is 0
- Router: condensed 4-option menu for users who haven't posted yet
- Post/quick commands: non-blocking readiness check for unpersonalized state
- Post-creation hook: inline 5x5x5 engagement ritual explanation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 22:11:59 +02:00
Kjell Tore Guttormsen
39f8b275a6 feat(linkedin-thought-leadership): v1.0.0 — initial open-source import
Build LinkedIn thought leadership with algorithmic understanding,
strategic consistency, and AI-assisted content creation. Updated for
the January 2026 360Brew algorithm change.

16 agents, 25 commands, 6 skills, 9 hooks, 24 reference docs.

Personal data sanitized: voice samples generalized to template,
high-engagement posts cleared, region-specific references replaced
with placeholders.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 22:09:03 +02:00