Files
reverse-engineering-anything/src/domain/processTraceComparison.ts
T
morluto 9b392bb2f8 chore(deps): finish toolchain upgrades and drop dead weight (#644)
* chore(deps): finish toolchain upgrades and drop dead weight

pino 9 to 10, @types/node 24 to 26, oxlint 1.73 to 1.87, knip 6.26
to 6.39, turbo 2.10 to 2.11. Narrow engines to supported majors
(22/24/26; vitest 5 refuses Node 25). Scope no-var-requires off for
Electron CJS hooks and fixtures.

Remove TypeDoc: incompatible with TypeScript 7 at install and
runtime, used by nothing in any gate. Drop the dep, docs:api
workflow, typedoc.json, CI artifact step, and related docs.

Replace graphology with a local call-graph adjacency plus BFS: the
only consumer is call-path search, and graphology-types ships no
types entry for TS7 NodeNext resolution. Delete both graphology
dependencies.

Remove dead re-exports newly flagged by knip 6.39.

* chore: drop stale typedoc and replay references

Remove the docs:api release-checklist step, the orphaned docs/api
ignore entry, and the nonexistent replay glob from the adapters
project.
2026-10-06 06:02:02 +08:00

69 lines
2.4 KiB
TypeScript

import type { ProcessCapture } from "./processCapture.js";
import {
evaluateProcessTraceSide,
processTraceComparisonResultSchema,
type ProcessTraceComparisonResult,
} from "./processTraceEvaluation.js";
import {
processTraceSpecificationSchema,
type ProcessTraceSpecification,
} from "./processTraceSpecification.js";
export {
processTraceComparisonResultSchema,
type ProcessTraceComparisonResult,
} from "./processTraceEvaluation.js";
export {
processTraceSpecificationSchema,
type ProcessTraceSpecification,
} from "./processTraceSpecification.js";
/** Compare two captures against an explicit finite trace language. */
export const compareProcessTraces = (
left: ProcessCapture,
right: ProcessCapture,
specificationInput: ProcessTraceSpecification,
): ProcessTraceComparisonResult => {
const specification =
processTraceSpecificationSchema.parse(specificationInput);
const leftEvaluation = evaluateProcessTraceSide(left, specification);
const rightEvaluation = evaluateProcessTraceSide(right, specification);
const diagnostic =
leftEvaluation.diagnostic === null
? rightEvaluation.diagnostic === null
? null
: { side: "right" as const, ...rightEvaluation.diagnostic }
: { side: "left" as const, ...leftEvaluation.diagnostic };
const outcomesDiffer =
leftEvaluation.result.status !== rightEvaluation.result.status ||
JSON.stringify(
leftEvaluation.result.raw_trace.map(({ event_id }) => event_id),
) !==
JSON.stringify(
rightEvaluation.result.raw_trace.map(({ event_id }) => event_id),
);
return processTraceComparisonResultSchema.parse({
verdict:
leftEvaluation.result.status === "unknown" ||
rightEvaluation.result.status === "unknown"
? "unknown"
: leftEvaluation.result.status === "pass" &&
rightEvaluation.result.status === "pass"
? "equivalent"
: outcomesDiffer
? "different"
: "nonconforming",
left: leftEvaluation.result,
right: rightEvaluation.result,
diagnostic,
});
};
/** Whether trace conformance or raw declared order differs across captures. */
export const processTraceOutcomesDiffer = (
comparison: ProcessTraceComparisonResult,
): boolean =>
comparison.left.status !== comparison.right.status ||
JSON.stringify(comparison.left.raw_trace.map(({ event_id }) => event_id)) !==
JSON.stringify(comparison.right.raw_trace.map(({ event_id }) => event_id));