refactor(reconstruction): share canonical original cases across evaluation

This commit is contained in:
morluto committed 2026-10-26 13:46:57 +08:00
1 parent 1173c0a9dc
commit 60daca427d
2 files changed
+16 -18

No files matched your search

@@ -181,6 +181,7 @@ const evaluateObligation = (
): ReconstructionObligation => {
const bindings = context.bindings.get(candidate.obligation_id) ?? [];
const binding = bindings.length === 1 ? (bindings[0] ?? null) : null;
const originalCases = originalCasesFor(candidate, binding);
const diagnostics: Diagnostic[] = [];
if (candidate.definitionCount > 1)
addDiagnostic(
@@ -203,9 +204,9 @@ const evaluateObligation = (
if (binding !== null)
evaluateBinding(candidate, binding, context, diagnostics);
diagnostics.push(
...originalCaseDiagnostics(candidate, binding, context.evidence),
...originalCaseDiagnostics(candidate, originalCases, context.evidence),
);
evaluateAuthority(candidate, binding, context, diagnostics);
evaluateAuthority(candidate, originalCases, context, diagnostics);
evaluateDisposition(candidate, diagnostics);
diagnostics.push(
...contradictionDiagnostics(
@@ -232,7 +233,7 @@ const evaluateObligation = (
target: candidate.target,
authority_references: candidate.authority_references,
source_state: candidate.source_state,
observed_cases: originalCasesFor(candidate, binding),
observed_cases: originalCases,
required: candidate.required,
required_case_kinds: candidate.required_case_kinds,
required_original_authority: candidate.required_original_authority,
@@ -407,7 +408,7 @@ const evaluateVerifier = (
const evaluateAuthority = (
candidate: ReconstructionObligationCandidate,
binding: Binding | null,
originalCases: ReconstructionObligation["observed_cases"],
context: EvaluationContext,
diagnostics: Diagnostic[],
): void => {
@@ -426,18 +427,16 @@ const evaluateAuthority = (
);
},
);
const caseSatisfied = originalCasesFor(candidate, binding).some(
({ evidence_id: evidenceId }) => {
const evidence = context.evidence.get(evidenceId);
return (
evidence !== undefined &&
evidenceSupportsOriginalAuthority(
evidence,
candidate.required_original_authority,
)
);
},
);
const caseSatisfied = originalCases.some(({ evidence_id: evidenceId }) => {
const evidence = context.evidence.get(evidenceId);
return (
evidence !== undefined &&
evidenceSupportsOriginalAuthority(
evidence,
candidate.required_original_authority,
)
);
});
const satisfied = referenceSatisfied || caseSatisfied;
if (!satisfied)
addDiagnostic(
@@ -31,11 +31,10 @@ export const originalCasesFor = (
/** Report original cases that are absent or lack comparable Evidence authority. */
export const originalCaseDiagnostics = (
candidate: ReconstructionObligationCandidate,
binding: Binding | null,
originalCases: ReconstructionObligation["observed_cases"],
evidenceById: ReadonlyMap<string, Evidence>,
): Diagnostic[] => {
const diagnostics: Diagnostic[] = [];
const originalCases = originalCasesFor(candidate, binding);
// Retain optional case rows, but never leave one of their Evidence links
// unresolved merely because its kind is not required for closure.
for (const { kind, evidence_id: evidenceId } of originalCases)