GraphiteEditor/Graphite · error
Failed to create merge node
Error message
Failed to create merge node
What it means
When merging two layers, graph_modification_utils resolves the built-in 'Merge' node via document_node_definitions::resolve_network_node_type("Merge") and expects it to exist. The lookup is a hashmap access on DOCUMENT_NODE_TYPES keyed by DefinitionIdentifier::Network("Merge"); it returns None when the registry does not contain that identifier. Since the string is a compile-time constant referencing a built-in node, this panic means the registry and this call site drifted - the node was renamed, moved behind a feature flag, or the registry was not populated in this build.
Source
Thrown at editor/src/messages/tool/common_functionality/graph_modification_utils.rs:80
});
current_and_other_layer_is_spline = true;
}
// Move the `second_layer` below the `first_layer` for positioning purposes
let Some(first_layer_parent) = first_layer.parent(document.metadata()) else { return };
let Some(first_layer_index) = first_layer_parent.children(document.metadata()).position(|child| child == first_layer) else {
return;
};
responses.add(NodeGraphMessage::MoveLayerToStack {
layer: second_layer,
parent: first_layer_parent,
insert_index: first_layer_index + 1,
});
// Merge the inputs of the two layers
let merge_node_id = NodeId::new();
let merge_node = document_node_definitions::resolve_network_node_type("Merge")
.expect("Failed to create merge node")
.default_node_template();
responses.add(NodeGraphMessage::InsertNode {
node_id: merge_node_id,
node_template: Box::new(merge_node),
});
responses.add(NodeGraphMessage::SetToNodeOrLayer {
node_id: merge_node_id,
is_layer: false,
});
responses.add(NodeGraphMessage::MoveNodeToChainStart {
node_id: merge_node_id,
parent: first_layer,
});
responses.add(NodeGraphMessage::ConnectUpstreamOutputToInput {
downstream_input: InputConnector::layer_secondary_input(second_layer.to_node()),
input_connector: InputConnector::layer_secondary_input(merge_node_id),
});
responses.add(NodeGraphMessage::DeleteNodes {View on GitHub (pinned to c507b35645)
Solutions
- Keep the identifier in sync: grep for \"Merge\" across the repo when renaming the node definition
- Handle the None case by logging a clear 'node definition missing' error and aborting the merge transaction instead of panicking
- Add a unit test that resolves every identifier used by graph_modification_utils so drift fails CI, not users
Example fix
// before
let merge_node = document_node_definitions::resolve_network_node_type("Merge")
.expect("Failed to create merge node")
.default_node_template();
// after
let Some(merge_definition) = document_node_definitions::resolve_network_node_type("Merge") else {
log::error!("Merge node definition missing from registry");
return;
};
let merge_node = merge_definition.default_node_template(); Defensive patterns
Strategy: validation
Validate before calling
let Some(merge_definition) = document_node_definitions::resolve_network_node_type("Merge") else {
log::error!("'Merge' node definition missing from registry");
return;
}; Type guard
fn node_type_registered(identifier: &str) -> bool {
document_node_definitions::resolve_network_node_type(identifier).is_some()
} Prevention
- Grep for the identifier string whenever renaming a built-in node definition
- Resolve node types at the start of a multi-insert flow and abort before mutating the graph if any is missing
- Add a CI test resolving every identifier referenced from tool code
When it happens
Trigger: Invoking the layer-merge flow after 'Merge' was renamed in document_node_definitions.rs, its identifier string changed, or a build configuration excluded it from DOCUMENT_NODE_TYPES.
Common situations: Node registry refactors/renames without grepping for string call sites; splitting node definitions across crates/features so a target build lacks the Merge network node.
Related errors
- Failed to create path node
- Failed to create combine paths node
- Failed to create Spline node
- Failed to create transform node
- Solidify Stroke node should exist
AI-assisted analysis of GraphiteEditor/Graphite@c507b35645 (2026-08-16).
Data as JSON: /api/errors/708d1b387dc83597.
Report an issue: GitHub.