diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg
index 9cb1c69..d2d1914 100644
--- a/frontend/public/favicon.svg
+++ b/frontend/public/favicon.svg
@@ -15,7 +15,10 @@
Colours are theme tokens (frontend/src/theme/fabled-tokens.js): obsidian
plate, accent gold. The plate is kept here (unlike logo.svg) so the tab
icon is self-contained against any browser chrome; on the nav it is
- invisible because it matches --fc-chrome-rgb exactly. -->
+ invisible because it matches the fc-chrome-rgb custom property exactly.
+ No double hyphen may appear inside this comment: XML forbids it, and a
+ browser refuses to render an SVG that does not parse (it happened once —
+ tests/test_public_svgs.py). -->
diff --git a/tests/test_public_svgs.py b/tests/test_public_svgs.py
new file mode 100644
index 0000000..7e1ff87
--- /dev/null
+++ b/tests/test_public_svgs.py
@@ -0,0 +1,40 @@
+"""Every SVG the browser loads from `frontend/public/` must parse as XML.
+
+A browser renders an SVG used as an image only if it is well-formed XML, and
+when it is not, nothing reports it: no console error in most browsers, no
+failed build, no failed request — the icon is simply blank. `favicon.svg`
+shipped that way (merge #251) because its comment contained a CSS custom
+property name, and `--` is illegal inside an XML comment. Both the tab icon and
+the nav brand mark went missing, and only a person looking at the page noticed.
+"""
+from __future__ import annotations
+
+import xml.etree.ElementTree as ET
+from pathlib import Path
+
+import pytest
+
+PUBLIC = Path(__file__).resolve().parent.parent / "frontend" / "public"
+SVGS = sorted(PUBLIC.rglob("*.svg"))
+
+
+def test_the_public_dir_has_svgs_to_check():
+ """Guards the guard: a moved directory would otherwise pass vacuously."""
+ assert {p.name for p in SVGS} >= {"favicon.svg", "logo.svg"}
+
+
+@pytest.mark.parametrize("svg", SVGS, ids=lambda p: p.name)
+def test_svg_is_well_formed_xml(svg):
+ root = ET.parse(svg).getroot()
+ assert root.tag == "{http://www.w3.org/2000/svg}svg"
+
+
+def test_the_parser_rejects_the_shape_that_broke_the_favicon():
+ """Positive control: the exact defect must fail this parser, or the
+ parametrized test above proves nothing."""
+ broken = (
+ '"
+ )
+ with pytest.raises(ET.ParseError):
+ ET.fromstring(broken)