// The real migration (A2): the reviewed map renders the golden genesis // table, and the marked QUEUE.md keeps every row between its markers for // genesis's legacyView. map-check.mjs, the pre-genesis drift check, is // tested on the frozen fixture here; no test reads the live QUEUE.md. import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import { test } from "node:test"; import { genesisRows, parseMigrationMap, render, splitView, validateRows } from "../src/queue.mjs"; import { check, tableLines } from "../../../agents/darkwing/work/queue-a2/map-check.mjs"; const HERE = new URL(".", import.meta.url).pathname; const MAP = readFileSync(`${HERE}../../../agents/darkwing/work/queue-migration-map.md`, "utf8"); const MARKED = readFileSync(`${HERE}fixtures/queue-marked.md`, "utf8"); const GOLDEN = readFileSync(`${HERE}fixtures/genesis-render.md`, "utf8"); test("the migration map validates and renders the golden genesis table", () => { const map = parseMigrationMap(MAP); assert.deepEqual(map.rows.map((r) => r.id), Array.from({ length: 30 }, (_, i) => i + 1)); assert.equal(map.highWater, 30); assert.deepEqual(map.retired, []); const blobs = new Map(map.rows.filter((r) => r.brief).map((r) => [r.id, "a".repeat(40)])); const rows = genesisRows(map, blobs, "genesis-2026-09-27", "2026-09-27T00:00:00.000Z", "sage"); validateRows(rows); assert.equal(render(rows, 0), GOLDEN); assert.deepEqual(rows.filter((r) => r.claim).map((r) => [r.id, r.claim.seat]), [[5, "dewey"], [7, "sage"], [9, "darkwing"], [11, "darkwing"], [16, "darkwing"]]); assert.deepEqual(rows.filter((r) => r.state === "parked").map((r) => r.id), [8, 26, 27, 28, 29, 30]); assert.deepEqual(rows.filter((r) => r.required).map((r) => r.id), [9, 10, 11, 12, 13]); }); test("the marked QUEUE.md holds every row and parked item between its markers", () => { const parts = splitView(MARKED); assert.notEqual(parts, null); const inside = tableLines(parts.body); assert.deepEqual([...inside.keys()], Array.from({ length: 30 }, (_, i) => i + 1)); assert.deepEqual(tableLines(MARKED), inside); assert.equal(tableLines(parts.head).size, 0); assert.match(parts.head, /^## Pieces \(in order\)\n\n\n$/m); assert.match(parts.tail, /^\n\n## Log of table changes\n/); assert.deepEqual(check(MARKED, MAP, MARKED), []); }); test("map-check reports each kind of drift", () => { const line = (id) => tableLines(MARKED).get(id); const edit = (id, to) => MARKED.replace(line(id), to); const cellsOf = (id) => line(id).slice(2, -2).split(" | "); const row = (c) => `| ${c.join(" | ")} |`; const c9 = cellsOf(9); const piece = edit(9, row([c9[0], "Queue as data, renamed", ...c9.slice(2)])); assert.deepEqual(check(piece, MAP, MARKED), ["row 9: changed since the map's QUEUE.md blob", "row 9: piece differs from the map"]); const c10 = cellsOf(10); const owner = edit(10, row([c10[0], c10[1], "sage", ...c10.slice(3)])); assert.deepEqual(check(owner, MAP, MARKED), ["row 10: changed since the map's QUEUE.md blob", "row 10: owner sage in QUEUE.md, coordinator in the map"]); const c16 = cellsOf(16); const issue = edit(16, row([...c16.slice(0, 3), "#1510, #1520", ...c16.slice(4)])); assert.deepEqual(check(issue, MAP, MARKED), ["row 16: changed since the map's QUEUE.md blob", "row 16: issues 1510,1520 in QUEUE.md, 1510 in the map"]); const state = edit(5, line(5).replace("Gate E blocked", "Gate E rescoped")); assert.deepEqual(check(state, MAP, MARKED), ["row 5: changed since the map's QUEUE.md blob"]); const parked = edit(27, line(27).replace("Auth/provider/harness registry review", "Registry review")); assert.deepEqual(check(parked, MAP, MARKED), ["row 27: changed since the map's QUEUE.md blob", 'row 27: parked item "Registry review" is not the map\'s piece']); const gone = MARKED.replace(`${line(12)}\n`, ""); assert.deepEqual(check(gone, MAP, MARKED), ["row 12: removed since the map's QUEUE.md blob", "row 12: in the map, not in QUEUE.md"]); // A new row 26 moves the parked items to 27..31, so the map's ids no // longer line up and every shifted row reports. const added = MARKED.replace(`${line(25)}\n`, `${line(25)}\n| 26 | New piece | darkwing | — | queued | g | b |\n`); const found = check(added, MAP, MARKED); assert.ok(found.includes("row 26: changed since the map's QUEUE.md blob")); assert.ok(found.includes("row 26: piece differs from the map")); assert.ok(found.includes("row 31: in QUEUE.md, not in the map")); assert.equal(found.filter((d) => / parked item /.test(d)).length, 4); });