fix: link emergent unknowns to answer-derived graph nodes
This commit is contained in:
@@ -87,6 +87,45 @@ function validateAddedUnknowns(graph, proposal) {
|
||||
.filter((node) => node.kind !== "unknown")
|
||||
.map((node) => node.id),
|
||||
]);
|
||||
const proposalNodeById = buildNodeById(graph, proposal.addedNodes);
|
||||
|
||||
function hasExplicitNodeReference(fromNode, toNodeId) {
|
||||
if (!fromNode || !toNodeId) return false;
|
||||
|
||||
return (
|
||||
fromNode.parentId === toNodeId ||
|
||||
fromNode.dependsOn.includes(toNodeId) ||
|
||||
fromNode.affects.includes(toNodeId) ||
|
||||
fromNode.childIds.includes(toNodeId)
|
||||
);
|
||||
}
|
||||
|
||||
function hasExplicitAnswerDerivedRelationship(unknownNode) {
|
||||
const connectedEdge = proposal.addedEdges.find(
|
||||
(edge) =>
|
||||
(edge.fromNodeId === unknownNode.id &&
|
||||
answerDerivedNodeIds.has(edge.toNodeId)) ||
|
||||
(edge.toNodeId === unknownNode.id &&
|
||||
answerDerivedNodeIds.has(edge.fromNodeId)),
|
||||
);
|
||||
|
||||
if (connectedEdge) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (const answerDerivedNodeId of answerDerivedNodeIds) {
|
||||
const answerDerivedNode = proposalNodeById.get(answerDerivedNodeId);
|
||||
|
||||
if (
|
||||
hasExplicitNodeReference(unknownNode, answerDerivedNodeId) ||
|
||||
hasExplicitNodeReference(answerDerivedNode, unknownNode.id)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const unknownNode of addedUnknowns) {
|
||||
const meaningKeys = [
|
||||
@@ -128,15 +167,7 @@ function validateAddedUnknowns(graph, proposal) {
|
||||
);
|
||||
}
|
||||
|
||||
const connectedEdge = proposal.addedEdges.find(
|
||||
(edge) =>
|
||||
(edge.fromNodeId === unknownNode.id &&
|
||||
answerDerivedNodeIds.has(edge.toNodeId)) ||
|
||||
(edge.toNodeId === unknownNode.id &&
|
||||
answerDerivedNodeIds.has(edge.fromNodeId)),
|
||||
);
|
||||
|
||||
if (!connectedEdge) {
|
||||
if (!hasExplicitAnswerDerivedRelationship(unknownNode)) {
|
||||
errors.push(
|
||||
`New unknown must be explicitly related to an answer-derived node: "${unknownNode.id}"`,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user