Build and publish Eldorado documentation / build (pull_request) Successful in 40s
43 lines
2.8 KiB
JavaScript
43 lines
2.8 KiB
JavaScript
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: 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('<details>'));
|
||
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}%`));
|
||
});
|