singularity-forge/src/resources/extensions/sf/tests/uok-parity-report.test.mjs

476 lines
12 KiB
JavaScript
Raw Normal View History

import assert from "node:assert/strict";
import {
existsSync,
mkdirSync,
mkdtempSync,
readFileSync,
rmSync,
} from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, test } from "vitest";
2026-05-06 01:44:28 +02:00
import {
closeDatabase,
getUokRuns,
openDatabase,
recordUokRunExit,
recordUokRunStart,
} from "../sf-db.js";
import {
recordUokKernelTermination,
runAutoLoopWithUok,
} from "../uok/kernel.js";
import {
buildParityReport,
hasCurrentParityWarning,
parseParityEvents,
UNMATCHED_RUN_STALE_MS,
writeParityReport,
} from "../uok/parity-report.js";
const NOW = Date.parse("2026-05-06T00:00:00.000Z");
const tmpRoots = [];
afterEach(() => {
2026-05-06 01:44:28 +02:00
closeDatabase();
for (const dir of tmpRoots.splice(0)) {
rmSync(dir, { recursive: true, force: true });
}
});
function makeProject() {
const root = mkdtempSync(join(tmpdir(), "sf-uok-parity-"));
tmpRoots.push(root);
mkdirSync(join(root, ".sf", "runtime"), { recursive: true });
return root;
}
function testDeps(preferences = {}) {
return {
loadEffectiveSFPreferences() {
return {
preferences: {
uok: {
enabled: true,
audit_envelope: { enabled: false },
audit_unified: { enabled: false },
...preferences.uok,
},
},
};
},
};
}
function testCtx(sessionId = "session-test") {
return {
sessionManager: {
getSessionId() {
return sessionId;
},
},
};
}
function readProjectParityEvents(projectRoot) {
const path = join(projectRoot, ".sf", "runtime", "uok-parity.jsonl");
assert.equal(existsSync(path), true);
return parseParityEvents(readFileSync(path, "utf-8"));
}
test("buildParityReport_legacy_anonymous_missing_exit_is_historical_not_current", () => {
const report = buildParityReport(
[
{ ts: "2026-05-05T17:21:52.209Z", path: "uok-kernel", phase: "enter" },
{
ts: "2026-05-05T17:25:52.439Z",
path: "uok-kernel",
phase: "exit",
status: "ok",
},
{ ts: "2026-05-05T17:25:18.803Z", path: "uok-kernel", phase: "enter" },
],
"/tmp/uok-parity.jsonl",
NOW,
);
assert.equal(report.legacyMissingExitEvents, 1);
assert.equal(report.missingExitEvents, 0);
assert.deepEqual(report.criticalMismatches, []);
assert.equal(hasCurrentParityWarning(report), false);
});
test("buildParityReport_fresh_run_missing_exit_is_current_warning", () => {
const report = buildParityReport(
[
{
ts: new Date(NOW - 5_000).toISOString(),
runId: "uok-run-1",
path: "uok-kernel",
phase: "enter",
},
],
"/tmp/uok-parity.jsonl",
NOW,
);
assert.equal(report.missingExitEvents, 1);
assert.equal(report.freshUnmatchedRuns[0].runId, "uok-run-1");
assert.match(report.criticalMismatches[0], /uok-run-1/);
assert.equal(hasCurrentParityWarning(report), true);
});
test("buildParityReport_stale_run_missing_exit_is_historical_not_current", () => {
const report = buildParityReport(
[
{
ts: new Date(NOW - UNMATCHED_RUN_STALE_MS - 1_000).toISOString(),
runId: "uok-old-run",
path: "uok-kernel",
phase: "enter",
},
],
"/tmp/uok-parity.jsonl",
NOW,
);
assert.equal(report.missingExitEvents, 0);
assert.equal(report.historicalUnmatchedRuns[0].runId, "uok-old-run");
assert.deepEqual(report.criticalMismatches, []);
assert.equal(hasCurrentParityWarning(report), false);
});
test("buildParityReport_run_exit_balances_enter", () => {
const report = buildParityReport(
[
{
ts: new Date(NOW - 10_000).toISOString(),
runId: "uok-run-2",
path: "uok-kernel",
phase: "enter",
},
{
ts: new Date(NOW - 5_000).toISOString(),
runId: "uok-run-2",
path: "uok-kernel",
phase: "exit",
status: "ok",
},
],
"/tmp/uok-parity.jsonl",
NOW,
);
assert.equal(report.missingExitEvents, 0);
assert.deepEqual(report.unmatchedRuns, []);
assert.equal(hasCurrentParityWarning(report), false);
});
2026-05-06 01:44:28 +02:00
test("uok_run_ledger_records_lifecycle_as_primary_state", () => {
openDatabase(":memory:");
recordUokRunStart({
runId: "uok-ledger-1",
sessionId: "session-ledger",
path: "uok-kernel",
flags: { enabled: true },
startedAt: new Date(NOW - 10_000).toISOString(),
});
recordUokRunExit({
runId: "uok-ledger-1",
sessionId: "session-ledger",
path: "uok-kernel",
flags: { enabled: true },
status: "ok",
endedAt: new Date(NOW - 5_000).toISOString(),
});
const runs = getUokRuns();
assert.equal(runs.length, 1);
assert.equal(runs[0].runId, "uok-ledger-1");
assert.equal(runs[0].status, "ok");
assert.equal(runs[0].sessionId, "session-ledger");
assert.equal(runs[0].flags.enabled, true);
const report = buildParityReport(
[],
"/tmp/uok-parity.jsonl",
NOW,
30_000,
runs,
);
assert.equal(report.ledgerRunCount, 1);
assert.equal(report.missingExitEvents, 0);
assert.equal(hasCurrentParityWarning(report), false);
});
test("buildParityReport_ledger_overrides_jsonl_lifecycle_counts", () => {
const report = buildParityReport(
[
{
ts: new Date(NOW - 5_000).toISOString(),
runId: "uok-ledger-clean",
path: "uok-kernel",
phase: "enter",
status: "unknown",
},
{
ts: new Date(NOW - 5_000).toISOString(),
path: "uok-kernel",
phase: "enter",
status: "unknown",
},
],
"/tmp/uok-parity.jsonl",
NOW,
30_000,
[
{
runId: "uok-ledger-clean",
sessionId: "session-ledger",
path: "uok-kernel",
status: "ok",
startedAt: new Date(NOW - 10_000).toISOString(),
endedAt: new Date(NOW - 5_000).toISOString(),
flags: { enabled: true },
},
],
);
assert.equal(report.ledgerRunCount, 1);
assert.equal(report.legacyMissingExitEvents, 1);
assert.equal(report.missingExitEvents, 0);
assert.deepEqual(report.criticalMismatches, []);
assert.equal(hasCurrentParityWarning(report), false);
});
test("buildParityReport_ledger_error_is_current_warning", () => {
const report = buildParityReport([], "/tmp/uok-parity.jsonl", NOW, 30_000, [
{
runId: "uok-ledger-error",
sessionId: "session-ledger",
path: "uok-kernel",
status: "error",
error: "ledger failure",
startedAt: new Date(NOW - 10_000).toISOString(),
endedAt: new Date(NOW - 5_000).toISOString(),
flags: { enabled: true },
},
]);
assert.equal(report.currentErrorEvents, 1);
assert.deepEqual(report.criticalMismatches, ["ledger failure"]);
assert.equal(hasCurrentParityWarning(report), true);
});
test("buildParityReport_fresh_error_is_current_but_stale_error_is_historical", () => {
const report = buildParityReport(
[
{
ts: new Date(NOW - 5_000).toISOString(),
runId: "uok-fresh-error",
path: "uok-kernel",
phase: "exit",
status: "error",
error: "fresh failure",
},
{
ts: new Date(NOW - UNMATCHED_RUN_STALE_MS - 1_000).toISOString(),
runId: "uok-old-error",
path: "uok-kernel",
phase: "exit",
status: "error",
error: "old failure",
},
],
"/tmp/uok-parity.jsonl",
NOW,
);
assert.equal(report.currentErrorEvents, 1);
assert.equal(report.historicalErrorEvents, 1);
assert.deepEqual(report.criticalMismatches, ["fresh failure"]);
assert.deepEqual(report.historicalCriticalMismatches, ["old failure"]);
assert.equal(hasCurrentParityWarning(report), true);
});
test("buildParityReport_stale_parity_diff_is_historical_not_current", () => {
const report = buildParityReport(
[
{
kind: "parity-diff",
ts: new Date(NOW - UNMATCHED_RUN_STALE_MS - 1_000).toISOString(),
plane: "gitops",
turnId: "T01",
match: false,
divergence: "legacy=commit uok=status-only",
},
],
"/tmp/uok-parity.jsonl",
NOW,
);
assert.equal(report.divergencesByPlane.gitops, 1);
assert.deepEqual(report.criticalMismatches, []);
assert.deepEqual(report.historicalCriticalMismatches, [
"[gitops] legacy=commit uok=status-only",
]);
assert.equal(hasCurrentParityWarning(report), false);
});
test("runAutoLoopWithUok_success_writes_balanced_run_id_heartbeats", async () => {
const projectRoot = makeProject();
const state = { basePath: projectRoot, autoStartTime: NOW };
let observerProvided = false;
await runAutoLoopWithUok({
ctx: testCtx("session-success"),
pi: {},
s: state,
deps: testDeps(),
async runKernelLoop(_ctx, _pi, _s, deps) {
observerProvided = Boolean(deps.uokObserver);
},
async runStandardLoop() {
throw new Error("standard loop should not run when uok is enabled");
},
});
assert.equal(observerProvided, true);
assert.equal(state.currentUokRunId, undefined);
const events = readProjectParityEvents(projectRoot);
assert.equal(events.length, 2);
assert.equal(events[0].phase, "enter");
assert.equal(events[1].phase, "exit");
assert.equal(events[1].status, "ok");
assert.equal(events[0].runId, events[1].runId);
const report = JSON.parse(
readFileSync(
join(projectRoot, ".sf", "runtime", "uok-parity-report.json"),
"utf-8",
),
);
assert.equal(report.missingExitEvents, 0);
assert.equal(hasCurrentParityWarning(report), false);
});
test("runAutoLoopWithUok_ignores_legacy_disabled_flag_and_uses_kernel_path", async () => {
const projectRoot = makeProject();
const state = { basePath: projectRoot, autoStartTime: NOW };
let kernelRan = false;
await runAutoLoopWithUok({
ctx: testCtx("session-force-uok"),
pi: {},
s: state,
deps: testDeps({ uok: { enabled: false } }),
async runKernelLoop(_ctx, _pi, _s, deps) {
kernelRan = Boolean(deps.uokObserver);
},
async runStandardLoop() {
throw new Error("legacy standard loop should not run");
},
});
assert.equal(kernelRan, true);
const events = readProjectParityEvents(projectRoot);
assert.equal(events[0].path, "uok-kernel");
assert.equal(events[1].path, "uok-kernel");
});
test("runAutoLoopWithUok_throw_still_writes_exit_and_current_error_report", async () => {
const projectRoot = makeProject();
const state = { basePath: projectRoot, autoStartTime: NOW };
await assert.rejects(
() =>
runAutoLoopWithUok({
ctx: testCtx("session-error"),
pi: {},
s: state,
deps: testDeps(),
async runKernelLoop() {
throw new Error("boom");
},
async runStandardLoop() {
throw new Error("standard loop should not run when uok is enabled");
},
}),
/boom/,
);
assert.equal(state.currentUokRunId, undefined);
const events = readProjectParityEvents(projectRoot);
assert.equal(events.length, 2);
assert.equal(events[0].phase, "enter");
assert.equal(events[1].phase, "exit");
assert.equal(events[1].status, "error");
assert.equal(events[1].error, "boom");
assert.equal(events[0].runId, events[1].runId);
const report = JSON.parse(
readFileSync(
join(projectRoot, ".sf", "runtime", "uok-parity-report.json"),
"utf-8",
),
);
assert.equal(report.missingExitEvents, 0);
assert.equal(report.currentErrorEvents, 1);
assert.deepEqual(report.criticalMismatches, ["boom"]);
assert.equal(hasCurrentParityWarning(report), true);
});
test("recordUokKernelTermination_marks_started_ledger_run_exited_on_signal", () => {
const projectRoot = makeProject();
openDatabase(":memory:");
recordUokRunStart({
runId: "uok-signal-run",
sessionId: "session-signal",
path: "uok-kernel",
flags: { enabled: true },
startedAt: new Date(NOW - 5_000).toISOString(),
});
const report = recordUokKernelTermination({
basePath: projectRoot,
runId: "uok-signal-run",
sessionId: "session-signal",
flags: { enabled: true },
status: "signal",
});
const runs = getUokRuns();
assert.equal(runs.length, 1);
assert.equal(runs[0].status, "signal");
assert.equal(typeof runs[0].endedAt, "string");
assert.equal(report.missingExitEvents, 0);
assert.equal(hasCurrentParityWarning(report), false);
const events = readProjectParityEvents(projectRoot);
assert.equal(events.length, 1);
assert.equal(events[0].phase, "exit");
assert.equal(events[0].status, "signal");
});
test("writeParityReport_recovers_started_ledger_runs_when_no_auto_lock_owner_exists", () => {
const projectRoot = makeProject();
openDatabase(":memory:");
recordUokRunStart({
runId: "uok-orphan-run",
sessionId: "session-orphan",
path: "uok-kernel",
flags: { enabled: true },
startedAt: new Date(NOW - 5_000).toISOString(),
});
const report = writeParityReport(projectRoot, NOW);
const runs = getUokRuns();
assert.equal(runs.length, 1);
assert.equal(runs[0].status, "recovered");
assert.equal(
runs[0].error,
"uok recovered missing exit: no live auto.lock owner",
);
assert.equal(report.missingExitEvents, 0);
assert.equal(report.freshUnmatchedRuns.length, 0);
assert.equal(hasCurrentParityWarning(report), false);
});