Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Sync a Google Play store listing — per-locale text and images — between an on-disk tree and Play with `gplay metadata`. Use when editing store listings or screenshots, migrating listing text into version control, localizing a listing, or gating a listing change in CI before it goes live.
.claude/skills/pollyglot-gplay-metadata-sync/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -41% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -39% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -40% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -35% | 0% |
Manage the store front: per-locale listing text and images, kept as an on-disk tree and reconciled with Play. Shared conventions are in gplay-cli-usage.
gplay treats a local ./metadata tree as the desired state and reconciles it with Play (ADR-0011). The loop:
pull → edit on disk → validate (offline) → apply --dry-run → apply --confirmOn disk, text is <locale>/<field>.txt (title, short_description, full_description, video). Images sit under <locale>/images/: a singular slot (icon, featureGraphic, tvBanner, promoGraphic) is <type>.<ext>; a gallery slot (the *Screenshots types) is <type>/1.<ext>…N.<ext> in display order.
metadata pull copies the live Listings into the tree; additive, sopull then apply is a no-op.
metadata validate lints the tree offline (no auth, no network); anyviolation exits 20, so it fits a pre-commit hook or CI gate.
metadata apply reconciles disk → Play, additive by default; --pruneis the destructive opt-in (read apply --help before using it).
metadata list summarizes what is live on Play, per locale.bashgplay metadata pull --dir ./metadata # …edit the .txt files… gplay metadata validate --dir ./metadata # offline lint, exit 20 on error gplay metadata apply --dir ./metadata --dry-run # ONLINE diff, prints per-locale delta gplay metadata apply --dir ./metadata --confirm # publishes, live immediately
apply --dry-run is online and prints the delta; --output json is the diff schema {package, changes[], summary}, so a CI gate is jq -e '.summary.create + .summary.update > 0'. The real apply is --confirm-gated and atomic: one Edit, any locale failure publishes nothing.
Every file gplay reads or writes under --dir must resolve inside the repo once symlinks are followed: a title.txt symlinked to a file outside the tree, or a pre-placed link where pull will write, is refused. Locale names are checked in BCP 47 (en-US, not en_US) before an Edit opens. Monorepos that share translations or assets through symlinks can set GPLAY_ALLOW_EXTERNAL_SYMLINKS=1: symlink egress is then followed, one NOTE per outbound path on stderr, while a .. escape and any path derived from API data (a locale Play returns, a package name) stay contained regardless.
bashgplay metadata images list --package com.example.app gplay metadata images list --type icon # one image type, all locales gplay metadata images pull --dir ./metadata gplay metadata images validate --dir ./metadata # offline lint, exit 20 on error gplay metadata images apply --dir ./metadata --dry-run # ONLINE per-slot delta gplay metadata images apply --dir ./metadata --confirm # publishes, live immediately
metadata images follows the same loop for per-locale image slots (ADR-0013):
images list walks the 9 slot types across every locale; --type narrowsto one.
images validate is the same offline lint, exit 20.images apply is additive like the text side; --prune deletes online-onlyimages (destructive, --confirm); --locale/--type scope the run.
> 0' over apply --dry-run --output json ({package, slots], summary}).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,587 | 11,302 | -45% | 1 | 1 | 0% | 3,183 | 1,879 | -41% | 0 | 0 | — |
case-02 | fail→pass | 65,279 | 7,170 | -89% | 1 | 1 | 0% | 3,458 | 2,093 | -39% | 0 | 0 | — |
case-03 | fail→pass | 22,801 | 11,261 | -51% | 1 | 1 | 0% | 2,786 | 1,985 | -29% | 0 | 0 | — |
case-04 | fail→pass | 118,734 | 9,734 | -92% | 1 | 1 | 0% | 2,245 | 1,337 | -40% | 0 | 0 | — |
case-05 | pass→pass | 24,726 | 5,056 | -80% | 1 | 1 | 0% | 1,830 | 1,625 | -11% | 0 | 0 | — |
case-06 | fail→pass | 22,467 | 5,921 | -74% | 1 | 1 | 0% | 2,550 | 1,670 | -35% | 0 | 0 | — |
case-07 | pass→pass | 17,602 | 7,550 | -57% | 1 | 1 | 0% | 2,252 | 2,023 | -10% | 0 | 0 | — |
case-08 | pass→pass | 12,323 | 9,879 | -20% | 1 | 1 | 0% | 1,764 | 2,025 | +15% | 0 | 0 | — |
case-09 | fail→pass | 54,101 | 11,601 | -79% | 1 | 1 | 0% | 3,377 | 1,688 | -50% | 0 | 0 | — |
case-10 | fail→pass | 17,096 | 10,771 | -37% | 1 | 1 | 0% | 2,021 | 1,541 | -24% | 0 | 0 | — |
case-11 | fail→pass | 20,692 | 8,233 | -60% | 1 | 1 | 0% | 2,259 | 1,650 | -27% | 0 | 0 | — |
case-12 | fail→pass | 13,856 | 8,507 | -39% | 1 | 1 | 0% | 1,973 | 1,730 | -12% | 0 | 0 | — |
case-13 | pass→pass | 20,038 | 11,807 | -41% | 1 | 1 | 0% | 1,983 | 1,982 | -0% | 0 | 0 | — |
case-14 | pass→pass | 25,768 | 10,049 | -61% | 1 | 1 | 0% | 2,144 | 1,684 | -21% | 0 | 0 | — |
case-15 | pass→pass | 14,245 | 9,849 | -31% | 1 | 1 | 0% | 1,897 | 1,470 | -23% | 0 | 0 | — |
case-16 | fail→pass | 19,424 | 6,190 | -68% | 1 | 1 | 0% | 2,070 | 1,502 | -27% | 0 | 0 | — |
case-17 | fail→pass | 28,831 | 17,306 | -40% | 1 | 1 | 0% | 2,522 | 1,904 | -25% | 0 | 0 | — |
case-18 | fail→pass | 21,289 | 10,165 | -52% | 1 | 1 | 0% | 2,349 | 1,784 | -24% | 0 | 0 | — |
case-19 | pass→pass | 35,841 | 7,846 | -78% | 1 | 1 | 0% | 1,759 | 1,238 | -30% | 0 | 0 | — |
case-20 | pass→pass | 19,786 | 10,939 | -45% | 1 | 1 | 0% | 1,739 | 1,861 | +7% | 0 | 0 | — |
case-21 | fail→pass | 22,330 | 23,831 | +7% | 1 | 1 | 0% | 2,386 | 2,387 | +0% | 0 | 0 | — |
case-22 | pass→pass | 22,589 | 26,639 | +18% | 1 | 1 | 0% | 2,667 | 2,917 | +9% | 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 | 9/7/2026 | +64% |
| gemini-3.6-flash | verified | 8/23/2026 | +61% |
| gemini-3.6-flash | verified | 8/4/2026 | +35% |
Other measured skills in the registry, with their headline benchmark lift.