Skip to content

fix(export): preserve concurrent outputs during publication - #266

Merged
johnny4young merged 3 commits into
mainfrom
fix/non-replacing-output-publication
Oct 9, 2026
Merged

johnny4young merged 3 commits into
mainfrom
fix/non-replacing-output-publication

Conversation

@johnny4young

@johnny4young johnny4young commented Oct 9, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Share the non-replacing filesystem publisher between GUI batch exports and CLI --no-overwrite image, sidecar, manifest, and skipped-report writes. Enforce exclusivity when each output is published, rather than relying on preflight.
  • Preserve a concurrent producer's replacement when the exclusive-create fallback fails. Surface the error without unlinking the public destination; on unsupported-rename volumes an incomplete file can remain.
  • --no-overwrite preflight now checks image, sidecar, and batch report targets without following symlinks, so a dangling symlink is reported as an existing output before rendering instead of failing late with a generic write error.
  • Remove duplicate sidecar error logging; the shared writer logs the underlying error once and maps it to writeFailed.
  • Add real-filesystem failure ownership, late image/sidecar collision, late full-batch report collision, dangling symlink (publication and preflight), and default overwrite regressions.
  • Document per-file publication and partial-run behavior; correct the pagination example; add a changelog entry.

Validation

  • Final head 8084a05f0c25f965fbecf188ca1dc0b581bda715: CI run passed all jobs (Linux static checks, Sequoia 15 and Tahoe 26 native build/test lanes, both UI lanes, GitGuardian).
  • Locally: every Linux-runnable make lint sub-check and make changelog-check passed; swift-format lint --strict and swiftc -parse passed on the changed Swift files.

Scope and limits

  • Publication is per-file, not whole-bundle rollback. Unsupported-rename fallback may leave partial output after an I/O failure.
  • Follow-ups not in this change: a late collision is reported as writeFailed rather than outputExists (same exit code); a late skipped-report failure stops before the manifest is written; a batch input whose image published but whose sidecar collided is reported as skipped without a manifest entry; the fallback re-stages the payload on every write to volumes without exclusive rename.

Generated by Claude Code

johnny4young and others added 3 commits October 9, 2026 14:35
- Check no-overwrite image, sidecar, and batch report targets with lstat so a dangling symlink fails preflight as an existing output instead of a late write failure
- Drop the duplicate sidecar error logging now that the shared writer logs and maps failures
- Add regression tests and a changelog entry for publication-time no-clobber
@johnny4young
johnny4young marked this pull request as ready for review October 9, 2026 21:16
@johnny4young
johnny4young merged commit 0186096 into main Oct 9, 2026
6 checks passed
@johnny4young
johnny4young deleted the fix/non-replacing-output-publication branch October 9, 2026 21:16
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.

2 participants