On Gitea runner v0.3.0 the same push event is dispatched to multiple
workers, creating perpetual duplicate runs. A new first step queries the
Gitea API for the highest run_id for this commit sha; if a newer run
already exists, all subsequent steps are skipped via if-guards, letting
the duplicate complete in ~5 seconds without wasting compute.
- Removed concurrency/cancel-in-progress: on this Gitea runner version
cancelled runs get re-queued causing an infinite restart loop
- Release creation now checks for existing tag first (GET releases/tags/TAG)
and reuses the existing release ID if found, preventing the second
duplicate run from failing with a 409/422 tag-already-exists error
- android-build.yml: fetch full history+tags, embed VITE_APP_BUILD, add step
to create a tagged Gitea release (build-N) with markdown changelog and APK
release assets after every push; bump permissions to contents:write
- src/game/update-check.ts: polls Gitea releases/latest, compares build-N tag
against CURRENT_BUILD (0 in dev), returns UpdateInfo or null; dismissal
persisted to localStorage
- src/vite-env.d.ts: TypeScript env declarations for VITE_APP_BUILD
- src/scenes/MenuScene.ts: fire-and-forget update check on menu load; renders
dismissible bottom-bar banner with optional APK download link
- src/game/ai.ts: early-game empty-table dump heuristic (safest card first)