Files
documentation/scripts/skills-measurement.test.mjs
T
jarvis-at-skic abe00994a1
Build and publish Eldorado documentation / build (pull_request) Successful in 46s
docs: [verified] separate Measurement registry and workflow Baseline
2026-10-07 13:33:07 +00:00

46 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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('<details>'));
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}%`));
});