- agents/sage/ launch files committed after Dewey's review (R1 revise, R2 approve). The launcher test now covers sage with its zai/glm-5.3 high pin. The README states the lead role and its limits, and the seat reads but never writes the old DYOR records under ~/.mosaic. - N6 (Dewey authored, Sage reviewed against pins): seat personas and the Rocko launcher name Sage as project lead and Darkwing as a collaborating engineering seat, per Jason's 2026-09-26 ruling. - docs/plans/2026-09-26_lead-decisions.md: the push, no merge into next and its conditions, the board restart, queue-as-data rulings, Gate F waiting on a T3 source, and what stays with Jason. Launcher tests 6/6 and 1/1, eight suites green. Not pushed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
22 lines
1.0 KiB
JavaScript
22 lines
1.0 KiB
JavaScript
// Refuse damaged history before Pi's --continue can silently skip it.
|
|
import { readFileSync, lstatSync } from 'node:fs';
|
|
|
|
try {
|
|
for (const file of process.argv.slice(2)) {
|
|
if (!lstatSync(file).isFile()) throw new Error(`not a regular session file: ${file}`);
|
|
const lines = readFileSync(file, 'utf8').trim().split('\n');
|
|
const entries = lines.map((line) => JSON.parse(line));
|
|
const header = entries[0];
|
|
if (header?.type !== 'session' || typeof header.id !== 'string' || !header.id ||
|
|
typeof header.version !== 'number' || typeof header.cwd !== 'string' ||
|
|
!Number.isFinite(Date.parse(header.timestamp)) ||
|
|
entries.slice(1).some((entry) => !entry || typeof entry.type !== 'string')) {
|
|
throw new Error(`invalid session structure: ${file}`);
|
|
}
|
|
if (header.cwd !== process.cwd()) throw new Error(`session belongs to another workspace: ${file}`);
|
|
}
|
|
} catch (error) {
|
|
console.error(`sage: cannot safely resume: ${error.message}; inspect history or explicitly use --fresh`);
|
|
process.exit(1);
|
|
}
|