import {test} from 'node:test'; import assert from 'node:assert/strict'; import {readFileSync} from 'node:fs'; const read = p => readFileSync(p, 'utf8'); const model = JSON.parse(read('research/ai-adoption/strategy-model.json')); test('every strategy page leads with a compact diagram story and closes its references', () => { for (const {id} of model.pages) { const page = read(`docs/strategy/${id === 'measurement' ? 'measurement/index' : id}.mdx`); const narrative = page.split('
')[1].replace(/
[\s\S]*?<\/details>/g, ''); assert.equal((narrative.match(/'), id); assert(!page.includes('
') || page.indexOf(' story />') < page.indexOf('
'), id); assert(!//g) || []).length, (page.match(/<\/details>/g) || []).length, id); assert((narrative.match(/^## /gm) || []).length <= 4, id); assert((narrative.match(/^- /gm) || []).length <= 7, id); assert(/\*\*(Next|Continue the loop):\*\*/.test(narrative), id); assert(!narrative.includes('| ---'), id); const words = narrative.replace(/<[^>]*>/g, '').trim().split(/\s+/).length; const budget = id === 'measurement' ? 1900 : id === 'roadmap' ? 1150 : id === 'target-operating-model' ? 850 : 750; assert(words <= budget, `${id}: ${words} default narrative words`); } }); test('mobile story diagrams preserve the same nodes and directed relationships', () => { for (const {id} of model.pages) { const page = read(`docs/strategy/${id === 'measurement' ? 'measurement/index' : id}.mdx`); const name = /]+ story/.exec(page)[1]; if (name === 'strategy-roadmap') { const desktop = JSON.parse(read(`diagrams/${name}.workflow.json`)); const mobile = JSON.parse(read(`diagrams/${name}-mobile.workflow.json`)); const semantic = d => ({nodes:d.nodes.map(({col,yOffset,...n}) => n), edges:d.edges.map(({fromSide,toSide,...e}) => e)}); assert.deepEqual(semantic(desktop), semantic(mobile)); continue; } const desktop = JSON.parse(read(`diagrams/${name}.architecture.json`)); const mobile = JSON.parse(read(`diagrams/${name}-mobile.architecture.json`)); assert(desktop.components.length >= 5, name); const semantic = d => ({nodes:d.components.map(({pos,size,...n})=>n),edges:d.connections.map(({fromSide,toSide,route,via,labelAt,label,...e})=>e)}); assert.deepEqual(semantic(desktop), semantic(mobile), name); assert(desktop.connections.every(e => (e.label || e.id.startsWith('govern-') || /^strategy-(governance|quality|adoption|measurement|maintenance)$/.test(name)) && e.from !== e.to), name); assert.equal(desktop.meta.legend.mode, 'hidden'); } }); test('all sixteen exact KPI formulas remain reachable in the linked reference', () => { const manifest = JSON.parse(read('research/ai-adoption/measurement-migration.json')); assert.equal(manifest.metrics.length, 16); for (const metric of model.kpis) { const entry = manifest.metrics.find(m => m.title === metric.name); assert(read('docs/strategy/measurement/index.mdx').includes(`./${entry.oldAnchor}.mdx`)); const section = read(`docs/strategy/${entry.docId}.mdx`); assert(section, metric.name); for (const label of ['Numerator','Denominator','Expression','Aggregation','Unit','Eligible population','Exclusions','Events and source','Owner / cadence','Missing evidence','Gaming and limits']) assert(section.includes(`| ${label} |`), `${metric.name}: ${label}`); } });