Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Ship Android releases through Google Play with `gplay releases`. Use when uploading an AAB or legacy APK to a track, promoting a build up the internal → alpha → beta → production ladder, steering a staged rollout (rollout / halt / resume / complete), inspecting a track's releases, downloading the signed APKs Play generates, attaching ProGuard/R8 mappings for vitals symbolication, sharing a private Internal App Sharing build, or managing legacy OBB expansion files.
.claude/skills/pollyglot-gplay-release-flow/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -5% | 0% |
Drive the Google Play release lifecycle with gplay releases: upload a build to a track, promote it up the ladder, run a staged rollout on production (halt / resume / complete it), and list what a track holds.
Shared conventions are in gplay-cli-usage; onboarding auth is gplay-setup.
A build is uploaded to one track (internal, alpha, beta, production, or any custom closed-track name) and then promoted up the ladder: the same versionCode, no AAB re-upload. On a track, the latest release moves through a small state machine:
draft ──► inProgress (userFraction f) ──► completed (f = 1.0)
│ ▲
halt│ │resume
▼ │
halted (fraction preserved)rollout sets the fraction, halt freezes it, resume un-freezes it, and complete ramps to 100%. When a track holds two releases (e.g. inProgress plus halted), every verb refuses to guess (exit 60): pin one with --version-code or --release-name.
bashgplay releases upload ./app.aab --track internal gplay releases upload ./app.aab --track production --staged 0.1 --confirm gplay releases upload ./app.aab --track production --complete --confirm
Any string is a valid --track, but the track must already exist (see Track must exist first below). Flags: gplay releases upload --help.
AAB/APK uploads are resumable: a transient interruption resumes instead of restarting from zero. Automatic, no flag.
upload also takes a legacy .apk ([experimental], same pipeline; --format apk|bundle overrides an ambiguous extension).
Before any byte leaves, gplay checks the artifact by structure (container format plus declared package name), whatever its extension says: a mismatch fails offline with exit 20, no Edit opened. An unreadable manifest degrades to a stderr NOTE and the upload proceeds. --dry-run reports the result; --mapping passes unchecked. Same guard on every artifact upload.
Name release-notes files in BCP 47 (en-US.txt): an underscore form (en_US.txt) is refused before the Edit opens, every offending file in one error.
bashgplay releases promote --from internal --to alpha gplay releases promote --from beta --to production --staged 0.1 --confirm
These four act on the latest release of --track.
bashgplay releases rollout --track production --to 0.25 --confirm # set fraction → inProgress gplay releases halt --track production --confirm # freeze at current fraction gplay releases resume --track production --confirm # un-freeze, continue gplay releases complete --track production --confirm # ramp to 1.0 → completed
bashgplay releases list --track production gplay releases list --track production --output json gplay releases list --track production --columns name,status,userFraction
releases list shows every release on one track; cross-track views are gplay-tracks. releases artifacts list ([experimental]) lists every APK/AAB attached to the app with the versionCode promote and rollout accept:
bashgplay releases artifacts list --kind bundle
generated ([experimental]) lists and downloads the APKs Play signs and serves from your bundle: verify the signing identity, sideload, archive.
bashgplay releases generated list --version-code 42 gplay releases generated download <downloadId> --version-code 42 --dest ./universal.apk
Read a fresh Download ID from list each time: it changes across re-generation. A failed download leaves no partial file.
bash# With the artifact, in the same Edit (the common case): gplay releases upload ./app.aab --track production --mapping ./mapping.txt --confirm # After the fact, on an already-published versionCode: gplay releases mappings upload ./mapping.txt --version-code 42
Symbolicated stacks are read in gplay-vitals.
bashgplay releases sharing upload ./app.aab # prints a private downloadUrl gplay releases sharing upload ./app.aab --dry-run
releases sharing upload ([experimental]) bypasses tracks and the Edit lifecycle: a private QA link, not a release. No --confirm.
APK-only, legacy. When the task touches .obb files, read obb.md.
Production defaults to a draft (ADR-0002): --complete / --staged there, and every rollout verb on production, reach real users, so each requires --confirm.
upload/promote to a custom track that does not exist fails with exit 30 and names the fix: gplay tracks create <name> (see gplay-tracks), then re-run. Creating a track is always that explicit step; the standard tracks always exist.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 12,695 | 8,377 | -34% | 1 | 1 | 0% | 1,237 | 1,738 | +41% | 0 | 0 | — |
case-02 | fail→pass | 18,507 | 8,582 | -54% | 1 | 1 | 0% | 1,113 | 1,685 | +51% | 0 | 0 | — |
case-03 | fail→pass | 14,540 | 2,859 | -80% | 1 | 1 | 0% | 1,112 | 1,643 | +48% | 0 | 0 | — |
case-04 | fail→pass | 12,689 | 18,107 | +43% | 1 | 1 | 0% | 1,356 | 1,735 | +28% | 0 | 0 | — |
case-05 | fail→pass | 14,015 | 8,726 | -38% | 1 | 1 | 0% | 1,812 | 1,716 | -5% | 0 | 0 | — |
case-06 | fail→pass | 13,168 | 7,428 | -44% | 1 | 1 | 0% | 1,035 | 1,618 | +56% | 0 | 0 | — |
case-07 | fail→fail | 12,489 | 5,325 | -57% | 1 | 1 | 0% | 971 | 1,593 | +64% | 0 | 0 | — |
case-08 | fail→pass | 11,909 | 8,355 | -30% | 1 | 1 | 0% | 1,336 | 1,792 | +34% | 0 | 0 | — |
case-09 | fail→pass | 25,479 | 13,852 | -46% | 1 | 1 | 0% | 3,472 | 1,914 | -45% | 0 | 0 | — |
case-10 | fail→pass | 32,780 | 7,277 | -78% | 1 | 1 | 0% | 1,548 | 1,612 | +4% | 0 | 0 | — |
case-11 | fail→pass | 18,589 | 27,199 | +46% | 1 | 1 | 0% | 1,889 | 1,621 | -14% | 0 | 0 | — |
case-12 | fail→pass | 21,622 | 8,221 | -62% | 1 | 1 | 0% | 2,556 | 1,738 | -32% | 0 | 0 | — |
case-13 | fail→fail | 17,508 | 7,502 | -57% | 1 | 1 | 0% | 1,924 | 1,636 | -15% | 0 | 0 | — |
case-14 | fail→pass | 11,404 | 9,629 | -16% | 1 | 1 | 0% | 1,220 | 2,037 | +67% | 0 | 0 | — |
case-15 | fail→pass | 15,582 | 8,338 | -46% | 1 | 1 | 0% | 1,948 | 1,738 | -11% | 0 | 0 | — |
case-16 | pass→pass | 28,294 | 8,278 | -71% | 1 | 1 | 0% | 1,701 | 1,766 | +4% | 0 | 0 | — |
case-17 | fail→pass | 83,090 | 5,857 | -93% | 1 | 1 | 0% | 2,551 | 1,874 | -27% | 0 | 0 | — |
case-18 | pass→pass | 19,999 | 12,988 | -35% | 1 | 1 | 0% | 1,640 | 1,801 | +10% | 0 | 0 | — |
case-19 | pass→pass | 27,036 | 8,505 | -69% | 1 | 1 | 0% | 1,818 | 1,697 | -7% | 0 | 0 | — |
case-20 | fail→fail | 28,799 | 10,234 | -64% | 1 | 1 | 0% | 1,806 | 2,068 | +15% | 0 | 0 | — |
case-21 | fail→fail | 15,589 | 4,382 | -72% | 1 | 1 | 0% | 1,601 | 1,702 | +6% | 0 | 0 | — |
case-22 | fail→pass | 61,794 | 14,144 | -77% | 1 | 1 | 0% | 2,119 | 2,275 | +7% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +68 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 9/8/2026 | +71% |
| gemini-3.6-flash | verified | 8/24/2026 | +64% |
| gemini-3.6-flash | verified | 8/4/2026 | +59% |
Other measured skills in the registry, with their headline benchmark lift.