fix(okr): separer committed og aspirational i sporings-malene

This commit is contained in:
Kjell Tore Guttormsen 2026-08-02 07:01:55 +02:00
commit 785385baa3
3 changed files with 97 additions and 18 deletions

View file

@ -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) ---
// 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,