feat(linkedin-studio): S16 — optional manual saves in analytics + close deferred onboarding Write MAJOR

Lifts the original v4.0.0 Non-Goal: an optional, manually-entered `saves`
metric through the analytics layer, built location-agnostic (option c) so
UI-brief §9b/M0 relocates the data dir in one place later.

- types: PostMetrics.saves? + Weekly/Monthly summary.totalSaves? (optional);
  new RankableMetric type for the always-numeric index-access whitelist
- parser: dedicated parseOptionalCount() — blank/non-numeric/negative -> undefined
  ("unknown != 0"), genuine 0 kept; saves NOT folded into engagementRate
- reports: totalSaves set only when >=1 post carries saves (backward-compat)
- cli: saves surfaced in import summary + weekly/monthly totals + per-post
- S16-pre: onboarding.md allowed-tools gains Write (closes S15-deferred MAJOR)
- docs (three-doc rule): plugin README boundary + analytics README + root README
  + plugin CLAUDE.md + CHANGELOG; dwell stays explicitly unmeasurable

Independent /trekreview: brief-conformance 0 findings; code-correctness 2 MAJOR
(own lockstep misses) FIXED in-session (parseOptionalCount + edge tests). Gate:
tsc clean, analytics 116/116, lint 74/0/0, hooks 98/98. Within-v4.1.0 refinement
(no surface/count/version change).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-05-30 22:23:12 +02:00
commit 55c94ee964
18 changed files with 417 additions and 118 deletions

View file

@ -0,0 +1,3 @@
"Content","Date","Impressions","Reactions","Comments","Shares","Clicks","Saves"
"Explicit zero saves — a real reading of zero, must stay 0 not undefined...",2026-02-12,4000,80,25,10,150,0
"Non-numeric saves cell — the user jotted a note, not a count; stays unknown...",2026-02-11,3500,70,22,9,130,n/a
1 Content Date Impressions Reactions Comments Shares Clicks Saves
2 Explicit zero saves — a real reading of zero, must stay 0 not undefined... 2026-02-12 4000 80 25 10 150 0
3 Non-numeric saves cell — the user jotted a note, not a count; stays unknown... 2026-02-11 3500 70 22 9 130 n/a

View file

@ -0,0 +1,3 @@
"Content","Date","Impressions","Reactions","Comments","Shares","Clicks","Saves"
"A save-worthy framework post the user augmented with the native saves count...",2026-02-10,5000,100,30,15,200,42
"A post where the user left the Saves cell blank — unknown, not zero...",2026-02-09,3000,60,20,8,120,
1 Content Date Impressions Reactions Comments Shares Clicks Saves
2 A save-worthy framework post the user augmented with the native saves count... 2026-02-10 5000 100 30 15 200 42
3 A post where the user left the Saves cell blank — unknown, not zero... 2026-02-09 3000 60 20 8 120