From an edit to a live update at testover.pages.dev: bump the version and change log, run the tests, commit, push and watch the deploy, with commands you can copy straight into a terminal.
main = deploying. If the change touches docs/, app/, .github/pages/, scripts/build-pages.mjs or README.md, the site is published automatically.The steps in order. If a test fails, loop back and fix it; never push past a red run.
The number on the badge in the bottom-right corner of the site comes from the top entry of CHANGELOG in app/index.html and nowhere else; no other file needs editing.
Same shape as the existing ones, such as 2026.10.17. Use the real release date.
# Today's date = the version
date +%Y.%m.%d # bash / Git Bash
Get-Date -Format yyyy.MM.dd # PowerShell
# See the top entry of CHANGELOG
grep -n "version: '" app/index.html | head -3 # bash
Select-String "version: '" app/index.html | Select-Object -First 3 # PowerShellThe new entry goes at the top; the badge reads the first one. Write each item as a short English sentence (the UI is English), starting with an area such as Docs:, Tests: or Sign-in page:.
const CHANGELOG = [
{ version: '2026.10.18', changes: [
'Docs: added the user journey page (Thai and English)',
'Docs: added the release guide (Thai and English)',
] },
{ version: '2026.10.17', changes: [ /* ... */ ] },
];A version is a date, so it cannot repeat. Add items to that day's entry instead of creating a new one.
Run npm start and open http://localhost:3000. The bottom-right badge must show the new number. Press and hold for about 0.6 seconds (or focus it and press Enter/Space) to open the change log and confirm the new entry is on top.
MASK_VERSION_BADGE) and no test checks the version text. package.json stays at 1.0.0; it is unrelated to the site version.CI repeats these anyway, but running them locally is faster feedback and keeps main green.
# Check state and pull first
git status -sb
git pull --rebase origin mainnpm ci # first time / when package-lock changed
npm run test:unit # unit + contract
npm run test:smoke # main paths
npm run test:characterization # recorded behaviour + golden master
npm run test:visual # screenshot compare (needs Docker running)
npm test # the whole suite (optional, before a big release)
npm run build:pages # try building dist/ as Pages does
Baselines must be generated in Docker so they are Linux like CI (Windows images will not match). Regenerate them and look at the images before committing.
npm run test:visual:update # regenerate baselines in Docker (Linux, same as CI)
git status -sb tests/__screenshots__ # look at the changed images before committing
Test counts change often. Recount before quoting numbers in docs: npx playwright test --list · npm run test:unit
Write commit messages as <type>: <description>, where type is feat, fix, refactor, docs, test, chore, perf or ci.
git status -sb # what changed?
git add app/index.html docs/ .github/pages/ # name the files, no git add -A
git diff --cached --stat # one more look
git commit -m "feat: add the user journey and release guide pages (th/en)"
git push origin main
git add so another task's files or secrets are not swept in. Never commit a webhook URL, CLOUDFLARE_API_TOKEN or .env; those live in GitHub Secrets only. Never git push --force to main.Two workflows start by themselves after a push.
| Workflow | Starts when | What it does |
|---|---|---|
Smoke | every push to main and every PR | unit + contract, smoke, characterization, then uploads the reports |
Publish site | a push to main touching docs/**, app/**, .github/pages/**, scripts/build-pages.mjs, README.md or this workflow file · after Weekend E2E finishes · by hand | builds the site (npm run build:pages), adds the latest reports under /status/, stamps the commit on the hub page and runs wrangler pages deploy |
gh run list --limit 5 # see the runs that just started
gh run watch # pick one and follow it live
gh run list --workflow "Publish site" --limit 3
That is expected: the paths do not match Publish site. Trigger it yourself if you want a deploy:
gh workflow run cloudflare-pages.yml --ref main # deploy by hand (no new commit needed)
gh run watch
curl -sI https://testover.pages.dev/docs/release-guide.html | head -1 # expect 200
git rev-parse --short HEAD # compare with the commit on /status/
/status/ hub shows the deployed commit and the commit the reports came from./docs/<name>.html must return 200 in both Thai and English.The repo needs the secrets CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID (the project name comes from the variable CLOUDFLARE_PROJECT_NAME, default testover).
git revert <sha> # undo one commit without rewriting history
git push origin main # Publish site runs again by itself
Steps 2–4 together (do step 1 by hand first). It stops at the first failing command.
# The full set for a release (Git Bash); edit the commit message first
set -e
git pull --rebase origin main
npm run test:unit && npm run test:smoke && npm run test:characterization
npm run build:pages
git add app/index.html docs/ .github/pages/
git commit -m "feat: <what changed>"
git push origin main
gh run watch
name.html (Thai) and name.en.html (English), with a language switch in the header and footer. Numbers must match.- and . only, otherwise the server answers 404.overview.html / overview.en.html and to .github/pages/index.html.Docs: (see section 1).docs/**, so it triggers the automatic deploy.| Symptom | Likely cause | Fix |
|---|---|---|
| push rejected | main has new commits | git pull --rebase origin main then push again |
| visual test red in CI, green locally | baselines made on Windows/Mac | npm run test:visual:update (Docker) |
| Publish site did not run | changed files are outside the path filter | gh workflow run cloudflare-pages.yml --ref main |
| Deploy step fails with a token/account error | secret missing or expired | reset CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID in Settings → Secrets |
| badge still shows the old version | browser cache, or the new entry is not first | hard refresh and check the order in CHANGELOG |
| reports on /status/ look old | reports come from the latest Weekend E2E run, not this commit | normal; see the report commit on the hub page |
| new doc page 404s | uppercase in the file name, or not deployed yet | rename to lowercase and check the Publish site run |