import {readFile,writeFile} from 'node:fs/promises'; import {resolve} from 'node:path'; import {createHash} from 'node:crypto'; import {compareClaim} from '../src/record-model.js'; const dir=resolve(process.argv[2]); const read=async p=>(await readFile(resolve(dir,p),'utf8')).replace(/^\uFEFF/,''); const claim=JSON.parse(await read('claim.json')),evidence=JSON.parse(await read('execution.json')); const hashes={};for(const p of ['jc-001.ps1','jc-001-failure.mjs','jc-001-evaluate.mjs','../src/record-model.js'])hashes[p]=createHash('sha256').update(await readFile(new URL(p,import.meta.url))).digest('hex'); const actual=compareClaim(claim,evidence); const report={test:'JC-001',version:2,time:new Date().toISOString(),environment:{node:process.version,platform:process.platform,arch:process.arch},procedure:'Run scripts/jc-001.ps1 from PowerShell. The parent records a real child exit, stdout and stderr before the comparison runs.',hashes,claim,evidence,actual,expected:'Claim conflicts with recorded evidence.',pass:actual==='Claim conflicts with recorded evidence.'&&evidence.exitCode===23,limits:['False agent fixture, not a live AI response.','Parent and child share a host; a compromised observer is not excluded.','Scoped completion comparison; not universal proof.']}; await writeFile(resolve(dir,'report.json'),JSON.stringify(report,null,2),{flag:'wx'});console.log(JSON.stringify(report,null,2));if(!report.pass)process.exitCode=1;