import test from 'node:test'; import assert from 'node:assert/strict'; import {readFileSync} from 'node:fs'; import {execFileSync} from 'node:child_process'; import {slides} from '../presentations/less-prompting-more-shipping/slides.mjs'; const read=p=>readFileSync(p,'utf8'); test('deck preserves assignment coverage, 35+15 timing and traceable notes',()=>{ assert.equal(slides.length,19); assert.equal(new Set(slides.map(s=>s.id)).size,19); assert.equal(slides.slice(0,17).reduce((n,s)=>n+s.minutes,0),35); assert.equal(slides[17].minutes,15); assert.equal(slides[18].minutes,0); for(const s of slides){assert(s.sources.length);assert(s.notes.length>250);assert(s.body.length);} for(const id of ['months-one-two','months-three-four','months-five-six','measures','month-six','beyond']) assert(slides.some(s=>s.id===id)); for(const id of ['experiment','inconclusive','stop']) assert.match(slides.find(s=>s.id===id).body,/fictional/i); assert.match(slides.find(s=>s.id==='qualification').notes,/separately authorizes/); }); test('build emits local pinned Reveal assets, stable IDs and no production CDN',()=>{ execFileSync(process.execPath,['scripts/build-presentations.mjs']); const dir='static/presentations/less-prompting-more-shipping'; const html=read(`${dir}/index.html`); assert.equal((html.match(/