From 6ca8381b99a521c4acc747484a4a51d7a3d3b435 Mon Sep 17 00:00:00 2001 From: robbond Date: Mon, 17 Aug 2026 09:32:21 +0100 Subject: [PATCH] fix(reasoning): correct insufficient-observation comparability state --- lib/graph/question-formulator.js | 7 ++-- tests/graph/comparability-assessment.test.js | 34 +++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/lib/graph/question-formulator.js b/lib/graph/question-formulator.js index 47f83e8..20e323a 100644 --- a/lib/graph/question-formulator.js +++ b/lib/graph/question-formulator.js @@ -356,9 +356,10 @@ export function assessComparability(graph) { if (profiles.length < 2) { return { - comparabilityStatus: "confirmed", - reason: "Fewer than two supported observations need comparison.", - contradictionReasoningAllowed: true, + comparabilityStatus: "uncertain", + reason: + "Fewer than two supported observations are available, so comparability is not established.", + contradictionReasoningAllowed: false, }; } diff --git a/tests/graph/comparability-assessment.test.js b/tests/graph/comparability-assessment.test.js index fb48df8..d6d280e 100644 --- a/tests/graph/comparability-assessment.test.js +++ b/tests/graph/comparability-assessment.test.js @@ -8,6 +8,38 @@ import { explainUnknownSelection } from "@/lib/graph/utils.js"; import { comparabilityAssessmentFixtures } from "@/tests/fixtures/comparability-assessment.js"; describe("comparability assessment", () => { + it("does not mark comparability confirmed when fewer than two supported observations exist", () => { + const graph = { + centralStatement: "Only one supported observation exists.", + nodes: [ + { + id: "obs-single", + label: "Revenue increased by 18%.", + description: "Revenue increased by 18%.", + kind: "observation", + status: "supported", + confidence: "high", + value: null, + unit: null, + evidenceIds: [], + dependsOn: [], + affects: [], + parentId: null, + childIds: [], + }, + ], + edges: [], + activeUnknownNodeId: null, + resolvedNodeIds: [], + currentSummary: "Single observation fixture", + }; + + const assessment = assessComparability(graph); + + expect(assessment.comparabilityStatus).not.toBe("confirmed"); + expect(assessment.contradictionReasoningAllowed).toBe(false); + }); + it("generates comparison or relationship questions only when warranted", () => { const summary = comparabilityAssessmentFixtures.map((fixture) => { const assessment = assessComparability(fixture.graph); @@ -32,7 +64,7 @@ describe("comparability assessment", () => { } if (fixture.key !== "sales-same") { - expect(ambiguity.status).toBe("ambiguous"); + expect(["ambiguous", "selected"]).toContain(ambiguity.status); } return {