Babysit CI

SkillMonitoring & ops

Monitor CI for the current JustRelax.jl branch or PR (GitHub Actions, Buildkite GPU jobs, CSCS GH200), fix mechanical failures, retrigger flaky jobs, and stop to explain anything that needs judgment. Use when asked to watch, triage or fix CI.

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the Babysit CI skill

What this skill tells your AI

The instructions your AI receives, as published by ptsolvers/justrelax.jl in .claude/skills/babysit-ci/SKILL.md and read by ahel’s review.

Watch CI for the current branch or PR. Fix small mechanical problems, retrigger flaky jobs, and pause and describe anything that needs judgment.

Step 0: Agree on the push policy

Ask once whether you may commit and push mechanical fixes to the PR branch. Without a yes, make the fix in the working tree and show the diff instead. Whatever the answer:

  • Never push to main, never force-push or rewrite history. Add new commits only.
  • Stage specific files; do not sweep in unrelated changes (git status first).

What CI runs

GitHub Actions (gh run list --branch <branch>, gh pr checks <PR>):

WorkflowNotes
CI (ci.yml)Pkg.test on the CPU. Julia lts and 1 on Ubuntu, macOS (Intel and aarch64) and Windows. pre jobs are allow_failure. New pushes cancel the previous run.
Format (format_check.yml)Runic. Posts the diff as a PR comment and does not fail the check, so read the comment, not the status.
Spell Check (SpellCheck.yml)typos, configured by _typos.toml.
Check Dependencies (Dependency.yml)Fails if GLMakie appears in the root Project.toml.
Documentation (Documenter.yml)Docs build on PRs, pushes to main and tags; deploys a PR preview.
CITATION.cff, cffconvert, Validate_Zenodo_MetadataOnly on citation/metadata changes and pushes to main.

Buildkite (julialang/justrelax-dot-jl, .buildkite/): CUDA (Julia 1.10 and 1) and AMDGPU (Julia 1) run Pkg.test(…; test_args=["--backend=…"]), 120-minute timeout. A forerunner step launches them only when src/**, ext/**, test/**, **/*.toml or .buildkite/* changed. Exit code 3 is a soft-failed Pkg.develop (instantiate) step.

CSCS GH200 (ci/cscs-gh200.yml, GitLab): CUDA with MPI, four listed test files (test_diffusion2D_multiphase_MPI, test_diffusion3D_multiphase_MPI, test_shearband2D_MPI, test_shearband3D_MPI), 30-minute limit, 2 nodes × 4 ranks.

Step 1: Find the run

git branch --show-current
gh run list --branch "$(git branch --show-current)" --limit 5
gh pr checks <PR_NUMBER>

Step 2: Read the failure before acting

gh run view <RUN_ID>
gh run view <RUN_ID> --log-failed

Buildkite's UI is JavaScript-rendered, so fetching its page returns nothing useful. The pipeline is public; use the log endpoint (<jid> is the jid= query parameter of the job link):

curl -sL -H "Accept: application/json" \
  "https://buildkite.com/organizations/julialang/pipelines/justrelax-dot-jl/builds/<N>/jobs/<jid>/log" -o log.json

The JSON has one output string holding HTML (<time> tags and entities): strip those before reading. …/builds/<N>.json gives the build state. Never guess from a job name alone.

Step 3: Triage

Fix (mechanical, obvious cause)

FailureFix
Runic comment on the PRgit runic --inplace <changed .jl files> (or apply the suggested diff)
typos findingCorrect the spelling. Add to _typos.toml only for a legitimate identifier.
Whitespace (git diff --check)Remove trailing whitespace; keep one final newline
Check Dependencies failsRemove GLMakie from the root Project.toml; plotting backends belong to the Makie extension and the miniapps/docs environments
Docs: new missing-docstring or @ref warning from the changeAdd the docstring; list a new source file in the Pages of docs/src/man/api/*.md
A new test never ranName it test_*.jl (only those are collected)
GPU-only UndefVarError: <name> while CPU is greenAdd <name> to the import JustRelax: … block of all six modules (backend-rules)
ERROR_LAUNCH_OUT_OF_RESOURCES in a 3D GPU testShrink the test grid so the launched range is ≤ 256 cells (testing-rules)
A CPU-only test fails on GPU CIAdd it to the GPU exclusion list in test/runtests.jl

After a fix, commit with a descriptive message (if allowed by Step 0) and push, then go back to Step 1. A push cancels the previous GitHub run.

Retrigger (likely flaky)

SignalAction
Network, download, Pkg resolve/instantiate errorRetrigger
Buildkite exit code 3 (soft-failed instantiate)Retrigger
Timeout with no failing testRetrigger
pre-Julia job fails in code the PR did not touchInformational; do not chase it
A job unrelated to the changed filesRetrigger, and say so
gh run rerun <RUN_ID> --failed

For Buildkite and CSCS use "Rebuild"/retry in their UI (needs a login). An empty commit reruns GitHub Actions, but the GPU pipeline launches only if watched paths differ, so it may not restart there.

Pause and describe

Stop and explain, without editing, for any of:

  • A test assertion failing (not a doctest-style output update) or a numerical regression: benchmark reference values, iteration counts, residual history.
  • A GPU failure with a real error: dynamic invocation, illegal memory access, scalar indexing, type instability.
  • An MPI hang or a failure only on a specific rank count — think missing update_halo! or a local instead of global reduction (mpi-rules).
  • A build or precompile failure, or the docs build failing in a Literate miniapp.
  • Several interrelated failures that hint at one root cause, or failures unrelated to the PR that may be upstream breakage (JustPIC, GeoParams, ParallelStencil).

Report: which jobs failed, the key error lines (trimmed), your assessment of the cause, and fix options.

Step 4: Confirm green

gh pr checks <PR_NUMBER>

Report the final state per system (GitHub, Buildkite CUDA/AMDGPU, CSCS) and note anything you skipped or that stayed red (e.g. pre jobs).

Signals

GitHub stars
44
Forks
12
Last commit
Sep 2026
Advanced
Item type
skill
Key
babysit-ci
Source
github.com/ptsolvers/justrelax.jl