Commit graph

7 commits

Author SHA1 Message Date
e2ad190dda feat(linkedin-studio): N17 — baseline-motor (median + variansbånd + minimum-N-refusal) [skip-docs]
Every reading now leads with "vs your own baseline", and no verdict is given
when N is too small to carry one.

- stats.ts: median + medianAbsoluteDeviation (robust pair; mean/stddev stay for
  the alert engine, which wants outlier sensitivity), rollingBaseline with a
  10-post positional window, median ± 1·MAD band floored at 0, and a typed
  insufficient-data refusal below MIN_BASELINE_N=5. readAgainstBaseline returns
  above/within/below-band, or no-verdict when the baseline was refused.
- baselineByGroup + buildBaselineBlock: per-format/per-pillar baselines, each
  judged on its own N; the reported period is excluded from its own baseline and
  compared on its median, not its mean.
- queue-join.ts (new): read-only date join supplying format/pillar from the post
  queue. Every ambiguity resolves to unlabelled, an entry labels at most one
  post, and a missing/broken queue degrades to no labels.
- weekly/monthly reports attach the block unconditionally (refusal included);
  optional in the types, so pre-N17 reports load unchanged.
- CLI: report output leads with the baseline; new `baseline [--by format|pillar]`
  verb with coverage reporting.
- report.md leads with baseline framing and prints the code's reading rather
  than judging the band by eye; WoW loses to the baseline on disagreement.
  analyze.md Step 2a tests whether the drop is real before diagnosing it.

TDD: 58 analytics tests written red first (144 -> 202). test-runner Section 16x,
23 unconditional checks + self-test (247 -> 270; anti-erosion floor 228 -> 251).
tsc clean. All suites green: trends 300, brain 134, editions 72,
specifics-bank 45, contract-gate 33, hooks 191, tests 35, render 60.

Also closes the OKF phase-4 scope follow-up in docs/okf-ingestion/plan.md §8
(coord round 2026-07-25): phase 4 tracks the contract, parse is in scope, and
our claim on read_concept/navigate_bundle is withdrawn as unnecessary.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QxvWAjte7vPcF79QeSRvRJ
2026-07-25 20:50:45 +02:00
bb0725af66 docs(linkedin-studio): bevar trinn E-posisjoner i okf-ingestion/plan.md før postkasse-teardown
OKF-runden lukket ved trinn F (konsensus). Vår trinn E-svarfil bodde i den
interne postkassen (~/repos/_okf-interim/), som nå rives. Løfter den varige
substansen som kun fantes der inn i planen (ny §10): vår §7-registerrad
(status `planned`, ingen dør-A-stempling, uforfalskbarhet utenfor fila),
D1-posisjon (ratifisert D1 matcher vår innvending), D3 `partial`-posisjon
(ratifisert def = samme dør; vi er `planned`, ikke `partial`), samt tre
fremadrettede tekniske krav som ellers gikk tapt: tomt-vokabular-ikke-snap
(+ okrs egen RECOMMENDED-konstant som støtte), index preserve-unowned-grensen,
og lag-1-som-sett (delte golden-fixtures over fire resolve_link-akser).

Alt verifisert mot kode 2026-07-20. Ingen kodeendring i pluginen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S7SQpXJpBSNvpWaTNq1kWZ
2026-07-21 07:58:11 +02:00
4f95331801 docs(linkedin-studio): OKF trinn E — Q3 besvart + korriger uverifisert vokabular-tilslutning
To selvkorreksjoner verifisert mot kode:
- type-vokabularet er tre verdier, ikke fem (JournalEntry/TributarySummary
  finnes kun i designnotat, aldri i kode)
- tilslutningen til lukket vokabular ble gitt uten aa sjekke innholdet;
  okf-check --strict-ingest exit 1 paa vaart konforme bundle, og safe
  default kollapser alle tre typene til Dokument

Nytt empirisk argument mot obligatorisk noekkel-prefiks: referanse-checkerens
egen konstant heter RECOMMENDED, ikke REQUIRED (exit 0 med advarsler).

Q3 (fase 4-omfang) besvart av llm-ingestion-okf: lag 1-primitivene, ikke
materialize_bundle-paritet. Status forblir planned.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019uzhvLjCm39mNQXVFwG7w2
2026-07-20 21:38:55 +02:00
f9ff2bc6ee docs(linkedin-studio): snevre inn newline-korreksjonen etter kryssjekk mot andres svar
Forrige commit hevdet at delt fixture-korpus MÅ bære et verbatim,
ikke-normalisert tilfelle. Kryssjekk mot claude-playlist-corpus' trinn
D-svar viser at det var overdrevet: vår newline-frie serializer gjelder
ingest/published/, som er ekskludert fra OKF-bundelen ved design.
Filene write_concept faktisk ville skrevet (brain/) far trailing newline
fra var egen serializer. Pa konseptstien er vi enige med dem.

