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 | -37% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -45% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -67% | 0% |
gplay recovery force-updates the users stuck on a bad versionCode to a safe version. Shared conventions are in gplay-cli-usage. The whole namespace is [experimental].
A recovery is keyed by package + versionCode, lives outside the Edit model (no editId), and follows a draft → active → canceled lifecycle.
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
add-targeting is append-only; shrinking means cancel then a fresh create. Start with the narrowest audience (--regions/--sdk-levels) that covers the incident.
list is the only read (there is no view): it is how you find an appRecoveryId and its status. cancel is terminal: the action persists as CANCELED; to target users again, create a new recovery.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 42,368 | 9,398 | -78% | 1 | 1 | 0% | 1,495 | 938 | -37% | 0 | 0 | — |
case-02 | fail→pass | 19,315 | 8,006 | -59% | 1 | 1 | 0% | 1,365 | 746 | -45% | 0 | 0 | — |
case-03 | fail→pass | 15,771 | 9,855 | -38% | 1 | 1 | 0% | 1,770 | 1,259 | -29% | 0 | 0 | — |
case-04 | pass→pass | 44,974 | 27,749 | -38% | 1 | 1 | 0% | 2,149 | 1,729 | -20% | 0 | 0 | — |
case-05 | fail→pass | 16,629 | 24,529 | +48% | 1 | 1 | 0% | 1,804 | 1,573 | -13% | 0 | 0 | — |
case-06 | pass→fail | 13,533 | 8,333 | -38% | 1 | 1 | 0% | 1,024 | 1,771 | +73% | 0 | 0 | — |
case-07 | fail→pass | 24,366 | 8,994 | -63% | 1 | 1 | 0% | 2,971 | 994 | -67% | 0 | 0 | — |
case-08 | pass→pass | 15,582 | 10,797 | -31% | 1 | 1 | 0% | 1,518 | 1,221 | -20% | 0 | 0 | — |
case-09 | fail→pass | 15,310 | 7,688 | -50% | 1 | 1 | 0% | 1,685 | 727 | -57% | 0 | 0 | — |
case-10 | fail→pass | 13,516 | 9,548 | -29% | 1 | 1 | 0% | 1,391 | 905 | -35% | 0 | 0 | — |
case-11 | fail→pass | 9,103 | 5,586 | -39% | 1 | 1 | 0% | 1,470 | 1,157 | -21% | 0 | 0 | — |
case-12 | pass→pass | 10,630 | 8,124 | -24% | 1 | 1 | 0% | 1,316 | 891 | -32% | 0 | 0 | — |
case-13 | fail→pass | 18,132 | 3,889 | -79% | 1 | 1 | 0% | 2,947 | 714 | -76% | 0 | 0 | — |
case-14 | pass→pass | 10,121 | 10,442 | +3% | 1 | 1 | 0% | 1,499 | 1,172 | -22% | 0 | 0 | — |
case-15 | fail→pass | 13,994 | 8,715 | -38% | 1 | 1 | 0% | 2,281 | 774 | -66% | 0 | 0 | — |
case-16 | fail→pass | 18,848 | 3,646 | -81% | 1 | 1 | 0% | 1,958 | 868 | -56% | 0 | 0 | — |
case-17 | pass→pass | 21,924 | 2,995 | -86% | 1 | 1 | 0% | 1,739 | 721 | -59% | 0 | 0 | — |
case-18 | fail→pass | 15,190 | 3,175 | -79% | 1 | 1 | 0% | 1,346 | 881 | -35% | 0 | 0 | — |
case-19 | pass→pass | 6,807 | 4,169 | -39% | 1 | 1 | 0% | 897 | 657 | -27% | 0 | 0 | — |
case-20 | fail→pass | 14,998 | 9,380 | -37% | 1 | 1 | 0% | 2,363 | 930 | -61% | 0 | 0 | — |
case-21 | fail→pass | 17,185 | 3,457 | -80% | 1 | 1 | 0% | 2,422 | 843 | -65% | 0 | 0 | — |
case-22 | fail→pass | 18,969 | 8,261 | -56% | 1 | 1 | 0% | 2,294 | 797 | -65% | 0 | 0 | — |
case-23 | fail→pass | 12,927 | 9,413 | -27% | 1 | 1 | 0% | 1,371 | 808 | -41% | 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. 23 cases were attempted. The headline lift of +65 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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/23/2026 | +59% |
| gemini-3.6-flash | verified | 8/4/2026 | +70% |
Other measured skills in the registry, with their headline benchmark lift.