okr/lib/okf-vocab.mjs

73 lines
2.2 KiB
JavaScript

// 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;
}