Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/app-discovery-qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ on:
- scripts/publish_app_discovery.sh
- scripts/check_app_discovery_live.sh
- .github/workflows/app-discovery-qa.yml
- .github/workflows/live-acquisition-smoke.yml
push:
branches: [main]
paths:
Expand All @@ -38,6 +39,7 @@ on:
- scripts/publish_app_discovery.sh
- scripts/check_app_discovery_live.sh
- .github/workflows/app-discovery-qa.yml
- .github/workflows/live-acquisition-smoke.yml
permissions:
contents: read
jobs:
Expand Down
45 changes: 45 additions & 0 deletions .github/workflows/live-acquisition-smoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Live App Acquisition Pages Smoke

on:
workflow_dispatch:
schedule:
# 09:40 JST daily. Scheduled GitHub jobs may run later than cron.
- cron: '40 0 * * *'

permissions:
contents: read

jobs:
verify-live-acquisition:
runs-on: ubuntu-latest
timeout-minutes: 9
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Check actual VPS HTTP pages, Play CTAs, campaign pages, and sitemap
id: verify
shell: bash
run: |
set -euo pipefail
echo 'Checking public appdevelopsk.com, NOT source on GitHub main.'
bash scripts/check_app_discovery_live.sh
- name: Summarize release blockers and recovery
if: failure()
run: |
{
echo '## Production acquisition pages are missing or stale'
echo ''
echo 'Source changes alone do not publish to the VPS. See the failed smoke-test step for the exact route.'
echo ''
echo 'From a current site main checkout with your configured pickly-vps SSH alias:'
echo ''
echo '```bash'
echo 'git pull --ff-only'
echo 'bash scripts/publish_app_discovery.sh --dry-run'
echo 'bash scripts/publish_app_discovery.sh --apply'
echo 'bash scripts/check_app_discovery_live.sh'
echo '```'
echo ''
echo 'No CI step writes to the VPS, updates Google Play, or records fictitious installs.'
} >> "$GITHUB_STEP_SUMMARY"
6 changes: 6 additions & 0 deletions docs/APP_DISCOVERY_GROWTH_RELEASE_2026-10-27.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,9 @@ After shipping the updated **eleven** files from a fresh main checkout, run `bas
- The catalog filter previously included stale app identifiers `flinch` (the published app is `daily-duel`) and `pickwhirl` (published app is `chore-roulette`). Removed stale names and used real catalog identifiers.
- A CI regression now checks every filter slug against the published catalog, including renamed apps, to prevent silent zero-result filters after future renames or delistings. The total listed app count is taken from `site_counts.json`, not a stale hardcoded 92.
- This does **not** create new Google Play installs on its own; the VPS must be updated and the customer conversion funnel measured.

## Read-only production monitoring

The workflow `.github/workflows/live-acquisition-smoke.yml` checks actual HTTPS output every day around **09:40 JST** (GitHub Actions scheduling can be delayed). It reuses `scripts/check_app_discovery_live.sh` and **fails intentionally** if the VPS still serves a stale catalog, stale Play CTA, missing guide or stale sitemap. It only reads the public URLs; it does not deploy, mutate Store metadata, write marketing content or buy ads.

Its failure step explains how to run the existing manual, non-deleting VPS deployment and verify success. GitHub email notifications depend on repo/account settings; a failed workflow alone does not guarantee push or email alerts. Workflow is also manually dispatchable for an operator who wants to verify a completed release.
10 changes: 10 additions & 0 deletions tests/search-landing-growth.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,13 @@ test('public catalog icons are crawlable and explicit VPS release is non-destruc
assert.match(live,/data-position="hero"/);
assert.match(live,/Allow: \/icons\/apps\//);
});

test('daily live acquisition check is read-only, scheduled and fails visibly on stale VPS',()=>{
const workflow=read('.github/workflows/live-acquisition-smoke.yml');
assert.match(workflow,/cron: '40 0 \* \* \*'/);
assert.match(workflow,/workflow_dispatch:/);
assert.match(workflow,/contents: read/);
assert.match(workflow,/bash scripts\/check_app_discovery_live\.sh/);
assert.doesNotMatch(workflow,/publish_app_discovery\.sh --apply\s*\n\s*(?:git|rsync|bash)/);
assert.match(workflow,/if: failure\(\)/);
});
Loading