The Swift Package Index logo.Swift Package Index

Build Information

Successful build of CouncilKit, reference main (d083d5), with Swift 6.1 for macOS (SPM) on 30 Sep 2026 10:57:55 UTC.

Swift 6 data race errors: 4

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.1
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/albertofettucini/CouncilKit.git
Reference: main
Initialized empty Git repository in /Users/admin/builder/spi-builder-workspace/.git/
From https://github.com/albertofettucini/CouncilKit
 * branch            main       -> FETCH_HEAD
 * [new branch]      main       -> origin/main
HEAD is now at d083d52 Outcome reminders as local notifications (CouncilKit 0.3.0)
Cloned https://github.com/albertofettucini/CouncilKit.git
Revision (git rev-parse @):
d083d523037e7b056a847bb5a1fbff6e7a65c575
SUCCESS checkout https://github.com/albertofettucini/CouncilKit.git at main
========================================
Build
========================================
Selected platform:         macosSpm
Swift version:             6.1
Building package at path:  $PWD
https://github.com/albertofettucini/CouncilKit.git
https://github.com/albertofettucini/CouncilKit.git
{
  "dependencies" : [
  ],
  "manifest_display_name" : "CouncilKit",
  "name" : "CouncilKit",
  "path" : "/Users/admin/builder/spi-builder-workspace",
  "platforms" : [
    {
      "name" : "macos",
      "version" : "14.0"
    }
  ],
  "products" : [
    {
      "name" : "CouncilKit",
      "targets" : [
        "CouncilKit"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "council",
      "targets" : [
        "council"
      ],
      "type" : {
        "executable" : null
      }
    }
  ],
  "targets" : [
    {
      "c99name" : "council",
      "module_type" : "SwiftTarget",
      "name" : "council",
      "path" : "Sources/council",
      "product_memberships" : [
        "council"
      ],
      "sources" : [
        "CouncilCLI.swift"
      ],
      "target_dependencies" : [
        "CouncilKit"
      ],
      "type" : "executable"
    },
    {
      "c99name" : "CouncilKitTests",
      "module_type" : "SwiftTarget",
      "name" : "CouncilKitTests",
      "path" : "Tests/CouncilKitTests",
      "sources" : [
        "CouncilKitTests.swift"
      ],
      "target_dependencies" : [
        "CouncilKit"
      ],
      "type" : "test"
    },
    {
      "c99name" : "CouncilKit",
      "module_type" : "SwiftTarget",
      "name" : "CouncilKit",
      "path" : "Sources/CouncilKit",
      "product_memberships" : [
        "CouncilKit",
        "council"
      ],
      "sources" : [
        "AnthropicClient.swift",
        "AppleFoundationClient.swift",
        "Archetype.swift",
        "Council.swift",
        "CouncilConfig.swift",
        "CouncilKit.swift",
        "CouncilStore.swift",
        "KeychainStore.swift",
        "LLMClient.swift",
        "LLMProvider.swift",
        "OpenAICompatibleClient.swift",
        "ReminderNotifications.swift",
        "Seat.swift",
        "Session.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/7] Write sources
[1/7] Write council-entitlement.plist
[2/7] Write sources
[3/7] Write swift-version-2F0A5646E1D333AE.txt
[5/21] Compiling CouncilKit Seat.swift
[6/22] Compiling CouncilKit OpenAICompatibleClient.swift
[7/22] Compiling CouncilKit LLMClient.swift
[8/22] Compiling CouncilKit ReminderNotifications.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/ReminderNotifications.swift:60:37: warning: non-sendable result type 'UNNotificationSettings' cannot be sent from nonisolated context in call to instance method 'notificationSettings()'; this is an error in the Swift 6 language mode
 58 |         guard CouncilRuntime.notificationsPossible else { return false }
 59 |         let center = UNUserNotificationCenter.current()
 60 |         let settings = await center.notificationSettings()
    |                                     `- warning: non-sendable result type 'UNNotificationSettings' cannot be sent from nonisolated context in call to instance method 'notificationSettings()'; this is an error in the Swift 6 language mode
 61 |         switch settings.authorizationStatus {
 62 |         case .authorized, .provisional:
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/UserNotifications.framework/Headers/UNNotificationSettings.h:58:12: note: class 'UNNotificationSettings' does not conform to the 'Sendable' protocol
56 |
57 | API_AVAILABLE(macos(10.14), ios(10.0), watchos(3.0), tvos(10.0))
58 | @interface UNNotificationSettings : NSObject <NSCopying, NSSecureCoding>
   |            `- note: class 'UNNotificationSettings' does not conform to the 'Sendable' protocol
59 |
60 | @property (NS_NONATOMIC_IOSONLY, readonly) UNAuthorizationStatus authorizationStatus;
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/ReminderNotifications.swift:2:1: warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'UserNotifications'
  1 | import Foundation
  2 | import UserNotifications
    | `- warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'UserNotifications'
  3 |
  4 | /// Small runtime facts shared across the engine.
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/ReminderNotifications.swift:83:41: warning: non-sendable result type 'UNNotificationSettings' cannot be sent from nonisolated context in call to instance method 'notificationSettings()'; this is an error in the Swift 6 language mode
 81 |         Task { @MainActor in
 82 |             let center = UNUserNotificationCenter.current()
 83 |             let settings = await center.notificationSettings()
    |                                         `- warning: non-sendable result type 'UNNotificationSettings' cannot be sent from nonisolated context in call to instance method 'notificationSettings()'; this is an error in the Swift 6 language mode
 84 |             reminderNotificationsDenied = settings.authorizationStatus == .denied
 85 |             guard settings.authorizationStatus == .authorized
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/UserNotifications.framework/Headers/UNNotificationSettings.h:58:12: note: class 'UNNotificationSettings' does not conform to the 'Sendable' protocol
56 |
57 | API_AVAILABLE(macos(10.14), ios(10.0), watchos(3.0), tvos(10.0))
58 | @interface UNNotificationSettings : NSObject <NSCopying, NSSecureCoding>
   |            `- note: class 'UNNotificationSettings' does not conform to the 'Sendable' protocol
59 |
60 | @property (NS_NONATOMIC_IOSONLY, readonly) UNAuthorizationStatus authorizationStatus;
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/ReminderNotifications.swift:88:40: warning: non-sendable result type '[UNNotificationRequest]' cannot be sent from nonisolated context in call to instance method 'pendingNotificationRequests()'; this is an error in the Swift 6 language mode
 86 |                     || settings.authorizationStatus == .provisional else { return }
 87 |
 88 |             let pending = await center.pendingNotificationRequests()
    |                                        `- warning: non-sendable result type '[UNNotificationRequest]' cannot be sent from nonisolated context in call to instance method 'pendingNotificationRequests()'; this is an error in the Swift 6 language mode
 89 |                 .filter { $0.identifier.hasPrefix(Self.reminderIDPrefix) }
 90 |             var keep = Set<String>()
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/UserNotifications.framework/Headers/UNNotificationRequest.h:16:12: note: class 'UNNotificationRequest' does not conform to the 'Sendable' protocol
14 |
15 | API_AVAILABLE(macos(10.14), ios(10.0), watchos(3.0), tvos(10.0))
16 | @interface UNNotificationRequest : NSObject <NSCopying, NSSecureCoding>
   |            `- note: class 'UNNotificationRequest' does not conform to the 'Sendable' protocol
17 |
18 | // The unique identifier for this notification request. It can be used to replace or remove a pending notification request or a delivered notification.
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/ReminderNotifications.swift:104:42: warning: non-sendable result type '[UNNotification]' cannot be sent from nonisolated context in call to instance method 'deliveredNotifications()'; this is an error in the Swift 6 language mode
102 |             // A banner already sitting in Notification Center for a loop that has since been closed
103 |             // (outcome logged, session deleted) goes too.
104 |             let delivered = await center.deliveredNotifications()
    |                                          `- warning: non-sendable result type '[UNNotification]' cannot be sent from nonisolated context in call to instance method 'deliveredNotifications()'; this is an error in the Swift 6 language mode
105 |                 .map(\.request.identifier)
106 |                 .filter { id in
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/UserNotifications.framework/Headers/UNNotification.h:15:12: note: class 'UNNotification' does not conform to the 'Sendable' protocol
13 |
14 | API_AVAILABLE(macos(10.14), ios(10.0), watchos(3.0), tvos(10.0))
15 | @interface UNNotification : NSObject <NSCopying, NSSecureCoding>
   |            `- note: class 'UNNotification' does not conform to the 'Sendable' protocol
16 |
17 | // The date displayed on the notification.
[9/22] Compiling CouncilKit LLMProvider.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/LLMProvider.swift:158:24: warning: static property 'containerPrefs' is not concurrency-safe because non-'Sendable' type 'NSDictionary?' may have shared mutable state; this is an error in the Swift 6 language mode
156 |         return containerPrefs?[key] as? String
157 |     }
158 |     private static let containerPrefs: NSDictionary? = NSDictionary(contentsOf:
    |                        |- warning: static property 'containerPrefs' is not concurrency-safe because non-'Sendable' type 'NSDictionary?' may have shared mutable state; this is an error in the Swift 6 language mode
    |                        |- note: add '@MainActor' to make static property 'containerPrefs' part of global actor 'MainActor'
    |                        `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
159 |         FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(
160 |             "Library/Containers/com.joseph.Council/Data/Library/Preferences/com.joseph.Council.plist"))
Swift.Optional:1:21: note: generic enum 'Optional' does not conform to the 'Sendable' protocol
1 | @frozen public enum Optional<Wrapped> : ~Copyable where Wrapped : ~Copyable {
  |                     `- note: generic enum 'Optional' does not conform to the 'Sendable' protocol
2 |     case none
3 |     case some(Wrapped)
[10/22] Compiling CouncilKit Session.swift
[11/22] Compiling CouncilKit CouncilConfig.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilConfig.swift:68:23: warning: static property 'presets' is not concurrency-safe because non-'Sendable' type '[CouncilConfig]' may have shared mutable state; this is an error in the Swift 6 language mode
  5 | /// shared prompt, and which seats synthesize / play devil's advocate. API keys are NEVER part of
  6 | /// this — they live only in the Keychain, per machine. Export → council.json → share → import.
  7 | public struct CouncilConfig: Codable, Identifiable {
    |               `- note: consider making struct 'CouncilConfig' conform to the 'Sendable' protocol
  8 |     public var id = UUID()
  9 |     public var name: String
    :
 66 |     /// One curated starting point. Models default to a strong trio; the importer keeps whatever
 67 |     /// keys it already has, and any seat can be re-picked afterward.
 68 |     public static let presets: [CouncilConfig] = [
    |                       |- warning: static property 'presets' is not concurrency-safe because non-'Sendable' type '[CouncilConfig]' may have shared mutable state; this is an error in the Swift 6 language mode
    |                       |- note: add '@MainActor' to make static property 'presets' part of global actor 'MainActor'
    |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
 69 |         CouncilConfig(
 70 |             name: "Code Review Council",
[12/22] Compiling CouncilKit CouncilKit.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilConfig.swift:68:23: warning: static property 'presets' is not concurrency-safe because non-'Sendable' type '[CouncilConfig]' may have shared mutable state; this is an error in the Swift 6 language mode
  5 | /// shared prompt, and which seats synthesize / play devil's advocate. API keys are NEVER part of
  6 | /// this — they live only in the Keychain, per machine. Export → council.json → share → import.
  7 | public struct CouncilConfig: Codable, Identifiable {
    |               `- note: consider making struct 'CouncilConfig' conform to the 'Sendable' protocol
  8 |     public var id = UUID()
  9 |     public var name: String
    :
 66 |     /// One curated starting point. Models default to a strong trio; the importer keeps whatever
 67 |     /// keys it already has, and any seat can be re-picked afterward.
 68 |     public static let presets: [CouncilConfig] = [
    |                       |- warning: static property 'presets' is not concurrency-safe because non-'Sendable' type '[CouncilConfig]' may have shared mutable state; this is an error in the Swift 6 language mode
    |                       |- note: add '@MainActor' to make static property 'presets' part of global actor 'MainActor'
    |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
 69 |         CouncilConfig(
 70 |             name: "Code Review Council",
[13/22] Compiling CouncilKit AnthropicClient.swift
[14/22] Compiling CouncilKit AppleFoundationClient.swift
[15/22] Compiling CouncilKit Archetype.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/Council.swift:342:19: warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
340 |         // Phase A — answers, streamed token-by-token (poll the store while ask() runs concurrently).
341 |         await withTaskGroup(of: Void.self) { group in
342 |             group.addTask { @MainActor [self] in
    |                   |- warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
    |                   `- note: Passing main actor-isolated value of non-Sendable type '() async -> Void' as a 'sending' parameter risks causing races inbetween main actor-isolated uses and uses reachable from the callee
343 |                 await store.ask(question, document: document)
344 |                 answersDone = true
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/Council.swift:346:19: warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
344 |                 answersDone = true
345 |             }
346 |             group.addTask { @MainActor [self] in
    |                   |- warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
    |                   `- note: Passing main actor-isolated value of non-Sendable type '() async -> Void' as a 'sending' parameter risks causing races inbetween main actor-isolated uses and uses reachable from the callee
347 |                 while !answersDone && !Task.isCancelled {
348 |                     emitTokens(store)
[16/22] Compiling CouncilKit Council.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/Council.swift:342:19: warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
340 |         // Phase A — answers, streamed token-by-token (poll the store while ask() runs concurrently).
341 |         await withTaskGroup(of: Void.self) { group in
342 |             group.addTask { @MainActor [self] in
    |                   |- warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
    |                   `- note: Passing main actor-isolated value of non-Sendable type '() async -> Void' as a 'sending' parameter risks causing races inbetween main actor-isolated uses and uses reachable from the callee
343 |                 await store.ask(question, document: document)
344 |                 answersDone = true
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/Council.swift:346:19: warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
344 |                 answersDone = true
345 |             }
346 |             group.addTask { @MainActor [self] in
    |                   |- warning: sending value of non-Sendable type '() async -> Void' risks causing data races; this is an error in the Swift 6 language mode
    |                   `- note: Passing main actor-isolated value of non-Sendable type '() async -> Void' as a 'sending' parameter risks causing races inbetween main actor-isolated uses and uses reachable from the callee
347 |                 while !answersDone && !Task.isCancelled {
348 |                     emitTokens(store)
[17/22] Emitting module CouncilKit
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilConfig.swift:68:23: warning: static property 'presets' is not concurrency-safe because non-'Sendable' type '[CouncilConfig]' may have shared mutable state; this is an error in the Swift 6 language mode
  5 | /// shared prompt, and which seats synthesize / play devil's advocate. API keys are NEVER part of
  6 | /// this — they live only in the Keychain, per machine. Export → council.json → share → import.
  7 | public struct CouncilConfig: Codable, Identifiable {
    |               `- note: consider making struct 'CouncilConfig' conform to the 'Sendable' protocol
  8 |     public var id = UUID()
  9 |     public var name: String
    :
 66 |     /// One curated starting point. Models default to a strong trio; the importer keeps whatever
 67 |     /// keys it already has, and any seat can be re-picked afterward.
 68 |     public static let presets: [CouncilConfig] = [
    |                       |- warning: static property 'presets' is not concurrency-safe because non-'Sendable' type '[CouncilConfig]' may have shared mutable state; this is an error in the Swift 6 language mode
    |                       |- note: add '@MainActor' to make static property 'presets' part of global actor 'MainActor'
    |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
 69 |         CouncilConfig(
 70 |             name: "Code Review Council",
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:38:23: warning: static property 'stallTimeoutSeconds' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
  36 |     /// The default is generous on purpose — a cold local model can take a while to load before its
  37 |     /// first token — but it is settable for tighter environments (CI).
  38 |     public static var stallTimeoutSeconds: Double = 90
     |                       |- warning: static property 'stallTimeoutSeconds' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: convert 'stallTimeoutSeconds' to a 'let' constant to make 'Sendable' shared state immutable
     |                       |- note: add '@MainActor' to make static property 'stallTimeoutSeconds' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
  39 |
  40 |     /// How much of an attached document a round keeps so it can be re-asked identically. Sessions
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:194:23: warning: static property 'allowEnvOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
192 |     /// CI escape hatch (CLI `--allow-env-keys` only): lets COUNCIL_KEY_<PROVIDER> env vars
193 |     /// override Keychain reads. NEVER enabled by default; the CLI prints a warning when it is.
194 |     public static var allowEnvOverride = false
    |                       |- warning: static property 'allowEnvOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
    |                       |- note: convert 'allowEnvOverride' to a 'let' constant to make 'Sendable' shared state immutable
    |                       |- note: add '@MainActor' to make static property 'allowEnvOverride' part of global actor 'MainActor'
    |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
195 |
196 |     /// Read the secret for the given account, or nil if none is stored.
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/LLMProvider.swift:158:24: warning: static property 'containerPrefs' is not concurrency-safe because non-'Sendable' type 'NSDictionary?' may have shared mutable state; this is an error in the Swift 6 language mode
156 |         return containerPrefs?[key] as? String
157 |     }
158 |     private static let containerPrefs: NSDictionary? = NSDictionary(contentsOf:
    |                        |- warning: static property 'containerPrefs' is not concurrency-safe because non-'Sendable' type 'NSDictionary?' may have shared mutable state; this is an error in the Swift 6 language mode
    |                        |- note: add '@MainActor' to make static property 'containerPrefs' part of global actor 'MainActor'
    |                        `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
159 |         FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(
160 |             "Library/Containers/com.joseph.Council/Data/Library/Preferences/com.joseph.Council.plist"))
Swift.Optional:1:21: note: generic enum 'Optional' does not conform to the 'Sendable' protocol
1 | @frozen public enum Optional<Wrapped> : ~Copyable where Wrapped : ~Copyable {
  |                     `- note: generic enum 'Optional' does not conform to the 'Sendable' protocol
2 |     case none
3 |     case some(Wrapped)
[18/22] Compiling CouncilKit CouncilStore.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:38:23: warning: static property 'stallTimeoutSeconds' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
  36 |     /// The default is generous on purpose — a cold local model can take a while to load before its
  37 |     /// first token — but it is settable for tighter environments (CI).
  38 |     public static var stallTimeoutSeconds: Double = 90
     |                       |- warning: static property 'stallTimeoutSeconds' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: convert 'stallTimeoutSeconds' to a 'let' constant to make 'Sendable' shared state immutable
     |                       |- note: add '@MainActor' to make static property 'stallTimeoutSeconds' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
  39 |
  40 |     /// How much of an attached document a round keeps so it can be re-asked identically. Sessions
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:194:23: warning: static property 'allowEnvOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
192 |     /// CI escape hatch (CLI `--allow-env-keys` only): lets COUNCIL_KEY_<PROVIDER> env vars
193 |     /// override Keychain reads. NEVER enabled by default; the CLI prints a warning when it is.
194 |     public static var allowEnvOverride = false
    |                       |- warning: static property 'allowEnvOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
    |                       |- note: convert 'allowEnvOverride' to a 'let' constant to make 'Sendable' shared state immutable
    |                       |- note: add '@MainActor' to make static property 'allowEnvOverride' part of global actor 'MainActor'
    |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
195 |
196 |     /// Read the secret for the given account, or nil if none is stored.
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:100:9: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
 98 |     public static func suppressSystemPrompts() {
 99 |         guard !isRunningTests else { return }
100 |         SecKeychainSetUserInteractionAllowed(false)
    |         `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
101 |     }
102 |
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:108:9: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
106 |     public static func staleAccounts(_ accounts: [String]) -> [String] {
107 |         if isRunningTests { return [] }
108 |         SecKeychainSetUserInteractionAllowed(false)
    |         `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
109 |         // Restore only for a process that allows prompts at all (the CLI); the app suppresses them
110 |         // permanently via suppressSystemPrompts and must not have them switched back on here.
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:111:58: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
109 |         // Restore only for a process that allows prompts at all (the CLI); the app suppresses them
110 |         // permanently via suppressSystemPrompts and must not have them switched back on here.
111 |         defer { if Bundle.main.bundleIdentifier == nil { SecKeychainSetUserInteractionAllowed(true) } }
    |                                                          `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
112 |         var stale: [String] = []
113 |         for account in accounts {
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:143:13: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
141 |         guard !stale.isEmpty else { return [] }
142 |         if Bundle.main.bundleIdentifier == nil {   // CLI: prompts are legitimate here
143 |             SecKeychainSetUserInteractionAllowed(true)
    |             `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
144 |             stale = stale.filter { ((try? keychainRead(account: $0)) ?? nil) == nil }
145 |             guard !stale.isEmpty else { return [] }
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:1002:31: warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1000 |                 let seatImage = (seat.provider?.supportsVision(model: seat.model) ?? false) ? image : nil
1001 |                 let messages = [ChatMessage.system(sys)] + (history[seat.id] ?? []) + [.user(effectivePrompt, image: seatImage)]
1002 |                 group.addTask { @MainActor in
     |                               `- warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1003 |                     let r = await self.streamCall(seat: seat, messages: messages) { partial in
     |                                                         `- note: closure captures 'seat' which is accessible to main actor-isolated code
1004 |                         self.setAnswer(idx, seat.id, partial)
1005 |                     }
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:1059:31: warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1057 |                 let reviewSystem = (seat.id == devilsAdvocateSeatID) ? Self.adversaryReviewPrompt : Self.peerReviewPrompt
1058 |                 let messages = [ChatMessage.system(reviewSystem), .user(reviewText)]
1059 |                 group.addTask { @MainActor in
     |                               `- warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1060 |                     let r = await self.streamCall(seat: seat, messages: messages) { partial in
     |                                                         `- note: closure captures 'seat' which is accessible to main actor-isolated code
1061 |                         self.livePeerReviews[seat.id] = partial   // raw buffer — no rounds churn per tick
1062 |                     }
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:1132:31: warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1130 |                 """
1131 |                 let messages = [ChatMessage.system(systemPrompt(for: seat)), .user(prompt)]
1132 |                 group.addTask { @MainActor in
     |                               `- warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1133 |                     let r = await self.streamCall(seat: seat, messages: messages) { partial in
     |                                                         `- note: closure captures 'seat' which is accessible to main actor-isolated code
1134 |                         self.liveRebuttals[seat.id] = partial   // raw buffer — no rounds churn per tick
1135 |                     }
[19/22] Compiling CouncilKit KeychainStore.swift
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:38:23: warning: static property 'stallTimeoutSeconds' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
  36 |     /// The default is generous on purpose — a cold local model can take a while to load before its
  37 |     /// first token — but it is settable for tighter environments (CI).
  38 |     public static var stallTimeoutSeconds: Double = 90
     |                       |- warning: static property 'stallTimeoutSeconds' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
     |                       |- note: convert 'stallTimeoutSeconds' to a 'let' constant to make 'Sendable' shared state immutable
     |                       |- note: add '@MainActor' to make static property 'stallTimeoutSeconds' part of global actor 'MainActor'
     |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
  39 |
  40 |     /// How much of an attached document a round keeps so it can be re-asked identically. Sessions
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:194:23: warning: static property 'allowEnvOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
192 |     /// CI escape hatch (CLI `--allow-env-keys` only): lets COUNCIL_KEY_<PROVIDER> env vars
193 |     /// override Keychain reads. NEVER enabled by default; the CLI prints a warning when it is.
194 |     public static var allowEnvOverride = false
    |                       |- warning: static property 'allowEnvOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
    |                       |- note: convert 'allowEnvOverride' to a 'let' constant to make 'Sendable' shared state immutable
    |                       |- note: add '@MainActor' to make static property 'allowEnvOverride' part of global actor 'MainActor'
    |                       `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
195 |
196 |     /// Read the secret for the given account, or nil if none is stored.
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:100:9: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
 98 |     public static func suppressSystemPrompts() {
 99 |         guard !isRunningTests else { return }
100 |         SecKeychainSetUserInteractionAllowed(false)
    |         `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
101 |     }
102 |
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:108:9: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
106 |     public static func staleAccounts(_ accounts: [String]) -> [String] {
107 |         if isRunningTests { return [] }
108 |         SecKeychainSetUserInteractionAllowed(false)
    |         `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
109 |         // Restore only for a process that allows prompts at all (the CLI); the app suppresses them
110 |         // permanently via suppressSystemPrompts and must not have them switched back on here.
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:111:58: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
109 |         // Restore only for a process that allows prompts at all (the CLI); the app suppresses them
110 |         // permanently via suppressSystemPrompts and must not have them switched back on here.
111 |         defer { if Bundle.main.bundleIdentifier == nil { SecKeychainSetUserInteractionAllowed(true) } }
    |                                                          `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
112 |         var stale: [String] = []
113 |         for account in accounts {
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:143:13: warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
141 |         guard !stale.isEmpty else { return [] }
142 |         if Bundle.main.bundleIdentifier == nil {   // CLI: prompts are legitimate here
143 |             SecKeychainSetUserInteractionAllowed(true)
    |             `- warning: 'SecKeychainSetUserInteractionAllowed' was deprecated in macOS 10.10: SecKeychain is deprecated
144 |             stale = stale.filter { ((try? keychainRead(account: $0)) ?? nil) == nil }
145 |             guard !stale.isEmpty else { return [] }
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:1002:31: warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1000 |                 let seatImage = (seat.provider?.supportsVision(model: seat.model) ?? false) ? image : nil
1001 |                 let messages = [ChatMessage.system(sys)] + (history[seat.id] ?? []) + [.user(effectivePrompt, image: seatImage)]
1002 |                 group.addTask { @MainActor in
     |                               `- warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1003 |                     let r = await self.streamCall(seat: seat, messages: messages) { partial in
     |                                                         `- note: closure captures 'seat' which is accessible to main actor-isolated code
1004 |                         self.setAnswer(idx, seat.id, partial)
1005 |                     }
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:1059:31: warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1057 |                 let reviewSystem = (seat.id == devilsAdvocateSeatID) ? Self.adversaryReviewPrompt : Self.peerReviewPrompt
1058 |                 let messages = [ChatMessage.system(reviewSystem), .user(reviewText)]
1059 |                 group.addTask { @MainActor in
     |                               `- warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1060 |                     let r = await self.streamCall(seat: seat, messages: messages) { partial in
     |                                                         `- note: closure captures 'seat' which is accessible to main actor-isolated code
1061 |                         self.livePeerReviews[seat.id] = partial   // raw buffer — no rounds churn per tick
1062 |                     }
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/CouncilStore.swift:1132:31: warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1130 |                 """
1131 |                 let messages = [ChatMessage.system(systemPrompt(for: seat)), .user(prompt)]
1132 |                 group.addTask { @MainActor in
     |                               `- warning: passing closure as a 'sending' parameter risks causing data races between main actor-isolated code and concurrent execution of the closure; this is an error in the Swift 6 language mode
1133 |                     let r = await self.streamCall(seat: seat, messages: messages) { partial in
     |                                                         `- note: closure captures 'seat' which is accessible to main actor-isolated code
1134 |                         self.liveRebuttals[seat.id] = partial   // raw buffer — no rounds churn per tick
1135 |                     }
[20/24] Compiling council CouncilCLI.swift
/Users/admin/builder/spi-builder-workspace/Sources/council/CouncilCLI.swift:172:23: warning: reference to static property 'allowEnvOverride' is not concurrency-safe because it involves shared mutable state; this is an error in the Swift 6 language mode
170 | func run(_ opts: Options) async {
171 |     if opts.allowEnvKeys {
172 |         KeychainStore.allowEnvOverride = true
    |                       `- warning: reference to static property 'allowEnvOverride' is not concurrency-safe because it involves shared mutable state; this is an error in the Swift 6 language mode
173 |         errPrint("warning: --allow-env-keys is on — COUNCIL_KEY_* env vars may supply API keys (CI mode)")
174 |     }
/Users/admin/builder/spi-builder-workspace/Sources/CouncilKit/KeychainStore.swift:194:23: note: static property declared here
192 |     /// CI escape hatch (CLI `--allow-env-keys` only): lets COUNCIL_KEY_<PROVIDER> env vars
193 |     /// override Keychain reads. NEVER enabled by default; the CLI prints a warning when it is.
194 |     public static var allowEnvOverride = false
    |                       `- note: static property declared here
195 |
196 |     /// Read the secret for the given account, or nil if none is stored.
/Users/admin/builder/spi-builder-workspace/Sources/council/CouncilCLI.swift:483:13: warning: variable 'argv' was never mutated; consider changing to 'let' constant
481 | struct CouncilCLI {
482 |     static func main() async {
483 |         var argv = Array(CommandLine.arguments.dropFirst())
    |             `- warning: variable 'argv' was never mutated; consider changing to 'let' constant
484 |         if argv.first == "keys" {
485 |             guard argv.count >= 3, argv[1] == "set" else { die("usage: council keys set <provider>", code: 64) }
[21/24] Emitting module council
[21/24] Write Objects.LinkFileList
[22/24] Linking council
[23/24] Applying council
Build complete! (10.08s)
Build complete.
{
  "dependencies" : [
  ],
  "manifest_display_name" : "CouncilKit",
  "name" : "CouncilKit",
  "path" : "/Users/admin/builder/spi-builder-workspace",
  "platforms" : [
    {
      "name" : "macos",
      "version" : "14.0"
    }
  ],
  "products" : [
    {
      "name" : "CouncilKit",
      "targets" : [
        "CouncilKit"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "council",
      "targets" : [
        "council"
      ],
      "type" : {
        "executable" : null
      }
    }
  ],
  "targets" : [
    {
      "c99name" : "council",
      "module_type" : "SwiftTarget",
      "name" : "council",
      "path" : "Sources/council",
      "product_memberships" : [
        "council"
      ],
      "sources" : [
        "CouncilCLI.swift"
      ],
      "target_dependencies" : [
        "CouncilKit"
      ],
      "type" : "executable"
    },
    {
      "c99name" : "CouncilKitTests",
      "module_type" : "SwiftTarget",
      "name" : "CouncilKitTests",
      "path" : "Tests/CouncilKitTests",
      "sources" : [
        "CouncilKitTests.swift"
      ],
      "target_dependencies" : [
        "CouncilKit"
      ],
      "type" : "test"
    },
    {
      "c99name" : "CouncilKit",
      "module_type" : "SwiftTarget",
      "name" : "CouncilKit",
      "path" : "Sources/CouncilKit",
      "product_memberships" : [
        "CouncilKit",
        "council"
      ],
      "sources" : [
        "AnthropicClient.swift",
        "AppleFoundationClient.swift",
        "Archetype.swift",
        "Council.swift",
        "CouncilConfig.swift",
        "CouncilKit.swift",
        "CouncilStore.swift",
        "KeychainStore.swift",
        "LLMClient.swift",
        "LLMProvider.swift",
        "OpenAICompatibleClient.swift",
        "ReminderNotifications.swift",
        "Seat.swift",
        "Session.swift"
      ],
      "type" : "library"
    }
  ],
  "tools_version" : "5.9"
}
Done.