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

  1. Keep the identifier in sync: grep for \"Merge\" across the repo when renaming the node definition
  2. Handle the None case by logging a clear 'node definition missing' error and aborting the merge transaction instead of panicking
  3. 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

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


AI-assisted analysis of GraphiteEditor/Graphite@c507b35645 (2026-08-16). Data as JSON: /api/errors/708d1b387dc83597. Report an issue: GitHub.