Skip to content

fix(kit): harden store verification integrity - #313

Merged
hyochan merged 8 commits into
mainfrom
fix/kit-store-verification-integrity
Aug 11, 2026
Merged

hyochan merged 8 commits into
mainfrom
fix/kit-store-verification-integrity

Conversation

@hyochan

@hyochan hyochan commented Aug 11, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Retire the unfinished Meta Horizon subscription reconciler, quarantine its legacy synthetic metrics source, and make raw REST verification persist only strict boolean verdicts while preserving the last confirmed snapshot across transient or malformed responses.
  • Harden Amazon RVS with an explicit project-level sandbox opt-in, first-class Sandbox / Production provenance, expected-product binding, strict receipt identity and response validation, and a bounded purchase-row reconciler that preserves authoritative state on transient failures.
  • Wire Amazon expectedProductId and environment through the GraphQL SSOT, Apple, Google, and every framework SDK while preserving published Kotlin constructor compatibility.
  • Add Amazon and Horizon purchase counters, bounded migration support for existing self-hosted rows, and responsive dashboard containment for project navigation, filters, tables, metrics, and long project identities.
  • Include the Convex verifier tree in Kit coverage, enforce separate server (90%) and Convex (48%) gates, align Codecov's LCOV partial-line semantics with the local gates, and make web E2E resource failures attributable without hiding real 4xx responses.

Preview

pr-313-kit-store-verification-ui.mp4

Production data audit

A read-only hosted production audit on 2026-08-11 found:

  • 0 projects with Meta Horizon currently enabled
  • 0 MetaHorizonReconciler events
  • 0 Horizon purchases or ambiguous Horizon failure snapshots across 32,932 purchase rows

The hosted audit found no Horizon rows requiring repair, so no hosted repair migration was run. A bounded, idempotent backfillPurchaseStatsStoreBuckets migration is included for self-hosted deployments that need to populate the new Amazon/Horizon per-store stats buckets; its required migration and duplicate-cleanup ordering is documented.

Verification

  • Kit coverage: 86 files and 1,178 tests passed
  • Local scoped coverage: server 90.04% (1,229 / 1,365), Convex 52.13% (3,365 / 6,455)
  • Exact-head Codecov components: server 90.45%, Convex 52.73%, Flutter patch 100%
  • Kit TypeScript, Convex typecheck, ESLint, Prettier, compiled-server smoke, authenticated responsive dashboard checks, and public web E2E passed
  • GQL generation/parity: 19 files and 162 tests passed, with every generated target synchronized
  • Apple: build, 136 tests, and iOS/Simulator/Mac Catalyst XCFramework passed
  • Google: Play/Amazon/Horizon builds and 1,764 all-flavor tests passed
  • React Native: 553 library tests, 140 example tests, and Play/Fire/Horizon builds passed
  • Expo: 410 library tests, 82 plugin tests, 134 example tests, and Play/Fire/Horizon builds passed
  • Flutter: analyze, 356 tests, Play/Fire/Horizon Android builds, and unsigned iOS build passed
  • KMP: full build, 1,287 test invocations, and Play/Amazon/Horizon examples passed
  • MAUI: shared build, 6 contract tests, 99 xUnit tests, Apple XCFramework/iOS binding, and Horizon example passed
  • Docs build, audit:docs, audit:parity, actionlint, and git diff --check passed
  • Exact-head CI is green, the PR is mergeable/CLEAN, and all 6 review threads are resolved

