import assert from 'node:assert/strict'; import {mkdtempSync,readFileSync,writeFileSync} from 'node:fs'; import {join,resolve,relative} from 'node:path'; import {inspectThreadWaitHost} from './thread-wait-host-report.mjs'; import {hashAt} from './boot-contract-report.mjs'; const root=process.cwd();assert.equal(process.argv.length,3);const path=resolve(process.argv[2]),report=JSON.parse(readFileSync(path));const baseline=inspectThreadWaitHost(report,root);const specs=[['false-guest',r=>r.guestAccepted=true],['false-status',r=>r.status='COMPLETE'],['false-count',r=>r.hostTests=30],['false-ARM-object-claim',r=>r.arm64Status='OBJECT_COMPILED'],['missing-format-gate',r=>r.commands.splice(3,1)],['false-format-follow-frozen-children',r=>r.commands[3].argv[1]='skip_children=false'],['missing-clippy-gate',r=>r.commands.pop()],['missing-pending',r=>r.pendingGuests=[]],['false-context-scope',r=>r.boundary=r.boundary.replace('Host-only','Actual-guest')],['missing-cpu-mutant',r=>r.mutants.shift()],['compiler-failure',r=>r.mutants[0].exitCode=1],['false-target',r=>r.hostTarget='aarch64-unknown-none'],['unbound-source',r=>r.sources[0].path='os-thread-wait/Cargo.toml'],['source-input',r=>r.inputsAfter[0].sha256='0'.repeat(64)],['wrong-test-command',r=>r.commands[0].argv[0]='check'],['missing-private-run',r=>r.commands.splice(1,1)],['unbound-mutant-manifest',r=>r.mutants[0].sources[0].path=r.sources[0].path],['missing-mutant-library',r=>r.mutants[0].sources.pop()],['forged-mutant-case',r=>r.mutants[0].test='unrelated_test'],['unexecuted-mutant-test',r=>r.mutants[0].argv[r.mutants[0].argv.length-4]='no_such_test'],['missing-actual-AsyncBank-source',r=>{const i=r.sources.findIndex(s=>s.originalPath==='scripts/os-acceptance/k1040-context-handoff.rs');assert.ok(i>=0);r.sources.splice(i,1);}],['omitted-unmodified-dependency',r=>r.sources.splice(r.sources.findIndex(s=>s.originalPath==='os-threads/Cargo.toml'),1)]];const controls=[];for(const[id,change]of specs){const r=structuredClone(report);change(r);let reason;try{inspectThreadWaitHost(r,root);}catch(error){reason=error.message;}assert.ok(reason,id);controls.push({id,rejected:true,reason});}const directory=mkdtempSync(join(root,report.runDirectory,'damaged-host-controls-')),artifact={path:relative(root,path),sha256:hashAt(root,relative(root,path))};writeFileSync(join(directory,'report.json'),JSON.stringify({schema:'turkos-thread-wait-damaged-host/v1',status:'ALL_REJECTED',canonical:artifact,baseline,controls},null,2)+'\n');console.log(`THREAD WAIT DAMAGED ${controls.length} ${relative(root,join(directory,'report.json'))}`);