feat(okr): guardrail som KR-designmoenster i skriv og kvalitet

This commit is contained in:
Kjell Tore Guttormsen 2026-08-02 10:14:55 +02:00
commit 3ebb333381
3 changed files with 66 additions and 0 deletions

View file

@ -56,6 +56,25 @@ Anker → 0-10-skala er definert i rubrikkfila («Bruk»-avsnittet): anker 1 →
anker 2 → 3-4, anker 3 → 5-6, anker 4 → 7-8, anker 5 → 9-10. Det er rubrikkfila som
eier skalaen; ikke dupliser den her.
## Guardrail-sjekkpunkt
Sjekk om KR-settet har **minst én guardrail** — en metrikk som ikke skal forbedres,
men som avslører om et annet KR forbedres på bekostning av noe. Mangler den, er
settet blindt for skadevirkninger: det kan nå 1.0 mens noe utenfor målebildet
forvitrer.
Sjekkpunktet henger sammen med dimensjonen **Leading/lagging-balanse** i rubrikken:
guardrailen er ofte stedet lagging-halvdelen av paret hører hjemme, fordi den måler
tilstanden som skal *bevares* mens leading-indikatoren beveger seg. Scor
dimensjonen i rubrikken; bruk dette punktet til å si om guardrailen finnes i det
hele tatt.
Flagg særskilt **rangerings-KR-er** mot andre virksomheter (typisk KOSTRA-plassering).
SSB advarer selv om at forskjeller i utgifter per person i målgruppen «ikke
utelukkende kan tolkes som et resultat av prioriteringer på lokalt nivå» — en
rangering er derfor ikke et holdbart KR. Foreslå en guardrail på egen tjenestekvalitet
i stedet.
## Vanlige antipatterns å sjekke
1. **Aktivitets-OKR** — måler hva vi gjør, ikke hva vi oppnår

View file

@ -86,6 +86,33 @@ Generer målbare Key Results for et gitt Objective.
- **2-5 stk per Objective** — typisk 3
- **Balanserte** — minst én per dimensjon (kvantitet, kvalitet, hastighet)
- **Har datakilde** — vet hvor tallene kommer fra
- **Minst én guardrail** — en metrikk som ikke skal forbedres (se under)
### Guardrail — metrikken som ikke skal forbedres
Et KR-sett trenger **minst én guardrail**: en metrikk som ikke er et forbedringsmål,
men som avslører om et annet KR forbedres på bekostning av noe. Guardrailen har et
gulv eller tak («skal ikke falle under», «skal ikke overstige»), ikke en
baseline → target-bane. Uten den kan settet nå 1.0 mens noe utenfor målebildet
forvitrer.
Formuler den som en grense:
```
KR3 (guardrail): Brukertilfredshet skal ikke falle under 4,1 av 5 mens
saksbehandlingstiden reduseres
```
**Hvorfor dette ikke er byråkrati:** en rangerings-KR mot andre kommuner («komme
blant de 10 beste i KOSTRA») er metodisk uholdbar — SSB advarer selv om at
forskjeller i utgifter per person i målgruppen «ikke utelukkende kan tolkes som et
resultat av prioriteringer på lokalt nivå». Å erstatte rangeringen med en guardrail
på egen tjenestekvalitet er guardrail-tenkning i praksis: du måler det du faktisk
rår over, og verner det du ikke vil miste.
Guardrailen er ofte det naturlige stedet å plassere lagging-halvdelen av
leading/lagging-paret — se dimensjonen **Leading/lagging-balanse** i
`references/okr-quality-rubrics.md`.
### Typer Key Results

View file

@ -470,6 +470,26 @@ test('(g3) dimensjonstall i kvalitet + kvalitetssjekker == faktisk antall i rubr
assert.deepEqual(drift, [], `dimensjonstall-drift (rubrikkfila = ${obj}+${kr}=${total}):\n${drift.join('\n')}`);
});
// --- (g4) guardrail som KR-designmoenster (D7 steg 16) ---
//
// Baseline foer steget: 0 treff paa "guardrail" i commands/, 2 i okr-antipatterns.md
// (:197 og :220). Begrepet fantes altsaa i kunnskapslaget, men naadde aldri malene
// pluginen faktisk emitterer -- samme uwirede-ledd-form som D6 steg 14 lukket.
// kvalitet.md skal dessuten KOBLE guardrail til leading/lagging-dimensjonen fra
// steg 15; uten koblingen blir sjekkpunktet et loest ord.
test('(g4) guardrail er wiret som KR-designmoenster i skriv + kvalitet', () => {
const mangler = [];
for (const f of ['commands/skriv.md', 'commands/kvalitet.md']) {
if (!/guardrail/i.test(readDoc(f))) mangler.push(`${f}: mangler guardrail-omtale`);
}
const kval = readDoc('commands/kvalitet.md');
const koblet = kval
.split('\n')
.some((l) => /guardrail/i.test(l) && /leading\/lagging|lagging/i.test(l));
if (!koblet) mangler.push('commands/kvalitet.md: guardrail ikke koblet til leading/lagging-dimensjonen');
assert.deepEqual(mangler, [], `guardrail-designmoenster (anker: okr-antipatterns.md:197,220):\n${mangler.join('\n')}`);
});
// (h) F-a fjerning. RED til Step 7. Score->modenhet-avledning borte; sandbagging-trendsignal til stede.
test('(h) F-a: ingen score->modenhet-avledning; sandbagging-trendsignal til stede', () => {
const problems = [];