Device E2E

  • Local IAPKit + Google Play on Pixel 2: a new dev.hyo.martie.10bulbs license-tester order showed the explicit test card/test-order sheet, verified through the compiled local server with HTTP 200 and isValid: true, finished successfully, added exactly one canonical Google row/order/valid count, and created no durable subscription row.
  • Local IAPKit + Amazon App Tester on Fire HD: a restored durable receipt and a new 10 Bulbs consumable both verified through Amazon Cloud Sandbox. The new receipt persisted expectedProductId, environment: Sandbox, and READY_TO_CONSUME; purchase/Amazon/valid counters advanced exactly once and no durable subscription row was created. The temporary project sandbox opt-in and local environment flag were restored afterward.
  • Play physical flows: Expo, Flutter, and KMP passed product fetch, explicit test-order purchase, finish/consume, available-purchase or history refresh, and cancellation. MAUI passed build/install, product fetch, test purchase, finish/re-purchase, and cancellation; its separate manual available-purchases refresh was not run.
  • FireOS physical flows: Expo, Flutter, and KMP passed App Tester product fetch, cancellation, purchase, finish/consume, and available-purchases refresh.
  • iOS physical builds: React Native, Expo, and Flutter built, development-signed, and installed on the connected iPhone. Launch/product/purchase checks were blocked because the device remained locked, so no Apple purchase was attempted.
  • VegaOS: fresh React Native and Expo packages built, installed, launched, rendered, and started the Appstore IAP service on the physical Vega device. Purchase UI approval was blocked because the available Vega tooling cannot safely inspect or operate the screen.
  • Horizon: exact-head APK built and installed on Quest 3; live verification remained blocked by the absent Horizon app token and the sleeping headset compositor. Horizon is build-only in the standard matrix.
  • Godot Android/iOS source export was blocked because the installed Godot is 4.5.1 while this repository requires 4.7.1; no toolchain was installed during verification.
  • MAUI FireOS was blocked by the unavailable store-specific project.assets.json; no dependency restore was introduced for the E2E run.

Follow-up validation

Live Meta credentials were unavailable, so Meta's real non-entitlement HTTP shape still needs a test-user fixture before changing the conservative 4xx behavior. Amazon valid Sandbox receipts were exercised end to end; a naturally expired/grace-period production subscription fixture was not available, so lifecycle reconciliation continues to rely on Amazon's documented cancelDate loss-of-access semantics and bounded RVS polling.

Package metadata is intentionally not bumped in this feature PR. The additive fields are annotated for future OpenIAP Spec 3.2.0, openiap-apple 3.2.0, and openiap-google 3.3.0 releases; framework packages ship through their own release workflows.

Closes #310
Closes #311
Closes #312

Summary by CodeRabbit

  • New Features

    • Added Amazon Appstore sandbox verification with explicit project opt-in.
    • Added optional Amazon product matching and Sandbox/Production environment details in responses.
    • Added periodic receipt reconciliation for status updates, cancellations, and transient-error recovery.
  • Bug Fixes

    • Improved receipt validation, retries, timeouts, and protection against unconfirmed or stale results.
    • Preserved confirmed Meta Horizon entitlement state when verification responses are ambiguous or fail.
    • Improved project navigation and layout behavior on smaller screens.
  • Documentation

    • Expanded Amazon setup, sandbox, reconciliation, and response guidance.

@codecov-commenter

codecov-commenter commented Aug 11, 2026 •

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 95.29781% with 15 lines in your changes missing coverage. Please review.
✅ Project coverage is 71.86%. Comparing base (28474e3) to head (f8a763c).

Files with missing lines Patch % Lines
packages/kit/convex/purchases/amazon.ts 95.68% 6 Missing ⚠️
packages/kit/convex/purchases/horizon.ts 89.13% 5 Missing ⚠️
packages/kit/convex/projects/mutation.ts 0.00% 2 Missing ⚠️
packages/kit/convex/purchases/stats.ts 95.45% 2 Missing ⚠️
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

❗ There is a different number of reports uploaded between BASE (28474e3) and HEAD (f8a763c). Click for more details.

HEAD has 1 upload less than BASE
Flag BASE (28474e3) HEAD (f8a763c)
iapkit-server 1 0
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##             main     #313       +/-   ##
===========================================
- Coverage   84.11%   71.86%   -12.26%     
===========================================
  Files          55      134       +79     
  Lines        7317    14407     +7090     
  Branches     1701     4022     +2321     
