Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Drive Google Play app recovery actions with gplay `recovery` — the incident-response remediation that force-updates users stuck on a bad release to a safe version. Use when a shipped build is broken and you need to push affected users off it, or to inspect and steer an existing recovery (deploy, widen targeting, cancel).
.claude/skills/pollyglot-gplay-recovery/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -50% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -32% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -27% | 0% |
gplay recovery manages app recovery actions, Google's targeted incident-response remediation. When a shipped versionCode turns out to be bad, a recovery force-updates the impacted users to a safe version via a remote in-app update. Shared conventions (auth, output, exit codes, --dry-run/--confirm, --package pinning) are in gplay-cli-usage. The whole namespace is [experimental].
Two structural facts to hold onto:
versionCode, and it lives outside the Edit model(no editId), a recovery has its own appRecoveryId and a draft → active → canceled lifecycle.
--version-code is the bad version, the one users are stuck on that youwant them off.
bash# 1. Stage a DRAFT (harmless, nothing is pushed yet, so no --confirm): gplay recovery create --version-code 431 --all-users gplay recovery create --version-code 431 --regions US,FR # or scope it gplay recovery create --version-code 431 --sdk-levels 30,31 # 2. Inspect the recoveries on that versionCode (find the appRecoveryId): gplay recovery list --version-code 431 # 3. Activate; this force-updates impacted users. Production-impacting: gplay recovery deploy <appRecoveryId> --confirm # 4a. Widen the audience later (append-only, see below): gplay recovery add-targeting <appRecoveryId> --regions DE,ES --confirm # 4b. …or stop it (irreversible): gplay recovery cancel <appRecoveryId> --confirm
create: a harmless draftcreate stages a draft; nothing reaches a user until deploy. Because a draft is harmless it needs no --confirm (use --dry-run to validate inputs with no HTTP call). It requires --version-code and at least one audience selector: --all-users, --regions <CC,CC> (CLDR codes), or --sdk-levels <N,N>. The recovery type defaults to a remote in-app update (--remote-in-app-update, the only type Play models today).
deploy / cancel: the gated writesdeploy <id> activates the draft, the production-impacting step thatforce-pushes users off the bad build. Requires --confirm (missing → exit 3); rehearse with --dry-run.
cancel <id> stops the action: it persists with status CANCELED andcannot be resumed; this is irreversible. Requires --confirm. To target users again after a cancel you must create a new recovery.
GPLAY_READONLY refuses both (exit 4).add-targeting is append-only: it can only widenThe audience of a recovery can be widened but never narrowed. add-targeting <id> adds users/regions/SDK levels (--all-users, --regions, --sdk-levels), requires --confirm, and is append-only at the API level. There is no "remove targeting". To shrink the blast radius, you must cancel the recovery and create a fresh one, plan the initial audience conservatively for exactly this reason.
list, and the missing viewrecovery list --version-code <N> shows each recovery's id, status, and creation time (--version-code required, recoveries are keyed by version). There is no recovery view; the API exposes only list, so list is how you read a recovery's state and find its appRecoveryId. --output json passes ListAppRecoveriesResponse through verbatim.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 10,751 | 5,934 | -45% | 1 | 1 | 0% | 1,845 | 1,904 | +3% | 0 | 0 | — |
case-01 | fail→pass | 17,538 | 33,175 | +89% | 1 | 1 | 0% | 2,981 | 1,490 | -50% | 0 | 0 | — |
case-02 | fail→pass | 10,848 | 2,678 | -75% | 1 | 1 | 0% | 2,019 | 1,380 | -32% | 0 | 0 | — |
case-03 | fail→pass | 9,900 | 20,054 | +103% | 1 | 1 | 0% | 1,453 | 1,384 | -5% | 0 | 0 | — |
case-04 | fail→pass | 11,728 | 34,868 | +197% | 1 | 1 | 0% | 1,890 | 1,809 | -4% | 0 | 0 | — |
case-05 | fail→pass | 12,907 | 3,555 | -72% | 1 | 1 | 0% | 2,093 | 1,535 | -27% | 0 | 0 | — |
case-06 | fail→pass | 16,671 | 3,373 | -80% | 1 | 1 | 0% | 2,946 | 1,525 | -48% | 0 | 0 | — |
case-07 | fail→pass | 19,367 | 2,900 | -85% | 1 | 1 | 0% | 3,137 | 1,398 | -55% | 0 | 0 | — |
case-08 | fail→pass | 19,333 | 4,521 | -77% | 1 | 1 | 0% | 3,313 | 1,699 | -49% | 0 | 0 | — |
case-09 | fail→pass | 9,206 | 3,958 | -57% | 1 | 1 | 0% | 1,473 | 1,570 | +7% | 0 | 0 | — |
case-10 | fail→pass | 10,333 | 23,518 | +128% | 1 | 1 | 0% | 1,666 | 1,484 | -11% | 0 | 0 | — |
case-11 | fail→pass | 5,940 | 3,641 | -39% | 1 | 1 | 0% | 891 | 1,456 | +63% | 0 | 0 | — |
case-12 | fail→pass | 13,247 | 2,999 | -77% | 1 | 1 | 0% | 2,071 | 1,357 | -34% | 0 | 0 | — |
case-13 | pass→pass | 14,216 | 3,229 | -77% | 1 | 1 | 0% | 2,165 | 1,412 | -35% | 0 | 0 | — |
case-14 | pass→pass | 8,362 | 3,276 | -61% | 1 | 1 | 0% | 1,379 | 1,394 | +1% | 0 | 0 | — |
case-15 | pass→pass | 8,088 | 1,895 | -77% | 1 | 1 | 0% | 1,206 | 1,209 | +0% | 0 | 0 | — |
case-16 | pass→pass | 7,082 | 2,687 | -62% | 1 | 1 | 0% | 997 | 1,333 | +34% | 0 | 0 | — |
case-17 | pass→pass | 7,166 | 3,224 | -55% | 1 | 1 | 0% | 1,121 | 1,487 | +33% | 0 | 0 | — |
case-18 | fail→pass | 11,408 | 4,450 | -61% | 1 | 1 | 0% | 1,877 | 1,623 | -14% | 0 | 0 | — |
case-19 | pass→pass | 13,824 | 9,739 | -30% | 1 | 1 | 0% | 2,442 | 2,629 | +8% | 0 | 0 | — |
case-20 | pass→pass | 11,161 | 8,643 | -23% | 1 | 1 | 0% | 1,970 | 2,391 | +21% | 0 | 0 | — |
case-21 | pass→pass | 14,694 | 13,751 | -6% | 1 | 1 | 0% | 2,703 | 3,311 | +22% | 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 +59 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 | 8/4/2026 | +70% |
Other measured skills in the registry, with their headline benchmark lift.