chore(okr): bump 1.9.0 paa alle versjonsflater + CHANGELOG for fase D

Ni flater: package.json, package-lock.json (2), .claude-plugin/plugin.json,
CLAUDE.md-tittel, README-badge + versjonstabell, begge SKILL.md og
tests/package-shape.test.mjs. Versjonsvakten ble kjoert roed mot en delvis
bumpet baum foer resten fulgte, saa den er bevist aa felle drift.

CHANGELOG: [Uutgitt] konvertert til [1.9.0] og utvidet med D4-D8. Egen
"Kjent avvik"-seksjon baerer trekreview-funnet om at arkivklars lesegrense
haandheves i path-confinement-modulen, ikke i tool-lista alene - briefen
krevde et Bash-fritt sett, planen skrev det om, og briefen ble aldri oppdatert.

check-versions staar med 1 WARN (katalog-ref v1.8.2 != 1.9.0, ingen tag ennaa).
Det er den forventede tilstanden mellom bump og release; release-plugin.mjs
lukker den.
This commit is contained in:
Kjell Tore Guttormsen 2026-08-09 10:17:59 +02:00
commit b994ac32de
9 changed files with 37 additions and 19 deletions

View file

@ -5,20 +5,37 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Uutgitt]
## [1.9.0] - 2026-08-09
Minor-release: **«Styringssløyfa lukkes»** — kjeden fra tildelingsbrev til årsrapport dekkes nå i én sammenhengende form, i stedet for å stoppe der OKR-ene var skrevet. Åtte arbeidsstrømmer over fem execute-sesjoner (fase D, D4D8). Ingen nye npm-avhengigheter; de fire eksisterende er fortsatt exact-pinnet. Suite 197 → 315 cases.
### Added
- **Ny referansefil `okr-kommunal-styring.md`** — den kommunale styringslinjen på egne premisser: kommunalt selvstyre uten tildelingsbrev (kommuneloven §§ 2-1/2-2), økonomiplan og kommuneplanens handlingsdel (§§ 14-1 til 14-4, jf. plan- og bygningsloven § 11-1), kommunedirektørens utrednings- og iverksettingsansvar (§ 13-1), og koblingen mellom en fireårig økonomiplan og en firemåneders OKR-syklus. Fylkeskommunen dekkes eksplisitt. Referansebiblioteket går fra 17 til 18 filer.
- **Tre deterministiske rapportgeneratorer**`/okr:rapport tertial | arsrapport | etatsstyring` bygger tertialrapport, årsrapport del III-utkast og etatsstyringsmøte-underlag direkte fra syklusdata. Én kommandoflate med argument (mønster: `/okr:oppsett`), ikke tre kommandoer. Arkitekturen er `scripts/syklus-rapport.mjs``lib/syklus-data.mjs` (lesing + score) + `lib/syklus-rapport.mjs` (rendring), uten LLM i stien. Determinismen er målt, ikke påstått: to påfølgende kjøringer mot samme fixture gir byte-identisk output, verifisert på både modul- og CLI-nivå.
- **KR-datakontrakt i `/okr:skriv`-malen**`krN_navn`, `krN_baseline`, `krN_target`, `krN_naa`, `krN_type` (`committed` | `aspirational`) som frontmatter ved siden av punktprosaen. Maskinlaget legges til; menneskelaget beholdes. **Score lagres aldri** — den beregnes som `(naa - baseline) / (target - baseline)` klampet til [0, 1]. En lagret score ville vært en andre sannhetskilde som kan drifte fra tallene den utledes av; en egen vakt feller enhver `krN_score`-nøkkel som måtte dukke opp i malen.
- **`/okr:arkivklar`** — vurderingsgrunnlag mot bevaringsforskrifta (FOR-2025-12-19-2729 §§ 7 og 30, med § 3 som safety-net): hva i OKR-treet som trolig faller under bevaringspåbudet, og hva som bør *vurderes* overført til virksomhetens sak-arkiv. Kommandoen **sletter ingenting og tar ikke stilling på virksomhetens vegne** — vurderingen ligger til dokumentasjonsplanen (arkivlova § 8 / arkivforskrifta § 12 b), ikke til et verktøy. En egen vakt skanner den *genererte rapporten* for avgjørelsesord, slik at prosaen ikke kan gli fra vurderingsgrunnlag til dom. Ukjent OKF-type ⇒ § 3 ⇒ BEVAR.
- **Ny referansefil `gevinstrealisering-okr.md`** — DFØs nyttestyring mappet mot OKR (gevinst → outcome-KR, gevinstansvarlig → KR-eier), med linjeeierskapet som hovedpoeng og Prosjektveiviseren-koblingen.
- **Ny referansefil `okr-kommunal-styring.md`** — den kommunale styringslinjen på egne premisser: kommunalt selvstyre uten tildelingsbrev (kommuneloven §§ 2-1/2-2), økonomiplan og kommuneplanens handlingsdel (§§ 14-1 til 14-4, jf. plan- og bygningsloven § 11-1), kommunedirektørens utrednings- og iverksettingsansvar (§ 13-1), og koblingen mellom en fireårig økonomiplan og en firemåneders OKR-syklus. Fylkeskommunen dekkes eksplisitt. **KOSTRA** er lagt inn som indikatorkilde i samme fil — det eneste målte hullet da fila kom (0 treff før, 15 nå).
- **Styringssløyfas ut-side i `okr-offentlig-governance.md`** — der guiden tidligere hadde én 4-raders tabell om årsrapport, dekker den nå styringsdialogen som helhet: etatsstyringsmøtet som sentralt møtepunkt, årsrapportens seks faste deler med del III («Årets aktiviteter og resultater») som ankeret for måloppnåelse og del IV som stedet OKR-prosessen selv dokumenteres, samt tre regler for å rapportere aspirational OKR oppover uten at 0.7 leses som svikt.
- **Gevinstrealisering som eget kapittel i `okr-offentlig-governance.md`** — DFØs metodikk mappet mot OKR (gevinst → outcome-KR, gevinstansvarlig → KR-eier), med linjeeierskapet til gevinstansvarlig som hovedpoeng og Prosjektveiviseren-koblingen. Lukker at gevinstrealisering tidligere var ett enkelt datapunkt i `metrics-library.md` uten metodikk.
### Fixed
- **Siterings-aksen nådde produsenten i 1.8.2, men ikke checkeren.** `okf-check`s `rootMarkers`/`pick` returnerte rå streng, så samme fil ga to lesninger: produsenten tolket `okf_version: "0.2"` som `0.2`, mens checkeren ekkoet `"0.2"`. Catalog målte divergensen direkte mot sin egen checker på en bundle som følger upstreams eget kanoniske eksempel (`SPEC.md:773`) — begge implementasjonene *aksepterte*, avviket lå på verdien. `unquote()` er nå eksportert fra `okf-index.mjs` og importert av `okf-check.mjs`, så begge sider deler én regel i stedet for hver sin kopi. Ingen gate rødnet av dette i dag, fordi paritetskorpuset ikke har en sitert fikstur — hvilket også betyr at paritetsgatens grønne farge ikke dekket siterings-aksen; den var «ikke kjørt», ikke «som forventet».
- **Strategi→OKR og Beyond Budgeting i `okr-framework.md`** — to nye kildebelagte seksjoner (Bogsnes). Begge var uten kildegrunnlag i repoet før denne fasen.
- **Leading/lagging-balanse som rubrikk-dimensjon** med fem ankere, og **guardrail som KR-designmønster** i både `/okr:skriv` og `/okr:kvalitet`. Dimensjonstallet utledes, aldri hardkodet.
### Changed
- **Committed og aspirational separeres i alle tre rapportformene.** En aspirational OKR med lav score presenteres ikke som avvik — det er formålet med kategorien. En **sandbagging-vakt** låser dette som test, med begrunnelsen skrevet inn i rapporten selv: strukturell innramming, ikke et disiplinproblem hos den som satte målet.
- **Generatoren eier aritmetikk og formatering — aldri confidence, og aldri vurderingsfeltene den reserverer for organisasjonen.** `okr-framework.md` gjør confidence til en sannsynlighetsvurdering, ikke en funksjon av score; en generator som utledet den mekanisk ville gjort et skjønnsfelt til en kodesti.
- **`okf_version` emitteres nå i rot-indeksens frontmatter**, `okf_layout` blir i brødteksten (OKF-spec §12, beslutning 6). De to markørene bærer ulike konsepter og får derfor ulike flater: `okf_version` er den maskinlesbare kontrakten konsumenter utenfor pluginen leser. **Lesetoleransen er permanent, ikke en overgangsordning**`okf-check` leser begge plasseringer, fordi bundles på disk ikke migrerer samtidig og ingen mekanisme tvinger dem. PRESENCE håndheves fortsatt ikke; nøkkelen er MAY i specen.
- **Path-confinement er trukket ut til én delt modul** (`lib/path-confinement.mjs`), brukt av både ingestion (skrivesiden) og arkivklar-traverseringen (lesesiden). To lag som fanger ulike angrepsformer: leksikalsk `..`-escape/absolutt-override, og symlenke-escape via `realpathSync`. To kopier av en sikkerhetsregel må endres i takt for alltid, og gjør det ikke.
- **Referansebiblioteket 17 → 19 filer.** Flatene bærer med vilje ulike tall: totalflatene sier 19, domeneflatene 18 (kvalitetsrubrikken ekskluderes, siden å score scoringsinstrumentet er sirkulært), og `SKILL.md`-registeret er uummerert.
- **F-j lukket.** Dette lukker det siste av de ti F-funnene fra `review-2026-07-16.md` §3. F-j (styringssløyfas ut-side, kommunal styringslinje, gevinstrealisering) ble eksplisitt utsatt fra 1.8.0 til denne fasen via Non-Goal i C-fasens brief, mens SC-85 samtidig påsto at alle ti var lukket. Diskrepansen var reell og er nå løst ved å faktisk lukke funnet — SC-85 leses fra og med her som dekkende for F-a…F-j.
- Referansetellingen oppdatert på alle flater som bærer den: `CLAUDE.md`, `README.md` og `/okr:freshen-references` (som scorer 17 av 18 filer — kvalitetsrubrikken er fortsatt ekskludert, siden å score scoringsinstrumentet er sirkulært).
- **Testsuite 192 → 197 cases**, alle grønne. Fem nye i `tests/okf-check.test.mjs` for checker-siden av siterings-aksen: sitert `okf_version`, enkeltsitert `okf_version`, sitert `okf_layout`, CLI-ekkoet, og en ubalansert sekvens som skal bevares urørt. De fire første ble kjørt røde før fiksen; den femte er mutasjons-verifisert rød mot en grådig unquote (som da rødner både produsent- og checker-vakten).
- **Kildeattribusjonene skjerpet etter primærkildesjekk.** Riksrevisjon-knaggene i `okr-offentlig-governance.md` er daterte og gjelder avsluttede saker — de siteres aldri i presens. DFØs nyttestyringsveileder erstatter 2014-gevinstrealiseringen.
### Fixed
- **Siterings-aksen nådde produsenten i 1.8.2, men ikke checkeren.** `okf-check`s `rootMarkers`/`pick` returnerte rå streng, så samme fil ga to lesninger: produsenten tolket `okf_version: "0.2"` som `0.2`, mens checkeren ekkoet `"0.2"`. Catalog målte divergensen direkte mot sin egen checker på en bundle som følger upstreams eget kanoniske eksempel (`SPEC.md:773`) — begge implementasjonene *aksepterte*, avviket lå på verdien. `unquote()` er nå eksportert fra `okf-index.mjs` og importert av `okf-check.mjs`, så begge sider deler én regel i stedet for hver sin kopi. Ingen gate rødnet av dette, fordi paritetskorpuset ikke har en sitert fikstur — hvilket også betyr at paritetsgatens grønne farge ikke dekket aksen; den var «ikke kjørt», ikke «som forventet».
- **Avviksvurderingen gikk utenom score.** Den sammenlignet `naa` mot `target` direkte, som gir feil svar for synkende mål (der lavere er bedre). Den går nå gjennom den kanoniske scoren.
- **`export-pdf.py` rendret OKF-frontmatter som brødtekst.** `python-markdown` uten `meta`-extensionen parser ikke YAML-frontmatter, så `type`/`resource`/`timestamp` havnet øverst i eksporten som `<hr/><p>type: …</p><hr/>`. Hver fil i treet bærer frontmatter, så maskinlaget lakk inn i dokumenter som skal til virksomhetens sak-arkiv.
- **Stale referansetelling i README.** «scores 16 of the 17 domain reference files» hang igjen fra før F-j, som bumpet én telleflate men ikke denne. Alle fem flatene er nå konsistente.
### Kjent avvik
- **`/okr:arkivklar` er rent lesende ved *skript*, ikke ved tool-liste alene.** Fasens brief krevde en tool-liste uten `Write`, `Edit` **eller** `Bash`; levert er `Read, Bash, Glob`, fordi kommandoen kjører `scripts/arkivklar.mjs`. Lesegrensen håndheves derfor i `lib/path-confinement.mjs` (to lag, mutasjons-verifisert) og av at kommandoen ikke har noe skriveverktøy — ikke av tool-lista alene. Avviket ble innført i planen uten at briefen ble oppdatert, og er registrert i `/trekreview` som MAJOR `PLAN_EXECUTE_DRIFT`. Det står her fordi det er en svakere garanti enn den som ble spesifisert, ikke fordi det er en kjent feil i dag.
## [1.8.2] - 2026-07-31