/** * * RFC-1296: pure builders for validation-report.json — per-validator * evidence summaries and the reuse-path contractFull block. Keeps * the evidence-shaping logic testable without running a build. * Mission / engine * mission-materialization-commands.ts, validation-report-evidence.test.ts * * contractFull.passed may never be true without listed validators * (DNA-106 — evidence fields derive from verified outcomes). * * Not a contract source of truth — callers depend on the module's exported API, not this file's internals. RFC-1311: Compass header sweep — repairs pre-existing contract debt surfaced by the test-file scaffold rollout. */ import type { KernelExecutionReport, KernelPipelineReport, } from "@warpgogol/werkstatt-engine/kernel"; import { summarizeStepDiagnostics } from "@warpgogol/werkstatt-shared/kernel"; import type { PreviousValidationReport, ValidationReportValidator, } from "./mission-materialization-commands.ts"; /** * Map build.check + build.post pipeline steps to validator entries carrying * per-rule error/warning counts. */ export function validatorsFromPipelineReports( checkReport: KernelPipelineReport | null | undefined, postReport: KernelPipelineReport | null | undefined, ): ValidationReportValidator[] { const map = (pipeline: "build.check" | "build.post") => (s: KernelExecutionReport): ValidationReportValidator => ({ name: s.commandName, pipeline, status: s.ok ? "pass" : "fail", exitCode: s.exitCode, ...summarizeStepDiagnostics(s.data, s.exitCode), }); return [ ...(checkReport?.steps.map(map("build.check")) ?? []), ...(postReport?.steps.map(map("build.post")) ?? []), ]; } /** * The reuse-path contractFull: copies the previous report's validator evidence * and stamps `reusedFrom`. Reuse without evidence is not a pass — the operator * reruns a full `mission.validate`. */ export function contractFullFromPrevious(previous: PreviousValidationReport | null): { passed: boolean; validators: ValidationReportValidator[]; reusedFrom?: string; reason?: string; } { const validators = previous?.contractFull.validators ?? []; if (!previous || validators.length === 0) { return { passed: false, validators, reason: "no-validator-evidence" }; } // The evidence is listed; pass only when every reused validator passed. return { passed: validators.every((v) => v.status === "pass"), validators, reusedFrom: previous.validatedAt, }; }