73 lines
2.2 KiB
JavaScript
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;
|
|
}
|