Skip to content

Add nightly E2E failure-mode report - #8312

Open
isaacroldan wants to merge 1 commit into
mainfrom
isaac/e2e-failure-report
Open

Add nightly E2E failure-mode report#8312
isaacroldan wants to merge 1 commit into
mainfrom
isaac/e2e-failure-report

Conversation

@isaacroldan

Copy link
Copy Markdown
Contributor

WHY are these changes introduced?

A 31% E2E shard failure rate survived five months because nobody was counting. Job logs expire after 90 days and run history after ~8 months, so by the time anyone looked, most of the evidence was gone. This adds the counting.

WHAT is this pull request doing?

A nightly workflow (e2e-failure-report.yml) that:

  1. Scans every completed tests-pr.yml run in the window (every run's job list — the E2E job is continue-on-error, so failed shards hide inside green runs and filtering for failed runs misses them).
  2. Downloads the log of each failed E2E tests (shard …) job and classifies it against the ordered patterns in bin/e2e-failure-modes.json. Job-fatal signatures win over cleanup noise as the primary mode; unmatched failures are recorded as unclassified with their first error line so new modes can be named.
  3. Appends results to JSONL datasets on the e2e-failure-data branch (idempotent, deduped by job ID) — the durable record that outlives log retention.
  4. Publishes a last-7-days vs previous-7-days mode table to the job summary, and to Slack when the optional E2E_REPORT_SLACK_WEBHOOK secret is set.

workflow_dispatch takes a days_back input for backfills.

Validation

Ran a real 8-day backfill locally: 308 runs scanned, 87 failed shards classified, zero unclassified. The seeded dataset is already on the e2e-failure-data branch. First real finding — this week's modes:

Mode last 7 days
partners-throttled 32
cli-died-waiting-ready 12
auth-setup-failed 10
store-provision-timeout 9
build-typescript-error 6
dashboard-delete-timeout 5
playwright-test-timeout 3
pnpm-install-failed 2

(25.8% of runs where E2E ran had a failed shard. Throttling — not cleanup — is currently the top mode.)

How to test your changes?

GITHUB_TOKEN=$(gh auth token) node bin/e2e-failure-report.js --days 2 --data-dir /tmp/e2e-data
cat /tmp/e2e-data/summary.md

Measuring impact

  • n/a — CI-only tooling, no user-facing impact

🤖 Generated with Claude Code

Classifies failed E2E shard jobs from the PR workflow into named
failure modes and appends them to a durable dataset on the
e2e-failure-data branch. Job logs expire after 90 days and run history
after ~8 months; the classified data is what survives.

Because the E2E job is continue-on-error, runs with failed shards still
conclude green, so the scanner walks every run's job list instead of
filtering for failed runs.

Patterns live in bin/e2e-failure-modes.json, ordered so job-fatal
signatures win over cleanup noise as a job's primary mode. Unmatched
failures are recorded as unclassified with their first error line, so
new modes surface with enough context to be named.

The nightly run scans a 2-day window (idempotent, deduped by job ID);
workflow_dispatch takes a days_back input for backfills. The summary
lands in the job summary, and in Slack when the optional
E2E_REPORT_SLACK_WEBHOOK secret is configured.

Validated with a real 8-day backfill: 308 runs scanned, 87 failed
shards classified, zero unclassified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@isaacroldan
isaacroldan requested a review from a team as a code owner August 11, 2026 14:51
@github-actions github-actions Bot added the no-changelog This PR doesn't include a changeset entry. Is an internal only change not relevant to end users. label Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-changelog This PR doesn't include a changeset entry. Is an internal only change not relevant to end users.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant