/** * Decision list state and pending age. */ import { describe, expect, test } from "bun:test"; import type { JournalRun } from "../../kernel/journal.ts"; import { projectDecisionList, projectDecisionQueue } from "./decisions.ts"; import { setDecisionDrift, setDecisionLock, resetDecisionCertificates, } from "../../elements/ai/decisions/certificate.ts"; import type { Manifest } from "../../manifest/types.ts"; const manifest = { ai: { decisions: { triage: { mode: "review" as const, questions: ["team"] }, route: { mode: "review" as const, questions: ["team"] }, }, }, } as unknown as Manifest; describe("decision console projection", () => { test("lockfile and drift set the list state", () => { resetDecisionCertificates(); expect(projectDecisionList(manifest)[0]?.state).toBe("learning"); setDecisionLock({ version: 2, decisions: { triage: { deciders: { jev: { model: "typesafe/jev-1.13.0", pinned: true, questions: {} }, }, }, }, }); expect(projectDecisionList(manifest).find((row) => row.name === "triage")?.state).toBe( "certified", ); setDecisionDrift("triage", true); const rows = projectDecisionList(manifest, undefined, new Set(["route"]), { route: { labels: 12, errors: 0 }, }); expect(rows.find((row) => row.name === "triage")?.state).toBe("suspended"); const route = rows.find((row) => row.name === "route"); expect(route?.state).toBe("candidate"); expect(route?.metrics).toEqual({ labels: 12, errors: 0 }); expect(route?.promote).toBe("oke decide promote route"); resetDecisionCertificates(); }); test("queue age is now minus requestedAt", () => { const run = { id: "run", flow: "run", status: "sleeping", entries: [ { kind: "step" as const, name: "ai-decision:abc", at: 1_000, value: { status: "pending", requestedAt: 1_000 }, }, ], } as JournalRun; const [row] = projectDecisionQueue([run], 61_000); expect(row?.ageMs).toBe(60_000); expect(row?.labelOnly).toBe(false); }); });