/* evidence-selection — select certification evidence within the configured size and count limits. Do not produce evidence — selection picks from produced evidence. RFC-1097: sweep — werkstatt-engine clean Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics. */ import type { EvidenceEnvelopeV1, ResolvedRequirementV1, CertificationPolicyBundleV1, } from "./contracts/index.ts"; import type { Sha256Digest } from "@warpgogol/werkstatt-shared/fingerprint"; export type CertificationLimitFailureV1 = { readonly ok: false; readonly code: "CERT-LIMIT-01" | "CERT-LIMIT-02" | "CERT-LIMIT-03"; readonly message: string; }; export type RequirementStatus = "pass" | "fail" | "stale" | "incomplete" | "not-applicable"; export type EvidenceIndexInputV1 = { readonly candidateId: string; readonly evidence: readonly EvidenceEnvelopeV1[]; readonly evaluationCutSequence: number; }; export type EvidenceIndexEntryV1 = { readonly evidence: EvidenceEnvelopeV1; readonly evidenceHash: Sha256Digest; }; export type EvidenceIndexV1 = { readonly candidateId: string; readonly evaluationCutSequence: number; readonly byRequirement: ReadonlyMap; readonly totalCount: number; }; export type RequirementEvidenceSelectionInputV1 = { readonly requirement: ResolvedRequirementV1; readonly policyBundle: CertificationPolicyBundleV1; readonly authorityTime: string; }; export type RequirementEvidenceSelectionV1 = { readonly requirementId: string; readonly status: RequirementStatus; readonly selectedEvidenceId: string | null; readonly selectedEvidenceHash: Sha256Digest | null; readonly selectedAtSequence: number | null; readonly reasonCode: "CERT-EVIDENCE-01" | "CERT-EVIDENCE-02" | "CERT-GATE-01" | "CERT-OK" | "CERT-NA"; readonly reasonMessage: string; }; const MAX_REQUIREMENTS = 1000; const MAX_EVIDENCE = 10000; export function buildEvidenceIndex( input: EvidenceIndexInputV1, ): EvidenceIndexV1 | CertificationLimitFailureV1 { if (input.evidence.length > MAX_EVIDENCE) { return { ok: false, code: "CERT-LIMIT-02", message: `evidence count ${input.evidence.length} exceeds hard limit ${MAX_EVIDENCE}`, }; } const byRequirement = new Map(); let count = 0; for (const env of input.evidence) { if (env.candidateId !== input.candidateId) continue; const admission = env.authorityAdmission; if (!admission) continue; if (admission.authoritySequence > input.evaluationCutSequence) continue; const hash = env.result.bindingHash; const entry: EvidenceIndexEntryV1 = { evidence: env, evidenceHash: hash, }; for (const reqId of env.result.applicability.appliesTo) { let list = byRequirement.get(reqId); if (!list) { list = []; byRequirement.set(reqId, list); } list.push(entry); count++; } } return { candidateId: input.candidateId, evaluationCutSequence: input.evaluationCutSequence, byRequirement, totalCount: count, }; } function isFresh(env: EvidenceEnvelopeV1, authorityTime: string): boolean { return env.freshness.expiresAt >= authorityTime; } function isStale(env: EvidenceEnvelopeV1, authorityTime: string): boolean { return env.freshness.staleAfter < authorityTime; } function hasFailDiagnostic(env: EvidenceEnvelopeV1): boolean { return env.result.diagnostics.some((d) => d.severity === "error"); } export function selectRequirementEvidence( input: RequirementEvidenceSelectionInputV1, index: EvidenceIndexV1, ): RequirementEvidenceSelectionV1 { const { requirement, authorityTime } = input; const entries = index.byRequirement.get(requirement.requirementId) ?? []; if (entries.length === 0) { if (!requirement.mandatory) { return { requirementId: requirement.requirementId, status: "not-applicable", selectedEvidenceId: null, selectedEvidenceHash: null, selectedAtSequence: null, reasonCode: "CERT-NA", reasonMessage: "no evidence and requirement is not mandatory", }; } return { requirementId: requirement.requirementId, status: "incomplete", selectedEvidenceId: null, selectedEvidenceHash: null, selectedAtSequence: null, reasonCode: "CERT-EVIDENCE-01", reasonMessage: "no compatible admitted evidence at evaluation cut", }; } let best: EvidenceIndexEntryV1 | null = null; let bestSeq = -1; for (const entry of entries) { const seq = entry.evidence.authorityAdmission?.authoritySequence ?? -1; if (seq > bestSeq) { bestSeq = seq; best = entry; } } if (!best) { return { requirementId: requirement.requirementId, status: "incomplete", selectedEvidenceId: null, selectedEvidenceHash: null, selectedAtSequence: null, reasonCode: "CERT-EVIDENCE-01", reasonMessage: "no admitted evidence with authority sequence", }; } const env = best.evidence; if (hasFailDiagnostic(env)) { return { requirementId: requirement.requirementId, status: "fail", selectedEvidenceId: env.evidenceId, selectedEvidenceHash: best.evidenceHash, selectedAtSequence: bestSeq, reasonCode: "CERT-OK", reasonMessage: "admitted evidence contains error diagnostic", }; } if (isStale(env, authorityTime)) { return { requirementId: requirement.requirementId, status: "stale", selectedEvidenceId: env.evidenceId, selectedEvidenceHash: best.evidenceHash, selectedAtSequence: bestSeq, reasonCode: "CERT-EVIDENCE-02", reasonMessage: "compatible evidence is stale for current binding", }; } if (!isFresh(env, authorityTime)) { return { requirementId: requirement.requirementId, status: "stale", selectedEvidenceId: env.evidenceId, selectedEvidenceHash: best.evidenceHash, selectedAtSequence: bestSeq, reasonCode: "CERT-EVIDENCE-02", reasonMessage: "evidence freshness expired", }; } return { requirementId: requirement.requirementId, status: "pass", selectedEvidenceId: env.evidenceId, selectedEvidenceHash: best.evidenceHash, selectedAtSequence: bestSeq, reasonCode: "CERT-OK", reasonMessage: "admitted current evidence passes", }; } export const EVIDENCE_SELECTION_LIMITS = { MAX_REQUIREMENTS, MAX_EVIDENCE, } as const;