 			|> map { PinnedVersion($0) }
 			|> collect
 			|> on(next: { newVersions in
-				self.modifyCachedVersions { (var cachedVersions) in
-					cachedVersions[project] = newVersions
-					return cachedVersions
-				}
+				self.cachedVersions[project] = newVersions
 			})
 			|> flatMap(.Concat) { versions in SignalProducer(values: versions) }
 
-		return readCachedVersions()
+		return SignalProducer.try {
+				return .success(self.cachedVersions)
+			}
 			|> promoteErrors(CarthageError.self)
 			|> flatMap(.Merge) { versionsByProject -> SignalProducer<PinnedVersion, CarthageError> in
 				if let versions = versionsByProject[project] {

					return fetchVersions
				}
			}
	}

	/// Attempts to resolve a Git reference to a version.

	/// Caches versions to avoid expensive lookups, and unnecessary
	/// fetching/cloning.
	private var cachedVersions: CachedVersions = [:]
	private let cachedVersionsQueue = ProducerQueue(name: "org.carthage.CarthageKit.Project.cachedVersionsQueue")

	/// Attempts to load Cartfile or Cartfile.private from the given directory,
	/// merging their dependencies.