===========================================
+ Hits         6155    10353     +4198     
- Misses        714     4054     +3340     
+ Partials      448        0      -448     
Flag Coverage Δ
expo-iap 89.23% <100.00%> (+4.94%) ⬆️
flutter-inapp-purchase 90.07% <100.00%> (+0.03%) ⬆️
iapkit 59.14% <94.98%> (?)
iapkit-server ?
react-native-iap 90.98% <100.00%> (+10.19%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
React Native IAP 90.98% <100.00%> (+10.19%) ⬆️
Expo IAP 89.23% <100.00%> (+4.94%) ⬆️
flutter_inapp_purchase 90.07% <100.00%> (+0.03%) ⬆️
IAPKit Server 90.45% <100.00%> (∅)
IAPKit Convex 52.73% <94.89%> (∅)
Files with missing lines Coverage Δ
libraries/expo-iap/src/index.ts 92.62% <ø> (+2.18%) ⬆️
libraries/expo-iap/src/vega-adapter.ts 84.14% <100.00%> (+9.28%) ⬆️
...ter_inapp_purchase/lib/flutter_inapp_purchase.dart 88.91% <100.00%> (+0.06%) ⬆️
libraries/react-native-iap/src/index.ts 91.56% <100.00%> (+8.91%) ⬆️
libraries/react-native-iap/src/vega-adapter.ts 85.89% <100.00%> (+16.43%) ⬆️
packages/kit/convex/crons.ts 0.00% <ø> (ø)
packages/kit/convex/migrations.ts 36.76% <100.00%> (ø)
packages/kit/convex/projects/setupStatus.ts 78.57% <100.00%> (ø)
packages/kit/convex/purchases/cleanup.ts 97.61% <100.00%> (ø)
packages/kit/convex/purchases/errors.ts 44.11% <100.00%> (ø)
... and 16 more

... and 87 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (3)
packages/kit/convex/purchases/amazon-reconciliation.test.ts (1)

51-62: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Honor the direction argument in the order fake.

MemQuery.order ignores _direction and always sorts ascending. The fake therefore passes even if the production claim query switches to "desc", which would select the least-due rows. Apply the direction so the fake keeps detecting that change.

♻️ Proposed change
-  order(_direction: "asc" | "desc"): MemQuery {
+  order(direction: "asc" | "desc"): MemQuery {
+    const sign = direction === "asc" ? 1 : -1;
     return new MemQuery(
       [...this.rows].sort((left, right) => {
         const leftAt = left.nextAmazonReconcileAt;
         const rightAt = right.nextAmazonReconcileAt;
         return (
-          (typeof leftAt === "number" ? leftAt : -Infinity) -
-          (typeof rightAt === "number" ? rightAt : -Infinity)
+          sign *
+          ((typeof leftAt === "number" ? leftAt : -Infinity) -
+            (typeof rightAt === "number" ? rightAt : -Infinity))
         );
       }),
     );
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/kit/convex/purchases/amazon-reconciliation.test.ts` around lines 51
- 62, Update MemQuery.order to honor its direction argument instead of ignoring
it: retain the current ascending sort for "asc" and reverse the comparison for
"desc", while preserving the existing handling of non-numeric
nextAmazonReconcileAt values.
packages/kit/convex/purchases/internal.ts (1)

536-546: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Consider a longer deferral for rows that can never be reconciled.

A malformed row or a row under project deletion is deferred by only AMAZON_RECONCILE_LEASE_MS (12 minutes). Such rows return to the front of the due index on the next tick and consume claim slots repeatedly. A permanently malformed backlog larger than AMAZON_RECONCILE_BATCH_LIMIT can starve reconcilable rows. Use the retry interval for the skip path so unusable rows back off further.

♻️ Proposed change
-        // Keep a malformed legacy row from monopolizing the front of the due
-        // index while project deletion or an operator repair catches up.
-        await ctx.db.patch(purchase._id, { nextAmazonReconcileAt: leaseUntil });
+        // Keep a malformed legacy row from monopolizing the front of the due
+        // index while project deletion or an operator repair catches up. Use
+        // the longer retry interval because this row cannot be probed at all.
+        await ctx.db.patch(purchase._id, {
+          nextAmazonReconcileAt: now + AMAZON_RECONCILE_RETRY_MS,
+        });

AMAZON_RECONCILE_RETRY_MS is already exported from ./shared.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/kit/convex/purchases/internal.ts` around lines 536 - 546, Update the
skip path in the purchase reconciliation loop around the requestData.store,
purchase.remoteId, project, and project.pendingDeletion checks to defer unusable
rows using the exported AMAZON_RECONCILE_RETRY_MS interval rather than
AMAZON_RECONCILE_LEASE_MS. Keep the existing patch-and-continue behavior
unchanged.
knowledge/_claude-context/context.md (1)

4-4: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Regenerate the generated artifacts from their source inputs.

scripts/agent/compile-context.ts generates all three files. Update the source inputs, then run (cd scripts/agent && bun run compile:ai). Do not edit the artifacts directly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@knowledge/_claude-context/context.md` at line 4, Regenerate all three
generated artifacts using scripts/agent/compile-context.ts after updating the
source inputs; do not edit artifacts directly. Apply this to
knowledge/_claude-context/context.md:4-4,
packages/docs/public/llms-full.txt:6-6, and packages/docs/public/llms.txt:6-6 by
running (cd scripts/agent && bun run compile:ai).

Sources: Coding guidelines, Learnings

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@knowledge/external/webhook-mapping.md`:
- Around line 89-92: Update the Amazon RVS reconciliation wording in
knowledge/external/webhook-mapping.md (lines 89-92) to state that the worker
schedules bounded revisits and does not guarantee every row is checked within 72
hours. Regenerate the corresponding corrected wording in
knowledge/_claude-context/context.md (lines 4763-4766) and
packages/docs/public/llms-full.txt (lines 2044-2047), matching the completion
caveat from packages/kit/README.md.

In `@packages/kit/public/llms-full.txt`:
- Around line 84-105: Update the purchases data-model summary near the existing
`purchases/` description to include `amazon` alongside `apple`, `google`, and
`horizon`, ensuring it matches the documented Amazon purchase-row persistence
and refresh behavior.

In `@packages/kit/src/pages/auth/organization/project/products.tsx`:
- Around line 1131-1145: Update the Horizon catalog sync notice styling around
the Info panel so its text and link use contrast-safe colors in the light theme
instead of text-blue-200, while preserving the existing blue informational
appearance and layout.

In `@packages/kit/src/pages/docs/sections/introduction.tsx`:
- Line 101: Update the normalized response summaries to consistently include the
optional environment? field: in
packages/kit/src/pages/docs/sections/introduction.tsx at lines 101-101, add it
to the earlier result near Line 20; in packages/docs/public/llms-full.txt at
lines 2039-2047, add it to the IAPKit response summary near Line 2056, then
regenerate the generated reference.

In `@packages/kit/src/pages/docs/sections/quickstart.tsx`:
- Around line 179-198: Add an Amazon Appstore entry or settings link to the
store-configuration list in the quickstart setup section before the Amazon
verification example. Reference the existing Amazon RVS shared-secret
configuration and Cloud Sandbox opt-in so users can complete the documented flow
without leaving the quickstart.

In `@scripts/assert-lcov-coverage.mjs`:
- Around line 7-12: Update sourcePathSegments to normalize "." and ".." segments
before prefix matching, resolving parent-directory traversal so paths like
convex/../server/api.ts are evaluated under server rather than convex. Add a
regression test covering this traversal path and verify it does not match the
Convex prefix.

---

Nitpick comments:
In `@knowledge/_claude-context/context.md`:
- Line 4: Regenerate all three generated artifacts using
scripts/agent/compile-context.ts after updating the source inputs; do not edit
artifacts directly. Apply this to knowledge/_claude-context/context.md:4-4,
packages/docs/public/llms-full.txt:6-6, and packages/docs/public/llms.txt:6-6 by
running (cd scripts/agent && bun run compile:ai).

In `@packages/kit/convex/purchases/amazon-reconciliation.test.ts`:
- Around line 51-62: Update MemQuery.order to honor its direction argument
instead of ignoring it: retain the current ascending sort for "asc" and reverse
the comparison for "desc", while preserving the existing handling of non-numeric
nextAmazonReconcileAt values.

In `@packages/kit/convex/purchases/internal.ts`:
- Around line 536-546: Update the skip path in the purchase reconciliation loop
around the requestData.store, purchase.remoteId, project, and
project.pendingDeletion checks to defer unusable rows using the exported
AMAZON_RECONCILE_RETRY_MS interval rather than AMAZON_RECONCILE_LEASE_MS. Keep
the existing patch-and-continue behavior unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: cf78847a-153c-4b69-8c9c-9d5048bca28b

📥 Commits

Reviewing files that changed from the base of the PR and between 6a2abd7 and 3535af1.

⛔ Files ignored due to path filters (1)
  • packages/kit/convex/_generated/api.d.ts is excluded by !**/_generated/**
📒 Files selected for processing (49)
  • .github/workflows/deploy-kit.yml
  • codecov.yml
  • knowledge/_claude-context/context.md
  • knowledge/external/webhook-mapping.md
  • packages/docs/public/llms-full.txt
  • packages/docs/public/llms.txt
  • packages/kit/CONVENTION.md
  • packages/kit/README.md
  • packages/kit/convex/crons.ts
  • packages/kit/convex/projects/mutation.ts
  • packages/kit/convex/purchases/amazon-reconciliation.test.ts
  • packages/kit/convex/purchases/amazon.test.ts
  • packages/kit/convex/purchases/amazon.ts
  • packages/kit/convex/purchases/errors.ts
  • packages/kit/convex/purchases/horizon.test.ts
  • packages/kit/convex/purchases/horizon.ts
  • packages/kit/convex/purchases/internal.ts
  • packages/kit/convex/purchases/save-purchase-idempotency.test.ts
  • packages/kit/convex/purchases/shared.ts
  • packages/kit/convex/schema.ts
  • packages/kit/convex/subscriptions/horizon.ts
  • packages/kit/convex/subscriptions/horizonInternal.test.ts
  • packages/kit/convex/subscriptions/horizonInternal.ts
  • packages/kit/convex/subscriptions/revenueMetrics.test.ts
  • packages/kit/convex/subscriptions/revenueMetrics.ts
  • packages/kit/convex/subscriptions/stats.ts
  • packages/kit/convex/webhooks/internal.ts
  • packages/kit/package.json
  • packages/kit/public/llms-full.txt
  • packages/kit/server/api/v1/replay-guard.test.ts
  • packages/kit/server/api/v1/replay-guard.ts
  • packages/kit/server/api/v1/route-input-schemas.test.ts
  • packages/kit/server/api/v1/route-input-schemas.ts
  • packages/kit/server/api/v1/route-response-schemas.test.ts
  • packages/kit/server/api/v1/route-response-schemas.ts
  • packages/kit/server/api/v1/routes.test.ts
  • packages/kit/server/api/v1/routes.ts
  • packages/kit/src/pages/auth/organization/project/products.tsx
  • packages/kit/src/pages/auth/organization/project/settings.test.tsx
  • packages/kit/src/pages/auth/organization/project/settings.tsx
  • packages/kit/src/pages/auth/organization/project/webhooks.tsx
  • packages/kit/src/pages/docs/sections/api.tsx
  • packages/kit/src/pages/docs/sections/introduction.tsx
  • packages/kit/src/pages/docs/sections/operations.tsx
  • packages/kit/src/pages/docs/sections/quickstart.tsx
  • packages/kit/src/pages/docs/sections/verification-horizon.tsx
  • scripts/assert-lcov-coverage.mjs
  • scripts/assert-lcov-coverage.test.mjs
  • scripts/audit-non-godot-parity.mjs
💤 Files with no reviewable changes (4)
  • packages/kit/convex/subscriptions/horizon.ts
  • packages/kit/convex/webhooks/internal.ts
  • packages/kit/convex/subscriptions/horizonInternal.test.ts
  • packages/kit/convex/subscriptions/horizonInternal.ts

Comment thread knowledge/external/webhook-mapping.md Outdated
Comment thread packages/kit/public/llms-full.txt
Comment thread packages/kit/src/pages/auth/organization/project/products.tsx Outdated
Comment thread packages/kit/src/pages/docs/sections/introduction.tsx
Comment thread packages/kit/src/pages/docs/sections/quickstart.tsx
Comment thread scripts/assert-lcov-coverage.mjs
@hyodotdev hyodotdev deleted a comment from coderabbitai Bot Aug 11, 2026
@hyodotdev hyodotdev deleted a comment from coderabbitai Bot Aug 11, 2026
@hyochan
hyochan force-pushed the fix/kit-store-verification-integrity branch from bff090e to 3e75b14 Compare August 11, 2026 14:40
@coderabbitai

coderabbitai Bot commented Aug 11, 2026 •

Copy link
Copy Markdown
Contributor
🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR addresses [#310] and [#312], but Amazon expiry handling from [#311] remains based on the unchanged cancelDate assumption. Address Amazon natural-expiry handling or document and validate the required authoritative RVS expiry behavior in code.
Out of Scope Changes check ⚠️ Warning The project-navigation overflow and sidebar layout changes are unrelated to the linked store-verification and coverage objectives. Move the organization layout and project-navigation changes to a separate pull request.
Docstring Coverage ⚠️ Warning Docstring coverage is 8.06% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the primary changes that strengthen Kit store verification integrity.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@hyochan hyochan added cross-platform Cross-platform (both Android & iOS) expo-iap expo-iap library flutter-iap godot-iap godot-iap library kmp-iap kmp-iap library maui-iap .NET MAUI SDK react-native-iap react-native-iap library ⬡ protocol 🎯 feature New feature labels Aug 11, 2026
@hyochan hyochan added 📖 documentation Improvements or additions to documentation 📱 iOS Related to iOS 🛠 bugfix All kinds of bug fixes labels Aug 11, 2026
@hyochan
hyochan merged commit 05900f2 into main Aug 11, 2026
33 checks passed
@hyochan
hyochan deleted the fix/kit-store-verification-integrity branch August 11, 2026 16:36
hyochan added a commit that referenced this pull request Aug 13, 2026
The page states it is the canonical changelog and that every shipped PR
lands an entry, but the last one was 2026-07-28 while five production
changes had deployed since. Entries reconstructed from each PR, dated by
its merge to main, which is when deploy-kit.yml ships it: order lookup
(#285), sync/verification/MCP session correctness (#292), the production
Convex target guard (#314), store verification integrity (#313), and the
entitlement defects the conformance suite surfaced (#316).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🤖 android Related to android 🐛 bug Something isn't working 🛠 bugfix All kinds of bug fixes 💨 ci Cloud integration cross-platform Cross-platform (both Android & iOS) 📖 documentation Improvements or additions to documentation expo-iap expo-iap library 🎯 feature New feature flutter-iap godot-iap godot-iap library 📱 iOS Related to iOS kit IAPKit (receipt-validation SaaS) kmp-iap kmp-iap library maui-iap .NET MAUI SDK 🕶️ meta ⬡ protocol react-native-iap react-native-iap library 🧪 test Issue or pr related to testing

Projects

None yet

2 participants