Det som overlever: write_concept skal ogsa tjene som generell verbatim-
writer utenfor en bundle, sa ramme-normalisering bor vaere en dokumentert
parameter, ikke en ubetinget garanti.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019uzhvLjCm39mNQXVFwG7w2
2026-07-20 09:46:17 +02:00
fa5c8cf35a docs(linkedin-studio): OKF trinn D-review — korriger avkreftede R5-påstander
Trinn D-review besvart i _okf-interim (postkasse, ikke tracked her).
Verifisering mot egen kode avkreftet to påstander i plan §4 R5:

- Ingen stabile err.code i noen av de fire CLI-ene (fritekst-Error +
  numerisk process.exit). err.code er et krav TIL biblioteket, ikke en
  disiplin vi speiler.
- "Nøyaktig én avsluttende newline" er ikke vår invariant;
  serializePublishedRecord utelater den bevisst for byte-eksakt
  round-trip (SC2). Delt fixture-korpus må bære et verbatim,
  ikke-normalisert tilfelle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019uzhvLjCm39mNQXVFwG7w2
2026-07-20 09:31:57 +02:00
c4cd974e9c docs(linkedin-studio): OKF-runde trinn C — bundle-inventar + taksonomi-innsigelse
Legger det varige innholdet fra adopsjonsrunden i eiende repo (postkassens
regel 2: beslutninger bor i eiende repos docs, kopien i _okf-interim er
varselet).

Nytt par. 6: bundle-inventar + plassering. Vi har EN OKF-bundle (brain/),
og alt bruker-eid ligger allerede utenfor repo-treet via data-dir-seamen
(M0/v0.6.0) - beslutningen krever ingen migrasjon hos oss.

Innsigelse mot taksonomien: beslutningstabellen diskriminerer paa hvem som
skriver. Vaar brain/ skrives av pluginen og ville derfor klassifisert som
plugin-eid og hoert hjemme i repoet - som er akkurat feil for det mest
personlige vi har, i et offentlig distribuert repo. Riktig akse er hvilken
livssyklus innholdet foelger. Maskinskrevet + bruker-eid er ikke et hjoerne,
det er hva ethvert laerende system produserer.

Par. 7-9 renummerert.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019uzhvLjCm39mNQXVFwG7w2
2026-07-20 08:51:20 +02:00
443cfa6160 docs(linkedin-studio): OKF-ingestion kartlegging + kravgrunnlag mot llm-ingestion-okf fase 4
Kartlegger repoets inntaksflater mot dor A i llm-ingestion-okf v0.3.1 og
leverer kravgrunnlaget som avgjor F1 for dette repoet.

Kjernefunn: F1 (manglende fritekst-connector) er ikke var blokker. All
ekstern henting i pluginen skjer i en modell-tur (trend-spotter WebSearch/
WebFetch, /linkedin:react WebFetch) - det finnes ingen rah HTTP-fetch i
plugin-kode. Dor A forutsetter at kode kan hente bytene; for var storste
og minst betrodde flate kan den ikke det. Kravet vart er derfor R1: en
dor som tar imot allerede-hentet, modellprodusert payload og
materialiserer den deterministisk. trends capture er den kontrakten
allerede, og donerbar som presedens.

Fire verifiserte kollisjoner mot dor A: fast 7-nokkels frontmatter uten
extension keys; rewrite-on-run-eierskap mot inkrementell akkresjon;
slug-ids mot content-adresserte ids; tabell-render som kollapser
linjeskift.

ingest/published/ forblir plugin-lokal ved design - na med teknisk gulv,
ikke bare beslutning: byte-eksakt round-trip (SC2), un-normalisert
mintContentId(body), YAML-fri grammatikk (samme grunn som Stage-1-bundlen
ekskluderte ingest/), og model-collapse-guard-semantikk.

Markorlinje satt i STATE.md (local-only): planned.
Separat fra docs/ingestion-guard/plan.md - grensen er beskrevet i par. 6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019uzhvLjCm39mNQXVFwG7w2
2026-07-20 07:28:14 +02:00