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

|
||||

|
||||

|
||||

|
||||

|
||||
|
|
@ -399,6 +399,7 @@ Full detail in [CHANGELOG.md](CHANGELOG.md). Highlights:
|
|||
|
||||
| Version | Date | Highlights |
|
||||
|---------|------|------------|
|
||||
| **1.9.0** | 2026-08-09 | «Styringssløyfa lukkes» — tildelingsbrev til årsrapport i én kjede. Tre deterministiske rapportgeneratorer (tertialrapport, årsrapport del III, etatsstyringsmøte-underlag) bygget på en KR-datakontrakt der score alltid beregnes og aldri lagres; `/okr:arkivklar` som rent lesende vurderingsgrunnlag mot bevaringsforskrifta (§§ 7/30, safety-net § 3) med path-confinement i delt modul; committed/aspirational separert i alle tre rapportformene med sandbagging-vakt; leading/lagging og guardrail som KR-designmønster i rubrikk, `skriv` og `kvalitet`; ny referansefil `gevinstrealisering-okr.md`, KOSTRA-seksjon og Beyond Budgeting/strategi→OKR i framework (17 → 19 filer); `okf_version` flyttet til rot-indeksens frontmatter med permanent lesetoleranse for begge plasseringer. Suite 197 → 315 |
|
||||
| **1.8.2** | 2026-07-31 | Patch: siterte markørverdier korrumperte begge rot-markørene — `okf_version: "0.2"` (formen OKF-specen selv viser) ble avvist som ikke-upstream, flyttet til `okf_layout`, og `okf_version` nedgradert til vår konstant. Anførselstegn strippes nå ved parse (før tolkning og før emisjon) og verdien emitteres unquoted; unquote er konservativ (kun matchende par). Suite 187 → 192 |
|
||||
| **1.8.1** | 2026-07-25 | Patch: `okf_version`/`okf_layout`-splitt (OKF-spec §12) — rot-`index.md` bærer nå to distinkte markører i stedet for én som bar to urelaterte konsepter: `okf_version` = upstream OKF-versjonen (`0.1`, verdisett eid av Google), `okf_layout` = pluginens egen layout-revisjon (`kb-layout-2026-06`). Automatisk migrasjonssti for eksisterende bundles (layout-verdi i `okf_version` flyttes verbatim); `okf-check` ekkoer begge; `--okf-layout` erstatter `--okf-version` (beholdt som deprecated alias m/ stderr-varsel) |
|
||||
| **1.8.0** | 2026-07-25 | «Én kanon» — metodekonsolidering etter dyp review: én kanonisk confidence-tabell og én kadens-doktrine i `okr-framework.md` med konsument-dedup på tvers av referanser, kommandoer og agenter; score→modenhet-avledningen fjernet; `committed` = forpliktelse OG påvirkbarhet; kvalitetsvurdering ankret i rubrikken (alle 10 dimensjoner, ingen parallelle scorebånd); ekte antipattern-kategorier; milepæl-/binær-unntak; «align, don't cascade» i kaskadeflatene; markedsclaims kildebelagt + nye kilder (NCT, EBM 2024); ny konsistensvakt `tests/canon-consistency.test.mjs` (suite 149 → 167 cases) |
|
||||
|
|
|
|||
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "okr-offentlig-sektor",
|
||||
"version": "1.8.2",
|
||||
"version": "1.9.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "okr-offentlig-sektor",
|
||||
"version": "1.8.2",
|
||||
"version": "1.9.0",
|
||||
"dependencies": {
|
||||
"mammoth": "1.12.0",
|
||||
"postal-mime": "2.7.5",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "okr-offentlig-sektor",
|
||||
"version": "1.8.2",
|
||||
"version": "1.9.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"description": "OKR-plugin for norsk offentlig sektor. Pure-JS konverterings-deps for innboks-ingestion (bevisst zero-dep-brudd, se README).",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name: okr-offentlig-sektor
|
||||
description: >-
|
||||
OKR (Objectives and Key Results) for Norwegian public sector: writing OKR, reviewing OKR quality, cascading OKR from strategy to team, tracking progress, running OKR meetings, translating tildelingsbrev to OKR. Also CFR, OKR antipatterns, scoring, Oboard. Triggers on: "OKR", "skriv OKR", "vurder OKR", "OKR-scoring", "kaskadere OKR", "tildelingsbrev til OKR", "OKR for offentlig sektor".
|
||||
version: "1.8.2"
|
||||
version: "1.9.0"
|
||||
---
|
||||
|
||||
# OKR Skill for Offentlig Sektor (Norge)
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ description: >-
|
|||
prompt. Triggers on: "våre mål", "overordnede mål", "mål dette tertialet",
|
||||
"tertialmål", "tildelingsbrev", "hva sier OKR-ene våre", "forrige syklus",
|
||||
"strategi", "styringssignaler".
|
||||
version: "1.8.2"
|
||||
version: "1.9.0"
|
||||
---
|
||||
|
||||
# OKR Second-Brain Search
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
// Step 10 (A1): package.json-kontrakten for det bevisste zero-dep-bruddet.
|
||||
// Verifiserer at dep-laget er EXACT-pinnet (ingen ^/~/*), at engines-gulvet er
|
||||
// satt (unpdf krever node >= 22), at pakken er ESM (type: module), at versjonen
|
||||
// er 1.8.2 (patch-lane: unquote av siterte markoerverdier) paa ALLE shippede flater, og at .npmrc slaar av
|
||||
// er 1.9.0 (fase D: styringssloeyfa lukkes) paa ALLE shippede flater, og at .npmrc slaar av
|
||||
// install-scripts (Shai-Hulud / supply-chain). Zero npm deps i selve testen.
|
||||
// Moenster: tests/frontmatter.test.mjs (les fil, assert struktur).
|
||||
|
||||
|
|
@ -24,10 +24,10 @@ function readPkg() {
|
|||
return JSON.parse(readFileSync(PKG, 'utf8'));
|
||||
}
|
||||
|
||||
test('package.json: type module + version 1.8.2 (patch-lane)', () => {
|
||||
test('package.json: type module + version 1.9.0 (minor)', () => {
|
||||
const pkg = readPkg();
|
||||
assert.equal(pkg.type, 'module');
|
||||
assert.equal(pkg.version, '1.8.2');
|
||||
assert.equal(pkg.version, '1.9.0');
|
||||
});
|
||||
|
||||
test('package.json: engines.node-gulv satt (unpdf krever >= 22)', () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue