The Swift Package Index logo.Swift Package Index

Build Information

Successful build of Kadr, reference main (ff6c4b), with Swift 6.4 for macOS (SPM) on 31 Oct 2026 05:49:28 UTC.

Swift 6 data race errors: 0

Build Command

env DEVELOPER_DIR=/Applications/Xcode-27.0.0.app xcrun swift build --arch arm64

Build Log

========================================
RunAll
========================================
Builder version: 5.1.4
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/SteliyanH/kadr.git
Reference: main
Initialized empty Git repository in /Users/admin/builder/spi-builder-workspace/.git/
From https://github.com/SteliyanH/kadr
 * branch            main       -> FETCH_HEAD
 * [new branch]      main       -> origin/main
HEAD is now at ff6c4bf release: v1.1.1 changelog
Cloned https://github.com/SteliyanH/kadr.git
Revision (git rev-parse @):
ff6c4bf2ee6663aa7ce973ee5a678c67f6d63475
SPI manifest file found: $PWD/.spi.yml
SUCCESS checkout https://github.com/SteliyanH/kadr.git at main
========================================
ResolveProductDependencies
========================================
Resolving dependencies ...
{
  "identity": ".resolve-product-dependencies",
  "name": "resolve-dependencies",
  "url": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
  "version": "unspecified",
  "path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
  "traits": [
    "default"
  ],
  "dependencies": [
    {
      "identity": "kadr",
      "name": "Kadr",
      "url": "https://github.com/SteliyanH/kadr.git",
      "version": "unspecified",
      "path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies/.build/checkouts/kadr",
      "traits": [
        "default"
      ],
      "dependencies": [
      ]
    }
  ]
}
Fetching https://github.com/SteliyanH/kadr.git
[1/2152] Fetching kadr
Fetched https://github.com/SteliyanH/kadr.git (10.53s)
Creating working copy for https://github.com/SteliyanH/kadr.git
Working copy of https://github.com/SteliyanH/kadr.git resolved at main (ff6c4bf)
warning: '.resolve-product-dependencies': dependency 'kadr' is not used by any target
Found 0 product dependencies
========================================
Build
========================================
Selected platform:         macosSpm
Swift version:             6.4
Building package at path:  $PWD
https://github.com/SteliyanH/kadr.git
Running build ...
env DEVELOPER_DIR=/Applications/Xcode-27.0.0.app xcrun swift build --arch arm64
Building for debugging...
[Pre-planning 1 / 153]
[Planning deferred tasks]
[43 / 69] Kadr_KadrTests
[45 / 69]
[46 / 70] Kadr
[56 / 154]
[59 / 154]
[67 / 154]
[69 / 154]
[70 / 154]
[75 / 154]
[77 / 154]
[79 / 154]
[82 / 154]
[87 / 154]
[89 / 154]
[92 / 154]
[93 / 154]
[104 / 154]
[107 / 154]
[113 / 154]
[118 / 154]
[119 / 154]
[130 / 154] Kadr
[131 / 154] Kadr
[139 / 155]
[141 / 169]
[143 / 170]
[145 / 170] KadrExamples
[152 / 170] KadrExamples
[153 / 174] KadrBenchmarks-product
[162 / 174] KadrExamples
[166 / 174]
[168 / 174] KadrBenchmarks-product
[168 / 174] KadrExamples
[170 / 174] KadrBenchmarks-product
[172 / 174] KadrExamples
Build complete! (14.34 sec)
warning: 'spi-builder-workspace': found 7 file(s) which are unhandled; explicitly declare them as resources or exclude from the target
    /Users/admin/builder/spi-builder-workspace/Examples/README.md
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_audio.mp3
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_forest.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_ocean.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_purple.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_sunset.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_video.mp4
Build complete.
{
  "dependencies" : [
  ],
  "manifest_display_name" : "Kadr",
  "name" : "Kadr",
  "path" : "/Users/admin/builder/spi-builder-workspace",
  "platforms" : [
    {
      "name" : "ios",
      "version" : "17.0"
    },
    {
      "name" : "macos",
      "version" : "14.0"
    },
    {
      "name" : "tvos",
      "version" : "17.0"
    },
    {
      "name" : "visionos",
      "version" : "1.0"
    }
  ],
  "products" : [
    {
      "name" : "Kadr",
      "targets" : [
        "Kadr"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "KadrBenchmarks",
      "targets" : [
        "KadrBenchmarks"
      ],
      "type" : {
        "executable" : null
      }
    }
  ],
  "targets" : [
    {
      "c99name" : "KadrTests",
      "module_type" : "SwiftTarget",
      "name" : "KadrTests",
      "path" : "Tests/KadrTests",
      "resources" : [
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.mov",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.mp3",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.png",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.wav",
          "rule" : {
            "process" : {
            }
          }
        }
      ],
      "sources" : [
        "APIValidationTests.swift",
        "AnimationClearingModifiersTests.swift",
        "AnimationTests.swift",
        "AssetWriterExportTests.swift",
        "AudioBuilderTests.swift",
        "AudioCrossfadeTests.swift",
        "AudioSpeedTests.swift",
        "AudioTrackTimingTests.swift",
        "AudioVolumeRampTests.swift",
        "AudioWaveformTests.swift",
        "CMTimeAPITests.swift",
        "CancellationTokenTests.swift",
        "CaptionTests.swift",
        "ChromaKeyComponentsTests.swift",
        "ChromaKeyTests.swift",
        "ClipAtTimeTests.swift",
        "ClipCropTests.swift",
        "ClipIDTests.swift",
        "ClipMaskTests.swift",
        "ClipVolumeTests.swift",
        "CompositorTests.swift",
        "CropTests.swift",
        "DSLTests.swift",
        "DuckingTests.swift",
        "EdgeCasesTests.swift",
        "EmptyCompositionTests.swift",
        "ExportQualityTests.swift",
        "ExportTests.swift",
        "FilterIDRestorationTests.swift",
        "FilterIDTests.swift",
        "FilterIntensityAnimationTests.swift",
        "FilterKindTests.swift",
        "FilterPixelTests.swift",
        "FilterPresetsTests.swift",
        "FilterTests.swift",
        "IntrospectionTests.swift",
        "KadrErrorLocalizedTests.swift",
        "KadrVideoCompositorTests.swift",
        "LUTTests.swift",
        "LayoutHelpersTests.swift",
        "LayoutTests.swift",
        "MoveFiltersTests.swift",
        "MultiInputCompositorTests.swift",
        "MultiTrackEngineTests.swift",
        "MultiTrackLayeringTests.swift",
        "MultiTrackRecursiveTests.swift",
        "NoAudioCompositionExportTests.swift",
        "OverlayLayoutAnimationTests.swift",
        "OverlayTests.swift",
        "OverlayVisibilityTests.swift",
        "PassthroughFallbackTests.swift",
        "PreviewAPITests.swift",
        "SampleMediaTests.swift",
        "SimulatorOverlayExportTests.swift",
        "SpeedCurveTests.swift",
        "SpeedEnumTests.swift",
        "SpeedTests.swift",
        "SugarTests.swift",
        "TestEnvironment.swift",
        "TextAnimationTests.swift",
        "TextEffectsTests.swift",
        "TextOverlayExportTests.swift",
        "TrackTests.swift",
        "TransformTests.swift",
        "TransitionsTests.swift",
        "V010PolishTests.swift"
      ],
      "target_dependencies" : [
        "Kadr"
      ],
      "type" : "test"
    },
    {
      "c99name" : "KadrExamples",
      "module_type" : "SwiftTarget",
      "name" : "KadrExamples",
      "path" : "Examples",
      "sources" : [
        "APIValidation.swift",
        "SimpleEditor/ContentView.swift",
        "V020Showcase.swift",
        "V030Showcase.swift",
        "V040Showcase.swift",
        "V041Showcase.swift",
        "V050Showcase.swift",
        "V060Showcase.swift",
        "V070Showcase.swift",
        "V080Showcase.swift",
        "V090Showcase.swift",
        "V100Showcase.swift",
        "V110Showcase.swift",
        "V120Showcase.swift",
        "V140Showcase.swift",
        "V1_0_0Showcase.swift"
      ],
      "target_dependencies" : [
        "Kadr"
      ],
      "type" : "library"
    },
    {
      "c99name" : "KadrBenchmarks",
      "module_type" : "SwiftTarget",
      "name" : "KadrBenchmarks",
      "path" : "Benchmarks/KadrBenchmarks",
      "product_memberships" : [
        "KadrBenchmarks"
      ],
      "sources" : [
        "Fixtures.swift",
        "Harness.swift",
        "main.swift"
      ],
      "target_dependencies" : [
        "Kadr"
      ],
      "type" : "executable"
    },
    {
      "c99name" : "Kadr",
      "module_type" : "SwiftTarget",
      "name" : "Kadr",
      "path" : "Sources/Kadr",
      "product_memberships" : [
        "Kadr",
        "KadrBenchmarks"
      ],
      "sources" : [
        "Animation/Animatable.swift",
        "Animation/Animation.swift",
        "Animation/TimingFunction.swift",
        "DSL/AudioBuilder.swift",
        "DSL/AudioTimePitchAlgorithm.swift",
        "DSL/AudioTrack.swift",
        "DSL/BackgroundMusic.swift",
        "DSL/Caption.swift",
        "DSL/Clip.swift",
        "DSL/ImageClip+Color.swift",
        "DSL/ImageClip.swift",
        "DSL/SampleMedia.swift",
        "DSL/TitleSequence.swift",
        "DSL/Track.swift",
        "DSL/Transition.swift",
        "DSL/Video.swift",
        "DSL/VideoBuilder.swift",
        "DSL/VideoClip.swift",
        "Engine/AssetWriterExporter.swift",
        "Engine/AudioWaveform.swift",
        "Engine/AudioWaveformLoader.swift",
        "Engine/CancellationToken.swift",
        "Engine/CompositionBuilder.swift",
        "Engine/Compositor.swift",
        "Engine/CropCompositor.swift",
        "Engine/ExportEngine.swift",
        "Engine/FilterProcessor.swift",
        "Engine/ImageEncoder.swift",
        "Engine/KadrVideoCompositor.swift",
        "Engine/MaskCompositor.swift",
        "Engine/MultiInputCompositor.swift",
        "Engine/OverlayRenderer.swift",
        "Engine/PlaybackComposer.swift",
        "Engine/ReverseProcessor.swift",
        "Engine/SpeedCurveSampler.swift",
        "Engine/ThumbnailGenerator.swift",
        "Errors/KadrError+LocalizedError.swift",
        "Errors/KadrError.swift",
        "Export/ExportProgress.swift",
        "Export/ExportSettings.swift",
        "Export/Exporter.swift",
        "Export/Preset.swift",
        "Filters/ChromaKey.swift",
        "Filters/Filter.swift",
        "Filters/FilterKind.swift",
        "Filters/LUT.swift",
        "Layout/Anchor.swift",
        "Layout/ClipID.swift",
        "Layout/CropRegion.swift",
        "Layout/FilterID.swift",
        "Layout/Frame.swift",
        "Layout/LayerID.swift",
        "Layout/Layout.swift",
        "Layout/Position.swift",
        "Layout/Size.swift",
        "Layout/Transform.swift",
        "Modifiers/Clip+AnimationClearing.swift",
        "Modifiers/Clip+FilterID.swift",
        "Modifiers/Clip+Speed.swift",
        "Overlays/ImageOverlay.swift",
        "Overlays/Overlay.swift",
        "Overlays/StickerOverlay.swift",
        "Overlays/TextAnimation.swift",
        "Overlays/TextOverlay.swift",
        "Overlays/TextShadow.swift",
        "Overlays/TextStroke.swift",
        "Overlays/TextStyle.swift",
        "Overlays/Watermark.swift",
        "Platform/PlatformTypes.swift",
        "Time/Timecode.swift"
      ],
      "type" : "library"
    }
  ],
  "tools_version" : "6.0"
}
✅  Doc result (pending) reported
========================================
GenerateDocs
========================================
Generating docs at path:  $PWD/.docs/steliyanh/kadr/main
Repository:               SteliyanH/kadr
Swift version used:       6.4
Target:                   Kadr
Extracting symbol information for 'Kadr'...
Finished extracting symbol information for 'Kadr'. (2.48s)
Building documentation for 'Kadr'...
warning: 'fadeIn(_:)' is ambiguous at '/Kadr/AudioTrack'
  --> ../DSL/AudioTrack.swift:29:19-29:29
27 |
28 |     /// Fade-in duration applied at the start of the track. `.zero` if no fade-in.
29 +     /// Set via ``fadeIn(_:)`` (CMTime or TimeInterval).
   |                             ├─suggestion: Insert '-(CMTime)' for 'func fadeIn(_ duration: CMTime) -> AudioTrack'
   |                             ╰─suggestion: Insert '-(TimeInterval)' for 'func fadeIn(_ duration: TimeInterval) -> AudioTrack'
30 |     public let fadeInDuration: CMTime
31 |
warning: 'fadeOut(_:)' is ambiguous at '/Kadr/AudioTrack'
  --> ../DSL/AudioTrack.swift:33:19-33:30
31 |
32 |     /// Fade-out duration applied at the end of the track. `.zero` if no fade-out.
33 +     /// Set via ``fadeOut(_:)`` (CMTime or TimeInterval).
   |                              ├─suggestion: Insert '-(CMTime)' for 'func fadeOut(_ duration: CMTime) -> AudioTrack'
   |                              ╰─suggestion: Insert '-(TimeInterval)' for 'func fadeOut(_ duration: TimeInterval) -> AudioTrack'
34 |     public let fadeOutDuration: CMTime
35 |
warning: 'crossfade(_:)' is ambiguous at '/Kadr/AudioTrack'
  --> ../DSL/AudioTrack.swift:57:63-57:76
55 |     /// fade in on the next — over `min(crossfadeDuration, overlapDuration)`. The
56 |     /// crossfade overrides any explicit `fadeIn` / `fadeOut` at that boundary so
57 +     /// AVFoundation doesn't see overlapping ramps. Set via ``crossfade(_:)``.
   |                                                                            ├─suggestion: Insert '-(CMTime)' for 'func crossfade(_ duration: CMTime) -> AudioTrack'
   |                                                                            ╰─suggestion: Insert '-(TimeInterval)' for 'func crossfade(_ duration: TimeInterval) -> AudioTrack'
58 |     /// Added in v0.8.
59 |     public let crossfadeDuration: CMTime?
warning: 'volumeRamp(start:end:during:)' is ambiguous at '/Kadr/AudioTrack'
  --> ../DSL/AudioTrack.swift:64:15-64:44
62 |     /// (0 = the audio's start in the composition, i.e. ``startTime``). Each ramp
63 |     /// linearly interpolates from `startVolume` to `endVolume` across `range`. Set
64 +     /// via ``volumeRamp(start:end:during:)``. Added in v0.8.3.
   |                                            ├─suggestion: Insert '-(_,_,CMTimeRange)' for 'func volumeRamp(start: Double, end: Double, during range: CMTimeRange) -> AudioTrack'
   |                                            ╰─suggestion: Insert '-(_,_,ClosedRange<TimeInterval>)' for 'func volumeRamp(start: Double, end: Double, during range: ClosedRange<TimeInterval>) -> AudioTrack'
65 |     ///
66 |     /// Engine consumers must avoid overlap between ramps and the implicit fade-in /
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
  --> ../DSL/Video.swift:46:63-46:69
44 |     public internal(set) var crop: CropRegion?
45 |
46 +     /// Optional multi-track blender. Set via ``compositor(_:)-(any)`` /
   |                                                               ├─suggestion: Replace '(any)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
   |                                                               ╰─suggestion: Replace '(any)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
47 |     /// ``compositor(_:)-(closure)``. `nil` (default) means the engine will use its
48 |     /// built-in alpha-composite later-over-earlier blender when the composition has
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
  --> ../DSL/Video.swift:47:25-47:35
45 |
46 |     /// Optional multi-track blender. Set via ``compositor(_:)-(any)`` /
47 +     /// ``compositor(_:)-(closure)``. `nil` (default) means the engine will use its
   |                         ├─suggestion: Replace '(closure)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
   |                         ╰─suggestion: Replace '(closure)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
48 |     /// built-in alpha-composite later-over-earlier blender when the composition has
49 |     /// multiple parallel tracks.
warning: '(CMTimeRange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
  --> ../DSL/Video.swift:56:32-56:46
54 |     /// engine consults each frame's composition time — inside the window the user's
55 |     /// compositor runs; outside it, the default alpha-composite blender runs. Set via
56 +     /// ``compositor(_:during:)-(CMTimeRange)`` / ``compositor(_:during:)-(closedrange)``.
   |                                ├─suggestion: Replace '(CMTimeRange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
   |                                ╰─suggestion: Replace '(CMTimeRange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
57 |     /// Added in v0.7.
58 |     public internal(set) var compositorWindow: CMTimeRange?
warning: '(closedrange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
  --> ../DSL/Video.swift:56:74-56:88
54 |     /// engine consults each frame's composition time — inside the window the user's
55 |     /// compositor runs; outside it, the default alpha-composite blender runs. Set via
56 +     /// ``compositor(_:during:)-(CMTimeRange)`` / ``compositor(_:during:)-(closedrange)``.
   |                                                                          ├─suggestion: Replace '(closedrange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
   |                                                                          ╰─suggestion: Replace '(closedrange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
57 |     /// Added in v0.7.
58 |     public internal(set) var compositorWindow: CMTimeRange?
warning: '(CMTimeRange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
   --> ../DSL/Video.swift:287:48-287:62
285 |     }
286 |
287 +     /// Closure form of ``compositor(_:during:)-(CMTimeRange)``. Added in v0.7.
    |                                                ├─suggestion: Replace '(CMTimeRange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
    |                                                ╰─suggestion: Replace '(CMTimeRange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
288 |     public func compositor(during range: CMTimeRange, _ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video {
289 |         compositor(ClosureMultiInputCompositor(body: body), during: range)
warning: '(closedrange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
   --> ../DSL/Video.swift:292:48-292:62
290 |     }
291 |
292 +     /// Closure form of ``compositor(_:during:)-(closedrange)``. Added in v0.7.
    |                                                ├─suggestion: Replace '(closedrange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
    |                                                ╰─suggestion: Replace '(closedrange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
293 |     public func compositor(during range: ClosedRange<TimeInterval>, _ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video {
294 |         compositor(ClosureMultiInputCompositor(body: body), during: range)
warning: 'trimmed(to:)' is ambiguous at '/Kadr/VideoClip'
  --> ../DSL/VideoClip.swift:41:19-41:31
39 |
40 |     /// The active trim range in source-asset time, or `nil` if the full asset is used.
41 +     /// Set via ``trimmed(to:)`` (CMTimeRange or ClosedRange<TimeInterval>).
   |                               ├─suggestion: Insert '-(CMTimeRange)' for 'func trimmed(to range: CMTimeRange) -> VideoClip'
   |                               ╰─suggestion: Insert '-(ClosedRange<TimeInterval>)' for 'func trimmed(to range: ClosedRange<TimeInterval>) -> VideoClip'
42 |     public internal(set) var trimRange: CMTimeRange?
43 |
warning: 'trimmed(to:)' is ambiguous at '/Kadr/VideoClip'
  --> ../DSL/VideoClip.swift:71:11-71:23
69 |     /// 0.5 = half-speed, 2.0 = 2×). The engine integrates the curve into a piecewise-linear
70 |     /// time map and applies via repeated `scaleTimeRange` segments. Composes with
71 +     /// ``trimmed(to:)``: trim is applied first (selects the source range), then the speed
   |                       ├─suggestion: Insert '-(CMTimeRange)' for 'func trimmed(to range: CMTimeRange) -> VideoClip'
   |                       ╰─suggestion: Insert '-(ClosedRange<TimeInterval>)' for 'func trimmed(to range: ClosedRange<TimeInterval>) -> VideoClip'
72 |     /// curve maps that range to the timeline. Set via ``speed(curve:)``. Added in v0.9.
73 |     public internal(set) var speedCurve: Animation<Double>?
warning: 'speed(curve:)' doesn't exist at '/Kadr/VideoClip/speedCurve'
  --> ../DSL/VideoClip.swift:72:58-72:71
70 |     /// time map and applies via repeated `scaleTimeRange` segments. Composes with
71 |     /// ``trimmed(to:)``: trim is applied first (selects the source range), then the speed
72 +     /// curve maps that range to the timeline. Set via ``speed(curve:)``. Added in v0.9.
73 |     public internal(set) var speedCurve: Animation<Double>?
74 |
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
   --> ../DSL/VideoClip.swift:102:46-102:52
100 |
101 |     /// User-supplied compositors applied to this clip in declaration order, after
102 +     /// ``filters``. Set via ``compositor(_:)-(any)`` or ``compositor(_:)-(closure)``.
    |                                              ├─suggestion: Replace '(any)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
    |                                              ╰─suggestion: Replace '(any)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
103 |     public internal(set) var compositors: [any Compositor]
104 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
   --> ../DSL/VideoClip.swift:102:74-102:84
100 |
101 |     /// User-supplied compositors applied to this clip in declaration order, after
102 +     /// ``filters``. Set via ``compositor(_:)-(any)`` or ``compositor(_:)-(closure)``.
    |                                                                          ├─suggestion: Replace '(closure)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
    |                                                                          ╰─suggestion: Replace '(closure)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
103 |     public internal(set) var compositors: [any Compositor]
104 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
  --> ../Engine/Compositor.swift:37:74-37:84
35 | /// ```
36 | ///
37 + /// For ad-hoc use, prefer the closure form on ``VideoClip/compositor(_:)-(closure)``.
   |                                                                          ├─suggestion: Replace '(closure)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
   |                                                                          ╰─suggestion: Replace '(closure)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
38 | ///
39 | /// **Constraints**
warning: 'KadrVideoCompositor' doesn't exist at '/Kadr/ThumbnailGenerator'
  --> ../Engine/ThumbnailGenerator.swift:42:19-42:38
40 | /// > the batch ``thumbnails(at:)`` stream (which drives `images(for:)` from a producer
41 | /// > task) free of actor-isolation friction. Matches the engine's other AVFoundation
42 + /// > wrappers (``KadrVideoCompositor``).
43 | public final class ThumbnailGenerator: @unchecked Sendable {
44 |
warning: 'allCases' doesn't exist at '/Kadr/FilterKind'
  --> ../Filters/FilterKind.swift:10:35-10:43
8  | /// offering "add a filter" therefore has to hard-code the menu, and every
9  | /// hard-coded menu goes stale the moment a filter is added here. This type is
10 + /// the fix: iterate ``FilterKind/allCases``, and a filter added to kadr appears
11 | /// in the menu without the consumer changing anything.
12 | ///
warning: 'rawValue' doesn't exist at '/Kadr/FilterKind/displayName'
  --> ../Filters/FilterKind.swift:71:39-71:47
69 |     /// An English name, for menus.
70 |     ///
71 +     /// kadr ships no localisation. ``rawValue`` is a stable key, so a localised
72 |     /// app can look up its own string by it and fall back to this.
73 |     public var displayName: String {
warning: 'allCases' doesn't exist at '/Kadr/FilterKind'
   --> ../Filters/FilterKind.swift:110:68-110:76
108 |     ///
109 |     /// Exhaustive by construction: a new `Filter` case fails to compile here
110 +     /// until it is given a kind, which is what keeps ``FilterKind/allCases``
111 |     /// honest.
112 |     ///
warning: Organizing 'Kadr/MultiTrackComposition' under 'Kadr/CustomCompositors' forms a cycle
Links in a "Topics section" are used to organize documentation into a hierarchy. The documentation hierarchy shouldn't contain cycles.
If this link contributed to the documentation hierarchy it would introduce this cycle:
╭─▶︎ CustomCompositors ─▶︎ MultiTrackComposition ─╮
╰───────────────────────────────────────────────╯
   --> CustomCompositors.md:100:3-100:30
98  | - ``MultiInputCompositor``
99  | - ``Filter``
100 + - <doc:MultiTrackComposition>
    | ╰─suggestion: Remove '- <doc:MultiTrackComposition>'
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
  --> Kadr.md:55:25-55:31
53 | - ``VideoClip/at(time:)-(TimeInterval)``
54 | - ``MultiInputCompositor``
55 + - ``Video/compositor(_:)-(any)``
   |                         ├─suggestion: Replace '(any)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
   |                         ╰─suggestion: Replace '(any)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
56 | - ``Video/compositor(_:)-(closure)``
57 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
  --> Kadr.md:56:25-56:35
54 | - ``MultiInputCompositor``
55 | - ``Video/compositor(_:)-(any)``
56 + - ``Video/compositor(_:)-(closure)``
   |                         ├─suggestion: Replace '(closure)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
   |                         ╰─suggestion: Replace '(closure)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
57 |
58 | ### Audio
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
   --> Kadr.md:103:29-103:35
101 | - ``Compositor``
102 | - ``CompositorContext``
103 + - ``VideoClip/compositor(_:)-(any)``
    |                             ├─suggestion: Replace '(any)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
    |                             ╰─suggestion: Replace '(any)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
104 | - ``VideoClip/compositor(_:)-(closure)``
105 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
   --> Kadr.md:104:29-104:39
102 | - ``CompositorContext``
103 | - ``VideoClip/compositor(_:)-(any)``
104 + - ``VideoClip/compositor(_:)-(closure)``
    |                             ├─suggestion: Replace '(closure)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
    |                             ╰─suggestion: Replace '(closure)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
105 |
106 | ### Preview & Introspection (v0.4+)
warning: Organizing 'Kadr/Slideshows' under 'Kadr/KeyframeAnimation' forms a cycle
Links in a "Topics section" are used to organize documentation into a hierarchy. The documentation hierarchy shouldn't contain cycles.
If this link contributed to the documentation hierarchy it would introduce this cycle:
╭─▶︎ KeyframeAnimation ─▶︎ Slideshows ─╮
╰────────────────────────────────────╯
   --> KeyframeAnimation.md:103:3-103:19
101 | - ``Transform``
102 | - ``FilterID``
103 + - <doc:Slideshows>
    | ╰─suggestion: Remove '- <doc:Slideshows>'
warning: 'at(time:)' doesn't exist at '/Kadr/Clip'
  --> MultiTrackComposition.md:16:8-16:17
14 | ## One clip, placed by time
15 |
16 + ``Clip/at(time:)`` pins a clip to an absolute composition time. It leaves the
17 | chain — the clips around it behave as though it were not there:
18 |
warning: '7m1ip' isn't a disambiguation for 'clipID' at '/Kadr/Clip'
  --> ../Layout/ClipID.swift:25:49-25:55
23 | ///
24 | /// `Transition` deliberately doesn't carry a `ClipID` — it sits between media clips
25 + /// and isn't an addressable unit. ``Clip/clipID-7m1ip`` returns `nil` for transitions.
   |                                                 ├─suggestion: Remove '-7m1ip' for 'var clipID: ClipID? { get }'
   |                                                 ╰─suggestion: Replace '7m1ip' with '8c9sq' for 'var clipID: ClipID? { get }'
26 | public struct ClipID: Hashable, Sendable, ExpressibleByStringLiteral, CustomStringConvertible {
27 |     /// The wrapped string identifier.
warning: 'speed(curve:)' doesn't exist at '/Kadr/VideoClip'
 --> ../Modifiers/Clip+Speed.swift:4:58-4:71
2 |
3 | /// Canonical representation of a clip's playback speed. v0.11 collapse of
4 + /// the two-method ``VideoClip/speed(_:)`` / ``VideoClip/speed(curve:)``
  |                                                          ├─suggestion: Replace 'speed(curve:)' with 'speedCurve'
  |                                                          ╰─suggestion: Replace 'speed(curve:)' with 'speed(_:)'
5 | /// pair into a single enum, making the previously-documented
6 | /// mutual-exclusion compile-time-checked.
warning: 'visible(during:)-(CMTimeRange)' doesn't exist at '/Kadr/Overlay/visibilityRange'
  --> ../Overlays/Overlay.swift:31:11-31:41
29 |     /// Composition time range during which this overlay is visible. `nil` (the default)
30 |     /// means the overlay is visible for the entire composition. Set via
31 +     /// ``visible(during:)-(CMTimeRange)`` or ``visible(during:)-(ClosedRange<TimeInterval>)``
32 |     /// on the concrete overlay types.
33 |     ///
warning: 'visible(during:)-(ClosedRange<TimeInterval>)' doesn't exist at '/Kadr/Overlay/visibilityRange'
  --> ../Overlays/Overlay.swift:31:49-31:93
29 |     /// Composition time range during which this overlay is visible. `nil` (the default)
30 |     /// means the overlay is visible for the entire composition. Set via
31 +     /// ``visible(during:)-(CMTimeRange)`` or ``visible(during:)-(ClosedRange<TimeInterval>)``
32 |     /// on the concrete overlay types.
33 |     ///
warning: 'Watermark' doesn't exist at '/Kadr/TextOverlay/positionAnimation'
  --> ../Overlays/Overlay.swift:52:31-52:40
50 |
51 |     /// Default: nil. ``ImageOverlay`` and ``StickerOverlay`` override with storage;
52 +     /// ``TextOverlay`` and ``Watermark`` keep the default in v0.8.1.
53 |     var positionAnimation: Animation<Position>? { nil }
54 |
Finished building documentation for 'Kadr' (0.55s)
Generated documentation archive at:
  /Users/admin/builder/spi-builder-workspace/.docs/steliyanh/kadr/main
Fetching https://github.com/swiftlang/swift-docc-plugin
[1/2345] Fetching swift-docc-plugin
Fetched https://github.com/swiftlang/swift-docc-plugin (1.34s)
Computing version for https://github.com/swiftlang/swift-docc-plugin
Computed https://github.com/swiftlang/swift-docc-plugin at 1.5.0 (3.55s)
Fetching https://github.com/swiftlang/swift-docc-symbolkit
[1/3850] Fetching swift-docc-symbolkit
Fetched https://github.com/swiftlang/swift-docc-symbolkit (1.22s)
Computing version for https://github.com/swiftlang/swift-docc-symbolkit
Computed https://github.com/swiftlang/swift-docc-symbolkit at 1.0.0 (1.93s)
Creating working copy for https://github.com/swiftlang/swift-docc-plugin
Working copy of https://github.com/swiftlang/swift-docc-plugin resolved at 1.5.0
Creating working copy for https://github.com/swiftlang/swift-docc-symbolkit
Working copy of https://github.com/swiftlang/swift-docc-symbolkit resolved at 1.0.0
warning: 'spi-builder-workspace': found 7 file(s) which are unhandled; explicitly declare them as resources or exclude from the target
    /Users/admin/builder/spi-builder-workspace/Examples/README.md
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_audio.mp3
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_forest.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_ocean.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_purple.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_sunset.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_video.mp4
Building for debugging...
[Planning deferred tasks]
[18 / 41]
[20 / 43] Snippets
[30 / 92]
[35 / 92]
[38 / 92]
[39 / 92]
[43 / 92]
[45 / 92]
[48 / 92]
[51 / 92]
[53 / 92]
[54 / 92]
[65 / 92] SymbolKit
[66 / 92] Snippets
[84 / 93] SymbolKit
[86 / 93] SymbolKit
[92 / 97] snippet-extract-product
[93 / 97] snippet-extract-product
[95 / 97] snippet-extract-product
Build complete! (4.43 sec)
warning: 'spi-builder-workspace': found 7 file(s) which are unhandled; explicitly declare them as resources or exclude from the target
    /Users/admin/builder/spi-builder-workspace/Examples/README.md
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_audio.mp3
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_forest.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_ocean.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_purple.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_sunset.png
    /Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_video.mp4
Building for debugging...
[Planning deferred tasks]
[2 / 10]
[3 / 11] Kadr
[14 / 22] Kadr
[16 / 18] Kadr
Build complete! (2.24 sec)
    1544
11	/Users/admin/builder/spi-builder-workspace/.docs/steliyanh/kadr/main
✅  Doc result (uploading) reported
========================================
SyncDocs
========================================
Doc archive source directory: $PWD/.docs/steliyanh/kadr/main
File count: 1544
Doc size:   11.0MB
Preparing doc bundle ...
Using presigned URL upload - AWS credentials not required
Uploading -steliyanh-kadr-main-8567dca9.zip to presigned URL
Starting upload of 2364474 bytes...
Upload completed successfully
Done.