diff --git a/backend/app/indexer/mime.py b/backend/app/indexer/mime.py
index a269cd5..7bab481 100644
--- a/backend/app/indexer/mime.py
+++ b/backend/app/indexer/mime.py
@@ -83,7 +83,14 @@ def _addresses(msg: EmailMessage, header: str) -> list[dict[str, str]]:
def _html_to_text(html: str) -> str:
"""Derive plain text from HTML by stripping all tags (SPEC §6.4 nh3 strip)."""
- return nh3.clean(html, tags=set(), attributes={}, strip_comments=True)
+ return nh3.clean(
+ html,
+ tags=set(),
+ attributes={},
+ strip_comments=True,
+ # The document
is not body text; unwrapped it would lead the snippet.
+ clean_content_tags={"script", "style", "title"},
+ )
def _get_body_content(msg: EmailMessage, subtype: str) -> str | None:
diff --git a/backend/app/indexer/sanitize.py b/backend/app/indexer/sanitize.py
index 0b9526d..189bb19 100644
--- a/backend/app/indexer/sanitize.py
+++ b/backend/app/indexer/sanitize.py
@@ -17,7 +17,7 @@ import nh3
# Bump when the sanitization policy changes; body_parts.sanitizer_v records it so a
# render re-sanitizes stale content from the raw blob (SPEC §10.4).
-SANITIZER_VERSION = 3
+SANITIZER_VERSION = 4
_ALLOWED_TAGS: set[str] = {
# structure
@@ -218,8 +218,10 @@ def sanitize_html(
link_rel="noopener noreferrer nofollow",
strip_comments=True,
# nh3 strips