Automerge backed Markdown editor for the Atmosphere
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import { mkdir, writeFile } from 'node:fs/promises'import { createHash } from 'node:crypto'import { readFileSync } from 'node:fs'import { execFileSync } from 'node:child_process'import { dirname, resolve } from 'node:path'import { spawn } from 'node:child_process'
const seeds = [579, 580, 581, 582]const output = resolve(process.env.REAMS_STRUCTURAL_REPORT ?? 'docs/verification/structural-coverage/stateful-fastcheck.json')const timeout = Number(process.env.REAMS_STRUCTURAL_TIMEOUT ?? 120_000)const results = []const requiredTargets = ['parentlineDelete', 'oneblockReplace2', 'plainpasteacrossblocks', 'multiblockformat']const hash = files => createHash('sha256').update(files.map(file => readFileSync(resolve(file))).join('')).digest('hex')for (const seed of seeds) { const result = await new Promise(resolveResult => { const child = spawn('npx', ['vitest', 'run', '--config', 'vitest.config.property.ts', 'tests/structural-coverage/stateful.property.test.ts'], { env: { ...process.env, REAMS_TEST_SEED: String(seed), REAMS_STRUCTURAL_RUNS: '100', REAMS_STRUCTURAL_COMMANDS: '40' }, cwd: process.cwd(), stdio: ['ignore', 'pipe', 'pipe'] }) let stdout = '' child.stdout.on('data', chunk => { stdout += chunk }) child.stderr.on('data', chunk => { stdout += chunk }) const timer = setTimeout(() => { child.kill('SIGTERM'); resolveResult({ seed, status: 'timeout', code: null, reportPath: output, runLog: stdout }) }, timeout) child.on('close', code => { clearTimeout(timer) const match = [...stdout.matchAll(/^STATEFUL_ACCOUNTING (.+)$/gm)].at(-1) const accounting = match ? JSON.parse(match[1]) : null const coverageOk = accounting !== null && requiredTargets.every(target => (accounting.accepted?.[target] ?? 0) >= 1) resolveResult({ seed, status: code === 0 && coverageOk ? 'pass' : 'fail', code, reportPath: output, accounting, runLog: stdout }) }) }) results.push(result)}const aggregate = results.reduce((total, result) => { total.generated += result.accounting?.generated ?? 0 total.checkRejected += result.accounting?.checkRejected ?? 0 for (const field of ['attempted', 'accepted', 'skipped', 'errors']) { for (const [kind, count] of Object.entries(result.accounting?.[field] ?? {})) total[field][kind] = (total[field][kind] ?? 0) + count } return total}, { generated: 0, checkRejected: 0, attempted: {}, accepted: {}, skipped: {}, errors: {} })const targetsOk = requiredTargets.every(target => (aggregate.accepted[target] ?? 0) >= 1)const statusOk = results.every(result => result.status === 'pass') && targetsOkconst evidence = { commit: execFileSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf8' }).trim(), commitDirty: execFileSync('git', ['status', '--porcelain'], { encoding: 'utf8' }).trim().length > 0, sourceHash: hash(['src/services/document-manager.ts', 'src/sync/text-first-sync-controller.ts', 'src/editor/line-attachment-extension.ts', 'src/editor/builtin-formatting-actions.ts']), lockHash: hash(['package-lock.json']), testHash: hash(['tests/structural-coverage/stateful.property.test.ts']), modelHash: hash(['tests/structural-coverage/stateful-test-model.ts']), scriptHash: hash(['scripts/report-stateful-structural.mjs']),}await mkdir(dirname(output), { recursive: true })await writeFile(output, JSON.stringify({ version: 4, generatedAt: new Date().toISOString(), evidence, seeds: results, aggregate, requiredTargets, status: statusOk ? 'pass' : 'fail', budgets: { runs: 100, maxCommands: 40, timeoutMs: timeout }, semantics: 'generated asyncModelRun commands only; no static prefix; mandatory targets checked per seed and across all seeds' }, null, 2) + '\n')if (!statusOk) process.exitCode = 1