import type { ConformanceRuleId } from "../conformance/rules.js"; import type { AdapterOperation, AdapterRole, AdapterScriptType, PsbtVersion, } from "../protocol/types.js"; import type { PsbtTransitionFailure, PsbtTransitionPolicy } from "../psbt/invariants.js"; export type ScenarioOutcome = "passed" | "failed" | "unsupported" | "skipped"; export interface AdapterCapabilityRequirement { readonly adapter: string; readonly operations?: readonly AdapterOperation[]; readonly roles?: readonly AdapterRole[]; readonly psbtVersions?: readonly PsbtVersion[]; readonly scriptTypes?: readonly AdapterScriptType[]; readonly features?: readonly string[]; } export interface ScenarioAssertionEvidence { readonly name: string; readonly passed: boolean; readonly policy?: PsbtTransitionPolicy; readonly exactBytesEqual?: boolean; readonly failures?: readonly PsbtTransitionFailure[]; readonly likelyImplementation?: string; readonly summary?: string; } export interface ScenarioFinding { readonly id: string; readonly ruleId: ConformanceRuleId; readonly implementation: string; readonly summary: string; readonly actual: string; readonly evidence?: readonly string[]; } export type ScenarioAdapterCellStatus = "passed" | "failed" | "unsupported"; export interface ScenarioAdapterCell { readonly adapter: string; readonly operation: AdapterOperation; readonly requestId: string; readonly status: ScenarioAdapterCellStatus; readonly detail: string; readonly durationMs: number; readonly errorClass?: string; readonly restarted?: boolean; } export interface ScenarioExecutionOutput { readonly summary?: string; readonly assertions: readonly ScenarioAssertionEvidence[]; readonly adapterCells?: readonly ScenarioAdapterCell[]; readonly findings?: readonly ScenarioFinding[]; readonly expectedFailure?: { readonly implementation: string; readonly errorClass: string; }; readonly policyAccepted?: boolean; readonly transactionId?: string; } export interface ScenarioDefinition { readonly id: string; readonly title: string; readonly category: string; readonly summary: string; readonly requirements: readonly AdapterCapabilityRequirement[]; readonly skip?: (context: Context) => string | undefined | Promise; readonly run: (context: Context) => Promise; } export type MissingCapabilityKind = | "adapter" | "identity" | "operation" | "role" | "psbtVersion" | "scriptType" | "operationScriptType" | "feature"; export interface MissingCapability { readonly adapter: string; readonly kind: MissingCapabilityKind; readonly value: string | number; } export interface ScenarioResult extends ScenarioExecutionOutput { readonly id: string; readonly title: string; readonly category: string; readonly outcome: ScenarioOutcome; readonly summary: string; readonly durationMs: number; readonly missingCapabilities?: readonly MissingCapability[]; readonly skipReason?: string; readonly infrastructureError?: { readonly errorClass: string; readonly message: string; }; }