Skip to content

release: prepare v1.7.5#94

Merged
gaelic-ghost merged 5 commits into
mainfrom
schema/codex-cli-0-140-refresh
Jun 17, 2026
Merged

release: prepare v1.7.5#94
gaelic-ghost merged 5 commits into
mainfrom
schema/codex-cli-0-140-refresh

Conversation

@gaelic-ghost

@gaelic-ghost gaelic-ghost commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Release

  • prepares v1.7.5 from branch schema/codex-cli-0-140-refresh
  • keeps protected main updates behind pull request review and CI
  • release tag v1.7.5 will be created after CI and the review-comment gate pass, so failed or still-discussed release candidates do not get tagged

Review Loop

Before merge and tagging, scripts/repo-maintenance/release.sh watches CI and stops on review comments unless the maintainer has already addressed or resolved them and reruns with --review-comments-addressed.

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
@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d3287cf-e654-445f-b104-1d99e94c8d2e

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8f28e and 7ee5e05.

📒 Files selected for processing (5)
  • Sources/SwiftASB/Public/CodexDiagnostics.swift
  • Sources/SwiftASB/Public/CodexThread+RecentTurns.swift
  • Sources/SwiftASB/Public/CodexTurnHandle.swift
  • Sources/SwiftASB/Public/SwiftASBFeaturePolicy.swift
  • Tools/AgentSB/agentsb/maintain.py
🚧 Files skipped from review as they are similar to previous changes (4)
  • Tools/AgentSB/agentsb/maintain.py
  • Sources/SwiftASB/Public/CodexThread+RecentTurns.swift
  • Sources/SwiftASB/Public/CodexTurnHandle.swift
  • Sources/SwiftASB/Public/CodexDiagnostics.swift

📝 Walkthrough

Walkthrough

This 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 subAgentActivity to turn items, removes older compatibility fields/types, and aligns protocol, transport, and test coverage with those changes.

Changes

API boundary refresh

