docs(linkedin-studio): N4 sannhetspass — GR-modellkorreksjon + maturity/saves/kø/SB-header + refs-badge 28

Del 1 (RE-verifisert mot ground truth): README maturity-note (herding 29/29 +
kald-review 29/29; gjenstår = GUI), CLAUDE.md maturity-linje (B-F10),
hardening-plan-køen t.o.m. S31a/b/c, second-brain-header (SB-S3a-e landet,
kun S4 gjenstår).

Del 2: D-1 BLOCKER — algorithm-signals GR-seksjonen omskrevet mot primærkilde
(LinkedIn engineering-blogg 2026-03-12, Hristo Danchev: Generative Recommender
(GR) offisielt navn + LLM-retrieval + utrulling annonsert); fabrikasjonsflagget
avviste en ekte primærkilde og er trukket med korreksjonsnote; 360Brew-skepsis
beholdt. D-2 — saves-begrunnelse: Marketing API v202604 har POST_SAVE på
/memberCreatorPostAnalytics (partner-gated; manuell inntasting forblir riktig
UX). B-F11 — README refs-badge 26->28 + 25-document->28-document (ls
references/*.md = 28). CLAUDE.md Architecture faar specifics-bank +
contract-gate-linjer.

CHANGELOG-catchup kommer i release-committen (0.6.0) for aa holde
versjonsdeklarasjonene konsistente per commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: df0a1ca3-78dd-455e-99a2-e7c133fcb5f6
This commit is contained in:
Kjell Tore Guttormsen 2026-07-17 03:35:40 +02:00
commit 5c6393f2f7
5 changed files with 32 additions and 15 deletions

View file

@ -1,6 +1,6 @@
# LinkedIn Studio Plugin (v0.5.3)
Full-spectrum LinkedIn content engine — short-form feed posts, carousels, video scripts, and long-form newsletter editions — with the 2026 relevance-ranking model baked in. Maturity v0.5.3: M0 (per-user data dir `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/`, idempotent session-start migration — see `references/data-path-convention.md`) complete; all 29 command surfaces through the interactive quality-gate (`docs/hardening/log.md`). Remaining for v1.0.0: a GUI + independent cold-review coverage (the `/trekreview` artifact `docs/hardening/review.md` persists for S1 only — see `docs/hardening/plan.md`). Version history → `CHANGELOG.md`.
Full-spectrum LinkedIn content engine — short-form feed posts, carousels, video scripts, and long-form newsletter editions — with the 2026 relevance-ranking model baked in. Maturity v0.5.3: M0 (per-user data dir `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/`, idempotent session-start migration — see `references/data-path-convention.md`) complete; all 29 command surfaces through the interactive quality-gate (`docs/hardening/log.md`) AND through independent cold-review (29/29, R2aR5 — `docs/hardening/review*.md`). Remaining for v1.0.0: a GUI. Version history → `CHANGELOG.md`.
## Architecture
@ -11,7 +11,9 @@ Full-spectrum LinkedIn content engine — short-form feed posts, carousels, vide
- **Figure renderer:** `render/build-figur.mjs` — coded data figures (SVG/HTML → PNG via headless Chrome); three targets (article/carousel/single); brand tokens from the user data dir's `profile/brand-tokens.json`, neutral defaults otherwise (see `references/figure-design-guidelines.md`). Standalone CLI + importable module
- **Post queue:** `assets/drafts/queue.json` (managed by `hooks/scripts/queue-manager.mjs`)
- **Analytics:** CLI `scripts/analytics/` (TypeScript, needs `tsx` + `npm install`); data `assets/analytics/` (gitignored)
- **Analytics metrics (S16):** parsed CSV columns + an optional, manually-entered `saves` count (count-only in native LinkedIn analytics since ~Sept 2025, no CSV export / no API). `parseOptionalCount()`: blank / non-numeric / negative → `undefined` (`unknown`, never 0), a genuine `0` is kept; saves surfaced per-post + as `totalSaves`, but **not** folded into `engagementRate`. `dwell` stays **explicitly unmeasurable** (internal to LinkedIn, no export/API). All analytics I/O routes through the `getAnalyticsRoot()` seam (M0 per-user data-dir).
- **Specifics-bank:** `scripts/specifics-bank/` (TypeScript, needs `tsx` + `npm install`) — deterministic, topic-tagged store of the operator's lived specifics (real numbers, named cases, held opinions) in the per-user data dir; elicited/bound by `/linkedin:newsletter` Step 1.5 so drafts draw from real inventory, never invented filler
- **Contract-gate:** `scripts/contract-gate/` (TypeScript, needs `tsx` + `npm install`) — deterministic §B/§C1 rule-gate on the full draft (`/linkedin:newsletter` Step 4.5, before the AI sweeps); ratifies `rules.ts` against the edition's §E-manifest, then gates with BLOCK/WARN
- **Analytics metrics (S16):** parsed CSV columns + an optional, manually-entered `saves` count (count-only in native LinkedIn analytics since ~Sept 2025, no CSV export; the Marketing API exposes `POST_SAVE` on `/memberCreatorPostAnalytics` from v202604, but access is partner-gated — so manual entry remains the right UX). `parseOptionalCount()`: blank / non-numeric / negative → `undefined` (`unknown`, never 0), a genuine `0` is kept; saves surfaced per-post + as `totalSaves`, but **not** folded into `engagementRate`. `dwell` stays **explicitly unmeasurable** (internal to LinkedIn, no export/API). All analytics I/O routes through the `getAnalyticsRoot()` seam (M0 per-user data-dir).
## Hooks