• v1.10.0 9033f37b63

    v1.10.0 Stable

    ktg released this 2026-08-10 19:05:19 +00:00 | 5 commits to main since this release

    Minor-release: det uwirede leddet. Kjeden /okr:rapport/okr:sporingstatus.md var beskrevet i prosa, men manglet et mekanisk ledd — ingenting førte en generert rad inn i status.md. Det er fila coaching-hook teller at-risk-KR i, /okr:møter bygger check-in-agenda fra, og /okr:oppsett arkiver leser sluttscorer fra. Ingen nye npm-avhengigheter. Suite 329 → 343 cases.

    Added

    • scripts/syklus-status.mjs — deterministisk skriveledd for .claude/okr/syklus/[id]/status.md. Tar confidence som JSON på stdin (oppslag fra KR-navn til etikett) og bygger radene med samme kode som tertialrapporten, gjennom statusrapport() i lib/syklus-rapport.mjs. Aritmetikken kan ikke drifte fra /okr:rapport, fordi det ikke finnes en andre implementasjon av den — en egen vakt sammenligner radene tegn for tegn mot tertialrapportens, bortsett fra confidence-cellen. Atomisk skriv (temp + rename), klokke-søm via OKR_NOW gir byte-identiske kjøringer.
    • Kuratert-fil-vern på status.md — en eksisterende fil uten provenans-nøkkelen kilde: sporing regnes som håndholdt, og skrivingen avvises med exit 1 i stedet for å klobbe brukerens egne data. Samme mekanikk som lib/innboks-write.mjs bruker med kilde: innboks. Egne tidligere kjøringer overskrives fritt.
    • Lukket confidence-vokabular håndhevet i kodeOn Track / At Risk / Off Track fra okr-framework.md, som er eneste sannhetskilde. Et nabo-uttrykk («Grønn», «on-track») avvises i stedet for å tolkes. Hvert KR i syklusen må ha en etikett: en fil med tomme celler ser vurdert ut uten å være det, og konsumentene ville lest den som grønn.

    Changed

    • /okr:sporing har fått Bash og skriver status.md via scriptet i stedet for å formulere fila selv. Hele sporings-stien var lesende før dette, hvilket var den mekaniske grunnen til at leddet manglet. Kommandoen eier fortsatt vurderingen og bare den; malen i kommandofila er erstattet av et utdrag av det scriptet faktisk produserer, med ASCII-etiketter uten emoji som resten av den maskingenererte flaten.
    • Beslutning 9 presisert, ikke svekket: generatoren plasserer en etikett den får inn som data, og utleder aldri en. Rapportformene (tertial/årsrapport/etatsstyring) emitterer fortsatt aldri confidence selv, og vakt (5c) holder dem til det. statusrapport står bevisst utenfor den listen, fordi den ikke utleder noe — den gjengir et skjønn som allerede er utøvd.

    Kjent avvik

    • coaching-hook teller committed og aspirational KR under ett når den varsler om confidence. Hooken teller alle tabellrader merket At Risk/Off Track og sier «OBS: N KR er At Risk/Off Track — vurder tiltak eller juster forventninger». okr-framework.md sier samtidig at de fleste stretch-KR bør stå At Risk, og at permanent grønt er selve sandbagging-signalet. For en velfungerende aspirational-portefølje peker varselet derfor feil vei: eneste måte å dempe det på er å merke stretch-KR grønne. Kollisjonen er ikke ny i art — en håndskrevet status.md etter den gamle malen ble talt likt — men fra og med 1.10.0 fylles kolonnen deterministisk, så den inntreffer alltid i stedet for av og til. Fikset hører hjemme i hooken, ikke i skriveleddet, og er ført som egen post for en senere patch. Selve rapporteringen er ikke berørt: aspirational-KR står fortsatt aldri i avviks-seksjonen (låst beslutning 15).
    Downloads
  • 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
  • v1.8.2 9a78c9f9d7

    v1.8.2 Stable

    ktg released this 2026-07-31 15:28:55 +00:00 | 45 commits to main since this release

    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.
    Downloads