feat(okr): strategi-til-OKR og Beyond Budgeting i framework

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-08-01 22:06:56 +02:00
commit 47076ddc1a
2 changed files with 231 additions and 0 deletions

View file

@ -424,3 +424,58 @@ test('(k) R2: kommandoer som instruerer Glob deklarerer Glob i allowed-tools', (
`Glob instruert i body uten dekning i allowed-tools:\n${missing.join('\n')}`,
);
});
// --- (l) D4 steg 3: framework-seksjonene baerer hver sin egen kildeseksjon ---
// Fase D tilfoerer to navngitte seksjoner i okr-framework.md. Begge er domeneprosa
// bygget paa eksterne kilder, og kildedisiplinen krever at HVER av dem baerer sin
// egen kildeseksjon -- ikke en felles liste nederst, som gjoer det umulig aa se
// hvilken paastand som stoetter seg paa hva. Vakten er strukturell (seksjon finnes +
// seksjonen inneholder "### Kilder"), aldri paa ordlyd i selve prosaen.
const D4_FRAMEWORK_SECTIONS = [
'Fra strategi til OKR',
'Beyond Budgeting og target/forecast-separasjonen',
];
// Kropp mellom "## <heading>" og neste "## " -- brukes til aa binde kildeseksjonen
// til RIKTIG seksjon i stedet for aa lete i hele fila.
function sectionBody(body, heading) {
const lines = body.split('\n');
const start = lines.findIndex((l) => l.trim() === `## ${heading}`);
if (start === -1) return null;
const rest = lines.slice(start + 1);
const end = rest.findIndex((l) => /^## /.test(l));
return (end === -1 ? rest : rest.slice(0, end)).join('\n');
}
test('(l) D4: framework-seksjonene finnes og baerer hver sin kildeseksjon', () => {
const body = readDoc(`${REF}/okr-framework.md`);
const missing = [];
for (const heading of D4_FRAMEWORK_SECTIONS) {
const sec = sectionBody(body, heading);
if (sec === null) {
missing.push(`seksjon mangler: ## ${heading}`);
continue;
}
if (!/^### Kilder\s*$/m.test(sec)) {
missing.push(`seksjon uten egen kildeseksjon: ## ${heading}`);
}
}
assert.deepEqual(
missing,
[],
`fase D-seksjoner i okr-framework.md:\n${missing.join('\n')}`,
);
});
// (l2) BBIs eget materiale navngir det siste prosessprinsippet "Coordination";
// utbredte sekundaerkilder kaller det "Rhythm". Diskrepansen er reell, og loesningen
// er aa sitere ORDLYD framfor kortnavn. Vakten laaser at sekundaerkilde-navnet aldri
// snieker seg inn i kanon.
test('(l2) D4: BBI-prinsipper siteres paa ordlyd, ikke paa det omstridte kortnavnet', () => {
const offenders = linesMatching(readDoc(`${REF}/okr-framework.md`), /Rhythm/);
assert.deepEqual(
offenders,
[],
'BBIs egen ordlyd navngir prinsippet "Coordination"; "Rhythm" er sekundaerkilde-navngiving',
);
});