diff --git a/meta-python/recipes-devtools/python3-breathe/python3-breathe/0001-tests-accept-docutils-0.23-boolean-attribute-seriali.patch b/meta-python/recipes-devtools/python3-breathe/python3-breathe/0001-tests-accept-docutils-0.23-boolean-attribute-seriali.patch
new file mode 100644
index 0000000000..145f8dac39
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-breathe/python3-breathe/0001-tests-accept-docutils-0.23-boolean-attribute-seriali.patch
@@ -0,0 +1,36 @@
+From: Khem Raj <khem.raj@oss.qualcomm.com>
+Subject: [PATCH] tests: accept docutils 0.23 boolean attribute serialization
+
+docutils 0.23 serializes boolean node attributes as "1"/"0" in its
+pseudo-XML output instead of "True"/"False", which makes every
+test_examples comparison fail against the bundled compare.xml models.
+Normalize the generated value before comparing.
+
+Upstream-Status: Pending
+
+AI-Generated: Uses Claude Code
+Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
+---
+diff --git a/tests/test_examples.py b/tests/test_examples.py
+index c256d83..20a9d3e 100644
+--- a/tests/test_examples.py
++++ b/tests/test_examples.py
+@@ -150,10 +150,18 @@ def str_to_set(x):
+     return frozenset(x.split())
+
+
++# docutils >= 0.23 serializes boolean attributes as "1"/"0" instead of
++# "True"/"False"
++BOOL_ATTR_VALUES = {"1": "True", "0": "False"}
++
++
+ def attr_compare(name, actual, expected):
+     if name == "classes":
+         return str_to_set(actual) >= str_to_set(expected)
+
++    if expected in ("True", "False"):
++        actual = BOOL_ATTR_VALUES.get(actual, actual)
++
+     return actual == expected
+
+
diff --git a/meta-python/recipes-devtools/python3-breathe/python3-breathe/run-ptest b/meta-python/recipes-devtools/python3-breathe/python3-breathe/run-ptest
new file mode 100755
index 0000000000..84dca99ec3
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-breathe/python3-breathe/run-ptest
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# These examples compare against XML models generated with doxygen 1.9.x;
+# doxygen 1.18 renders group titles, markdown headings, function pointer
+# members and member ordering differently
+pytest --automake \
+    --deselect "tests/test_examples.py::test_example[class]" \
+    --deselect "tests/test_examples.py::test_example[cpp_function]" \
+    --deselect "tests/test_examples.py::test_example[group]" \
+    --deselect "tests/test_examples.py::test_example[headings]"
diff --git a/meta-python/recipes-devtools/python3-breathe/python3-breathe_5.1.0.bb b/meta-python/recipes-devtools/python3-breathe/python3-breathe_5.1.0.bb
index 102e4f7a9b..d2d8171c85 100644
--- a/meta-python/recipes-devtools/python3-breathe/python3-breathe_5.1.0.bb
+++ b/meta-python/recipes-devtools/python3-breathe/python3-breathe_5.1.0.bb
@@ -6,6 +6,10 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=9e49eecf36fc015de7c61a0247df75d6"

 SRC_URI[sha256sum] = "ff56af8bfd0b50ebf10c81a07b8a5739787eb015d26b4ba162b6983d6e17c7c3"

+SRC_URI += "file://0001-tests-accept-docutils-0.23-boolean-attribute-seriali.patch \
+            file://run-ptest \
+           "
+
 inherit pypi python_flit_core ptest ptest-python-pytest

 RDEPENDS:${PN} = "python3-sphinx"
