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:
Kjell Tore Guttormsen 2026-05-30 07:49:48 +02:00
commit 1fa2cc945e
8 changed files with 84 additions and 18 deletions

View file

@ -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 03).** 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