You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sync the `vllm-pytorch-ci-triage` skill from the local skill store with
the learnings accumulated during recent triage runs.
### What changed
- **Add Step 6.5 — auto-restart transient-infra failures.**
Automatically retry blocking-failed jobs whose logs match a *transient*
infra signature (CUDA driver-init storm, `nvidia-container-cli` init
error, `exit 125`, docker setup-hook failure, ECR `toomanyrequests`) via
the Buildkite retry REST API. Includes an explicit **never-retry** list
(`manifest unknown` / missing image, real assertions/accuracy floors,
benign `No module named 'torch'` build-isolation) and rate-limit
discipline (400/min, serial fetch, spaced PUTs, 429 backoff). The same
auto-restart-first step is wired into the delta-analysis loop (Step 6
renumbered).
- **Add Step 12.4 — a within-build retry is NOT a reproducibility
test.** A Buildkite retry reuses the same image/wheels/agent, so two
failures on the same build are not independent samples; only a *fresh
build* (new image SHA) proves reproducibility. Documents the 2026-05-06
`test_cascade_attention[FLASH_ATTN]` false-positive as the motivating
example.
- **Drop the stale fwdproxy note** (no longer needed in this
environment).
Skill-only change: touches
`.claude/skills/vllm-pytorch-ci-triage/SKILL.md` and nothing else.
Co-authored-by: Andrey Talman <atalman@users.noreply.github.com>
Copy file name to clipboardExpand all lines: .claude/skills/vllm-pytorch-ci-triage/SKILL.md
+73-9Lines changed: 73 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,12 +27,6 @@ Shell state does NOT persist between Bash tool calls — always read tokens per-
27
27
28
28
`gh` CLI may not be installed (it wasn't in this env). Use raw `curl` against the REST API.
29
29
30
-
**Proxy:** if curl returns `Recv failure: Connection reset by peer` or `Received HTTP code 0 from proxy after CONNECT` for `api.buildkite.com` / `api.github.com`, the fwdproxy needs to be set explicitly per-invocation:
31
-
```bash
32
-
export https_proxy=http://fwdproxy:8080
33
-
```
34
-
Don't try to retry without it — sleeping/looping won't help. Set the env, then refetch.
35
-
36
30
---
37
31
38
32
## Inputs the user usually provides
@@ -143,11 +137,52 @@ Useful signal patterns to scan cleaned logs for:
143
137
The goal is ONE issue per root cause, not per failing job. From the 2026-04-20 triage, 22 failing non-CPU jobs grouped into 10 distinct root causes. Several causes produced >4 failing jobs each (e.g. Inductor MetaProxy → 4 Fusion E2E variants).
skipping missing-image (`manifest unknown`), real regressions, and benign modes. This both
255
+
recovers the run and prevents infra noise from polluting the delta. Record the restarted vs
256
+
skipped lists in the run report/state.
257
+
3. Match each hard-failed job in the new build against tracked-issue signatures (build a regex map from issue titles/bodies). Three buckets:
217
258
-**Still reproducing**: tracked issue still hits → no new issue. If the user wants, PATCH the existing issue body to append the new build link to a Reproducibility section.
218
259
-**Newly silent**: previously-failing job/test now passes. Don't immediately close — wait for ≥2 consecutive runs of "silent" before suggesting close.
219
260
-**Unmatched**: failing job whose signature isn't in any tracked issue. Cross-check against ≥3 main builds (per Step 3). If new on the torch-bump branch, draft + post a fresh issue and append to umbrella.
220
-
3. Maintain umbrella checklist hygiene: mark `[x]` on items that are closed upstream OR confirmed silent for ≥2 runs. Numbering continues — never reuse numbers.
261
+
4. Maintain umbrella checklist hygiene: mark `[x]` on items that are closed upstream OR confirmed silent for ≥2 runs. Numbering continues — never reuse numbers.
221
262
222
263
**Updating an existing issue's reproducibility list** (PATCH pattern):
223
264
```python
@@ -252,6 +293,29 @@ build.created_at
252
293
253
294
If `build.created_at > closing_commit.created_at` but the failure persists, the wheel predates the fix. Recommendation: cherry-pick the fix to the release branch and rebuild the RC wheel. Don't reopen the issue — it really is fixed in main.
254
295
296
+
### Step 12.4 — A within-build retry is NOT a reproducibility test
297
+
298
+
**Critical lesson, do not skip.** When Buildkite shows a job failed and someone clicks "retry" on the same build, the retry runs on the **same Docker image, same wheels, same agent state, often the same agent machine**. It does not rebuild the image, does not re-pull torch wheels, does not refetch HF caches — it just re-executes the test script.
299
+
300
+
This means:
301
+
302
+
-**Two failures on the same build are NOT independent samples.** If a flake is rooted in image-build artifacts, agent contamination, or a one-time HF download corruption, every retry will hit the same bug. Calling that "reproducible" is wrong.
303
+
-**A retry pass within the same build does prove flake** (the test ran twice in identical conditions and got two outcomes). That direction is fine.
304
+
-**A retry fail within the same build proves NOTHING about reproducibility.** It only proves the failure is deterministic given the artifacts.
305
+
306
+
The only valid reproducibility test is a **fresh build**:
307
+
308
+
1. The same vLLM commit re-built into a new test image, OR
309
+
2. A different vLLM commit that contains the suspect change.
310
+
311
+
Real example (2026-05-06 → 2026-05-07): `test_cascade_attention[FLASH_ATTN]` failed on 64577 (run 1) and 64577 (retry). I called it "reproducible" and filed pytorch/pytorch#182700 + bisected to vllm-project/vllm#41181 via a revert build (64803). That conclusion was **wrong** — when the test PR rebased onto a newer main and put #41181 back in (64854), the test passed, and #41181 has been on main builds 64792 + 64859 the whole time without breaking them. The 64577 failure was something specific to 64577's image/wheels — likely a transient artifact issue that got smoothed over by a fresh image build.
312
+
313
+
How to apply:
314
+
315
+
- Before drafting any "new regression" upstream issue, require **at least one PASS on a fresh build** (different image SHA) as the failing baseline, AND the failure to recur on a second fresh build with the suspect change.
316
+
- Treat retry-within-build as **necessary but not sufficient** for "reproducible".
317
+
- If you've already filed an issue on a within-build-retry conclusion and a fresh build then passes, retract honestly and update the umbrella.
318
+
255
319
### Step 12.5 — Reopen vs file new
256
320
257
321
Before drafting a "new" issue for an unmatched failure, search the umbrella's *closed* entries by exact failure-text fragment:
0 commit comments