GraphiteEditor/Graphite · error

Failed to create combine paths node

Error message

Failed to create combine paths node

What it means

The same merge flow then inserts a Combine Paths node by resolving graphene_std::vector::combine_paths::IDENTIFIER through resolve_proto_node_type(...).expect("Failed to create combine paths node"). This is a DOCUMENT_NODE_TYPES lookup keyed by ProtoNodeIdentifier; None means the proto node identifier is not registered in this build. Because the identifier comes from the defining crate it is normally stable, so a panic here indicates the registry population and the vector module drifted (renamed identifier, feature-gated module).

Source

Thrown at editor/src/messages/tool/common_functionality/graph_modification_utils.rs:106

		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 {
		node_ids: vec![second_layer.to_node()],
		delete_children: false,
	});

	// Add a Combine Paths node after the merge
	let combine_paths_node_id = NodeId::new();
	let combine_paths_node = document_node_definitions::resolve_proto_node_type(graphene_std::vector::combine_paths::IDENTIFIER)
		.expect("Failed to create combine paths node")
		.default_node_template();
	responses.add(NodeGraphMessage::InsertNode {
		node_id: combine_paths_node_id,
		node_template: Box::new(combine_paths_node),
	});
	responses.add(NodeGraphMessage::MoveNodeToChainStart {
		node_id: combine_paths_node_id,
		parent: first_layer,
	});

	// Add a path node after the combine paths node
	let path_node_id = NodeId::new();
	let path_node = document_node_definitions::resolve_network_node_type("Path")
		.expect("Failed to create path node")
		.default_node_template();
	responses.add(NodeGraphMessage::InsertNode {
		node_id: path_node_id,
		node_template: Box::new(path_node),

View on GitHub (pinned to c507b35645)

Solutions

  1. Verify combine_paths::IDENTIFIER matches the registered identifier in document_node_definitions after any rename
  2. Downgrade the expect to a logged early-return that cancels the merge cleanly
  3. Add a registry-coverage test for all identifiers referenced from tooling code paths

Example fix

// before
let combine_paths_node = document_node_definitions::resolve_proto_node_type(graphene_std::vector::combine_paths::IDENTIFIER)
	.expect("Failed to create combine paths node")
	.default_node_template();

// after
let Some(def) = document_node_definitions::resolve_proto_node_type(graphene_std::vector::combine_paths::IDENTIFIER) else {
	log::error!("Combine Paths node definition missing from registry");
	return;
};
let combine_paths_node = def.default_node_template();
Defensive patterns

Strategy: validation

Validate before calling

let Some(combine_def) = document_node_definitions::resolve_proto_node_type(graphene_std::vector::combine_paths::IDENTIFIER) else {
	log::error!("Combine Paths node missing from registry");
	return;
};

Type guard

fn proto_node_registered(identifier: graphene_std::ProtoNodeIdentifier) -> bool {
	document_node_definitions::resolve_proto_node_type(identifier).is_some()
}

Prevention

When it happens

Trigger: Running the two-layer merge (both layers with vector data) when combine_paths::IDENTIFIER is absent from DOCUMENT_NODE_TYPES - renamed constant, changed crate structure, or a build with the vector module compiled out.

Common situations: Refactors of graphene_std node identifiers; feature flags excluding vector nodes from the registry; version skew between editor and graphene_std crates.

Related errors


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