feat(ms-ai-architect): decision-b Enhet 1 — dialekt-relabel 51 filer (Kategori→Category + Sist oppdatert→Last updated), 73 byte-eksakte swaps [skip-docs]
Ren value-preserving label-relabel av de to norske header-labelene til engelsk på 51 ref-filer (22 bærer begge). Ny testet ren primitiv relabelHeaderDialect() (header-blokk-scoped, kollisjons-/multiforekomst-guard) + manifest-drevet driver relabel-dialect.mjs (frosset 51-fil-manifest, hard per-fil-invariant, idempotent, isMain-guard). **Dato:** bevisst UTE (body-template-felle → Enhet 2). Premiss-korreksjon i roadmap R22: tredje Dato-dialekt (16), 0 bold-duplikater (ikke 4), 1 datoløs (ikke 5), category-none = vindus-artefakt. test-relabel-dialect 11/11; diff +73/-73 0 linjer utover label; suite 782/782 exit 0.
This commit is contained in:
parent
5a0e8d774a
commit
e999b74eda
54 changed files with 405 additions and 75 deletions
|
|
@ -1,4 +1,4 @@
|
|||
# Plugin-roadmap: sesjonsplan R0–R21 (2026-07)
|
||||
# Plugin-roadmap: sesjonsplan R0–R22 (2026-07)
|
||||
|
||||
_Styrende sesjonsplan for ms-ai-architect fra 2026-07-02, basert på full statusanalyse (visjon/planer, ground-truth-audit m/testkjøring, Spor 1-planlesing). Erstatter IKKE eksisterende planer (korrekthetsprogrammet, Spor 1-planen, briefer) — **sekvenserer** dem og fyller hullene analysen avdekket. Operatør-detaljer som ikke hører hjemme i repoet ligger i en LOCAL-ONLY-annex (`.claude/projects/2026-07-02-helhetlig-roadmap/`)._
|
||||
|
||||
|
|
@ -133,7 +133,26 @@ Maskineriet er bygget (krav 1+2+3 + per-kategori-hint); målingen er aldri kjør
|
|||
- **26 not-due Last-updated** — 21 relabel (`Sist oppdatert`/`Dato` → `Last updated`, behold dato), 5 datoløse (git-avledet dato krever «innholds-commit»-heuristikk som ekskluderer R19/R20-metadata-pass).
|
||||
- **3 norsk-dialekt Status** — engelsk `**Status:**` ville blande dialekt; håndteres i samme dialekt-pass.
|
||||
- **4 dual-header `ai-act-*`-filer** — plain-blokk (`Last updated:`/`Status: GA`/`Category:` linje 6–8) vs bold-blokk. **NB:** samme plain-blokk er hvorfor **R20 la til duplikat `**Category:**`** her (bold `Category` linje 3 vs plain `Category` linje 8) — begge duplikatene lukkes i normaliseringspasset. Mønsteret er innkapslet til nøyaktig disse 4 filene korpus-vidt.
|
||||
- **69 norsk-label-filer** (`Kategori`/`Sist oppdatert`) — engelsk label-normalisering.
|
||||
- **69 norsk-label-filer** (`Kategori`/`Sist oppdatert`) — engelsk label-normalisering. _(Korrigert i R22: faktisk 42 `**Kategori:**` + 31 `**Sist oppdatert:**`, union 51 filer; «69» stemte ikke mot noen faktisk mengde.)_
|
||||
|
||||
## R22 — decision-(b) Enhet 1: ren dialekt-relabel (1 økt — ungated, ⊥ R7) ✅ 2026-07-06
|
||||
|
||||
**Mål:** lukk den trygge, verdi-bevarende kjernen av decision-(b)-residualen — ren label-oversettelse norsk→engelsk, ingen fabrikkering.
|
||||
|
||||
**Premiss-korreksjon (ground-truth 2026-07-06, `gt-audit`/`gt-labels` over alle 389, header-blokk = linjer før første `---`/`## `):** decision-(b)-tallene i R21-residualen var stale/ufullstendige på fire punkter:
|
||||
1. **Tredje dato-dialekt oppdaget:** norsk dato bæres av `**Sist oppdatert:**` (31) **OG `**Dato:**` (16)** — R21 så bare `Sist oppdatert`. `**Dato:**` opptrer dessuten i **body-mal-blokker** (`**Dato:** [YYYY-MM-DD]`) → blind erstatning ville korruptert template-filer ⇒ Dato UTSATT til Enhet 2 (header-scoped ISO-dato-guard).
|
||||
2. **«4 dual-header med duplikat `**Category:**`» → 0 bold-duplikater** korpus-vidt. De 4 `ai-act-*` bærer en *plain-text* `Category:`/`Status:`/`Last updated:`-blokk (ikke bold) — R21-reverten forhindret bold-duplikatet som fryktet. Håndteres i Enhet 3 (dedup).
|
||||
3. **«5 datoløse» → 1** (kun `decision-trees.md` mangler dato helt i header) → Enhet 4.
|
||||
4. **«Category-missing 0» / «8 mangler» er begge vindus-artefakter:** de 8 flagges av 500-byte-vinduet (≥1, `agentic-rag-patterns`, HAR Category forbi byte 500). Ekte gap verifiseres i Enhet 4.
|
||||
|
||||
**Utført (Enhet 1):** `**Sist oppdatert:**`→`**Last updated:**` (31) + `**Kategori:**`→`**Category:**` (42) = **73 relabels** på **51** filer (22 bærer begge). Ny testet ren primitiv `relabelHeaderDialect()` (header-blokk-scoped, kollisjons-guard mot eksisterende engelsk target, multi-forekomst-guard) + manifest-drevet driver `scripts/kb-update/relabel-dialect.mjs` (frosset 51-fil-manifest, hard per-fil-invariant «nøyaktig `applied.length` linjer endret, hver kun label-token, resten byte-identisk», idempotent skip, `isMain`-guard, aborterer FØR skriving). `**Dato:**` bevisst UTE av `LABEL_MAP`.
|
||||
|
||||
**Verifisering:** `test-relabel-dialect` 11/11; git diff **+73/−73** på 51 filer (0 linjer endret utover label-token, verifisert via `grep` på begge dialekt-retninger); revers-substitusjon rekonstruerer original byte-eksakt; idempotent re-run = 0 relabels; ground truth `Kategori 42→0`, `Sist oppdatert 31→0`, `Missing English Last updated 52→21`; suite **782/782** exit 0.
|
||||
|
||||
**Gjenstående decision-(b)-enheter (egne økter, ⊥ R7):**
|
||||
- **Enhet 2:** `**Dato:**`→`**Last updated:**` (16) med header-scoping + ISO-dato-guard som ekskluderer template-blokker (fellen).
|
||||
- **Enhet 3:** Status-backfill 27 none-filer (`statusForFile`, R21-mønster) + 4 `ai-act-*` plain-blokk-dedup (bold-ify + fjern redundant plain-linjer).
|
||||
- **Enhet 4:** 1 datoløs (`decision-trees.md`, git-«innholds-commit»-heuristikk, ALDRI «i dag») + verifiser de 8 «category-none» = ekte gap vs. vindus-artefakt.
|
||||
|
||||
## Parkert (krever eget operatør-go)
|
||||
|
||||
|
|
|
|||
194
scripts/kb-update/relabel-dialect.mjs
Normal file
194
scripts/kb-update/relabel-dialect.mjs
Normal file
|
|
@ -0,0 +1,194 @@
|
|||
#!/usr/bin/env node
|
||||
// Enhet 1 (decision-b dialect pass, path A, ⊥ R7) — pure value-preserving relabel of the two
|
||||
// Norwegian header labels to their English equivalents:
|
||||
// **Sist oppdatert:** → **Last updated:** (31 files)
|
||||
// **Kategori:** → **Category:** (42 files) [22 files carry both → 73 relabels]
|
||||
//
|
||||
// This is a LABEL rename only: the value (date, category text, "(v1.0)" suffix) is byte-preserved,
|
||||
// so no fact is ever fabricated — this is the safe core of the corrected decision-b residual.
|
||||
//
|
||||
// Scope is the header block (lines above the first `---` thematic break OR first `## ` heading),
|
||||
// so a `**Kategori:**`/`**Sist oppdatert:**` inside a BODY template block is never touched. The
|
||||
// **Dato:** dialect (16 files) is DELIBERATELY excluded: it also appears in body templates
|
||||
// (`**Dato:** [YYYY-MM-DD]`) and needs a header-scoped ISO-date guard — deferred to Unit 2.
|
||||
// Status backfill (27+4) and the ai-act dual-block dedup are Unit 3; decision-trees date is Unit 4.
|
||||
//
|
||||
// Safety: a frozen MANIFEST (ground-truth-verified 2026-07-06) + a hard per-file invariant asserted
|
||||
// BEFORE any write (exactly `applied.length` lines changed, each equals the old line with only the
|
||||
// label token swapped, everything else byte-identical). Idempotent: a file with no norsk header
|
||||
// label is skipped, so a re-run is a no-op. Aborts and writes nothing on any drift or invariant breach.
|
||||
//
|
||||
// Usage: node scripts/kb-update/relabel-dialect.mjs [--dry]
|
||||
import { readFileSync, writeFileSync, existsSync, realpathSync } from 'node:fs';
|
||||
import { join, dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const PLUGIN_ROOT = join(__dirname, '..', '..');
|
||||
|
||||
// The two norsk→english label pairs. **Dato:** is intentionally absent (body-template trap).
|
||||
export const LABEL_MAP = [
|
||||
['**Sist oppdatert:**', '**Last updated:**'],
|
||||
['**Kategori:**', '**Category:**'],
|
||||
];
|
||||
|
||||
// The header block ends at the first thematic break (`---`) or the first `## ` section heading.
|
||||
// Everything below is body (templates, prose) and is out of relabel scope.
|
||||
function headerEnd(lines) {
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
if (/^---\s*$/.test(lines[i]) || /^##\s/.test(lines[i])) return i;
|
||||
}
|
||||
return lines.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Relabel the norsk header labels to English, in the header block only. Pure.
|
||||
* Guards: a norsk label appearing >1× in the header block, or an English target label already
|
||||
* present in the header block (would duplicate), abort. A norsk label only in the body is ignored.
|
||||
* @param {string} content
|
||||
* @param {[string,string][]} [labelMap]
|
||||
* @returns {{content: string, applied: {from:string,to:string,line:number}[]}}
|
||||
*/
|
||||
export function relabelHeaderDialect(content, labelMap = LABEL_MAP) {
|
||||
const lines = String(content ?? '').split('\n');
|
||||
const end = headerEnd(lines);
|
||||
const header = lines.slice(0, end);
|
||||
const applied = [];
|
||||
for (const [from, to] of labelMap) {
|
||||
let occ = 0;
|
||||
let idx = -1;
|
||||
for (let i = 0; i < header.length; i++) {
|
||||
const c = header[i].split(from).length - 1;
|
||||
if (c > 0) { occ += c; idx = i; }
|
||||
}
|
||||
if (occ === 0) continue; // norsk label absent from header → nothing to do
|
||||
if (occ > 1) throw new Error(`ABORT: '${from}' appears ${occ}× in header block`);
|
||||
if (header.some((l) => l.includes(to))) throw new Error(`ABORT: target '${to}' already present in header (would duplicate)`);
|
||||
header[idx] = header[idx].replace(from, to);
|
||||
applied.push({ from, to, line: idx });
|
||||
}
|
||||
return { content: [...header, ...lines.slice(end)].join('\n'), applied };
|
||||
}
|
||||
|
||||
// Frozen manifest — the 51 scope-confirmed targets (files carrying **Sist oppdatert:** and/or
|
||||
// **Kategori:** in their header block), verified against ground truth 2026-07-06. The per-file
|
||||
// invariant below re-proves each write; the manifest only bounds WHICH files may be touched.
|
||||
export const MANIFEST = [
|
||||
'skills/ms-ai-advisor/references/architecture/ai-utredning-template.md',
|
||||
'skills/ms-ai-advisor/references/architecture/alternativanalyse-methodology.md',
|
||||
'skills/ms-ai-advisor/references/architecture/capacity-feasibility-benchmarks.md',
|
||||
'skills/ms-ai-advisor/references/architecture/diagram-prompt-templates.md',
|
||||
'skills/ms-ai-advisor/references/architecture/regional-availability-verification.md',
|
||||
'skills/ms-ai-advisor/references/architecture/source-traceability-assumption-register.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/cost-optimization-mlops-pipelines.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/feedback-loops-continuous-improvement.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/genaiops-llm-specific-practices.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/governance-audit-ml-operations.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/inferencing-optimization-caching.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/infrastructure-as-code-mlops.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/llm-evaluation-production.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/mlops-security-access-control.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/mlops-teams-collaboration-tools.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/monitoring-observability-ml-systems.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/prompt-flow-production-deployment.md',
|
||||
'skills/ms-ai-engineering/references/mlops-genaiops/responsible-ai-mlops-integration.md',
|
||||
'skills/ms-ai-governance/references/monitoring-observability/anomaly-detection-ai-systems.md',
|
||||
'skills/ms-ai-governance/references/monitoring-observability/application-insights-llm-monitoring.md',
|
||||
'skills/ms-ai-governance/references/monitoring-observability/azure-monitor-setup-ai-workloads.md',
|
||||
'skills/ms-ai-governance/references/monitoring-observability/custom-dashboards-ai-operations.md',
|
||||
'skills/ms-ai-governance/references/monitoring-observability/distributed-tracing-ai-pipelines.md',
|
||||
'skills/ms-ai-governance/references/monitoring-observability/log-analytics-kql-ai-queries.md',
|
||||
'skills/ms-ai-governance/references/monitoring-observability/token-usage-tracking-attribution.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/gevinstrealisering-dfo-methodology.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/norwegian-nlp-benchmarks.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/ros-ai-threat-library.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/ros-dpia-security-integration.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/ros-maestro-multiagent.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/ros-methodology-ns5814-iso31000.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/ros-report-templates.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/ros-scoring-rubrics-7x5.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/ros-sector-checklists.md',
|
||||
'skills/ms-ai-governance/references/norwegian-public-sector-governance/samfunnsokonomisk-analyse-nnv.md',
|
||||
'skills/ms-ai-governance/references/responsible-ai/ai-act-annex-iii-checklist.md',
|
||||
'skills/ms-ai-governance/references/responsible-ai/ai-center-of-excellence-setup.md',
|
||||
'skills/ms-ai-governance/references/responsible-ai/ai-governance-structure-framework.md',
|
||||
'skills/ms-ai-governance/references/responsible-ai/red-teaming-ai-models.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/adversarial-input-robustness-testing.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/ai-prompt-shield-network.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/ai-red-team-operations-practical.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/data-leakage-prevention-ai.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/entra-agent-id-zero-trust.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/model-fingerprinting-watermarking.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/secure-model-deployment-hardening.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/security-copilot-integration.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/security-scoring-rubrics-6x5.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/supply-chain-security-ai-models.md',
|
||||
'skills/ms-ai-security/references/ai-security-engineering/zero-trust-ai-services.md',
|
||||
'skills/ms-ai-security/references/cost-optimization/deterministic-cost-calculation-model.md',
|
||||
];
|
||||
|
||||
function run({ dry }) {
|
||||
const planned = [];
|
||||
const missing = [];
|
||||
let dateRelabels = 0;
|
||||
let catRelabels = 0;
|
||||
|
||||
for (const rel of MANIFEST) {
|
||||
const abs = join(PLUGIN_ROOT, rel);
|
||||
if (!existsSync(abs)) { missing.push(rel); continue; }
|
||||
const old = readFileSync(abs, 'utf8');
|
||||
const { content: out, applied } = relabelHeaderDialect(old);
|
||||
if (applied.length === 0) continue; // idempotent — already relabeled (re-run)
|
||||
|
||||
// Hard invariant: exactly `applied.length` lines changed, each is the old line with ONLY
|
||||
// the label token swapped; line count unchanged; everything else byte-identical.
|
||||
const o = old.split('\n');
|
||||
const n = out.split('\n');
|
||||
if (n.length !== o.length) throw new Error(`ABORT ${rel}: line count changed (${o.length}→${n.length})`);
|
||||
let diffs = 0;
|
||||
for (let i = 0; i < o.length; i++) {
|
||||
if (o[i] === n[i]) continue;
|
||||
diffs++;
|
||||
const hit = applied.find((a) => a.line === i);
|
||||
if (!hit) throw new Error(`ABORT ${rel}: line ${i} changed but not in applied set`);
|
||||
if (n[i].replace(hit.to, hit.from) !== o[i]) throw new Error(`ABORT ${rel}: line ${i} changed beyond the label token`);
|
||||
}
|
||||
if (diffs !== applied.length) throw new Error(`ABORT ${rel}: ${diffs} lines changed ≠ ${applied.length} applied`);
|
||||
|
||||
for (const a of applied) {
|
||||
if (a.from === '**Sist oppdatert:**') dateRelabels++;
|
||||
else if (a.from === '**Kategori:**') catRelabels++;
|
||||
}
|
||||
planned.push({ rel, applied, out });
|
||||
}
|
||||
|
||||
if (missing.length) {
|
||||
console.error(`ABORT — ${missing.length} manifest target(s) not found (corpus drift):`);
|
||||
missing.forEach((m) => console.error(' ' + m));
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`Manifest: ${MANIFEST.length} | files to relabel: ${planned.length} | already-english (skipped): ${MANIFEST.length - planned.length}`);
|
||||
console.log(` ${dateRelabels} **Sist oppdatert:** → **Last updated:**`);
|
||||
console.log(` ${catRelabels} **Kategori:** → **Category:**`);
|
||||
console.log(` ${dateRelabels + catRelabels} total relabels`);
|
||||
|
||||
if (dry) {
|
||||
console.log('\n(dry run — no writes)');
|
||||
for (const p of planned) {
|
||||
console.log(` ~ ${p.rel} [${p.applied.map((a) => a.from.replace(/\*/g, '')).join(', ')}]`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
for (const p of planned) writeFileSync(join(PLUGIN_ROOT, p.rel), p.out);
|
||||
console.log(`\nWrote ${planned.length} files.`);
|
||||
}
|
||||
|
||||
const isMain = (() => {
|
||||
try {
|
||||
return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
})();
|
||||
if (isMain) run({ dry: process.argv.includes('--dry') });
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
# AI-arkitekturutredning — Mal for norsk offentlig sektor
|
||||
|
||||
**Sist oppdatert:** 2026-06-24 (v1.0)
|
||||
**Last updated:** 2026-06-24 (v1.0)
|
||||
**Målgruppe:** Løsningsarkitekter, prosjektledere og beslutningstagere i norsk offentlig sektor
|
||||
**Format:** Strukturert utredningsmal basert på utredningsinstruksen, Digdirs arkitekturprinsipper, rammeverk for digital samhandling og EU AI Act
|
||||
**Category:** Solution Architecture & Advisory
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Alternativanalyse-metodikk — Vektet multi-kriterie-analyse (MCA)
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Målgruppe:** Arkitekter som gjennomfører AI-arkitekturutredninger for norsk offentlig sektor
|
||||
**Regulatorisk forankring:** Utredningsinstruksen (2016), DFOs veileder til utredningsinstruksen
|
||||
**Category:** Solution Architecture & Advisory
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Kapasitet og gjennomførbarhetsvurdering — Benchmarks for AI-prosjekter
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Målgruppe:** Arkitekter og prosjektledere som vurderer gjennomførbarhet av AI-prosjekter i norsk offentlig sektor
|
||||
**Formål:** Gi konkrete benchmarks for kompetansevurdering, tidsplanvalidering, risikovurdering og MVP-avgrensning
|
||||
**Category:** Solution Architecture & Advisory
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Diagram Prompt Templates for Imagen 3
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Målgruppe:** diagram-generation-agent
|
||||
**Format:** Prompt-maler for `mcp__mcp-image__generate_image` (Imagen 3 / Nano Banana Pro)
|
||||
**Category:** Solution Architecture & Advisory
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Regional tilgjengelighetsverifisering — Azure AI-tjenester
|
||||
|
||||
**Sist oppdatert:** 2026-06-24 (v1.0)
|
||||
**Last updated:** 2026-06-24 (v1.0)
|
||||
**Målgruppe:** Arkitekter som verifiserer Azure-tjenestetilgjengelighet for norsk offentlig sektor
|
||||
**Datakilde:** Microsoft Learn (MCP-verifisert 2026-06-24), Azure Products by Region
|
||||
**Category:** Solution Architecture & Advisory
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Kildesporing og antakelsesregister
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Målgruppe:** Arkitekter som utarbeider AI-arkitekturvurderinger og utredninger
|
||||
**Formål:** Sikre sporbarhet, transparens og etterprøvbarhet i arkitekturvurderinger
|
||||
**Category:** Solution Architecture & Advisory
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Kostnadsoptimalisering i MLOps-pipelines
|
||||
|
||||
**Dato:** 2026-04
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Relevans:** Azure Machine Learning, MLOps-implementering, FinOps for AI
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/azure/machine-learning/concept-ml-pipelines
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Feedback Loops and Continuous Improvement
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Dato:** 2026-02-04
|
||||
**Last updated:** 2026-06-24
|
||||
**Confidence:** HIGH (basert på offisiell Microsoft-dokumentasjon)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
**Dato:** 2026-02-04
|
||||
**Last updated:** 2026-06-19
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Konfidensgrad:** Høy (basert på 18 MCP-kilder fra Microsoft Learn)
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/python/api/overview/azure/ai-evaluation-readme
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Governance and Audit Trails in MLOps
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Dato:** 2026-06-19
|
||||
**Confidence:** 95% (High — bygger på offisiell Microsoft-dokumentasjon og Azure-referansearkitekturer)
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Inferencing Optimization and Caching
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Dato:** 2026-06-19
|
||||
**Forfattet av:** Cosmo Skyberg, Senior Microsoft AI Solution Architect
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Infrastructure as Code for MLOps
|
||||
|
||||
**Dato:** 2026-06-19
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Forfatter:** Cosmo Skyberg, Senior Microsoft AI Solution Architect
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/azure/aks/concepts-machine-learning-ops
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# LLM Evaluation in Production Contexts
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Sist oppdatert:** 2026-06-19
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Last updated:** 2026-06-19
|
||||
**Confidence:** High (basert på offisiell Microsoft dokumentasjon, Microsoft Foundry SDK, og MLflow 3)
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/azure/foundry/concepts/observability
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Security and Access Control in MLOps
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Last updated:** 2026-06-19
|
||||
**Dato:** 2026-06-19
|
||||
**Confidence:** HIGH — Basert på offisiell Microsoft Learn dokumentasjon (8 MCP-oppslag, 16 kilder)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# MLOps Team Collaboration and Tools Integration
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Sist oppdatert:** 2026-06-19
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Last updated:** 2026-06-19
|
||||
**Kilde:** Microsoft Learn, Azure Architecture Center
|
||||
**Konfidensgradering:** ⭐⭐⭐⭐⭐ (Verifisert mot offisiell Microsoft-dokumentasjon)
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Monitoring and Observability for ML Systems
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Dato:** 2026-04
|
||||
**Kilder:** Microsoft Learn (azure-machine-learning, azure-monitor)
|
||||
**Konfidensgrad:** ⭐⭐⭐⭐⭐ (Verifisert mot offisiell Microsoft-dokumentasjon)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Prompt Flow and Production Deployment
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Dato:** 2026-02-04
|
||||
**Last updated:** 2026-06-19
|
||||
**Confidence:** 🟢 Høy (basert på offisiell Microsoft-dokumentasjon fra Microsoft Foundry og Azure Machine Learning)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Responsible AI Integration in MLOps
|
||||
|
||||
**Kategori:** MLOps & GenAIOps
|
||||
**Sist oppdatert:** 2026-06-19
|
||||
**Category:** MLOps & GenAIOps
|
||||
**Last updated:** 2026-06-19
|
||||
**Confidence:** 95% (basert på offisiell Microsoft-dokumentasjon og Azure Machine Learning-referanser)
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/azure/machine-learning/concept-responsible-ai-dashboard
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Anomaly Detection for AI Systems
|
||||
|
||||
**Dato:** 5. februar 2026
|
||||
**Kategori:** Monitoring & Observability
|
||||
**Category:** Monitoring & Observability
|
||||
**Målgruppe:** AI-arkitekter, DevOps-team, MLOps-ingeniører
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/azure/ai-services/anomaly-detector/overview
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Application Insights for LLM Monitoring
|
||||
|
||||
**Kategori:** Monitoring & Observability
|
||||
**Category:** Monitoring & Observability
|
||||
**Dato:** 2026-02-05
|
||||
**Status:** Komplett
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Azure Monitor Setup and Configuration for AI Workloads
|
||||
|
||||
**Kategori:** Monitoring & Observability
|
||||
**Sist oppdatert:** 2026-02-05
|
||||
**Category:** Monitoring & Observability
|
||||
**Last updated:** 2026-02-05
|
||||
**Gjelder for:** Azure OpenAI, Azure AI Services, Azure AI Search, Microsoft Foundry
|
||||
**Type:** reference
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Custom Dashboards for AI Operations
|
||||
|
||||
**Kategori:** Monitoring & Observability
|
||||
**Sist oppdatert:** 2026-06-19 | Verified: MCP 2026-06-19
|
||||
**Category:** Monitoring & Observability
|
||||
**Last updated:** 2026-06-19 | Verified: MCP 2026-06-19
|
||||
**Brukes av:** Cosmo Skyberg, Microsoft AI Solution Architect
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/azure/azure-monitor/visualize/workbooks-overview
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Distributed Tracing for AI Pipelines
|
||||
|
||||
**Kategori:** Monitoring & Observability
|
||||
**Category:** Monitoring & Observability
|
||||
**Dato:** 2026-06-19
|
||||
**Status:** ✅ Komplett
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Log Analytics KQL Queries for AI
|
||||
|
||||
**Kategori:** Monitoring & Observability
|
||||
**Category:** Monitoring & Observability
|
||||
**Dato:** 2026-05
|
||||
**Forfatter:** Cosmo Skyberg, AI Solution Architect
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Token Usage Tracking and Attribution
|
||||
|
||||
**Kategori:** Monitoring & Observability
|
||||
**Category:** Monitoring & Observability
|
||||
**Dato:** 2026-06-19
|
||||
**Versjon:** 1.0
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# DFØs 5-stegs modell for gevinstrealisering i AI-prosjekter
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Status:** Gjeldende
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Konfidens:** Høy (basert på DFØ veileder og Prosjektveiviseren)
|
||||
**Type:** methodology
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Norske NLP-benchmarks og språkkvalitetsvurdering
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Status:** Gjeldende
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# AI-trusselbibliotek for ROS-analyse
|
||||
|
||||
**Sist oppdatert:** 2026-06-18
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Last updated:** 2026-06-18
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Status:** Established Practice
|
||||
**Formål:** Strukturert trusselkatalog for ros-analysis-agent — gir deterministisk trusselidentifisering med standardverdier for sannsynlighet og konsekvens
|
||||
**Type:** methodology
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Integrasjonsguide: ROS, DPIA og sikkerhetsvurdering
|
||||
|
||||
**Sist oppdatert:** 2026-02
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Last updated:** 2026-02
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Status:** Established Practice
|
||||
**Formål:** Veiledning for koordinering mellom ROS-analyse, DPIA og sikkerhetsvurdering — unngå duplisering, sikre dekning, og produser et sammenhengende risikovurderingsgrunnlag
|
||||
**Type:** methodology
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# MAESTRO 7-lags sikkerhetsmodell for multiagent AI-systemer
|
||||
|
||||
**Sist oppdatert:** 2026-02
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Last updated:** 2026-02
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Status:** Established Practice
|
||||
**Formål:** Strukturert sikkerhetsmodell for multiagent-orkestrering — brukes av ros-analysis-agent for dybdevurdering av agent-baserte systemer
|
||||
**Type:** methodology
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# ROS-metodikk: NS 5814, ISO 31000 og AI-spesifikke rammeverk
|
||||
|
||||
**Sist oppdatert:** 2026-06-18
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Last updated:** 2026-06-18
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Status:** Established Practice
|
||||
**Formål:** Detaljert metodikkguide for ros-analysis-agent — kobler AI-ROS til etablerte standarder og sikrer revisjonssporbarhet
|
||||
**Type:** regulatory
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# ROS-rapportmaler for AI-systemer
|
||||
|
||||
**Sist oppdatert:** 2026-02
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Last updated:** 2026-02
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Status:** Established Practice
|
||||
**Formål:** Standardiserte rapportmaler for ros-analysis-agent — Quick ROS og Full ROS
|
||||
**Type:** template
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# ROS-scoringsrubrikker (7×5)
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Status:** Established Practice
|
||||
**Formål:** Deterministiske rubrikker for ros-analysis-agent — erstatter vage 1-5 beskrivelser med eksakte, verifiserbare sjekkpunkter
|
||||
**Type:** methodology
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Sektorspesifikke ROS-sjekklister for AI-systemer
|
||||
|
||||
**Sist oppdatert:** 2026-02
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Last updated:** 2026-02
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Status:** Established Practice
|
||||
**Formål:** Sektortilpassede sjekklister for ros-analysis-agent — gir sektor-spesifikk risikoidentifisering utover generell AI-risikovurdering
|
||||
**Type:** template
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# Samfunnsøkonomisk analyse med NNV-beregning for AI-prosjekter
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Status:** Gjeldende
|
||||
**Kategori:** Norwegian Public Sector AI Governance
|
||||
**Category:** Norwegian Public Sector AI Governance
|
||||
**Konfidens:** Høy (basert på DFØ veileder 2023 og Finansdepartementets R-109/21)
|
||||
**Type:** methodology
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# EU AI Act — Annex III Sjekkliste for høyrisiko-klassifisering
|
||||
|
||||
**Sist oppdatert:** 2026-02 (v1.0)
|
||||
**Last updated:** 2026-02 (v1.0)
|
||||
**Status:** GA
|
||||
**Category:** Responsible AI & Governance
|
||||
**Hjemmel:** Regulation (EU) 2024/1689, Annex III, Article 6(2)-(3)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# AI Center of Excellence - Building Organizational Capability
|
||||
|
||||
**Kategori:** Responsible AI & Governance
|
||||
**Opprettet:** 2026-04 | **Sist oppdatert:** 2026-06-19
|
||||
**Category:** Responsible AI & Governance
|
||||
**Opprettet:** 2026-04 | **Last updated:** 2026-06-19
|
||||
**Confidence:** HIGH (basert på Microsoft Cloud Adoption Framework og offisiell dokumentasjon)
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/ai/govern
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# AI Governance Structure - Building an Organizational Framework
|
||||
|
||||
**Dato:** 2026-02-03
|
||||
**Kategori:** Responsible AI & Governance
|
||||
**Category:** Responsible AI & Governance
|
||||
**Målgruppe:** Tekniske beslutningstakere, AI-arkitekter, governance-team
|
||||
**Oppdateringsfrekvens:** Kvartalsvis (Q1 2026)
|
||||
**Type:** methodology
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Red Teaming AI Models - Adversarial Testing & Security
|
||||
|
||||
**Dato:** 2026-06-19
|
||||
**Kategori:** Responsible AI & Governance
|
||||
**Category:** Responsible AI & Governance
|
||||
**Målgruppe:** Arkitekter, sikkerhetsteam, AI-utviklere
|
||||
**Konfidensgrad:** ⚠️ HIGH — Basert på offisiell Microsoft-dokumentasjon (jun 2026)
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Adversarial Input Robustness Testing and Fuzzing
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Category:** AI Security Engineering
|
||||
**Dato:** 2026-06-19
|
||||
**Status:** Aktiv
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# AI Prompt Shield — Nettverksnivå Prompt Injection-beskyttelse
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Sist oppdatert:** 2026-06-19
|
||||
**Category:** AI Security Engineering
|
||||
**Last updated:** 2026-06-19
|
||||
**Målgruppe:** Arkitekter som skal beskytte AI-systemer mot prompt injection og jailbreak-angrep
|
||||
**Status:** To separate produkter — Content Safety Prompt Shields (GA), AI Gateway Prompt Shield (Preview)
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Practical Red Team Operations for AI Systems
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Sist oppdatert:** 2026-02-05
|
||||
**Category:** AI Security Engineering
|
||||
**Last updated:** 2026-02-05
|
||||
**Relatert:** ai-prompt-injection-defense.md, ai-jailbreak-prevention.md
|
||||
**Source:** https://learn.microsoft.com/security/ai-red-team/training
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Data Leakage Prevention in AI Contexts
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Sist oppdatert:** 2026-06-19 | Verified: MCP 2026-06-19
|
||||
**Category:** AI Security Engineering
|
||||
**Last updated:** 2026-06-19 | Verified: MCP 2026-06-19
|
||||
**Målgruppe:** Enterprise AI architects og security teams
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/security/benchmark/azure/mcsb-v2-artificial-intelligence-security
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Microsoft Entra Agent ID — Zero Trust for AI-agentidentiteter
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Sist oppdatert:** 2026-06-19 | Verified: MCP 2026-06
|
||||
**Category:** AI Security Engineering
|
||||
**Last updated:** 2026-06-19 | Verified: MCP 2026-06
|
||||
**Status:** Public Preview, utvidet etter Ignite 2025 (50+ nye/oppdaterte artikler i Entra Agent ID-portføljen; opt-out er midlertidig — vil bli obligatorisk for nye agenter) *(Verified MCP 2026-06)*
|
||||
**Målgruppe:** Arkitekter som skal sikre AI-agenter med dedikerte identiteter og Zero Trust-prinsipper
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Model Fingerprinting and Watermarking for Attribution
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Category:** AI Security Engineering
|
||||
**Dato:** 2026-06-19
|
||||
**Status:** Active
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Secure Model Deployment and Runtime Hardening
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Category:** AI Security Engineering
|
||||
**Dato:** 2026-02-05
|
||||
**Målgruppe:** Arkitekter som skal sikre AI-modeller i produksjonsmiljøer
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Microsoft Security Copilot — AI-drevet sikkerhetsoperasjonsplattform
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Sist oppdatert:** 2026-06-19 | Verified: MCP 2026-06
|
||||
**Category:** AI Security Engineering
|
||||
**Last updated:** 2026-06-19 | Verified: MCP 2026-06
|
||||
**Målgruppe:** Sikkerhetsarkitekter og SOC-ledere som vurderer AI-assistert sikkerhetsoperasjon
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/copilot/security/agents-overview
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Sikkerhets-scoringsrubrikker (6×5)
|
||||
|
||||
**Sist oppdatert:** 2026-06-19 (v1.0)
|
||||
**Kategori:** AI Security Engineering
|
||||
**Last updated:** 2026-06-19 (v1.0)
|
||||
**Category:** AI Security Engineering
|
||||
**Status:** Established Practice
|
||||
**Formål:** Deterministiske rubrikker for security-assessment-agent — erstatter vage 1-5 beskrivelser med eksakte, verifiserbare sjekkpunkter
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Supply Chain Security for AI Models and Dependencies
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Category:** AI Security Engineering
|
||||
**Dato:** 2026-06-19
|
||||
**Relatert plattform:** Microsoft Foundry, Azure Machine Learning, Azure DevOps, Microsoft Defender for Cloud
|
||||
**Type:** reference
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Zero Trust Architecture Applied to AI Services
|
||||
|
||||
**Kategori:** AI Security Engineering
|
||||
**Sist oppdatert:** 2026-06-19
|
||||
**Category:** AI Security Engineering
|
||||
**Last updated:** 2026-06-19
|
||||
**Målgruppe:** Arkitekter som skal sikre AI-tjenester med Zero Trust-prinsipper
|
||||
**Type:** reference
|
||||
**Source:** https://learn.microsoft.com/security/zero-trust/apply-zero-trust-azure-services-overview
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Deterministisk kostnadsberegningsmodell for AI-arkitekturvurderinger
|
||||
|
||||
**Sist oppdatert:** 2026-06 (v1.2)
|
||||
**Last updated:** 2026-06 (v1.2)
|
||||
**Status:** GA
|
||||
**Category:** Cost Optimization & FinOps for AI
|
||||
**Rolle:** Kanonisk prissannhet — eneste autoritative enhetspris-register for pluginen
|
||||
|
|
|
|||
117
tests/kb-update/test-relabel-dialect.test.mjs
Normal file
117
tests/kb-update/test-relabel-dialect.test.mjs
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
// tests/kb-update/test-relabel-dialect.test.mjs
|
||||
// TDD for Enhet 1 (decision-b, path A, ⊥ R7) — pure value-preserving dialect relabel of the
|
||||
// Norwegian header labels to their English equivalents on the 51 ref files that carry them:
|
||||
// **Sist oppdatert:** → **Last updated:** (31 files)
|
||||
// **Kategori:** → **Category:** (42 files) [22 files carry both → 73 relabels]
|
||||
//
|
||||
// The applier (relabel-dialect.mjs) is a manifest-driven driver over the pure primitive
|
||||
// relabelHeaderDialect(). The ONLY new production logic is that primitive + the frozen MANIFEST.
|
||||
// This suite pins the primitive's safety contract and the manifest's structural well-formedness.
|
||||
//
|
||||
// Explicitly OUT of Enhet 1 (deferred to later units, per the corrected residual):
|
||||
// - **Dato:** → **Last updated:** (16) — Dato also appears in BODY templates ([YYYY-MM-DD]),
|
||||
// a blind replace would corrupt them; needs a header-scoped ISO-date guard (Unit 2).
|
||||
// - Status backfill (27 none + 4 plain) and the ai-act dual-block dedup (Unit 3).
|
||||
// - decision-trees.md date backfill (Unit 4).
|
||||
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {
|
||||
relabelHeaderDialect,
|
||||
LABEL_MAP,
|
||||
MANIFEST,
|
||||
} from '../../scripts/kb-update/relabel-dialect.mjs';
|
||||
|
||||
// ── primitive: value-preserving relabel ────────────────────────────────────
|
||||
|
||||
test('relabels **Sist oppdatert:** → **Last updated:**, value byte-identical', () => {
|
||||
const input = '# T\n\n**Sist oppdatert:** 2026-02 (v1.0)\n**Status:** GA\n\n---\n\n## Body\n';
|
||||
const { content, applied } = relabelHeaderDialect(input);
|
||||
assert.equal(applied.length, 1);
|
||||
assert.match(content, /\*\*Last updated:\*\* 2026-02 \(v1\.0\)/);
|
||||
assert.doesNotMatch(content, /\*\*Sist oppdatert:\*\*/);
|
||||
// Only the label token changed — reversing the sub reconstructs the original exactly.
|
||||
assert.equal(content.replace('**Last updated:**', '**Sist oppdatert:**'), input);
|
||||
});
|
||||
|
||||
test('relabels **Kategori:** → **Category:**, value byte-identical', () => {
|
||||
const input = '# T\n\n**Kategori:** AI Security Engineering\n**Type:** reference\n\n## Body\n';
|
||||
const { content, applied } = relabelHeaderDialect(input);
|
||||
assert.equal(applied.length, 1);
|
||||
assert.match(content, /\*\*Category:\*\* AI Security Engineering/);
|
||||
assert.doesNotMatch(content, /\*\*Kategori:\*\*/);
|
||||
assert.equal(content.replace('**Category:**', '**Kategori:**'), input);
|
||||
});
|
||||
|
||||
test('applies BOTH relabels when both norsk labels are present', () => {
|
||||
const input = '# T\n\n**Sist oppdatert:** 2026-06-19\n**Kategori:** X\n**Status:** GA\n\n---\n\n## Body\n';
|
||||
const { content, applied } = relabelHeaderDialect(input);
|
||||
assert.equal(applied.length, 2);
|
||||
assert.match(content, /\*\*Last updated:\*\* 2026-06-19/);
|
||||
assert.match(content, /\*\*Category:\*\* X/);
|
||||
});
|
||||
|
||||
test('header-scoping: a norsk label in the BODY (past first --- / ##) is NOT touched', () => {
|
||||
// The template-contamination trap: only the header block above the first thematic break
|
||||
// or section heading is in scope.
|
||||
const input =
|
||||
'# T\n\n**Kategori:** Real Header Value\n\n---\n\n## Mal\n**Kategori:** [fyll inn]\n';
|
||||
const { content, applied } = relabelHeaderDialect(input);
|
||||
assert.equal(applied.length, 1);
|
||||
assert.match(content, /\*\*Category:\*\* Real Header Value/);
|
||||
// The body template line survives verbatim.
|
||||
assert.match(content, /## Mal\n\*\*Kategori:\*\* \[fyll inn\]/);
|
||||
});
|
||||
|
||||
test('no-op when no norsk label is present (English-dialect file)', () => {
|
||||
const input = '# T\n\n**Last updated:** 2026-06\n**Category:** X\n**Status:** GA\n\n## Body\n';
|
||||
const { content, applied } = relabelHeaderDialect(input);
|
||||
assert.equal(applied.length, 0);
|
||||
assert.equal(content, input); // byte-identical
|
||||
});
|
||||
|
||||
test('idempotent: re-running on the output is a no-op', () => {
|
||||
const input = '# T\n\n**Sist oppdatert:** 2026-02\n**Kategori:** X\n\n## Body\n';
|
||||
const once = relabelHeaderDialect(input);
|
||||
const twice = relabelHeaderDialect(once.content);
|
||||
assert.equal(twice.applied.length, 0);
|
||||
assert.equal(twice.content, once.content);
|
||||
});
|
||||
|
||||
test('collision-guard: throws if the English target label already exists in the header', () => {
|
||||
// A dual-header file (bold **Category:** + norsk **Kategori:**) would duplicate on relabel.
|
||||
const input = '# T\n\n**Category:** X\n**Kategori:** X\n\n## Body\n';
|
||||
assert.throws(() => relabelHeaderDialect(input), /already present/i);
|
||||
});
|
||||
|
||||
test('multi-occurrence-guard: throws if a norsk label appears twice in the header block', () => {
|
||||
const input = '# T\n\n**Kategori:** X\n**Kategori:** Y\n\n## Body\n';
|
||||
assert.throws(() => relabelHeaderDialect(input), /appears/i);
|
||||
});
|
||||
|
||||
test('LABEL_MAP is exactly the two norsk→english pairs of Enhet 1 (no Dato)', () => {
|
||||
const froms = LABEL_MAP.map((p) => p[0]);
|
||||
assert.deepEqual(froms.sort(), ['**Kategori:**', '**Sist oppdatert:**']);
|
||||
// **Dato:** is intentionally excluded (body-template trap → deferred to Unit 2).
|
||||
assert.ok(!froms.some((f) => /Dato/.test(f)));
|
||||
});
|
||||
|
||||
// ── MANIFEST: structural well-formedness ───────────────────────────────────
|
||||
|
||||
test('MANIFEST: exactly 51 distinct, well-formed reference paths', () => {
|
||||
assert.equal(MANIFEST.length, 51);
|
||||
const set = new Set(MANIFEST);
|
||||
assert.equal(set.size, 51, 'duplicate path in MANIFEST');
|
||||
for (const p of MANIFEST) {
|
||||
assert.match(p, /^skills\/ms-ai-[a-z]+\/references\/.+\.md$/, p);
|
||||
}
|
||||
});
|
||||
|
||||
test('MANIFEST: excludes advisor files already English-normalised by R21', () => {
|
||||
// adr-template / poc-template etc. got their Status via R21 but were already English-dialect
|
||||
// for Category/Last-updated → they must NOT be in this relabel manifest.
|
||||
for (const p of MANIFEST) {
|
||||
assert.ok(!p.endsWith('adr-template.md'));
|
||||
assert.ok(!p.endsWith('poc-template.md'));
|
||||
}
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue