Updates are agent steps: --yes ships an update of a live app (Play production, App Store submit / release) without an owner gate; the first release stays the owner's (exit 3 OWNER_STEP, --first-release); apple release is a ship step

This commit is contained in:
CRTkafa 2026-10-26 18:09:50 +07:00
parent c247b7e54a
commit ae9d26d3f6
28 changed files with 562 additions and 44 deletions

View file

@ -1515,3 +1515,21 @@ that fails without the fix (see CONTRIBUTING.md).
- **Guard:** `cli/lib/broker.ts` (config, key file mode, token cache and single flight, grants, preflight, redaction),
`cli/lib/google-auth.ts` `playToken` (broker first, local key fallback), `cli/lib/google-access.ts` (403 ->
GoogleAccessError, no retry), `tests/credential-broker.test.ts` (a local fake broker).
## 123. Updates are agent steps: a pipeline could not ship a production update without the owner
- **Symptom:** a CI pipeline shipping a new version of an app that was long on the store was told that production is
"the owner's" (an AAB to production refused with "play upload is for testing tracks ... the owner sends it"), though
the owner's rule is that updates of a live app ship end to end without a confirmation per update.
- **Do:** an update is read from the store (Play: the production track holds a completed / inProgress / halted release;
App Store: a version of the platform is or was READY_FOR_SALE) and runs with `--yes`, in a terminal or a pipeline:
`storebound play release <aab> --production completed --yes` (or `--production inProgress --fraction 0.05`, or
`play upload --track production --yes`), `storebound apple submit --build <n> --yes`, `storebound apple release
--manual-release --yes`; `--json` / `--result-file` give the ship-step result (`releaseKind: "update"`), a re-run is
exit 7. Only the first-ever release of an app is the owner's: exit 3 `OWNER_STEP` "first release of this app", approved
once (`--first-release` after the owner's yes, or bypass mode). Removal from sale and live prices keep their own gates.
- **Never:** tell the owner to press a button for an update, pass `--first-release` without the owner's yes, or decide
update-or-first from the config instead of the store.
- **Guard:** `cli/lib/release-kind.ts` (the kind from the store, the policy), `tests/update-gate.test.ts` (fake stores:
update goes through, first release is exit 3, already there is exit 7), docs/bypass.md "Updates are agent steps".