The Swift Package Index logo.Swift Package Index

Build Information

Successful build of Revnix, reference v1.11.0 (095c4f), with Swift 6.1 for macOS (SPM) on 30 Oct 2026 12:52:33 UTC.

Swift 6 data race errors: 3

Build Command

env DEVELOPER_DIR=/Applications/Xcode-16.3.0.app xcrun swift build --arch arm64 -Xswiftc -Xfrontend -Xswiftc -stats-output-dir -Xswiftc -Xfrontend -Xswiftc .stats -Xswiftc -strict-concurrency=complete -Xswiftc -enable-upcoming-feature -Xswiftc StrictConcurrency -Xswiftc -enable-upcoming-feature -Xswiftc DisableOutwardActorInference -Xswiftc -enable-upcoming-feature -Xswiftc GlobalActorIsolatedTypesUsability -Xswiftc -enable-upcoming-feature -Xswiftc InferSendableFromCaptures

Build Log

========================================
RunAll
========================================
Builder version: 5.1.4
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/Oth-tech/RevnixSDK-iOS.git
Reference: v1.11.0
Initialized empty Git repository in /Users/admin/builder/spi-builder-workspace/.git/
From https://github.com/Oth-tech/RevnixSDK-iOS
 * tag               v1.11.0    -> FETCH_HEAD
