fix(okr): separer committed og aspirational i sporings-malene
This commit is contained in:
parent
47e7ac9e2a
commit
785385baa3
3 changed files with 97 additions and 18 deletions
|
|
@ -61,7 +61,10 @@ Score = (Nåværende - Baseline) / (Target - Baseline)
|
||||||
|
|
||||||
2. **Beregn score**:
|
2. **Beregn score**:
|
||||||
- Per KR
|
- Per KR
|
||||||
- Samlet (vektet gjennomsnitt)
|
- Oppsummert **per type**, aldri som ett felles tall: committed rapporteres som
|
||||||
|
hvor mange KR som har nådd kravet, aspirational som snittet på tvers av
|
||||||
|
aspirational-KR. De to typene måles mot hver sin målestokk, og et aggregat på
|
||||||
|
tvers av dem er tvetydig (`okr-framework.md`, committed/aspirational-skillet).
|
||||||
|
|
||||||
3. **Vurder confidence**:
|
3. **Vurder confidence**:
|
||||||
- Basert på trend og gjenstående tid
|
- Basert på trend og gjenstående tid
|
||||||
|
|
@ -90,14 +93,29 @@ Score = (Nåværende - Baseline) / (Target - Baseline)
|
||||||
|
|
||||||
### Objective: [tekst]
|
### Objective: [tekst]
|
||||||
|
|
||||||
| KR | Baseline | Target | Nå | Score | Trend | Status |
|
#### Committed Key Results
|
||||||
|----|----------|--------|-----|-------|-------|--------|
|
|
||||||
| KR1: [kort] | X | Y | Z | 0.XX | ↗️/→/↘️ | ✅/⚠️/❌ |
|
|
||||||
| KR2: [kort] | X | Y | Z | 0.XX | ↗️/→/↘️ | ✅/⚠️/❌ |
|
|
||||||
| KR3: [kort] | X | Y | Z | 0.XX | ↗️/→/↘️ | ✅/⚠️/❌ |
|
|
||||||
|
|
||||||
**Samlet score:** 0.XX
|
| KR | Baseline | Target | Nå | Score | Trend | Avvik | Confidence |
|
||||||
**Confidence:** [On Track 🟢 | At Risk 🟡 | Off Track 🔴]
|
|----|----------|--------|-----|-------|-------|-------|------------|
|
||||||
|
| KR1: [kort] | X | Y | Z | 0.XX | ↗️/→/↘️ | Ja/Nei | [nivå] |
|
||||||
|
| KR2: [kort] | X | Y | Z | 0.XX | ↗️/→/↘️ | Ja/Nei | [nivå] |
|
||||||
|
|
||||||
|
**Committed: N av M KR har nådd kravet.** Kravet er nådd eller ikke — hvert avvik
|
||||||
|
forklares for seg, og de summeres ikke til ett tall.
|
||||||
|
**Confidence, committed:** [On Track 🟢 | At Risk 🟡 | Off Track 🔴]
|
||||||
|
|
||||||
|
#### Aspirational Key Results
|
||||||
|
|
||||||
|
| KR | Baseline | Target | Nå | Score | Trend | Avvik | Confidence |
|
||||||
|
|----|----------|--------|-----|-------|-------|-------|------------|
|
||||||
|
| KR3: [kort] | X | Y | Z | 0.XX | ↗️/→/↘️ | - | [nivå] |
|
||||||
|
|
||||||
|
**Snitt aspirational: 0.XX** over N KR. Rundt 0.7 er forventet måloppnåelse —
|
||||||
|
en lav score her er ikke et avvik.
|
||||||
|
**Confidence, aspirational:** [On Track 🟢 | At Risk 🟡 | Off Track 🔴]
|
||||||
|
|
||||||
|
Nivået i `[nivå]`-cellene settes fra den kanoniske confidence-tabellen i
|
||||||
|
`okr-framework.md` — ikke fra score.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,18 @@ Score = (Nåværende - Baseline) / (Target - Baseline)
|
||||||
- Baseline og target (hvis ikke kjent)
|
- Baseline og target (hvis ikke kjent)
|
||||||
- Dato for måling
|
- Dato for måling
|
||||||
|
|
||||||
2. **Beregn score** per KR og samlet (vektet gjennomsnitt)
|
Er `/okr:rapport tertial` kjørt for syklusen, finnes tallene allerede i
|
||||||
|
`rapport-tertial.md` — les den i stedet for å spørre om dem på nytt.
|
||||||
|
Confidence-kolonnen der står tom med vilje: generatoren eier aritmetikken,
|
||||||
|
denne kommandoen eier vurderingen. Det er den kolonnen du fyller i steg 3.
|
||||||
|
|
||||||
|
2. **Beregn score** per KR, og oppsummer **per type** — aldri som ett felles tall.
|
||||||
|
Committed og aspirational måles mot hver sin målestokk, og et aggregat på tvers
|
||||||
|
av dem er tvetydig (`okr-framework.md`, committed/aspirational-skillet):
|
||||||
|
- **Committed:** hvor mange KR som har nådd kravet. Et committed KR er nådd
|
||||||
|
eller ikke; et snitt av binære krav er ikke en størrelse.
|
||||||
|
- **Aspirational:** snittet på tvers av aspirational-KR. Rundt 0.7 er forventet
|
||||||
|
måloppnåelse, ikke svikt.
|
||||||
|
|
||||||
3. **Vurder confidence** — sett nivået fra den **kanoniske confidence-tabellen i
|
3. **Vurder confidence** — sett nivået fra den **kanoniske confidence-tabellen i
|
||||||
`okr-framework.md`** (On Track 🟢 / At Risk 🟡 / Off Track 🔴, sannsynlighet for å
|
`okr-framework.md`** (On Track 🟢 / At Risk 🟡 / Off Track 🔴, sannsynlighet for å
|
||||||
|
|
@ -83,17 +94,27 @@ timestamp: "[ISO-8601]"
|
||||||
|
|
||||||
### Objective: Forbedre trafikksikkerhet i skolesoner
|
### Objective: Forbedre trafikksikkerhet i skolesoner
|
||||||
|
|
||||||
| KR | Baseline | Target | Nå | Score | Status |
|
#### Committed Key Results
|
||||||
|----|----------|--------|-----|-------|--------|
|
|
||||||
| KR1: Redusere ulykker | 40 | 30 | 35 | 0.50 | At Risk 🟡 |
|
|
||||||
| KR2: Fartshumper installert | 0% | 100% | 60% | 0.60 | On Track 🟢 |
|
|
||||||
| KR3: Foreldre-tilfredshet | 60% | 90% | 75% | 0.50 | At Risk 🟡 |
|
|
||||||
|
|
||||||
**Samlet score: 0.53** (vektet gjennomsnitt)
|
| KR | Baseline | Target | Nå | 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 🟢 |
|
||||||
|
|
||||||
**Samlet confidence: At Risk 🟡**
|
**Committed: 0 av 2 KR har nådd kravet.** Et committed KR er nådd eller ikke;
|
||||||
- KR1 og KR3 trenger fokus
|
avvikene over skal forklares, ikke rundes av til et snitt.
|
||||||
- KR2 ligger foran plan
|
|
||||||
|
#### Aspirational Key Results
|
||||||
|
|
||||||
|
| KR | Baseline | Target | Nå | Score | Avvik | Confidence |
|
||||||
|
|----|----------|--------|-----|-------|-------|------------|
|
||||||
|
| KR3: Foreldre-tilfredshet | 60 | 90 | 75 | 0.50 | - | 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:**
|
**Anbefalte tiltak:**
|
||||||
1. Prioriter tiltak for KR1 (sikkerhet er kritisk)
|
1. Prioriter tiltak for KR1 (sikkerhet er kritisk)
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,46 @@ test('(a2) F-c: ingen parallelle confidence-etikettsett utenfor kanon', () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// --- (k) Separasjonsregelen i malene (D6 steg 14) ---
|
||||||
|
//
|
||||||
|
// okr-framework.md:557: committed og aspirational boer ikke blandes til ett
|
||||||
|
// aggregat -- de to typene rapporteres hver for seg. Generatoren
|
||||||
|
// (lib/syklus-rapport.mjs) haandhever det; malene gjorde det ikke. En regel med to
|
||||||
|
// lesninger er nettopp defektklassen S38-S40 kostet tre oekter.
|
||||||
|
//
|
||||||
|
// Skanne-settet er commands/ + agents/ -- MALENE pluginen emitterer. references/
|
||||||
|
// staar utenfor med vilje: der foeres en annen diskusjon (per-Objective-aggregering
|
||||||
|
// i kalkulatoren), og aa dra den inn her ville blandet to spoersmaal i en vakt.
|
||||||
|
//
|
||||||
|
// To former, fordi bruddet har to skrivemaater:
|
||||||
|
// ETIKETT -- "Samlet score: <verdi>" i en malblokk. De andre aksene gaar klar:
|
||||||
|
// rubrikkens 0-10-skala har ingen verdi paa linjen, og det arkiverte
|
||||||
|
// datafeltet `samlet_score` er snake_case, ikke "samlet score".
|
||||||
|
// INSTRUKS -- "samlet (vektet gjennomsnitt)", som ber leseren lage aggregatet.
|
||||||
|
// En linje som navngir typen er per definisjon differensiert og gaar klar.
|
||||||
|
const AGGREGAT_ETIKETT = /samlet\s+score[:*\s]*[[\]0-9X_]/i;
|
||||||
|
const AGGREGAT_INSTRUKS = /\bsamlet\b[^\n]{0,25}vektet\s+gjennomsnitt/i;
|
||||||
|
|
||||||
|
test('(k) separasjonsregelen: ingen mal emitterer et udifferensiert samlet-aggregat', () => {
|
||||||
|
const maler = [...mdFiles('commands'), ...mdFiles('agents')];
|
||||||
|
assert.ok(maler.length >= 10, `parser-sanity: forventet >= 10 maler, fant ${maler.length}`);
|
||||||
|
|
||||||
|
const violations = [];
|
||||||
|
for (const f of maler) {
|
||||||
|
readDoc(f).split('\n').forEach((line, i) => {
|
||||||
|
if (/committed|aspirational/i.test(line)) return;
|
||||||
|
if (AGGREGAT_ETIKETT.test(line) || AGGREGAT_INSTRUKS.test(line)) {
|
||||||
|
violations.push(`${f}:${i + 1}: ${line.trim()}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
assert.deepEqual(
|
||||||
|
violations,
|
||||||
|
[],
|
||||||
|
`udifferensiert aggregat i mal (okr-framework.md:557 -- rapporter typene hver for seg):\n${violations.join('\n')}`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
// --- F-d kadens x publikum (D1 / review.md 607313e3) ---
|
// --- F-d kadens x publikum (D1 / review.md 607313e3) ---
|
||||||
// Den forrige vakten bandt kadens-adjektivet DIREKTE til check-in (\s+), og kunne derfor
|
// Den forrige vakten bandt kadens-adjektivet DIREKTE til check-in (\s+), og kunne derfor
|
||||||
// ikke feile paa den KANONISKE tabellen: etter "Maanedlig" kommer "**" og en cellevegg,
|
// ikke feile paa den KANONISKE tabellen: etter "Maanedlig" kommer "**" og en cellevegg,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue