// okf-vocab.mjs // Lukket kontrollert vokabular for innboks-ingestion (type + tags) og // type->nivaa-ruting. Zero npm dependencies. // // Net-new (premiss #1): handheves KUN paa ingestion-skrivestien (snapType/ // snapTags) og av okf-check++ --strict-ingest. Lese-siden (okr-second-brain- // search, okf-check default) behandler fortsatt ukjente typer som gyldige -- // denne modulen er den ENESTE strenge porten, aktiv kun ved ingestion. // Title-Case kanoniske OKF-typer (jf. catalog-spec Documents/kb Layout). export const TYPE_VOCAB = [ 'Organisasjonsprofil', 'Tildelingsbrev', 'Virksomhetsplan', 'Overordnede OKR', 'OKR', 'Retrospektiv', 'Status', 'Notat', 'Dokument', ]; // Safe default naar raw type ikke matcher vokabularet exact (premiss #1). const DEFAULT_TYPE = 'Dokument'; // Lukket start-sett av Title-Case tags for ingestion-snap. export const TAGS_VOCAB = [ 'Strategi', 'Tildelingsbrev', 'Virksomhetsplan', 'OKR', 'Styring', 'Governance', 'Retrospektiv', 'Status', 'Maal', 'Risiko', ]; // type -> bundle-nivaa (katalog under bundle-rot). Organisasjonsprofil rutes // til dokumenter/ (IKKE strategisk-kontekst/) for aa ikke konkurrere med den // home-kanoniske ~/.claude/okr/org/profil.md (Revisions #25). const LEVEL_BY_TYPE = { Tildelingsbrev: 'strategisk-kontekst', Virksomhetsplan: 'strategisk-kontekst', 'Overordnede OKR': 'strategisk-kontekst', Retrospektiv: 'historikk', OKR: 'dokumenter', Status: 'dokumenter', Notat: 'dokumenter', Dokument: 'dokumenter', Organisasjonsprofil: 'dokumenter', }; const DEFAULT_LEVEL = 'dokumenter'; // Exact-match -> kanonisk type; ellers safe default Dokument. export function snapType(raw) { return TYPE_VOCAB.includes(raw) ? raw : DEFAULT_TYPE; } // Behold kun tags i det lukkede vokabularet (dropp ukjente); bevar rekkefolge. export function snapTags(rawList) { if (!Array.isArray(rawList)) return []; return rawList.filter((t) => TAGS_VOCAB.includes(t)); } // type -> bundle-nivaa; ukjent/ikke-vokab -> default dokumenter/. Plassert her // i Session 1 slik at relasjons-steget (Step 6) kan resolvere konseptets // mal-sti FOR skriv (Pass-2 ordering-fiks, Revisions #21). export function routeLevel(type) { return LEVEL_BY_TYPE[type] ?? DEFAULT_LEVEL; }