feat(linkedin-studio): N16 — out-of-network-andel + patterns-oppdatering + boundary-map [skip-docs]

Reach-splitten (in/out-of-network) er native i LinkedIns post-analytics siden juni
2026, men vises som PROSENT og finnes ikke i CSV-eksporten. Planen antok to
manuelle antall; verifiseringen viste prosent, så modellen er ett felt —
outOfNetworkPct — og in-network er komplementet.

- parseOptionalPercent: egen parser, ikke parseOptionalCount. Komma er desimal
  (36,5 -> 36.5, aldri 365), og verdi >100 avvises: i én kolonne kan ikke et
  absolutt antall skilles fra en andel, så svaret er unknown, ikke en gjetning.
  Blank/ikke-numerisk/negativ -> unknown; ekte 0 beholdes.
- Ett lagret halvpart, kryssjekket: In-network godtas og lagres som komplement;
  et transkribert par som ikke summerer til ~100 (±1 avrunding) forkastes som
  unknown i stedet for å bli halvveis trodd.
- weightedOutOfNetworkPct: impressions-vektet roll-up (avgOutOfNetworkPct, uke +
  måned). Flatt snitt lar en 50-visnings-post slå en på 10 000; poster uten
  avlesning ekskluderes, og null vekt gir undefined — aldri 0, aldri NaN.
- Reach inngår ALDRI i engagementRate (distribusjon != engasjement). Rapporten
  leser den som akvisisjon (ut) vs resonans (inn), og sier «ikke ført for denne
  perioden» framfor å estimere. En reach-innsikt går inn i N15s do-next-kanal.
- Step 7c (A2-F11): rapporten tilbyr diff mot brukerens engagement-patterns.md
  med eksplisitt go — aldri stille skriving, aldri inn i den shippede malen.
- Boundary-map (E#9): dwell eksplisitt umålbar, saves partner-gated, reach
  native men CSV-eksport uverifisert.
- Reach-frie importer er byte-identiske med før, på skjerm og på disk.

TDD: rødt bevist først (10 feilende), analytics 119 -> 144 tester, tsc ren.
test-runner 232 -> 247 (Section 16w, gulv 213 -> 228). Alle suiter grønne.
CHANGELOG: N15-oppføringen manglet og er backfilt sammen med N16.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QxvWAjte7vPcF79QeSRvRJ
This commit is contained in:
Kjell Tore Guttormsen 2026-07-25 15:56:04 +02:00
commit 63506f7d5c
21 changed files with 841 additions and 13 deletions

View file

@ -0,0 +1,4 @@
"Content","Date","Impressions","Reactions","Comments","Shares","Clicks","In-network","Out-of-network"
"Both halves transcribed and they sum to 100 - consistent, out-of-network wins...",2026-02-28,2900,70,22,9,130,63%,37%
"Both halves transcribed but they contradict each other - refuse to guess which one is right...",2026-02-27,2800,70,22,9,130,63%,20%
"Both halves with rounding slack - 62 + 37 = 99 is within the one-point tolerance...",2026-02-26,2700,70,22,9,130,62%,37%
1 Content Date Impressions Reactions Comments Shares Clicks In-network Out-of-network
2 Both halves transcribed and they sum to 100 - consistent, out-of-network wins... 2026-02-28 2900 70 22 9 130 63% 37%
3 Both halves transcribed but they contradict each other - refuse to guess which one is right... 2026-02-27 2800 70 22 9 130 63% 20%
4 Both halves with rounding slack - 62 + 37 = 99 is within the one-point tolerance... 2026-02-26 2700 70 22 9 130 62% 37%

View file

@ -0,0 +1,5 @@
"Content","Date","Impressions","Reactions","Comments","Shares","Clicks","Out-of-network"
"Non-numeric out-of-network cell - the user jotted a note, not a share; stays unknown...",2026-03-06,3500,70,22,9,130,n/a
"Above 100 - most likely an absolute impression count pasted into a share column; undecidable, so unknown...",2026-03-05,3400,70,22,9,130,1234
"Negative share - not a real reading; stays unknown...",2026-03-04,3300,70,22,9,130,-5
"Exactly 100 - a real reading: every impression came from outside the network...",2026-03-03,3200,70,22,9,130,100
1 Content Date Impressions Reactions Comments Shares Clicks Out-of-network
2 Non-numeric out-of-network cell - the user jotted a note, not a share; stays unknown... 2026-03-06 3500 70 22 9 130 n/a
3 Above 100 - most likely an absolute impression count pasted into a share column; undecidable, so unknown... 2026-03-05 3400 70 22 9 130 1234
4 Negative share - not a real reading; stays unknown... 2026-03-04 3300 70 22 9 130 -5
5 Exactly 100 - a real reading: every impression came from outside the network... 2026-03-03 3200 70 22 9 130 100

View file

@ -0,0 +1,5 @@
"Content","Date","Impressions","Reactions","Comments","Shares","Clicks","Out-of-network"
"An out-of-network share the user read off the native Discovery panel, with a percent sign...",2026-03-10,5000,100,30,15,200,37%
"A post where the user left the Out-of-network cell blank - unknown, not zero...",2026-03-09,3000,60,20,8,120,
"Explicit zero out-of-network - a real reading: nothing left the network...",2026-03-08,4000,80,25,10,150,0
"A share written with a European decimal comma - 36,5 percent, not 365...",2026-03-07,2000,40,10,5,60,"36,5"
1 Content Date Impressions Reactions Comments Shares Clicks Out-of-network
2 An out-of-network share the user read off the native Discovery panel, with a percent sign... 2026-03-10 5000 100 30 15 200 37%
3 A post where the user left the Out-of-network cell blank - unknown, not zero... 2026-03-09 3000 60 20 8 120
4 Explicit zero out-of-network - a real reading: nothing left the network... 2026-03-08 4000 80 25 10 150 0
5 A share written with a European decimal comma - 36,5 percent, not 365... 2026-03-07 2000 40 10 5 60 36,5

View file

@ -0,0 +1,3 @@
"Content","Date","Impressions","Reactions","Comments","Shares","Clicks","In-network"
"The user transcribed the in-network half of the split instead - out-of-network is the complement...",2026-03-02,3100,70,22,9,130,63%
"In-network blank - neither half known...",2026-03-01,3000,60,20,8,120,
1 Content Date Impressions Reactions Comments Shares Clicks In-network
2 The user transcribed the in-network half of the split instead - out-of-network is the complement... 2026-03-02 3100 70 22 9 130 63%
3 In-network blank - neither half known... 2026-03-01 3000 60 20 8 120