fix(confidence-engine): reopen resolved unknowns by graph state
This commit is contained in:
@@ -1,11 +1,12 @@
|
|||||||
/**
|
/**
|
||||||
* Deterministically reopen a resolved unknown node in a SituationGraph.
|
* Deterministically reopen a resolved unknown node in a SituationGraph.
|
||||||
*
|
*
|
||||||
* Transition: node.status "resolved" → "unknown", and removes the node's ID
|
* Transition: removes the node's ID from resolvedNodeIds and establishes
|
||||||
|
* node.status "unknown".
|
||||||
* from resolvedNodeIds. This reverses canonical resolution so the question
|
* from resolvedNodeIds. This reverses canonical resolution so the question
|
||||||
* reappears among Open Questions for further investigation.
|
* reappears among Open Questions for further investigation.
|
||||||
*
|
*
|
||||||
* Idempotent — if the target is not a currently-resolved unknown, returns the
|
* Idempotent — if the target is not an unknown marked resolved in graph state, returns the
|
||||||
* original graph unchanged (no mutation). Does NOT create nodes, delete edges,
|
* original graph unchanged (no mutation). Does NOT create nodes, delete edges,
|
||||||
* or touch contributions/findings/historical evidence.
|
* or touch contributions/findings/historical evidence.
|
||||||
*/
|
*/
|
||||||
@@ -17,7 +18,9 @@ export function reopenResolvedUnknown(situationGraph, nodeId) {
|
|||||||
if (nodeIndex === -1) return situationGraph;
|
if (nodeIndex === -1) return situationGraph;
|
||||||
|
|
||||||
const node = situationGraph.nodes[nodeIndex];
|
const node = situationGraph.nodes[nodeIndex];
|
||||||
if (node.kind !== "unknown" || node.status !== "resolved") return situationGraph;
|
if (node.kind !== "unknown" || !situationGraph.resolvedNodeIds?.includes(nodeId)) {
|
||||||
|
return situationGraph;
|
||||||
|
}
|
||||||
|
|
||||||
const newNode = { ...node, status: "unknown" };
|
const newNode = { ...node, status: "unknown" };
|
||||||
const newNodes = [...situationGraph.nodes];
|
const newNodes = [...situationGraph.nodes];
|
||||||
|
|||||||
@@ -145,6 +145,23 @@ describe("reopenResolvedUnknown — pure deterministic transformation", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("canonical resolved-node-ID target", () => {
|
||||||
|
it("reopens an unknown-status node marked resolved by graph state without mutating input", () => {
|
||||||
|
const graph = makeTestGraph();
|
||||||
|
graph.nodes[0] = { ...graph.nodes[0], status: "unknown" };
|
||||||
|
|
||||||
|
const result = reopenResolvedUnknown(graph, "u-1");
|
||||||
|
const targetNode = result.nodes.find((n) => n.id === "u-1");
|
||||||
|
|
||||||
|
expect(targetNode.kind).toBe("unknown");
|
||||||
|
expect(targetNode.status).toBe("unknown");
|
||||||
|
expect(result.resolvedNodeIds).not.toContain("u-1");
|
||||||
|
expect(result.resolvedNodeIds).toContain("u-2");
|
||||||
|
expect(graph.nodes.find((n) => n.id === "u-1").status).toBe("unknown");
|
||||||
|
expect(graph.resolvedNodeIds).toContain("u-1");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("invalid/no-op cases", () => {
|
describe("invalid/no-op cases", () => {
|
||||||
it("returns original graph when node does not exist", () => {
|
it("returns original graph when node does not exist", () => {
|
||||||
const graph = makeTestGraph();
|
const graph = makeTestGraph();
|
||||||
|
|||||||
Reference in New Issue
Block a user