One cumulative control-board, webui and seat state. The four rows edit the
same files (scan.mjs, page.html, README.md, app.js), so they land together,
each on its own receipt:
- Row 18, Discord connector rows on the board (#1509): R3 approved by
Darkwing and Dewey, Gitea comment 26257, manifest 254403b8. Jason
accepted the visual test.
- Row 22, board attention status (#1503): Filbert approved R1, comment
26248, manifest e40b58ec; restart receipt 26249.
- #1511, task attribution (row 6 code phase): R2 approved by Filbert and
Dewey, manifest d4c96395. docs/TOOLS.md carries the approved --by usage
line (tools-usage.patch 86bcba3c).
- #1512, relaunch activity (row 6 pilot): R1 approved by Darkwing and
Dewey, candidate manifest 47769fad. All seven source files match it.
Row 16, internal development bootstrap (#1510): the seven files outside
shared records match Filbert's R1 pins, receipt 26204 (agents/researcher/*,
scripts/test-darkwing-launch.mjs, the bootstrap plan).
packages/webui/src/public/app.js is committed at its #1512 R1 pin ce7d79a4.
The working copy holds Dewey's unreviewed return-flow candidate on top of
that, and it stays uncommitted.
Also: the four row briefs and Darkwing's evidence records under
agents/darkwing/work, including the 2026-09-26 tree manifest and the #1512
re-run against 21e3e908. Serial acceptance command: 397/397, three runs.
The failures that only show when tests run concurrently are in #1509 engine
tests, and they reproduce on clean HEAD.
Suites on the exact staged tree: config 24, task 90, foundation 43,
conductor 17, release 14, auth 15, discord 63; package union 397/397
(serial); test-darkwing-launch 5/5.
Shared records (BUILD-LOG, QUEUE, CURRENT, DEFERRED, SESSIONS, AGENTS.md,
agents/README.md) follow in Sage's records commit.
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(`researcher: cannot safely resume: ${error.message}; inspect history or explicitly use --fresh`);
|
|
process.exit(1);
|
|
}
|