diff --git a/.github/workflows/app-discovery-qa.yml b/.github/workflows/app-discovery-qa.yml
index 66f2f91c..cea32234 100644
--- a/.github/workflows/app-discovery-qa.yml
+++ b/.github/workflows/app-discovery-qa.yml
@@ -5,12 +5,17 @@ on:
paths:
- apps.html
- index.html
+ - support/brain-burst/index.html
+ - support/snaplingo/index.html
+ - support/face-reaction-battle/index.html
+ - robots.txt
- apps_data.json
- guides/**
- sitemap.xml
- scripts/build_catalog.py
- site_counts.json
- tests/catalog-growth.test.mjs
+ - tests/search-landing-growth.test.mjs
- scripts/publish_app_discovery.sh
- scripts/check_app_discovery_live.sh
- .github/workflows/app-discovery-qa.yml
@@ -19,12 +24,17 @@ on:
paths:
- apps.html
- index.html
+ - support/brain-burst/index.html
+ - support/snaplingo/index.html
+ - support/face-reaction-battle/index.html
+ - robots.txt
- apps_data.json
- guides/**
- sitemap.xml
- scripts/build_catalog.py
- site_counts.json
- tests/catalog-growth.test.mjs
+ - tests/search-landing-growth.test.mjs
- scripts/publish_app_discovery.sh
- scripts/check_app_discovery_live.sh
- .github/workflows/app-discovery-qa.yml
@@ -47,4 +57,4 @@ jobs:
- name: Verify non-destructive release scripts have valid shell syntax
run: bash -n scripts/publish_app_discovery.sh scripts/check_app_discovery_live.sh
- name: Verify search, referral links and guide listings
- run: node --test tests/catalog-growth.test.mjs
+ run: node --test tests/catalog-growth.test.mjs tests/search-landing-growth.test.mjs
diff --git a/docs/APP_DISCOVERY_GROWTH_RELEASE_2026-10-27.md b/docs/APP_DISCOVERY_GROWTH_RELEASE_2026-10-27.md
index 6228163c..b5a452e9 100644
--- a/docs/APP_DISCOVERY_GROWTH_RELEASE_2026-10-27.md
+++ b/docs/APP_DISCOVERY_GROWTH_RELEASE_2026-10-27.md
@@ -18,7 +18,7 @@ bash scripts/publish_app_discovery.sh --apply
bash scripts/check_app_discovery_live.sh
```
-Only these files transfer: `index.html`, `apps.html`, `sitemap.xml`, `guides/quick-games/index.html`, `guides/daily-habits/index.html`. The homepage links are tracked with `discovery_nav_click` and let visitors reach the search or guides without scrolling 92 cards. Every other VPS file, including privacy, support, policy, payment and ads assets, stays untouched. To override environment use `APP_SITE_DEPLOY_HOST` and `APP_SITE_DEPLOY_ROOT` with a known-safe absolute path. The script refuses unknown flags/invalid targets.
+Only these files transfer: `index.html`, `apps.html`, `sitemap.xml`, `robots.txt`, `guides/quick-games/index.html`, `guides/daily-habits/index.html`, `support/brain-burst/index.html`, `support/snaplingo/index.html`, `support/face-reaction-battle/index.html`. The homepage links are tracked with `discovery_nav_click` and let visitors reach the search or guides without scrolling 92 cards. Every other VPS file, including privacy, support, policy, payment and ads assets, stays untouched. To override environment use `APP_SITE_DEPLOY_HOST` and `APP_SITE_DEPLOY_ROOT` with a known-safe absolute path. The script refuses unknown flags/invalid targets.
**Publish gate:** a dry-run is not publication. Only mark live once `check_app_discovery_live.sh` reports HTTP 200 and matches the homepage `discovery-links`, `id="find-app"`, both guide canonical URLs, guide click event and sitemap entries. After manual publication consider Google Search Console URL inspection and sitemap submission if the `appdevelopsk.com` property is available.
@@ -51,3 +51,16 @@ Do not sum the 117 apps' 7-day active-user counts as unique people. Do not inter
- [ ] Sitemap submitted/indexing checked in Search Console
- [ ] GA4 DebugView events observed without search query payload
- [ ] Google Play listing traffic / acquisition comparison recorded after meaningful sample
+
+## GSC-backed snippet and conversion repair (2026-10-27)
+
+A **restricted 3-day finalized GSC window (Oct 22–24)** was available, so do not treat the following as significant performance trends: BrainBurst support 14 impressions / 0 clicks / average position ~9.1; SnapLingo support 10 impressions / 0 clicks / position ~7.4; `face battle` query on Face Reaction Battle page 13 impressions / 1 click / position ~5.9. No prior-period comparison available.
+
+- BrainBurst: correct the stale generic memory/math training synopsis to the Play-aligned daily AI trivia / 1v1 quiz proposition, improve search/snippet and open-graph fields; show Google Play CTA above the fold.
+- SnapLingo: concrete photo vocabulary search snippet and high-visibility store handoff, with app structured data but **no manufactured review stars/rating scores**.
+- Face Reaction Battle is **not downloadable**, so retain unavailability notice. Offer only clearly **different**, verifiably published Instant Judge and Blur games; do not imply they provide face-expression recognition.
+- `robots.txt` now explicitly allows public `/icons/apps/` while continuing to disallow remaining icons. Note indexing is a search engine decision, not guaranteed.
+- Preserve Google Play Install Referrer on each CTA. `download_click` adds `app` and `placement` so support hero CTA and page-details CTA can be compared; avoid raw visitor search content.
+- New `tests/search-landing-growth.test.mjs` and GitHub CI prevent catalog/product mismatches, fabricated ratings, missing store links, and missing live-check assertions.
+
+After shipping the updated **nine** files from a fresh main checkout, run `bash scripts/check_app_discovery_live.sh`. Record the deploy timestamp, then compare **landing impressions/CTR**, **support CTA clicks by placement**, **Play visitors/install**, and **first completed app action** after enough data accumulates. The early data is directional only.
diff --git a/robots.txt b/robots.txt
index 36792838..e14ad01b 100644
--- a/robots.txt
+++ b/robots.txt
@@ -1,6 +1,8 @@
# SK APPS — apex robots.txt
User-agent: *
Allow: /
+# Published catalog app icons must be crawlable for image discovery.
+Allow: /icons/apps/
Disallow: /icons/
# Explicit allow for ad crawlers
diff --git a/scripts/check_app_discovery_live.sh b/scripts/check_app_discovery_live.sh
index 9ae3bce8..1609a852 100644
--- a/scripts/check_app_discovery_live.sh
+++ b/scripts/check_app_discovery_live.sh
@@ -28,4 +28,15 @@ fetch '/sitemap.xml' 'sitemap.xml'
for slug in quick-games daily-habits; do
grep -Fq "https://appdevelopsk.com/guides/$slug/" "$tmp/sitemap.xml" || { echo "FAIL sitemap missing $slug" >&2; exit 1; }
done
-echo 'PASS: VPS catalog, two guides, click-tracking markers and sitemap all current (HTTP 200)'
+for slug in brain-burst snaplingo; do
+ fetch "/support/$slug/" "$slug.html"
+ grep -Fq 'data-position="hero"' "$tmp/$slug.html" || { echo "FAIL $slug first-screen Play CTA not yet live" >&2; exit 1; }
+ grep -Fq 'application/ld+json' "$tmp/$slug.html" || { echo "FAIL $slug SEO metadata missing" >&2; exit 1; }
+ grep -Fq 'placement:' "$tmp/$slug.html" || { echo "FAIL $slug placement attribution missing" >&2; exit 1; }
+done
+fetch '/support/face-reaction-battle/' 'face-battle.html'
+grep -Fq 'data-alternative="instant-judge"' "$tmp/face-battle.html" || { echo 'FAIL unavailable game alternative CTA missing' >&2; exit 1; }
+grep -Fq 'data-alternative="blur"' "$tmp/face-battle.html" || { echo 'FAIL second unavailable game alternative CTA missing' >&2; exit 1; }
+fetch '/robots.txt' 'robots.txt'
+grep -Fq 'Allow: /icons/apps/' "$tmp/robots.txt" || { echo 'FAIL Google image crawl allow not live' >&2; exit 1; }
+echo 'PASS: catalog, guides, priority search landings, store CTAs, icon crawl policy and sitemap current (HTTP 200)'
diff --git a/scripts/publish_app_discovery.sh b/scripts/publish_app_discovery.sh
index bb6abf90..aac41e81 100644
--- a/scripts/publish_app_discovery.sh
+++ b/scripts/publish_app_discovery.sh
@@ -15,7 +15,7 @@ root="${APP_SITE_DEPLOY_ROOT:-/var/www/html}"
if [[ ! "$host" =~ ^[a-zA-Z0-9_.@-]+$ || ! "$root" =~ ^/var/www/[a-zA-Z0-9_./-]+$ ]]; then
echo 'Invalid APP_SITE_DEPLOY_HOST or APP_SITE_DEPLOY_ROOT' >&2; exit 2
fi
-files=(index.html apps.html sitemap.xml guides/quick-games/index.html guides/daily-habits/index.html)
+files=(index.html apps.html sitemap.xml robots.txt guides/quick-games/index.html guides/daily-habits/index.html support/brain-burst/index.html support/snaplingo/index.html support/face-reaction-battle/index.html)
for file in "${files[@]}"; do
[[ -s "$file" ]] || { echo "Missing source file: $file" >&2; exit 2; }
done
diff --git a/sitemap.xml b/sitemap.xml
index bbc387e2..442eab10 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -17,7 +17,7 @@