# Changelog ## Unreleased - **Other platforms in store text are refused (both stores).** One checker (`cli/lib/cross-store.ts`) finds Android, Google Play (Games), Play Store, Galaxy Store, Amazon Appstore, Steam, Microsoft Store, AppGallery (and localized forms) in App Store text (Guideline 2.3.10) and iOS, iPhone, iPad, App Store, Apple Arcade, Game Center, TestFlight in Play text (Metadata policy), per locale, field and line with a fix. `apple listing`, `play listing`, `play release` / `play upload` release notes, `listing set`, `whats-new check` / `apply`, `storebound edit` and the desktop editor refuse before anything is sent (dry runs show the hits); `check` and `validate` report blockers; `scan` reports `other-platforms` (2.3.10) and `play-other-platforms` (Play: Metadata). A functional mention stays only through the owner's `listing.allowPlatformMentions: [{ store, text, reason }]`. - **Per-store release notes.** Lines tagged `[apple]` / `[play]` (or a `[play]` line heading a block) in a shared notes source go only into that store's notes; the draft leaves untagged other-platform lines out of the wrong store and says so; each store's limit counts its own notes. - **`storebound api` writes piped or redirected are refused loudly.** `--yes` with stdout not a TTY now exits 1 with "refused: writes through `storebound api` need an interactive terminal ... Nothing was sent." on stderr instead of a silent dry run. ## 0.8.13 · 2026-10-18 - **iPhone Duo screenshots.** `apple.iphoneDuo: true` adds the foldable's outer (1398 x 2034) and inner (2007 x 2853) sets, portrait or landscape, to `shots render`, `shots check` (exact sizes, no alpha) and the gallery. App Store Connect API 4.5.1 has no Duo `ScreenshotDisplayType`, so `apple screenshots` skips them with a message and the deep link to the version page's App Previews and Screenshots tab (one constant, `IPHONE_DUO_DISPLAY`, takes the enum names once Apple adds them). `check` / `validate` note a missing Duo set: optional now, required from April 2027 for iOS 27.1 SDK builds (a warning after that date, never a blocker), and point Play to the tablet sets (no foldable slot). - **Required iPhone class follows the console.** `validate` now requires "iPhone with Dynamic Island (medium display)" (`APP_IPHONE_61`) per locale, met by a 6.9" or 6.5" set that App Store Connect scales down (an ok row, not a warning). Labels match the console: "iPhone with Dynamic Island (medium display)", "iPhone Duo", "iPad 13" display". - **App Store Header and Search Results.** `storebound apple creative-assets [--dry]` puts a product page header (3840 x 1646, 21:9) and a search results asset (3:2, 1920 x 1280 to 3840 x 2560), image or video (5-30 s, 30/60 fps), per locale from `//creative/`, or one universal 5244 x 2950 PNG, into the App Asset Library and selects them (`PRODUCT_PAGE_HEADER_ASSET`, `APP_STORE_SEARCH_RESULTS_ASSET`) once Apple approved them; MD5 upsert, read back. Local checks: size, no alpha, video length / fps / container (ffprobe, else skipped with a note). `check` and `validate` note when there is none (Play: the feature graphic and promo video are the counterparts). MCP `apple_creative_assets`; config `apple.creativeAssets`; pitfall 76. ## 0.8.12 · 2026-10-17 - **Shareable readiness report.** `storebound report` puts `scan`, `check` and `validate` into one self-contained HTML page (`.storebound/reports/readiness-.html`, inline CSS, no scripts, light / dark, print-friendly) and opens it in the browser: a verdict per store ("Ready to submit", "N blockers", "Not checked" with the reason when a store key is missing), findings per store by severity with guideline, evidence, fix and an Open in App Store Connect / Play Console button, and the questions only the owner can answer as a checklist. Credentials, key ids, emails and the review demo account are masked. `--md`, `--json`, `--no-open`, `--offline`, `--out`. The desktop's Checks tab has a Report button (same code path) and its Markdown export uses the same renderer; MCP gets a read-only `report` tool. - **Remote config and remote paywalls (App Review 2.3.1, Play Deceptive behavior).** `storebound scan` (and `validate`; `check` as a warning) reports `remote-features` for both stores when the app ships a remote config / feature flag SDK (Firebase Remote Config, Statsig, LaunchDarkly, GrowthBook, Optimizely, PostHog feature flags, Unleash, ConfigCat, Amplitude Experiment, Split) or a remote paywall (RevenueCat Paywalls, Superwall, Adapty, Qonversion, Purchasely, Apphud) and the review notes do not mention it. Warn only: storebound never writes the note; the config templates carry a commented example line. Code obfuscators are a low note, minify alone nothing (store-pitfalls 74). ## 0.8.11 · 2026-10-17 - **Guest-play apps rejected as a login wall (Play).** `reviewAccess.instructions` with `signInRequired: false` holds guest steps: `storebound check` warns when a Play app has a first-run gate (name entry, code / transfer entry) or in-app purchases and no steps, and the `play-sign-in-details` plan then declares one entry without credentials, the dialog's required full-access box as the owner's step (store-pitfalls 73). ## 0.8.10 · 2026-10-15 - **Neutral names only.** Docs, pitfalls, tests and comments use example names instead of the projects that reported issues; the history was rewritten the same way. Older npm versions are withdrawn. - **Releases:** a candidate whose build jobs were cancelled by a newer push says so and gives the tag move and `--resume` line. ## 0.8.9 · 2026-10-15 - **Play edits Play will not send for review are committed anyway.** After a rejection, with other pending changes or managed publishing, Play answers validate / commit with 400 "Changes cannot be sent for review automatically. Please set the query parameter changesNotSentForReview to true". storebound now commits the same edit again (edits.commit only: validate refuses the parameter with 400 "Unknown name") with that parameter (a dry run validates that way and says the real run will commit so), then prints "committed; Play did not send it for review: press Send changes for review in Publishing overview: " (the owner's button). `--not-sent-for-review` on `play release`, `upload`, `rollout`, `listing` and `images` (MCP / desktop `not_sent_for_review`) sets it from the start. The API cannot read that changes wait to be sent, so storebound records its commit in `.storebound/` and `play status` shows "changes committed