Gplay recovery
Drive Google Play app recovery actions with gplay `recovery` — the incident-response remediation that force-updates users stuck on a bad release back to a safe version via a remote in-app update. `create` stages a harmless draft; `deploy` activates it (production-impacting); `cancel` stops it (irreversible); `add-targeting` widens the audience (append-only); `list` shows a versionCode's recoveries. Keyed by package + versionCode, outside the Edit model. Use when a shipped build is broken and you need to push affected users off it, or to inspect/steer an existing recovery.From its SKILL.md
npx -y skills add unliftedq/agents --skill gplay-recoveryAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.1 KB, 951 tokens by cl100k_base, as published. Nobody here has run it
gplay recovery (incident response for a bad release)
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:
- Keyed by package +
versionCode, and it lives outside the Edit model (noeditId) — a recovery has its ownappRecoveryIdand a draft → active → canceled lifecycle. --version-codeis the bad version — the one users are stuck on that you want them off.
The lifecycle, in order
# 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 draft
create 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 writes
deploy <id>activates the draft — the production-impacting step that force-pushes users off the bad build. Requires--confirm(missing → exit3); rehearse with--dry-run.cancel <id>stops the action: it persists with statusCANCELEDand cannot be resumed — this is irreversible. Requires--confirm. To target users again after a cancel you must create a new recovery.GPLAY_READONLYrefuses both (exit4).
add-targeting is append-only — it can only widen
The 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 view
recovery 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.
Confirm the current verbs and flags with gplay recovery --help and
gplay recovery <command> --help — the surface is [experimental] (ADR-0030)
and may still evolve.
What ships with it: 1 file
221 B alongside SKILL.md
- .kman-skill.json221 B
Gives 0 of the 12 instructions most ship operate skills give in 951 tokens
Counted across 779 of the 1,178 authors here whose files we hold, read 2026-08-07
- Document a rollback plan before deploymentin 41 of 779, across 22 files
- Update the changelogin 21 of 779, across 19 files
- Run the test suitein 20 of 779
- Create an annotated git tagin 20 of 779
- Clean up feature flags after full rolloutin 18 of 779, across 10 files
- Verify deployment health after launchin 18 of 779, across 10 files
- Test both feature flag statesin 17 of 779, across 9 files
- Verify the working tree is cleanin 17 of 779
- Make database migrations backward-compatiblein 16 of 779, across 8 files
- Set up error monitoring before launchin 15 of 779, across 7 files
- Monitor metrics at each rollout stagein 14 of 779, across 5 files
- Create a GitHub releasein 14 of 779
Said here and by no other author read
- create a draft recovery using the bad version-code
- include at least one audience selector when creating
- list recoveries to find the app recovery id
- confirm before deploying a recovery
- confirm before widening targeting
- cancel recovery to shrink the blast radius
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.