feat(okr): strategi-til-OKR og Beyond Budgeting i framework
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
3004b7e778
commit
47076ddc1a
2 changed files with 231 additions and 0 deletions
|
|
@ -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',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue