feat: enforce reasoning pattern consistency

This commit is contained in:
2026-08-03 12:10:57 +01:00
parent 3e2edd2edc
commit c27320984c
6 changed files with 931 additions and 17 deletions
+60
View File
@@ -1434,5 +1434,65 @@ describe("applyValidatedProposal", () => {
expect(secondResult.selectedQuestion?.question.toLowerCase()).not.toMatch(
/price|budget|market size|pilot metrics|benchmark|technical differentiation/,
);
expect(secondResult.reasoningPatternValidation).toMatchObject({
activePattern: "decision",
valid: true,
});
expect(secondResult.graphReasoningIntegrity).toBe("valid");
expect(secondResult.incompatibleNodeIds).toEqual([]);
expect(secondResult.compatibilityFailures).toEqual([]);
});
it("does not allow a decision-mode active unknown to remain a comparison child", () => {
const graph = makeCommercialUpdateFixture();
graph.nodes.push(
makeNode({
id: "n-commercial-comparison-child",
label: "How the two observations were measured",
description:
"Need evidence about the measure used for each observation before comparing them.",
kind: "unknown",
status: "unknown",
confidence: "medium",
parentId: "n-commercial-parent",
}),
);
graph.activeUnknownNodeId = "n-commercial-comparison-child";
const result = applyValidatedProposal({
situationGraph: graph,
proposal: makeMeaningfulNoOpProposal(),
});
expect(result.success).toBe(true);
expect(result.reasoningPatternValidation).toMatchObject({
activePattern: "decision",
valid: true,
});
expect(result.graphReasoningIntegrity).toBe("valid");
expect(result.incompatibleNodeIds).toContain(
"n-commercial-comparison-child",
);
expect(result.compatibilityFailures).toEqual(
expect.arrayContaining([
expect.objectContaining({
nodeId: "n-commercial-comparison-child",
activePattern: "decision",
nodePattern: "comparison",
}),
]),
);
expect(result.replacementActions).toEqual(
expect.arrayContaining([
expect.objectContaining({
rejectedNodeId: "n-commercial-comparison-child",
replacementNodeId: result.selectedQuestion?.nodeId,
}),
]),
);
expect(result.selectedQuestion?.nodeId).not.toBe(
"n-commercial-comparison-child",
);
expect(result.selectedQuestion?.reasoningPattern).toBe("decision");
});
});