release: prepare v1.7.5#94
Conversation
Why: - Promote the Codex app-server v0.140 wire snapshot and reviewed support window. - Remove public compatibility shims for older Codex CLI schema shapes instead of carrying fallback values. - Format Swift sources and tests with the repo SwiftFormat configuration. Breaking: - Removes AppSummary.needsAuth, permission modification request/reporting types, per-current-directory extra skill roots, and the public raw MCP status-list request surface. Verification: - swift build - swift test - uv run pytest (from Tools/AgentSB) - bash scripts/repo-maintenance/validate-all.sh - git diff --check
Why: - Document the forward compatibility policy as current Codex CLI plus latest prior minor when feasible. - Enforce that policy in executable diagnostics for the 0.139.x and 0.140.x window. - Keep AgentSB's compatibility draft helper aligned with the policy. Verification: - swift test --filter CodexCLIExecutableResolverTests - swift test - uv run pytest from Tools/AgentSB - bash scripts/repo-maintenance/validate-all.sh - git diff --check
Why: Codex CLI 0.140 can complete the app connector live fixture without emitting an MCP tool call, so the release-gate probe needs to distinguish that observable upstream behavior from the elicitation path it still verifies when the event appears. Verification: - swift test --filter CodexAppServerTests - scripts/run-live-codex-server-request-probes.sh - scripts/run-live-codex-integration-tests.sh - git diff --check
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
🚧 Files skipped from review as they are similar to previous changes (4)
📝 WalkthroughWalkthroughThis PR refreshes SwiftASB for the Codex CLI 0.140.x review window, updates related docs and tooling, reshapes several public and internal Swift API boundaries, adds ChangesAPI boundary refresh
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1a8f28e840
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if not current_window or not target_window or target_window == current_window or target_minor is None: | ||
| return None | ||
|
|
||
| prior_window = f"0.{target_minor - 1}.x" if target_minor > 0 else "none" |
There was a problem hiding this comment.
Keep the generated oldest CLI window in sync
When AgentSB drafts the next compatibility bump, e.g. from v0.140.0 to v0.141.0, this computes prior_window as 0.140.x, but the emitted resolver patch below still only updates latestSupportedPublicRelease and never updates the new oldestSupportedPublicRelease constant. Applying that draft would leave runtime compatibility checks accepting 0.139.x instead of the latest prior minor while the generated docs claim 0.140.x, so the maintenance draft becomes misleading for the next schema refresh.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
Sources/SwiftASB/Public/CodexThread+RecentTurns.swift (1)
628-633:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winGuard empty resident state before protected-range slicing
Line 632 can trap on an empty
turnsarray (0...-1range path) becauseprotectedTurnIDSet()is called from Line 676 without an empty-state guard. This can crash newly-created companions with no turns.💡 Suggested fix
private func protectedTurnIDSet() -> Set<String> { + guard !turns.isEmpty else { + return unresolvedInteractiveTurnIDs + } + let focusIndices = focusIndices() let focusLowerBound = max(0, focusIndices.lowerBound - cachePolicy.protectedTurnBuffer) let focusUpperBound = min(turns.count - 1, focusIndices.upperBound + cachePolicy.protectedTurnBuffer) var protectedIDs = Set(turns[focusLowerBound...focusUpperBound].map(\.id))Also applies to: 675-683
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/SwiftASB/Public/CodexThread`+RecentTurns.swift around lines 628 - 633, The protectedTurnIDSet() method can crash when the turns array is empty because the calculation of focusUpperBound (turns.count - 1) produces -1, creating an invalid range (0...-1). Add a guard clause at the beginning of the protectedTurnIDSet() function to check if turns.isEmpty and return an empty Set early, preventing the range slicing operation from executing on an empty array.Sources/SwiftASB/Public/CodexDiagnostics.swift (1)
40-66:⚠️ Potential issue | 🟠 MajorPublic diagnostic struct initializers are non-public due to synthesized memberwise init.
External code cannot construct
CodexRuntimeWarning,CodexGuardianWarning,CodexModelReroute, andCodexModelVerificationDiagnosticinstances because their initializers default to internal visibility. These types are associated values in the publicCodexDiagnosticEventenum, so external code instantiating enum cases like.warning(CodexRuntimeWarning(message:threadID:))will fail at compile time.Restore explicit
public initfor each struct:Proposed fix
public struct CodexRuntimeWarning: Sendable, Equatable { public let message: String public let threadID: String? + + public init(message: String, threadID: String?) { + self.message = message + self.threadID = threadID + } } @@ public struct CodexGuardianWarning: Sendable, Equatable { public let message: String public let threadID: String + + public init(message: String, threadID: String) { + self.message = message + self.threadID = threadID + } } @@ public struct CodexModelReroute: Sendable, Equatable { @@ public let toModel: String public let turnID: String + + public init(fromModel: String, reason: Reason, threadID: String, toModel: String, turnID: String) { + self.fromModel = fromModel + self.reason = reason + self.threadID = threadID + self.toModel = toModel + self.turnID = turnID + } @@ public struct CodexModelVerificationDiagnostic: Sendable, Equatable { @@ public let turnID: String public let verifications: [CodexModelVerification] + + public init(threadID: String, turnID: String, verifications: [CodexModelVerification]) { + self.threadID = threadID + self.turnID = turnID + self.verifications = verifications + } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/SwiftASB/Public/CodexDiagnostics.swift` around lines 40 - 66, The synthesized memberwise initializers for CodexRuntimeWarning, CodexGuardianWarning, CodexModelReroute, and CodexModelVerificationDiagnostic are internal by default, preventing external code from constructing instances of these public structs. Add explicit public init methods to each of these four structs that accept their respective properties as parameters and initialize them accordingly, ensuring the initializers are marked as public so external code can create instances for use with the public CodexDiagnosticEvent enum.Tools/AgentSB/agentsb/maintain.py (1)
294-301:⚠️ Potential issue | 🟠 Major | ⚡ Quick winKeep the generated test patch aligned with the new compatibility string.
The README/doc text already includes
prior_window, but the emittedTools/AgentSB/tests/test_cli.pyandTools/AgentSB/tests/test_tools.pysnippets still rewrite the assertion totarget_windowonly. That makes the maintenance draft stale relative to the current"0.140.x plus 0.139.x when feasible"contract.Update the generated test assertions
- f'- assert facts["reviewed_codex_cli_window"]["window"] == "{current_window}"', - f'+ assert facts["reviewed_codex_cli_window"]["window"] == "{target_window}"', + f'- assert facts["reviewed_codex_cli_window"]["window"] == "{current_window}"', + f'+ assert facts["reviewed_codex_cli_window"]["window"] == "{target_window} plus {prior_window} when feasible"',🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Tools/AgentSB/agentsb/maintain.py` around lines 294 - 301, The generated test patch assertions in the maintain.py file (around the section generating diffs for test_cli.py and test_tools.py) are only rewriting assertions to check against target_window, but the documentation indicates support for both the current version (target_window) and the prior version (prior_window). Update the generated assertion patches to align with the "0.140.x plus 0.139.x when feasible" compatibility contract by modifying the assertion generation logic to include checks that handle both target_window and prior_window scenarios, ensuring the emitted test patches reflect the actual supported compatibility range.Sources/SwiftASB/Public/CodexAppServer+Library.swift (1)
5-9:⚠️ Potential issue | 🟡 MinorAdd
Sendableconformance toLibraryEventfor safe cross-actor streaming.
LibraryEventis consumed instartEventTask()at line 908 viaawait appServer.libraryEvents(), which streams values fromCodexAppServer(an actor) toLibrary(a@MainActorclass). Swift 6.3 strict concurrency requires stream elements crossing actor boundaries to beSendable. AddSendableto the enum conformance:enum LibraryEvent: Sendable, Equatable { case appSnapshotsChanged case threadChanged(threadID: String) case turnCompleted(threadID: String) }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/SwiftASB/Public/CodexAppServer`+Library.swift around lines 5 - 9, The LibraryEvent enum lacks Sendable conformance, which is required by Swift 6.3 strict concurrency when streaming values across actor boundaries in the startEventTask() method. Add Sendable to the LibraryEvent enum conformance list alongside Equatable so it reads as enum LibraryEvent: Sendable, Equatable, allowing safe streaming from the CodexAppServer actor to the Library MainActor class.
🧹 Nitpick comments (2)
Sources/SwiftASB/Public/SwiftASBFeaturePolicy.swift (1)
167-184: 🏗️ Heavy liftReplace the public 7-parameter initializer with a typed configuration value.
This touched public initializer exceeds the repository’s 4+ parameter threshold and is harder to evolve cleanly.
♻️ Proposed direction
+public struct DescriptorOptions: Sendable, Equatable { + public var displayName: String + public var description: String + public var permissionReason: String + public var defaultMode: SwiftASBFeatureMode + public var sensitivity: SwiftASBFeatureSensitivity + public var eventPolicy: SwiftASBFeatureEventPolicy +} + public struct SwiftASBFeatureCategory: Sendable, Equatable, Identifiable { @@ - public init( - id: ID, - displayName: String, - description: String, - permissionReason: String, - defaultMode: SwiftASBFeatureMode, - sensitivity: SwiftASBFeatureSensitivity, - eventPolicy: SwiftASBFeatureEventPolicy - ) { + public init(id: ID, options: DescriptorOptions) { self.id = id - self.displayName = displayName - self.description = description - self.permissionReason = permissionReason - self.defaultMode = defaultMode - self.sensitivity = sensitivity - self.eventPolicy = eventPolicy + self.displayName = options.displayName + self.description = options.description + self.permissionReason = options.permissionReason + self.defaultMode = options.defaultMode + self.sensitivity = options.sensitivity + self.eventPolicy = options.eventPolicy } }As per coding guidelines, "When a public function, initializer, or method reaches four or more arguments or parameters, strongly prefer a named typed struct request, options, or configuration value."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/SwiftASB/Public/SwiftASBFeaturePolicy.swift` around lines 167 - 184, The public initializer for the feature category descriptor exceeds the 4-parameter threshold with 7 parameters: id, displayName, description, permissionReason, defaultMode, sensitivity, and eventPolicy. Create a new typed configuration struct (such as SwiftASBFeatureCategoryConfiguration or similar) that groups these seven parameters as properties, then replace the existing 7-parameter init method with a new initializer that accepts a single instance of this configuration struct, extracting and assigning each property from the configuration object to the corresponding instance variables. This maintains the same functionality while making the API cleaner and easier to evolve in the future.Source: Coding guidelines
Sources/SwiftASB/Public/CodexAppServer+Inventory.swift (1)
15-51: DeclareSendableon inventory request/snapshot types for consistency with codebase pattern.Both
AppInventoryReadRequest(line 15) andAppInventorySnapshot(line 34) have allSendablemembers and are used across the actor boundary at line 258. While Swift 6's strict concurrency automatically synthesizesSendablefor these structs, the codebase consistently declaresSendableexplicitly on similar types (e.g.,ConfigurationandPhasein the same file). AddSendableconformance to these structs for clarity and consistency.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/SwiftASB/Public/CodexAppServer`+Inventory.swift around lines 15 - 51, The AppInventoryReadRequest and AppInventorySnapshot structs are missing explicit Sendable conformance declarations. Although Swift 6 can automatically synthesize Sendable for these structs since they contain only Sendable members, the codebase follows a consistent pattern of explicitly declaring Sendable conformance (as seen with Configuration and Phase types in the same file). Add conformance to Sendable by including : Sendable in the struct declarations for both AppInventoryReadRequest and AppInventorySnapshot to maintain consistency with the established codebase pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Sources/SwiftASB/Protocol/CodexRPCEnvelope.swift`:
- Around line 8-11: The CodexRPCServerEvent enum and CodexRPCRequestID type must
explicitly conform to the Sendable protocol to satisfy Swift 6 strict
concurrency requirements. Since CodexRPCServerEvent is used as the element type
in AsyncStream returned from an actor method in CodexAppServerTransporting, and
CodexRPCRequestID is nested within it, both types need Sendable conformance. Add
Sendable conformance to both the CodexRPCServerEvent enum declaration and the
CodexRPCRequestID type definition by including it in their respective protocol
conformance declarations.
In `@Sources/SwiftASB/Public/CodexTurnHandle.swift`:
- Around line 181-196: The callSnapshotKind function's switch statement does not
have an explicit case for CodexTurnItem.Kind.subAgentActivity, causing it to
fall through to the default case and return nil, which filters subAgentActivity
items from the minimap's call snapshots. Verify whether this filtering is
intentional by either: (1) adding an explicit case for subAgentActivity with the
appropriate CallSnapshot.Kind mapping if it should appear in the presentation
layer, or (2) adding a clear comment explaining why subAgentActivity is
intentionally excluded from call snapshots if this is expected behavior. This
ensures the code reflects the product requirements and prevents future confusion
about unhandled cases.
---
Outside diff comments:
In `@Sources/SwiftASB/Public/CodexAppServer`+Library.swift:
- Around line 5-9: The LibraryEvent enum lacks Sendable conformance, which is
required by Swift 6.3 strict concurrency when streaming values across actor
boundaries in the startEventTask() method. Add Sendable to the LibraryEvent enum
conformance list alongside Equatable so it reads as enum LibraryEvent: Sendable,
Equatable, allowing safe streaming from the CodexAppServer actor to the Library
MainActor class.
In `@Sources/SwiftASB/Public/CodexDiagnostics.swift`:
- Around line 40-66: The synthesized memberwise initializers for
CodexRuntimeWarning, CodexGuardianWarning, CodexModelReroute, and
CodexModelVerificationDiagnostic are internal by default, preventing external
code from constructing instances of these public structs. Add explicit public
init methods to each of these four structs that accept their respective
properties as parameters and initialize them accordingly, ensuring the
initializers are marked as public so external code can create instances for use
with the public CodexDiagnosticEvent enum.
In `@Sources/SwiftASB/Public/CodexThread`+RecentTurns.swift:
- Around line 628-633: The protectedTurnIDSet() method can crash when the turns
array is empty because the calculation of focusUpperBound (turns.count - 1)
produces -1, creating an invalid range (0...-1). Add a guard clause at the
beginning of the protectedTurnIDSet() function to check if turns.isEmpty and
return an empty Set early, preventing the range slicing operation from executing
on an empty array.
In `@Tools/AgentSB/agentsb/maintain.py`:
- Around line 294-301: The generated test patch assertions in the maintain.py
file (around the section generating diffs for test_cli.py and test_tools.py) are
only rewriting assertions to check against target_window, but the documentation
indicates support for both the current version (target_window) and the prior
version (prior_window). Update the generated assertion patches to align with the
"0.140.x plus 0.139.x when feasible" compatibility contract by modifying the
assertion generation logic to include checks that handle both target_window and
prior_window scenarios, ensuring the emitted test patches reflect the actual
supported compatibility range.
---
Nitpick comments:
In `@Sources/SwiftASB/Public/CodexAppServer`+Inventory.swift:
- Around line 15-51: The AppInventoryReadRequest and AppInventorySnapshot
structs are missing explicit Sendable conformance declarations. Although Swift 6
can automatically synthesize Sendable for these structs since they contain only
Sendable members, the codebase follows a consistent pattern of explicitly
declaring Sendable conformance (as seen with Configuration and Phase types in
the same file). Add conformance to Sendable by including : Sendable in the
struct declarations for both AppInventoryReadRequest and AppInventorySnapshot to
maintain consistency with the established codebase pattern.
In `@Sources/SwiftASB/Public/SwiftASBFeaturePolicy.swift`:
- Around line 167-184: The public initializer for the feature category
descriptor exceeds the 4-parameter threshold with 7 parameters: id, displayName,
description, permissionReason, defaultMode, sensitivity, and eventPolicy. Create
a new typed configuration struct (such as SwiftASBFeatureCategoryConfiguration
or similar) that groups these seven parameters as properties, then replace the
existing 7-parameter init method with a new initializer that accepts a single
instance of this configuration struct, extracting and assigning each property
from the configuration object to the corresponding instance variables. This
maintains the same functionality while making the API cleaner and easier to
evolve in the future.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: d9bf5553-68e2-4113-b5cf-a0c243d9c34a
⛔ Files ignored due to path filters (2)
Sources/SwiftASB/Generated/CodexWire/Latest/CodexLifecycleV2Batch+JSONValue.swiftis excluded by!**/generated/**Sources/SwiftASB/Generated/CodexWire/Latest/CodexWireInitializeResponse.swiftis excluded by!**/generated/**
📒 Files selected for processing (106)
README.mdROADMAP.mdSources/ASBAppKit/ASBThreadSidebarView.swiftSources/ASBPresentation/AgendaDashboardPresentation.swiftSources/ASBPresentation/RecentActivityPresentation.swiftSources/ASBPresentation/ThreadSidebarPresentation.swiftSources/ASBPresentation/TurnTimelinePresentation.swiftSources/ASBSwiftUI/Dashboard/ASBDashboardPanel.swiftSources/ASBSwiftUI/Support/ASBSwiftUIStatusViews.swiftSources/SwiftASB/History/ThreadHistoryStore.swiftSources/SwiftASB/Protocol/CodexAppServerProtocol+Types.swiftSources/SwiftASB/Protocol/CodexAppServerProtocol.swiftSources/SwiftASB/Protocol/CodexProtocolError.swiftSources/SwiftASB/Protocol/CodexRPCEnvelope.swiftSources/SwiftASB/Public/CodexAppServer+Bootstrap.swiftSources/SwiftASB/Public/CodexAppServer+CodexExtensions.swiftSources/SwiftASB/Public/CodexAppServer+CommandExecution.swiftSources/SwiftASB/Public/CodexAppServer+Compatibility.swiftSources/SwiftASB/Public/CodexAppServer+GitObservability.swiftSources/SwiftASB/Public/CodexAppServer+Hooks.swiftSources/SwiftASB/Public/CodexAppServer+Inventory.swiftSources/SwiftASB/Public/CodexAppServer+Library.swiftSources/SwiftASB/Public/CodexAppServer+MCP.swiftSources/SwiftASB/Public/CodexAppServer+Models.swiftSources/SwiftASB/Public/CodexAppServer+ProtocolPayloads.swiftSources/SwiftASB/Public/CodexAppServer+ThreadLifecycle.swiftSources/SwiftASB/Public/CodexAppServer+ThreadManagement.swiftSources/SwiftASB/Public/CodexAppServer+TurnLifecycle.swiftSources/SwiftASB/Public/CodexAppServer+WireMapping.swiftSources/SwiftASB/Public/CodexAppServer.swiftSources/SwiftASB/Public/CodexConfig.swiftSources/SwiftASB/Public/CodexDiagnostics.swiftSources/SwiftASB/Public/CodexErrors.swiftSources/SwiftASB/Public/CodexFS.swiftSources/SwiftASB/Public/CodexInteractiveRequests.swiftSources/SwiftASB/Public/CodexMCP.swiftSources/SwiftASB/Public/CodexReviewHandle.swiftSources/SwiftASB/Public/CodexThread+Agenda.swiftSources/SwiftASB/Public/CodexThread+Dashboard.swiftSources/SwiftASB/Public/CodexThread+RecentCommands.swiftSources/SwiftASB/Public/CodexThread+RecentFiles.swiftSources/SwiftASB/Public/CodexThread+RecentTurns.swiftSources/SwiftASB/Public/CodexThread.swiftSources/SwiftASB/Public/CodexTurnHandle.swiftSources/SwiftASB/Public/CodexWorkspace.swiftSources/SwiftASB/Public/SwiftASBFeatureOperationEvent.swiftSources/SwiftASB/Public/SwiftASBFeaturePolicy.swiftSources/SwiftASB/SwiftASB.docc/AppWideCapabilities.mdSources/SwiftASB/SwiftASB.docc/CodexAppServer.mdSources/SwiftASB/SwiftASB.docc/CodexWorkspace.mdSources/SwiftASB/Transport/CodexAppServerTransport.swiftSources/SwiftASB/Transport/CodexAppServerTransporting.swiftSources/SwiftASB/Transport/CodexCLIExecutableResolver.swiftSources/SwiftASB/Transport/CodexRPCRequestID.swiftSources/SwiftASB/Transport/CodexTransportError.swiftSources/SwiftASB/Transport/LineDelimitedDataBuffer.swiftTests/ASBAppKitTests/ASBThreadSidebarViewTests.swiftTests/ASBPresentationTests/ASBPresentationBoundaryTests.swiftTests/ASBPresentationTests/AgendaDashboardPresentationTests.swiftTests/ASBPresentationTests/RecentActivityPresentationTests.swiftTests/ASBPresentationTests/ThreadSidebarPresentationTests.swiftTests/ASBPresentationTests/TurnTimelinePresentationTests.swiftTests/ASBSwiftUITests/ASBSwiftUIComponentTests.swiftTests/SwiftASBTests/Protocol/CodexAppServerProtocolTests.swiftTests/SwiftASBTests/Public/CodexAppServerCompanionSurfaceTests.swiftTests/SwiftASBTests/Public/CodexAppServerDiagnosticsTests.swiftTests/SwiftASBTests/Public/CodexAppServerFileSystemTests.swiftTests/SwiftASBTests/Public/CodexAppServerInventoryTests.swiftTests/SwiftASBTests/Public/CodexAppServerLibraryTests.swiftTests/SwiftASBTests/Public/CodexAppServerLiveApprovalProbeTests.swiftTests/SwiftASBTests/Public/CodexAppServerLiveBehaviorScenarioTests.swiftTests/SwiftASBTests/Public/CodexAppServerLiveElicitationProbeTests.swiftTests/SwiftASBTests/Public/CodexAppServerLiveIntegrationTestSupport.swiftTests/SwiftASBTests/Public/CodexAppServerLiveIntegrationTests.swiftTests/SwiftASBTests/Public/CodexAppServerRecentCachePolicyTests.swiftTests/SwiftASBTests/Public/CodexAppServerRecentCommandsTests.swiftTests/SwiftASBTests/Public/CodexAppServerRecentFileCachePolicyTests.swiftTests/SwiftASBTests/Public/CodexAppServerRecentFilesTests.swiftTests/SwiftASBTests/Public/CodexAppServerRecentTurnCachePolicyTests.swiftTests/SwiftASBTests/Public/CodexAppServerRecentTurnsTests.swiftTests/SwiftASBTests/Public/CodexAppServerStoredThreadTests.swiftTests/SwiftASBTests/Public/CodexAppServerTestSupport.swiftTests/SwiftASBTests/Public/CodexAppServerTests.swiftTests/SwiftASBTests/Public/CodexAppServerThreadHydrationTests.swiftTests/SwiftASBTests/Public/CodexAppServerThreadManagementTests.swiftTests/SwiftASBTests/Public/CodexAppServerTurnInteractionTests.swiftTests/SwiftASBTests/Public/CodexAppServerTurnLifecycleTests.swiftTests/SwiftASBTests/Public/CodexMCPTests.swiftTests/SwiftASBTests/Public/CodexWorkspaceTests.swiftTests/SwiftASBTests/Public/SwiftASBFeatureOperationEventTests.swiftTests/SwiftASBTests/Public/SwiftASBFeaturePolicyTests.swiftTests/SwiftASBTests/Transport/CodexAppServerTransportTests.swiftTests/SwiftASBTests/Transport/CodexCLIExecutableResolverTests.swiftTests/SwiftASBTests/Transport/CodexRPCEnvelopeTests.swiftTests/SwiftASBTests/Transport/LineDelimitedDataBufferTests.swiftTools/AgentSB/agentsb/maintain.pyTools/AgentSB/tests/test_cli.pyTools/AgentSB/tests/test_tools.pydocs/maintainers/interactive-lifecycle-release-boundary.mddocs/maintainers/mcp-configuration-writing.mddocs/maintainers/quicktype-codegen-notes.mddocs/maintainers/v1-public-api-audit.mddocs/maintainers/v1-public-api-symbol-inventory.mdscripts/generate-wire-types.shscripts/patch_quicktype_swift_any.pyscripts/run-live-codex-server-request-probes.sh
💤 Files with no reviewable changes (9)
- docs/maintainers/mcp-configuration-writing.md
- Tests/ASBPresentationTests/TurnTimelinePresentationTests.swift
- Sources/SwiftASB/SwiftASB.docc/AppWideCapabilities.md
- Tests/ASBPresentationTests/ThreadSidebarPresentationTests.swift
- Tests/ASBPresentationTests/AgendaDashboardPresentationTests.swift
- Sources/SwiftASB/Public/CodexReviewHandle.swift
- Tests/ASBAppKitTests/ASBThreadSidebarViewTests.swift
- Tests/ASBPresentationTests/RecentActivityPresentationTests.swift
- Sources/SwiftASB/SwiftASB.docc/CodexAppServer.md
| enum CodexRPCServerEvent: Equatable { | ||
| case notification(method: String, payload: Data) | ||
| case request(id: CodexRPCRequestID, method: String, payload: Data) | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify actor-boundary usage + strict-concurrency configuration signals.
fd -a Package.swift
rg -n "swift-tools-version|swiftSettings|StrictConcurrency|strict-concurrency|SWIFT_STRICT_CONCURRENCY|upcomingFeature" Package.swift
rg -n "protocol CodexAppServerTransporting|func serverEvents\\(\\) -> AsyncStream<CodexRPCServerEvent>" Sources/SwiftASB/Transport/CodexAppServerTransporting.swift
rg -n "enum CodexRPCInboundMessage|enum CodexRPCServerEvent" Sources/SwiftASB/Protocol/CodexRPCEnvelope.swiftRepository: gaelic-ghost/SwiftASB
Length of output: 419
🏁 Script executed:
#!/bin/bash
# Check for swiftSettings and strict concurrency configuration
rg -A 10 "swiftSettings" Package.swift
# Find all usages of CodexRPCInboundMessage to determine scope
rg -n "CodexRPCInboundMessage" --type swift
# Find all usages of CodexRPCServerEvent to confirm actor-boundary crossings
rg -n "CodexRPCServerEvent" --type swift
# Check if there are any compilation conditions or feature flags related to concurrency
rg -n "STRICT_CONCURRENCY|upcomingFeature" --type swiftRepository: gaelic-ghost/SwiftASB
Length of output: 2263
🏁 Script executed:
#!/bin/bash
# Check the contents of the enums to see if they contain non-Sendable data
cat -n Sources/SwiftASB/Protocol/CodexRPCEnvelope.swift | head -20
# Check the Package.swift for swiftSettings specifically
cat -n Package.swift | head -30
# Check if there are any concurrency-related settings or features enabled
rg -i "concurrency|sendable" Package.swiftRepository: gaelic-ghost/SwiftASB
Length of output: 1850
🏁 Script executed:
#!/bin/bash
# Get full Package.swift to check for swiftSettings
wc -l Package.swift
# Check for swiftSettings configuration
rg -B 2 -A 10 "swiftSettings|targets:" Package.swift | head -60
# Check if there are any warnings or errors about non-Sendable types in the codebase
rg "warning.*[Ss]endable|error.*[Ss]endable" Sources/ Tests/Repository: gaelic-ghost/SwiftASB
Length of output: 1045
🏁 Script executed:
#!/bin/bash
# Get the complete Package.swift to check for swiftSettings
cat -n Package.swift | tail -40
# Check what CodexRPCRequestID is to ensure all constituent types are Sendable
rg -B 2 -A 5 "enum CodexRPCRequestID|struct CodexRPCRequestID|typealias CodexRPCRequestID" Sources/Repository: gaelic-ghost/SwiftASB
Length of output: 2216
🏁 Script executed:
#!/bin/bash
# Check if CodexRPCRequestID has Sendable conformance
cat -n Sources/SwiftASB/Transport/CodexRPCRequestID.swift | head -15
# Check for all occurrences of Sendable in the codebase
rg "Sendable" Sources/ | head -20
# Verify the complete enum definitions
cat -n Sources/SwiftASB/Protocol/CodexRPCEnvelope.swiftRepository: gaelic-ghost/SwiftASB
Length of output: 7581
CodexRPCServerEvent and CodexRPCRequestID must conform to Sendable for Swift 6 strict concurrency.
With swiftLanguageModes: [.v6], the compiler enforces strict concurrency by default. CodexAppServerTransporting.serverEvents() returns AsyncStream<CodexRPCServerEvent> from an actor, which requires the element type to be Sendable. Similarly, CodexRPCRequestID should explicitly conform to Sendable for consistency, since it's used within these types. Removing Sendable causes a compiler error under strict concurrency checking.
Proposed fix
-enum CodexRPCRequestID: Hashable, Codable, CustomStringConvertible {
+enum CodexRPCRequestID: Hashable, Codable, CustomStringConvertible, Sendable {
-enum CodexRPCInboundMessage: Equatable {
+enum CodexRPCInboundMessage: Equatable, Sendable {
-enum CodexRPCServerEvent: Equatable {
+enum CodexRPCServerEvent: Equatable, Sendable {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Sources/SwiftASB/Protocol/CodexRPCEnvelope.swift` around lines 8 - 11, The
CodexRPCServerEvent enum and CodexRPCRequestID type must explicitly conform to
the Sendable protocol to satisfy Swift 6 strict concurrency requirements. Since
CodexRPCServerEvent is used as the element type in AsyncStream returned from an
actor method in CodexAppServerTransporting, and CodexRPCRequestID is nested
within it, both types need Sendable conformance. Add Sendable conformance to
both the CodexRPCServerEvent enum declaration and the CodexRPCRequestID type
definition by including it in their respective protocol conformance
declarations.
Why: Release review found a real empty-turn cache crash, missing public diagnostic constructors, and a future schema-refresh assertion mismatch with the current-plus-prior Codex CLI support policy. Verification: - swift test - uv run pytest - bash scripts/repo-maintenance/validate-all.sh - git diff --check
Release
schema/codex-cli-0-140-refreshmainupdates behind pull request review and CIv1.7.5will be created after CI and the review-comment gate pass, so failed or still-discussed release candidates do not get taggedReview Loop
Before merge and tagging,
scripts/repo-maintenance/release.shwatches CI and stops on review comments unless the maintainer has already addressed or resolved them and reruns with--review-comments-addressed.