### concurrent trigger $ LD_LIBRARY_PATH=/tmp/libxml-compat swift run banal publish --json --vault /tmp/banal-batch-001-vault & $ LD_LIBRARY_PATH=/tmp/libxml-compat swift run banal publish --json --vault /tmp/banal-batch-001-vault & $ wait ### observed command results # Two simultaneous publish processes were started against the same temporary vault. # Exit codes: A=1, B=1 # A stderr contained UniformTypeIdentifiers compilation error: true # B stderr contained UniformTypeIdentifiers compilation error: true # Both processes failed before the publish pipeline executed; neither produced JSON, # compiler information, an artifact path, or a publish artifact directory. # Artifact directories after completion: none ### source-backed filesystem evidence // Sources/BANALPublisher/PublishModels.swift:38-41 artifactDirectory: vault.publishURL, stagingDirectory: vault.metadataURL.appendingPathComponent("stage", isDirectory: true), // Sources/BANALPublisher/BorisAdapter.swift:140-147 let staging = configuration.stagingDirectory if fileManager.fileExists(atPath: staging.path) { try fileManager.removeItem(at: staging) } let content = staging.appendingPathComponent("content", isDirectory: true) let layouts = staging.appendingPathComponent("layouts", isDirectory: true) try fileManager.createDirectory(at: content, withIntermediateDirectories: true) // Sources/BANALPublisher/SiteCompiler.swift:33-43 (builtin compiler) let fileManager = FileManager.default if fileManager.fileExists(atPath: artifactDirectory.path) { try fileManager.removeItem(at: artifactDirectory) } try fileManager.createDirectory(at: artifactDirectory, withIntermediateDirectories: true) // Sources/BANALPublisher/SiteCompiler.swift:154-157 (Boris compiler) if fileManager.fileExists(atPath: artifactDirectory.path) { try fileManager.removeItem(at: artifactDirectory) } try fileManager.copyItem(at: relativeDist, to: artifactDirectory) ### final result # final result: BF-RACE-3 failed. The runtime concurrency check was blocked by the # Linux Swift toolchain's missing UniformTypeIdentifiers module, so mixed output was # not observed directly. Independently, every invocation receives the same mutable # staging and artifact paths, and both compiler paths perform unsynchronized delete/ # recreate or copy operations; overlapping publishes can therefore remove or replace # another invocation's files and produce incomplete or mixed results.