ci-failure
Find and fix a red CI run of EasyTask (frontend, backend ubuntu/windows, audit, versions, e2e shards) without gh or a local Rust build. Use when a check fails on a PR, when a "check_run.completed ...
SKILL.md.claude/skills/ci-failure/SKILL.md
GitHubCI failure (EasyTask)
Workflow .github/workflows/ci.yml. Jobs: versions, frontend (eslint, e2e typecheck, npm run test:coverage, build with tsc), backend (ubuntu and windows: fmt, clippy -D warnings, test), audit, e2e (3 Linux shards). The Windows e2e job runs only by workflow_dispatch.
Tools
There is no gh in the cloud session: use the GitHub MCP tools (ToolSearch with select:mcp__github__pull_request_read,mcp__github__actions_list,mcp__github__actions_get,mcp__github__get_job_logs).
- Checks of a PR:
pull_request_readwithmethod: get_check_runs. - Runs of a branch:
actions_list(list_workflow_runs,workflow_runs_filterwithbranch). - Log:
get_job_logswith thejob_idof the check andreturn_content: true,tail_lines400 for an e2e shard (the failures are in the last part; the spec reporter summary lists every failing test with the file and line). failed_only: trueneeds therun_id.
Method
- Read the failing check and its log. Quote the real error before touching code.
- Rule out a failure that is not the PR's: is it red on
mastertoo? Same error on one re-run? Only then it is not yours; say it in one comment on the PR. - Reproduce locally what can be reproduced (
npx eslint .,npx tsc -b,npm run e2e:typecheck,npx vitest run <file>). Rust cannot be compiled in the cloud container (missing GTK libs): read the compiler error from the log and fix by reading the code. - Fix the cause. Never skip, disable or quarantine a test to get green; never push an empty commit to kick the CI.
- Run the fast checks again, commit with a clear message (no signature lines if the user said so), push, then wait for the next run: the PR events wake the session, do not poll with sleep.
- After a push from the cloud, the local ref
refs/remotes/origin/<branch>may be missing and the stop hook complains: check withgit ls-remote origin <branch>and rungit update-ref refs/remotes/origin/<branch> HEAD.
Known traps (all happened)
- Rust
-D warnings: a helper used only by tests must be#[cfg(test)];Option::geton settings needs?(settings?.get(..)). Dead code and unused imports fail clippy. - e2e and translations: the specs read texts with
tr("key"). Removing, merging or renaming a key insrc/i18n/locales/*breaks the specs even if vitest is green. Searche2e/for the key (see thei18n-keysskill). - Tauri permission missing: a plugin command without its permission in
src-tauri/capabilities/default.jsonfails only in the real app, for examplestore.entries()withoutstore:allow-entriesmade the preferences come back as defaults (seetauri-permission). - Drag on Linux: the WebKitGTK driver does not deliver the pointer events of a drag. Drag specs must
this.skip()whenprocess.platform === "linux". - Single pane has no
data-pane:[data-pane]exists only when the workspace is split. Select tabs with[role="tab"][title=...]when there is one pane. - Dialogs open after the menu closes: wait for the dialog button (
waitUntilontopDialog()plusbyText) instead of reading the top dialog at once. - Debounced store save (
src/lib/store/save-soon.ts, 500 ms): the specs that restart the app wait untilsettings.datcontains the values. - Flaky multi-select color undo passed on a re-run: re-run only once, and only for a failure that dies before the test body, otherwise treat it as real.