diff --git a/openpype/hosts/tvpaint/plugins/publish/help/validate_missing_layer_names.xml b/openpype/hosts/tvpaint/plugins/publish/help/validate_missing_layer_names.xml
new file mode 100644
index 0000000000..e96e7c5044
--- /dev/null
+++ b/openpype/hosts/tvpaint/plugins/publish/help/validate_missing_layer_names.xml
@@ -0,0 +1,18 @@
+
+
+
+Missing layers
+## Missing layers for render pass
+
+Render pass subset "{instance_name}" has stored layer names that belong to it's rendering scope but layers were not found in scene.
+
+### Missing layer names
+
+{layer_names}
+
+### How to repair?
+
+Find layers that belong to subset {instance_name} and rename them back to expected layer names or remove the subset and create new with right layers.
+
+
+
diff --git a/openpype/hosts/tvpaint/plugins/publish/validate_missing_layer_names.py b/openpype/hosts/tvpaint/plugins/publish/validate_missing_layer_names.py
index db9d354fcd..294ce6cf4f 100644
--- a/openpype/hosts/tvpaint/plugins/publish/validate_missing_layer_names.py
+++ b/openpype/hosts/tvpaint/plugins/publish/validate_missing_layer_names.py
@@ -1,4 +1,5 @@
import pyblish.api
+from openpype.pipeline import PublishXmlValidationError
class ValidateMissingLayers(pyblish.api.InstancePlugin):
@@ -30,13 +31,25 @@ class ValidateMissingLayers(pyblish.api.InstancePlugin):
"\"{}\"".format(layer_name)
for layer_name in missing_layer_names
])
+ instance_label = (
+ instance.data.get("label") or instance.data["name"]
+ )
+ description_layer_names = "
".join([
+ "- {}".format(layer_name)
+ for layer_name in missing_layer_names
+ ])
# Raise an error
- raise AssertionError(
+ raise PublishXmlValidationError(
+ self,
(
"Layers were not found by name for instance \"{}\"."
# Description what's wrong
" Layer names marked for publishing are not available"
" in layers list. Missing layer names: {}"
- ).format(instance.data["label"], layers_msg)
+ ).format(instance.data["label"], layers_msg),
+ formatting_data={
+ "instance_name": instance_label,
+ "layer_names": description_layer_names
+ }
)