Entry point:
AGENTS.mdat the repo root.
Closed Captioner sells one non-consumable: Remove Ads.
| Item | Value |
|---|---|
| App Store Connect app | 6754772689 |
| Product ID (must match code) | ClosedCaptioner |
| Type | Non-consumable |
| Code | ClosedCaptioner/IAP/IAPConfig.swift |
| Local StoreKit file | ClosedCaptioner.storekit (Xcode Run only) |
New installs get 30 calendar days with no ads and Purchases tab hidden. After that, banners/interstitials and Settings → Purchases behave as usual.
Install day comes from the app Documents folder creation date when possible (survives updates), then is stored in UserDefaults (ClosedCaptioner.installDate). Code: InstallGracePeriod + PremiumManager.adsSuppressed.
Product.products(for:) returns an empty list (it does not throw) when Apple does not know that product ID for this app. The UI then shows Retry / purchase unavailable.
| How the app was installed | Which catalog StoreKit uses |
|---|---|
| Product → Run in Xcode with the ClosedCaptioner scheme | Local ClosedCaptioner.storekit |
TestFlight, App Store, or xcodebuild device install |
Live App Store / sandbox |
ClosedCaptioner, status Ready to Submit or Approved, all metadata (name, description, price, review screenshot) filled.Agents cannot accept Paid Apps contracts or enter banking. Escalate those to the human.
Scheme ClosedCaptioner → Run → Options → StoreKit Configuration = ClosedCaptioner.storekit. This bypasses ASC. xcodebuild install does not use that file.