Repository navigation
Add Windows CI resource telemetry to test and extension E2E jobs - #21644
Ella Hathaway (ellahathaway) merged 4 commits into
Conversation
Windows test and extension E2E jobs freeze or lose their runner without any record of machine load (#21570). Add a below-normal-priority background sampler that records CPU, processor queue, available memory, commit charge, page file, paging, disk queue, free disk, and top processes every 20 seconds. The samples land in directories the existing if: always() uploads already collect, and a Stop step writes a peak/minimum summary to the job summary. Every mode exits 0 and the steps are continue-on-error, so telemetry never changes test behavior, timeouts, or retries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Processes that started during a sampling interval are now ranked by their accumulated CPU time instead of being skipped. Stop emits a warning when core counter columns are empty in every sample so a collection failure is visible on each Windows job, and the tests cover that warning and validate the sample row columns (core counters required on Windows). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Non-terminating Get-Counter errors were swallowed by -ErrorAction SilentlyContinue, so an empty counter column had no recorded cause. Capture them with -ErrorVariable and log each distinct failure once. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The launch profile test sliced from the run step to the diagnostics upload, so the new always() resource monitor Stop step (continue-on-error) fell inside the slice and tripped the run step's continue-on-error check. Slice to the next step instead, matching how the upload step is sliced. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Tests selectorSelects the full PR test matrix + all PR-gated jobs (ALL) — a rule matching '.github/workflows/run-tests.yml' selects ALL Selection computed for commit |
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 21644Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 21644" |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
🟡 Changes recommended
CPU rankings omit newly observed processes that may dominate an interval, and tests allow empty performance-counter fields without validating Windows counter collection, mapping, or unit conversions.
2 open issues
What changed in this PR
Adds Windows resource telemetry to help investigate CI slowdowns and runner losses tracked in #21570, using existing diagnostic artifacts.
Changes:
- Adds a background PowerShell sampler for machine pressure and top-process usage, with a shutdown summary.
- Starts and stops monitoring in Windows .NET test jobs and extension E2E shards.
- Adds behavioral tests for summary calculations, empty output, and sampler lifecycle.
| File | Description |
|---|---|
tests/Infrastructure.Tests/PowerShellScripts/CiResourceMonitorTests.cs |
Tests summaries and sampler startup/shutdown. |
eng/scripts/ci-resource-monitor.ps1 |
Collects resource metrics and generates diagnostic summaries. |
.github/workflows/run-tests.yml |
Adds Windows monitoring to .NET test jobs. |
.github/workflows/extension-e2e-tests.yml |
Adds Windows monitoring to extension E2E shards. |
Review effort: Balanced
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
🟡 Changes recommended
Non-terminating Get-Counter errors are suppressed without being logged, leaving users with missing counter values and no underlying diagnostics in sampler.log.
1 open issue
2 resolved since last review
Review effort: Balanced
This comment has been minimized.
This comment has been minimized.
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
CI attempt 1 on head d0358d4 (run 41291481771) had 8 failed jobs, all unrelated to this PR:
The repository's auto-rerun workflow started attempt 2. That is the single rerun for this head; I won't trigger another. 🤖 Posted by AspireAgent (AI Agent) |
Ella Hathaway (ellahathaway)
left a comment
There was a problem hiding this comment.
I reviewed the sampler lifecycle, counter collection and summaries, regression coverage, and both workflows’ shutdown and artifact-upload paths. I don’t have any additional correctness or maintainability findings.
|
✅ No documentation update needed. Proven false positive; docs_optional → build_or_ci_only. Triggered signal: |
…n empty file (#21932) **What failed:** `[vscode] Aspire WinUI debug E2E > debugs an unpackaged WinUI project through its generated apphost executable` failed on attempt 1 in [42448442647](https://github.com/microsoft/aspire/actions/runs/42448442647/job/128635064936) (tracker #21600, unowned rank 1): ``` AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^ready:\d+$/. Input: '' ``` **Why:** The generated WinUI fixture app wrote its ready marker with `File.WriteAllText(readyFile, …)`. That call creates the file before it writes the content. `waitForReadyMarker` polls for the file and returns its first successful read, so a poll that landed in that gap returned `''` and failed the assertion. The app had started correctly; the test read the file before the content was written. **How fixed:** The fixture app (`extension/scripts/run-e2e.js`) now writes `ready:<pid>` to `<marker>.tmp` and then `File.Move(…, overwrite: true)` renames it into place. Because the rename is atomic, the marker path is either missing or holds the full content, so the test's first read is always complete. The assertion, timeouts and polling are unchanged. The existing `e2eLaunchProfile` unit test now checks for the atomic write and rejects a direct `File.WriteAllText(readyFile, …)`. ## Failure stats (14d, attempt 1) | Scope | Attempt-1 test failures / runs where the job executed | Rate | Passed on rerun | |---|---|---|---| | PR | 4 / 457 | 0.9% | 4 / 4 | | main | 0 / 99 | 0% | n/a | Main over 30 days: 0 test-level failures in 216 runs (0 / 99 in the last 14d plus 0 / 117 in the 16 days before). This job had 9 other attempt-1 failures that never reached the test and are excluded: 8 were "hosted runner lost communication" and 1 was an `aspire-extension` artifact download failure. Test-level failures (all four): - [42448442647](https://github.com/microsoft/aspire/actions/runs/42448442647/job/128635064936) (PR #21921, unrelated Java debug change): `The input did not match the regular expression /^ready:\d+$/. Input: ''` ← **fixed by this PR** - [42257446455](https://github.com/microsoft/aspire/actions/runs/42257446455/job/128037952447) (PR branch `aspireagent/fix-e2e-notification-dismiss-hover-race`): `Timed out after 120000ms waiting for the C# language server to resolve generated InitializeComponent … Last definitions: []` (the `tree-actions` shard also failed in the same attempt) - [41532732531](https://github.com/microsoft/aspire/actions/runs/41532732531/job/125585902027) (PR #20950): `Timed out after 240000ms waiting for the WinUI OnLaunched marker.` AppHost hosting startup took 1m42s, and 4 other Windows shards failed in the same attempt. - [41501727353](https://github.com/microsoft/aspire/actions/runs/41501727353/job/125481870825) (PR #21183): `The C# definition probe for InitializeComponent … Timed out after 129ms waiting for E2E control revision`. `dotnet --list-runtimes` took 53s, Roslyn never started, and 6 other shards failed in the same attempt. All four are genuine flakes, not caused by their PRs. The last three come from whole-runner slowness on Windows, which is tracked in #21570 with telemetry in #21644. This PR does not address them because fixing them would mean raising timeouts. **Local regression evidence:** A harness ran the fixture's exact before/after C# writer against a Node reader that uses `waitForReadyMarker`'s semantics (first successful read is asserted against `/^ready:\d+$/`), polling tightly, with 500 marker publications per run: - Before (`File.WriteAllText(readyFile, …)`): **10/10 runs** saw an empty marker (475–496 torn first reads out of about 500 per run). - After (write `.tmp`, then `File.Move` with `overwrite: true`): **0/10 runs** saw an empty marker (0 torn reads out of about 4,980 publications). The harness ran on Linux. On Windows, `File.Move(overwrite: true)` maps to `MoveFileEx(MOVEFILE_REPLACE_EXISTING)` within the same directory, which is also atomic for readers. **PR CI** ([run 42472017876](https://github.com/microsoft/aspire/actions/runs/42472017876)): `VS Code extension E2E (Windows, winui-debug)` and the Windows extension unit tests (including the updated `e2eLaunchProfile` test) passed on attempt 1. Three unrelated jobs failed on attempt 1: a GitHub 'Unicorn' outage while downloading Deno in `launch-profiles`, and the known `tree-actions` flakes (`Expected e2e-worker to expose an endpoint URL`, addressed by #21914; `Timed out … waiting for running AppHost` on Linux). After reruns, all 70 checks pass. **Verdict: MODERATE.** The fixed race is proven deterministically (10/10 → 0/10) and matches the newest failure's exact signature. However, it accounts for only 1 of the 4 attempt-1 test failures in 14d. The other 3 belong to the Windows runner-slowness family in #21570. ## Confidence High that this removes the empty-marker failure mode: the gap is inherent to `File.WriteAllText` and the reader returns on its first read. Low that it changes the C# language server / OnLaunched timeout failures, which this PR does not target. **How we stop this recurring:** Fixture processes that publish readiness files for E2E polling should write a temp file and rename it into place. The unit test now enforces this for the WinUI marker. ## Checklist - Is this feature complete? - [x] Yes. Ready to ship. - [ ] No. Follow-up changes expected. - Are you including unit tests for the changes and scenario tests if relevant? - [x] Yes - [ ] No - Did you add public API? - [ ] Yes - [x] No - Does the change make any security assumptions or guarantees? - [ ] Yes - [x] No **🤖 Posted by AspireAgent (AI Agent)** Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…n empty file (#21932) **What failed:** `[vscode] Aspire WinUI debug E2E > debugs an unpackaged WinUI project through its generated apphost executable` failed on attempt 1 in [42448442647](https://github.com/microsoft/aspire/actions/runs/42448442647/job/128635064936) (tracker #21600, unowned rank 1): ``` AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^ready:\d+$/. Input: '' ``` **Why:** The generated WinUI fixture app wrote its ready marker with `File.WriteAllText(readyFile, …)`. That call creates the file before it writes the content. `waitForReadyMarker` polls for the file and returns its first successful read, so a poll that landed in that gap returned `''` and failed the assertion. The app had started correctly; the test read the file before the content was written. **How fixed:** The fixture app (`extension/scripts/run-e2e.js`) now writes `ready:<pid>` to `<marker>.tmp` and then `File.Move(…, overwrite: true)` renames it into place. Because the rename is atomic, the marker path is either missing or holds the full content, so the test's first read is always complete. The assertion, timeouts and polling are unchanged. The existing `e2eLaunchProfile` unit test now checks for the atomic write and rejects a direct `File.WriteAllText(readyFile, …)`. ## Failure stats (14d, attempt 1) | Scope | Attempt-1 test failures / runs where the job executed | Rate | Passed on rerun | |---|---|---|---| | PR | 4 / 457 | 0.9% | 4 / 4 | | main | 0 / 99 | 0% | n/a | Main over 30 days: 0 test-level failures in 216 runs (0 / 99 in the last 14d plus 0 / 117 in the 16 days before). This job had 9 other attempt-1 failures that never reached the test and are excluded: 8 were "hosted runner lost communication" and 1 was an `aspire-extension` artifact download failure. Test-level failures (all four): - [42448442647](https://github.com/microsoft/aspire/actions/runs/42448442647/job/128635064936) (PR #21921, unrelated Java debug change): `The input did not match the regular expression /^ready:\d+$/. Input: ''` ← **fixed by this PR** - [42257446455](https://github.com/microsoft/aspire/actions/runs/42257446455/job/128037952447) (PR branch `aspireagent/fix-e2e-notification-dismiss-hover-race`): `Timed out after 120000ms waiting for the C# language server to resolve generated InitializeComponent … Last definitions: []` (the `tree-actions` shard also failed in the same attempt) - [41532732531](https://github.com/microsoft/aspire/actions/runs/41532732531/job/125585902027) (PR #20950): `Timed out after 240000ms waiting for the WinUI OnLaunched marker.` AppHost hosting startup took 1m42s, and 4 other Windows shards failed in the same attempt. - [41501727353](https://github.com/microsoft/aspire/actions/runs/41501727353/job/125481870825) (PR #21183): `The C# definition probe for InitializeComponent … Timed out after 129ms waiting for E2E control revision`. `dotnet --list-runtimes` took 53s, Roslyn never started, and 6 other shards failed in the same attempt. All four are genuine flakes, not caused by their PRs. The last three come from whole-runner slowness on Windows, which is tracked in #21570 with telemetry in #21644. This PR does not address them because fixing them would mean raising timeouts. **Local regression evidence:** A harness ran the fixture's exact before/after C# writer against a Node reader that uses `waitForReadyMarker`'s semantics (first successful read is asserted against `/^ready:\d+$/`), polling tightly, with 500 marker publications per run: - Before (`File.WriteAllText(readyFile, …)`): **10/10 runs** saw an empty marker (475–496 torn first reads out of about 500 per run). - After (write `.tmp`, then `File.Move` with `overwrite: true`): **0/10 runs** saw an empty marker (0 torn reads out of about 4,980 publications). The harness ran on Linux. On Windows, `File.Move(overwrite: true)` maps to `MoveFileEx(MOVEFILE_REPLACE_EXISTING)` within the same directory, which is also atomic for readers. **PR CI** ([run 42472017876](https://github.com/microsoft/aspire/actions/runs/42472017876)): `VS Code extension E2E (Windows, winui-debug)` and the Windows extension unit tests (including the updated `e2eLaunchProfile` test) passed on attempt 1. Three unrelated jobs failed on attempt 1: a GitHub 'Unicorn' outage while downloading Deno in `launch-profiles`, and the known `tree-actions` flakes (`Expected e2e-worker to expose an endpoint URL`, addressed by #21914; `Timed out … waiting for running AppHost` on Linux). After reruns, all 70 checks pass. **Verdict: MODERATE.** The fixed race is proven deterministically (10/10 → 0/10) and matches the newest failure's exact signature. However, it accounts for only 1 of the 4 attempt-1 test failures in 14d. The other 3 belong to the Windows runner-slowness family in #21570. ## Confidence High that this removes the empty-marker failure mode: the gap is inherent to `File.WriteAllText` and the reader returns on its first read. Low that it changes the C# language server / OnLaunched timeout failures, which this PR does not target. **How we stop this recurring:** Fixture processes that publish readiness files for E2E polling should write a temp file and rename it into place. The unit test now enforces this for the WinUI marker. ## Checklist - Is this feature complete? - [x] Yes. Ready to ship. - [ ] No. Follow-up changes expected. - Are you including unit tests for the changes and scenario tests if relevant? - [x] Yes - [ ] No - Did you add public API? - [ ] Yes - [x] No - Does the change make any security assumptions or guarantees? - [ ] Yes - [x] No **🤖 Posted by AspireAgent (AI Agent)** Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> (cherry picked from commit 8f00c66)
…n empty file (#21932) **What failed:** `[vscode] Aspire WinUI debug E2E > debugs an unpackaged WinUI project through its generated apphost executable` failed on attempt 1 in [42448442647](https://github.com/microsoft/aspire/actions/runs/42448442647/job/128635064936) (tracker #21600, unowned rank 1): ``` AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^ready:\d+$/. Input: '' ``` **Why:** The generated WinUI fixture app wrote its ready marker with `File.WriteAllText(readyFile, …)`. That call creates the file before it writes the content. `waitForReadyMarker` polls for the file and returns its first successful read, so a poll that landed in that gap returned `''` and failed the assertion. The app had started correctly; the test read the file before the content was written. **How fixed:** The fixture app (`extension/scripts/run-e2e.js`) now writes `ready:<pid>` to `<marker>.tmp` and then `File.Move(…, overwrite: true)` renames it into place. Because the rename is atomic, the marker path is either missing or holds the full content, so the test's first read is always complete. The assertion, timeouts and polling are unchanged. The existing `e2eLaunchProfile` unit test now checks for the atomic write and rejects a direct `File.WriteAllText(readyFile, …)`. ## Failure stats (14d, attempt 1) | Scope | Attempt-1 test failures / runs where the job executed | Rate | Passed on rerun | |---|---|---|---| | PR | 4 / 457 | 0.9% | 4 / 4 | | main | 0 / 99 | 0% | n/a | Main over 30 days: 0 test-level failures in 216 runs (0 / 99 in the last 14d plus 0 / 117 in the 16 days before). This job had 9 other attempt-1 failures that never reached the test and are excluded: 8 were "hosted runner lost communication" and 1 was an `aspire-extension` artifact download failure. Test-level failures (all four): - [42448442647](https://github.com/microsoft/aspire/actions/runs/42448442647/job/128635064936) (PR #21921, unrelated Java debug change): `The input did not match the regular expression /^ready:\d+$/. Input: ''` ← **fixed by this PR** - [42257446455](https://github.com/microsoft/aspire/actions/runs/42257446455/job/128037952447) (PR branch `aspireagent/fix-e2e-notification-dismiss-hover-race`): `Timed out after 120000ms waiting for the C# language server to resolve generated InitializeComponent … Last definitions: []` (the `tree-actions` shard also failed in the same attempt) - [41532732531](https://github.com/microsoft/aspire/actions/runs/41532732531/job/125585902027) (PR #20950): `Timed out after 240000ms waiting for the WinUI OnLaunched marker.` AppHost hosting startup took 1m42s, and 4 other Windows shards failed in the same attempt. - [41501727353](https://github.com/microsoft/aspire/actions/runs/41501727353/job/125481870825) (PR #21183): `The C# definition probe for InitializeComponent … Timed out after 129ms waiting for E2E control revision`. `dotnet --list-runtimes` took 53s, Roslyn never started, and 6 other shards failed in the same attempt. All four are genuine flakes, not caused by their PRs. The last three come from whole-runner slowness on Windows, which is tracked in #21570 with telemetry in #21644. This PR does not address them because fixing them would mean raising timeouts. **Local regression evidence:** A harness ran the fixture's exact before/after C# writer against a Node reader that uses `waitForReadyMarker`'s semantics (first successful read is asserted against `/^ready:\d+$/`), polling tightly, with 500 marker publications per run: - Before (`File.WriteAllText(readyFile, …)`): **10/10 runs** saw an empty marker (475–496 torn first reads out of about 500 per run). - After (write `.tmp`, then `File.Move` with `overwrite: true`): **0/10 runs** saw an empty marker (0 torn reads out of about 4,980 publications). The harness ran on Linux. On Windows, `File.Move(overwrite: true)` maps to `MoveFileEx(MOVEFILE_REPLACE_EXISTING)` within the same directory, which is also atomic for readers. **PR CI** ([run 42472017876](https://github.com/microsoft/aspire/actions/runs/42472017876)): `VS Code extension E2E (Windows, winui-debug)` and the Windows extension unit tests (including the updated `e2eLaunchProfile` test) passed on attempt 1. Three unrelated jobs failed on attempt 1: a GitHub 'Unicorn' outage while downloading Deno in `launch-profiles`, and the known `tree-actions` flakes (`Expected e2e-worker to expose an endpoint URL`, addressed by #21914; `Timed out … waiting for running AppHost` on Linux). After reruns, all 70 checks pass. **Verdict: MODERATE.** The fixed race is proven deterministically (10/10 → 0/10) and matches the newest failure's exact signature. However, it accounts for only 1 of the 4 attempt-1 test failures in 14d. The other 3 belong to the Windows runner-slowness family in #21570. ## Confidence High that this removes the empty-marker failure mode: the gap is inherent to `File.WriteAllText` and the reader returns on its first read. Low that it changes the C# language server / OnLaunched timeout failures, which this PR does not target. **How we stop this recurring:** Fixture processes that publish readiness files for E2E polling should write a temp file and rename it into place. The unit test now enforces this for the WinUI marker. ## Checklist - Is this feature complete? - [x] Yes. Ready to ship. - [ ] No. Follow-up changes expected. - Are you including unit tests for the changes and scenario tests if relevant? - [x] Yes - [ ] No - Did you add public API? - [ ] Yes - [x] No - Does the change make any security assumptions or guarantees? - [ ] Yes - [x] No **🤖 Posted by AspireAgent (AI Agent)** Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> (cherry picked from commit 8f00c66)

Description
Windows runner loss and hangs are the largest flake family in #21600: Windows extension E2E and .NET test jobs freeze at 47–59 minutes against a 3–9 minute baseline, then lose their runner (#21570). We can't currently answer whether the machines are overloaded on CPU, memory or disk, because nothing records machine load in a form that survives the job.
This PR adds a lightweight background resource sampler to:
run-tests.yml)extension-e2e-tests.yml)What it records (
eng/scripts/ci-resource-monitor.ps1): a detached, below-normal-prioritypwshprocess starts right after checkout. Every 20s it writes:resources.csv: CPU %, processor queue length, available MB, commit charge % / committed GB / commit limit, paging pages/s, page file usage %, disk queue length, disk % time, free GB on the system and workspace drives, and process count.processes.log: the top 5 processes by CPU (since the previous sample) and by working set (with private bytes).Where it goes: the sampler writes into directories that the existing
if: always()uploads already collect, so there are no new artifacts:artifacts/log/test-logs/resource-monitor/insidelogs-<test>-windows-latest.extension/.test-results/resource-monitor/insideextension-e2e-diagnostics-win-x64-<shard>-attempt<N>.A
Stop resource monitor (Windows)step (if: always()) kills the sampler before the upload. It prints a peak/minimum table, including the largest gap between samples (a stall indicator), to the log and the job summary. This covers passing, failing, cancelled and timed-out jobs.Safety:
continue-on-error.Get-Counterand oneGet-Processcall every 20s at below-normal priority.Limitation: a runner that loses communication uploads nothing and keeps no logs. This telemetry can't capture the final minutes of a lost runner. It can show whether pressure builds on the slow jobs that survive and on the shards that typically get lost. That is still more than we have today: the existing console Heartbeat (60s, .NET tests only) vanishes with the log.
Contributes to #21570. It complements #21608 (Docker pin), which adds no telemetry.
Existing evidence (before this PR)
On main, the last 16 completed
ci.ymlpush runs had 1,551 Windows jobs. All 20 jobs that ran 45 minutes or longer were runner-lost; job logs returnBlobNotFound, so there's no Heartbeat data from any of them. Examples: extension E2E resource-debug-tools, 110m and Hosting-4, 59m.Surviving Windows Hosting-6 jobs on main (example) show the following in Heartbeat:
None of this shows exhaustion, but it doesn't cover commit charge, page file or disk queue.
Validation
tests/Infrastructure.Tests/PowerShellScripts/CiResourceMonitorTests.cs:actionlintis clean on both workflows.Observed in this PR's CI
The data comes from three CI runs of this PR on Windows hosted runners: 41289502805, 41290605859 (both partly cancelled by later pushes) and 41291481771 (head
d0358d42). It covers 331 Windows jobs with 2,923 samples: 312 .NET test jobs and 19 VS Code extension E2E shards. The sampler emitted no missing-counter warnings.Examples:
discovery-configuration: CPU 35% average (66% peak), at least 10.9 GB available, commit at most 26.7%, disk queue at most 11.6. The diagnostics artifactextension-e2e-diagnostics-win-x64-discovery-configuration-attempt1containsresource-monitor/resources.csvandprocesses.log.logs-Hosting.Dotnet-windows-latestartifact containsresource-monitor/. Itsprocesses.logshowsVBCSCompiler,dotnetandMSBuildas the top CPU consumers, i.e. the test-driven project builds.pwshuses about 1% CPU inprocesses.log.Runner loss was reproduced in this run, and those jobs stayed dark. On head
d0358d42, three .NET jobs froze inRun tests (Windows)at about 09:15Z: Hosting.Java (2-minute baseline), Hosting.Browsers (3-minute baseline) and Hosting-4 (8-minute baseline). MTP's--timeout 20mnever fired. All three were declared lost about 46 minutes after job start: "The hosted runner lost communication with the server", logsBlobNotFound, and no artifacts. The extension E2Ewinui-debugshard (5–6-minute baseline) froze the same way inRun extension E2E testsfrom 09:34Z and was lost about 47 minutes after job start. This matches main: in 9 of the last 16ci.ymlpush runs, 1–3 Windows jobs per run were lost at 46–48 minutes. In this PR's two earlier runs the same Java and Browsers jobs, also running the sampler, finished in 1–3 minutes.What this answers so far:
Checklist
🤖 Posted by AspireAgent (AI Agent)