diff --git a/themes/tsuki/.htmltest.yml b/themes/tsuki/.htmltest.yml
index 33b0149..b1b325c 100644
--- a/themes/tsuki/.htmltest.yml
+++ b/themes/tsuki/.htmltest.yml
@@ -5,8 +5,13 @@ IgnoreInternalEmptyHash: true
IgnoreEmptyHref: false
EnforceHTML5: true
# Strip the /tsuki/ baseURL prefix so links resolve against exampleSite/public/.
+# htmltest's URLSwap is a regex substring match (not anchored), so the leading
+# "^" used previously silently failed against the minified `href=/tsuki/...`
+# outputs in built HTML — every link reported missing. Quoted plain-prefix form
+# matches whatever position /tsuki/ appears in the href, which for our build is
+# always at the start of relative URLs.
URLSwap:
- ^/tsuki/: /
+ "/tsuki/": /
IgnoreURLs:
- "^https://giscus.app"
- "^https://github.com/"
diff --git a/themes/tsuki/exampleSite/static/favicon.svg b/themes/tsuki/exampleSite/static/favicon.svg
new file mode 100644
index 0000000..af447f3
--- /dev/null
+++ b/themes/tsuki/exampleSite/static/favicon.svg
@@ -0,0 +1 @@
+
diff --git a/themes/tsuki/layouts/_partials/head.html b/themes/tsuki/layouts/_partials/head.html
index 7bac76e..1c5fe16 100644
--- a/themes/tsuki/layouts/_partials/head.html
+++ b/themes/tsuki/layouts/_partials/head.html
@@ -49,9 +49,8 @@
{{- end }}
{{- end }}
-{{/* Favicon */}}
-
-
+{{/* Favicon — SVG only; sites can override head.html to add an .ico fallback */}}
+
{{/* Speculation Rules — Chromium prefetch hints; gated, off by default */}}
{{- $prefetch := site.Params.prefetch -}}
diff --git a/themes/tsuki/scripts/smoke-tests.sh b/themes/tsuki/scripts/smoke-tests.sh
index 49a616e..86919b4 100755
--- a/themes/tsuki/scripts/smoke-tests.sh
+++ b/themes/tsuki/scripts/smoke-tests.sh
@@ -70,7 +70,16 @@ assert "BreadcrumbList JSON-LD" '"@type":"BreadcrumbList"' "$p
assert "no breadcrumbs on home" 'class=breadcrumbs' "$home" 0
assert "prev/next nav" 'class=prev-next' "$post"
assert "rel=prev on post" 'rel=prev' "$post"
-assert "linkToSection aria-label" 'class=heading-anchor [^>]*aria-label' "$post"
+# Heading-anchor i18n aria-label must appear somewhere in the build. Pinning to one
+# post is fragile because `$post` is picked by `find | head -1` and short posts
+# without h2/h3/h4 emit no heading-anchor markup.
+anchor_count=$({ grep -roE 'class=heading-anchor [^>]*aria-label' "$public_dir" --include='index.html' || true; } | wc -l)
+if [ "$anchor_count" -lt 1 ]; then
+ echo "::error::FAIL [linkToSection aria-label] expected ≥1 heading-anchor + aria-label across build, got 0"
+ fail=1
+else
+ echo " ok [linkToSection aria-label] ${anchor_count} match(es) across $public_dir"
+fi
assert "no speculationrules by default" 'speculationrules' "$home" 0
# llm.txt artifact