fix(okr): frontmatter-verdi krysser ikke linjeskift (patch-lane #5)

`get()`-regexens verdi-gren brukte `\s*`, som inkluderer linjeskift. Enhver
key med tom rest-av-linje slukte dermed den neste ikke-tomme linja. Utslaget
var bredere enn list-keys: en tom `title:` returnerte neste keys hele linje
("type: OKR"), og et tomt `description:` dempet okf-checks anbefalt-felt-
advarsel med data som tilhorte en annen key.

Verdi-grenen strammet til `[ \t]*`. Innrykk-ankeret (`^\s*`) er urort -- det
er load-bearing for inject-okr-context.mjs:69s nestede organisasjon:-lesing.
Kontrakt-kommentaren i :13-16 lovet allerede null for list-keys; den er naa
sann i stedet for aa bli rettet ned.

Sju RED-verifiserte tester: (L1) list-key gir null - (L2) tom skalar sluker
ikke neste rot-key - (L3) tom key foran list-blokk - (L4) innrykk-toleransen
bevart, forelder gir null - (L5) tab-separert verdi - (L6) tomt anbefalt felt
demper ikke okf-check-advarselen (rootLevelGet arvet defekten) - (L7)
broedtekst-fallbacken plukker ikke list-verdi fra frontmatter.

(L7) gjor S57s latente begrunnelse maalbar: uttrekket i okf-check.mjs:125 ble
beholdt mot nettopp denne defekten, og naar fm-laget endelig taper for
list-keys er `body = raw` foerste gang en roednende mutasjon.

Mutasjons-verifisert (M1 revert, M3 anker-fjerning, M4 uttrekk-fjerning). M2
viste at (L5) ikke vokter tegnklassen -- .trim() gjor `[ \t]*` og `[ ]*`
ekvivalente -- saa testen er omskrevet til aa paastaa det den faktisk viser.

Suite 321 -> 328.
This commit is contained in:
Kjell Tore Guttormsen 2026-08-09 14:43:15 +02:00
commit 9a68441161
4 changed files with 109 additions and 15 deletions

View file

@ -1194,6 +1194,48 @@ test('(N4) okf-check: et NESTET anbefalt felt demper ikke advarselen', () => {
}
});
test('(L6) okf-check: et TOMT anbefalt felt demper ikke advarselen', () => {
// Linjeskift-aksen naar rootLevelGet: innrykk-filteret fjerner list-elementer,
// men et tomt `description:` fulgt av neste ROT-key slukte den linja og gjorde
// feltet ikke-tomt -- advarselen ble dempet av data som tilhorte `title`.
const dir = tmpRoot();
try {
buildCleanIngest(dir);
writeFileSync(
join(dir, 'dokumenter', 'tom-anbefalt.md'),
'---\ntype: Notat\ndescription:\ntitle: Ekte tittel\n---\n# Tom anbefalt\n',
);
const r = checkBundle(dir, { files: [join(dir, 'dokumenter', 'tom-anbefalt.md')] });
assert.ok(
r.warnings.some((w) => /tom-anbefalt\.md: mangler anbefalt felt .description./.test(w)),
`tomt description -> advarsel forventet, fikk:\n${r.warnings.join('\n')}`,
);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test('(L7) okf-check: broedtekst-fallbacken plukker ikke list-verdi FRA frontmatter', () => {
// S57 beholdt broedtekst-uttrekket (okf-check.mjs:125) mot en LATENT defekt den
// ikke kunne maale: saa lenge get() paa en list-key ga foerste list-element,
// vant fm-laget alltid og fallbacken kjorte aldri for list-keys. Etter (L1) gir
// fm-laget null -> fallbacken kjorer -> uttrekket er foerste gang observerbart.
// Uten det ville `^okf_version:` matchet inne i frontmatteren og plukket «- 9.9».
const dir = tmpRoot();
try {
buildCleanIngest(dir);
writeFileSync(
join(dir, 'index.md'),
['---', 'type: Index', 'okf_version:', ' - 9.9', '---', '# Rot', '', 'okf_layout: kb-layout-2026-06', ''].join('\n'),
);
const r = checkBundle(dir, { files: [] });
assert.equal(r.okfVersion, null, 'list-verdi i frontmatter skal ikke lekke via fallbacken');
assert.equal(r.okfLayout, 'kb-layout-2026-06', 'ekte broedtekst-markoer resolver fortsatt');
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test('(N5) okf-check: en NESTET okf_version i rot-index leses ikke som rot-markoer', () => {
const dir = tmpRoot();
try {