Merge remote-tracking branch 'origin/main' into play-app-record
# Conflicts: # CHANGELOG.md # docs/pitfalls.md # skills/store-pitfalls/SKILL.md
This commit is contained in:
commit
d68028caba
53 changed files with 2551 additions and 305 deletions
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: store-pitfalls
|
||||
description: Known pitfalls with App Store Connect, Google Play and storebound itself, learned from real releases, and what to do about each - store lists that lag right after a create, dry runs that print a count instead of a plan, App Store names taken on a storefront, keyword limits in bytes, Data safety answers without code evidence, missing font glyphs in screenshots, console sign-in and sessions, Capacitor monorepo plugins, Play's Create app form (no API, opener and submit share a name, Free is final), App Privacy purposes over-mapped (Play advertising is Third-Party Advertising only). Read it before any store task, and when a store command does something you did not expect.
|
||||
description: Known pitfalls with App Store Connect, Google Play and storebound itself, learned from real releases, and what to do about each - store lists that lag right after a create, dry runs that print a count instead of a plan, App Store names taken on a storefront, keyword limits in bytes, Data safety answers without code evidence, missing font glyphs in screenshots, console sign-in and sessions, Capacitor monorepo plugins, duplicates from retries, re-runs and parallel runs., Play's Create app form (no API, opener and submit share a name, Free is final), App Privacy purposes over-mapped (Play advertising is Third-Party Advertising only). Read it before any store task, and when a store command does something you did not expect.
|
||||
---
|
||||
|
||||
# Store pitfalls
|
||||
|
|
@ -67,7 +67,23 @@ Each entry: **symptom** → cause → what to do → what guards it now. The ful
|
|||
- **Do:** run `scan` from the project root; check that the stack line lists the plugins.
|
||||
- **Guard:** `storebound scan` and `privacy-manifest` resolve packages through workspace folders too.
|
||||
|
||||
## 9. A new Play app: "Create app" is both the opener and the submit
|
||||
## 9. A second run (or a retry) creates a duplicate
|
||||
- **Symptom:** two in-app purchases or subscription groups with the same name, a screenshot twice in a set, an
|
||||
offer code campaign or a custom product page twice, after a timeout, a crash, a re-run a minute later, or two runs
|
||||
at once.
|
||||
- **Cause:** a POST create retried after a timeout or a 5xx may have been applied the first time; the store's lists lag
|
||||
right after a create, so a re-run does not see what the last run made; two writers race; a Play edit redone after
|
||||
a commit whose answer was lost.
|
||||
- **Do:** just run the command again: every write command is an upsert and converges (`docs/idempotency.md`). Never
|
||||
retry a create by hand (`storebound api`) without a GET first. If a run says another storebound run holds the lock,
|
||||
wait for it; use `--force-unlock` only when that run is really gone. Never run two write commands for the same app
|
||||
in parallel.
|
||||
- **Guard:** `cli/lib/upsert.ts` (findOrCreate: fresh re-check + journal `.storebound/created.json`; createOnce: 409
|
||||
= found, an unclear answer is looked up, never re-sent blindly), retries only for requests that are safe twice,
|
||||
Play edits deleted on every error and never redone after an unclear commit, screenshot / preview sets keep the
|
||||
matching prefix in order, `.storebound/locks/` per app and store. `tests/idempotency.test.ts`.
|
||||
|
||||
## 10. A new Play app: "Create app" is both the opener and the submit
|
||||
- **Symptom:** an agent cannot create the Play app through the API, or clicks "Create app" without knowing whether it
|
||||
opens the form or submits it; or an app goes out as Free and the owner later wants it paid.
|
||||
- **Cause:** the Play Developer API cannot create apps. Play Console's Home has a "Create app" button that opens the
|
||||
|
|
@ -79,7 +95,7 @@ Each entry: **symptom** → cause → what to do → what guards it now. The ful
|
|||
- **Guard:** `createAppAllowed` lets the opener through only on the app list, never inside a form or dialog (English
|
||||
and Turkish); agreement checkboxes are never ticked; Free or paid is outlined as an owner check.
|
||||
|
||||
## 10. App Privacy purposes over-mapped
|
||||
## 11. App Privacy purposes over-mapped
|
||||
- **Symptom:** App Privacy says Developer's Advertising or Marketing for Device ID, Coarse Location, Product Interaction
|
||||
or Performance Data, although the app only shows an ad SDK's ads.
|
||||
- **Cause:** a Play purpose was turned into two Apple purposes ("advertising" -> Third-Party Advertising AND
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue