feat(okr): 1.8.0 En kanon versjonssync + CHANGELOG

Step 14 (Wave 6), siste steg i fase C3. Alle versjonsflater 1.7.1 -> 1.8.0:
plugin.json:3, package.json:3, package-lock.json:3+9, CLAUDE.md:1, README.md
badge, SKILL.md x2. Ny Keep-a-Changelog-seksjon [1.8.0] + README-historikkrad
som oppsummerer F-a..F-i, score-grenser, konsistensvakten og C6-markeds-
oppdateringen fra Steps 1-13.

TDD: package.json bumpet foerst -> package-shape.test.mjs case 1 gikk ROED
(expected 1.7.1, actual 1.8.0) -> assertion + header-kommentar oppdatert til
1.8.0 (minor-lane C: En kanon) -> GROENN. Historiske "B1/B2 (1.7.1)"-
provenanskommentarer i tester og historikkrader for 1.7.1 er urort.

To presisjonsfikser tatt inn fra S31-funn (begge i filer Step 14 allerede rorer):
- CLAUDE.md:21 sa "score the 16 domain reference files". Fasit: 16 AV 17 scores;
  okr-quality-rubrics.md er ekskludert (sirkulaer - den er selv scorings-
  instrumentet). Skrevet i samme presise form som README:150.
- CLAUDE.md:73 pekte paa lib/innboks-convert.mjs. Modulen har ALDRI eksistert
  (git log --all paa stien: tom; adapterne har ligget i lib/convert/ siden
  a807ee2). Rettet til lib/convert/index.mjs. Samme feilsti stod i CHANGELOG
  1.7.0-noten (linje 34) og er rettet der ogsaa: en dokumentert modul som aldri
  fantes er en usann paastand, ikke historisk provenans.

CHANGELOG-datoen er satt til 2026-07-25 (i dag). Faller C7-releasen paa en
senere dato, maa datoen justeres da.

Verify: node --test --test-reporter=tap tests/*.test.mjs -> 163 pass / 0 fail.
grep -rc "1.7.1" plugin.json package.json CLAUDE.md -> 0/0/0.
9 filer endret = Manifest expected_paths 1:1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016pUfkQ1YyH75z9y6RBaBHG
This commit is contained in:
Kjell Tore Guttormsen 2026-07-25 06:44:35 +02:00
commit 37142236f2
9 changed files with 46 additions and 14 deletions

View file

@ -1,6 +1,6 @@
{
"name": "okr",
"version": "1.7.1",
"version": "1.8.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"

View file

@ -5,6 +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).
## [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`, 13 cases: 10 vakt-cases F-a…F-i + score-grenser, 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 → 163 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.
- **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.
## [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.
@ -31,7 +62,7 @@ Patch-lane-release: restsanering av MINOR/hygiene-funn fra dyp review 2026-07-16
### 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/innboks-convert.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).
- **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

View file

@ -1,4 +1,4 @@
# OKR Offentlig Sektor v1.7.1
# OKR Offentlig Sektor v1.8.0
Expert OKR guidance for Norwegian public sector. Google/Doerr methodology adapted for 4-month tertial cycles.
@ -18,7 +18,7 @@ Expert OKR guidance for Norwegian public sector. Google/Doerr methodology adapte
| `/okr:oppsett` | Configure plugin: onboarding interview (full/mvp), cycle archival, profile update. Args: `full\|mvp\|arkiver\|oppdater\|vis` |
| `/okr:innboks` | Ingest documents dropped in `.claude/okr/innboks/` into the OKF tree — deterministic convert/split/frontmatter/index, per-document security gate |
| `/okr:export` | Export OKR deliverables (quality review, gap matrix, status report, retrospective) to print-ready PDF via weasyprint |
| `/okr:freshen-references` | KB self-evaluator: score the 16 domain reference files against an anchored rubric + currency-poll public sources |
| `/okr:freshen-references` | KB self-evaluator: score 16 of the 17 domain reference files against an anchored rubric — the quality rubric itself is excluded, since scoring the scoring instrument is circular — + currency-poll public sources |
| `/okr:help` | Full overview of all commands, agents, and recommended cycle workflow |
## Agents
@ -70,7 +70,7 @@ Context files carry OKF v0.1 Documents-style frontmatter (conforms to the OKF v0
- `scripts/okf-index.mjs` — regenerate a root's per-level `index.md` (verbatim OKF index format).
- `scripts/okf-check.mjs` — validate each concept file carries `type:` (exit 1 + count otherwise); report `okf_version` per root.
- `scripts/compose-org-profile.mjs` — build the nested org-profile YAML with top-level OKF keys (`type`/`resource`/`timestamp`) before piping to `write-org-profile.mjs`.
- `scripts/innboks-ingest.mjs` — inbox-ingestion orchestrator (`/okr:innboks`): walks `.claude/okr/innboks/`, converts (txt/md/docx/eml/pdf via `lib/innboks-convert.mjs`), heading-splits, stamps OKF frontmatter + `kilde: innboks`, routes by type, then gates each document with `okf-check --strict-ingest` — a failing document is discarded alone (staging + per-document rollback), survivors get relations and index entries. Non-destructive (originals stay in the inbox), idempotent by construction (timestamp = source mtime), path-confined (realpath). Binary formats need `npm install --ignore-scripts` (4 exact-pinned pure-JS deps); txt/md run dependency-free.
- `scripts/innboks-ingest.mjs` — inbox-ingestion orchestrator (`/okr:innboks`): walks `.claude/okr/innboks/`, converts (txt/md/docx/eml/pdf via `lib/convert/index.mjs`), heading-splits, stamps OKF frontmatter + `kilde: innboks`, routes by type, then gates each document with `okf-check --strict-ingest` — a failing document is discarded alone (staging + per-document rollback), survivors get relations and index entries. Non-destructive (originals stay in the inbox), idempotent by construction (timestamp = source mtime), path-confined (realpath). Binary formats need `npm install --ignore-scripts` (4 exact-pinned pure-JS deps); txt/md run dependency-free.
Retrieval is on-demand via the `okr-second-brain-search` skill. The UserPromptSubmit hook no longer pre-injects the full context-file enumeration — it emits the core profile plus one resolved pointer to `index.md` (< 512 B, independent of file count).

View file

@ -6,7 +6,7 @@
*AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)*
![Version](https://img.shields.io/badge/version-1.7.1-blue)
![Version](https://img.shields.io/badge/version-1.8.0-blue)
![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple)
![Agents](https://img.shields.io/badge/agents-7-orange)
![Commands](https://img.shields.io/badge/commands-14-blue)
@ -301,6 +301,7 @@ The plugin core is zero-dependency (`node:` builtins only). The inbox-ingestion
| Version | Date | Highlights |
|---------|------|------------|
| **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 → 163 cases) |
| **1.7.1** | 2026-07-17 | Patch: restsanering etter dyp review — KB/doc-hygiene med referanse-integritetstest (B1) + ingestion-kode-hygiene (B2): æ/ø-translitterering i slugify, ikke-destruktiv circuit-breaker (merge, config overlever), sanitizeEntry mot bidi/zero-width/Unicode-tag, `--okf-version`-bump, BOM/CRLF-toleranse, presis at-risk-telling, bøyningsformer i topic-guard |
| **1.7.0** | 2026-07-17 | Innboks-ingestion: `/okr:innboks` med deterministisk pipeline (convert/split/frontmatter/gate/relasjoner/indeks), per-dokument sikkerhetsgate mot RAG-poisoning, `kilde: innboks`-provenans + untrusted-envelope i retrieval-skillen, 4 exact-pinnede pure-JS-avhengigheter (eneste zero-dep-unntak) |
| **1.6.1** | 2026-06-26 | Patch: credibility-sanering etter 360-re-evaluering (C+ → A) — ASCII-strippet kvalitetsrubrikk omskrevet til korrekt norsk, `okr-second-brain-search` `~`-glob søker nå hjemme-roten, uverifisert kb-search-sitat fjernet, regnefeil i oboard-eksempel rettet |

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "okr-offentlig-sektor",
"version": "1.7.1",
"version": "1.8.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "okr-offentlig-sektor",
"version": "1.7.1",
"version": "1.8.0",
"dependencies": {
"mammoth": "1.12.0",
"postal-mime": "2.7.5",

View file

@ -1,6 +1,6 @@
{
"name": "okr-offentlig-sektor",
"version": "1.7.1",
"version": "1.8.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).",

View file

@ -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.7.1"
version: "1.8.0"
---
# OKR Skill for Offentlig Sektor (Norge)

View file

@ -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.7.1"
version: "1.8.0"
---
# OKR Second-Brain Search

View file

@ -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.7.1 (patch-lane B1+B2), og at .npmrc slaar av
// er 1.8.0 (minor-lane C: En kanon), 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.7.1 (patch-lane)', () => {
test('package.json: type module + version 1.8.0 (minor-lane)', () => {
const pkg = readPkg();
assert.equal(pkg.type, 'module');
assert.equal(pkg.version, '1.7.1');
assert.equal(pkg.version, '1.8.0');
});
test('package.json: engines.node-gulv satt (unpdf krever >= 22)', () => {