{"version":3,"sources":["../src/_contracts-bundled.ts","../src/contracts.ts"],"sourcesContent":["// AUTO-GENERATED by scripts/emit-bundled-contracts.mjs — DO NOT EDIT.\n// Source of truth: contracts/**/*.json at the monorepo root.\n// Regenerated on every `npm run build`. The public API in\n// src/contracts.ts reads from this file.\n\nimport type { Contract } from \"./contracts\";\n\nexport const BUNDLED_IN = \"@cross-deck/web@1.14.1\" as const;\nexport const SDK_VERSION = \"1.14.1\" as const;\n\nexport const BUNDLED_CONTRACTS: readonly Contract[] = Object.freeze([\n  {\n    \"id\": \"contract-failed-payload-schema-lock\",\n    \"pillar\": \"diagnostics\",\n    \"status\": \"enforced\",\n    \"claim\": \"The `crossdeck.contract_failed` event payload contains ONLY the named diagnostic fields and never any end-user personal data. The wire shape is fixed — adding a new field requires (1) a pull request that updates this contract's `allowedFields` set, (2) a Privacy Policy §6 amendment, and (3) the Customer Disclosure Template / SDK Data Collection Reference §B updates. Per-SDK assertion tests enforce the field set on every release. The `verification_phase` field is a categorical bucket — values are restricted to `boot` (the SDK self-test ran on Crossdeck.start) or `hot_path` (a verifier observed a real customer-triggered operation). The categorical nature is what preserves the diagnostic-only-not-personal classification. This is the structural guarantee that backs the independent-controller lawful basis in the Privacy Policy: the payload remains diagnostic-only, not personal, so the legitimate-interest analysis stays valid as the SDK evolves.\",\n    \"appliesTo\": [\n      \"web\",\n      \"node\",\n      \"swift\",\n      \"android\",\n      \"react-native\"\n    ],\n    \"allowedFields\": {\n      \"required\": [\n        \"contract_id\",\n        \"sdk_version\",\n        \"sdk_platform\",\n        \"failure_reason\",\n        \"run_context\",\n        \"run_id\"\n      ],\n      \"optional\": [\n        \"test_file\",\n        \"test_name\",\n        \"device_class\",\n        \"verification_phase\"\n      ],\n      \"forbidden\": [\n        \"anonymousId\",\n        \"developerUserId\",\n        \"crossdeckCustomerId\",\n        \"email\",\n        \"ip\",\n        \"user_agent\",\n        \"message\",\n        \"stack\",\n        \"stack_trace\",\n        \"frames\",\n        \"exception_message\",\n        \"url\",\n        \"path\",\n        \"screen\",\n        \"title\",\n        \"label\",\n        \"text\",\n        \"ariaLabel\",\n        \"accessibilityLabel\",\n        \"contentDescription\",\n        \"session_id\",\n        \"sessionId\"\n      ]\n    },\n    \"transport\": \"Telemetry is single-fire to the Crossdeck reliability endpoint only — NOT the customer's appId. The customer's track() pipeline never carries `crossdeck.*` events; the customer's dashboard never shows individual contract failures. Operational telemetry flows one-way to the Crossdeck operations team for SDK reliability purposes (legitimate interest, independent-controller flow per Privacy Policy §6). The reliability endpoint is hardcoded at SDK build time; the publishable key for the reliability project is embedded as a constant and rejects writes that don't match the schema.\",\n    \"codeRef\": [\n      \"sdks/web/src/crossdeck.ts\",\n      \"sdks/node/src/crossdeck-server.ts\",\n      \"sdks/swift/Sources/Crossdeck/Crossdeck.swift\",\n      \"sdks/swift/Sources/Crossdeck/_DiagnosticTelemetry.swift\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/Crossdeck.kt\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/_DiagnosticTelemetry.kt\",\n      \"sdks/react-native/src/crossdeck.ts\",\n      \"backend/src/api/v1-sdk-diagnostic.ts\",\n      \"sdks/web/src/_diagnostic-telemetry.ts\",\n      \"sdks/node/src/_diagnostic-telemetry.ts\",\n      \"sdks/react-native/src/_diagnostic-telemetry.ts\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/contract-failed-schema-lock.test.ts\",\n        \"name\": \"reportContractFailure payload conforms to schema-lock\"\n      },\n      {\n        \"file\": \"sdks/node/tests/contract-failed-schema-lock.test.ts\",\n        \"name\": \"reportContractFailure payload conforms to schema-lock\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/ContractFailedSchemaLockTests.swift\",\n        \"name\": \"test_reportContractFailure_payloadFieldsAreInAllowList\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/ContractFailedSchemaLockTests.swift\",\n        \"name\": \"test_reportContractFailure_doesNotEnterCustomerTrackPipeline\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/ContractFailedSchemaLockTest.kt\",\n        \"name\": \"reportContractFailure payload conforms to schema-lock\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/ContractFailedSchemaLockTest.kt\",\n        \"name\": \"reportContractFailure does not enter customer track pipeline\"\n      },\n      {\n        \"file\": \"sdks/react-native/tests/contract-failed-schema-lock.test.ts\",\n        \"name\": \"reportContractFailure payload conforms to schema-lock\"\n      },\n      {\n        \"file\": \"backend/tests/unit/v1-sdk-diagnostic.test.ts\",\n        \"name\": \"forbidden fields are enumerated in the schema-lock contract\"\n      },\n      {\n        \"file\": \"backend/tests/unit/v1-sdk-diagnostic.test.ts\",\n        \"name\": \"required fields are enumerated in the schema-lock contract\"\n      },\n      {\n        \"file\": \"backend/tests/unit/v1-sdk-diagnostic.test.ts\",\n        \"name\": \"regression guard: never returns a raw IP\"\n      },\n      {\n        \"file\": \"backend/tests/unit/v1-sdk-diagnostic.test.ts\",\n        \"name\": \"verification_phase is in the optional field set\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-27\",\n    \"firstRegisteredIn\": \"Diagnostic telemetry single-fire + schema-lock — independent-controller flow\",\n    \"privacyReferences\": [\n      \"legal/privacy/index.html#sdk-diagnostic\",\n      \"legal/customer-disclosure/index.html#flow-b\",\n      \"legal/security/index.html#diagnostic\",\n      \"legal/sdk-data/index.html#b-diagnostic\"\n    ],\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": true\n  },\n  {\n    \"id\": \"error-envelope-shape\",\n    \"pillar\": \"errors\",\n    \"status\": \"enforced\",\n    \"claim\": \"Every v1 REST endpoint returns errors in a Stripe-shape envelope: `{ error: { type, code, message, request_id } }` where `type` is one of authentication_error / permission_error / invalid_request_error / rate_limit_error / internal_error (the wire vocabulary in backend/src/api/v1-errors.ts ApiErrorType). HTTP status parity: invalid_request_error → 400, authentication_error → 401, permission_error → 403, rate_limit_error → 429, internal_error → 500. SDK-side clients parse this shape via `crossdeckErrorFromResponse` (Web/Node/RN) / `crossdeckErrorFrom(response:)` (Swift) / `crossdeckErrorFromResponse` (Android) and surface the request_id verbatim so support traces are end-to-end joinable. Firebase callable endpoints (managed-keys / dashboard auth) use the Firebase HttpsError envelope instead — this contract applies to REST /v1/* only.\",\n    \"appliesTo\": [\n      \"web\",\n      \"node\",\n      \"react-native\",\n      \"swift\",\n      \"android\",\n      \"backend\"\n    ],\n    \"codeRef\": [\n      \"backend/src/api/v1-errors.ts\",\n      \"sdks/web/src/errors.ts\",\n      \"sdks/node/src/errors.ts\",\n      \"sdks/react-native/src/errors.ts\",\n      \"sdks/swift/Sources/Crossdeck/Errors.swift\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/Errors.kt\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/ErrorsTests.swift\",\n        \"name\": \"test_errorEnvelope_fallsBackOnGarbageBody\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/ErrorsTests.swift\",\n        \"name\": \"test_errorEnvelope_reads_XRequestId_fallback\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/ErrorTypeWireVocabTest.kt\",\n        \"name\": \"backend 500 response parses to INTERNAL_ERROR\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 8 (codifies existing contract)\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": true\n  },\n  {\n    \"id\": \"flush-interval-parity\",\n    \"pillar\": \"analytics\",\n    \"status\": \"enforced\",\n    \"claim\": \"Every Crossdeck SDK defaults its event-queue flush interval to 2000ms — the Stripe-adjacent industry norm. Pre-v1.4.0 the defaults disagreed (Web/Node 1500ms; RN/Swift/Android 5000ms), so cross-platform funnels saw events landing at different cadences. Per-instance override stays — call sites can still tune it freely.\",\n    \"appliesTo\": [\n      \"web\",\n      \"node\",\n      \"react-native\",\n      \"swift\",\n      \"android\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/crossdeck.ts\",\n      \"sdks/node/src/crossdeck-server.ts\",\n      \"sdks/react-native/src/crossdeck.ts\",\n      \"sdks/swift/Sources/Crossdeck/EventQueue.swift\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/EventQueue.kt\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/swift/Sources/Crossdeck/EventQueue.swift\",\n        \"name\": \"flushIntervalMs: Int = 2_000\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/EventQueue.kt\",\n        \"name\": \"flushIntervalMs: Long = 2_000L\"\n      },\n      {\n        \"file\": \"sdks/web/src/crossdeck.ts\",\n        \"name\": \"options.eventFlushIntervalMs ?? 2000\"\n      },\n      {\n        \"file\": \"sdks/node/src/crossdeck-server.ts\",\n        \"name\": \"options.eventFlushIntervalMs ?? 2000\"\n      },\n      {\n        \"file\": \"sdks/react-native/src/crossdeck.ts\",\n        \"name\": \"options.eventFlushIntervalMs ?? 2000\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 3.3\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": true\n  },\n  {\n    \"id\": \"idempotency-key-deterministic\",\n    \"pillar\": \"revenue\",\n    \"status\": \"enforced\",\n    \"claim\": \"syncPurchases() on every SDK derives a deterministic Idempotency-Key from the request body (UUID-shaped SHA-256 of `crossdeck:purchases/sync:<rail>:<jws|token>`). Same input -> same key. Backend short-circuits same-key-same-body retries by returning the cached response (status + body) with `idempotent_replay: true` flag in the body AND `Idempotent-Replayed: true` response header. Same-key-different-body returns 400 `idempotency_key_in_use`. 24-hour TTL matches Stripe. Cache only stores 2xx responses — 4xx/5xx pass through so callers can fix bugs and retry. Helper returns nil/throws on missing identifier (no silent random fallback). Cross-SDK parity is CI-pinned: deriveForPurchase('apple', 'eyJ.jws.sig') MUST equal 'a66b1640-efaf-bb4d-1261-6650033bf111' on every SDK.\",\n    \"appliesTo\": [\n      \"web\",\n      \"node\",\n      \"react-native\",\n      \"swift\",\n      \"android\",\n      \"backend\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/idempotency-key.ts\",\n      \"sdks/web/src/crossdeck.ts\",\n      \"sdks/react-native/src/idempotency-key.ts\",\n      \"sdks/react-native/src/crossdeck.ts\",\n      \"sdks/node/src/idempotency-key.ts\",\n      \"sdks/node/src/crossdeck-server.ts\",\n      \"sdks/swift/Sources/Crossdeck/IdempotencyKey.swift\",\n      \"sdks/swift/Sources/Crossdeck/Crossdeck.swift\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/IdempotencyKey.kt\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/Crossdeck.kt\",\n      \"backend/src/lib/idempotency-response-cache.ts\",\n      \"backend/src/api/v1-purchases.ts\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/idempotency-key.test.ts\",\n        \"name\": \"cross-SDK oracle — apple JWS pins canonical vector\"\n      },\n      {\n        \"file\": \"sdks/web/tests/idempotency-key.test.ts\",\n        \"name\": \"is deterministic: same body twice -> identical key\"\n      },\n      {\n        \"file\": \"sdks/web/tests/idempotency-key.test.ts\",\n        \"name\": \"same identifier under different rails -> different keys\"\n      },\n      {\n        \"file\": \"sdks/web/tests/idempotency-key.test.ts\",\n        \"name\": \"never silently falls back to a random key on missing identifier\"\n      },\n      {\n        \"file\": \"sdks/react-native/tests/idempotency-key.test.ts\",\n        \"name\": \"is deterministic\"\n      },\n      {\n        \"file\": \"sdks/react-native/tests/idempotency-key.test.ts\",\n        \"name\": \"cross-SDK oracle — apple JWS pins canonical vector\"\n      },\n      {\n        \"file\": \"sdks/node/tests/idempotency-key.test.ts\",\n        \"name\": \"is deterministic\"\n      },\n      {\n        \"file\": \"sdks/node/tests/idempotency-key.test.ts\",\n        \"name\": \"rail namespacing prevents cross-rail collisions\"\n      },\n      {\n        \"file\": \"sdks/node/tests/idempotency-key.test.ts\",\n        \"name\": \"apple JWS produces the canonical pinned UUID across all 5 SDKs\"\n      },\n      {\n        \"file\": \"backend/tests/unit/idempotency-response-cache.test.ts\",\n        \"name\": \"is deterministic for the same input\"\n      },\n      {\n        \"file\": \"backend/tests/unit/idempotency-response-cache.test.ts\",\n        \"name\": \"injects idempotent_replay: true into a JSON object body\"\n      },\n      {\n        \"file\": \"backend/tests/unit/idempotency-response-cache.test.ts\",\n        \"name\": \"matches Stripe's 24-hour idempotency window\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/IdempotencyKeyTests.swift\",\n        \"name\": \"test_crossSdkOracle_appleJWS\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/IdempotencyKeyTests.swift\",\n        \"name\": \"test_railNamespacing_preventsCrossRailCollisions\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/IdempotencyKeyTests.swift\",\n        \"name\": \"test_missingIdentifier_returnsNil\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/IdempotencyKeyTest.kt\",\n        \"name\": \"cross-SDK oracle for apple JWS\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/IdempotencyKeyTest.kt\",\n        \"name\": \"rail namespacing prevents cross-rail collisions\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/IdempotencyKeyTest.kt\",\n        \"name\": \"missing identifier returns null - never silent random fallback\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 2.2.a + 2.2.b + 2.2.c\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": true\n  },\n  {\n    \"id\": \"init-reentry-drains-prior-queue\",\n    \"pillar\": \"lifecycle\",\n    \"status\": \"enforced\",\n    \"claim\": \"Web + RN init() re-entry drains the prior EventQueue's pending setTimeout BEFORE replacing this.state. Pre-v1.4.0 the teardown handled autoTracker/webVitals/errors/unloadFlush but NOT events, so the prior queue's timer would fire AFTER the state swap — sending old-init events against new-init http + identity references (cross-identity leak during HMR / config swap / multi-tenant SDK shells). The teardown CANNOT call persistent.clear() — the durable queue belongs to the SDK lifetime, not the init() lifetime, and a survived crash mid-flush re-hydrates on the next init.\",\n    \"appliesTo\": [\n      \"web\",\n      \"react-native\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/crossdeck.ts\",\n      \"sdks/react-native/src/crossdeck.ts\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/init-reentry.test.ts\",\n        \"name\": \"re-init drains the prior queue's pending timer before swapping state\"\n      },\n      {\n        \"file\": \"sdks/web/tests/init-reentry.test.ts\",\n        \"name\": \"re-init does NOT wipe the durable event store\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 5.5\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": false\n  },\n  {\n    \"id\": \"invalid-input-rejected-natively\",\n    \"pillar\": \"errors\",\n    \"status\": \"enforced\",\n    \"claim\": \"No public SDK API ever crashes the host app, and invalid input never reaches the wire. Invalid input (empty event name, empty userId, out-of-range config such as a non-positive breadcrumb capacity, NaN/Infinity/oversize/cyclic property values) is rejected at the call site WITHOUT a fatal trap. The signalling IDIOM is per-language and intentionally NOT uniform: Web, Node, and React Native THROW a typed CrossdeckError synchronously (code missing_event_name / missing_user_id / invalid_request_error) — a normal, catchable JavaScript convention where an uncaught throw logs and the app continues; Swift DROPS with a debug-log signal (track_dropped / identify_dropped) to match its non-throwing fire-and-forget surface, and exposes the throwing equivalent only via identifyAndWait(userId:). What is UNIFORM is the invariant, not the mechanism: every SDK rejects the same inputs, no public fire-and-forget API contains a fatalError / assertionFailure / precondition reachable from customer input, and no rejected input is enqueued or transmitted. Swift additionally proves this in BOTH debug and release configuration, because precondition fires under -O while assertionFailure does not. The bug class this contract closes was never the per-language difference — it was the UNDECLARED difference: each SDK's public API documentation must state its own semantics explicitly (TS docs: 'throws on empty name'; Swift docs: 'drops and logs').\",\n    \"appliesTo\": [\n      \"web\",\n      \"node\",\n      \"react-native\",\n      \"swift\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/crossdeck.ts\",\n      \"sdks/node/src/crossdeck-server.ts\",\n      \"sdks/react-native/src/crossdeck.ts\",\n      \"sdks/swift/Sources/Crossdeck/Crossdeck.swift\",\n      \"sdks/swift/Sources/Crossdeck/Breadcrumbs.swift\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/crossdeck.test.ts\",\n        \"name\": \"track with empty name throws synchronously\"\n      },\n      {\n        \"file\": \"sdks/web/tests/crossdeck.test.ts\",\n        \"name\": \"rejects empty userId\"\n      },\n      {\n        \"file\": \"sdks/node/tests/crossdeck-server.test.ts\",\n        \"name\": \"track() throws CrossdeckError with code 'missing_event_name' when event name is empty\"\n      },\n      {\n        \"file\": \"sdks/react-native/tests/crossdeck.test.ts\",\n        \"name\": \"track('') throws CrossdeckError(missing_event_name) synchronously\"\n      },\n      {\n        \"file\": \"sdks/react-native/tests/crossdeck.test.ts\",\n        \"name\": \"identify('') rejects with CrossdeckError(missing_user_id)\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/CrossdeckPublicAPITests.swift\",\n        \"name\": \"test_track_dropsEmptyName\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/CrossdeckPublicAPITests.swift\",\n        \"name\": \"test_identifyAndWait_rejectsEmptyId\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/PublicAPIInputSafetyTests.swift\",\n        \"name\": \"test_start_withZeroBreadcrumbCapacity_doesNotTrap\"\n      }\n    ],\n    \"registeredAt\": \"2026-06-11\",\n    \"firstRegisteredIn\": \"swift trap-on-input class fix — first machine-tested Swift release\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": false\n  },\n  {\n    \"id\": \"per-user-cache-isolation\",\n    \"pillar\": \"entitlements\",\n    \"status\": \"enforced\",\n    \"claim\": \"Every identify(userId) switches the entitlement cache to a physically separate per-user storage slot — `crossdeck:entitlements:<sha256(userId)>` — and unconditionally wipes the in-memory snapshot. A user-switch on a shared device CANNOT cross-read a prior user's cached entitlements, even if the in-memory clear is somehow skipped, because the storage keys are physically separate. reset() wipes every per-user slot via the persisted index.\",\n    \"appliesTo\": [\n      \"web\",\n      \"react-native\",\n      \"swift\",\n      \"android\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/entitlement-cache.ts\",\n      \"sdks/web/src/hash.ts\",\n      \"sdks/web/src/crossdeck.ts\",\n      \"sdks/react-native/src/entitlement-cache.ts\",\n      \"sdks/react-native/src/hash.ts\",\n      \"sdks/react-native/src/crossdeck.ts\",\n      \"sdks/swift/Sources/Crossdeck/EntitlementCache.swift\",\n      \"sdks/swift/Sources/Crossdeck/IdempotencyKey.swift\",\n      \"sdks/swift/Sources/Crossdeck/Crossdeck.swift\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/EntitlementCache.kt\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/IdempotencyKey.kt\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/Crossdeck.kt\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/entitlement-cache-isolation.test.ts\",\n        \"name\": \"identify(B) makes A's entitlements unreachable from in-memory\"\n      },\n      {\n        \"file\": \"sdks/web/tests/entitlement-cache-isolation.test.ts\",\n        \"name\": \"clearAll() removes every per-user storage key plus the index\"\n      },\n      {\n        \"file\": \"sdks/web/tests/entitlement-cache-isolation.test.ts\",\n        \"name\": \"a second cache instance reading A's storage suffix CANNOT see B's data\"\n      },\n      {\n        \"file\": \"sdks/react-native/tests/entitlement-cache-isolation.test.ts\",\n        \"name\": \"identify(B) makes A's entitlements unreachable from in-memory\"\n      },\n      {\n        \"file\": \"sdks/react-native/tests/entitlement-cache-isolation.test.ts\",\n        \"name\": \"removes every per-user storage key plus the index\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/EntitlementCacheIsolationTests.swift\",\n        \"name\": \"test_identifyB_makesAEntitlementsUnreachable\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/EntitlementCacheIsolationTests.swift\",\n        \"name\": \"test_identifiedWritesLandUnderPerUserSha256Key\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/EntitlementCacheIsolationTests.swift\",\n        \"name\": \"test_clearAll_removesEveryPerUserStorageKeyPlusIndex\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/EntitlementCacheIsolationTest.kt\",\n        \"name\": \"identified writes land under per-user sha256 key\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/EntitlementCacheIsolationTest.kt\",\n        \"name\": \"identify B makes A entitlements unreachable from in-memory\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/EntitlementCacheIsolationTest.kt\",\n        \"name\": \"clearAll removes every per-user storage key plus the index\"\n      },\n      {\n        \"file\": \"sdks/android/crossdeck/src/test/kotlin/com/crossdeck/EntitlementCacheIsolationTest.kt\",\n        \"name\": \"a fresh cache bound to A's key CANNOT read B's blob\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 1.3 (web/RN) + dogfood-gap fix (swift + android)\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": true\n  },\n  {\n    \"id\": \"sdk-error-codes-catalogue\",\n    \"pillar\": \"errors\",\n    \"status\": \"enforced\",\n    \"claim\": \"Web + Node SDK error-codes catalogues include EVERY backend-emitted ApiErrorCode with a description + resolution. Pre-v1.4.0 the catalogues documented codes the SDK threw ITSELF but ZERO backend codes — a developer hitting `invalid_api_key` / `origin_not_allowed` / `bundle_id_not_allowed` / `env_mismatch` / `idempotency_key_in_use` etc. got `undefined` from getErrorCode() and had to hunt for guidance. v1.4.0 backfills the catalogue from backend/src/api/v1-errors.ts so every wire code has a canonical 'what does this mean / what should I do' answer Stripe-style.\",\n    \"appliesTo\": [\n      \"web\",\n      \"node\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/error-codes.ts\",\n      \"sdks/node/src/error-codes.ts\",\n      \"sdks/web/src/_contract-verifiers.ts\",\n      \"backend/src/api/v1-errors.ts\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/contract-verifiers.test.ts\",\n        \"name\": \"sdk-error-codes-catalogue covers every backend wire code with remediation\"\n      },\n      {\n        \"file\": \"sdks/web/tests/error-codes-backfill.test.ts\",\n        \"name\": \"includes backend code\"\n      },\n      {\n        \"file\": \"sdks/web/tests/error-codes-backfill.test.ts\",\n        \"name\": \"invalid_api_key resolution points at the dashboard\"\n      },\n      {\n        \"file\": \"sdks/web/tests/error-codes-backfill.test.ts\",\n        \"name\": \"idempotency_key_in_use resolution mentions Stripe-grade contract\"\n      },\n      {\n        \"file\": \"sdks/web/tests/error-codes-backfill.test.ts\",\n        \"name\": \"identity-lock codes carry permission_error type\"\n      },\n      {\n        \"file\": \"sdks/web/tests/error-codes-backfill.test.ts\",\n        \"name\": \"no entry has an empty description or resolution\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 6.2\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": true\n  },\n  {\n    \"id\": \"super-property-merge-precedence\",\n    \"pillar\": \"analytics\",\n    \"status\": \"enforced\",\n    \"claim\": \"Every Crossdeck SDK merges event properties with the precedence device < super < caller (caller-supplied values win over registered super-properties, which win over auto-attached device info). Pre-v1.4.0 Swift had it INVERTED (super < device < caller — device clobbered super), so a `register('plan', 'pro')` super-property was silently overridden by auto-attached device fields whenever keys collided. Cross-SDK funnel queries on super-property keys returned different answers per platform.\",\n    \"appliesTo\": [\n      \"web\",\n      \"swift\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/super-properties.ts\",\n      \"sdks/web/src/_contract-verifiers.ts\",\n      \"sdks/swift/Sources/Crossdeck/EventPropertyMerge.swift\",\n      \"sdks/swift/Sources/Crossdeck/Crossdeck.swift\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/contract-verifiers.test.ts\",\n        \"name\": \"super-property-merge-precedence verifies caller > super > device\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift\",\n        \"name\": \"test_super_overrides_device\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift\",\n        \"name\": \"test_caller_overrides_super\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift\",\n        \"name\": \"test_full_precedence_chain\"\n      },\n      {\n        \"file\": \"sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift\",\n        \"name\": \"test_matchesWebNodeRNPrecedence\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 3.2\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": true\n  },\n  {\n    \"id\": \"sync-purchases-funnel-parity\",\n    \"pillar\": \"analytics\",\n    \"status\": \"enforced\",\n    \"claim\": \"Manual syncPurchases() emits a `purchase.completed` analytics event on success across ALL SDKs (Web / Node / RN / Swift / Android). Pre-v1.4.0 only Swift/Android auto-track emitted it — Web/Node/RN manual calls + Swift/Android manual calls fired ZERO analytics. Schema mirrors the auto-track event name + rail/productId/subscriptionId so cross-platform funnels reconcile on every payment path. When the backend short-circuits via the v1.4.0 idempotency cache, the event also carries `idempotent_replay: true`.\",\n    \"appliesTo\": [\n      \"web\",\n      \"node\",\n      \"react-native\",\n      \"swift\",\n      \"android\"\n    ],\n    \"codeRef\": [\n      \"sdks/web/src/crossdeck.ts\",\n      \"sdks/node/src/crossdeck-server.ts\",\n      \"sdks/react-native/src/crossdeck.ts\",\n      \"sdks/swift/Sources/Crossdeck/Crossdeck.swift\",\n      \"sdks/android/crossdeck/src/main/kotlin/com/crossdeck/Crossdeck.kt\"\n    ],\n    \"testRef\": [\n      {\n        \"file\": \"sdks/web/tests/sync-purchases-funnel.test.ts\",\n        \"name\": \"emits purchase.completed after a successful sync\"\n      },\n      {\n        \"file\": \"sdks/web/tests/sync-purchases-funnel.test.ts\",\n        \"name\": \"carries idempotent_replay=true when backend replied from cache\"\n      }\n    ],\n    \"registeredAt\": \"2026-05-26\",\n    \"firstRegisteredIn\": \"bank-grade reconciliation v1.4.0 — phase 3.5\",\n    \"bundledIn\": \"@cross-deck/web@1.14.1\",\n    \"runtimeVerified\": false\n  }\n]) as readonly Contract[];\n","/**\n * Public, typed accessor for the bank-grade behavioural contracts\n * this SDK ships. The full architecture — schema, distribution,\n * audit loop, pillar taxonomy — lives in `contracts/README.md`\n * at the monorepo root.\n *\n * Why a typed surface (vs. plain JSON access): contract IDs and\n * pillar names are part of Crossdeck's public commitment to\n * customers. Reading them through `CrossdeckContracts` means the\n * compiler catches drift the moment a contract is renamed or\n * retired. Tools that consume contracts at runtime (dashboards,\n * AI assistants, customer integration tests) get the exact same\n * shape every SDK ships, with no parsing layer to drift.\n *\n * --- BINARY STABILITY ---\n * `Contract` is treated as an evolving — but back-compat — wire\n * shape. Fields may be added in any minor release. Existing\n * fields will not be removed or repurposed except in a major\n * version bump, even if all known contracts stop using them.\n * Customers can rely on `id`, `pillar`, `status`, `appliesTo`,\n * `codeRef`, `testRef`, `registeredAt`, `firstRegisteredIn`,\n * and `bundledIn` being present on every contract in every\n * future minor/patch release of this SDK.\n */\n\nimport {\n  BUNDLED_CONTRACTS,\n  BUNDLED_IN,\n  SDK_VERSION,\n} from \"./_contracts-bundled\";\n\n/**\n * Which bank-grade pillar a contract belongs to. The taxonomy is\n * deliberately small — every contract maps to exactly one. New\n * pillars require a Crossdeck major-version bump.\n */\nexport type ContractPillar =\n  | \"revenue\"\n  | \"entitlements\"\n  | \"analytics\"\n  | \"webhooks\"\n  | \"errors\"\n  | \"lifecycle\"\n  | \"identity\";\n\n/**\n * Lifecycle stage of a contract.\n * - `enforced`: live in this SDK and exercised by `testRef`.\n * - `proposed`: registered for an upcoming release; `testRef`\n *    may point to a not-yet-existing file.\n * - `retired`: kept for history only; the behaviour no longer\n *    ships. Filtered out of `CrossdeckContracts.all()` by default.\n */\nexport type ContractStatus = \"enforced\" | \"proposed\" | \"retired\";\n\n/** Which SDKs (and/or `backend`) a contract is binding on. */\nexport type ContractAppliesTo =\n  | \"web\"\n  | \"node\"\n  | \"react-native\"\n  | \"swift\"\n  | \"android\"\n  | \"backend\";\n\n/**\n * Pointer to the test that exercises a contract clause. The\n * `name` is matched verbatim against the file's text by\n * `scripts/contract-audit.mjs`, so a rename without updating\n * the contract aborts CI.\n */\nexport interface ContractTestRef {\n  readonly file: string;\n  readonly name: string;\n}\n\n/** One bank-grade behavioural guarantee — see `contracts/README.md`. */\nexport interface Contract {\n  readonly id: string;\n  readonly pillar: ContractPillar;\n  readonly status: ContractStatus;\n  readonly claim: string;\n  readonly appliesTo: readonly ContractAppliesTo[];\n  readonly codeRef: readonly string[];\n  readonly testRef: readonly ContractTestRef[];\n  /** ISO-8601 date the contract was first registered. */\n  readonly registeredAt: string;\n  /** The release note / phase the contract first appeared in. Immutable. */\n  readonly firstRegisteredIn: string;\n  /** The SDK release this snapshot was bundled with, stamped at build time. */\n  readonly bundledIn: string;\n  /**\n   * Whether THIS SDK self-verifies this contract at runtime (a verifier is\n   * registered in the SDK's `STATIC_VERIFIERS` harness, emitting\n   * `crossdeck.contract_failed` live), vs. proven by CI tests only.\n   *\n   * DERIVED at bundle time from the verifier registry — never hand-set —\n   * so the registry can never disagree with what actually runs. Runtime\n   * status is a property of (contract × SDK): the same contract can be\n   * `true` here (web) and `false` in another SDK that lacks the harness.\n   *\n   * `true`  → surfaces in the console as \"watch it pass live\".\n   * `false` → \"CI-proven every release\" (still enforced, just not a\n   *           live toggle on this platform).\n   */\n  readonly runtimeVerified: boolean;\n}\n\n/**\n * Typed entry point to the bank-grade contracts bundled with this\n * SDK release. Stable, side-effect-free, tree-shakeable.\n *\n * @example Audit at app boot\n * ```ts\n * import { CrossdeckContracts } from \"@cross-deck/web\";\n *\n * for (const c of CrossdeckContracts.all()) {\n *   console.log(`[crossdeck] ${c.id} (${c.pillar})`);\n * }\n * ```\n *\n * @example Assert a specific clause is in force\n * ```ts\n * const isolation = CrossdeckContracts.byId(\"per-user-cache-isolation\");\n * if (!isolation || isolation.status !== \"enforced\") {\n *   throw new Error(\"entitlement isolation contract is not enforced — refusing to start\");\n * }\n * ```\n */\nexport const CrossdeckContracts = {\n  /** Every contract that applies to this SDK and is currently enforced. */\n  all(): readonly Contract[] {\n    return BUNDLED_CONTRACTS.filter((c) => c.status === \"enforced\");\n  },\n\n  /**\n   * Every contract bundled with this SDK release, including\n   * `proposed` and `retired` entries. Use `all()` for the\n   * enforced-only view.\n   */\n  allIncludingHistorical(): readonly Contract[] {\n    return BUNDLED_CONTRACTS;\n  },\n\n  /** Look up a contract by its stable `id`. */\n  byId(id: string): Contract | undefined {\n    return BUNDLED_CONTRACTS.find((c) => c.id === id);\n  },\n\n  /** Every enforced contract within a pillar. */\n  byPillar(pillar: ContractPillar): readonly Contract[] {\n    return BUNDLED_CONTRACTS.filter(\n      (c) => c.pillar === pillar && c.status === \"enforced\",\n    );\n  },\n\n  /** Filter by lifecycle status. */\n  withStatus(status: ContractStatus): readonly Contract[] {\n    return BUNDLED_CONTRACTS.filter((c) => c.status === status);\n  },\n\n  /** Semver of the SDK release these contracts were bundled with. */\n  sdkVersion: SDK_VERSION,\n\n  /** Fully-qualified bundle identifier — e.g. `@cross-deck/web@1.4.2`. */\n  bundledIn: BUNDLED_IN,\n\n  /**\n   * Resolve a failing test back to the contract it exercises.\n   * Used by test-framework hooks (Vitest `afterEach`, XCTest\n   * observation, JUnit `TestWatcher`) to find the contract id of\n   * a failed contract test so `reportContractFailure(...)` can\n   * stamp the right `contract_id` on the emitted event.\n   *\n   * Match is on `testRef.name` (case-sensitive, exact). Returns\n   * the first contract whose `testRef` list contains a matching\n   * entry, regardless of pillar or status.\n   */\n  findByTestName(name: string): Contract | undefined {\n    return BUNDLED_CONTRACTS.find((c) =>\n      c.testRef.some((ref) => ref.name === name),\n    );\n  },\n} as const;\n\n/**\n * Input to {@link Crossdeck.reportContractFailure}. Lets a test\n * harness / dogfood app / customer integration report a contract\n * violation back to Crossdeck on the dedicated reliability channel —\n * single-fire, never visible in the customer's dashboard.\n *\n * SCHEMA-LOCK: this interface's field set is exhaustively named. No\n * free-form `extra: Record<string, unknown>` — the schema-lock\n * contract at\n * `contracts/diagnostics/contract-failed-payload-schema-lock.json`\n * forbids unbounded fields. Adding a field requires a PR that\n * amends the contract first, then the public interface.\n *\n * `sdk_version` and `sdk_platform` are auto-stamped by the SDK so\n * every emitted event carries them correctly without the caller\n * needing to read them out of `CrossdeckContracts.sdkVersion`.\n */\nexport interface ContractFailureInput {\n  /** Stable contract id (`per-user-cache-isolation` etc.). */\n  contractId: string;\n  /**\n   * Short categorical-ish label — the SDK convention is to keep this\n   * under 128 chars and stable across runs (so dashboards can group).\n   * Never an end-user-supplied string.\n   */\n  failureReason: string;\n  /**\n   * Where the failure was observed:\n   *   - `ci`            — the SDK's own test suite on CI\n   *   - `dogfood`       — Crossdeck's internal dogfood project\n   *   - `customer-app`  — a customer's app verifying contracts\n   */\n  runContext: \"ci\" | \"dogfood\" | \"customer-app\";\n  /**\n   * Stable identifier for this verification run. CI: `GITHUB_RUN_ID`\n   * or equivalent. Dogfood: per-launch UUID. Customer app: any\n   * stable handle the customer chooses to group fires by run.\n   */\n  runId: string;\n  /**\n   * Optional pointer back to the failing test, for triage. The SDK\n   * sends both `test_file` and `test_name` on the wire when set.\n   */\n  testRef?: { file: string; name: string };\n  /**\n   * Optional coarse device class, e.g. \"desktop\", \"mobile-web\",\n   * \"ssr\". A categorical bucket, not a device identifier.\n   */\n  deviceClass?: string;\n}\n"],"mappings":"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","names":["SDK_VERSION","SDK_VERSION"]}