/* RFC-1210: AC-6 evidence — an auto-mission open appends a `remediation-mission` bordbuch bookkeeping entry carrying the triggering signal's evidenceRefs. Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only. RFC-1210: initial test — bordbuch entry shape + BOOKKEEPING_BORDBUCH_KINDS membership. RFC-1210: closed-loop signal ingest to bounded missions (RFC-1210) */ import { test, expect } from "vitest"; import { mkdtemp, rm, mkdir, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { stringify as stringifyYaml } from "yaml"; import { runRemediationSignalIngest } from "../remediation-signal-ingest.ts"; import { readBordbuch } from "../../bordbuch/bordbuch-io.ts"; import { BOOKKEEPING_BORDBUCH_KINDS } from "../../sternsystem/passport-staleness.ts"; import { buildActualState } from "../../runtime/reconciler.ts"; import type { KernelCommandInput, KernelRuntimeContext, } from "@warpgogol/werkstatt-shared/kernel"; import { createDefaultIO } from "@warpgogol/werkstatt-shared/kernel/workspace-io"; const SITE = "acme"; test("auto-mission appends remediation-mission bordbuch entry with signal evidence (AC-6)", async () => { const root = await mkdtemp(join(tmpdir(), "rem-mission-open-")); const workspaceRoot = join(root, "werkstatt"); const cacheClone = join(root, "systems-cache", SITE); try { await mkdir(join(workspaceRoot, "missions"), { recursive: true }); await mkdir(cacheClone, { recursive: true }); await writeFile( join(cacheClone, "system-state.yaml"), stringifyYaml({ schemaVersion: "1.0.0", systemId: SITE, currentMission: null, lastRelease: null, lastPropagated: {}, accessPin: null, passportRequired: false, ownershipRequired: false, remediation: { autonomy: "bounded", signalSources: ["operator"] }, }), ); const context = { io: createDefaultIO().io, workspaceRoot, actualState: buildActualState([ { name: "test", version: "1.0.0", declarations: [], commands: [], pipelines: [] }, ]), dryRun: false, logger: { info: () => {}, warn: () => {}, error: () => {} }, } as unknown as KernelRuntimeContext; const openMission = async ( _root: string, systemId: string, _brief: string, ) => { const missionId = `${systemId}-m000001`; await mkdir(join(workspaceRoot, "missions", missionId), { recursive: true }); await writeFile( join(workspaceRoot, "missions", missionId, "mission.yaml"), stringifyYaml({ schemaVersion: "1.0.0", missionId, systemId, state: "open", brief: "x", openedAt: new Date().toISOString(), openedBy: "remediation:test", closedAt: null, closedBy: null, pinAtOpen: "6.0.0", materializedAt: null, reconciledAt: null, migratedAt: null, releaseId: null, rfcId: null, operationId: "op-test", }), ); return { exitCode: 0, missionId }; }; const input: KernelCommandInput = { argv: [], flags: { site: SITE, class: "workpiece-deps", source: "operator", evidence: '["evidence/run-7.json","dist report"]', }, }; const result = await runRemediationSignalIngest(input, context, { openMission }); expect(result.exitCode).toBe(0); const entries = await readBordbuch(workspaceRoot, SITE); const rem = entries.filter((e) => e.kind === "remediation-mission"); expect(rem).toHaveLength(1); const meta = rem[0].metadata as Record; expect(meta.signalClass).toBe("workpiece-deps"); expect(meta.evidenceRefs).toEqual(["evidence/run-7.json", "dist report"]); expect(meta.fixCommand).toBe("config.regenerate"); expect(rem[0].missionId).toBe(`${SITE}-m000001`); expect(BOOKKEEPING_BORDBUCH_KINDS.has("remediation-mission")).toBe(true); } finally { await rm(root, { recursive: true }); } });