diff --git a/.github/workflows/bot-serving-check.yml b/.github/workflows/bot-serving-check.yml
index 6b3e3e23a1..4eff940ee3 100644
--- a/.github/workflows/bot-serving-check.yml
+++ b/.github/workflows/bot-serving-check.yml
@@ -65,7 +65,12 @@ jobs:
}
# Bot path: prerendered per-route HTML from the seo-proxy
- check "$GOOGLEBOT" "$ORIGIN/" "
anyplot.ai"
+ # Prefix, not the full title: the copy changed to "anyplot.ai —
+ # AI-generated plot catalog for 15 libraries" and this check went red
+ # for ten consecutive days without anyone noticing. The prefix still
+ # separates the prerendered page from the SPA shell, whose title is
+ # "any.plot() — any library.", which is the property under test.
+ check "$GOOGLEBOT" "$ORIGIN/" "anyplot.ai"
check "$GOOGLEBOT" "$ORIGIN/scatter-basic" "Basic Scatter Plot | anyplot.ai"
check "$TWITTERBOT" "$ORIGIN/scatter-basic/python/matplotlib" "Basic Scatter Plot - Matplotlib | anyplot.ai"
@@ -108,6 +113,12 @@ jobs:
slash_target=$(curl -sS --max-time 30 -o /dev/null -A "$GOOGLEBOT" \
-w '%{redirect_url}' "$ORIGIN/scatter-basic/")
case "$slash_target" in
+ "")
+ # No redirect at all: %{redirect_url} is empty, which the previous
+ # form printed as "OK: trailing slash -> " and passed. Copilot
+ # raised this twice; it means the rewrite has disappeared.
+ echo "::error::trailing slash produced no redirect — the rewrite is gone"
+ fail=1 ;;
*"/seo-proxy"*|http://*|*:8080/*)
echo "::error::trailing-slash redirect leaks or downgrades: $slash_target"
fail=1 ;;
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 83c2fc8df5..2954449d23 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -232,6 +232,16 @@ aggregate instead: an italic *Catalog* line at the end of the version section an
### Fixed
+- **The daily bot-serving monitor had been red for ten days** — it greps for an exact home-page
+ title, the copy changed to "anyplot.ai — AI-generated plot catalog for 15 libraries", and every
+ scheduled run since 2026-08-09 failed on that one line. Nothing else was wrong, and nobody looked:
+ this run of SEO work edited the workflow twice and cited it repeatedly as the regression cover for
+ changes that have no local verification loop, while it was failing daily. It now matches on the
+ prefix, which still separates the prerendered page from the SPA shell — the property actually
+ under test — and no longer breaks on copy. The trailing-slash check also no longer passes when
+ there is no redirect at all: an empty `%{redirect_url}` printed "OK" and returned success, which
+ Copilot raised on two separate PRs (#10478).
+
- **The trailing-slash redirect leaked the internal port** — #10473 removed a redirect to
`http://api.anyplot.ai/seo-proxy/…` and replaced it with `http://anyplot.ai:8080/…`: a smaller
version of the same defect, since nginx builds a `permanent` rewrite's Location from