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 a visible optional registry, separate from workflow application', () => { const page = read('docs/strategy/measurement/index.mdx'); assert.match(page, /title: Skills Measurement\nsidebar_label: 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('Registry inclusion does not require a metric to be used, collected or baselined')); assert(page.includes('../baseline.mdx')); assert(!page.includes('
')); assert(page.includes('./collection-and-safeguards.mdx')); assert(!page.includes('Is AI-assisted work worth continuing?')); for (const word of ['candidate', 'not installed', 'applicability', 'calculation', 'inputs', 'limitations', 'implementation status']) assert(page.includes(word), word); }); test('all sixteen metric definitions remain in the reference with explicit implementation limits', () => { const manifest = JSON.parse(read('research/ai-adoption/measurement-migration.json')); const page = read('docs/strategy/measurement/index.mdx') + read('docs/strategy/measurement/collection-and-safeguards.mdx'); const model = JSON.parse(read('research/ai-adoption/strategy-model.json')); for (const k of model.kpis) { const section = read(`docs/strategy/${manifest.metrics.find(m => m.title === k.name).docId}.mdx`); 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/skills-adoption.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}%`)); });