HEAD is now at 095c4f1 Merge pull request #70 from Oth-tech/release/v1.11.0
Cloned https://github.com/Oth-tech/RevnixSDK-iOS.git
Revision (git rev-parse @):
095c4f1e0427cc482d7b791dcb919723cac1a0eb
SPI manifest file found: $PWD/.spi.yml
SUCCESS checkout https://github.com/Oth-tech/RevnixSDK-iOS.git at v1.11.0
========================================
Build
========================================
Selected platform:         macosSpm
Swift version:             6.1
Building package at path:  $PWD
https://github.com/Oth-tech/RevnixSDK-iOS.git
https://github.com/Oth-tech/RevnixSDK-iOS.git
{
  "dependencies" : [
  ],
  "manifest_display_name" : "Revnix",
  "name" : "Revnix",
  "path" : "/Users/admin/builder/spi-builder-workspace",
  "platforms" : [
    {
      "name" : "ios",
      "version" : "16.0"
    },
    {
      "name" : "macos",
      "version" : "13.0"
    },
    {
      "name" : "tvos",
      "version" : "16.0"
    },
    {
      "name" : "watchos",
      "version" : "9.0"
    }
  ],
  "products" : [
    {
      "name" : "Revnix",
      "targets" : [
        "Revnix"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    }
  ],
  "targets" : [
    {
      "c99name" : "RevnixTests",
      "module_type" : "SwiftTarget",
      "name" : "RevnixTests",
      "path" : "Tests/RevnixTests",
      "resources" : [
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/Revnix.storekit",
          "rule" : {
            "copy" : {
            }
          }
        },
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-background-wire.json",
          "rule" : {
            "copy" : {
            }
          }
        },
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-selection-wire.json",
          "rule" : {
            "copy" : {
            }
          }
        }
      ],
      "sources" : [
        "AttributionTests.swift",
        "DeepLinkPrivacyTests.swift",
        "ImplicitPlacementTests.swift",
        "PaywallBackgroundTests.swift",
        "PaywallBlockFillTests.swift",
        "PaywallBlockGeometryTests.swift",
        "PaywallBlockTests.swift",
        "PaywallLocalizationTests.swift",
        "PaywallSelectionWireTests.swift",
        "PreviewTests.swift",
        "PrivacyManifestTests.swift",
        "RevnixClientTests.swift",
        "SkanTests.swift",
        "StoreKitIntegrationTests.swift",
        "TrackingTests.swift"
      ],
      "target_dependencies" : [
        "Revnix"
      ],
      "type" : "test"
    },
    {
      "c99name" : "Revnix",
      "module_type" : "SwiftTarget",
      "name" : "Revnix",
      "path" : "Sources/Revnix",
      "product_memberships" : [
        "Revnix"
      ],
      "resources" : [
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PrivacyInfo.xcprivacy",
          "rule" : {
            "copy" : {
            }
          }
        }
      ],
      "sources" : [
        "DeviceFacts.swift",
        "ImplicitPlacements.swift",
        "Models.swift",
        "PaywallBackground.swift",
        "PaywallBlockGeometry.swift",
        "PaywallBlocks.swift",
        "PaywallLocalization.swift",
        "PaywallRenderRules.swift",
        "RevnixClient.swift",
        "RevnixConfig.swift",
        "RevnixError.swift",
        "RevnixPaywallBlockView.swift",
        "RevnixPaywallView.swift",
        "Skan.swift",
        "Storage.swift",
        "StoreKitGlue.swift",
        "Tracking.swift"
      ],
      "type" : "library"
    }
  ],
  "tools_version" : "5.9"
}
Running build ...
env DEVELOPER_DIR=/Applications/Xcode-16.3.0.app xcrun swift build --arch arm64 -Xswiftc -Xfrontend -Xswiftc -stats-output-dir -Xswiftc -Xfrontend -Xswiftc .stats -Xswiftc -strict-concurrency=complete -Xswiftc -enable-upcoming-feature -Xswiftc StrictConcurrency -Xswiftc -enable-upcoming-feature -Xswiftc DisableOutwardActorInference -Xswiftc -enable-upcoming-feature -Xswiftc GlobalActorIsolatedTypesUsability -Xswiftc -enable-upcoming-feature -Xswiftc InferSendableFromCaptures
Building for debugging...
[0/3] Write sources
[1/3] Copying PrivacyInfo.xcprivacy
[2/3] Write swift-version-2F0A5646E1D333AE.txt
[4/21] Compiling Revnix Tracking.swift
[5/22] Compiling Revnix resource_bundle_accessor.swift
[6/22] Compiling Revnix Storage.swift
[7/22] Compiling Revnix StoreKitGlue.swift
[8/22] Compiling Revnix RevnixError.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1309:54: warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1307 |         audioSilencers = looper.loopingPlayerItems.map { item in
1308 |             item.observe(\.tracks, options: [.initial]) { item, _ in
1309 |                 for track in item.tracks where track.assetTrack?.mediaType == .audio { track.isEnabled = false }
     |                                                      `- warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1310 |             }
1311 |         }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVPlayerItemTrack.h:45:57: note: property declared here
 43 | 	notification queue.  By default, this queue is the main queue.
 44 | */
 45 | @property (nonatomic, readonly, nullable) AVAssetTrack *assetTrack;
    |                                                         `- note: property declared here
 46 |
 47 | /*!
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1314:56: warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1312 |         for item in looper.loopingPlayerItems {
1313 |             Task {
1314 |                 if let audible = try? await item.asset.loadMediaSelectionGroup(for: .audible) {
     |                                                        `- warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1315 |                     item.select(nil, in: audible)
1316 |                 }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVMediaSelectionGroup.h:28:12: note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
 26 |
 27 | API_AVAILABLE(macos(10.8), ios(5.0), tvos(9.0), watchos(1.0), visionos(1.0))
 28 | @interface AVMediaSelectionGroup : NSObject <NSCopying> {
    |            `- note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
 29 | @private
 30 | 	AVMediaSelectionGroupInternal	*_mediaSelectionGroup;
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:26:1: warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
  24 | import SwiftUI
  25 | #if os(macOS)
  26 | import AVFoundation
     | `- warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
  27 | typealias RevnixNativeView = NSView
  28 | #elseif !os(watchOS)
[9/22] Compiling Revnix RevnixPaywallBlockView.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1309:54: warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1307 |         audioSilencers = looper.loopingPlayerItems.map { item in
1308 |             item.observe(\.tracks, options: [.initial]) { item, _ in
1309 |                 for track in item.tracks where track.assetTrack?.mediaType == .audio { track.isEnabled = false }
     |                                                      `- warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1310 |             }
1311 |         }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVPlayerItemTrack.h:45:57: note: property declared here
 43 | 	notification queue.  By default, this queue is the main queue.
 44 | */
 45 | @property (nonatomic, readonly, nullable) AVAssetTrack *assetTrack;
    |                                                         `- note: property declared here
 46 |
 47 | /*!
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1314:56: warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1312 |         for item in looper.loopingPlayerItems {
1313 |             Task {
1314 |                 if let audible = try? await item.asset.loadMediaSelectionGroup(for: .audible) {
     |                                                        `- warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1315 |                     item.select(nil, in: audible)
1316 |                 }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVMediaSelectionGroup.h:28:12: note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
 26 |
 27 | API_AVAILABLE(macos(10.8), ios(5.0), tvos(9.0), watchos(1.0), visionos(1.0))
 28 | @interface AVMediaSelectionGroup : NSObject <NSCopying> {
    |            `- note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
 29 | @private
 30 | 	AVMediaSelectionGroupInternal	*_mediaSelectionGroup;
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:26:1: warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
  24 | import SwiftUI
  25 | #if os(macOS)
  26 | import AVFoundation
     | `- warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
  27 | typealias RevnixNativeView = NSView
  28 | #elseif !os(watchOS)
[10/22] Compiling Revnix PaywallLocalization.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallLocalization.swift:106:13: warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
104 |
105 | private let revnixLocaleOverrideLock = NSLock()
106 | private var revnixLocaleOverride: String?
    |             |- warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
    |             |- note: convert 'revnixLocaleOverride' to a 'let' constant to make 'Sendable' shared state immutable
    |             |- note: add '@MainActor' to make var 'revnixLocaleOverride' part of global actor 'MainActor'
    |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
107 |
108 | func revnixSetLocaleOverride(_ tag: String?) {
[11/22] Compiling Revnix PaywallRenderRules.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallLocalization.swift:106:13: warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
104 |
105 | private let revnixLocaleOverrideLock = NSLock()
106 | private var revnixLocaleOverride: String?
    |             |- warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
    |             |- note: convert 'revnixLocaleOverride' to a 'let' constant to make 'Sendable' shared state immutable
    |             |- note: add '@MainActor' to make var 'revnixLocaleOverride' part of global actor 'MainActor'
    |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
107 |
108 | func revnixSetLocaleOverride(_ tag: String?) {
[12/22] Compiling Revnix RevnixClient.swift
[13/22] Compiling Revnix RevnixConfig.swift
[14/22] Compiling Revnix Models.swift
[15/22] Compiling Revnix PaywallBackground.swift
[16/22] Compiling Revnix PaywallBlockGeometry.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:347:71: warning: conditional downcast from 'String?' to 'String' does nothing
345 |         let c = try decoder.container(keyedBy: CodingKeys.self)
346 |         icon = try? c.decodeIfPresent(String.self, forKey: .icon)
347 |         title = (try? c.decodeIfPresent(String.self, forKey: .title)) as? String ?? ""
    |                                                                       `- warning: conditional downcast from 'String?' to 'String' does nothing
348 |         description = try? c.decodeIfPresent(String.self, forKey: .description)
349 |     }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:544:69: warning: conditional downcast from 'String?' to 'String' does nothing
542 |             return
543 |         }
544 |         let id = (try? c.decodeIfPresent(String.self, forKey: .id)) as? String ?? ""
    |                                                                     `- warning: conditional downcast from 'String?' to 'String' does nothing
545 |         let style = try? c.decodeIfPresent(BlockStyle.self, forKey: .style)
546 |         func string(_ key: Keys) -> String? { (try? c.decodeIfPresent(String.self, forKey: key)) ?? nil }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:573:83: warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
571 |             ))
572 |         case "list":
573 |             let items = (try? c.decodeIfPresent([ListItem].self, forKey: .items)) as? [ListItem] ?? []
    |                                                                                   `- warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
574 |             self = .list(ListBlock(
575 |                 id: id, items: items, iconColor: string(.iconColor), style: style,
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:606:93: warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
604 |             ))
605 |         case "card":
606 |             let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
    |                                                                                             `- warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
607 |             let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 |             let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:607:80: warning: conditional downcast from 'Int?' to 'Int' does nothing
605 |         case "card":
606 |             let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 |             let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
    |                                                                                `- warning: conditional downcast from 'Int?' to 'Int' does nothing
608 |             let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
609 |             self = .card(CardBlock(
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:608:83: warning: conditional downcast from 'Int?' to 'Int' does nothing
606 |             let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 |             let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 |             let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
    |                                                                                   `- warning: conditional downcast from 'Int?' to 'Int' does nothing
609 |             self = .card(CardBlock(
610 |                 id: id, layout: string(.layout), autoAdvance: int(.autoAdvance), repeatMode: string(.repeat),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:817:73: warning: conditional downcast from 'Int?' to 'Int' does nothing
815 |         }
816 |         self.screens = screens
817 |         version = ((try? c.decodeIfPresent(Int.self, forKey: .version)) as? Int) ?? 1
    |                                                                         `- warning: conditional downcast from 'Int?' to 'Int' does nothing
818 |         layout = try? c.decodeIfPresent(String.self, forKey: .layout)
819 |         // `background` is a plain string in the original form and an object in
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:826:80: warning: conditional downcast from 'String?' to 'String' does nothing
824 |         backgroundSpec = spec
825 |         background = revnixBackgroundGround(spec) ?? "#000000"
826 |         textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
    |                                                                                `- warning: conditional downcast from 'String?' to 'String' does nothing
827 |         accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 |         accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:827:74: warning: conditional downcast from 'String?' to 'String' does nothing
825 |         background = revnixBackgroundGround(spec) ?? "#000000"
826 |         textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 |         accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
    |                                                                          `- warning: conditional downcast from 'String?' to 'String' does nothing
828 |         accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
829 |         fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:828:80: warning: conditional downcast from 'String?' to 'String' does nothing
826 |         textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 |         accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 |         accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
    |                                                                                `- warning: conditional downcast from 'String?' to 'String' does nothing
829 |         fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
830 |         // REV-271: a malformed table costs the translations, never the
[17/22] Compiling Revnix PaywallBlocks.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:347:71: warning: conditional downcast from 'String?' to 'String' does nothing
345 |         let c = try decoder.container(keyedBy: CodingKeys.self)
346 |         icon = try? c.decodeIfPresent(String.self, forKey: .icon)
347 |         title = (try? c.decodeIfPresent(String.self, forKey: .title)) as? String ?? ""
    |                                                                       `- warning: conditional downcast from 'String?' to 'String' does nothing
348 |         description = try? c.decodeIfPresent(String.self, forKey: .description)
349 |     }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:544:69: warning: conditional downcast from 'String?' to 'String' does nothing
542 |             return
543 |         }
544 |         let id = (try? c.decodeIfPresent(String.self, forKey: .id)) as? String ?? ""
    |                                                                     `- warning: conditional downcast from 'String?' to 'String' does nothing
545 |         let style = try? c.decodeIfPresent(BlockStyle.self, forKey: .style)
546 |         func string(_ key: Keys) -> String? { (try? c.decodeIfPresent(String.self, forKey: key)) ?? nil }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:573:83: warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
571 |             ))
572 |         case "list":
573 |             let items = (try? c.decodeIfPresent([ListItem].self, forKey: .items)) as? [ListItem] ?? []
    |                                                                                   `- warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
574 |             self = .list(ListBlock(
575 |                 id: id, items: items, iconColor: string(.iconColor), style: style,
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:606:93: warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
604 |             ))
605 |         case "card":
606 |             let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
    |                                                                                             `- warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
607 |             let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 |             let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:607:80: warning: conditional downcast from 'Int?' to 'Int' does nothing
605 |         case "card":
606 |             let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 |             let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
    |                                                                                `- warning: conditional downcast from 'Int?' to 'Int' does nothing
608 |             let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
609 |             self = .card(CardBlock(
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:608:83: warning: conditional downcast from 'Int?' to 'Int' does nothing
606 |             let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 |             let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 |             let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
    |                                                                                   `- warning: conditional downcast from 'Int?' to 'Int' does nothing
609 |             self = .card(CardBlock(
610 |                 id: id, layout: string(.layout), autoAdvance: int(.autoAdvance), repeatMode: string(.repeat),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:817:73: warning: conditional downcast from 'Int?' to 'Int' does nothing
815 |         }
816 |         self.screens = screens
817 |         version = ((try? c.decodeIfPresent(Int.self, forKey: .version)) as? Int) ?? 1
    |                                                                         `- warning: conditional downcast from 'Int?' to 'Int' does nothing
818 |         layout = try? c.decodeIfPresent(String.self, forKey: .layout)
819 |         // `background` is a plain string in the original form and an object in
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:826:80: warning: conditional downcast from 'String?' to 'String' does nothing
824 |         backgroundSpec = spec
825 |         background = revnixBackgroundGround(spec) ?? "#000000"
826 |         textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
    |                                                                                `- warning: conditional downcast from 'String?' to 'String' does nothing
827 |         accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 |         accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:827:74: warning: conditional downcast from 'String?' to 'String' does nothing
825 |         background = revnixBackgroundGround(spec) ?? "#000000"
826 |         textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 |         accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
    |                                                                          `- warning: conditional downcast from 'String?' to 'String' does nothing
828 |         accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
829 |         fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:828:80: warning: conditional downcast from 'String?' to 'String' does nothing
826 |         textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 |         accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 |         accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
    |                                                                                `- warning: conditional downcast from 'String?' to 'String' does nothing
829 |         fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
830 |         // REV-271: a malformed table costs the translations, never the
[18/22] Compiling Revnix DeviceFacts.swift
[19/22] Compiling Revnix ImplicitPlacements.swift
[20/22] Emitting module Revnix
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallLocalization.swift:106:13: warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
104 |
105 | private let revnixLocaleOverrideLock = NSLock()
106 | private var revnixLocaleOverride: String?
    |             |- warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
    |             |- note: convert 'revnixLocaleOverride' to a 'let' constant to make 'Sendable' shared state immutable
    |             |- note: add '@MainActor' to make var 'revnixLocaleOverride' part of global actor 'MainActor'
    |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
107 |
108 | func revnixSetLocaleOverride(_ tag: String?) {
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:93:23: warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
  69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
  70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
  71 | public struct RevnixPaywallTheme: Equatable {
     |               `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
  72 |     public var background: Color
  73 |     public var textPrimary: Color
     :
  91 |
  92 |     /// Base theme for dark configs (and legacy configs without `mode`).
  93 |     public static let dark = RevnixPaywallTheme(
     |                       |- warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: add '@MainActor' to make static property 'dark' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
  94 |         background: rgb(0x0f1116), textPrimary: rgb(0xffffff),
  95 |         textSecondary: rgb(0x9aa0a8), textFaint: rgb(0x6b7078),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:100:23: warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
  69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
  70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
  71 | public struct RevnixPaywallTheme: Equatable {
     |               `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
  72 |     public var background: Color
  73 |     public var textPrimary: Color
     :
  98 |     /// Base theme when the dashboard config sets `mode: "light"`. Keep in
  99 |     /// lockstep with the builder preview (PaywallPhonePreview SCREEN_PALETTES).
 100 |     public static let light = RevnixPaywallTheme(
     |                       |- warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: add '@MainActor' to make static property 'light' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
 101 |         background: rgb(0xffffff), textPrimary: rgb(0x16181d),
 102 |         textSecondary: rgb(0x5b6068), textFaint: rgb(0x9aa0a8),
[21/22] Compiling Revnix RevnixPaywallView.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:93:23: warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
  69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
  70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
  71 | public struct RevnixPaywallTheme: Equatable {
     |               `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
  72 |     public var background: Color
  73 |     public var textPrimary: Color
     :
  91 |
  92 |     /// Base theme for dark configs (and legacy configs without `mode`).
  93 |     public static let dark = RevnixPaywallTheme(
     |                       |- warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: add '@MainActor' to make static property 'dark' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
  94 |         background: rgb(0x0f1116), textPrimary: rgb(0xffffff),
  95 |         textSecondary: rgb(0x9aa0a8), textFaint: rgb(0x6b7078),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:100:23: warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
  69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
  70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
  71 | public struct RevnixPaywallTheme: Equatable {
     |               `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
  72 |     public var background: Color
  73 |     public var textPrimary: Color
     :
  98 |     /// Base theme when the dashboard config sets `mode: "light"`. Keep in
  99 |     /// lockstep with the builder preview (PaywallPhonePreview SCREEN_PALETTES).
 100 |     public static let light = RevnixPaywallTheme(
     |                       |- warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: add '@MainActor' to make static property 'light' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
 101 |         background: rgb(0xffffff), textPrimary: rgb(0x16181d),
 102 |         textSecondary: rgb(0x5b6068), textFaint: rgb(0x9aa0a8),
[22/22] Compiling Revnix Skan.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:93:23: warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
  69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
  70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
  71 | public struct RevnixPaywallTheme: Equatable {
     |               `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
  72 |     public var background: Color
  73 |     public var textPrimary: Color
     :
  91 |
  92 |     /// Base theme for dark configs (and legacy configs without `mode`).
  93 |     public static let dark = RevnixPaywallTheme(
     |                       |- warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: add '@MainActor' to make static property 'dark' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
  94 |         background: rgb(0x0f1116), textPrimary: rgb(0xffffff),
  95 |         textSecondary: rgb(0x9aa0a8), textFaint: rgb(0x6b7078),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:100:23: warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
  69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
  70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
  71 | public struct RevnixPaywallTheme: Equatable {
     |               `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
  72 |     public var background: Color
  73 |     public var textPrimary: Color
     :
  98 |     /// Base theme when the dashboard config sets `mode: "light"`. Keep in
  99 |     /// lockstep with the builder preview (PaywallPhonePreview SCREEN_PALETTES).
 100 |     public static let light = RevnixPaywallTheme(
     |                       |- warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: add '@MainActor' to make static property 'light' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
 101 |         background: rgb(0xffffff), textPrimary: rgb(0x16181d),
 102 |         textSecondary: rgb(0x5b6068), textFaint: rgb(0x9aa0a8),
Build complete! (13.10s)
Build complete.
{
  "dependencies" : [
  ],
  "manifest_display_name" : "Revnix",
  "name" : "Revnix",
  "path" : "/Users/admin/builder/spi-builder-workspace",
  "platforms" : [
    {
      "name" : "ios",
      "version" : "16.0"
    },
    {
      "name" : "macos",
      "version" : "13.0"
    },
    {
      "name" : "tvos",
      "version" : "16.0"
    },
    {
      "name" : "watchos",
      "version" : "9.0"
    }
  ],
  "products" : [
    {
      "name" : "Revnix",
      "targets" : [
        "Revnix"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    }
  ],
  "targets" : [
    {
      "c99name" : "RevnixTests",
      "module_type" : "SwiftTarget",
      "name" : "RevnixTests",
      "path" : "Tests/RevnixTests",
      "resources" : [
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/Revnix.storekit",
          "rule" : {
            "copy" : {
            }
          }
        },
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-background-wire.json",
          "rule" : {
            "copy" : {
            }
          }
        },
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-selection-wire.json",
          "rule" : {
            "copy" : {
            }
          }
        }
      ],
      "sources" : [
        "AttributionTests.swift",
        "DeepLinkPrivacyTests.swift",
        "ImplicitPlacementTests.swift",
        "PaywallBackgroundTests.swift",
        "PaywallBlockFillTests.swift",
        "PaywallBlockGeometryTests.swift",
        "PaywallBlockTests.swift",
        "PaywallLocalizationTests.swift",
        "PaywallSelectionWireTests.swift",
        "PreviewTests.swift",
        "PrivacyManifestTests.swift",
        "RevnixClientTests.swift",
        "SkanTests.swift",
        "StoreKitIntegrationTests.swift",
        "TrackingTests.swift"
      ],
      "target_dependencies" : [
        "Revnix"
      ],
      "type" : "test"
    },
    {
      "c99name" : "Revnix",
      "module_type" : "SwiftTarget",
      "name" : "Revnix",
      "path" : "Sources/Revnix",
      "product_memberships" : [
        "Revnix"
      ],
      "resources" : [
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PrivacyInfo.xcprivacy",
          "rule" : {
            "copy" : {
            }
          }
        }
      ],
      "sources" : [
        "DeviceFacts.swift",
        "ImplicitPlacements.swift",
        "Models.swift",
        "PaywallBackground.swift",
        "PaywallBlockGeometry.swift",
        "PaywallBlocks.swift",
        "PaywallLocalization.swift",
        "PaywallRenderRules.swift",
        "RevnixClient.swift",
        "RevnixConfig.swift",
        "RevnixError.swift",
        "RevnixPaywallBlockView.swift",
        "RevnixPaywallView.swift",
        "Skan.swift",
        "Storage.swift",
        "StoreKitGlue.swift",
        "Tracking.swift"
      ],
      "type" : "library"
    }
  ],
  "tools_version" : "5.9"
}
Done.