$npx -y skills add hanamizuki/solopreneur --skill gplay-testers-orchestrationManage testers for Google Play testing tracks (internal, closed alpha/beta, custom) using edit sessions. Use when assigning testers, creating closed tracks, or promoting builds between tracks.
| 1 | # Testers Orchestration for Google Play |
| 2 | |
| 3 | Use this skill to assign testers to a track and promote builds through the |
| 4 | testing funnel. All tester changes happen inside an **edit session** and take |
| 5 | effect only after `gplay edits commit`. |
| 6 | |
| 7 | ## Testing tracks |
| 8 | |
| 9 | | Track | Type | Max testers | Review | Access | |
| 10 | |-------|------|-------------|--------|--------| |
| 11 | | `internal` | Internal | 100 | No | Instant | |
| 12 | | `alpha` | **Closed** testing | Unlimited | No | Minutes | |
| 13 | | `beta` | Open or closed testing | Unlimited | No/Yes | Minutes | |
| 14 | | custom track | Closed testing | Unlimited | No | Minutes | |
| 15 | | `production` | Public | Unlimited | Yes | Days | |
| 16 | |
| 17 | `alpha` is a **closed** track (invite-only), not public. Testers on internal |
| 18 | and closed tracks are managed by email address or by Google Group. |
| 19 | |
| 20 | ## Tester commands |
| 21 | |
| 22 | `gplay testers` has only three subcommands. There is **no `testers list`** — to |
| 23 | list the testers on a track, use `testers get`. |
| 24 | |
| 25 | - `gplay testers get` — read the testers on a track. |
| 26 | - `gplay testers update` — **replace** the entire tester set (emails/groups not |
| 27 | included are removed). |
| 28 | - `gplay testers patch` — **merge** with the existing set (preserves fields you |
| 29 | omit). |
| 30 | |
| 31 | ### List (get) testers for a track |
| 32 | |
| 33 | ```bash |
| 34 | gplay testers get \ |
| 35 | --package com.example.app \ |
| 36 | --edit $EDIT_ID \ |
| 37 | --track alpha |
| 38 | ``` |
| 39 | |
| 40 | ### Assign testers (replace the whole set) |
| 41 | |
| 42 | ```bash |
| 43 | gplay testers update \ |
| 44 | --package com.example.app \ |
| 45 | --edit $EDIT_ID \ |
| 46 | --track alpha \ |
| 47 | --emails "tester1@example.com,tester2@example.com" |
| 48 | ``` |
| 49 | |
| 50 | By Google Group instead of individual emails: |
| 51 | |
| 52 | ```bash |
| 53 | gplay testers update \ |
| 54 | --package com.example.app \ |
| 55 | --edit $EDIT_ID \ |
| 56 | --track alpha \ |
| 57 | --google-groups "beta-testers@example.com,qa-team@example.com" |
| 58 | ``` |
| 59 | |
| 60 | ### Add testers without dropping existing ones (patch) |
| 61 | |
| 62 | ```bash |
| 63 | gplay testers patch \ |
| 64 | --package com.example.app \ |
| 65 | --edit $EDIT_ID \ |
| 66 | --track alpha \ |
| 67 | --emails "newtester@example.com" |
| 68 | ``` |
| 69 | |
| 70 | ### Remove a tester (update = replace with the reduced set) |
| 71 | |
| 72 | `update` replaces the resource, so re-send only the testers you want to keep: |
| 73 | |
| 74 | ```bash |
| 75 | CURRENT=$(gplay testers get --package com.example.app --edit $EDIT_ID --track alpha \ |
| 76 | | jq -r '.testers[]?') |
| 77 | KEEP=$(echo "$CURRENT" | grep -v "user@example.com" | paste -sd "," -) |
| 78 | |
| 79 | gplay testers update \ |
| 80 | --package com.example.app \ |
| 81 | --edit $EDIT_ID \ |
| 82 | --track alpha \ |
| 83 | --emails "$KEEP" |
| 84 | ``` |
| 85 | |
| 86 | ## Assign testers inside an edit session (canonical flow) |
| 87 | |
| 88 | Tester assignment is **not** a flag on `gplay release`. There is no `--testers` |
| 89 | flag anywhere. The real flow is an edit session: |
| 90 | |
| 91 | ```bash |
| 92 | # 1. Create an edit |
| 93 | EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id') |
| 94 | |
| 95 | # 2. Upload the build |
| 96 | gplay bundles upload \ |
| 97 | --package com.example.app \ |
| 98 | --edit $EDIT_ID \ |
| 99 | --file app-release.aab |
| 100 | |
| 101 | # 3. Assign the release to the track |
| 102 | gplay tracks update \ |
| 103 | --package com.example.app \ |
| 104 | --edit $EDIT_ID \ |
| 105 | --track alpha \ |
| 106 | --releases '[{"versionCodes":["123"],"status":"completed"}]' |
| 107 | |
| 108 | # 4. Assign testers to the track |
| 109 | gplay testers update \ |
| 110 | --package com.example.app \ |
| 111 | --edit $EDIT_ID \ |
| 112 | --track alpha \ |
| 113 | --emails "tester1@example.com,tester2@example.com" |
| 114 | |
| 115 | # 5. Commit (nothing applies until this succeeds) |
| 116 | gplay edits commit --package com.example.app --edit $EDIT_ID |
| 117 | ``` |
| 118 | |
| 119 | ## Create a closed testing track |
| 120 | |
| 121 | Custom closed tracks are created inside an edit, then get testers assigned the |
| 122 | same way: |
| 123 | |
| 124 | ```bash |
| 125 | EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id') |
| 126 | |
| 127 | gplay tracks create \ |
| 128 | --package com.example.app \ |
| 129 | --edit $EDIT_ID \ |
| 130 | --track qa-ring |
| 131 | |
| 132 | gplay testers update \ |
| 133 | --package com.example.app \ |
| 134 | --edit $EDIT_ID \ |
| 135 | --track qa-ring \ |
| 136 | --emails "qa1@example.com,qa2@example.com" |
| 137 | |
| 138 | gplay edits commit --package com.example.app --edit $EDIT_ID |
| 139 | ``` |
| 140 | |
| 141 | ## Promote a build between tracks |
| 142 | |
| 143 | Promotion copies the source track's version codes to a destination track. |
| 144 | `--rollout` is a **fraction** (0.0–1.0), not a percentage: |
| 145 | |
| 146 | ```bash |
| 147 | # Internal -> closed alpha |
| 148 | gplay promote --package com.example.app --from internal --to alpha |
| 149 | |
| 150 | # Closed beta -> production at 10% staged rollout |
| 151 | gplay promote --package com.example.app --from beta --to production --rollout 0.1 |
| 152 | ``` |
| 153 | |
| 154 | ## Agent behavior |
| 155 | |
| 156 | - There is no `testers list` subcommand; use `gplay testers get --track <track>` to read a track's testers. |
| 157 | - Never pass `--testers` to `gplay release`; assign testers via `testers |
| 158 | update`/`patch` inside an edit, then commit. |
| 159 | - Use `update` to set the exact tester set, `patch` to add without removing. |
| 160 | - `--rollout` values are fractions (0.1 = 10%), range 0.0–1.0. |
| 161 | - Always `gplay edits commit` — tester changes are inert until committed. |
| 162 | - Confirm flags with `--help` before running. |