Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
189 commits
Select commit Hold shift + click to select a range
097c819
feat(verify): video and audio marker codecs with robustness tests
Oct 15, 2026
9a379e7
feat(verify): fixtures, reference timeline model, oracle report and e…
Oct 15, 2026
4a41a09
feat(verify): offline playback and seek oracle tests
Oct 15, 2026
48357f0
feat(verify): macOS AVFoundation fixture encoder, keyframe seek cases…
Oct 15, 2026
26be794
test(video-decode): scripted media source for decoder model tests
richiemcilroy Oct 15, 2026
940ade2
test(rendering): model-based fuzzing of decoder request decisions
richiemcilroy Oct 15, 2026
240816d
feat(verify): TOML strict-xfail expectations with failure classes, bl…
Oct 15, 2026
f95564d
Merge remote-tracking branch 'origin/ci/verify-decoder-model' into ci…
richiemcilroy Oct 15, 2026
342b5d0
test(verify): seek script runner and request-gap probe for repros
Oct 15, 2026
86cd117
test(verify): deterministic AVF camera revisit repro; document the in…
Oct 15, 2026
f9855c3
feat(editor): offline audio output for verification harnesses
richiemcilroy Oct 15, 2026
9ae7738
feat(verify): audio oracle for exports and offline playback
richiemcilroy Oct 15, 2026
c4b547a
feat(verify): fixtures recorded through the real recording pipeline (…
Oct 15, 2026
362f2cf
feat(verify): audio failure classes for the TOML expectations
richiemcilroy Oct 15, 2026
f8b825d
ci(verify): temporary audio oracle workflow for Windows, Linux and ma…
richiemcilroy Oct 15, 2026
672dcd6
test(verify): audio oracle self-check against injected gaps, drops, r…
richiemcilroy Oct 15, 2026
671c621
test(desktop-gpui): deterministic upload fault-injection suite
richiemcilroy Oct 15, 2026
83dae70
test(verify): shared strict-xfail expectations crate and case records
richiemcilroy Oct 15, 2026
5efebd4
ci: engine verify workflow, suite planner and local runner
richiemcilroy Oct 15, 2026
926c577
ci(verify): bless script for local runs and CI report artifacts
richiemcilroy Oct 15, 2026
119b9cb
Merge remote-tracking branch 'origin/ci/engine-verify' into ci/verify-ci
richiemcilroy Oct 15, 2026
434ce13
test(verify): judge and record cap-verify cases with the shared expec…
richiemcilroy Oct 15, 2026
66f0468
Merge remote-tracking branch 'origin/ci/verify-upload' into ci/verify-ci
richiemcilroy Oct 15, 2026
2056e40
ci(verify): reuse cached builds of unchanged workspace crates, README
richiemcilroy Oct 15, 2026
8e657b8
Merge remote-tracking branch 'origin/ci/verify-audio' into ci/verify-ci
richiemcilroy Oct 15, 2026
65f9c73
ci(verify): audio suite on all three platforms, document the upload gate
richiemcilroy Oct 15, 2026
d71c240
ci(verify): keep the build cache when tests fail
richiemcilroy Oct 15, 2026
6906282
feat(verify): Instant recordings through the real Instant muxers with…
Oct 15, 2026
e3cc07d
test(verify): MOV and 4K export, transition and camera-hiding playbac…
Oct 15, 2026
0cad08a
test(verify): fix audio Project after the fixture-name merge; seriali…
richiemcilroy Oct 15, 2026
7a03b4f
ci(verify): shorter failure details in the summary
richiemcilroy Oct 15, 2026
9457b71
feat(verify): verify cross-fade transitions as blends; render transit…
Oct 15, 2026
dd3a302
ci(verify): DXC next to ci-verify test binaries on Windows instead of…
richiemcilroy Oct 15, 2026
144df9b
test(verify): full-tier xfail for the FFmpeg camera runaway
Oct 15, 2026
214a719
test(verify): xfails from the first macOS and Linux CI runs; Opus gai…
Oct 15, 2026
f16b472
test(verify): captions and editing oracles with random edit sequences
richiemcilroy Oct 15, 2026
4f9a133
test(verify): failure classes for captions and editing cases, strict …
richiemcilroy Oct 15, 2026
74a769d
test(verify): transitions on every boundary for odd editing export se…
richiemcilroy Oct 15, 2026
0fd0fab
refactor(desktop-gpui): run caption transcription engines through an …
richiemcilroy Oct 15, 2026
c2ce9df
test(desktop-gpui): fake-transcriber caption oracles over real projec…
richiemcilroy Oct 15, 2026
26a3cda
ci(verify): temporary captions and editing workflow for Linux, Window…
richiemcilroy Oct 15, 2026
62fd2da
test(verify): legacy caption at the timeline end repro, FFmpeg full-t…
richiemcilroy Oct 15, 2026
a8107d8
Merge remote-tracking branch 'origin/ci/engine-verify' into ci/verify-ci
richiemcilroy Oct 15, 2026
aedeb5e
ci(verify): fixture cache keyed by the whole verify crate source
richiemcilroy Oct 15, 2026
6e7cbe1
test(verify): audio export reads frames with the transition-aware reader
richiemcilroy Oct 15, 2026
cab335b
test(verify): real-capture recording oracle with stimulus helper and …
richiemcilroy Oct 15, 2026
20bbfac
test(verify): shared marker schedule origin, failure classes, recordi…
richiemcilroy Oct 15, 2026
8fa5848
test(verify): SIGKILL recovery case, audio levels, repeat runs on CI
richiemcilroy Oct 15, 2026
dd49e90
test(verify): stimulus warm-up, start-up drop allowance, file-based c…
richiemcilroy Oct 15, 2026
b29a39c
test(verify): check editing exports through transition blends, same-c…
richiemcilroy Oct 15, 2026
10c2449
test(verify): warm-up recording, camera cadence rule, screen miss bud…
richiemcilroy Oct 15, 2026
1e1f742
test(verify): gated, late-mic and system-only Instant cases, starvati…
richiemcilroy Oct 15, 2026
817b52f
ci(verify): case-level shards, per-platform FAST trims, optional arch…
richiemcilroy Oct 15, 2026
f3e24bd
test(verify): run both Windows decoders and flag silent decoder fallb…
richiemcilroy Oct 15, 2026
0e89f17
test(verify): Windows and Linux triage: unsupported outcome, decoder …
richiemcilroy Oct 15, 2026
48aa126
test(verify): FFmpeg first-frame shortcut freeze after a jump to the …
richiemcilroy Oct 15, 2026
01d2334
test(verify): opt-in CAP_VERIFY_LOG subscriber for product and wgpu l…
richiemcilroy Oct 15, 2026
431df5c
test(verify): keep the Case import the Instant export case uses
richiemcilroy Oct 15, 2026
892d737
ci(verify): 2 Linux and 3 Windows case shards, no 4K export in the Wi…
richiemcilroy Oct 15, 2026
c705bfc
test(verify): crash-snapshot recovery case, per-case Instant xfails w…
richiemcilroy Oct 15, 2026
4115fdd
ci(verify): daily build cache including workspace crates instead of r…
richiemcilroy Oct 15, 2026
2061b41
ci(verify): per-tier shard counts
richiemcilroy Oct 15, 2026
051193d
ci(verify): plan job self-tests the planner and rejects TODO xfail re…
richiemcilroy Oct 15, 2026
fb61ee9
test(verify): 60 fps screen floor covers two ladder slots; per-runner…
richiemcilroy Oct 15, 2026
4b593fe
Merge remote-tracking branch 'origin/ci/verify-captions-editing' into…
richiemcilroy Oct 15, 2026
b2758c6
ci(verify): one macOS job for FAST (the macOS runner queue costs more…
richiemcilroy Oct 15, 2026
2e6a747
ci(verify): summary shows the first panic of a crashed test
richiemcilroy Oct 15, 2026
bec869e
ci(verify): per-suite environment in suites.json
richiemcilroy Oct 15, 2026
f77e5b6
test(verify): screen latency ceiling at four refreshes
richiemcilroy Oct 15, 2026
f68b206
fix(recording): keep MicrophoneSamples callback info, optional for sy…
richiemcilroy Oct 15, 2026
7585a77
ci(verify): optional CARGO_LOG for build diagnostics
richiemcilroy Oct 15, 2026
3b47f93
ci(verify): normalise source mtimes on cold builds so build scripts w…
richiemcilroy Oct 15, 2026
03acacd
ci(verify): macOS FAST audio keeps the app MP4 path and MOV, GIF and …
richiemcilroy Oct 15, 2026
fc11008
test(verify): Windows timer resolution for real-time fixtures; Instan…
richiemcilroy Oct 15, 2026
ac20699
ci(verify): triage workflow records real-time fixtures before the par…
richiemcilroy Oct 15, 2026
18c3b32
ci(verify): pass both prerecord filters to libtest
richiemcilroy Oct 15, 2026
e756786
ci(verify): integrate platform evidence and isolate recorded fixtures
richiemcilroy Oct 15, 2026
8fd6745
fix: preserve recording verification evidence and account for holds
richiemcilroy Oct 15, 2026
0b54ef8
fix: dispatch due stimulus redraws before sleeping
richiemcilroy Oct 15, 2026
34d81a6
ci(verify): disable completed blend diagnostic capture
richiemcilroy Oct 15, 2026
b051d42
fix: keep recording stimulus timers latency critical
richiemcilroy Oct 15, 2026
ae4e3e9
test(upload): verify deferred Instant retry backoff
richiemcilroy Oct 15, 2026
7ef9229
ci(verify): route all GPUI changes through engine suites
richiemcilroy Oct 15, 2026
c3d0213
ci(verify): reuse suite build for isolated fixture preparation
richiemcilroy Oct 15, 2026
bd4bdff
diag: log stimulus scheduling and sample top during real capture
richiemcilroy Oct 15, 2026
3363f39
test(verify): never count an unmeasurable class as fixed
richiemcilroy Oct 15, 2026
406de32
test(rendering): judge the IOSurface source lifetime test as a strict…
richiemcilroy Oct 15, 2026
16cf266
test(verify): expect the AVFoundation transition corruption as flaky
richiemcilroy Oct 15, 2026
20a3073
fix: run the recording stimulus at user-interactive priority with a f…
richiemcilroy Oct 15, 2026
580215e
test: prove per run that injected screen capture faults are still rep…
richiemcilroy Oct 15, 2026
03e1488
ci: sample process CPU and priority during real capture
richiemcilroy Oct 15, 2026
8a1b5c3
test(verify): identify damaged Instant audio markers by their timing …
richiemcilroy Oct 15, 2026
cebaab2
test(verify): strict causes for flaky macOS Instant timestamps and AV…
richiemcilroy Oct 15, 2026
8768233
test: strict recording oracle coverage at 30 fps capture, missing sta…
richiemcilroy Oct 15, 2026
da3983b
ci: disable Spotlight indexing on recording runners, sample test thre…
richiemcilroy Oct 15, 2026
97e218e
test(verify): close mutation gaps in captions, colour, frame size and…
richiemcilroy Oct 15, 2026
a9f3caa
test(verify): check low-fps Studio Sound without music
richiemcilroy Oct 15, 2026
50c5fa8
test(verify): port the round-3 gap-closing oracles
richiemcilroy Oct 15, 2026
ca36b78
test(verify): never time A/V sync on a video frame the oracle found w…
richiemcilroy Oct 15, 2026
a312d86
test(verify): expectations for the ported round-3 cases
richiemcilroy Oct 15, 2026
7a07c56
test(verify): merge the real-capture recording oracle
richiemcilroy Oct 15, 2026
bcb07d4
test(verify): do not time A/V sync on markers inside a transition
richiemcilroy Oct 15, 2026
2f97e49
ci(verify): warn on guarded and high-risk code instead of trusting green
richiemcilroy Oct 15, 2026
5b46574
build(verify): move the recording stimulus helper into its own crate
richiemcilroy Oct 15, 2026
012717a
chore(verify): clippy and Biome clean on all targets
richiemcilroy Oct 15, 2026
9e9d979
test(verify): epoch-anchored audio keeps its head silence
richiemcilroy Oct 15, 2026
7b2de9b
test: require the first picture after each hold, xfail the ScreenCapt…
richiemcilroy Oct 15, 2026
756f2a5
ci(verify): keep real capture off pull requests until it is conclusive
richiemcilroy Oct 15, 2026
89b115b
test: classify every intermittent recording failure by root cause
richiemcilroy Oct 15, 2026
37d1796
ci(verify): let repeated manual dispatches of one ref run side by side
richiemcilroy Oct 15, 2026
3dfb8c4
test(recording): synthetic microphone keeps the MicrophoneSamples API
richiemcilroy Oct 15, 2026
a287f53
test(verify): keep the repaired mic markers clear of system audio
richiemcilroy Oct 15, 2026
fe647f4
test(verify): root-cause every full-tier failure and AVF flake
richiemcilroy Oct 15, 2026
803be29
Merge remote-tracking branch 'origin/main' into ci/verify-ci
richiemcilroy Oct 15, 2026
de1a9ee
test(verify): drop the expectations #2625 fixed
richiemcilroy Oct 15, 2026
ee24a4e
test: shared, checked real-time scheduling for verification input thr…
richiemcilroy Oct 15, 2026
72a9fec
test: non-blocking synthetic feed admission and a scripted slow consumer
richiemcilroy Oct 15, 2026
83d3423
test: real-time synthetic sources, per hand-off evidence, feed ingres…
richiemcilroy Oct 15, 2026
42b2c4b
test: ignore audio markers cut by the start or end of a track
richiemcilroy Oct 15, 2026
0b4ee24
test: detect camera processing-clock stamping at the camera's own res…
richiemcilroy Oct 15, 2026
a5e4384
ci(verify): report a test that timed out as a failure in the summary
richiemcilroy Oct 15, 2026
ab0295d
ci(verify): keep the WARP-bound heavy cases off the Windows full tier
richiemcilroy Oct 15, 2026
462edfb
test(verify): one test per seek storm, with a limit sized to its runtime
richiemcilroy Oct 15, 2026
b59f61b
test: real-time machine-freeze sentinel in the stimulus process
richiemcilroy Oct 15, 2026
b377a39
test: failures localized inside a machine freeze are inconclusive
richiemcilroy Oct 15, 2026
5731d0f
ci(verify): run real capture on pull requests
richiemcilroy Oct 15, 2026
4891a1c
test(verify): expect the Windows Instant audio trim and the variable …
richiemcilroy Oct 16, 2026
2b394e0
ci(verify): retry wall-clock failures once under proven machine starv…
richiemcilroy Oct 16, 2026
4f487f0
test(verify): measure real-time playback from the moment it is ready
richiemcilroy Oct 16, 2026
d08a5f8
test(verify): expect the offline export frame reorder under load on W…
richiemcilroy Oct 16, 2026
ad4d1b8
ci(verify): run the macOS engine suites on Blacksmith
richiemcilroy Oct 16, 2026
0d4dc44
Merge remote-tracking branch 'origin/main' into ci/verify-ci
richiemcilroy Oct 16, 2026
d025126
test(verify): drop the early-camera expectation #2633 fixed
richiemcilroy Oct 16, 2026
47948fd
test(verify): expect the jitter-camera export to vary inside the came…
richiemcilroy Oct 16, 2026
d0983ee
test(verify): check Studio Sound with music on the music's own contri…
richiemcilroy Oct 16, 2026
b8a8b01
ci(verify): warm caches per provider and run Linux and Windows on Bla…
richiemcilroy Oct 16, 2026
37d0158
ci(verify): retry a lost GPU device once under proven starvation
richiemcilroy Oct 16, 2026
c916210
ci(verify): keep the Windows engine jobs on GitHub-hosted runners
richiemcilroy Oct 16, 2026
4a209fc
test(verify): expect the decode-deadline losses seen on starved Windows
richiemcilroy Oct 16, 2026
d2c3f20
Merge remote-tracking branch 'origin/main' into ci/verify-ci
richiemcilroy Oct 16, 2026
058b234
test(verify): verify both sides of every cross-fade frame
richiemcilroy Oct 16, 2026
c5e1a81
test(verify): excuse expected failures only inside their measured mec…
richiemcilroy Oct 16, 2026
57ddf9e
ci(verify): retry only a failure the machine stalled, and fix CRLF re…
richiemcilroy Oct 16, 2026
3146aa3
ci(verify): executed-case floor, FULL tier for engine crates, require…
richiemcilroy Oct 16, 2026
fc93626
ci(verify): real capture on Blacksmith macOS behind an always-reporte…
richiemcilroy Oct 16, 2026
f417710
test(verify): real-time playback performance floor and warm-up limit
richiemcilroy Oct 16, 2026
680c62a
ci(verify): run the Windows engine suites on Blacksmith with WARP
richiemcilroy Oct 16, 2026
2c3d3eb
ci(verify): list tests without colour in the rerun selection self-check
richiemcilroy Oct 16, 2026
bc143e3
Merge remote-tracking branch 'origin/main' into ci/verify-ci
richiemcilroy Oct 16, 2026
0ecda19
Merge origin/main (#2635, #2639) into ci/verify-ci
richiemcilroy Oct 16, 2026
0610741
Merge remote-tracking branch 'origin/main' into ci/verify-ci
richiemcilroy Oct 16, 2026
379fa5d
test(verify): expectations after #2635, #2639 and the first bounded runs
richiemcilroy Oct 16, 2026
52c3f0a
test(verify): excuse pictures the capture service dropped for every c…
richiemcilroy Oct 16, 2026
bc26169
ci(verify): keep real capture on hosted macOS by default
richiemcilroy Oct 16, 2026
7249302
test(verify): calibrate bounds on the first FULL run of the two-sided…
richiemcilroy Oct 16, 2026
21331d7
test(rendering): decoder model expectations for full failure sets
richiemcilroy Oct 16, 2026
0ea4d72
test(verify): read a blend as another pair only when it fits several …
richiemcilroy Oct 16, 2026
65085b7
test(verify): calibrate on the second FULL run, timing-dependent stor…
richiemcilroy Oct 16, 2026
c9b1388
ci(verify): run the macOS encoding suites on hosted macOS for the har…
richiemcilroy Oct 16, 2026
af7f68b
test(verify): simplify the blend alternative filter (clippy)
richiemcilroy Oct 16, 2026
bfd6879
test(verify): crash-safety suite for fragmented Studio recording
richiemcilroy Oct 16, 2026
14f25d1
test(verify): fragment span, orphaned muxer and crash suite wiring
richiemcilroy Oct 16, 2026
eb85441
test(verify): measure out-of-process muxer overhead at 1080p60
richiemcilroy Oct 16, 2026
b6f386f
test(verify): count the VideoToolbox service in the muxer overhead
richiemcilroy Oct 16, 2026
88aee77
test(verify): Studio segment length on Linux and the muxer path in th…
richiemcilroy Oct 16, 2026
6904374
test(verify): expected crash-safety failures on main
richiemcilroy Oct 16, 2026
0543beb
test(verify): measure crash losses so their expectations are bounded
richiemcilroy Oct 16, 2026
c3578e7
test(verify): drop an unneeded closure drop
richiemcilroy Oct 16, 2026
4b2e72b
ci(verify): executed-case floor for the crash suite
richiemcilroy Oct 16, 2026
eaae191
test(verify): enforce capture evidence and finalize coverage [skip ci]
richiemcilroy Oct 16, 2026
b3ab347
Merge origin/main into ci/verify-ci for calibration [skip ci]
richiemcilroy Oct 16, 2026
52eec57
ci(verify): keep calibration coordinator jobs on Blacksmith [skip ci]
richiemcilroy Oct 16, 2026
03f325f
fix: require explanations for new expectation proposals [skip ci]
richiemcilroy Oct 16, 2026
4fbe8ce
fix: scope expectation proposals to recorded source hosts [skip ci]
richiemcilroy Oct 16, 2026
d6c00b5
fix: report lost baseline coverage as worse [skip ci]
richiemcilroy Oct 16, 2026
856df7e
Merge remote-tracking branch 'origin/main' into ci/verify-ci
richiemcilroy Oct 16, 2026
eb7c88a
test: align final suite expectations with merged fixes
richiemcilroy Oct 16, 2026
485cd1c
ci: route final integration checks to Blacksmith
richiemcilroy Oct 16, 2026
e88dfdf
style: format engine verification suite manifest
richiemcilroy Oct 16, 2026
5fa33b0
fix: compare fresh timing measurements across independent runs
richiemcilroy Oct 16, 2026
27d697d
fix: preserve each reported timing metric resolution
richiemcilroy Oct 16, 2026
ab45fd4
fix: compare failure severity independently of witness position
richiemcilroy Oct 16, 2026
5f1619b
Merge remote-tracking branch 'origin/main' into ci/verify-ci
richiemcilroy Oct 16, 2026
9b0ce41
test: apply FFmpeg decoder model expectations on every platform
richiemcilroy Oct 16, 2026
9e3f903
ci: leave the decoder model to Engine verify in the A/V sync tests
richiemcilroy Oct 16, 2026
ca22915
test: remove the recovered start-time expectations #2642 fixed
richiemcilroy Oct 16, 2026
3eed880
ci: count the crash cases FAST runs and retried records toward floors
richiemcilroy Oct 16, 2026
aead3ae
test: discard every part of an inconclusive real-capture analysis
richiemcilroy Oct 16, 2026
36bbe51
test: build the pending-fragment bound in its own test, drop divider …
richiemcilroy Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .config/hakari.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ platforms = [
# unified tree into every `cargo build -p cap-muxer`. Any drift it causes is
# bounded by its own tiny graph.
[traversal-excludes]
workspace-members = ["cap-muxer", "cap-muxer-protocol"]
workspace-members = ["cap-muxer", "cap-muxer-protocol", "cap-verify-expect"]

# hakari unifies dev-dependencies as well, so left alone it pins tauri with its
# `test` feature and tokio `test-util` into every release binary and pulls the
Expand Down
41 changes: 41 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# cargo-nextest settings. The engine verification suite (scripts/verify/run.sh)
# runs with the `default` profile locally and `ci` in engine-verify.yml.

[profile.default]
retries = 0
fail-fast = false
slow-timeout = { period = "60s" }

# The decoder model fuzzers run 3 to 4 worker threads each.
[[profile.default.overrides]]
filter = 'binary_id(cap-rendering) and test(/^decoder::model::/)'
threads-required = 3

[profile.ci]
# No retries: a flaky case is a bug. run.sh reruns failures once afterwards
# only to label them flaky in the job summary; the job still fails.
retries = 0
fail-fast = false
failure-output = "immediate-final"
success-output = "never"
status-level = "pass"
final-status-level = "slow"
slow-timeout = { period = "60s", terminate-after = 15 }

[profile.ci.junit]
path = "junit.xml"
store-success-output = false
store-failure-output = true

[[profile.ci.overrides]]
filter = 'binary_id(cap-rendering) and test(/^decoder::model::/)'
threads-required = 3


# The FULL-tier seek storms (3000 seeks per decoder) are the slowest tests:
# on the macos-15 runner one storm fixture takes 240 to 570 s per decoder,
# up to about 900 s for both decoders on one shard. Twice that, so a real
# hang still fails.
[[profile.ci.overrides]]
filter = 'binary_id(cap-verify::seek) and test(/^storm_/)'
slow-timeout = { period = "60s", terminate-after = 30 }
6 changes: 6 additions & 0 deletions .github/actionlint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
self-hosted-runner:
labels:
- blacksmith-8vcpu-ubuntu-2404
- blacksmith-6vcpu-macos-15
- blacksmith-6vcpu-macos-26
- blacksmith-8vcpu-windows-2025
168 changes: 168 additions & 0 deletions .github/actions/engine-verify-setup/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
name: Engine verify setup
description: Toolchain, cargo-nextest, Rust cache, native deps and fixture cache for the engine verification suite
inputs:
target:
description: Rust target triple
required: true
tier:
description: fast or full (fixture cache key)
required: true
rust-cache:
description: Restore the Rust build cache (build jobs only)
default: "true"
outputs:
build-cache-key:
description: Key to save the build cache under
value: ${{ steps.build-key.outputs.key }}
build-cache-hit:
description: Whether the build cache was restored exactly
value: ${{ steps.build-cache.outputs.cache-hit }}
fixtures-hit:
description: Whether the fixture cache was restored exactly
value: ${{ steps.fixtures.outputs.cache-hit }}
fixtures-key:
description: Fixture cache key
value: ${{ steps.fixtures.outputs.cache-primary-key }}
runs:
using: composite
steps:
# Only what the suite's dependency closure links against (no webkit/gtk),
# plus lavapipe for software Vulkan rendering.
- name: Linux packages
if: runner.os == 'Linux'
shell: bash
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq --no-install-recommends \
libasound2-dev libasound2-plugins libpipewire-0.3-dev libspa-0.2-dev libclang-dev \
libx11-dev libxrandr-dev libxcb1-dev libxcb-randr0-dev libxcb-shm0-dev \
libxcb-xfixes0-dev libxfixes-dev libwayland-dev libxkbcommon-dev \
libdbus-1-dev libudev-dev libva-dev mesa-vulkan-drivers libvulkan1 >/dev/null

- name: Rust toolchain
if: inputs.rust-cache == 'true'
uses: dtolnay/rust-toolchain@1.88.0
with:
targets: ${{ inputs.target }}

- name: cargo-nextest
uses: taiki-e/install-action@v2
with:
tool: cargo-nextest@0.9.148

# One cache entry per OS per day (saved by main, nightly and the CI dev
# branches), restored by PRs. Unlike swatinem/rust-cache it includes the
# workspace crates and is refreshed daily even when Cargo.lock is
# unchanged, so a PR only rebuilds what changed since the last save. The
# chain restarts every ISO week so stale artifacts cannot pile up.
- name: Build cache key
id: build-key
if: inputs.rust-cache == 'true'
shell: bash
run: |
# runner.environment separates GitHub-hosted from self-hosted
# (Blacksmith) builds: their paths and toolchains differ, so one's
# target directory would only force a rebuild on the other.
# A new week starts a new chain, seeded from last week's newest cache
# of the same provider so the first build of the week stays warm.
py="$(command -v python3 || command -v python)"
week="$("$py" -c 'import datetime as d; y, w, _ = d.datetime.now(d.timezone.utc).isocalendar(); print(f"{y}-W{w:02d}")')"
last_week="$("$py" -c 'import datetime as d; y, w, _ = (d.datetime.now(d.timezone.utc) - d.timedelta(days=7)).isocalendar(); print(f"{y}-W{w:02d}")')"
provider="verify-build-v3-${{ inputs.target }}-${{ runner.environment }}"
base="$provider-$week"
echo "base=$base" >> "$GITHUB_OUTPUT"
echo "previous=$provider-$last_week" >> "$GITHUB_OUTPUT"
echo "key=$base-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'rust-toolchain.toml') }}-$(date -u +%Y%m%d)" >> "$GITHUB_OUTPUT"

- name: Restore build cache
id: build-cache
if: inputs.rust-cache == 'true'
uses: actions/cache/restore@v4
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/ci-verify/
key: ${{ steps.build-key.outputs.key }}
restore-keys: |
${{ steps.build-key.outputs.base }}-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'rust-toolchain.toml') }}-
${{ steps.build-key.outputs.base }}-
${{ steps.build-key.outputs.previous }}-

# Unchanged workspace crates are reused from the cache instead of being
# rebuilt because the checkout touched every file (scripts/verify/mtime.py).
- name: Reuse unchanged workspace crates
if: inputs.rust-cache == 'true'
shell: bash
run: |
"$(command -v python3 || command -v python)" scripts/verify/mtime.py apply target/ci-verify/verify-src-manifest.txt

- name: Native dependencies
shell: bash
env:
RUST_TARGET_TRIPLE: ${{ inputs.target }}
run: node scripts/setup.js

- name: FFmpeg libraries on the loader path (Linux)
if: runner.os == 'Linux'
shell: bash
run: echo "LD_LIBRARY_PATH=${{ github.workspace }}/target/native-deps/lib" >> "$GITHUB_ENV"

# The app ships DXC next to its executable and cap-rendering looks for it
# next to the test binary or in its profile dir; setup.js only fills
# target/debug and target/release. Without it wgpu falls back to FXC.
- name: DXC for the ci-verify profile (Windows)
if: runner.os == 'Windows'
shell: bash
run: |
mkdir -p target/ci-verify
cp target/native-deps/dxc/dxcompiler.dll target/native-deps/dxc/dxil.dll target/ci-verify/

# Debug builds of wgpu (the ci-verify profile keeps debug assertions)
# enable the D3D12 debug layer whenever d3d12SDKLayers.dll exists. When
# that DLL comes from an unserviced Graphics Tools feature older than the
# D3D12 runtime (blacksmith-8vcpu-windows-2025: layers 10.0.26100.1591,
# runtime 10.0.26100.33296), D3D12CreateDevice fails with E_INVALIDARG on
# every adapter, WARP included, and every case fails "No GPU adapter
# found". Hiding the mismatched layer makes D3D12GetDebugInterface report
# DXGI_ERROR_SDK_COMPONENT_MISSING, which wgpu treats as "no debug layer".
- name: Hide a D3D12 debug layer that does not match the runtime (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
$sys = Join-Path $env:WINDIR 'System32'
$layers = Join-Path $sys 'd3d12SDKLayers.dll'
$core = Join-Path $sys 'D3D12Core.dll'
if (-not (Test-Path $layers)) { Write-Host 'no D3D12 debug layer installed'; exit 0 }
$lv = (Get-Item $layers).VersionInfo
$cv = (Get-Item $core).VersionInfo
$lver = "$($lv.FileMajorPart).$($lv.FileMinorPart).$($lv.FileBuildPart).$($lv.FilePrivatePart)"
$cver = "$($cv.FileMajorPart).$($cv.FileMinorPart).$($cv.FileBuildPart).$($cv.FilePrivatePart)"
Write-Host "D3D12 debug layer $lver, runtime $cver"
if ($lver -eq $cver) { exit 0 }
takeown /f $layers | Out-Null
icacls $layers /grant "*S-1-5-32-544:F" | Out-Null
Rename-Item $layers 'd3d12SDKLayers.dll.mismatched'
Write-Host "hid the mismatched debug layer"

- name: FFmpeg DLLs on PATH (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: Add-Content -Path $env:GITHUB_PATH -Value "${{ github.workspace }}\target\ffmpeg\bin"

- name: Fixture location
shell: bash
run: echo "CAP_VERIFY_FIXTURE_DIR=${{ runner.temp }}/verify-fixtures" >> "$GITHUB_ENV"

# Fixtures are generated by code (including the real-pipeline Studio and
# Instant recordings, ~1 min of real-time capture); the key is every
# crate's source and build script, the vendored crates (wgpu-hal, tao),
# the workspace manifest, lockfile and toolchain, plus the native deps. Exact key only: a fixture made
# by an older generator is never reused.
- name: Restore fixtures
id: fixtures
uses: actions/cache/restore@v4
with:
path: ${{ runner.temp }}/verify-fixtures
key: verify-fixtures-v1-${{ runner.os }}-${{ runner.environment }}-${{ inputs.tier }}-${{ hashFiles('crates/**/src/**', 'crates/**/build.rs', 'crates/**/Cargo.toml', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', 'vendor/**', 'scripts/setup.js') }}
29 changes: 15 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ concurrency:
jobs:
changes:
name: Detect Changes
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
outputs:
rust: ${{ steps.filter.outputs.rust }}
gpui: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.gpui == 'true' || steps.desktop-resources.outputs.desktop-resources == 'true' }}
Expand Down Expand Up @@ -88,7 +88,7 @@ jobs:

typecheck:
name: Typecheck
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -133,7 +133,7 @@ jobs:

mobile:
name: Mobile
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -159,7 +159,7 @@ jobs:

format-biome:
name: Format (Biome)
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -176,7 +176,7 @@ jobs:

format-rust:
name: Format (Cargo)
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -198,9 +198,9 @@ jobs:
matrix:
settings:
- target: aarch64-apple-darwin
runner: macos-latest
runner: blacksmith-6vcpu-macos-15
- target: x86_64-pc-windows-msvc
runner: windows-2022
runner: blacksmith-8vcpu-windows-2025
runs-on: ${{ matrix.settings.runner }}
steps:
- name: Checkout repository
Expand Down Expand Up @@ -235,7 +235,7 @@ jobs:

lint-biome:
name: Lint (Biome)
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -253,7 +253,7 @@ jobs:
needs: changes
if: needs.changes.outputs.rust == 'true'
timeout-minutes: 60
runs-on: ubuntu-24.04
runs-on: blacksmith-8vcpu-ubuntu-2404
env:
RUST_TARGET_TRIPLE: x86_64-unknown-linux-gnu
LD_LIBRARY_PATH: ${{ github.workspace }}/target/native-deps/lib:${{ github.workspace }}/target/debug
Expand Down Expand Up @@ -293,11 +293,11 @@ jobs:
matrix:
settings:
- target: aarch64-apple-darwin
runner: macos-latest
runner: blacksmith-6vcpu-macos-15
- target: x86_64-pc-windows-msvc
runner: windows-2022
runner: blacksmith-8vcpu-windows-2025
- target: x86_64-unknown-linux-gnu
runner: ubuntu-24.04
runner: blacksmith-8vcpu-ubuntu-2404
runs-on: ${{ matrix.settings.runner }}
env:
# Full debuginfo for the opt-level 2 dependency tree is most of the
Expand Down Expand Up @@ -349,7 +349,8 @@ jobs:
shell: bash
run: |
if [[ "$RUNNER_OS" == "Windows" ]]; then
export PATH="$(cygpath "$GITHUB_WORKSPACE/target/debug"):$PATH"
debug_path="$(cygpath "$GITHUB_WORKSPACE/target/debug")"
export PATH="$debug_path:$PATH"
elif [[ "$RUNNER_OS" == "macOS" ]]; then
frameworks="$GITHUB_WORKSPACE/apps/desktop-gpui/target/${{ matrix.settings.target }}/debug/Frameworks"
mkdir -p "$frameworks"
Expand All @@ -367,7 +368,7 @@ jobs:

tauri-plugins:
name: Verify Tauri plugin versions
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
needs: changes
if: needs.changes.outputs.tauri-plugins == 'true'
steps:
Expand Down
20 changes: 20 additions & 0 deletions .github/workflows/engine-verify-label.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Engine verify (full)

# Adding the `verify-full` label to a PR runs the FULL tier once. A separate
# workflow so that adding any other label never produces a skipped (and
# therefore passing) "Engine verify" check that would hide a failed FAST run.

on:
pull_request:
types: [labeled]

permissions:
contents: read
pull-requests: read

jobs:
full:
if: github.event.label.name == 'verify-full'
uses: ./.github/workflows/engine-verify.yml
with:
tier: full
Loading
Loading