/** * Deterministically reopen a resolved unknown node in a SituationGraph. * * Transition: removes the node's ID from resolvedNodeIds and establishes * node.status "unknown". * from resolvedNodeIds. This reverses canonical resolution so the question * reappears among Open Questions for further investigation. * * 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, * or touch contributions/findings/historical evidence. */ export function reopenResolvedUnknown(situationGraph, nodeId) { if (!situationGraph || !nodeId) return situationGraph; const nodeIndex = situationGraph.nodes.findIndex((n) => n.id === nodeId); if (nodeIndex === -1) return situationGraph; const node = situationGraph.nodes[nodeIndex]; if (node.kind !== "unknown" || !situationGraph.resolvedNodeIds?.includes(nodeId)) { return situationGraph; } const newNode = { ...node, status: "unknown" }; const newNodes = [...situationGraph.nodes]; newNodes[nodeIndex] = newNode; const newResolvedNodeIds = [ ...(situationGraph.resolvedNodeIds || []), ].filter((id) => id !== nodeId); return { ...situationGraph, nodes: newNodes, resolvedNodeIds: newResolvedNodeIds, }; }