diff -pruN 1.2.0-1/CHANGELOG.md 1.3.0-1/CHANGELOG.md
--- 1.2.0-1/CHANGELOG.md	2025-02-14 12:10:44.000000000 +0000
+++ 1.3.0-1/CHANGELOG.md	2025-05-21 09:04:46.000000000 +0000
@@ -2,8 +2,16 @@
 
 ## Unreleased
 
+## 1.3.0
+
+Changes:
+
+- Raise error when the workflow does not have a start or end node.
+
 ## 1.2.0
 
+Changes:
+
 - Set `db_options["request_id"]` to the Ewoks job id when missing.
 
 ## 1.1.0
diff -pruN 1.2.0-1/debian/changelog 1.3.0-1/debian/changelog
--- 1.2.0-1/debian/changelog	2025-04-04 17:36:19.000000000 +0000
+++ 1.3.0-1/debian/changelog	2025-10-01 11:37:48.000000000 +0000
@@ -1,3 +1,12 @@
+python-ewoksppf (1.3.0-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release:
+    - ewokscore task error message changed (closes: #1115134).
+  * Explicitly build-depend on python3-setuptools.
+
+ -- Colin Watson <cjwatson@debian.org>  Wed, 01 Oct 2025 12:37:48 +0100
+
 python-ewoksppf (1.2.0-1) unstable; urgency=medium
 
   * New upstream release.
diff -pruN 1.2.0-1/debian/control 1.3.0-1/debian/control
--- 1.2.0-1/debian/control	2024-12-18 11:57:12.000000000 +0000
+++ 1.3.0-1/debian/control	2025-10-01 11:37:48.000000000 +0000
@@ -10,9 +10,10 @@ Build-Depends:
  dh-sequence-python3,
  pybuild-plugin-pyproject,
  python3-all,
- python3-ewokscore <!nocheck>,
+ python3-ewokscore (>= 1.5.0) <!nocheck>,
  python3-pypushflow <!nocheck>,
  python3-pytest <!nocheck>,
+ python3-setuptools,
 Standards-Version: 3.9.6
 Testsuite: autopkgtest-pkg-pybuild
 Homepage: https://gitlab.esrf.fr/workflow/ewoks/ewoksppf/
diff -pruN 1.2.0-1/pyproject.toml 1.3.0-1/pyproject.toml
--- 1.2.0-1/pyproject.toml	2025-02-14 12:10:44.000000000 +0000
+++ 1.3.0-1/pyproject.toml	2025-05-21 09:04:46.000000000 +0000
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "ewoksppf"
-version = "1.2.0"
+version = "1.3.0"
 authors = [{ name = "ESRF", email = "dau-pydev@esrf.fr" }]
 description = "Pypushflow binding for Ewoks"
 readme = { file = "README.md", content-type = "text/markdown" }
@@ -15,7 +15,7 @@ classifiers = [
     "Programming Language :: Python :: 3",
 ]
 requires-python = ">=3.8"
-dependencies = ["ewokscore >=1.0.0", "pypushflow >=1.1.0"]
+dependencies = ["ewokscore >=1.5.0", "pypushflow >=1.1.0"]
 
 [project.urls]
 Homepage = "https://gitlab.esrf.fr/workflow/ewoks/ewoksppf/"
diff -pruN 1.2.0-1/src/ewoksppf/bindings.py 1.3.0-1/src/ewoksppf/bindings.py
--- 1.2.0-1/src/ewoksppf/bindings.py	2025-02-14 12:10:44.000000000 +0000
+++ 1.3.0-1/src/ewoksppf/bindings.py	2025-05-21 09:04:46.000000000 +0000
@@ -503,19 +503,27 @@ class EwoksWorkflow(Workflow):
         # target_id -> EwoksPythonActor or InputMergeActor
         targetactors = self._targetactors
         start_actor = self._start_actor
+        has_start_node = False
         for target_id in analysis.start_nodes(taskgraph.graph):
+            has_start_node = True
             target_actor = targetactors.get(target_id)
             if target_actor is None:
                 target_actor = taskactors[target_id]
             self._connect_actors(start_actor, target_actor)
+        if not has_start_node and taskgraph.graph.nodes:
+            raise RuntimeError(f"{taskgraph} has no start node")
 
     def _connect_stop_actor(self, taskgraph: TaskGraph):
         # task_name -> EwoksPythonActor
         taskactors = self._taskactors
         stop_actor = self._stop_actor
+        has_end_node = False
         for source_id in analysis.end_nodes(taskgraph.graph):
+            has_end_node = True
             source_actor = taskactors[source_id]
             self._connect_actors(source_actor, stop_actor)
+        if not has_end_node and taskgraph.graph.nodes:
+            raise RuntimeError(f"{taskgraph} has no end node")
 
     @contextmanager
     def _run_context(
diff -pruN 1.2.0-1/src/ewoksppf/tests/test_ppf_actors/pythonErrorHandlerTest.py 1.3.0-1/src/ewoksppf/tests/test_ppf_actors/pythonErrorHandlerTest.py
--- 1.2.0-1/src/ewoksppf/tests/test_ppf_actors/pythonErrorHandlerTest.py	2025-02-14 12:10:44.000000000 +0000
+++ 1.3.0-1/src/ewoksppf/tests/test_ppf_actors/pythonErrorHandlerTest.py	2025-05-21 09:04:46.000000000 +0000
@@ -1,7 +1,7 @@
 def run(name, **kwargs):
     reply = None
     # This actor throws an exception
-    raise RuntimeError("Runtime error in pythonErrorHandlerTest.py!")
+    raise RuntimeError("Intentional error in pythonErrorHandlerTest!")
     if name is not None:
         reply = "Hello " + name + "!"
 
diff -pruN 1.2.0-1/src/ewoksppf/tests/test_ppf_workflow2.py 1.3.0-1/src/ewoksppf/tests/test_ppf_workflow2.py
--- 1.2.0-1/src/ewoksppf/tests/test_ppf_workflow2.py	2025-02-14 12:10:44.000000000 +0000
+++ 1.3.0-1/src/ewoksppf/tests/test_ppf_workflow2.py	2025-05-21 09:04:46.000000000 +0000
@@ -31,5 +31,5 @@ def test_workflow2(ppf_log_config, tmpdi
     graph, expected = workflow2()
     result = execute_graph(graph, varinfo=varinfo, raise_on_error=False)
     assert_execute_graph_default_result(graph, result, expected, varinfo=varinfo)
-    err_msg = "Task 'Python Error Handler Test' failed"
-    assert str(result["WorkflowExceptionInstance"]) == err_msg
+    err_msg = "Intentional error in pythonErrorHandlerTest!"
+    assert err_msg in str(result["WorkflowExceptionInstance"])
diff -pruN 1.2.0-1/src/ewoksppf/tests/test_ppf_workflow24.py 1.3.0-1/src/ewoksppf/tests/test_ppf_workflow24.py
--- 1.2.0-1/src/ewoksppf/tests/test_ppf_workflow24.py	2025-02-14 12:10:44.000000000 +0000
+++ 1.3.0-1/src/ewoksppf/tests/test_ppf_workflow24.py	2025-05-21 09:04:46.000000000 +0000
@@ -171,8 +171,8 @@ def test_ppf_workflow24(ppf_log_config):
     result = execute_graph(workflow(), inputs=inputs, raise_on_error=False)
     succeeded = "task1", "task2", "subtask1", "subtask2", "subtask3"
     assert result["_ppfdict"]["succeeded"] == succeeded
-    errorMessage = str(result["_ppfdict"]["WorkflowExceptionInstance"])
-    assert errorMessage == "Task 'task3' failed"
+    err_msg = str(result["_ppfdict"]["WorkflowExceptionInstance"])
+    assert "raise on name: task3" in err_msg
 
     inputs = [
         {"name": "succeeded", "value": tuple()},
@@ -188,8 +188,8 @@ def test_ppf_workflow24(ppf_log_config):
         "subsubtask3",
     )
     assert result["_ppfdict"]["succeeded"] == succeeded
-    errorMessage = str(result["_ppfdict"]["WorkflowExceptionInstance"])
-    assert errorMessage == "Task 'task3' failed"
+    err_msg = str(result["_ppfdict"]["WorkflowExceptionInstance"])
+    assert "raise on name: task3" in err_msg
 
     inputs = [
         {"name": "succeeded", "value": tuple()},
@@ -198,5 +198,5 @@ def test_ppf_workflow24(ppf_log_config):
     result = execute_graph(workflow(), inputs=inputs, raise_on_error=False)
     succeeded = "task1", "task2", "subtask1", "subtask2", "subsub_handler"
     assert result["_ppfdict"]["succeeded"] == succeeded
-    errorMessage = str(result["_ppfdict"]["WorkflowExceptionInstance"])
-    assert errorMessage == "Task 'task3' failed"
+    err_msg = str(result["_ppfdict"]["WorkflowExceptionInstance"])
+    assert "raise on name: task3" in err_msg
