# 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. Art without words needs no copy per locale: `/creative/header.png` / `search.*` fill every language without its own file, uploaded once and placed per locale (the dry run counts files, not slots). If App Store Connect refuses a placement on the live version, the run says so, leaves the live page unchanged (the new placement goes first, the old one is removed only after Apple accepted it), links the live version page and does not retry the other live slots. Pitfall 76 rewritten. - **macOS (tvOS, visionOS) versions are no longer invisible.** `apple status`, `listing`, `listing pull`, `resubmit`, `submit`, `release` and `screenshots` take `--platform ios|macos|tvos|visionos` (MCP tools and the desktop's owner actions: `platform`); without it they use the platform that has the version they need (a rejected one, an UNRESOLVED_ISSUES submission, an editable one) and refuse, naming both, when several platforms do. Every version and review submission lookup is per platform, so `resubmit` finds the macOS submission back from App Review and `listing --version 0.8.7` works on the rejected macOS 0.8.7 while the iOS 0.8.7 is live. `apple status`, `validate`, `release status`, the report and the desktop label every version with its platform; validate and release status warn about another platform's editable or rejected version. `whats-new apply --platform` names it in the push command. Pitfall 77. ## 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