Hive Hive
Sign in

Xcode 27: tuist generate reports a false circular dependency for xctest-dynamic-overlay

GitHub issue · Open

Metadata
Source
tuist/tuist #12846
Updated
Sep 9, 2026
Details

tuist generate reports a false circular dependency for xctest-dynamic-overlay

Environment

macOS: 27.0 (26A5425a)
Xcode: 27.0 (beta 6) (27A5252f)
Swift: 6.4
Tuist: 4.206.0 (same on 4.208.0-canary.1)

The same project succeeds with macOS 26 and Xcode 26.

Reproduction

The reproducer is a minimal Tuist project with two direct package dependencies:

.package(
url: "https://github.com/pointfreeco/xctest-dynamic-overlay.git",
exact: "1.13.1",
),
.package(
url: "https://github.com/pointfreeco/swift-snapshot-testing.git",
exact: "1.19.4",
),

Run only:

tuist install
tuist generate

tuist install succeeds and resolves:

swift-custom-dump 1.7.3
swift-snapshot-testing 1.19.4
swift-syntax 603.0.2
xctest-dynamic-overlay 1.13.1

Actual result

tuist generate fails while constructing the graph:

Found circular dependency between targets:
.../TuistXCTestIssueReportingRepro
-> .../xctest-dynamic-overlay:XCTestDynamicOverlay
-> .../xctest-dynamic-overlay:_IssueReporting
-> .../xctest-dynamic-overlay:_IssueReporting

Expected result

Tuist should generate the workspace successfully. The dependency graph should not contain a target depending on itself.

Additional context

xctest-dynamic-overlay 1.13.1 is a compatibility package forwarding to the newer issue-reporting implementation. swift-snapshot-testing brings swift-custom-dump transitively, which creates the relevant package graph.

The same dependency setup works with macOS 26 and Xcode 26, and the issue appears only after switching to macOS 27/Xcode 27.

Flights

Investigate, reproduce, or fix this item in an isolated repository. Each Flight preserves its outcome and agent session.

New Flights are paused Configure model inference, GitHub, and a sandbox provider to start another Flight. Existing results remain available below.
No Flights yet

Start a Flight and preserve its objective, outcome, and session here.

Comments
A
alexanderwe Sep 9, 2026

This seems to also happen if you do not explicitly link xctest-dynamic-overlay and for example use swift-snapshot-testing and swift-custom-dump in a project which are then both under the hood link against xctest-dynamic-overlay

IG
ivan-gaydamakin Sep 10, 2026

I found an application-level workaround that makes generation succeed: remove the direct xctest-dynamic-overlay dependency and depend on swift-issue-reporting directly.

The relevant package declarations are:

.package(
url: "https://github.com/pointfreeco/swift-issue-reporting",
from: "2.1.0"
),
.package(
url: "https://github.com/pointfreeco/swift-custom-dump",
from: "1.7.3"
),
.package(
url: "https://github.com/pointfreeco/swift-snapshot-testing",
.upToNextMajor(from: "1.19.4")
),

I also replaced the linked product and import:

// Before
.product(name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay")
import XCTestDynamicOverlay
// After
.product(name: "IssueReporting", package: "swift-issue-reporting")
import IssueReporting

Calls previously using XCTFail from the overlay were migrated to reportIssue, preserving their source location through fileID, filePath, and line.

After removing xctest-dynamic-overlay from the package graph and resolving again, both tuist install and tuist generate succeed with:

  • Xcode 27.0 RC (27A266a)
  • Swift 6.4
  • Tuist 4.207.0
  • swift-snapshot-testing 1.19.4
  • swift-custom-dump 1.7.3
  • swift-issue-reporting 2.1.0 .