ms-ai-architect/tests/kb-update/test-priority-unverified.test.mjs
Kjell Tore Guttormsen 94a5d1bb14 feat(ms-ai-architect): Sesjon 5 carry-forward B — datoløse filer → unverified-tier
Rotårsak: en datoløs ref-fil fikk effectiveDate=0000-01-01 (alltid «stale») OG en path-basert prioritet (kunne bli critical) → flommet critical-bøtta og druknet genuint kritiske filer. Fix: ny unverified-tier deklarert i domain-taxonomy.json (lag 0, eneste sannhetskilde for prioritet).

makePriorityFn(tax) tar nå valgfri hasDate (default true → bakoverkompatibelt for eksisterende én-args-kallere); report-changes sender Boolean(fileDate). unverified rangerer sist i sorteringen — manglende dato er metadata-hygiene, ikke currency-hast. Ekte registry: 1 fil skilt ut som Unverified.

TDD: 4 tester FØR kode (test-priority-unverified.test.mjs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-19 22:31:25 +02:00

43 lines
2.2 KiB
JavaScript

// tests/kb-update/test-priority-unverified.test.mjs
// TDD for carry-forward B (Sesjon 5): a reference file WITHOUT a "Last updated:"
// header must land in the 'unverified' priority bucket — not masquerade as
// critical-priority noise (the bug: dateless files got effectiveDate 0000-01-01
// AND a path-based priority, so they flooded the critical tier and drowned the
// genuinely-stale critical files).
//
// The decision lives in lag 0 (taxonomy.mjs makePriorityFn, the single source of
// truth for priority); report-changes only supplies whether the file carried a
// date header. The 'unverified' tier is declared in domain-taxonomy.json.
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { loadTaxonomy, makePriorityFn } from '../../scripts/kb-update/lib/taxonomy.mjs';
const tax = loadTaxonomy();
test('dateless file → unverified, NOT its path-based critical priority', () => {
const prio = makePriorityFn(tax);
const path = 'skills/ms-ai-security/references/cost-optimization/budget.md';
// Same path: dated → critical (path rule), dateless → unverified.
assert.equal(prio(path, true), 'critical');
assert.equal(prio(path, false), 'unverified');
// The regression this fixes: dateless must never reach critical.
assert.notEqual(prio(path, false), 'critical');
});
test('backward-compat: single-arg call behaves as before (hasDate defaults true)', () => {
const prio = makePriorityFn(tax);
assert.equal(prio('skills/ms-ai-security/references/cost-optimization/budget.md'), 'critical');
assert.equal(prio('skills/ms-ai-engineering/references/data-engineering/cosmos.md'), 'low');
});
test('dateless overrides every path tier (high/medium/low → unverified)', () => {
const prio = makePriorityFn(tax);
assert.equal(prio('skills/ms-ai-governance/references/responsible-ai/fairness.md', false), 'unverified');
assert.equal(prio('skills/ms-ai-advisor/references/platforms/copilot-studio.md', false), 'unverified');
assert.equal(prio('skills/ms-ai-engineering/references/data-engineering/cosmos.md', false), 'unverified');
});
test('taxonomy declares the dateless tier in lag 0 (source of truth)', () => {
assert.equal(tax.priority.dateless, 'unverified');
});