feat(okr): deterministisk skriveledd for status.md (1.10.0)

Kjeden /okr:rapport -> /okr:sporing -> status.md var beskrevet i prosa, men
manglet et mekanisk ledd: ingenting foerte en generert rad inn i status.md --
fila coaching-hook teller at-risk-KR i, /okr:moeter bygger agenda fra, og
/okr:oppsett arkiver leser sluttscorer fra. Rot-aarsaken var at HELE
sporings-stien var lesende (ingen Write/Edit/Bash i allowed-tools).

scripts/syklus-status.mjs tar confidence som JSON paa stdin og bygger radene
gjennom statusrapport() i lib/syklus-rapport.mjs -- samme kode som
tertialrapporten. Aritmetikken kan derfor ikke drifte fra /okr:rapport, fordi
det ikke finnes en andre implementasjon av den. En LLM skriver ikke av et tall
paa veien, og en maskin utleder ikke et trafikklys: beslutning 9 staar, presist
formulert som at generatoren PLASSERER en etikett den faar inn som data og
UTLEDER aldri en.

Haandhevet i kode, ikke i prosa: lukket vokabular (On Track/At Risk/Off Track),
full dekning (en tom confidence-celle ville lest som groenn hos hver konsument),
typo-fangst paa ukjente KR-navn, og kuratert-fil-vern -- en status.md uten
provenans-noekkelen `kilde: sporing` er haandholdt og overskrives aldri (samme
mekanikk som innboks-write bruker med `kilde: innboks`).

Suite 329 -> 343. Fem vakter mutasjons-verifisert: rad-drift mot
tertialrapporten, vokab, dekning (baade alene og sammen med vokab-vakten som
overlapper den), og kuratert-vernet.
This commit is contained in:
Kjell Tore Guttormsen 2026-08-10 20:56:26 +02:00
commit 3a0cbcfbf9
13 changed files with 618 additions and 50 deletions

View file

