feat(linkedin-studio): N15 — do-next-kontrakt (recordDoNext + skrivere/lesere + forrige-utgave-kalibrering) [skip-docs]

Måling som ikke endrer neste utgave er teater: report/analyze/ab-test/48h-monitor
endte alle i chat (grep do.next = 0 i hele repoet). N15 gjør kanalen til en kontrakt.

- recordDoNext i hooks/scripts/state-updater.mjs (TDD, 17 nye tester): seksjonen
  Do-Next Directives, rader "[dato] (kilde) direktiv — evidence: peker".
  Levetid = erstatt-per-kilde + 60-dagers aldersgulv, maks 3 per skriv, additiv
  scalar last_donext_date, $-sikre replacement-funksjoner. CLI: --record-do-next.
- Skrivere: report Step 7b, analyze Step 6b, ab-test 2c.6 (kun Adopt),
  post-feedback-monitor (kun 48h-sjekken); analytics-interpreter emitterer nå
  anbefalinger på do-next-form (imperativ + evidens).
- Lesere: post/quick/batch/create Step 0 + newsletter Step 1, som i tillegg
  kalibrerer på forrige utgaves MÅLTE tall via queue-id-match (queue.json →
  analytics/posts) med eksplisitt honest-miss — aldri estimert.
- Guards: test-runner Section 16v (15 ubetingede sjekker, floor 198 → 213),
  $-safety-batteriet dekker recordDoNext (coverage-gate fanget den nye eksporten).

Suiter: test-runner 232/0, hooks 191/0, trends 300/0, brain 134/0, editions 72/0,
specifics-bank 45/0, contract-gate 33/0, tests 35/0, render 60/0.

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:23:35 +02:00
commit b45fdad911
16 changed files with 713 additions and 6 deletions

View file

@ -343,9 +343,9 @@ Based on this analysis, your unique advantages are:
- Followers: [↑/↓/→] [net change]
## Recommendations for Next Week
1. [Most impactful action]
2. [Second priority]
3. [Experiment to try]
1. [Most impactful action] — evidence: [the measured number it rests on]
2. [Second priority] — evidence: [measured number]
3. [Experiment to try] — evidence: [measured number]
## Content Plan Adjustment
Based on this week's data:
@ -354,6 +354,14 @@ Based on this week's data:
- Start: [new experiment]
```
**Write recommendations in do-next form — imperative + evidence pointer.** The calling command
persists the top 23 verbatim as do-next directives (`recordDoNext`, source `report`), and the
create surfaces read them at Step 0 before drafting. So each one must be actionable by someone
who never saw this report: "Plan 2 AI-agent posts this week" (imperative, checkable), not
"AI content is performing well" (an observation nobody can execute). The evidence pointer is
what lets the next session judge how much weight a directive carries — always name the measured
number and the sample it came from.
### Monthly Report Additions
For monthly reports, also include:

View file

@ -287,6 +287,33 @@ Output a structured intervention plan using this format:
- [Actionable change to try next time]
```
### Persist the 48h learning as a do-next directive
At the **final check (48h / Resurrection Window)** — not at the intermediate check-ins, where
the numbers are still moving — write the one or two learnings that should change the next post
into the shared do-next channel. This is the same channel `/linkedin:report`,
`/linkedin:analyze` and `/linkedin:ab-test` write to, and the one every create surface reads at
its Step 0. Without it the 48h learning lives only in this session's chat and is re-learned
from scratch next week:
```bash
node --input-type=module -e "
import { writeState, recordDoNext } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/state-updater.mjs';
writeState(content => recordDoNext(content, {
recordDate: 'YYYY-MM-DD',
source: '48h-monitor',
directives: [
{ directive: 'Put the concrete number in the first line, not the third', evidence: '48h on 2026-05-28 post: velocity 82/100, golden hour 3x the account average' }
]
}));
"
```
Write only what a *future draft* can act on — a per-post tactic ("reply to every comment inside
the first hour") belongs in the report to the operator, not in the channel that shapes the next
draft. `recordDoNext` replaces this source's previous row on each write, so the most recent 48h
learning is the one in force.
## Step 7: Follow-Up Scheduling
Based on current performance, suggest: