okr/CHANGELOG.md
Kjell Tore Guttormsen 65c9412cca fix(okr): siterings-aksen naadde produsenten, ikke checkeren
1.8.2 unquotet parseExistingIndex (produsent-siden). okf-check sin
rootMarkers/pick returnerte fortsatt raa streng, saa samme fil ga to
lesninger av samme markoer:

  paa disk:     okf_version: "0.2"        (upstreams eget eksempel, SPEC.md:773)
  produsenten:  0.2                       <- unquotet
  checkeren:    "0.2"                     <- raa

Catalog maalte divergensen direkte mot sin egen checker gjennom
evaluateBundle: begge implementasjonene AKSEPTERER -- avviket ligger paa
verdien, ikke paa dommen. Ingen gate rammes i dag fordi paritetskorpuset
ikke har en sitert fikstur, hvilket ogsaa betyr at paritetsgatens groenne
farge ikke dekket denne aksen: den var "ikke kjoert", ikke "som forventet".

Fiks: unquote() eksporteres fra okf-index.mjs og importeres av
okf-check.mjs -- EN regel delt, ikke to kopier som kan drifte fra
hverandre. Script-til-script-import foelger etablert moenster
(innboks-ingest.mjs:51).

Tester: 192 -> 197. Fire kjoert roede foer fiksen. Den femte
(ubalansert-vakten) var groenn foer fiksen -- raa streng bevarer "0.2
naturlig -- og er derfor mutasjons-verifisert: en graadig unquote roedner
baade produsent- og checker-vakten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XKoS7Eb8YmAfeCf1EKZXt1
2026-07-31 18:25:58 +02:00

244 lines
32 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).
## [Uutgitt]
### 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.
- **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».
### Changed
- **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).
## [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)