@ -1,7 +1,7 @@
---
name: okr:sporing
description: Spor OKR-fremgang, beregn score og generer check-in rapporter
allowed-tools: Read, AskUserQuestion, Task, ToolSearch, Glob
allowed-tools: Read, Bash, AskUserQuestion, Task, ToolSearch, Glob
argument-hint: "[OKR eller tall for oppdatering]"
---
@ -65,7 +65,32 @@ Score = (Nåværende - Baseline) / (Target - Baseline)
nå target). Innfør ingen egne nivåer eller terskler her. Trend er ett *innspill*
til vurderingen: peker den mot target, flater den ut, eller har fremgangen stoppet?
4. **Generer rapport** med anbefalte tiltak
4. **Skriv `status.md` med scriptet — aldri for hånd.** Du eier vurderingen;
generatoren eier tallene. Lever confidence som JSON på stdin, ett oppslag fra
KR-navn (nøyaktig som i `kr*_navn`) til etikett:
```bash
node ${CLAUDE_PLUGIN_ROOT}/scripts/syklus-status.mjs .claude/okr/syklus/[id] <<'JSON'
{
"Andel digitale søknader (prosent)": "At Risk",
"Gjennomsnittlig saksbehandlingstid (dager)": "On Track"
}
JSON
```
Etikettene er det lukkede vokabularet fra `okr-framework.md`: `On Track`,
`At Risk`, `Off Track`. Alle KR i syklusen må ha en etikett — scriptet nekter
å skrive en fil med tomme celler, fordi en slik fil ser vurdert ut uten å være
det, og konsumentene ville lest den som grønn.
**Skriv aldri av tallene selv.** Scriptet bygger radene med samme kode som
`/okr:rapport`, så score og avvik i `status.md` er de samme bytene der.
Exit-koder: `0` skrevet · `1` domenefeil (ugyldig eller manglende etikett,
eller en håndholdt `status.md` i veien — den overskrives aldri) · `2` bruksfeil
(feil argument, katalogen finnes ikke, ugyldig JSON).
5. **Presenter resultatet** med anbefalte tiltak, og pek på fila som ble skrevet.
### Ved ukentlig check-in
@ -75,52 +100,57 @@ Generer en strukturert check-in:
3. Beslutninger som trengs
4. Fokus neste periode
## Eksempel på output
## Fila scriptet skriver
Når statusrapporten lagres som `.claude/okr/syklus/[id]/status.md` i second-brain-treet,
bær filen **OKF-frontmatter** (påkrevd `type: Status` + anbefalt `title`/`description`/
`timestamp`); rapportinnholdet under følger frontmatteren:
`.claude/okr/syklus/[id]/status.md` er et OKF-konsept i second-brain-treet, ikke løs
markdown. Scriptet setter frontmatteren selv — `type: Status` (uten den feller
`okf-check` hele roten) og `kilde: sporing`, provenans-nøkkelen som gjør at en senere
kjøring vet at fila er generert og trygt kan erstatte den. Etikettene er ASCII, uten
emoji, som resten av den maskingenererte flaten; `coaching-hook` matcher på ordene.
Forkortet utdrag av resultatet:
```markdown
---
type: Status
syklus: T1-2026
title: "Status T1-2026"
description: "Fremdrift og scoring uke 8 av 16"
timestamp: "[ISO-8601]"
title: Statusrapport T1-2026
timestamp: "2026-05-01T10:00:00.000Z"
kilde: sporing
---
## OKR Status - Uke 8 av 16
# Statusrapport T1-2026
### Objective: Forbedre trafikksikkerhet i skolesoner
## Committed Key Results
#### Committed Key Results
Committed KR maales binaert mot kravet: kravet er naadd eller ikke. En score
under 1.0 er et avvik som skal forklares, ikke et godt resultat.
| KR | Baseline | Target | Nå | Score | Avvik | Confidence |
### Trafikksikkerhet og tunnelsikkerhet
| KR | Baseline | Target | Naa | Score | Avvik | Confidence |
|----|----------|--------|-----|-------|-------|------------|
| KR1: Redusere ulykker | 40 | 30 | 35 | 0.50 | Ja | At Risk 🟡 |
| KR2: Fartshumper installert | 0 | 100 | 60 | 0.60 | Ja | On Track 🟢 |
| Tunneler med oppgradert sikkerhetsutrustning (antall) | 12 | 20 | 17 | 0.63 | Ja | At Risk |
**Committed: 0 av 2 KR har nådd kravet.** Et committed KR er nådd eller ikke;
avvikene over skal forklares, ikke rundes av til et snitt.
## Avvik som skal forklares
#### Aspirational Key Results
## Aspirational Key Results
| KR | Baseline | Target | Nå | Score | Avvik | Confidence |
| KR | Baseline | Target | Naa | Score | Avvik | Confidence |
|----|----------|--------|-----|-------|-------|------------|
| KR3: Foreldre-tilfredshet | 60 | 90 | 75 | 0.50 | - | At Risk 🟡 |
| Andel digitale soeknader (prosent) | 60 | 85 | 63 | 0.12 | - | At Risk |
**Snitt aspirational: 0.50** over 1 KR. Rundt 0.7 er forventet måloppnåelse for
aspirational — en lav score her er ikke et avvik og skal ikke rapporteres som ett.
**Confidence, committed:** At Risk 🟡 — KR1 trenger fokus, KR2 ligger foran plan.
**Confidence, aspirational:** At Risk 🟡 — KR3 flater ut.
**Anbefalte tiltak:**
1. Prioriter tiltak for KR1 (sikkerhet er kritisk)
2. Kjør brukerundersøkelse for KR3 før neste måned
**Snitt aspirational: 0.23** over 2 KR.
```
Rammeteksten om committed, avvik og aspirational kommer fra generatoren — du skal ikke
skrive den om. Det du eier, og som ikke finnes i fila, er **tiltakene**: presenter dem i
svaret ditt.
**Eksempel på anbefalte tiltak:**
1. Prioriter oppgraderingen av de tre gjenstående tunnelene — kravet er et avvik,
ikke et delresultat.
2. Kjør brukerundersøkelse på selvbetjeningsløsningen før neste måling.
## Linear-integrasjon
Hvis Linear er konfigurert (sjekk med ToolSearch):