Layer / File(s) Summary
Docs and presentation surfaces
README.md, ROADMAP.md, docs/maintainers/*, Sources/ASBPresentation/*, Sources/ASBAppKit/*, Sources/ASBSwiftUI/*
Release/version docs, maintainer notes, presentation snapshots, and UI status helpers were updated and reorganized.
Public model and protocol boundary changes
Sources/SwiftASB/Protocol/*, Sources/SwiftASB/Public/*, Sources/SwiftASB/Transport/*
Protocol payloads, RPC envelope parsing, transport helpers, and public SwiftASB model surfaces were reshaped around the new compatibility window and removed compatibility types.
Tests and harness alignment
Tests/*
Test suites, live harness support, and fixture data were updated for the new compatibility window, wire shapes, permission simplifications, and probe behavior.
AgentSB tooling and maintainer automation
Tools/AgentSB/*, scripts/*
Compatibility generation, maintainer docs, API inventories, and probe scripts were updated to emit and describe the combined current-plus-prior Codex CLI support window.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • gaelic-ghost/SwiftASB#91: Updates the same Codex CLI compatibility-window wiring in resolver, docs, and tests.
  • gaelic-ghost/SwiftASB#84: Also changes Sources/SwiftASB/Protocol/CodexRPCEnvelope.swift, including request-id parsing behavior.
  • gaelic-ghost/SwiftASB#75: Also touches Sources/SwiftASB/Public/CodexWorkspace.swift and related worktree/repository modeling.

Suggested labels

enhancement

Poem

🐇 I polished a wire and nudged a clue,
from 0.139 to 0.140 in view.
A sub-agent hopped into the turn-item light,
while old little shims slipped out of sight.
I thumped on the tests with a tidy back foot—
and tucked fresh docs in every root.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch schema/codex-cli-0-140-refresh

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 win

Guard empty resident state before protected-range slicing

Line 632 can trap on an empty turns array (0...-1 range path) because protectedTurnIDSet() 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 | 🟠 Major

Public diagnostic struct initializers are non-public due to synthesized memberwise init.

External code cannot construct CodexRuntimeWarning, CodexGuardianWarning, CodexModelReroute, and CodexModelVerificationDiagnostic instances because their initializers default to internal visibility. These types are associated values in the public CodexDiagnosticEvent enum, so external code instantiating enum cases like .warning(CodexRuntimeWarning(message:threadID:)) will fail at compile time.

Restore explicit public init for 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 win

Keep the generated test patch aligned with the new compatibility string.

The README/doc text already includes prior_window, but the emitted Tools/AgentSB/tests/test_cli.py and Tools/AgentSB/tests/test_tools.py snippets still rewrite the assertion to target_window only. 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 | 🟡 Minor

Add Sendable conformance to LibraryEvent for safe cross-actor streaming.

LibraryEvent is consumed in startEventTask() at line 908 via await appServer.libraryEvents(), which streams values from CodexAppServer (an actor) to Library (a @MainActor class). Swift 6.3 strict concurrency requires stream elements crossing actor boundaries to be Sendable. Add Sendable to 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 lift

Replace 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: Declare Sendable on inventory request/snapshot types for consistency with codebase pattern.

Both AppInventoryReadRequest (line 15) and AppInventorySnapshot (line 34) have all Sendable members and are used across the actor boundary at line 258. While Swift 6's strict concurrency automatically synthesizes Sendable for these structs, the codebase consistently declares Sendable explicitly on similar types (e.g., Configuration and Phase in the same file). Add Sendable conformance 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

📥 Commits

Reviewing files that changed from the base of the PR and between 0fc6bc0 and 1a8f28e.

⛔ Files ignored due to path filters (2)
  • Sources/SwiftASB/Generated/CodexWire/Latest/CodexLifecycleV2Batch+JSONValue.swift is excluded by !**/generated/**
  • Sources/SwiftASB/Generated/CodexWire/Latest/CodexWireInitializeResponse.swift is excluded by !**/generated/**
📒 Files selected for processing (106)
  • README.md
  • ROADMAP.md
  • Sources/ASBAppKit/ASBThreadSidebarView.swift
  • Sources/ASBPresentation/AgendaDashboardPresentation.swift
  • Sources/ASBPresentation/RecentActivityPresentation.swift
  • Sources/ASBPresentation/ThreadSidebarPresentation.swift
  • Sources/ASBPresentation/TurnTimelinePresentation.swift
  • Sources/ASBSwiftUI/Dashboard/ASBDashboardPanel.swift
  • Sources/ASBSwiftUI/Support/ASBSwiftUIStatusViews.swift
  • Sources/SwiftASB/History/ThreadHistoryStore.swift
  • Sources/SwiftASB/Protocol/CodexAppServerProtocol+Types.swift
  • Sources/SwiftASB/Protocol/CodexAppServerProtocol.swift
  • Sources/SwiftASB/Protocol/CodexProtocolError.swift
  • Sources/SwiftASB/Protocol/CodexRPCEnvelope.swift
  • Sources/SwiftASB/Public/CodexAppServer+Bootstrap.swift
  • Sources/SwiftASB/Public/CodexAppServer+CodexExtensions.swift
  • Sources/SwiftASB/Public/CodexAppServer+CommandExecution.swift
  • Sources/SwiftASB/Public/CodexAppServer+Compatibility.swift
  • Sources/SwiftASB/Public/CodexAppServer+GitObservability.swift
  • Sources/SwiftASB/Public/CodexAppServer+Hooks.swift
  • Sources/SwiftASB/Public/CodexAppServer+Inventory.swift
  • Sources/SwiftASB/Public/CodexAppServer+Library.swift
  • Sources/SwiftASB/Public/CodexAppServer+MCP.swift
  • Sources/SwiftASB/Public/CodexAppServer+Models.swift
  • Sources/SwiftASB/Public/CodexAppServer+ProtocolPayloads.swift
  • Sources/SwiftASB/Public/CodexAppServer+ThreadLifecycle.swift
  • Sources/SwiftASB/Public/CodexAppServer+ThreadManagement.swift
  • Sources/SwiftASB/Public/CodexAppServer+TurnLifecycle.swift
  • Sources/SwiftASB/Public/CodexAppServer+WireMapping.swift
  • Sources/SwiftASB/Public/CodexAppServer.swift
  • Sources/SwiftASB/Public/CodexConfig.swift
  • Sources/SwiftASB/Public/CodexDiagnostics.swift
  • Sources/SwiftASB/Public/CodexErrors.swift
  • Sources/SwiftASB/Public/CodexFS.swift
  • Sources/SwiftASB/Public/CodexInteractiveRequests.swift
  • Sources/SwiftASB/Public/CodexMCP.swift
  • Sources/SwiftASB/Public/CodexReviewHandle.swift
  • Sources/SwiftASB/Public/CodexThread+Agenda.swift
  • Sources/SwiftASB/Public/CodexThread+Dashboard.swift
  • Sources/SwiftASB/Public/CodexThread+RecentCommands.swift
  • Sources/SwiftASB/Public/CodexThread+RecentFiles.swift
  • Sources/SwiftASB/Public/CodexThread+RecentTurns.swift
  • Sources/SwiftASB/Public/CodexThread.swift
  • Sources/SwiftASB/Public/CodexTurnHandle.swift
  • Sources/SwiftASB/Public/CodexWorkspace.swift
  • Sources/SwiftASB/Public/SwiftASBFeatureOperationEvent.swift
  • Sources/SwiftASB/Public/SwiftASBFeaturePolicy.swift
  • Sources/SwiftASB/SwiftASB.docc/AppWideCapabilities.md
  • Sources/SwiftASB/SwiftASB.docc/CodexAppServer.md
  • Sources/SwiftASB/SwiftASB.docc/CodexWorkspace.md
  • Sources/SwiftASB/Transport/CodexAppServerTransport.swift
  • Sources/SwiftASB/Transport/CodexAppServerTransporting.swift
  • Sources/SwiftASB/Transport/CodexCLIExecutableResolver.swift
  • Sources/SwiftASB/Transport/CodexRPCRequestID.swift
  • Sources/SwiftASB/Transport/CodexTransportError.swift
  • Sources/SwiftASB/Transport/LineDelimitedDataBuffer.swift
  • Tests/ASBAppKitTests/ASBThreadSidebarViewTests.swift
  • Tests/ASBPresentationTests/ASBPresentationBoundaryTests.swift
  • Tests/ASBPresentationTests/AgendaDashboardPresentationTests.swift
  • Tests/ASBPresentationTests/RecentActivityPresentationTests.swift
  • Tests/ASBPresentationTests/ThreadSidebarPresentationTests.swift
  • Tests/ASBPresentationTests/TurnTimelinePresentationTests.swift
  • Tests/ASBSwiftUITests/ASBSwiftUIComponentTests.swift
  • Tests/SwiftASBTests/Protocol/CodexAppServerProtocolTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerCompanionSurfaceTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerDiagnosticsTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerFileSystemTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerInventoryTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerLibraryTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerLiveApprovalProbeTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerLiveBehaviorScenarioTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerLiveElicitationProbeTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerLiveIntegrationTestSupport.swift
  • Tests/SwiftASBTests/Public/CodexAppServerLiveIntegrationTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerRecentCachePolicyTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerRecentCommandsTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerRecentFileCachePolicyTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerRecentFilesTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerRecentTurnCachePolicyTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerRecentTurnsTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerStoredThreadTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerTestSupport.swift
  • Tests/SwiftASBTests/Public/CodexAppServerTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerThreadHydrationTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerThreadManagementTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerTurnInteractionTests.swift
  • Tests/SwiftASBTests/Public/CodexAppServerTurnLifecycleTests.swift
  • Tests/SwiftASBTests/Public/CodexMCPTests.swift
  • Tests/SwiftASBTests/Public/CodexWorkspaceTests.swift
  • Tests/SwiftASBTests/Public/SwiftASBFeatureOperationEventTests.swift
  • Tests/SwiftASBTests/Public/SwiftASBFeaturePolicyTests.swift
  • Tests/SwiftASBTests/Transport/CodexAppServerTransportTests.swift
  • Tests/SwiftASBTests/Transport/CodexCLIExecutableResolverTests.swift
  • Tests/SwiftASBTests/Transport/CodexRPCEnvelopeTests.swift
  • Tests/SwiftASBTests/Transport/LineDelimitedDataBufferTests.swift
  • Tools/AgentSB/agentsb/maintain.py
  • Tools/AgentSB/tests/test_cli.py
  • Tools/AgentSB/tests/test_tools.py
  • docs/maintainers/interactive-lifecycle-release-boundary.md
  • docs/maintainers/mcp-configuration-writing.md
  • docs/maintainers/quicktype-codegen-notes.md
  • docs/maintainers/v1-public-api-audit.md
  • docs/maintainers/v1-public-api-symbol-inventory.md
  • scripts/generate-wire-types.sh
  • scripts/patch_quicktype_swift_any.py
  • scripts/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

Comment on lines +8 to 11
enum CodexRPCServerEvent: Equatable {
case notification(method: String, payload: Data)
case request(id: CodexRPCRequestID, method: String, payload: Data)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 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.swift

Repository: 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 swift

Repository: 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.swift

Repository: 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.swift

Repository: 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.

Comment thread Sources/SwiftASB/Public/CodexTurnHandle.swift
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
@gaelic-ghost gaelic-ghost merged commit 59e8537 into main Jun 17, 2026
2 checks passed
@gaelic-ghost gaelic-ghost deleted the schema/codex-cli-0-140-refresh branch June 17, 2026 06:28
@coderabbitai coderabbitai Bot mentioned this pull request Jun 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant