// Results: one JSON per scenario run under /tmp/igneum-harness/results, and one dated bench-log entry with a row per // scenario (criterion, result, pass or fail). `run.mjs` calls writeBenchLog once at the end of a batch. import { mkdirSync, writeFileSync, readFileSync, appendFileSync, existsSync } from 'node:fs'; import { ROOT, TMP } from './net.mjs'; export const RESULTS = `${TMP}/results`; export function saveResult(name, data) { mkdirSync(RESULTS, { recursive: true }); const file = `${RESULTS}/${name}.json`; writeFileSync(file, JSON.stringify(data, null, 2)); return file; } export function loadResults(names) { const out = {}; for (const n of names) { const f = `${RESULTS}/${n}.json`; if (existsSync(f)) out[n] = JSON.parse(readFileSync(f, 'utf8')); } return out; } /// rows: [{ scenario, criterion, result, pass: true|false|null }] export function benchLogEntry({ date, title, machine, rows, notes = [] }) { const lines = []; lines.push('', `## ${date}, ${title}`, ''); lines.push(machine); lines.push(''); lines.push('| Scenario | Criterion (spec) | Measured | Pass |'); lines.push('|---|---|---|---|'); for (const r of rows) { const pass = r.pass === true ? 'pass' : r.pass === false ? 'FAIL' : 'stub'; lines.push(`| ${r.scenario} | ${r.criterion} | ${r.result} | ${pass} |`); } for (const n of notes) { lines.push(''); lines.push(n); } return lines.join('\n') + '\n'; } export function appendBenchLog(text) { const f = `${ROOT}docs/bench-log.md`; appendFileSync(f, text); return f; }