Files
rea/tests/fixtures/reconstructionProofApplicability.ts
T

217 lines
6.9 KiB
TypeScript

import { readyReviewedLedgerRequest } from "../../src/application/ReconstructionObligationLedger.fixture.js";
import { createEvidence } from "../../src/domain/evidence.js";
import { createEvidenceBundle } from "../../src/domain/evidenceBundle.js";
import { reconstructionObligationProofSchema } from "../../src/domain/reconstructionObligationProof.js";
import type { ReconstructionObligationLedgerInput } from "../../src/domain/reconstructionObligationLedgerSchemas.js";
const replaceProof = (
input: ReconstructionObligationLedgerInput,
result: unknown,
): void => {
const original = input.evidence_bundle.records.find(
(record) => record.predicate_type === "rea.reconstruction-proof",
)!;
const replacement = createEvidence(undefined, original.provider, {
predicateType: original.predicate_type,
operation: original.operation,
parameters: original.parameters,
result: result,
confidence: original.confidence,
authority: original.authority,
});
input.evidence_bundle = createEvidenceBundle(
input.evidence_bundle.records.map((record) =>
record.evidence_id === original.evidence_id ? replacement : record,
),
);
const binding = input.manifest.bindings[0]!;
binding.fixtures[0]!.evidence_ids = [replacement.evidence_id];
binding.verifier!.result_evidence_id = replacement.evidence_id;
};
const applicabilitySpecifications = [
{
name: "matching implementation and revision",
codes: [],
status: "ready",
reason: null,
},
{
name: "stronger proof authority",
codes: [],
status: "ready",
reason: null,
},
{
name: "conflicting duplicate outcomes",
codes: ["verifier-failed"],
status: "failed",
reason: "failed-proof",
},
{
name: "failed proof for stale implementation",
codes: ["inapplicable-fixture-proof", "inapplicable-verifier-proof"],
status: "open",
reason: "owner-mismatch",
},
{
name: "changed implementation",
codes: ["inapplicable-fixture-proof", "inapplicable-verifier-proof"],
status: "open",
reason: "owner-mismatch",
},
{
name: "changed obligation revision",
codes: ["inapplicable-fixture-proof", "inapplicable-verifier-proof"],
status: "open",
reason: "revision-mismatch",
},
{
name: "legacy ID-only proof",
codes: ["inapplicable-fixture-proof", "inapplicable-verifier-proof"],
status: "open",
reason: "invalid-proof",
},
{
name: "missing implementation commitment",
codes: ["inapplicable-fixture-proof", "inapplicable-verifier-proof"],
status: "open",
reason: "invalid-proof",
},
{
name: "missing obligation revision",
codes: ["inapplicable-fixture-proof", "inapplicable-verifier-proof"],
status: "open",
reason: "invalid-proof",
},
{
name: "fixture case pair mismatch",
codes: ["inapplicable-fixture-proof"],
status: "open",
reason: "claim-mismatch",
},
{
name: "verifier claim pair mismatch",
codes: ["inapplicable-verifier-proof"],
status: "open",
reason: "claim-mismatch",
},
{
name: "claims in a stale binding",
codes: ["inapplicable-fixture-proof", "inapplicable-verifier-proof"],
status: "open",
reason: "claim-mismatch",
},
{
name: "failed fixture",
codes: ["fixture-failed"],
status: "failed",
reason: "failed-proof",
},
{
name: "failed verifier",
codes: ["verifier-failed"],
status: "failed",
reason: "failed-proof",
},
{
name: "unknown verifier declaration",
codes: ["verifier-unavailable"],
status: "open",
reason: "Latest verifier status is unknown",
},
] as const;
/** Authenticated synthetic Evidence; no declared verifier command executes. */
export const reconstructionProofApplicabilityCases = () =>
applicabilitySpecifications.map((specification) => {
const input = readyReviewedLedgerRequest();
const result = reconstructionObligationProofSchema.parse(
input.evidence_bundle.records.find(
(record) => record.predicate_type === "rea.reconstruction-proof",
)!.normalized_result,
);
const proof = result.bindings[0]!;
switch (specification.name) {
case "matching implementation and revision":
break;
case "stronger proof authority":
input.manifest.bindings[0]!.fixtures[0]!.authority = "integration";
input.manifest.bindings[0]!.verifier!.authority = "integration";
break;
case "conflicting duplicate outcomes":
proof.verifiers.push({ ...proof.verifiers[0]!, passed: false });
replaceProof(input, result);
break;
case "failed proof for stale implementation":
input.manifest.bindings[0]!.owner.owner_sha256 = "2".repeat(64);
proof.fixtures[0]!.passed = false;
proof.verifiers[0]!.passed = false;
replaceProof(input, result);
break;
case "changed implementation":
input.manifest.bindings[0]!.owner.owner_sha256 = "2".repeat(64);
break;
case "changed obligation revision":
input.reviewed_obligations[0]!.obligation_version = 2;
break;
case "legacy ID-only proof":
replaceProof(input, {
passed: true,
obligation_ids: [proof.obligation_id],
fixture_ids: [proof.fixtures[0]!.fixture_id],
case_kinds: ["positive"],
verifier_ids: [proof.verifiers[0]!.verifier_id],
claim_ids: [proof.verifiers[0]!.claim_id],
});
break;
case "missing implementation commitment":
Reflect.deleteProperty(proof, "owner_sha256");
replaceProof(input, result);
break;
case "missing obligation revision":
Reflect.deleteProperty(proof, "obligation_version");
replaceProof(input, result);
break;
case "fixture case pair mismatch":
proof.fixtures[0]!.case_kind = "negative";
proof.fixtures.push({
fixture_id: "fixture.other",
case_kind: "positive",
passed: true,
});
replaceProof(input, result);
break;
case "verifier claim pair mismatch":
proof.verifiers[0]!.claim_id = "claim.other";
proof.verifiers.push({
verifier_id: "verifier.other",
claim_id: "claim.reviewed",
passed: true,
});
replaceProof(input, result);
break;
case "claims in a stale binding":
result.bindings.push({
...structuredClone(proof),
owner_sha256: "2".repeat(64),
});
proof.fixtures = [];
proof.verifiers = [];
replaceProof(input, result);
break;
case "failed fixture":
proof.fixtures[0]!.passed = false;
replaceProof(input, result);
break;
case "failed verifier":
proof.verifiers[0]!.passed = false;
replaceProof(input, result);
break;
case "unknown verifier declaration":
input.manifest.bindings[0]!.verifier!.status = "unknown";
break;
}
return { ...specification, input };
});