okr/CHANGELOG.md
Kjell Tore Guttormsen b994ac32de 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.
2026-08-09 10:17:59 +02:00

261 lines
37 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog
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).
## [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
- **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.
- **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.
- **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
Patch-release: **siterte markørverdier korrumperte begge rot-markørene**. Bugen lå i released 1.8.1-kode og traff enhver bundle som hadde skrevet `okf_version` slik OKF-specen selv viser den. Ingen nye kommandoer, agenter eller referansefiler.
### Fixed
- **Anførselstegn rundt en markørverdi er YAML-strengsyntaks, ikke del av verdien.** Upstreams eneste kanoniske eksempel med verdi (`okf/SPEC.md:773`) skriver `okf_version: "0.2"` — sitert. `parseExistingIndex` fanget anførselstegnene rått, `UPSTREAM_VERSION_RE` avviste `"0.2"` som ikke-upstream-form, og migrasjonsstien fra 1.8.1 behandlet den følgelig som en layout-verdi: den ekte upstream-versjonen ble flyttet til `okf_layout` mens `okf_version` ble nedgradert til vår egen konstant. Begge markørene ødelagt, og dataene ikke gjenopprettelige uten å kjenne originalen. Verdien unquotes nå ved parse — før den tolkes og før den emitteres — og emitteres normalisert (unquoted), slik at vår egen utskrift består en form-sjekk som kjøres på rå streng. Unquote er konservativ: kun et matchende par strippes, en halv sekvens bevares urørt.
### Added
- **Testsuite 187 → 192 cases**, alle grønne. Fem nye i `tests/okf-check.test.mjs`: sitert upstream-verdi migreres ikke, sitert layout-verdi migreres verbatim uten anførselstegn, emisjon er alltid unquoted, enkeltfnutter behandles som dobbeltfnutter, og en ubalansert sekvens (`"0.2`) 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.
## [1.8.1] - 2026-07-25
Patch-release: **`okf_version` / `okf_layout`-splitt**. Rot-`index.md` bar én markør som dekket to urelaterte konsepter — den upstream OKF-versjonen bundelen sikter mot *og* pluginens egen layout-revisjon. OKF-specen §12 (katalog-eid) skiller dem i to markører; denne releasen migrerer emitteren og sjekkeren over. Ingen nye kommandoer, agenter eller referansefiler.
### Changed
- **`scripts/okf-index.mjs` emitterer to markør-linjer på rot-`index.md`** — `okf_version: 0.1` (upstream Google OKF-versjonen, verdisett eid av Google, påkrevd per spec §3) og `okf_layout: kb-layout-2026-06` (pluginens egen layout-revisjon, valgfri per §12, verdisett eid av emitteren; trigger ingen kryss-plugin-rekjekk). Konstanten `OKF_VERSION` bærer nå upstream-verdien; ny `OKF_LAYOUT` bærer layout-revisjonen. Undernivå-index er uendret — begge markørene er rot-eksklusive.
- **`scripts/okf-check.mjs` ekkoer begge markørene** (`okf_version` + `okf_layout`, fraværende → `MANGLER`). Rent ekko: verdiene valideres fortsatt ikke, siden spec §3 ennå ikke er håndhevende på form. Retur-objektet fra `checkBundle()` bærer `okfLayout` ved siden av `okfVersion`.
- **`--okf-layout <ver>` er det kanoniske CLI-flagget** for å bumpe layout-revisjonen. `--okf-version` beholdes som **deprecated alias** — verdien kallere sendte inn der var alltid en layout-revisjon — og skriver et deprecation-varsel til **stderr**, aldri stdout (scriptets maskinlesbare flate). Samme aliasing gjelder `generateIndexes(root, { okfLayout })` mot det gamle `{ okfVersion }`. Manglende flagg-verdi er fortsatt bruksfeil (exit 2, ingen skriving).
### Fixed
- **Migrasjonssti for eksisterende bundles** — en rot-`index.md` som bærer en ikke-upstream verdi i `okf_version` (formen fra før 1.8.1) får verdien **flyttet verbatim** til `okf_layout`, og `okf_version` settes til upstream-verdien. Den funne verdien erstattes aldri av vår egen konstant, en allerede spec-konform `okf_version` (`0.1`, `0.2`, …) røres aldri, og en eksisterende `okf_layout` bevares. Migrasjonen skjer ved neste `okf-index`-kjøring; ingen manuell handling kreves.
### Added
- **Testsuite 167 → 179 cases**, alle grønne. 12 nye i `tests/okf-check.test.mjs`: begge markørene på rot og ingen på undernivå (inkl. at markør-blokken ikke etterlater en tom linje der), migrasjon av legacy-form, verbatim-bevaring av en *fremmed* layout-verdi, ikke-migrering av spec-konform `okf_version`, verbatim-bevaring av allerede splittet form, `--okf-layout`-bump + idempotent vedlikehold, deprecated-alias-atferd, stderr-vs-stdout-separasjon for deprecation-varselet, bruksfeil ved manglende flagg-verdi, og begge markørene i `okf-check`-ekkoet inkludert `MANGLER` for utelatt layout.
### Documentation
- `CLAUDE.md`, `skills/okr-second-brain-search/SKILL.md` og `commands/oppsett.md` beskriver nå to markører der de tidligere beskrev én.
## [1.8.0] - 2026-07-25
Minor-release **«Én kanon»**: metodekonsolidering av MAJOR-/metode-funnene fra dyp review 2026-07-16 (§3). Ingen nye kommandoer, agenter eller referansefiler — prinsippet er ÉN kanonisk definisjon per metodebegrep, der konsumentflater (kommandoer, agenter, øvrige referansefiler) refererer kanon i stedet for å redefinere den. Konsolideringen er låst av en ny strukturell konsistensvakt, ikke bare av prosa.
### Added
- **Kanon-konsistensvakt** (`tests/canon-consistency.test.mjs`, 15 cases: 12 vakt-cases — F-a…F-i, score-grenser, divergerende etikettsett og Glob-dekning — pluss 3 parser-sanity-cases) — deterministisk, offline, zero-dep. Asserter strukturelt at hvert metodebegrep har én kilde: nøyaktig én confidence-tabell (kanonisk i `okr-framework.md`), ingen team-check-in med månedlig kadens og ingen ledelsesreview med ukentlig, ingen score→modenhet-avledning, ingen parallelle scorebånd utenfor kvalitetsrubrikken, kvalitetssjekker-agenten dekker alle 10 rubrikk-dimensjoner, antipattern-antall utledet av dynamisk telling (aldri hardkodet tall), ingen foreldede kontekst-injeksjons-fraser i `commands/`. Skrevet RED-først (Step 1); alle 10 vakt-cases flippet grønne underveis i Wave 1-5.
- **Referanse-integritet dekker skills-relative lenker** (`tests/reference-integrity.test.mjs`) — `SKILL.md`s 17 `references/<fil>.md`-lenker og krysslenkene mellom referansefilene valideres nå mot disk, slik at de nye krysslenkene konsolideringen innfører ikke kan råtne stille.
- **Testsuite 149 → 167 cases**, alle grønne.
- **`okr-sources.md` § 7 «Alternative rammeverk»** — NCT (Narrative, Commitments, Tasks) attribuert til Ravi Mehta / Reforge, med eksplisitt advarsel mot den vanlige feilattribusjonen til *Radical Focus* 2. utg.; Evidence-Based Management → 2024-guiden, der kun det verifiserte «what's new» er gjengitt.
- **Vaktutvidelser etter post-implementasjons-review** (`/trekreview`, 2026-07-25): kanon-skanningen i case (a)/(b) bruker nå samme sett som case (d) allerede gjorde — `references/` + `commands/` + `agents/` + `SKILL.md` — slik at etikett-drift i agentene og skillen ikke lenger er usynlig for vakten. Ny case (a2) fanger parallelle confidence-etikettsett skrevet som bullet eller mal-linje (tabell-signaturen alene fanget dem ikke), ny case (k) krever at enhver kommando som instruerer `Glob` også deklarerer det i `allowed-tools`, og en ny versjonssync-case i `tests/package-shape.test.mjs` asserterer at `.claude-plugin/plugin.json`, README-badgen og begge `SKILL.md` bærer samme versjon som `package.json` — tidligere ble kun `package.json` sjekket, altså den ene flaten som er `private: true` og aldri shipper.
- **Avveiningsveiledning i kvalitetsrubrikken** for KR som treffer BÅDE Outcome- og Uavhengighet-ankeret (samfunnseffekt-klassen) — tidligere manglet en done-condition for den kollisjonen.
### Changed
- **«Align, don't cascade»** (`commands/kaskade.md`, `agents/kaskadebygger-agent.md`) — mekanisk kaskadering («et overordnet KR blir teamets Objective») rammet om til alignment via lineage: org-KR er INPUT til teamets Objective, teamet omformulerer og eier formuleringen, team-KR måler teamets eget bidrag, og manglende påvirkbarhet rapporteres som gap i stedet for et konstruert bidrag. Individ-OKR eksplisitt utelukket på begge flater.
- **`committed` = forpliktelse OG påvirkbarhet** — ny kanonisk regel i `okr-framework.md`: committed er forbeholdt utfall teamet rår over, stokastiske samfunnsutfall er aspirational. `styringsrådgiver-agent.md`s regel «Må-krav → Committed OKR, score 1.0» og governance-eksempelet er skrevet om tilsvarende: ukontrollerbart tildelingsbrev-mål → aspirational/delt KR med committed leading-tiltak under, den kontrollerbare leveransen → committed.
- **Uavhengighet-ankeret i `okr-quality-rubrics.md`**: «teamet kontrollerer utfallet direkte» → «kan påvirke vesentlig» (influence, not control) — ankeret straffet ikke lenger legitime samfunnseffekt-KR.
- **Milepæl-/binære KR** omtales nå konsistent som dokumentert unntak fulgt av outcome-KR (framework, `skriv.md`, `kvalitet.md`) — tidligere unntak i én flate og antipattern i en annen.
- **«Kontekstbevissthet»-blokkene i 9 kommandoer** skrevet om til post-1.6.0-mønsteret (oppdag på disk via `Glob` + invoker `okr-second-brain-search` for bredere wiki-kontekst + kjerne-profil for organisasjon/syklus). Påstanden om at hooken pre-injiserer en fil-liste er borte — den sluttet å være sann i 1.6.0. Stale enumererings-logikk utenfor headeren (`sporing.md`s «Automatisk OKR-lasting») fjernet.
- **Markedsclaims kildebelagt** (`README.md`) — adoptorer navngis kun når de har offentlig kilde i `okr-sources.md` § 4 (Digdir, NAV-team, Oslo Origo, FINN.no), med eksplisitt regel om at usourcede virksomheter ikke navngis.
### Fixed
- **F-c — ÉN confidence-tabell**: den sannsynlighetsbaserte tabellen i `okr-framework.md` er merket kanonisk og er nå eneste sannhetskilde. Fjernet konkurrenter: kalkulatorens egen sjekkliste + absolutt-terskel, `meeting-guides.md`s andel-av-forventet-terskler, `sporing.md`s egne nivåer pluss et fjerde vokabular («Confidence level: Medium»). Trend er nå ETT innspill til confidence, ikke en definisjon.
- **F-d — ÉN kadens-doktrine**: selvmotsigelsen «Månedlig check-in» mot «Ukentlige team-check-ins» er løst med en kanonisk kadens-tabell med publikum-kolonne (ukentlig team-check-in à la Wodtke + månedlig statusgjennomgang for ledergruppen à la Doerr). Konsumentene rettet til publikum-korrekt form: `meeting-guides.md`, `okr-cheatsheet.md`, `dfo-okr-mapping.md`, `SKILL.md`, `sporing.md`, `møter.md`, `innføring.md`. 1:1-kadensen er CFR-styrt og urørt.
- **F-a — score→modenhet-avledningen fjernet** (`analyse.md` «Modenhetsbane», `trendanalytiker-agent.md` «Modenhetsvurdering» inkl. instruksen om å oppdatere org-profilen): OKR-score måler måloppnåelse, ikke organisasjonsmodenhet. 7-dimensjons prosess-modenhet i `innføring.md` er eneste modenhetsmåler. Erstattet med et trendsignal som holder: snitt > 0.85 over 2+ sykluser på aspirational/stretch-KR = mulig sandbagging (committed-KR ekskludert). Selvrapportfeltet `modenhetsnivaa` er urørt.
- **F-e — kvalitetsvurdering ankret i rubrikken**: `kvalitet.md`s inline-rubrikk og eget 8-10-scorebånd er fjernet til fordel for anker→skala i `okr-quality-rubrics.md`; `kvalitetssjekker-agent.md` dekker nå alle 10 dimensjoner (tidligere 6).
- **F-g — ekte antipattern-kategorier**: oppdiktede kategorinavn i `analyse.md` og `trendanalytiker-agent.md` erstattet med de fem faktiske (Formulering, Prosess, Kultur, Struktur, Ledelse).
- **F-11 — committed-forventning** `0.9-1.0``1.0`, konsistent med «Forventer 100 %».
- **Score-grenser dokumentert** (`okr-calculator.md` + `fremdriftssporer-agent.md`): kapping til `[0, 1.0]` ved over-/underoppnåelse, og `Target == Baseline` eller 0 målbare KR → score **udefinert**, ikke 0.
- **NAV manglet som kildeoppslag** i `okr-sources.md` selv om README påstod bruken — lagt til med first-party-kilde (aksel.nav.no), scopet til team-/produktnivå siden etatsnivå-OKR ikke er dokumentert.
- **`/okr:freshen-references`-omtalen presisert** (README + CLAUDE.md): kommandoen scorer 16 AV 17 domene-referansefiler — kvalitetsrubrikken er ekskludert fordi den selv er scoringsinstrumentet.
- **Feil modulsti i dokumentasjonen**: `lib/innboks-convert.mjs` (CLAUDE.md og 1.7.0-noten under) → `lib/convert/index.mjs`. Modulen har aldri hatt det navnet; konverterings-adapterne har ligget i `lib/convert/` siden 1.7.0.
- **SessionStart-nudgen for KR i fare var død under 1.8.0** (`hooks/scripts/coaching-hook.mjs`): status-malen ble i denne releasen skrevet om til den kanoniske skalaen (On Track / At Risk / Off Track), mens hooken fortsatt talte kun «i fare» og «blokkert» — en status-rapport generert under 1.8.0 ga derfor 0 treff og nudgen sluttet stille å utløses. Hooken teller nå de kanoniske etikettene; de norske er beholdt som bakover-kompatibilitet for status-filer skrevet før 1.8.0. Nudge-teksten bruker også kanonisk vokabular.
- **F-c-resten i `agents/` og `SKILL.md`**: tre parallelle confidence-etikettsett overlevde konsolideringen — «På sporet / I fare / Blokkert» og «Confidence: [Høy/Medium/Lav]» (en helt annen akse: størrelse, ikke sannsynlighet) i `fremdriftssporer-agent.md`, og «on track / at risk / blocked» i `SKILL.md` (kanonisk er «off track»). Alle tre erstattet med referanse til den kanoniske tabellen. `sporing.md` og agenten den delegerer til svarer nå i samme vokabular.
- **Åtte kommandoer instruerte `Glob` uten å deklarere det**: F-i-omskrivingen ga hver kommando en Kontekstbevissthet-blokk som bruker `Glob`, men `allowed-tools` ble kun utvidet i `kaskade.md`. `export.md`, `gap.md`, `governance.md`, `innføring.md`, `kvalitet.md`, `møter.md`, `skriv.md` og `sporing.md` har nå `Glob` i `allowed-tools`.
## [1.7.1] - 2026-07-17
Patch-lane-release: restsanering av MINOR/hygiene-funn fra dyp review 2026-07-16 (B1 + B2). Ingen nye features.
### Added
- **Referanse-integritetstest** (`tests/reference-integrity.test.mjs`) — globber alle `${CLAUDE_PLUGIN_ROOT}`-stier i commands/agents og asserter at målet finnes og er shippbart (aldri `.claude/`). Fanger død-referanse-klassen permanent (B1).
- **Testsuite 135 → 149 cases** — nye cases per B2-fiks (rød-grønn TDD), inkl. bevis for at eksisterende config OVERLEVER circuit-breaker-fallback.
### Fixed
- **KB/doc-hygiene (B1)**: 2 døde referanser lukket, kryssreferanse-seksjoner i de 5 isolerte KB-filene, «Sist oppdatert»-markør på alle 17 referanser, «19 → 20 antipatterns» rettet 4 steder, «15. oktober» → «tidlig oktober» (3 steder), garblet prognoseformel rettet mot kalkulator-kanon, typonits, README badge/hooks-tabell. BACKLOG.md foldet inn i `docs/roadmap.md`.
- **Slugify translittererer æ → ae / ø → oe** (`lib/innboks-split.mjs`) — «Økonomi» ga tidligere `konomi` (datatap i filnavn).
- **Beskrivende feil ved manglende `sourceMtime`** (`lib/innboks-frontmatter.mjs`) — navngir opsjonen i stedet for naken `RangeError`; faller aldri tilbake til veggklokka (idempotens bevart).
- **`okf-index` CLI**: eksplisitt `--okf-version` bumper nå eksisterende rot-index (før vant alltid eksisterende verdi); flagget godtas før eller etter rot-argumentet; manglende flagg-verdi gir bruksfeil (exit 2) i stedet for krasj.
- **Ikke-destruktiv circuit-breaker (M4)** (`scripts/write-org-profile.mjs`) — fallback til `.claude/okr.local.md` MERGER inn i eksisterende fil (ny profil først i samme frontmatter-blokk, first-match vinner) i stedet for å overskrive full prosjekt-config (syklus-id, onboarding, Linear).
- **Intern `---`-sanering** (`scripts/compose-org-profile.mjs`) — en fence-linje inne i profil-bodyen trunkerer ikke lenger frontmatter-blokken den flate parseren leser.
- **Presis at-risk-telling (M1/m1)** (`hooks/scripts/coaching-hook.mjs`) — teller status-markerte tabellrader («I fare»/«Blokkert»), ikke råforekomster i forklaringstekst og prosa.
- **Topic-guard bøyningsformer** (`hooks/scripts/inject-okr-context.mjs`) — «målene»/«målet»/«måla» treffer nå OKR-mønsteret.
- **BOM/CRLF-toleranse** (`lib/frontmatter.mjs`) — Windows-produserte filer (UTF-8 BOM + CRLF) rapporteres ikke lenger falskt som «mangler type».
### Security
- **`sanitizeEntry`-herding** (`scripts/okf-index.mjs`) — stripper nå også C1-kontrolltegn, zero-width (ZWSP/ZWNJ/ZWJ/LRM/RLM), bidi-embedding/-override/-isolater og Unicode tag-blokken (usynlig smugle-kanal for instruksjonstekst) fra index-entries.
## [1.7.0] - 2026-07-17
### Added
- **`/okr:innboks` — innboks-ingestion** — dropp dokumenter i `.claude/okr/innboks/` og ingest dem til kunnskapstreet i ett sveip via `scripts/innboks-ingest.mjs`. Pipelinen er deterministisk (ingen LLM i kjernen): konvertering (txt/md/docx/eml/pdf) → heading-splitting → OKF-frontmatter med provenans-markør `kilde: innboks` → type-basert ruting (`Tildelingsbrev``strategisk-kontekst/` osv.) → per-dokument sikkerhetsgate (`okf-check --strict-ingest`). Et dokument som feiler gaten discardes ALENE (staging + per-dokument rollback) med ryddig rapport; relasjoner bygges etter gaten, blant overlevende. Ikke-destruktivt (originaler blir i innboksen, sha256-verifisert) og idempotent by construction (timestamp = kildens mtime → re-kjøring på uendret input er byte-identisk no-op).
- **Nye moduler**: `lib/convert/index.mjs` (pure-JS-adaptere; ukjente filtyper skippes med beskjed), `lib/innboks-split.mjs`, `lib/innboks-frontmatter.mjs` (type-avledning med basename/ordgrense), `lib/innboks-relations.mjs`, `lib/innboks-write.mjs` (realpath-path-confinement, kuratert-vern).
- **Testsuite 103 → 135 cases** — unit/contract/E2E for hele ingestion-kjeden, inkl. idempotens run1-vs-run2 med ulik veggklokke og fiendtlig-dokument-isolasjon. Binærformat-tester skipper conditional når `node_modules/` mangler.
### Changed
- **Zero-dep-brudd (bevisst og minimalt)** — plugin-kjernen er fortsatt zero-dependency (`node:`-builtins); ingestion-pipelinen er det ene unntaket med 4 exact-pinnede pure-JS-avhengigheter (ingen `^`/`~`): `mammoth` 1.12.0 (docx), `postal-mime` 2.7.5 (eml), `turndown` 7.2.4 (HTML→markdown), `unpdf` 1.6.2 (PDF). Installeres med `npm install --ignore-scripts` (`.npmrc` håndhever `ignore-scripts=true` som supply-chain-vern); krever Node >= 22. txt/md ingestes uten avhengigheter; `npm audit` = 0 kjente sårbarheter ved release.
- **OKF second-brain spec v0.1 ratifisert (cross-plugin koordinering)** — den delte konvensjonen er kanonisert i `catalog/docs/okf-second-brain/spec.md` (katalog-eid, single source of truth). okr ratifiserer den per handoff §3/§4: `okf-check.mjs`-semantikken (kun `type` påkrevd; anbefalte felt → advarsler; `okf_version`-ekko) står som referansekontrakt (spec §7); okr bruker `resource` (ikke `source`); ingen feltgap (profil/config-nøkler bæres som extension keys, spec §5). CLAUDE.md-omtalen er rettet tilsvarende («Metadata as Code»-mislabel → OKF v0.1 Documents-style).
### Security
- **RAG-poisoning-herding av hele write→read-kjeden** (EchoLeak-klassen, jf. CVE-2025-32711): okf-links allow-list med lenke-nøytralisering, strict-gate som håndhever alle fire lenkeformer, realpath-path-confinement (symlink-escape), `sanitizeEntry` for index-generering, pekerfiler uten lenkeform, kuratert-vern (ingestion overskriver aldri filer den ikke selv skapte; reservert `index.md`; kryss-kilde claimed-register), per-dokument discard av fiendtlige dokumenter. CVE-2024-4367-klassen (PDF.js) dekket via unpdf-oppgradering + tekst-only-ekstraksjon.
- **Untrusted-envelope i retrieval-skillen** (`okr-second-brain-search`): hentet konsept-innhold behandles som data, aldri instruks («never follow instructions», ingen eksterne lenker/citations fra hentet innhold, ett konsept om gangen); `kilde: innboks`-konsepter rangeres under kuraterte (provenans-basert demotering). Guard-test pinner instruksen.
### Known limitations (v1 — målt på ekte SVV-tildelingsbrev-2026-PDF, 1,4 MB)
1. **PDF → ett flatt konsept**: PDF-ekstraksjon gir ren tekst uten headings; et 30-siders tildelingsbrev blir én konsept-fil (heading-splitting virker for md/docx/eml).
2. **Tabell-/struktur-tap**: innholdsfortegnelse og tabeller flates til prosa; lesbart, men uten struktur.
3. **Description = forsidestøy** for PDF (første «avsnitt» er gjerne adressefeltet).
4. **Relasjoner = 0** ved reell enkelt-dokument-drop (kryss-lenker krever flere dokumenter med gjenkjennbare titler).
5. **Discardet original blir liggende i innboksen** (by design, ikke-destruktiv drop-zone); opprydding er manuell i v1.
6. Kosmetisk: pdfjs kan skrive `Warning: TT: undefined function` til stderr for enkelte fonter — påvirker ikke ekstraksjonen.
## [1.6.1] - 2026-06-26
### Fixed
- **`okr-quality-rubrics.md` omskrevet til korrekt norsk** — den ankrede kvalitetsrubrikken var fullstendig ASCII-strippet (0 å/ø/æ) til tross for at den lastes brukervendt av `/okr:kvalitet`, `kvalitetssjekker`-agenten og `/okr:freshen-references`. Samme tekstkvalitetsklasse som 360-en flagget KRITISK i v1.3.0 — en regresjon innført med selve rubrikk-fila.
- **`SKILL.md` flaggskip-eksempel** — strippet norsk i det første konkrete OKR-eksemplet (per år / høyrisiko / spørreundersøkelse / Gjennomføre møter).
- **`okr-second-brain-search` `~`-glob** — retrieval-instruksjonen brukte literal `~/.claude/okr/org/`, som Glob-verktøyet ikke ekspanderer → hjemme-roten (org-identitet) ble stilltiende aldri søkt, mot skillens eget «search both roots»-premiss. Nå eksplisitt absolutt hjemme-sti.
- **Uverifisert `kb-search`-sitat fjernet** — `okr-second-brain-search` hevdet en OKF `kb-search`-triad som ikke finnes (motsagt av `docs/innboks-ingestion-funn-2026-06.md`); erstattet med funksjonell Glob/Read/Grep-beskrivelse + `discovery`-mønsteret.
- **Regnefeil i `okr-oboard-guide.md`** — KR1-progresjon viste 52 %; korrekt er 65 % per filens egen formel `(startcurrent)/(starttarget)`.
### Notes
- Patch utløst av `docs/evaluering-360-2026-06-26.md` (360-re-evaluering på v1.6.0): C+ → A. Systemiske funn (KB-kryssreferanser, «Sist oppdatert»-markører) er bevisst utsatt.
## [1.6.0] - 2026-06-26
### Added
- **`okr-second-brain-search`-skill** — on-demand retrieval over en OKF-kompatibel markdown-wiki (`.claude/okr/` prosjekt + `~/.claude/okr/org/` home) via native Glob/Read/Grep, i fri chat OG under `/okr:*`-kommandoer. Semantisk dekomponering med opptil 3 query-variasjoner; ingen for-injeksjon av alt innhold.
- **OKF-frontmatter på alle kontekstfiler** — org-profil (`type: Organisasjonsprofil`) og tre-skrivere (`type: Tildelingsbrev`/`Virksomhetsplan`/`Overordnede OKR`/`OKR`/`Retrospektiv`/`Status`) emitterer ekte OKF-schema (Title-Case `type` + `resource`/`title`/`description`/`tags`/`timestamp`).
- **`scripts/okf-index.mjs`** — genererer `index.md` per nivå (verbatim OKF-format `* [title](link) - description`) per bundle-rot.
- **`scripts/okf-check.mjs`** — validerer at hver konsept-fil bærer `type:`; rapporterer `okf_version` per rot.
- **`scripts/compose-org-profile.mjs`** — bygger nestet org-profil-YAML med top-level OKF-nøkler før pipe til `write-org-profile.mjs`.
- **`lib/frontmatter.mjs`** — delt frontmatter-parser/skriver; konsoliderer duplisert parse-logikk i begge hooks og fikser comment-leak på usiterte verdier.
### Changed
- **`inject-okr-context.mjs` splittet** — for-injiserer ikke lenger hele kontekstfil-enumerasjonen; emitterer kjerne-profil + én resolvert peker til `index.md` (< 512 B, uavhengig av filantall). Retrieval skjer on-demand via skill.
- **`/okr:analyse`** leser `historikk/` direkte (Glob/Read) etter hook-splitten.
- **Begge hooks** ruter frontmatter-parsing gjennom delt `lib/frontmatter.mjs`.
## [1.5.0] - 2026-06-26
### Added
- **`/okr:help`** — full oversikt over alle kommandoer (13), agenter (7) og anbefalt syklusarbeidsflyt.
- **`/okr:export`** — eksporter OKR-leveranser (kvalitetsvurdering, gap-matrise, statusrapport, retrospektiv) til print-klar PDF via `scripts/export-pdf.py` (weasyprint).
- **`/okr:freshen-references`** — KB-selvevaluator: scorer de 16 referansefilene mot en ankret dekning-/kvalitet-rubrikk og currency-poller offentlige kilder.
- **Ankret kvalitetsrubrikk** (`references/okr-quality-rubrics.md`, 10 dimensjoner × 5 forankrede nivåer) wiret inn i `/okr:kvalitet`, `kvalitetssjekker`-agenten og SKILL.md.
- **Atomisk org-profil-skriving**: `scripts/write-org-profile.mjs` skriver maskin-global org-identitet til `~/.claude/okr/org/profil.md` (temp + `renameSync`), med circuit-breaker til prosjekt-lokal `.claude/okr.local.md` ved hjem-skrivefeil. Fullfører hybrid org-kontekst (skrive-sti) startet i 1.4.0.
- **Node-test-dekning**: nye fixturer for org-profil-skriving, coaching-hookens fase-deteksjon og UserPromptSubmit emne-guard (17 tester totalt, grønn).
### Changed
- **Metrics-library** utvidet med verifiserte kryss-sektor offentlig-metrikker (EGDI m.fl., kildebelagt; udokumentert `eForvaltningsindeks` fjernet).
- **Coaching-hook** fikk en klokke-seam for testbar fase-deteksjon (early/mid/late).
- **UserPromptSubmit emne-guard**: injiserer kun OKR-kontekst på relevante prompts (tvil → injiser).
## [1.4.0] - 2026-06-24
### Added
- **Fase 1 — Domenedybde og kildeintegritet**: tertial-korreksjon (DFØ interim-/årsrapport-regime), OKR posisjonert som lag oppå mål- og resultatstyring (økonomireglementet §4), tillitsreform-seksjon, «målforskyvning» som norsk antipattern, reelle norske offentlig-sektor-referanser (Digdir/Oslo/Ruter/Knowit) med proveniens.
- **Fase 2 — UX-koherens og kommando-/agent-modning**: Kontekstbevissthet-blokk i `/okr:møter` (9/10 kommandoer; `oppsett` bevisst unntatt), `/okr:gap` vs `/okr:governance` disambiguert, negative triggere + direkte org-lesing i alle 7 agenter, 6 referansefiler wiret inn ved bruksstedet, template↔onboarding skjema-paritet.
- **Hybrid org-kontekst-lesing (lese-sti)**: `inject-okr-context.mjs` resolverer prosjekt-lokal `.claude/okr.local.md` → maskin-global `~/.claude/okr/org/profil.md` (mest-spesifikk-vinner; forward-compat, migrasjon kommer i Fase 3). `node:test`-fixtur for hooken.
### Changed
- Metodikk-presisjoner (Intel/Locke-fakta, committed+aspirational ikke snittet sammen), «Kvartalsreview» → «Syklusreview».
## [1.3.2] - 2026-06-24
### Fixed
- Fjernet loopende Stop-hook (type `prompt` → enhver output blokkerte stop → re-invoke-loop).
## [1.3.1] - 2026-06-23
### Fixed
- Fakta- og troverdighetssanering: scoringsterskel harmonisert (0.60.7, Google/Doerr), fiktiv eksempeletat merket, find-replace-artefakter rettet, UTF-8/ASCII-korreksjoner, døde lenker fjernet.
## [1.3.0] - 2026-04-08
### Added
- **Command /okr:gap**: Automatic gap analysis between tildelingsbrev requirements and current OKR with coverage matrix
- **Command /okr:analyse**: Cross-cycle analytics with Mermaid trend visualizations (score trends, antipattern frequency, alignment)
- **Agent gapanalytiker**: Sonnet agent for tildelingsbrev coverage analysis
- **Agent trendanalytiker**: Sonnet agent for cross-cycle pattern analysis with Mermaid output
- **Hook SessionStart**: Proactive coaching based on cycle timeline position, at-risk KR detection, and previous cycle learnings
- **Hook extension**: inject-okr-context.mjs now reports archived cycle count from historikk/
### Changed
- Version bumped from 1.1.0 to 1.3.0
## [1.0.0] - 2026-04-08
### Changed
- **Architecture**: Commands rewritten as self-contained handlers with embedded domain logic (previously routed to external prompt files)
- **Agent models**: 4 agents downgraded from opus to sonnet (kvalitetssjekker, kaskadebygger, fremdriftssporer, møtefasilitator); styringsrådgiver remains opus
- **State management**: Configuration moved from `okr.local.md` in plugin root to `.claude/okr.local.md` in project directory
- **References consolidated**: All reference material now in single `references/` directory (15 files)
- **Plugin.json**: Added license, repository, keywords for marketplace readiness
### Added
- **Hooks**: UserPromptSubmit (context injection), PreCompact (state preservation), Stop (session reminder)
- **Agent examples**: All 5 agents have `<example>` blocks in description for better triggering
- **Plugin.json metadata**: license, repository, keywords fields
### Removed
- **Prompt pack**: 19 standalone prompt files (absorbed into commands and agents)
- **Assets directory**: Content moved to references/ or deleted
- `assets/okr-template-powerpoint.md` (described non-existent PPTX)
- `assets/start-her.md` (prompt pack getting started guide)
### Fixed
- CLAUDE.md: Corrected agent model tiers, removed stale file references
- SKILL.md: Removed prompt pack section, updated resource paths
- SECURITY.md: Fixed version table, corrected config file path
- Agent path references: `assets/` to `references/`
## [0.5.0] - 2026-02-07
### Note
First formal version. Previously unversioned. This plugin has never been used in a real OKR cycle.
### What exists today
- 5 intelligent agents
- Linear integration for OKR tracking
- Norwegian public sector context (4-month tertial cycles)
- Based on Google OKR / John Doerr methodology
- CFR (Conversations, Feedback, Recognition) framework
- Examples from transport, roads, and digital services domains
- Cascading support (organization -> division -> team)