• v1.9.0 b994ac32de

    v1.9.0 Stable

    ktg released this 2026-08-09 10:20:24 +00:00 | 12 commits to main since this release

    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, D4–D8). 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.mjslib/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-malenkrN_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 overgangsordningokf-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-checks 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.
    Downloads