import assert from 'node:assert/strict'; import path from 'node:path'; import {artifact, prepareData, projectDir, read, validateInputs} from './data.mjs'; const project = read(path.join(projectDir, 'project.json')); const cuts = artifact('07-cuts').payload.cuts; const images = artifact('11-images').payload.result.frames; const scenes = artifact('08-scenes').payload; validateInputs(project, cuts, images, scenes); const data = prepareData(); assert.equal(data.clips.reduce((n, c) => n + c.frames, 0), 5528); for (const c of data.clips.filter((c) => c.boxes)) for (const box of c.boxes) { assert(box[1] >= 660 && box[2] < 430, `${c.id}: guide pixels confused with droplet body`); } for (const mutate of [ (p, c, i) => {p.reviews.find((r) => r.review_id === 'scenes').decision = 'pending';}, (p, c, i) => {i.pop();}, (p, c, i) => {i[0].media.verified = false;}, (p, c, i) => {c[1].start_ms += 20;}, (p, c, i) => {i.find((f) => f.frame_id === 'c02-start').media.path = 'wrong.png';}, ]) { const [p, c, i] = structuredClone([project, cuts, images]); mutate(p, c, i); assert.throws(() => validateInputs(p, c, i, scenes)); } console.log('Actual inputs and failure checks passed: missing approval/frame, unverified media, timing gap and discontinuity.');