# Changelog ## Unreleased - **Header and Search Results: select once processed, then add for review.** `storebound apple creative-assets` now selects an asset for the product page header or search results slot as soon as it is processed ("Prepare for Submission"), as the console's Browse Assets does: Apple reviews an asset only once it is in a review submission, so 0.8.13's "select once approved" never finished. Upload and select happen in one run (processing wait up to 2 min with a heartbeat). `--add-for-review` adds the selected, unreviewed assets to the app's draft review submission (never submits; Submit for Review stays the owner's); `--verify` (MCP `apple_creative_assets_verify`) reads every slot back read-only and fails when one differs from the local file. A file App Review rejected, or one that failed processing twice, is not uploaded again; an archived copy of the same file is unarchived instead of uploaded. A live app without an editable version uses the live version: approved assets are selected there, new ones are uploaded and wait for a review of their own. Pitfall 76 rewritten. ## 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