Files
rea/src/domain/functionComparison.ts
T
morluto 93a384db77 fix(evidence): classify derived failures at their owning boundary
Parse caller selections and authenticated Evidence at their owners, reuse the parsed function and comparison facts, and preserve unexpected implementation failures. Remove downstream error guessing and redundant validation wrappers.

Verify with 526 affected tests, source checks, docs conformance, test discovery and duplication checks. Seven public SDK regressions fail on the main baseline. No real-provider execution was performed.
2026-10-23 03:22:34 +08:00

45 lines
1.8 KiB
TypeScript

import { canonicalJson } from "./comparisonSemantics.js";
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
import type { FunctionSnapshot } from "./functionDossierEvidence.js";
import { functionMatch } from "./functionComparisonNormalization.js";
import {
functionComparisonResultSchema,
type FunctionComparisonResult,
} from "./functionComparisonSchemas.js";
import { overallStatus, summarize } from "./functionComparisonResults.js";
import { compareDimensions } from "./functionComparisonDimensions.js";
/** Compare two authenticated function snapshots without fuzzy matching. */
export const compareFunctions = (
left: FunctionSnapshot,
right: FunctionSnapshot,
): FunctionComparisonResult => {
const links = [left.evidence.evidence_id, right.evidence.evidence_id];
const providersDiffer =
canonicalJson(left.evidence.provider, "Function comparison") !==
canonicalJson(right.evidence.provider, "Function comparison");
const dimensions = compareDimensions(left, right, { links, providersDiffer });
const match = functionMatch(left, right);
const changes = dimensions.filter(({ status }) => status !== "unchanged");
return functionComparisonResultSchema.parse({
status: overallStatus(dimensions, match.status),
function_match: match,
left_subject_sha256: left.subject.digest.sha256,
right_subject_sha256: right.subject.digest.sha256,
summary: summarize(dimensions),
dimensions,
changes,
limitations: [
...new Set([
...left.limitations.map((item) => `Left: ${item}`),
...right.limitations.map((item) => `Right: ${item}`),
...(providersDiffer
? [
"Provider-specific pseudocode and assembly representations were not equated.",
]
: []),
]),
].sort((a, b) => compareUnicodeCodePoints(a, b)),
});
};