import test from 'node:test'; import assert from 'node:assert/strict'; import {readFileSync} from 'node:fs'; import {calculate} from './ai-kpi.mjs'; const read = path => readFileSync(path, 'utf8'); test('Skills Measurement is an open adoption collection plan, not a hidden catalogue', () => { const page = read('docs/strategy/measurement.mdx'); assert.match(page, /title: Skills Measurement\nsidebar_label: Skills Measurement/); for (const heading of ['Establish the baseline', 'Measure the pilot', 'Extend collection as adoption grows', 'Keep the collection running']) assert(page.includes(heading), heading); assert(!page.includes('
')); assert(page.includes('./reference/measurement-contracts.mdx')); assert(!page.includes('Is AI-assisted work worth continuing?')); for (const word of ['Recommended', 'not installed', 'unknown', 'review', 'CI', 'revision', 'Monthly', 'Weekly']) assert(page.includes(word), word); }); test('all sixteen metric definitions remain in the reference with explicit implementation limits', () => { const page = read('docs/strategy/reference/measurement-contracts.mdx'); const model = JSON.parse(read('research/ai-adoption/strategy-model.json')); for (const k of model.kpis) { const section = page.split(`### ${k.name}\n`)[1]?.split('\n### ')[0]; assert(section, k.name); for (const field of ['Numerator','Denominator','Expression','Aggregation','Unit','Eligible population','Exclusions','Events and source','Owner / cadence','Missing evidence','Gaming and limits']) assert(section.includes(`| ${field} |`)); } for (const text of ['9 prototype calculations', '7 unimplemented metrics', 'no network collectors', '30 days', '12 months', 'below five people', 'Missing telemetry is unknown']) assert(page.includes(text), text); }); test('published pilot arithmetic matches the executable fixture, including partial cost', () => { const page = read('docs/strategy/measurement.mdx'); const fixture = JSON.parse(read('scripts/fixtures/ai-kpi-synthetic.json')); const report = calculate(fixture); const success = report.kpis['validated-task-success']; assert(page.includes(`${success.numerator} / ${success.denominator} × 100 = ${success.value_or_null}%`)); assert(page.includes(`${success.known_outcome_coverage}%`)); const cost = report.kpis['cost-per-accepted-outcome']; assert.equal(cost.partial_estimate, true); assert(page.includes(`EUR ${cost.numerator} / ${cost.denominator} = EUR ${cost.value_or_null}`)); assert(page.includes('partial estimate')); const experience = report.kpis['human-experience']; assert(page.includes(`${experience.numerator} / ${experience.denominator} = ${experience.value_or_null}`)); assert(page.includes(`${experience.denominator} / ${fixture.survey.invited} × 100 = ${experience.coverage.response_percent}%`)); });