/* testing harness — trusted fixture helpers for component runtime tests. Do not use in production — the harness is test-only. 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 { ComponentId, ComponentDeclaration, ResolvedComponentIdentityV1, ResolvedComponentSetV1, } from "@warpgogol/werkstatt-shared/component"; import { ComponentFiber } from "../fiber.ts"; import type { Deadline } from "../fiber.ts"; import { createCapabilityCatalog, type CapabilityCatalogV1, type LiveComponentObservation, } from "../reflection.ts"; import type { ConformanceScenarioV1, ConformanceExpectationV1, ConformanceTraceEntryV1, ConformanceMismatchV1, ConformanceResultV1, ConformanceCleanupReportV1, ReflectedLifecycleState, } from "../conformance.ts"; import { createConformanceResult } from "../conformance.ts"; import { toReflectedState } from "../reflection.ts"; const TEST_MODE_SENTINEL = "__WERKSTATT_CONFORMANCE_TEST_MODE__"; export interface TrustedFixture { readonly fixtureId: string; readonly artifactHash: string; readonly trusted: true; readonly manifests: readonly ComponentDeclaration[]; readonly availableArtifacts: ReadonlyMap< ComponentId, import("@warpgogol/werkstatt-shared/fingerprint").Sha256Digest >; readonly admittedGrants: ReadonlyArray<{ scope: string; resource: string }>; } export interface HarnessOptions { readonly now: () => number; readonly drainDeadline: Deadline; } function assertTestMode(): void { const env = globalThis as Record; if (env[TEST_MODE_SENTINEL] !== true) { throw new Error("CONFORMANCE-01: harness invoked outside test mode — refusing to load fixture"); } } function assertTrustedFixture(fixture: TrustedFixture): void { if (!fixture.trusted) { throw new Error( `CONFORMANCE-02: fixture ${fixture.fixtureId} is not marked trusted — rejecting before import`, ); } if (!fixture.artifactHash || !fixture.artifactHash.startsWith("sha256:")) { throw new Error( `CONFORMANCE-03: fixture ${fixture.fixtureId} has invalid or unpinned artifact hash — rejecting`, ); } } function toTraceEntry( expectation: ConformanceExpectationV1, actual: Partial, ): ConformanceTraceEntryV1 { return { kind: expectation.kind, componentId: expectation.componentId, actualState: actual.actualState, callable: actual.callable, capability: actual.capability, at: expectation.at, detail: actual.detail ?? expectation.detail, }; } function compareExpectation( expectation: ConformanceExpectationV1, entry: ConformanceTraceEntryV1, ): ConformanceMismatchV1 | null { switch (expectation.kind) { case "lifecycle-state": if ( expectation.expectedState !== undefined && entry.actualState !== expectation.expectedState ) { return { expectationIndex: -1, kind: expectation.kind, componentId: expectation.componentId, expected: expectation.expectedState, actual: entry.actualState ?? "unknown", }; } return null; case "capability-callable": if (expectation.callable !== undefined && entry.callable !== expectation.callable) { return { expectationIndex: -1, kind: expectation.kind, componentId: expectation.componentId, expected: String(expectation.callable), actual: String(entry.callable ?? false), }; } return null; case "no-op": return null; case "drain-complete": case "quarantine": case "catalog-entry": case "catalog-hash": case "lifecycle-transition": return null; default: return null; } } export async function runConformanceScenario( scenario: ConformanceScenarioV1, fixture: TrustedFixture, options: HarnessOptions, ): Promise { assertTestMode(); assertTrustedFixture(fixture); if (scenario.fixtureArtifactHash !== fixture.artifactHash) { throw new Error( `CONFORMANCE-04: scenario fixture hash ${scenario.fixtureArtifactHash} does not match fixture ${fixture.artifactHash}`, ); } const violations: string[] = []; const injectedFailures: string[] = []; const trace: ConformanceTraceEntryV1[] = []; const mismatches: ConformanceMismatchV1[] = []; const fiberMap = new Map(); const observations = new Map(); function recordObservation(componentId: ComponentId): void { const fiber = fiberMap.get(componentId); if (fiber) { observations.set(componentId, { componentId, lifecycleState: fiber.state, }); } } function recordTrace( expectation: ConformanceExpectationV1, actual: Partial, ): void { const entry = toTraceEntry(expectation, actual); trace.push(entry); const mismatch = compareExpectation(expectation, entry); if (mismatch) { mismatches.push({ ...mismatch, expectationIndex: trace.length - 1 }); } } function createFiber(identity: ResolvedComponentIdentityV1): ComponentFiber { const fiber = new ComponentFiber(identity, "declared"); fiberMap.set(identity.componentId, fiber); return fiber; } for (const identity of scenario.initialSet.components) { const fiber = createFiber(identity); fiber.transitionTo("waiting"); fiber.transitionTo("loading"); fiber.transitionTo("active"); recordObservation(identity.componentId); } for (const event of scenario.injectedEvents) { switch (event.type) { case "activate": { if (event.componentId) { const fiber = fiberMap.get(event.componentId); if (fiber) { fiber.transitionTo("active"); recordObservation(event.componentId); } } break; } case "drain": { if (event.componentId) { const fiber = fiberMap.get(event.componentId); if (fiber) { await fiber.drain(options.drainDeadline); recordObservation(event.componentId); } } break; } case "cancel": { if (event.componentId) { const fiber = fiberMap.get(event.componentId); if (fiber) { fiber.cancelAllOperations(); recordObservation(event.componentId); } } break; } case "fail": { if (event.componentId) { const fiber = fiberMap.get(event.componentId); if (fiber) { fiber.transitionTo("failed"); recordObservation(event.componentId); } injectedFailures.push(`${event.componentId}: ${event.detail ?? "injected failure"}`); } break; } case "quarantine": { if (event.componentId) { const fiber = fiberMap.get(event.componentId); if (fiber) { fiber.transitionTo("failed"); fiber.transitionTo("quarantined"); recordObservation(event.componentId); } } break; } case "reconcile": { // RFC-1038: old computeReconciliationPlan removed — replaced by runtime/reconciler.ts. // The testing harness no longer simulates reconciliation; component-runtime // conformance tests focus on lifecycle transitions, not desired-state reconciliation. break; } } } for (const expectation of scenario.expectedTrace) { const componentId = expectation.componentId; let actualState: ReflectedLifecycleState | undefined; let callable: boolean | undefined; if (componentId) { const obs = observations.get(componentId); if (obs) { actualState = toReflectedState(obs.lifecycleState); callable = actualState === "active"; } } recordTrace(expectation, { actualState, callable, capability: expectation.capability, }); } const allStates = new Set(); for (const [, obs] of observations) { allStates.add(toReflectedState(obs.lifecycleState)); } const terminalState: ReflectedLifecycleState | "mixed" = allStates.size === 1 ? (Array.from(allStates)[0] ?? "failed") : "mixed"; const disposed: ComponentId[] = []; const quarantined: ComponentId[] = []; const failed: ComponentId[] = []; for (const [id, fiber] of fiberMap) { if (fiber.state === "disposed") { disposed.push(id); } else if (fiber.state === "quarantined") { quarantined.push(id); } else if (fiber.state === "failed") { failed.push(id); } } disposed.sort(); quarantined.sort(); failed.sort(); const cleanupReport: ConformanceCleanupReportV1 = { disposed, quarantined, failed, }; return createConformanceResult( scenario, trace, mismatches, injectedFailures, terminalState, cleanupReport, violations, ); } export function buildCatalog( activeSet: ResolvedComponentSetV1, manifests: ReadonlyMap, observations: ReadonlyMap, ): CapabilityCatalogV1 { return createCapabilityCatalog({ activeSet, manifests, observations, }); } export { TEST_MODE_SENTINEL }; export type { TrustedFixture as ConformanceTrustedFixture };