Repository navigation
chore(contract)!: re-baseline the operation manifest to Apple API 4.5 - #31
Merged
Merged
Conversation
Apple replaced App Store Connect OpenAPI 4.4.1 with 4.5 between 2026-09-21 and 2026-09-23, so the strict contract gate failed on every branch with 1,051 expired-review and pin errors and no code change. The pinned 4.4.1 document was recovered byte-for-byte from the Wayback Machine (snapshots 20260820205342 and 20260916204644 of Apple's zip: the zip SHA-1 equals the CDX digest and openapi.oas (2).json hashes to the pinned ed0202ef...). The previous manifest passes --strict against it with 0 errors and 0 warnings. Every stamp below is backed by a 4.4.1 -> 4.5 diff of operations, parameters, request-body inputs, requiredness, and response lineage: - specPin: 4.5, 973 paths, 1,270 operations, SHA-256 1e8ef250... - 644 exact optional-input classifications re-stamped: every classified Apple input is unchanged, including its referenced schemas and text. - sparseFields family rule re-decided: 110 of its 1,139 inputs changed only in enum values (fields[apps] +performanceOverviews, fields[subscriptions] +marketSettings/multiSeatStatus, fields[ageRatingDeclarations] +gracRatingClassificationNumber, fields[gameCenterDetails] +blockedPlayers, fields[appInfos] -kidsAgeBand). No new fields[...] input reached a mapped operation, and public tools still expose documented projections instead of caller-controlled sparse fieldsets. - 424 waivers: 385 unchanged; 39 re-decided because only referenced App, AppInfo, or GameCenterDetail schemas and fields[...] enums changed. No public tool maps these operations, so each deferral stands. - Scope rules: /v1/alternativeDistribution and /v1/marketplace unchanged; /v1/gameCenter (+4 operations) and /v2/gameCenter (+2 operations) re-decided as still out of scope. - New operation apps_performanceOverviews_getToManyRelated is deferred. - New optional inputs are classified as intentionally omitted: gracRatingClassificationNumber on app_versions_update_age_rating, and marketSettings and multiSeatStatus on subscriptions_update. - 17 reviewed reasons that cite the pinned Apple version now cite 4.5; each claim was verified against 4.5, and the build encryption-declaration PATCH deprecation against current Apple DocC. - optionalInputCoveragePin: 2,907 total, 1,121 bound, 40 internally controlled, 1,746 intentionally omitted, 0 unclassified. The only requiredness change on a mapped operation, filter[planType] on adjusted equalizations, is handled in the next commit.
App Store Connect API 4.5 marks filter[planType] as required on
GET /v1/subscriptionPricePoints/{id}/adjustedEqualizations; 4.4.1 left it
optional. subscriptions_list_price_point_adjusted_equalizations published
plan_types as optional and sent filter[planType] only when it was supplied,
so every call without it produced a request that Apple's current contract
rejects. The contract gate did not flag this because the input is bound
and the checker does not compare Apple requiredness with the MCP schema.
plan_types is now required in the input schema, and a missing or empty
value fails before any network request. The sibling
subscriptions_list_price_point_equalizations keeps plan_types optional
because Apple 4.5 keeps that filter optional.
BREAKING CHANGE: MCP clients must pass plan_types (MONTHLY, UPFRONT, or
both) to subscriptions_list_price_point_adjusted_equalizations.
- Tests that assert manifest pins now expect specPin 4.5 (SHA-256 1e8ef250..., 1,270 operations), 425 waivers and 369 scope-rule operations, the optional-input pin 2,907 / 1,121 / 40 / 1,746 / 0 with identity 0ce3ff14..., and reviewAtSpec 4.5. The two export-compliance waiver reason checks follow the verified 4.5 wording. - ASCCoverageInventory moves to appleAPIVersionBaseline 4.5 and snapshot date 2026-09-24. The baseline is not independent of the contract pin: it was set to 4.4.1 together with the 4.4.1 contract hardening (4ae6293), the inventory drives ASC-OPENAPI-COVERAGE-GENERATED.md, which CI compares with the live Apple specification, and its rules classify all 973 Apple 4.5 paths. - ASC-OPENAPI-COVERAGE-GENERATED.md is regenerated from Apple 4.5: 973 paths, 1,270 operations, 0 unclassified. - README and CHANGELOG record the 4.5 pin and counts, the coverage matrix points at the 4.5 generated matrix, and the README promoted-image rows cite pinned OpenAPI 4.5, where promotedPurchaseImages is still absent. - Historical statements stay unchanged: deprecations since 4.4.1, features introduced in 4.4.1, earlier CHANGELOG entries, and test titles that describe 4.4.1 fixtures.
…ventories The Apps and AppLifecycle and the commerce inventory tests pin the exact number of optional-input classifications, and the subscription write test pins the omitted body inputs of subscriptions_update. They now include gracRatingClassificationNumber, marketSettings, and multiSeatStatus, which the 4.5 re-baseline classifies as intentionally omitted: 120 Apps and AppLifecycle classifications (119 omitted) and 171 commerce classifications (140 omitted).
Owner
Author
|
zelentsov-dev
added a commit
that referenced
this pull request
Sep 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
Apple replaced the App Store Connect OpenAPI specification 4.4.1 with 4.5 between 2026-09-21 and 2026-09-23. The required check "Release & Apple Contract" downloads the live specification, so every PR,
developandmainfailed with 1,051 errors and no code change (CI run 35921838349). The errors were expired reviews, spec pin mismatches, one untriaged operation, and optional-input pin drift.This PR re-baselines the operation manifest to 4.5 through a re-review backed by a 4.4.1 -> 4.5 diff. It also fixes the one public tool whose contract 4.5 breaks.
Method
Recovered the pinned 4.4.1 document byte-for-byte from the Wayback Machine: snapshots
20260820205342and20260916204644of Apple's zip, which are identical.openapi.oas (2).jsonhashes to the pinneded0202ef....--strictagainst it with 0 errors and 0 warnings.Diffed 4.4.1 against the live 4.5 (
1e8ef250...) at the level the manifest reasons about:A Python replica of the analyzer's optional-input enumeration reproduces the Swift identity digests for both specs, so its per-input results can be trusted.
Re-stamped only items whose Apple definition is unchanged. Changed items were re-decided with a stated reason, and every new operation and input was triaged.
Changes
67e95c6chore(contract): re-baseline the operation manifest to Apple API 4.5261ef52fix(subscriptions)!: require plan_types for adjusted equalizations7972e38test(contract): move Apple 4.4.1 pins in tests and docs to 4.544ec237test(contract): count the three Apple 4.5 inputs in classification inventories4.4.1 -> 4.5 diff summary
sparseFieldsfamily inputsApp/AppInfo/GameCenterDetailschemas andfields[...]enums changed; no public tool maps them, so the deferrals stand/v1/gameCenter(+4 operations) and/v2/gameCenter(+2), still out of scopeThe 110 family deltas:
fields[apps]+performanceOverviewsfields[subscriptions]+marketSettings,multiSeatStatusfields[appInfos]-kidsAgeBandfields[ageRatingDeclarations]+gracRatingClassificationNumberfields[gameCenterDetails]+blockedPlayersNew 4.5 items:
apps_performanceOverviews_getToManyRelated(GET /v1/apps/{id}/performanceOverviews) is deferred with a new waiver.gracRatingClassificationNumberonapp_versions_update_age_rating, andmarketSettingsandmultiSeatStatusonsubscriptions_update.Requiredness: I compared all 476 operations that public tools map, in every role. The only transition is
filter[planType]onsubscriptionPricePoints_adjustedEqualizations_getToManyRelated, which went from optional to required. No parameter was added or removed, and no rawrequiredarray changed anywhere in a request-body schema closure. The detector was canary-tested with injected changes.Contract fix (
261ef52, Sources change).subscriptions_list_price_point_adjusted_equalizationspublishedplan_typesas optional and sentfilter[planType]only when it was supplied, but 4.5 requires the filter.plan_typesis now required in the input schema.### Breaking Changes.subscriptions_list_price_point_equalizationskeepsplan_typesoptional because Apple keeps that filter optional.Reason texts. 17 reviewed reasons (14 classifications, 3 waivers) cited the pinned Apple version and now cite 4.5. Each cited fact is identical in 4.4.1 and 4.5. The build encryption-declaration PATCH deprecation was also re-checked against current Apple DocC.
ASCCoverageInventory.appleAPIVersionBaselinemoves to 4.5 (snapshot 2026-09-24). It is tied to the contract pin, not independent:4ae6293;ASC-OPENAPI-COVERAGE-GENERATED.md, which CI diffs against the live specification;Pins and counts:
0ce3ff14568f841643559c359bc91827290535925c3665172fda81d499f81ce1.Risk and authority
develop; release, tag, and Mint publishing stay with the owner.Evidence
fcfa12fshows exactly the intended changes and nothing else: 1,073 stamps, 17 reason version updates, 4 specPin fields, 1 waiver, 3 classifications, and the coverage pin. The diff scripts and data are replayable from the review handoff.44ec237:swift test --disable-automatic-resolution: 1,868 tests in 138 suites passed.git archiveof the head all passed:asc-mcp --versionreturnsasc-mcp 4.1.6;4dc5dc79.../ document1e8ef250...;openapi-contract-check --strictwith 0 errors, 0 warnings, 0 drift, and the relocated-binary--strictstep;Follow-ups (not in this PR)
openapi-contract-checkchecks only that a required Apple input is bound, not that the tool always sends it. Evidence: a scratch manifest with every stamp re-baselined passed--stricton 4.5 (0 errors, 0 warnings, 0 drift) whileplan_typeswas still optional. Suggested rule: a required Apple parameter or body pointer must bind to a required MCP input or to a fixed or derived value.app_versions_update_age_ratingrejects the Apple 4.5koreaAgeRatingOverridevaluesALLandTWELVE_PLUS(AppLifecycleWorker+Handlers.swift:1493,AppLifecycleWorker+ToolDefinitions.swift:611).AppInfo.kidsAgeBand. Theapp_infoprojections still emit it, so it will read as null (AppInfoWorker+Handlers.swift:738).Not checked
filter[planType]. Live ASC calls were out of scope, so the fix follows Apple's published 4.5 contract.67e95c6and261ef52fail the tests that pin 4.4.1 values until7972e38and44ec237. The head is green.