{"owner":"JuliaLang","repo":"julia","hasSkills":true,"totalSkillsCount":11,"totalTokensCount":6572,"categories":["anthropic-skill","subagent-persona","claude-rule","root-instruction"],"hasMcp":false,"mcpConfig":null,"found":["doc/src/devdocs/agents/skills/external-deps/SKILL.md","doc/src/devdocs/agents/skills/ci-timing/SKILL.md","doc/src/devdocs/agents/skills/doctests/SKILL.md","doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md","doc/src/devdocs/agents/skills/compiler-jl/SKILL.md","doc/src/devdocs/agents/skills/test-changes/SKILL.md","doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md","doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md","doc/src/devdocs/agents/README.md","CLAUDE.md","AGENTS.md"],"skills":{"doc/src/devdocs/agents/skills/external-deps/SKILL.md":"---\nname: external-deps\ndescription: Modify Julia's external dependencies and JLLs — patches under deps/patches/, version bumps in deps/, and JLL updates. Use when touching deps/ or any *_jll folder, including refreshing checksums.\n---\n\n# External dependencies & JLLs\n\nUse this when modifying `deps/`, dependency patches, or a JLL.\n\n## External dependencies (deps/, deps/patches/)\n\nWhen modifying external dependencies (patches in `deps/patches/` or version\nupdates in `deps/`):\n\n1. Always test builds with `USE_BINARYBUILDER=0` to ensure source builds work correctly.\n2. For patches to external libraries:\n   - Verify the patch applies cleanly by running the extraction and patch steps.\n   - Test the full build of the dependency: `make -C deps USE_BINARYBUILDER=0 compile-<depname>`.\n   - Prefer using the full upstream commit in `git am` format (e.g., `git format-patch`) which includes proper commit metadata.\n3. When updating dependency versions, ensure all associated patches still apply.\n\n## External JLLs\n\nTo update a JLL to the latest version:\n\n- Update the version number in the appropriate jll folder.\n- If the dependencies in the upstream jll changed, update the `Project.toml`.\n- Run `make -f contrib/refresh_checksums.mk <jll>` to update the checksums. This may take a few minutes.\n","doc/src/devdocs/agents/skills/ci-timing/SKILL.md":"---\nname: ci-timing\ndescription: Compare a Julia PR's Buildkite job durations against recent CI history (per-job mean/min/max over the last N days). Use when asked whether a PR slows down or speeds up CI, or to check a build's timings against the weekly baseline.\n---\n\n# CI timing analysis\n\n```sh\njulia --startup-file=no --project=contrib/ci-timing contrib/ci-timing/ci_timing_compare.jl <PR-number>\n```\n\nPrints a markdown table, slowest job first, plus a TOTAL row: each job's duration\nin the PR's `julia-pr` build vs. the mean/min/max of the same job name over the\nlast 7 days of [julia-ci-timing](https://github.com/JuliaCI/julia-ci-timing)\nhistory. `⚠️` = above the weekly max, `✅` = below the weekly min. No Buildkite\ntoken needed; `gh` is only needed to turn a PR number into a build.\n\nFlags: `--build julia-pr/853`, `--days N`, `--include-failed`, `--min-seconds N`\n(hides short jobs).\n\nCaveats when reading it:\n\n- One build vs. a week of samples — anything inside the min/max band is agent\n  variance, and even ⚠️/✅ rows need a second build to mean anything.\n- `juliasyntax`/`Launch *` jobs are seconds long, so their percentages are noise;\n  `--min-seconds 120` drops them.\n- A fleet-wide shift in one direction skews TOTAL and is not a PR effect.\n- Broken (never run), running, and superseded retry jobs are excluded; a failed\n  job's time is cut short or stretched by the failure.\n\nFor logs behind a slow or failed job, see the `buildkite-logs` skill.\n","doc/src/devdocs/agents/skills/doctests/SKILL.md":"---\nname: doctests\ndescription: Write and verify Julia `jldoctest` code blocks. Use whenever adding or changing a `jldoctest` block in a docstring (base/, stdlib/, Compiler/) or under doc/, and before opening a PR that touches doctests.\n---\n\n# Julia doctests\n\nUse this whenever you add or modify any `jldoctest` code block.\n\n## Writing\n\nBefore writing new doctests, review `doc/src/devdocs/contributing/jldoctests.md`\nfor best practices (filters, labels, setup code).\n\n## Verifying\n\nIf you changed any `jldoctest` block you MUST verify it. Follow these steps for\nEVERY doctest change:\n\n1. Review `doc/src/devdocs/contributing/jldoctests.md`. In particular, determine\n   if any of the changed doctests require filters, labels or setup code.\n2. Run the doctests to verify that your change works:\n   - To run doctest with the pre-built juliaup: `make -C doc doctest=true revise=true JULIA_EXECUTABLE=$HOME/.juliaup/bin/julia`\n   - To run doctest with in-tree julia (preferred): `make -C doc doctest=true revise=true`. Do not pass any other options.\n   - IMPORTANT: The doctests may take up to 15 minutes. Do NOT terminate the doctests before completion. Do NOT use a timeout for doctests.\n   - If you are ChatGPT, you may have to increase yield_timeout_ms.\n","doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md":"---\nname: julia-syntax-lowering\ndescription: Develop and test JuliaSyntax and JuliaLowering in Julia's source tree. Use when modifying JuliaSyntax/ or JuliaLowering/, running package or targeted tests, or checking JuliaLowering execution.\n---\n\n# JuliaSyntax & JuliaLowering development\n\nUse this when modifying `JuliaSyntax/` or `JuliaLowering/` source, tests, or\npackage metadata.\n\n## Testing JuliaSyntax\n\nRun package tests from the repository root:\n\n```sh\njulia --project=JuliaSyntax -e 'using Pkg; Pkg.test()'\n```\n\n`JuliaSyntax` is not tied only to the in-tree Julia runtime; if a change may be\nversion-sensitive, test it with the relevant installed Julia version(s).\n\n## Testing JuliaLowering\n\nPrefer the in-tree Julia runtime because compatibility with the Julia runtime\nmay matter:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'using Pkg; Pkg.test()'\n```\n\nIf `./usr/bin/julia` is unavailable, note that limitation and use an available\n`julia` executable only for preliminary validation.\n\nIn this repository, `JuliaLowering/Project.toml` points its `JuliaSyntax`\ndependency at the sibling `JuliaSyntax` checkout\n(`path = \"../JuliaSyntax\"`). Therefore, `JuliaSyntax` changes can affect\n`JuliaLowering`. When a `JuliaSyntax` change may affect lowering behavior or\nsyntax data consumed by `JuliaLowering`, run the `JuliaLowering` test command as\nwell.\n\n### Targeted JuliaLowering tests\n\nFor targeted `JuliaLowering` test execution, include\n`JuliaLowering/test/utils.jl` before the test file, matching\n`JuliaLowering/test/runtests.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); include(\"scopes.jl\"); end'\n```\n\nFor `_ir.jl` fixtures, call `test_ir_cases` after loading `utils.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); test_ir_cases(\"scopes_ir.jl\"); end'\n```\n\n## Trying JuliaLowering execution\n\nFor quick execution checks, run with the in-tree Julia runtime and the\n`JuliaLowering` project:\n\n```sh\n./usr/bin/julia --project=JuliaLowering\n```\n\nThen either evaluate code explicitly through `JuliaLowering`:\n\n```julia\nusing JuliaLowering\nJuliaLowering.include_string(Main, \"1 + 2\")\n```\n\nor activate `JuliaLowering` as the process lowerer, then evaluate subsequent\ncode normally:\n\n```julia\nusing JuliaLowering\nJuliaLowering.activate!()\n\n1 + 2\n```\n\nUse `include(\"path/to/file.jl\")` after activation when checking a file. When\nusing `JuliaLowering.activate!()` from `-e`, make the code under test a separate\ntop-level statement after activation, or put it in `include(...)`.\n","doc/src/devdocs/agents/skills/compiler-jl/SKILL.md":"---\nname: compiler-jl\ndescription: Develop and test Julia's Compiler.jl. Use when modifying Compiler/, debugging compiler behavior, or activating stdlib Compiler for reflection/native-codegen experiments instead of using sysimage Base.Compiler.\n---\n\n# Compiler.jl development\n\nUse this when modifying `Compiler/` source, tests, or package metadata.\n\n## Compiler modules in Julia\n\nDuring bootstrap, `Compiler/` is built into the sysimage as `Base.Compiler`.\nThat in-sysimage compiler is what Julia normally uses for native compilation.\nBecause it is baked into the sysimage, changes made to `Compiler/` after the\nsysimage was built are not reflected in `Base.Compiler` unless Julia is rebuilt.\n\n`Compiler/` can also be loaded as a stdlib package, producing a separate\n`Compiler` module from `Base.Compiler`. For day-to-day development, testing, and\ndebugging of post-sysimage source changes, prefer this stdlib `Compiler` module\nover trying to replace `Base.Compiler` with Revise. It is usually reliable except\nfor failures caused by compatibility with the `src/` runtime or other\nsysimage/native-codegen integration issues.\n\nWhen investigating a runtime compatibility issue, `make -C src` can update the\nruntime faster than rebuilding the full Julia sysimage. Rebuild Julia when the\nupdated `Compiler/` code needs to be baked into `Base.Compiler` or when checking\nsysimage/native-codegen integration.\n\n## Experimenting with Compiler as a stdlib\n\nRun the in-tree Julia runtime with the `Compiler` project:\n\n```sh\n./usr/bin/julia --project=Compiler\n```\n\n### Reflection backend\n\nFor reflection-oriented debugging, activate the stdlib `Compiler` module:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler\n```\n\n`@activate Compiler` is equivalent to `@activate Compiler[:reflection]`: Base and\nInteractiveUtils reflection utilities such as `code_typed`, `@code_typed`, and\n`code_warntype` will use the loaded stdlib `Compiler` module. This is useful for\ntrying compiler changes without rebuilding the sysimage.\n\n### Native compilation backend\n\nIf you specifically need to exercise the loaded stdlib `Compiler` as the native\ncompilation backend, use:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler[:codegen]\n```\n\nThis is broader than reflection activation: it makes the runtime invoke the\nloaded compiler for compilation requests. Use it only when debugging native\ncompilation/codegen behavior, and expect failures here to involve sysimage,\nruntime, native-codegen, or compiler-cache interactions.\n\nFor ordinary debugging, prefer reflection activation. Use `[:codegen]` only when\nyou specifically need to test the native compilation backend; for final\nintegration checks, rebuild Julia and test the in-sysimage `Base.Compiler`.\n\n## Testing Compiler as a stdlib package\n\nRun package tests from the repository root with the in-tree Julia runtime:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Pkg; Pkg.test()'\n```\n\nTo run a single test file, include it directly under a `Test.@testset`:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Test; @testset \"inline\" include(\"Compiler/test/inline.jl\")'\n```\n\nMost `Compiler/test/` files include `Compiler/test/setup_Compiler.jl`, which\nactivates or imports the appropriate `Compiler` module for this workflow.\n\n## Testing `Base.Compiler`\n\nUse the top-level test entry point when the goal is to test the `Base.Compiler`\nthat is baked into the sysimage:\n\n```sh\n./usr/bin/julia test/runtests.jl Compiler\n```\n\nIf you changed `Compiler/` and need those changes reflected in `Base.Compiler`,\nrebuild Julia first so the sysimage contains the updated compiler code.\n","doc/src/devdocs/agents/skills/test-changes/SKILL.md":"---\nname: test-changes\ndescription: Run and update Julia tests after changing test files. Use when adding to or modifying any test file under test/ or stdlib/**/test/.\n---\n\n# Julia test changes\n\nUse this when you change or add a Julia test.\n\n- If you have changed a test (e.g. `foo`), run `make test-revise-foo` for the\n  corresponding test to ensure that the test is still passing with your changes.\n- If you are adding a new test, add it to an existing test file. Do not create a\n  new test file unless explicitly instructed.\n- Write one comment at the top of the test to explain what is being tested.\n  Otherwise keep comments minimal.\n- Use the environment variable `JULIA_TEST_FAILFAST=1` to make tests fail fast.\n- Do not coordinate with fixed `sleep`s — loaded CI machines break any fixed\n  delay. Synchronize on observable state (readiness markers, round-trips), or\n  retry.\n","doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md":"---\nname: c-static-analysis\ndescription: Run Clang static analysis on Julia's C/C++ runtime and codegen, and satisfy the GC-rooting checker. Use after modifying runtime/codegen .c/.cpp files under src/ (excluding headers), before opening a PR.\n---\n\n# C/C++ static analysis (src/)\n\nUse this after you modify a runtime/codegen C/C++ source file under `src/` (not\nheaders). Note that runtime changes also require a rebuild (`make -j`).\n\nRun static analysis checks:\n\n- First run `make -C src install-analysis-deps` to initialize dependencies (only\n  needed once the first time, or after the LLVM/Clang toolchain dependencies\n  change). This may download and install LLVM/Clang artifacts.\n- For a source file such as `src/jloptions.c` or `src/codegen.cpp`, use the file\n  stem without the `.c`/`.cpp` extension:\n  ```sh\n  make -C src analyze-<file-stem> -j8 [--output-sync]\n  ```\n  For example, to analyze `src/jloptions.c`, run:\n  ```sh\n  make -C src analyze-jloptions -j8\n  ```\n  Add `--output-sync` when your `make` supports it to keep parallel output\n  grouped; otherwise omit it.\n- Checks can also be rerun individually with `clang-sa-<file-stem>`,\n  `clang-sagc-<file-stem>`, `clang-safety-<file-stem>` or\n  `clang-tidy-<file-stem>`.\n\n## Fixing the GC-rooting checker (clang-sagc)\n\nIf `clang-sagc-<file-stem>` fails, first look for fixes that establish real\nrooting, such as adding appropriate `JL_GC_PUSH`/`JL_GC_POP` scopes, or for\nlock/control-flow fixes.\n\nDo not add `JL_GC_PROMISE_ROOTED` without explicit user or maintainer\nconfirmation. `JL_GC_PROMISE_ROOTED` asserts that a value is already rooted; it\ndoes not root the value. If it appears necessary, stop and ask for confirmation,\nshowing the exact expression, the existing root that makes it safe, and the\nsafepoints considered.\n\n- Remember arguments are assumed rooted, so check the callers to make sure that\n  is handled.\n- As a diagnostic hint when asking for confirmation: if the value is temporarily\n  moved through a struct or arraylist and then reloaded, the promised expression\n  may need to refer to the reloaded field, such as\n  `JL_GC_PROMISE_ROOTED(struct->field)`, immediately after the reload and before\n  any use of that field.\n- If confirmed, put the promise as early in the code as is legal, near the\n  definition or reload rather than the use.\n","doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md":"---\nname: buildkite-logs\ndescription: Fetch and inspect Julia Buildkite CI logs and artifacts without web sign-in, including the TTFX benchmark jobs. Use when debugging Julia CI failures, reviewing Buildkite jobs, investigating a TTFX regression, or when the Buildkite MCP is unavailable.\n---\n\n# Reviewing Buildkite CI logs\n\nUse this when investigating Julia Buildkite CI failures, especially if the\nBuildkite MCP is unavailable. The recipe requires `gh`, `curl`, `python3`, and\nnetwork access to GitHub and Buildkite.\n\nJulia's CI runs on Buildkite. PR builds run in the `julialang/julia-pr`\npipeline, post-merge master builds in `julialang/julia-ci`, and scheduled runs\nin `julialang/julia-master-scheduled` (the old `julia-master` pipeline no\nlonger exists). The public web UI requires sign-in to download `raw_log`, but\ntwo frontend JSON endpoints are anonymously accessible for public pipelines.\nRecipe:\n\n1. Find the build number. `gh pr checks <PR-number>` gives launcher-job URLs\n   like `https://buildkite.com/julialang/julia-pr/builds/<BUILD>#<uuid>`; for a\n   master commit, use the commit statuses\n   (`gh api repos/JuliaLang/julia/commits/<sha>/status`). The `#<uuid>`\n   fragments there are only the top-level launcher jobs (Build/Check/Test/…),\n   not the per-platform jobs.\n\n2. List all jobs in the build, with names, states, exit statuses, and UUIDs:\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/julialang/<PIPELINE>/builds/<BUILD>/data/jobs\" \\\n     -o /tmp/bkjobs.json\n   python3 -c \"import json; [print(j['state'],'|',j.get('exit_status'),'|',j['name'],'|',j['id']) \\\n   for j in json.load(open('/tmp/bkjobs.json'))['records']]\"\n   ```\n\n   This `/data/jobs` endpoint is what the build page's frontend uses; it\n   returns every job in one page (`records`, plus `has_next_page`). Do NOT use\n   `builds/<BUILD>.json` for job discovery — anonymously it returns build\n   metadata with an *empty* `jobs` array (the `statistics` field still shows\n   the true job count).\n\n3. Fetch a job's log JSON (replace `<PIPELINE>`, `<BUILD>`, `<JOB-UUID>`):\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/log\" \\\n     -o /tmp/bk.json\n   ```\n\n   The log text lives under the JSON `output` field, with embedded HTML\n   (`<time>` timestamps, ANSI-as-`<span>` colour) and entity-encoded shell\n   output. Strip with e.g.:\n\n   ```sh\n   python3 -c \"import json,re,html; s=json.load(open('/tmp/bk.json'))['output']; \\\n   s=re.sub(r'<[^>]+>','',s); print(html.unescape(s))\" > /tmp/bk.txt\n   ```\n\n   Write the stripped log to a file and search it (logs can be hundreds of KB);\n   piping the whole thing into context wastes tokens.\n\n4. List and download a job's artifacts. The same frontend serves the artifact\n   list as JSON, and each artifact's URL redirects to a signed S3 URL that is\n   valid for ten minutes, so `curl -L` downloads it.\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/artifacts\" \\\n     -o /tmp/bkart.json\n   python3 -c \"import json; [print(a['path'],'|',a['file_size'],'|',a['url']) for a in json.load(open('/tmp/bkart.json'))]\"\n   curl -sSL -H \"Accept: application/json\" \"https://buildkite.com<url-from-listing>\" -o /tmp/<name>\n   ```\n\nThe log endpoint also serves still-running jobs (partial output). For a test\njob that hung, the in-tree watchdog (`.buildkite/utilities/timeout.jl`,\n`JL_TERM_TIMEOUT`) prints per-task Julia backtraces of every worker before\nkilling it, and core dumps are uploaded as artifacts with an `lldb bt all`\nsummary in the log — search the log for `---- Task`, `Waiting for`, and\n`core dumped`.\n\n## TTFX benchmark jobs\n\nThe `TTFX` group's macOS job runs the\n[Julia-TTFX-Snippets](https://github.com/tecosaur/Julia-TTFX-Snippets) tasks\nagainst the build: on pull requests compared with the master build of the\nmerge-base, on master builds alone (the data behind\n<https://perf.julialang.org/?tab=ci-ttfx>). Its results, report and\ntrace-compile logs are job artifacts (step 4). What they contain and how the\ncomparison is judged is documented with the driver in JuliaCI/julia-buildkite,\n`utilities/ttfx/README.md`.\n","doc/src/devdocs/agents/README.md":"# Agent Skills\n\nJulia keeps canonical project-local Agent Skills under\n`doc/src/devdocs/agents/skills/`. These files follow the\n[Agent Skills](https://agentskills.io) `SKILL.md` format.\n\nThe `.agents/skills/` and `.claude/skills/` entries are symlinks to the canonical\nskills directory for automatic discovery by skills-aware agents. Do not edit\nthrough those discovery paths directly; edit the canonical `SKILL.md` under\n`doc/src/devdocs/agents/skills/`.\n\nThe documentation build renders each canonical `SKILL.md` with its Agent Skill metadata:\n\n- [`doctests`](skills/doctests/index.md) — writing and verifying `jldoctest` code blocks.\n- [`test-changes`](skills/test-changes/index.md) — running and updating tests after changing them.\n- [`c-static-analysis`](skills/c-static-analysis/index.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`external-deps`](skills/external-deps/index.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`buildkite-logs`](skills/buildkite-logs/index.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`ci-timing`](skills/ci-timing/index.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`compiler-jl`](skills/compiler-jl/index.md) — developing and testing Compiler.jl.\n- [`julia-syntax-lowering`](skills/julia-syntax-lowering/index.md) — developing and testing JuliaSyntax and JuliaLowering.\n","CLAUDE.md":"<!--\n\nInclude the contents of AGENTS.md\n\nhttps://code.claude.com/docs/en/claude-code-on-the-web#best-practices\n\n-->\n\n@AGENTS.md\n","AGENTS.md":"# Information for AI agents\n\n## Module Organization\n- [`base/`](base/) - Core standard library (loaded at startup)\n- [`stdlib/`](stdlib/) - Standard library packages (can be loaded independently)\n- [`Compiler/`](Compiler/) - Julia compiler as a separate module (can be swapped)\n- [`src/`](src/) - C/C++ runtime and LLVM codegen\n- [`cli/`](cli/) - Command-line interface and loader\n- [`doc/`](doc/) - Documentation and User Manual\n\n## Running Julia\n\nYou should have a recent binary copy of julia in your `$HOME/.juliaup/bin` directory.\nYou may use this julia executable for validation.\nIf a built version of Julia exists in the current source tree (at `usr/bin/julia`),\nprefer that version.\nNote that any changes you make to the source code after the binary is built\nwill not be reflected, unless you use `Revise`.\n\n## For all changes\n\n1. Sign off every commit you create with an `Assisted-by: <tool> (<model>)` trailer naming both the\n   tool and the model behind it, for example `Assisted-by: Claude Code (Opus 5)`. Name the model,\n   not just the harness - it is what tells a later reader what actually produced the work. Do not\n   use `Co-authored-by:` for tools, and do not list a tool as an author; this trailer replaces any\n   co-author trailer your harness adds by default.\n2. Agents can only open PRs or post comments once the human user gives them explicit permission.\n\n## Building Julia\n\nIf you made changes to the runtime (any files in `src/`), you will need to rebuild\njulia. Run `make -j` to rebuild julia. This process may take up to 10 minutes\ndepending on your changes.\n\nAfter modifying any C/C++ file under `src/`, also run the Clang static analysis\nchecks — see the `c-static-analysis` skill ([`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md)).\n\n### Testing LLVM-related changes\n\nWhen making changes to LLVM passes or codegen, add `LLVM_ASSERTIONS=1` to `Make.user` to enable\nLLVM assertions. This helps catch IR verification errors early:\n\n```bash\necho \"LLVM_ASSERTIONS=1\" >> Make.user\n```\n\nTo run LLVM pass tests:\n```bash\nmake -C test/llvmpasses <testname>.ll\n```\n\n## Using Revise\n\nIf you have made changes to files included in the system image (base/ or stdlib/),\nand need to run code with these changes included, you can use `Revise`.\nTo do so, run `using Revise; Revise.track(Base)` (or Revise.track with the stdlib you modified).\nThe test system supports doing this automatically.\n\nFor instance testing Base changes without rebuilding, using failfast, you can run:\n```\nJULIA_TEST_FAILFAST=1 ./julia -e 'using Revise; Revise.track(Base); include(\"test.jl\")'\n```\n\n## Writing code\n\nAfter writing code, look up the docstring for each function you used. If there\nare recommendations or additional considerations that apply to these functions,\nmake sure to take them into account.\n\n- Do not `ccall` runtime C functions directly if there are existing wrappers for the function.\n- Do not explicitly add a module prefix if the code you're adding is in the same module. E.g. do not use `Base.` for code in Base unless required.\n\n## Task-specific skills\n\nDetailed, situational procedures are provided as Agent Skills following the\n[agentskills.io](https://agentskills.io) open standard. The canonical location is\n`doc/src/devdocs/agents/skills/`; `.agents/skills/` and `.claude/skills/` are\nsymlinks to that directory so skills-aware agents can discover the skills\nautomatically. Agents that support the standard load each skill's `description`\nautomatically and pull in the full `SKILL.md` when relevant; otherwise read the\ncanonical `SKILL.md` directly.\n\n- [`doc/src/devdocs/agents/skills/doctests/`](doc/src/devdocs/agents/skills/doctests/SKILL.md) — writing and verifying `jldoctest` code blocks.\n- [`doc/src/devdocs/agents/skills/test-changes/`](doc/src/devdocs/agents/skills/test-changes/SKILL.md) — running and updating tests after changing them.\n- [`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`doc/src/devdocs/agents/skills/external-deps/`](doc/src/devdocs/agents/skills/external-deps/SKILL.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`doc/src/devdocs/agents/skills/buildkite-logs/`](doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`doc/src/devdocs/agents/skills/ci-timing/`](doc/src/devdocs/agents/skills/ci-timing/SKILL.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`doc/src/devdocs/agents/skills/compiler-jl/`](doc/src/devdocs/agents/skills/compiler-jl/SKILL.md) — developing and testing Compiler.jl.\n- [`doc/src/devdocs/agents/skills/julia-syntax-lowering/`](doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md) — developing and testing JuliaSyntax and JuliaLowering.\n\n## Commit messages and pull requests\n\nWhen writing commit messages, follow the format \"component: Brief summary\" for\nthe title. In the body of the commit message, provide a brief prose summary\nof the purpose of the changes made. Do not specifically mention added tests, comments,\ndocumentation, etc., unless this is the main purpose of the change. Do not mention\nthe test plan, unless it differs from what you were instructed to do in AGENTS.md.\nIf your change fixes one or more issues, use the syntax \"Fixes #\" at the end of the commit message, but do not include it in the title.\n\nWhen referencing external GitHub PRs or issues, use proper GitHub interlinking format (e.g., `owner/repo#123` for PRs/issues).\nWhen fixing CI failures, include the link to the specific CI failure in the commit message.\nAlways quote macro names in backticks in commit messages and PR titles/bodies (e.g. `` `@inbounds` ``, not @inbounds), so GitHub does not notify the unrelated user with that handle.\n\nWhen preparing a pull request for the human author to open, draft the body as follows, expecting\nthem to reword it:\n1. If the pull request consists of one commit only, use the body of the commit for the body of the pull request.\n2. If there are multiple commits in the pull request, follow the same guidelines for the pull request as for the commit body.\n3. Make sure that the base commit of the pull request is recent (within the past two days) - if not rebase your changes first.\n4. If a separate tool reviews the commit, this is useful to note. Encourage the human to state how carefully they read and understood the content also, for example, by drafting the text to say the human author has *not* read any of it, and expecting they will update that once they read that disclaimer.\n"},"files":{"doc/src/devdocs/agents/skills/external-deps/SKILL.md":"---\nname: external-deps\ndescription: Modify Julia's external dependencies and JLLs — patches under deps/patches/, version bumps in deps/, and JLL updates. Use when touching deps/ or any *_jll folder, including refreshing checksums.\n---\n\n# External dependencies & JLLs\n\nUse this when modifying `deps/`, dependency patches, or a JLL.\n\n## External dependencies (deps/, deps/patches/)\n\nWhen modifying external dependencies (patches in `deps/patches/` or version\nupdates in `deps/`):\n\n1. Always test builds with `USE_BINARYBUILDER=0` to ensure source builds work correctly.\n2. For patches to external libraries:\n   - Verify the patch applies cleanly by running the extraction and patch steps.\n   - Test the full build of the dependency: `make -C deps USE_BINARYBUILDER=0 compile-<depname>`.\n   - Prefer using the full upstream commit in `git am` format (e.g., `git format-patch`) which includes proper commit metadata.\n3. When updating dependency versions, ensure all associated patches still apply.\n\n## External JLLs\n\nTo update a JLL to the latest version:\n\n- Update the version number in the appropriate jll folder.\n- If the dependencies in the upstream jll changed, update the `Project.toml`.\n- Run `make -f contrib/refresh_checksums.mk <jll>` to update the checksums. This may take a few minutes.\n","doc/src/devdocs/agents/skills/ci-timing/SKILL.md":"---\nname: ci-timing\ndescription: Compare a Julia PR's Buildkite job durations against recent CI history (per-job mean/min/max over the last N days). Use when asked whether a PR slows down or speeds up CI, or to check a build's timings against the weekly baseline.\n---\n\n# CI timing analysis\n\n```sh\njulia --startup-file=no --project=contrib/ci-timing contrib/ci-timing/ci_timing_compare.jl <PR-number>\n```\n\nPrints a markdown table, slowest job first, plus a TOTAL row: each job's duration\nin the PR's `julia-pr` build vs. the mean/min/max of the same job name over the\nlast 7 days of [julia-ci-timing](https://github.com/JuliaCI/julia-ci-timing)\nhistory. `⚠️` = above the weekly max, `✅` = below the weekly min. No Buildkite\ntoken needed; `gh` is only needed to turn a PR number into a build.\n\nFlags: `--build julia-pr/853`, `--days N`, `--include-failed`, `--min-seconds N`\n(hides short jobs).\n\nCaveats when reading it:\n\n- One build vs. a week of samples — anything inside the min/max band is agent\n  variance, and even ⚠️/✅ rows need a second build to mean anything.\n- `juliasyntax`/`Launch *` jobs are seconds long, so their percentages are noise;\n  `--min-seconds 120` drops them.\n- A fleet-wide shift in one direction skews TOTAL and is not a PR effect.\n- Broken (never run), running, and superseded retry jobs are excluded; a failed\n  job's time is cut short or stretched by the failure.\n\nFor logs behind a slow or failed job, see the `buildkite-logs` skill.\n","doc/src/devdocs/agents/skills/doctests/SKILL.md":"---\nname: doctests\ndescription: Write and verify Julia `jldoctest` code blocks. Use whenever adding or changing a `jldoctest` block in a docstring (base/, stdlib/, Compiler/) or under doc/, and before opening a PR that touches doctests.\n---\n\n# Julia doctests\n\nUse this whenever you add or modify any `jldoctest` code block.\n\n## Writing\n\nBefore writing new doctests, review `doc/src/devdocs/contributing/jldoctests.md`\nfor best practices (filters, labels, setup code).\n\n## Verifying\n\nIf you changed any `jldoctest` block you MUST verify it. Follow these steps for\nEVERY doctest change:\n\n1. Review `doc/src/devdocs/contributing/jldoctests.md`. In particular, determine\n   if any of the changed doctests require filters, labels or setup code.\n2. Run the doctests to verify that your change works:\n   - To run doctest with the pre-built juliaup: `make -C doc doctest=true revise=true JULIA_EXECUTABLE=$HOME/.juliaup/bin/julia`\n   - To run doctest with in-tree julia (preferred): `make -C doc doctest=true revise=true`. Do not pass any other options.\n   - IMPORTANT: The doctests may take up to 15 minutes. Do NOT terminate the doctests before completion. Do NOT use a timeout for doctests.\n   - If you are ChatGPT, you may have to increase yield_timeout_ms.\n","doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md":"---\nname: julia-syntax-lowering\ndescription: Develop and test JuliaSyntax and JuliaLowering in Julia's source tree. Use when modifying JuliaSyntax/ or JuliaLowering/, running package or targeted tests, or checking JuliaLowering execution.\n---\n\n# JuliaSyntax & JuliaLowering development\n\nUse this when modifying `JuliaSyntax/` or `JuliaLowering/` source, tests, or\npackage metadata.\n\n## Testing JuliaSyntax\n\nRun package tests from the repository root:\n\n```sh\njulia --project=JuliaSyntax -e 'using Pkg; Pkg.test()'\n```\n\n`JuliaSyntax` is not tied only to the in-tree Julia runtime; if a change may be\nversion-sensitive, test it with the relevant installed Julia version(s).\n\n## Testing JuliaLowering\n\nPrefer the in-tree Julia runtime because compatibility with the Julia runtime\nmay matter:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'using Pkg; Pkg.test()'\n```\n\nIf `./usr/bin/julia` is unavailable, note that limitation and use an available\n`julia` executable only for preliminary validation.\n\nIn this repository, `JuliaLowering/Project.toml` points its `JuliaSyntax`\ndependency at the sibling `JuliaSyntax` checkout\n(`path = \"../JuliaSyntax\"`). Therefore, `JuliaSyntax` changes can affect\n`JuliaLowering`. When a `JuliaSyntax` change may affect lowering behavior or\nsyntax data consumed by `JuliaLowering`, run the `JuliaLowering` test command as\nwell.\n\n### Targeted JuliaLowering tests\n\nFor targeted `JuliaLowering` test execution, include\n`JuliaLowering/test/utils.jl` before the test file, matching\n`JuliaLowering/test/runtests.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); include(\"scopes.jl\"); end'\n```\n\nFor `_ir.jl` fixtures, call `test_ir_cases` after loading `utils.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); test_ir_cases(\"scopes_ir.jl\"); end'\n```\n\n## Trying JuliaLowering execution\n\nFor quick execution checks, run with the in-tree Julia runtime and the\n`JuliaLowering` project:\n\n```sh\n./usr/bin/julia --project=JuliaLowering\n```\n\nThen either evaluate code explicitly through `JuliaLowering`:\n\n```julia\nusing JuliaLowering\nJuliaLowering.include_string(Main, \"1 + 2\")\n```\n\nor activate `JuliaLowering` as the process lowerer, then evaluate subsequent\ncode normally:\n\n```julia\nusing JuliaLowering\nJuliaLowering.activate!()\n\n1 + 2\n```\n\nUse `include(\"path/to/file.jl\")` after activation when checking a file. When\nusing `JuliaLowering.activate!()` from `-e`, make the code under test a separate\ntop-level statement after activation, or put it in `include(...)`.\n","doc/src/devdocs/agents/skills/compiler-jl/SKILL.md":"---\nname: compiler-jl\ndescription: Develop and test Julia's Compiler.jl. Use when modifying Compiler/, debugging compiler behavior, or activating stdlib Compiler for reflection/native-codegen experiments instead of using sysimage Base.Compiler.\n---\n\n# Compiler.jl development\n\nUse this when modifying `Compiler/` source, tests, or package metadata.\n\n## Compiler modules in Julia\n\nDuring bootstrap, `Compiler/` is built into the sysimage as `Base.Compiler`.\nThat in-sysimage compiler is what Julia normally uses for native compilation.\nBecause it is baked into the sysimage, changes made to `Compiler/` after the\nsysimage was built are not reflected in `Base.Compiler` unless Julia is rebuilt.\n\n`Compiler/` can also be loaded as a stdlib package, producing a separate\n`Compiler` module from `Base.Compiler`. For day-to-day development, testing, and\ndebugging of post-sysimage source changes, prefer this stdlib `Compiler` module\nover trying to replace `Base.Compiler` with Revise. It is usually reliable except\nfor failures caused by compatibility with the `src/` runtime or other\nsysimage/native-codegen integration issues.\n\nWhen investigating a runtime compatibility issue, `make -C src` can update the\nruntime faster than rebuilding the full Julia sysimage. Rebuild Julia when the\nupdated `Compiler/` code needs to be baked into `Base.Compiler` or when checking\nsysimage/native-codegen integration.\n\n## Experimenting with Compiler as a stdlib\n\nRun the in-tree Julia runtime with the `Compiler` project:\n\n```sh\n./usr/bin/julia --project=Compiler\n```\n\n### Reflection backend\n\nFor reflection-oriented debugging, activate the stdlib `Compiler` module:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler\n```\n\n`@activate Compiler` is equivalent to `@activate Compiler[:reflection]`: Base and\nInteractiveUtils reflection utilities such as `code_typed`, `@code_typed`, and\n`code_warntype` will use the loaded stdlib `Compiler` module. This is useful for\ntrying compiler changes without rebuilding the sysimage.\n\n### Native compilation backend\n\nIf you specifically need to exercise the loaded stdlib `Compiler` as the native\ncompilation backend, use:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler[:codegen]\n```\n\nThis is broader than reflection activation: it makes the runtime invoke the\nloaded compiler for compilation requests. Use it only when debugging native\ncompilation/codegen behavior, and expect failures here to involve sysimage,\nruntime, native-codegen, or compiler-cache interactions.\n\nFor ordinary debugging, prefer reflection activation. Use `[:codegen]` only when\nyou specifically need to test the native compilation backend; for final\nintegration checks, rebuild Julia and test the in-sysimage `Base.Compiler`.\n\n## Testing Compiler as a stdlib package\n\nRun package tests from the repository root with the in-tree Julia runtime:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Pkg; Pkg.test()'\n```\n\nTo run a single test file, include it directly under a `Test.@testset`:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Test; @testset \"inline\" include(\"Compiler/test/inline.jl\")'\n```\n\nMost `Compiler/test/` files include `Compiler/test/setup_Compiler.jl`, which\nactivates or imports the appropriate `Compiler` module for this workflow.\n\n## Testing `Base.Compiler`\n\nUse the top-level test entry point when the goal is to test the `Base.Compiler`\nthat is baked into the sysimage:\n\n```sh\n./usr/bin/julia test/runtests.jl Compiler\n```\n\nIf you changed `Compiler/` and need those changes reflected in `Base.Compiler`,\nrebuild Julia first so the sysimage contains the updated compiler code.\n","doc/src/devdocs/agents/skills/test-changes/SKILL.md":"---\nname: test-changes\ndescription: Run and update Julia tests after changing test files. Use when adding to or modifying any test file under test/ or stdlib/**/test/.\n---\n\n# Julia test changes\n\nUse this when you change or add a Julia test.\n\n- If you have changed a test (e.g. `foo`), run `make test-revise-foo` for the\n  corresponding test to ensure that the test is still passing with your changes.\n- If you are adding a new test, add it to an existing test file. Do not create a\n  new test file unless explicitly instructed.\n- Write one comment at the top of the test to explain what is being tested.\n  Otherwise keep comments minimal.\n- Use the environment variable `JULIA_TEST_FAILFAST=1` to make tests fail fast.\n- Do not coordinate with fixed `sleep`s — loaded CI machines break any fixed\n  delay. Synchronize on observable state (readiness markers, round-trips), or\n  retry.\n","doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md":"---\nname: c-static-analysis\ndescription: Run Clang static analysis on Julia's C/C++ runtime and codegen, and satisfy the GC-rooting checker. Use after modifying runtime/codegen .c/.cpp files under src/ (excluding headers), before opening a PR.\n---\n\n# C/C++ static analysis (src/)\n\nUse this after you modify a runtime/codegen C/C++ source file under `src/` (not\nheaders). Note that runtime changes also require a rebuild (`make -j`).\n\nRun static analysis checks:\n\n- First run `make -C src install-analysis-deps` to initialize dependencies (only\n  needed once the first time, or after the LLVM/Clang toolchain dependencies\n  change). This may download and install LLVM/Clang artifacts.\n- For a source file such as `src/jloptions.c` or `src/codegen.cpp`, use the file\n  stem without the `.c`/`.cpp` extension:\n  ```sh\n  make -C src analyze-<file-stem> -j8 [--output-sync]\n  ```\n  For example, to analyze `src/jloptions.c`, run:\n  ```sh\n  make -C src analyze-jloptions -j8\n  ```\n  Add `--output-sync` when your `make` supports it to keep parallel output\n  grouped; otherwise omit it.\n- Checks can also be rerun individually with `clang-sa-<file-stem>`,\n  `clang-sagc-<file-stem>`, `clang-safety-<file-stem>` or\n  `clang-tidy-<file-stem>`.\n\n## Fixing the GC-rooting checker (clang-sagc)\n\nIf `clang-sagc-<file-stem>` fails, first look for fixes that establish real\nrooting, such as adding appropriate `JL_GC_PUSH`/`JL_GC_POP` scopes, or for\nlock/control-flow fixes.\n\nDo not add `JL_GC_PROMISE_ROOTED` without explicit user or maintainer\nconfirmation. `JL_GC_PROMISE_ROOTED` asserts that a value is already rooted; it\ndoes not root the value. If it appears necessary, stop and ask for confirmation,\nshowing the exact expression, the existing root that makes it safe, and the\nsafepoints considered.\n\n- Remember arguments are assumed rooted, so check the callers to make sure that\n  is handled.\n- As a diagnostic hint when asking for confirmation: if the value is temporarily\n  moved through a struct or arraylist and then reloaded, the promised expression\n  may need to refer to the reloaded field, such as\n  `JL_GC_PROMISE_ROOTED(struct->field)`, immediately after the reload and before\n  any use of that field.\n- If confirmed, put the promise as early in the code as is legal, near the\n  definition or reload rather than the use.\n","doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md":"---\nname: buildkite-logs\ndescription: Fetch and inspect Julia Buildkite CI logs and artifacts without web sign-in, including the TTFX benchmark jobs. Use when debugging Julia CI failures, reviewing Buildkite jobs, investigating a TTFX regression, or when the Buildkite MCP is unavailable.\n---\n\n# Reviewing Buildkite CI logs\n\nUse this when investigating Julia Buildkite CI failures, especially if the\nBuildkite MCP is unavailable. The recipe requires `gh`, `curl`, `python3`, and\nnetwork access to GitHub and Buildkite.\n\nJulia's CI runs on Buildkite. PR builds run in the `julialang/julia-pr`\npipeline, post-merge master builds in `julialang/julia-ci`, and scheduled runs\nin `julialang/julia-master-scheduled` (the old `julia-master` pipeline no\nlonger exists). The public web UI requires sign-in to download `raw_log`, but\ntwo frontend JSON endpoints are anonymously accessible for public pipelines.\nRecipe:\n\n1. Find the build number. `gh pr checks <PR-number>` gives launcher-job URLs\n   like `https://buildkite.com/julialang/julia-pr/builds/<BUILD>#<uuid>`; for a\n   master commit, use the commit statuses\n   (`gh api repos/JuliaLang/julia/commits/<sha>/status`). The `#<uuid>`\n   fragments there are only the top-level launcher jobs (Build/Check/Test/…),\n   not the per-platform jobs.\n\n2. List all jobs in the build, with names, states, exit statuses, and UUIDs:\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/julialang/<PIPELINE>/builds/<BUILD>/data/jobs\" \\\n     -o /tmp/bkjobs.json\n   python3 -c \"import json; [print(j['state'],'|',j.get('exit_status'),'|',j['name'],'|',j['id']) \\\n   for j in json.load(open('/tmp/bkjobs.json'))['records']]\"\n   ```\n\n   This `/data/jobs` endpoint is what the build page's frontend uses; it\n   returns every job in one page (`records`, plus `has_next_page`). Do NOT use\n   `builds/<BUILD>.json` for job discovery — anonymously it returns build\n   metadata with an *empty* `jobs` array (the `statistics` field still shows\n   the true job count).\n\n3. Fetch a job's log JSON (replace `<PIPELINE>`, `<BUILD>`, `<JOB-UUID>`):\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/log\" \\\n     -o /tmp/bk.json\n   ```\n\n   The log text lives under the JSON `output` field, with embedded HTML\n   (`<time>` timestamps, ANSI-as-`<span>` colour) and entity-encoded shell\n   output. Strip with e.g.:\n\n   ```sh\n   python3 -c \"import json,re,html; s=json.load(open('/tmp/bk.json'))['output']; \\\n   s=re.sub(r'<[^>]+>','',s); print(html.unescape(s))\" > /tmp/bk.txt\n   ```\n\n   Write the stripped log to a file and search it (logs can be hundreds of KB);\n   piping the whole thing into context wastes tokens.\n\n4. List and download a job's artifacts. The same frontend serves the artifact\n   list as JSON, and each artifact's URL redirects to a signed S3 URL that is\n   valid for ten minutes, so `curl -L` downloads it.\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/artifacts\" \\\n     -o /tmp/bkart.json\n   python3 -c \"import json; [print(a['path'],'|',a['file_size'],'|',a['url']) for a in json.load(open('/tmp/bkart.json'))]\"\n   curl -sSL -H \"Accept: application/json\" \"https://buildkite.com<url-from-listing>\" -o /tmp/<name>\n   ```\n\nThe log endpoint also serves still-running jobs (partial output). For a test\njob that hung, the in-tree watchdog (`.buildkite/utilities/timeout.jl`,\n`JL_TERM_TIMEOUT`) prints per-task Julia backtraces of every worker before\nkilling it, and core dumps are uploaded as artifacts with an `lldb bt all`\nsummary in the log — search the log for `---- Task`, `Waiting for`, and\n`core dumped`.\n\n## TTFX benchmark jobs\n\nThe `TTFX` group's macOS job runs the\n[Julia-TTFX-Snippets](https://github.com/tecosaur/Julia-TTFX-Snippets) tasks\nagainst the build: on pull requests compared with the master build of the\nmerge-base, on master builds alone (the data behind\n<https://perf.julialang.org/?tab=ci-ttfx>). Its results, report and\ntrace-compile logs are job artifacts (step 4). What they contain and how the\ncomparison is judged is documented with the driver in JuliaCI/julia-buildkite,\n`utilities/ttfx/README.md`.\n","doc/src/devdocs/agents/README.md":"# Agent Skills\n\nJulia keeps canonical project-local Agent Skills under\n`doc/src/devdocs/agents/skills/`. These files follow the\n[Agent Skills](https://agentskills.io) `SKILL.md` format.\n\nThe `.agents/skills/` and `.claude/skills/` entries are symlinks to the canonical\nskills directory for automatic discovery by skills-aware agents. Do not edit\nthrough those discovery paths directly; edit the canonical `SKILL.md` under\n`doc/src/devdocs/agents/skills/`.\n\nThe documentation build renders each canonical `SKILL.md` with its Agent Skill metadata:\n\n- [`doctests`](skills/doctests/index.md) — writing and verifying `jldoctest` code blocks.\n- [`test-changes`](skills/test-changes/index.md) — running and updating tests after changing them.\n- [`c-static-analysis`](skills/c-static-analysis/index.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`external-deps`](skills/external-deps/index.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`buildkite-logs`](skills/buildkite-logs/index.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`ci-timing`](skills/ci-timing/index.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`compiler-jl`](skills/compiler-jl/index.md) — developing and testing Compiler.jl.\n- [`julia-syntax-lowering`](skills/julia-syntax-lowering/index.md) — developing and testing JuliaSyntax and JuliaLowering.\n","CLAUDE.md":"<!--\n\nInclude the contents of AGENTS.md\n\nhttps://code.claude.com/docs/en/claude-code-on-the-web#best-practices\n\n-->\n\n@AGENTS.md\n","AGENTS.md":"# Information for AI agents\n\n## Module Organization\n- [`base/`](base/) - Core standard library (loaded at startup)\n- [`stdlib/`](stdlib/) - Standard library packages (can be loaded independently)\n- [`Compiler/`](Compiler/) - Julia compiler as a separate module (can be swapped)\n- [`src/`](src/) - C/C++ runtime and LLVM codegen\n- [`cli/`](cli/) - Command-line interface and loader\n- [`doc/`](doc/) - Documentation and User Manual\n\n## Running Julia\n\nYou should have a recent binary copy of julia in your `$HOME/.juliaup/bin` directory.\nYou may use this julia executable for validation.\nIf a built version of Julia exists in the current source tree (at `usr/bin/julia`),\nprefer that version.\nNote that any changes you make to the source code after the binary is built\nwill not be reflected, unless you use `Revise`.\n\n## For all changes\n\n1. Sign off every commit you create with an `Assisted-by: <tool> (<model>)` trailer naming both the\n   tool and the model behind it, for example `Assisted-by: Claude Code (Opus 5)`. Name the model,\n   not just the harness - it is what tells a later reader what actually produced the work. Do not\n   use `Co-authored-by:` for tools, and do not list a tool as an author; this trailer replaces any\n   co-author trailer your harness adds by default.\n2. Agents can only open PRs or post comments once the human user gives them explicit permission.\n\n## Building Julia\n\nIf you made changes to the runtime (any files in `src/`), you will need to rebuild\njulia. Run `make -j` to rebuild julia. This process may take up to 10 minutes\ndepending on your changes.\n\nAfter modifying any C/C++ file under `src/`, also run the Clang static analysis\nchecks — see the `c-static-analysis` skill ([`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md)).\n\n### Testing LLVM-related changes\n\nWhen making changes to LLVM passes or codegen, add `LLVM_ASSERTIONS=1` to `Make.user` to enable\nLLVM assertions. This helps catch IR verification errors early:\n\n```bash\necho \"LLVM_ASSERTIONS=1\" >> Make.user\n```\n\nTo run LLVM pass tests:\n```bash\nmake -C test/llvmpasses <testname>.ll\n```\n\n## Using Revise\n\nIf you have made changes to files included in the system image (base/ or stdlib/),\nand need to run code with these changes included, you can use `Revise`.\nTo do so, run `using Revise; Revise.track(Base)` (or Revise.track with the stdlib you modified).\nThe test system supports doing this automatically.\n\nFor instance testing Base changes without rebuilding, using failfast, you can run:\n```\nJULIA_TEST_FAILFAST=1 ./julia -e 'using Revise; Revise.track(Base); include(\"test.jl\")'\n```\n\n## Writing code\n\nAfter writing code, look up the docstring for each function you used. If there\nare recommendations or additional considerations that apply to these functions,\nmake sure to take them into account.\n\n- Do not `ccall` runtime C functions directly if there are existing wrappers for the function.\n- Do not explicitly add a module prefix if the code you're adding is in the same module. E.g. do not use `Base.` for code in Base unless required.\n\n## Task-specific skills\n\nDetailed, situational procedures are provided as Agent Skills following the\n[agentskills.io](https://agentskills.io) open standard. The canonical location is\n`doc/src/devdocs/agents/skills/`; `.agents/skills/` and `.claude/skills/` are\nsymlinks to that directory so skills-aware agents can discover the skills\nautomatically. Agents that support the standard load each skill's `description`\nautomatically and pull in the full `SKILL.md` when relevant; otherwise read the\ncanonical `SKILL.md` directly.\n\n- [`doc/src/devdocs/agents/skills/doctests/`](doc/src/devdocs/agents/skills/doctests/SKILL.md) — writing and verifying `jldoctest` code blocks.\n- [`doc/src/devdocs/agents/skills/test-changes/`](doc/src/devdocs/agents/skills/test-changes/SKILL.md) — running and updating tests after changing them.\n- [`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`doc/src/devdocs/agents/skills/external-deps/`](doc/src/devdocs/agents/skills/external-deps/SKILL.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`doc/src/devdocs/agents/skills/buildkite-logs/`](doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`doc/src/devdocs/agents/skills/ci-timing/`](doc/src/devdocs/agents/skills/ci-timing/SKILL.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`doc/src/devdocs/agents/skills/compiler-jl/`](doc/src/devdocs/agents/skills/compiler-jl/SKILL.md) — developing and testing Compiler.jl.\n- [`doc/src/devdocs/agents/skills/julia-syntax-lowering/`](doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md) — developing and testing JuliaSyntax and JuliaLowering.\n\n## Commit messages and pull requests\n\nWhen writing commit messages, follow the format \"component: Brief summary\" for\nthe title. In the body of the commit message, provide a brief prose summary\nof the purpose of the changes made. Do not specifically mention added tests, comments,\ndocumentation, etc., unless this is the main purpose of the change. Do not mention\nthe test plan, unless it differs from what you were instructed to do in AGENTS.md.\nIf your change fixes one or more issues, use the syntax \"Fixes #\" at the end of the commit message, but do not include it in the title.\n\nWhen referencing external GitHub PRs or issues, use proper GitHub interlinking format (e.g., `owner/repo#123` for PRs/issues).\nWhen fixing CI failures, include the link to the specific CI failure in the commit message.\nAlways quote macro names in backticks in commit messages and PR titles/bodies (e.g. `` `@inbounds` ``, not @inbounds), so GitHub does not notify the unrelated user with that handle.\n\nWhen preparing a pull request for the human author to open, draft the body as follows, expecting\nthem to reword it:\n1. If the pull request consists of one commit only, use the body of the commit for the body of the pull request.\n2. If there are multiple commits in the pull request, follow the same guidelines for the pull request as for the commit body.\n3. Make sure that the base commit of the pull request is recent (within the past two days) - if not rebase your changes first.\n4. If a separate tool reviews the commit, this is useful to note. Encourage the human to state how carefully they read and understood the content also, for example, by drafting the text to say the human author has *not* read any of it, and expecting they will update that once they read that disclaimer.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# Information for AI agents\n\n## Module Organization\n- [`base/`](base/) - Core standard library (loaded at startup)\n- [`stdlib/`](stdlib/) - Standard library packages (can be loaded independently)\n- [`Compiler/`](Compiler/) - Julia compiler as a separate module (can be swapped)\n- [`src/`](src/) - C/C++ runtime and LLVM codegen\n- [`cli/`](cli/) - Command-line interface and loader\n- [`doc/`](doc/) - Documentation and User Manual\n\n## Running Julia\n\nYou should have a recent binary copy of julia in your `$HOME/.juliaup/bin` directory.\nYou may use this julia executable for validation.\nIf a built version of Julia exists in the current source tree (at `usr/bin/julia`),\nprefer that version.\nNote that any changes you make to the source code after the binary is built\nwill not be reflected, unless you use `Revise`.\n\n## For all changes\n\n1. Sign off every commit you create with an `Assisted-by: <tool> (<model>)` trailer naming both the\n   tool and the model behind it, for example `Assisted-by: Claude Code (Opus 5)`. Name the model,\n   not just the harness - it is what tells a later reader what actually produced the work. Do not\n   use `Co-authored-by:` for tools, and do not list a tool as an author; this trailer replaces any\n   co-author trailer your harness adds by default.\n2. Agents can only open PRs or post comments once the human user gives them explicit permission.\n\n## Building Julia\n\nIf you made changes to the runtime (any files in `src/`), you will need to rebuild\njulia. Run `make -j` to rebuild julia. This process may take up to 10 minutes\ndepending on your changes.\n\nAfter modifying any C/C++ file under `src/`, also run the Clang static analysis\nchecks — see the `c-static-analysis` skill ([`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md)).\n\n### Testing LLVM-related changes\n\nWhen making changes to LLVM passes or codegen, add `LLVM_ASSERTIONS=1` to `Make.user` to enable\nLLVM assertions. This helps catch IR verification errors early:\n\n```bash\necho \"LLVM_ASSERTIONS=1\" >> Make.user\n```\n\nTo run LLVM pass tests:\n```bash\nmake -C test/llvmpasses <testname>.ll\n```\n\n## Using Revise\n\nIf you have made changes to files included in the system image (base/ or stdlib/),\nand need to run code with these changes included, you can use `Revise`.\nTo do so, run `using Revise; Revise.track(Base)` (or Revise.track with the stdlib you modified).\nThe test system supports doing this automatically.\n\nFor instance testing Base changes without rebuilding, using failfast, you can run:\n```\nJULIA_TEST_FAILFAST=1 ./julia -e 'using Revise; Revise.track(Base); include(\"test.jl\")'\n```\n\n## Writing code\n\nAfter writing code, look up the docstring for each function you used. If there\nare recommendations or additional considerations that apply to these functions,\nmake sure to take them into account.\n\n- Do not `ccall` runtime C functions directly if there are existing wrappers for the function.\n- Do not explicitly add a module prefix if the code you're adding is in the same module. E.g. do not use `Base.` for code in Base unless required.\n\n## Task-specific skills\n\nDetailed, situational procedures are provided as Agent Skills following the\n[agentskills.io](https://agentskills.io) open standard. The canonical location is\n`doc/src/devdocs/agents/skills/`; `.agents/skills/` and `.claude/skills/` are\nsymlinks to that directory so skills-aware agents can discover the skills\nautomatically. Agents that support the standard load each skill's `description`\nautomatically and pull in the full `SKILL.md` when relevant; otherwise read the\ncanonical `SKILL.md` directly.\n\n- [`doc/src/devdocs/agents/skills/doctests/`](doc/src/devdocs/agents/skills/doctests/SKILL.md) — writing and verifying `jldoctest` code blocks.\n- [`doc/src/devdocs/agents/skills/test-changes/`](doc/src/devdocs/agents/skills/test-changes/SKILL.md) — running and updating tests after changing them.\n- [`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`doc/src/devdocs/agents/skills/external-deps/`](doc/src/devdocs/agents/skills/external-deps/SKILL.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`doc/src/devdocs/agents/skills/buildkite-logs/`](doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`doc/src/devdocs/agents/skills/ci-timing/`](doc/src/devdocs/agents/skills/ci-timing/SKILL.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`doc/src/devdocs/agents/skills/compiler-jl/`](doc/src/devdocs/agents/skills/compiler-jl/SKILL.md) — developing and testing Compiler.jl.\n- [`doc/src/devdocs/agents/skills/julia-syntax-lowering/`](doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md) — developing and testing JuliaSyntax and JuliaLowering.\n\n## Commit messages and pull requests\n\nWhen writing commit messages, follow the format \"component: Brief summary\" for\nthe title. In the body of the commit message, provide a brief prose summary\nof the purpose of the changes made. Do not specifically mention added tests, comments,\ndocumentation, etc., unless this is the main purpose of the change. Do not mention\nthe test plan, unless it differs from what you were instructed to do in AGENTS.md.\nIf your change fixes one or more issues, use the syntax \"Fixes #\" at the end of the commit message, but do not include it in the title.\n\nWhen referencing external GitHub PRs or issues, use proper GitHub interlinking format (e.g., `owner/repo#123` for PRs/issues).\nWhen fixing CI failures, include the link to the specific CI failure in the commit message.\nAlways quote macro names in backticks in commit messages and PR titles/bodies (e.g. `` `@inbounds` ``, not @inbounds), so GitHub does not notify the unrelated user with that handle.\n\nWhen preparing a pull request for the human author to open, draft the body as follows, expecting\nthem to reword it:\n1. If the pull request consists of one commit only, use the body of the commit for the body of the pull request.\n2. If there are multiple commits in the pull request, follow the same guidelines for the pull request as for the commit body.\n3. Make sure that the base commit of the pull request is recent (within the past two days) - if not rebase your changes first.\n4. If a separate tool reviews the commit, this is useful to note. Encourage the human to state how carefully they read and understood the content also, for example, by drafting the text to say the human author has *not* read any of it, and expecting they will update that once they read that disclaimer.\n","isInternal":false,"tokens":1641,"sizeBytes":6725},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md","title":"buildkite-logs","category":"anthropic-skill","format":"markdown","content":"---\nname: buildkite-logs\ndescription: Fetch and inspect Julia Buildkite CI logs and artifacts without web sign-in, including the TTFX benchmark jobs. Use when debugging Julia CI failures, reviewing Buildkite jobs, investigating a TTFX regression, or when the Buildkite MCP is unavailable.\n---\n\n# Reviewing Buildkite CI logs\n\nUse this when investigating Julia Buildkite CI failures, especially if the\nBuildkite MCP is unavailable. The recipe requires `gh`, `curl`, `python3`, and\nnetwork access to GitHub and Buildkite.\n\nJulia's CI runs on Buildkite. PR builds run in the `julialang/julia-pr`\npipeline, post-merge master builds in `julialang/julia-ci`, and scheduled runs\nin `julialang/julia-master-scheduled` (the old `julia-master` pipeline no\nlonger exists). The public web UI requires sign-in to download `raw_log`, but\ntwo frontend JSON endpoints are anonymously accessible for public pipelines.\nRecipe:\n\n1. Find the build number. `gh pr checks <PR-number>` gives launcher-job URLs\n   like `https://buildkite.com/julialang/julia-pr/builds/<BUILD>#<uuid>`; for a\n   master commit, use the commit statuses\n   (`gh api repos/JuliaLang/julia/commits/<sha>/status`). The `#<uuid>`\n   fragments there are only the top-level launcher jobs (Build/Check/Test/…),\n   not the per-platform jobs.\n\n2. List all jobs in the build, with names, states, exit statuses, and UUIDs:\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/julialang/<PIPELINE>/builds/<BUILD>/data/jobs\" \\\n     -o /tmp/bkjobs.json\n   python3 -c \"import json; [print(j['state'],'|',j.get('exit_status'),'|',j['name'],'|',j['id']) \\\n   for j in json.load(open('/tmp/bkjobs.json'))['records']]\"\n   ```\n\n   This `/data/jobs` endpoint is what the build page's frontend uses; it\n   returns every job in one page (`records`, plus `has_next_page`). Do NOT use\n   `builds/<BUILD>.json` for job discovery — anonymously it returns build\n   metadata with an *empty* `jobs` array (the `statistics` field still shows\n   the true job count).\n\n3. Fetch a job's log JSON (replace `<PIPELINE>`, `<BUILD>`, `<JOB-UUID>`):\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/log\" \\\n     -o /tmp/bk.json\n   ```\n\n   The log text lives under the JSON `output` field, with embedded HTML\n   (`<time>` timestamps, ANSI-as-`<span>` colour) and entity-encoded shell\n   output. Strip with e.g.:\n\n   ```sh\n   python3 -c \"import json,re,html; s=json.load(open('/tmp/bk.json'))['output']; \\\n   s=re.sub(r'<[^>]+>','',s); print(html.unescape(s))\" > /tmp/bk.txt\n   ```\n\n   Write the stripped log to a file and search it (logs can be hundreds of KB);\n   piping the whole thing into context wastes tokens.\n\n4. List and download a job's artifacts. The same frontend serves the artifact\n   list as JSON, and each artifact's URL redirects to a signed S3 URL that is\n   valid for ten minutes, so `curl -L` downloads it.\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/artifacts\" \\\n     -o /tmp/bkart.json\n   python3 -c \"import json; [print(a['path'],'|',a['file_size'],'|',a['url']) for a in json.load(open('/tmp/bkart.json'))]\"\n   curl -sSL -H \"Accept: application/json\" \"https://buildkite.com<url-from-listing>\" -o /tmp/<name>\n   ```\n\nThe log endpoint also serves still-running jobs (partial output). For a test\njob that hung, the in-tree watchdog (`.buildkite/utilities/timeout.jl`,\n`JL_TERM_TIMEOUT`) prints per-task Julia backtraces of every worker before\nkilling it, and core dumps are uploaded as artifacts with an `lldb bt all`\nsummary in the log — search the log for `---- Task`, `Waiting for`, and\n`core dumped`.\n\n## TTFX benchmark jobs\n\nThe `TTFX` group's macOS job runs the\n[Julia-TTFX-Snippets](https://github.com/tecosaur/Julia-TTFX-Snippets) tasks\nagainst the build: on pull requests compared with the master build of the\nmerge-base, on master builds alone (the data behind\n<https://perf.julialang.org/?tab=ci-ttfx>). Its results, report and\ntrace-compile logs are job artifacts (step 4). What they contain and how the\ncomparison is judged is documented with the driver in JuliaCI/julia-buildkite,\n`utilities/ttfx/README.md`.\n","frontmatter":{"name":"buildkite-logs","description":"Fetch and inspect Julia Buildkite CI logs and artifacts without web sign-in, including the TTFX benchmark jobs. Use when debugging Julia CI failures, reviewing Buildkite jobs, investigating a TTFX regression, or when the Buildkite MCP is unavailable."},"isInternal":false,"tokens":1200,"sizeBytes":4314},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md","title":"c-static-analysis","category":"anthropic-skill","format":"markdown","content":"---\nname: c-static-analysis\ndescription: Run Clang static analysis on Julia's C/C++ runtime and codegen, and satisfy the GC-rooting checker. Use after modifying runtime/codegen .c/.cpp files under src/ (excluding headers), before opening a PR.\n---\n\n# C/C++ static analysis (src/)\n\nUse this after you modify a runtime/codegen C/C++ source file under `src/` (not\nheaders). Note that runtime changes also require a rebuild (`make -j`).\n\nRun static analysis checks:\n\n- First run `make -C src install-analysis-deps` to initialize dependencies (only\n  needed once the first time, or after the LLVM/Clang toolchain dependencies\n  change). This may download and install LLVM/Clang artifacts.\n- For a source file such as `src/jloptions.c` or `src/codegen.cpp`, use the file\n  stem without the `.c`/`.cpp` extension:\n  ```sh\n  make -C src analyze-<file-stem> -j8 [--output-sync]\n  ```\n  For example, to analyze `src/jloptions.c`, run:\n  ```sh\n  make -C src analyze-jloptions -j8\n  ```\n  Add `--output-sync` when your `make` supports it to keep parallel output\n  grouped; otherwise omit it.\n- Checks can also be rerun individually with `clang-sa-<file-stem>`,\n  `clang-sagc-<file-stem>`, `clang-safety-<file-stem>` or\n  `clang-tidy-<file-stem>`.\n\n## Fixing the GC-rooting checker (clang-sagc)\n\nIf `clang-sagc-<file-stem>` fails, first look for fixes that establish real\nrooting, such as adding appropriate `JL_GC_PUSH`/`JL_GC_POP` scopes, or for\nlock/control-flow fixes.\n\nDo not add `JL_GC_PROMISE_ROOTED` without explicit user or maintainer\nconfirmation. `JL_GC_PROMISE_ROOTED` asserts that a value is already rooted; it\ndoes not root the value. If it appears necessary, stop and ask for confirmation,\nshowing the exact expression, the existing root that makes it safe, and the\nsafepoints considered.\n\n- Remember arguments are assumed rooted, so check the callers to make sure that\n  is handled.\n- As a diagnostic hint when asking for confirmation: if the value is temporarily\n  moved through a struct or arraylist and then reloaded, the promised expression\n  may need to refer to the reloaded field, such as\n  `JL_GC_PROMISE_ROOTED(struct->field)`, immediately after the reload and before\n  any use of that field.\n- If confirmed, put the promise as early in the code as is legal, near the\n  definition or reload rather than the use.\n","frontmatter":{"name":"c-static-analysis","description":"Run Clang static analysis on Julia's C/C++ runtime and codegen, and satisfy the GC-rooting checker. Use after modifying runtime/codegen .c/.cpp files under src/ (excluding headers), before opening a PR."},"isInternal":false,"tokens":610,"sizeBytes":2324},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/ci-timing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/ci-timing/SKILL.md","title":"ci-timing","category":"anthropic-skill","format":"markdown","content":"---\nname: ci-timing\ndescription: Compare a Julia PR's Buildkite job durations against recent CI history (per-job mean/min/max over the last N days). Use when asked whether a PR slows down or speeds up CI, or to check a build's timings against the weekly baseline.\n---\n\n# CI timing analysis\n\n```sh\njulia --startup-file=no --project=contrib/ci-timing contrib/ci-timing/ci_timing_compare.jl <PR-number>\n```\n\nPrints a markdown table, slowest job first, plus a TOTAL row: each job's duration\nin the PR's `julia-pr` build vs. the mean/min/max of the same job name over the\nlast 7 days of [julia-ci-timing](https://github.com/JuliaCI/julia-ci-timing)\nhistory. `⚠️` = above the weekly max, `✅` = below the weekly min. No Buildkite\ntoken needed; `gh` is only needed to turn a PR number into a build.\n\nFlags: `--build julia-pr/853`, `--days N`, `--include-failed`, `--min-seconds N`\n(hides short jobs).\n\nCaveats when reading it:\n\n- One build vs. a week of samples — anything inside the min/max band is agent\n  variance, and even ⚠️/✅ rows need a second build to mean anything.\n- `juliasyntax`/`Launch *` jobs are seconds long, so their percentages are noise;\n  `--min-seconds 120` drops them.\n- A fleet-wide shift in one direction skews TOTAL and is not a PR effect.\n- Broken (never run), running, and superseded retry jobs are excluded; a failed\n  job's time is cut short or stretched by the failure.\n\nFor logs behind a slow or failed job, see the `buildkite-logs` skill.\n","frontmatter":{"name":"ci-timing","description":"Compare a Julia PR's Buildkite job durations against recent CI history (per-job mean/min/max over the last N days). Use when asked whether a PR slows down or speeds up CI, or to check a build's timings against the weekly baseline."},"isInternal":false,"tokens":404,"sizeBytes":1477},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/compiler-jl/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/compiler-jl/SKILL.md","title":"compiler-jl","category":"anthropic-skill","format":"markdown","content":"---\nname: compiler-jl\ndescription: Develop and test Julia's Compiler.jl. Use when modifying Compiler/, debugging compiler behavior, or activating stdlib Compiler for reflection/native-codegen experiments instead of using sysimage Base.Compiler.\n---\n\n# Compiler.jl development\n\nUse this when modifying `Compiler/` source, tests, or package metadata.\n\n## Compiler modules in Julia\n\nDuring bootstrap, `Compiler/` is built into the sysimage as `Base.Compiler`.\nThat in-sysimage compiler is what Julia normally uses for native compilation.\nBecause it is baked into the sysimage, changes made to `Compiler/` after the\nsysimage was built are not reflected in `Base.Compiler` unless Julia is rebuilt.\n\n`Compiler/` can also be loaded as a stdlib package, producing a separate\n`Compiler` module from `Base.Compiler`. For day-to-day development, testing, and\ndebugging of post-sysimage source changes, prefer this stdlib `Compiler` module\nover trying to replace `Base.Compiler` with Revise. It is usually reliable except\nfor failures caused by compatibility with the `src/` runtime or other\nsysimage/native-codegen integration issues.\n\nWhen investigating a runtime compatibility issue, `make -C src` can update the\nruntime faster than rebuilding the full Julia sysimage. Rebuild Julia when the\nupdated `Compiler/` code needs to be baked into `Base.Compiler` or when checking\nsysimage/native-codegen integration.\n\n## Experimenting with Compiler as a stdlib\n\nRun the in-tree Julia runtime with the `Compiler` project:\n\n```sh\n./usr/bin/julia --project=Compiler\n```\n\n### Reflection backend\n\nFor reflection-oriented debugging, activate the stdlib `Compiler` module:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler\n```\n\n`@activate Compiler` is equivalent to `@activate Compiler[:reflection]`: Base and\nInteractiveUtils reflection utilities such as `code_typed`, `@code_typed`, and\n`code_warntype` will use the loaded stdlib `Compiler` module. This is useful for\ntrying compiler changes without rebuilding the sysimage.\n\n### Native compilation backend\n\nIf you specifically need to exercise the loaded stdlib `Compiler` as the native\ncompilation backend, use:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler[:codegen]\n```\n\nThis is broader than reflection activation: it makes the runtime invoke the\nloaded compiler for compilation requests. Use it only when debugging native\ncompilation/codegen behavior, and expect failures here to involve sysimage,\nruntime, native-codegen, or compiler-cache interactions.\n\nFor ordinary debugging, prefer reflection activation. Use `[:codegen]` only when\nyou specifically need to test the native compilation backend; for final\nintegration checks, rebuild Julia and test the in-sysimage `Base.Compiler`.\n\n## Testing Compiler as a stdlib package\n\nRun package tests from the repository root with the in-tree Julia runtime:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Pkg; Pkg.test()'\n```\n\nTo run a single test file, include it directly under a `Test.@testset`:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Test; @testset \"inline\" include(\"Compiler/test/inline.jl\")'\n```\n\nMost `Compiler/test/` files include `Compiler/test/setup_Compiler.jl`, which\nactivates or imports the appropriate `Compiler` module for this workflow.\n\n## Testing `Base.Compiler`\n\nUse the top-level test entry point when the goal is to test the `Base.Compiler`\nthat is baked into the sysimage:\n\n```sh\n./usr/bin/julia test/runtests.jl Compiler\n```\n\nIf you changed `Compiler/` and need those changes reflected in `Base.Compiler`,\nrebuild Julia first so the sysimage contains the updated compiler code.\n","frontmatter":{"name":"compiler-jl","description":"Develop and test Julia's Compiler.jl. Use when modifying Compiler/, debugging compiler behavior, or activating stdlib Compiler for reflection/native-codegen experiments instead of using sysimage Base.Compiler."},"isInternal":false,"tokens":803,"sizeBytes":3626},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/doctests/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/doctests/SKILL.md","title":"doctests","category":"anthropic-skill","format":"markdown","content":"---\nname: doctests\ndescription: Write and verify Julia `jldoctest` code blocks. Use whenever adding or changing a `jldoctest` block in a docstring (base/, stdlib/, Compiler/) or under doc/, and before opening a PR that touches doctests.\n---\n\n# Julia doctests\n\nUse this whenever you add or modify any `jldoctest` code block.\n\n## Writing\n\nBefore writing new doctests, review `doc/src/devdocs/contributing/jldoctests.md`\nfor best practices (filters, labels, setup code).\n\n## Verifying\n\nIf you changed any `jldoctest` block you MUST verify it. Follow these steps for\nEVERY doctest change:\n\n1. Review `doc/src/devdocs/contributing/jldoctests.md`. In particular, determine\n   if any of the changed doctests require filters, labels or setup code.\n2. Run the doctests to verify that your change works:\n   - To run doctest with the pre-built juliaup: `make -C doc doctest=true revise=true JULIA_EXECUTABLE=$HOME/.juliaup/bin/julia`\n   - To run doctest with in-tree julia (preferred): `make -C doc doctest=true revise=true`. Do not pass any other options.\n   - IMPORTANT: The doctests may take up to 15 minutes. Do NOT terminate the doctests before completion. Do NOT use a timeout for doctests.\n   - If you are ChatGPT, you may have to increase yield_timeout_ms.\n","frontmatter":{"name":"doctests","description":"Write and verify Julia `jldoctest` code blocks. Use whenever adding or changing a `jldoctest` block in a docstring (base/, stdlib/, Compiler/) or under doc/, and before opening a PR that touches doctests."},"isInternal":false,"tokens":331,"sizeBytes":1254},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/external-deps/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/external-deps/SKILL.md","title":"external-deps","category":"anthropic-skill","format":"markdown","content":"---\nname: external-deps\ndescription: Modify Julia's external dependencies and JLLs — patches under deps/patches/, version bumps in deps/, and JLL updates. Use when touching deps/ or any *_jll folder, including refreshing checksums.\n---\n\n# External dependencies & JLLs\n\nUse this when modifying `deps/`, dependency patches, or a JLL.\n\n## External dependencies (deps/, deps/patches/)\n\nWhen modifying external dependencies (patches in `deps/patches/` or version\nupdates in `deps/`):\n\n1. Always test builds with `USE_BINARYBUILDER=0` to ensure source builds work correctly.\n2. For patches to external libraries:\n   - Verify the patch applies cleanly by running the extraction and patch steps.\n   - Test the full build of the dependency: `make -C deps USE_BINARYBUILDER=0 compile-<depname>`.\n   - Prefer using the full upstream commit in `git am` format (e.g., `git format-patch`) which includes proper commit metadata.\n3. When updating dependency versions, ensure all associated patches still apply.\n\n## External JLLs\n\nTo update a JLL to the latest version:\n\n- Update the version number in the appropriate jll folder.\n- If the dependencies in the upstream jll changed, update the `Project.toml`.\n- Run `make -f contrib/refresh_checksums.mk <jll>` to update the checksums. This may take a few minutes.\n","frontmatter":{"name":"external-deps","description":"Modify Julia's external dependencies and JLLs — patches under deps/patches/, version bumps in deps/, and JLL updates. Use when touching deps/ or any *_jll folder, including refreshing checksums."},"isInternal":false,"tokens":302,"sizeBytes":1298},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md","title":"julia-syntax-lowering","category":"anthropic-skill","format":"markdown","content":"---\nname: julia-syntax-lowering\ndescription: Develop and test JuliaSyntax and JuliaLowering in Julia's source tree. Use when modifying JuliaSyntax/ or JuliaLowering/, running package or targeted tests, or checking JuliaLowering execution.\n---\n\n# JuliaSyntax & JuliaLowering development\n\nUse this when modifying `JuliaSyntax/` or `JuliaLowering/` source, tests, or\npackage metadata.\n\n## Testing JuliaSyntax\n\nRun package tests from the repository root:\n\n```sh\njulia --project=JuliaSyntax -e 'using Pkg; Pkg.test()'\n```\n\n`JuliaSyntax` is not tied only to the in-tree Julia runtime; if a change may be\nversion-sensitive, test it with the relevant installed Julia version(s).\n\n## Testing JuliaLowering\n\nPrefer the in-tree Julia runtime because compatibility with the Julia runtime\nmay matter:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'using Pkg; Pkg.test()'\n```\n\nIf `./usr/bin/julia` is unavailable, note that limitation and use an available\n`julia` executable only for preliminary validation.\n\nIn this repository, `JuliaLowering/Project.toml` points its `JuliaSyntax`\ndependency at the sibling `JuliaSyntax` checkout\n(`path = \"../JuliaSyntax\"`). Therefore, `JuliaSyntax` changes can affect\n`JuliaLowering`. When a `JuliaSyntax` change may affect lowering behavior or\nsyntax data consumed by `JuliaLowering`, run the `JuliaLowering` test command as\nwell.\n\n### Targeted JuliaLowering tests\n\nFor targeted `JuliaLowering` test execution, include\n`JuliaLowering/test/utils.jl` before the test file, matching\n`JuliaLowering/test/runtests.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); include(\"scopes.jl\"); end'\n```\n\nFor `_ir.jl` fixtures, call `test_ir_cases` after loading `utils.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); test_ir_cases(\"scopes_ir.jl\"); end'\n```\n\n## Trying JuliaLowering execution\n\nFor quick execution checks, run with the in-tree Julia runtime and the\n`JuliaLowering` project:\n\n```sh\n./usr/bin/julia --project=JuliaLowering\n```\n\nThen either evaluate code explicitly through `JuliaLowering`:\n\n```julia\nusing JuliaLowering\nJuliaLowering.include_string(Main, \"1 + 2\")\n```\n\nor activate `JuliaLowering` as the process lowerer, then evaluate subsequent\ncode normally:\n\n```julia\nusing JuliaLowering\nJuliaLowering.activate!()\n\n1 + 2\n```\n\nUse `include(\"path/to/file.jl\")` after activation when checking a file. When\nusing `JuliaLowering.activate!()` from `-e`, make the code under test a separate\ntop-level statement after activation, or put it in `include(...)`.\n","frontmatter":{"name":"julia-syntax-lowering","description":"Develop and test JuliaSyntax and JuliaLowering in Julia's source tree. Use when modifying JuliaSyntax/ or JuliaLowering/, running package or targeted tests, or checking JuliaLowering execution."},"isInternal":false,"tokens":685,"sizeBytes":2596},{"name":"SKILL.md","path":"doc/src/devdocs/agents/skills/test-changes/SKILL.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/skills/test-changes/SKILL.md","title":"test-changes","category":"anthropic-skill","format":"markdown","content":"---\nname: test-changes\ndescription: Run and update Julia tests after changing test files. Use when adding to or modifying any test file under test/ or stdlib/**/test/.\n---\n\n# Julia test changes\n\nUse this when you change or add a Julia test.\n\n- If you have changed a test (e.g. `foo`), run `make test-revise-foo` for the\n  corresponding test to ensure that the test is still passing with your changes.\n- If you are adding a new test, add it to an existing test file. Do not create a\n  new test file unless explicitly instructed.\n- Write one comment at the top of the test to explain what is being tested.\n  Otherwise keep comments minimal.\n- Use the environment variable `JULIA_TEST_FAILFAST=1` to make tests fail fast.\n- Do not coordinate with fixed `sleep`s — loaded CI machines break any fixed\n  delay. Synchronize on observable state (readiness markers, round-trips), or\n  retry.\n","frontmatter":{"name":"test-changes","description":"Run and update Julia tests after changing test files. Use when adding to or modifying any test file under test/ or stdlib/**/test/."},"isInternal":false,"tokens":211,"sizeBytes":885},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"<!--\n\nInclude the contents of AGENTS.md\n\nhttps://code.claude.com/docs/en/claude-code-on-the-web#best-practices\n\n-->\n\n@AGENTS.md\n","isInternal":false,"tokens":37,"sizeBytes":128},{"name":"README.md","path":"doc/src/devdocs/agents/README.md","rawUrl":"https://raw.githubusercontent.com/JuliaLang/julia/HEAD/doc/src/devdocs/agents/README.md","title":"Subagent: readme","category":"subagent-persona","format":"markdown","content":"# Agent Skills\n\nJulia keeps canonical project-local Agent Skills under\n`doc/src/devdocs/agents/skills/`. These files follow the\n[Agent Skills](https://agentskills.io) `SKILL.md` format.\n\nThe `.agents/skills/` and `.claude/skills/` entries are symlinks to the canonical\nskills directory for automatic discovery by skills-aware agents. Do not edit\nthrough those discovery paths directly; edit the canonical `SKILL.md` under\n`doc/src/devdocs/agents/skills/`.\n\nThe documentation build renders each canonical `SKILL.md` with its Agent Skill metadata:\n\n- [`doctests`](skills/doctests/index.md) — writing and verifying `jldoctest` code blocks.\n- [`test-changes`](skills/test-changes/index.md) — running and updating tests after changing them.\n- [`c-static-analysis`](skills/c-static-analysis/index.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`external-deps`](skills/external-deps/index.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`buildkite-logs`](skills/buildkite-logs/index.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`ci-timing`](skills/ci-timing/index.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`compiler-jl`](skills/compiler-jl/index.md) — developing and testing Compiler.jl.\n- [`julia-syntax-lowering`](skills/julia-syntax-lowering/index.md) — developing and testing JuliaSyntax and JuliaLowering.\n","isInternal":false,"tokens":348,"sizeBytes":1435}],"systemPromptSnippet":"<yakaai_skills repo=\"JuliaLang/julia\">\n<!-- File: AGENTS.md (Tokens: ~1641 | Category: root-instruction) -->\n# Information for AI agents\n\n## Module Organization\n- [`base/`](base/) - Core standard library (loaded at startup)\n- [`stdlib/`](stdlib/) - Standard library packages (can be loaded independently)\n- [`Compiler/`](Compiler/) - Julia compiler as a separate module (can be swapped)\n- [`src/`](src/) - C/C++ runtime and LLVM codegen\n- [`cli/`](cli/) - Command-line interface and loader\n- [`doc/`](doc/) - Documentation and User Manual\n\n## Running Julia\n\nYou should have a recent binary copy of julia in your `$HOME/.juliaup/bin` directory.\nYou may use this julia executable for validation.\nIf a built version of Julia exists in the current source tree (at `usr/bin/julia`),\nprefer that version.\nNote that any changes you make to the source code after the binary is built\nwill not be reflected, unless you use `Revise`.\n\n## For all changes\n\n1. Sign off every commit you create with an `Assisted-by: <tool> (<model>)` trailer naming both the\n   tool and the model behind it, for example `Assisted-by: Claude Code (Opus 5)`. Name the model,\n   not just the harness - it is what tells a later reader what actually produced the work. Do not\n   use `Co-authored-by:` for tools, and do not list a tool as an author; this trailer replaces any\n   co-author trailer your harness adds by default.\n2. Agents can only open PRs or post comments once the human user gives them explicit permission.\n\n## Building Julia\n\nIf you made changes to the runtime (any files in `src/`), you will need to rebuild\njulia. Run `make -j` to rebuild julia. This process may take up to 10 minutes\ndepending on your changes.\n\nAfter modifying any C/C++ file under `src/`, also run the Clang static analysis\nchecks — see the `c-static-analysis` skill ([`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md)).\n\n### Testing LLVM-related changes\n\nWhen making changes to LLVM passes or codegen, add `LLVM_ASSERTIONS=1` to `Make.user` to enable\nLLVM assertions. This helps catch IR verification errors early:\n\n```bash\necho \"LLVM_ASSERTIONS=1\" >> Make.user\n```\n\nTo run LLVM pass tests:\n```bash\nmake -C test/llvmpasses <testname>.ll\n```\n\n## Using Revise\n\nIf you have made changes to files included in the system image (base/ or stdlib/),\nand need to run code with these changes included, you can use `Revise`.\nTo do so, run `using Revise; Revise.track(Base)` (or Revise.track with the stdlib you modified).\nThe test system supports doing this automatically.\n\nFor instance testing Base changes without rebuilding, using failfast, you can run:\n```\nJULIA_TEST_FAILFAST=1 ./julia -e 'using Revise; Revise.track(Base); include(\"test.jl\")'\n```\n\n## Writing code\n\nAfter writing code, look up the docstring for each function you used. If there\nare recommendations or additional considerations that apply to these functions,\nmake sure to take them into account.\n\n- Do not `ccall` runtime C functions directly if there are existing wrappers for the function.\n- Do not explicitly add a module prefix if the code you're adding is in the same module. E.g. do not use `Base.` for code in Base unless required.\n\n## Task-specific skills\n\nDetailed, situational procedures are provided as Agent Skills following the\n[agentskills.io](https://agentskills.io) open standard. The canonical location is\n`doc/src/devdocs/agents/skills/`; `.agents/skills/` and `.claude/skills/` are\nsymlinks to that directory so skills-aware agents can discover the skills\nautomatically. Agents that support the standard load each skill's `description`\nautomatically and pull in the full `SKILL.md` when relevant; otherwise read the\ncanonical `SKILL.md` directly.\n\n- [`doc/src/devdocs/agents/skills/doctests/`](doc/src/devdocs/agents/skills/doctests/SKILL.md) — writing and verifying `jldoctest` code blocks.\n- [`doc/src/devdocs/agents/skills/test-changes/`](doc/src/devdocs/agents/skills/test-changes/SKILL.md) — running and updating tests after changing them.\n- [`doc/src/devdocs/agents/skills/c-static-analysis/`](doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`doc/src/devdocs/agents/skills/external-deps/`](doc/src/devdocs/agents/skills/external-deps/SKILL.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`doc/src/devdocs/agents/skills/buildkite-logs/`](doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`doc/src/devdocs/agents/skills/ci-timing/`](doc/src/devdocs/agents/skills/ci-timing/SKILL.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`doc/src/devdocs/agents/skills/compiler-jl/`](doc/src/devdocs/agents/skills/compiler-jl/SKILL.md) — developing and testing Compiler.jl.\n- [`doc/src/devdocs/agents/skills/julia-syntax-lowering/`](doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md) — developing and testing JuliaSyntax and JuliaLowering.\n\n## Commit messages and pull requests\n\nWhen writing commit messages, follow the format \"component: Brief summary\" for\nthe title. In the body of the commit message, provide a brief prose summary\nof the purpose of the changes made. Do not specifically mention added tests, comments,\ndocumentation, etc., unless this is the main purpose of the change. Do not mention\nthe test plan, unless it differs from what you were instructed to do in AGENTS.md.\nIf your change fixes one or more issues, use the syntax \"Fixes #\" at the end of the commit message, but do not include it in the title.\n\nWhen referencing external GitHub PRs or issues, use proper GitHub interlinking format (e.g., `owner/repo#123` for PRs/issues).\nWhen fixing CI failures, include the link to the specific CI failure in the commit message.\nAlways quote macro names in backticks in commit messages and PR titles/bodies (e.g. `` `@inbounds` ``, not @inbounds), so GitHub does not notify the unrelated user with that handle.\n\nWhen preparing a pull request for the human author to open, draft the body as follows, expecting\nthem to reword it:\n1. If the pull request consists of one commit only, use the body of the commit for the body of the pull request.\n2. If there are multiple commits in the pull request, follow the same guidelines for the pull request as for the commit body.\n3. Make sure that the base commit of the pull request is recent (within the past two days) - if not rebase your changes first.\n4. If a separate tool reviews the commit, this is useful to note. Encourage the human to state how carefully they read and understood the content also, for example, by drafting the text to say the human author has *not* read any of it, and expecting they will update that once they read that disclaimer.\n\n<!-- File: doc/src/devdocs/agents/skills/buildkite-logs/SKILL.md (Tokens: ~1200 | Category: anthropic-skill) -->\n---\nname: buildkite-logs\ndescription: Fetch and inspect Julia Buildkite CI logs and artifacts without web sign-in, including the TTFX benchmark jobs. Use when debugging Julia CI failures, reviewing Buildkite jobs, investigating a TTFX regression, or when the Buildkite MCP is unavailable.\n---\n\n# Reviewing Buildkite CI logs\n\nUse this when investigating Julia Buildkite CI failures, especially if the\nBuildkite MCP is unavailable. The recipe requires `gh`, `curl`, `python3`, and\nnetwork access to GitHub and Buildkite.\n\nJulia's CI runs on Buildkite. PR builds run in the `julialang/julia-pr`\npipeline, post-merge master builds in `julialang/julia-ci`, and scheduled runs\nin `julialang/julia-master-scheduled` (the old `julia-master` pipeline no\nlonger exists). The public web UI requires sign-in to download `raw_log`, but\ntwo frontend JSON endpoints are anonymously accessible for public pipelines.\nRecipe:\n\n1. Find the build number. `gh pr checks <PR-number>` gives launcher-job URLs\n   like `https://buildkite.com/julialang/julia-pr/builds/<BUILD>#<uuid>`; for a\n   master commit, use the commit statuses\n   (`gh api repos/JuliaLang/julia/commits/<sha>/status`). The `#<uuid>`\n   fragments there are only the top-level launcher jobs (Build/Check/Test/…),\n   not the per-platform jobs.\n\n2. List all jobs in the build, with names, states, exit statuses, and UUIDs:\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/julialang/<PIPELINE>/builds/<BUILD>/data/jobs\" \\\n     -o /tmp/bkjobs.json\n   python3 -c \"import json; [print(j['state'],'|',j.get('exit_status'),'|',j['name'],'|',j['id']) \\\n   for j in json.load(open('/tmp/bkjobs.json'))['records']]\"\n   ```\n\n   This `/data/jobs` endpoint is what the build page's frontend uses; it\n   returns every job in one page (`records`, plus `has_next_page`). Do NOT use\n   `builds/<BUILD>.json` for job discovery — anonymously it returns build\n   metadata with an *empty* `jobs` array (the `statistics` field still shows\n   the true job count).\n\n3. Fetch a job's log JSON (replace `<PIPELINE>`, `<BUILD>`, `<JOB-UUID>`):\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/log\" \\\n     -o /tmp/bk.json\n   ```\n\n   The log text lives under the JSON `output` field, with embedded HTML\n   (`<time>` timestamps, ANSI-as-`<span>` colour) and entity-encoded shell\n   output. Strip with e.g.:\n\n   ```sh\n   python3 -c \"import json,re,html; s=json.load(open('/tmp/bk.json'))['output']; \\\n   s=re.sub(r'<[^>]+>','',s); print(html.unescape(s))\" > /tmp/bk.txt\n   ```\n\n   Write the stripped log to a file and search it (logs can be hundreds of KB);\n   piping the whole thing into context wastes tokens.\n\n4. List and download a job's artifacts. The same frontend serves the artifact\n   list as JSON, and each artifact's URL redirects to a signed S3 URL that is\n   valid for ten minutes, so `curl -L` downloads it.\n\n   ```sh\n   curl -sS -H \"Accept: application/json\" \\\n     \"https://buildkite.com/organizations/julialang/pipelines/<PIPELINE>/builds/<BUILD>/jobs/<JOB-UUID>/artifacts\" \\\n     -o /tmp/bkart.json\n   python3 -c \"import json; [print(a['path'],'|',a['file_size'],'|',a['url']) for a in json.load(open('/tmp/bkart.json'))]\"\n   curl -sSL -H \"Accept: application/json\" \"https://buildkite.com<url-from-listing>\" -o /tmp/<name>\n   ```\n\nThe log endpoint also serves still-running jobs (partial output). For a test\njob that hung, the in-tree watchdog (`.buildkite/utilities/timeout.jl`,\n`JL_TERM_TIMEOUT`) prints per-task Julia backtraces of every worker before\nkilling it, and core dumps are uploaded as artifacts with an `lldb bt all`\nsummary in the log — search the log for `---- Task`, `Waiting for`, and\n`core dumped`.\n\n## TTFX benchmark jobs\n\nThe `TTFX` group's macOS job runs the\n[Julia-TTFX-Snippets](https://github.com/tecosaur/Julia-TTFX-Snippets) tasks\nagainst the build: on pull requests compared with the master build of the\nmerge-base, on master builds alone (the data behind\n<https://perf.julialang.org/?tab=ci-ttfx>). Its results, report and\ntrace-compile logs are job artifacts (step 4). What they contain and how the\ncomparison is judged is documented with the driver in JuliaCI/julia-buildkite,\n`utilities/ttfx/README.md`.\n\n<!-- File: doc/src/devdocs/agents/skills/c-static-analysis/SKILL.md (Tokens: ~610 | Category: anthropic-skill) -->\n---\nname: c-static-analysis\ndescription: Run Clang static analysis on Julia's C/C++ runtime and codegen, and satisfy the GC-rooting checker. Use after modifying runtime/codegen .c/.cpp files under src/ (excluding headers), before opening a PR.\n---\n\n# C/C++ static analysis (src/)\n\nUse this after you modify a runtime/codegen C/C++ source file under `src/` (not\nheaders). Note that runtime changes also require a rebuild (`make -j`).\n\nRun static analysis checks:\n\n- First run `make -C src install-analysis-deps` to initialize dependencies (only\n  needed once the first time, or after the LLVM/Clang toolchain dependencies\n  change). This may download and install LLVM/Clang artifacts.\n- For a source file such as `src/jloptions.c` or `src/codegen.cpp`, use the file\n  stem without the `.c`/`.cpp` extension:\n  ```sh\n  make -C src analyze-<file-stem> -j8 [--output-sync]\n  ```\n  For example, to analyze `src/jloptions.c`, run:\n  ```sh\n  make -C src analyze-jloptions -j8\n  ```\n  Add `--output-sync` when your `make` supports it to keep parallel output\n  grouped; otherwise omit it.\n- Checks can also be rerun individually with `clang-sa-<file-stem>`,\n  `clang-sagc-<file-stem>`, `clang-safety-<file-stem>` or\n  `clang-tidy-<file-stem>`.\n\n## Fixing the GC-rooting checker (clang-sagc)\n\nIf `clang-sagc-<file-stem>` fails, first look for fixes that establish real\nrooting, such as adding appropriate `JL_GC_PUSH`/`JL_GC_POP` scopes, or for\nlock/control-flow fixes.\n\nDo not add `JL_GC_PROMISE_ROOTED` without explicit user or maintainer\nconfirmation. `JL_GC_PROMISE_ROOTED` asserts that a value is already rooted; it\ndoes not root the value. If it appears necessary, stop and ask for confirmation,\nshowing the exact expression, the existing root that makes it safe, and the\nsafepoints considered.\n\n- Remember arguments are assumed rooted, so check the callers to make sure that\n  is handled.\n- As a diagnostic hint when asking for confirmation: if the value is temporarily\n  moved through a struct or arraylist and then reloaded, the promised expression\n  may need to refer to the reloaded field, such as\n  `JL_GC_PROMISE_ROOTED(struct->field)`, immediately after the reload and before\n  any use of that field.\n- If confirmed, put the promise as early in the code as is legal, near the\n  definition or reload rather than the use.\n\n<!-- File: doc/src/devdocs/agents/skills/ci-timing/SKILL.md (Tokens: ~404 | Category: anthropic-skill) -->\n---\nname: ci-timing\ndescription: Compare a Julia PR's Buildkite job durations against recent CI history (per-job mean/min/max over the last N days). Use when asked whether a PR slows down or speeds up CI, or to check a build's timings against the weekly baseline.\n---\n\n# CI timing analysis\n\n```sh\njulia --startup-file=no --project=contrib/ci-timing contrib/ci-timing/ci_timing_compare.jl <PR-number>\n```\n\nPrints a markdown table, slowest job first, plus a TOTAL row: each job's duration\nin the PR's `julia-pr` build vs. the mean/min/max of the same job name over the\nlast 7 days of [julia-ci-timing](https://github.com/JuliaCI/julia-ci-timing)\nhistory. `⚠️` = above the weekly max, `✅` = below the weekly min. No Buildkite\ntoken needed; `gh` is only needed to turn a PR number into a build.\n\nFlags: `--build julia-pr/853`, `--days N`, `--include-failed`, `--min-seconds N`\n(hides short jobs).\n\nCaveats when reading it:\n\n- One build vs. a week of samples — anything inside the min/max band is agent\n  variance, and even ⚠️/✅ rows need a second build to mean anything.\n- `juliasyntax`/`Launch *` jobs are seconds long, so their percentages are noise;\n  `--min-seconds 120` drops them.\n- A fleet-wide shift in one direction skews TOTAL and is not a PR effect.\n- Broken (never run), running, and superseded retry jobs are excluded; a failed\n  job's time is cut short or stretched by the failure.\n\nFor logs behind a slow or failed job, see the `buildkite-logs` skill.\n\n<!-- File: doc/src/devdocs/agents/skills/compiler-jl/SKILL.md (Tokens: ~803 | Category: anthropic-skill) -->\n---\nname: compiler-jl\ndescription: Develop and test Julia's Compiler.jl. Use when modifying Compiler/, debugging compiler behavior, or activating stdlib Compiler for reflection/native-codegen experiments instead of using sysimage Base.Compiler.\n---\n\n# Compiler.jl development\n\nUse this when modifying `Compiler/` source, tests, or package metadata.\n\n## Compiler modules in Julia\n\nDuring bootstrap, `Compiler/` is built into the sysimage as `Base.Compiler`.\nThat in-sysimage compiler is what Julia normally uses for native compilation.\nBecause it is baked into the sysimage, changes made to `Compiler/` after the\nsysimage was built are not reflected in `Base.Compiler` unless Julia is rebuilt.\n\n`Compiler/` can also be loaded as a stdlib package, producing a separate\n`Compiler` module from `Base.Compiler`. For day-to-day development, testing, and\ndebugging of post-sysimage source changes, prefer this stdlib `Compiler` module\nover trying to replace `Base.Compiler` with Revise. It is usually reliable except\nfor failures caused by compatibility with the `src/` runtime or other\nsysimage/native-codegen integration issues.\n\nWhen investigating a runtime compatibility issue, `make -C src` can update the\nruntime faster than rebuilding the full Julia sysimage. Rebuild Julia when the\nupdated `Compiler/` code needs to be baked into `Base.Compiler` or when checking\nsysimage/native-codegen integration.\n\n## Experimenting with Compiler as a stdlib\n\nRun the in-tree Julia runtime with the `Compiler` project:\n\n```sh\n./usr/bin/julia --project=Compiler\n```\n\n### Reflection backend\n\nFor reflection-oriented debugging, activate the stdlib `Compiler` module:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler\n```\n\n`@activate Compiler` is equivalent to `@activate Compiler[:reflection]`: Base and\nInteractiveUtils reflection utilities such as `code_typed`, `@code_typed`, and\n`code_warntype` will use the loaded stdlib `Compiler` module. This is useful for\ntrying compiler changes without rebuilding the sysimage.\n\n### Native compilation backend\n\nIf you specifically need to exercise the loaded stdlib `Compiler` as the native\ncompilation backend, use:\n\n```julia\nusing InteractiveUtils, Compiler\n@activate Compiler[:codegen]\n```\n\nThis is broader than reflection activation: it makes the runtime invoke the\nloaded compiler for compilation requests. Use it only when debugging native\ncompilation/codegen behavior, and expect failures here to involve sysimage,\nruntime, native-codegen, or compiler-cache interactions.\n\nFor ordinary debugging, prefer reflection activation. Use `[:codegen]` only when\nyou specifically need to test the native compilation backend; for final\nintegration checks, rebuild Julia and test the in-sysimage `Base.Compiler`.\n\n## Testing Compiler as a stdlib package\n\nRun package tests from the repository root with the in-tree Julia runtime:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Pkg; Pkg.test()'\n```\n\nTo run a single test file, include it directly under a `Test.@testset`:\n\n```sh\n./usr/bin/julia --project=Compiler -e 'using Test; @testset \"inline\" include(\"Compiler/test/inline.jl\")'\n```\n\nMost `Compiler/test/` files include `Compiler/test/setup_Compiler.jl`, which\nactivates or imports the appropriate `Compiler` module for this workflow.\n\n## Testing `Base.Compiler`\n\nUse the top-level test entry point when the goal is to test the `Base.Compiler`\nthat is baked into the sysimage:\n\n```sh\n./usr/bin/julia test/runtests.jl Compiler\n```\n\nIf you changed `Compiler/` and need those changes reflected in `Base.Compiler`,\nrebuild Julia first so the sysimage contains the updated compiler code.\n\n<!-- File: doc/src/devdocs/agents/skills/doctests/SKILL.md (Tokens: ~331 | Category: anthropic-skill) -->\n---\nname: doctests\ndescription: Write and verify Julia `jldoctest` code blocks. Use whenever adding or changing a `jldoctest` block in a docstring (base/, stdlib/, Compiler/) or under doc/, and before opening a PR that touches doctests.\n---\n\n# Julia doctests\n\nUse this whenever you add or modify any `jldoctest` code block.\n\n## Writing\n\nBefore writing new doctests, review `doc/src/devdocs/contributing/jldoctests.md`\nfor best practices (filters, labels, setup code).\n\n## Verifying\n\nIf you changed any `jldoctest` block you MUST verify it. Follow these steps for\nEVERY doctest change:\n\n1. Review `doc/src/devdocs/contributing/jldoctests.md`. In particular, determine\n   if any of the changed doctests require filters, labels or setup code.\n2. Run the doctests to verify that your change works:\n   - To run doctest with the pre-built juliaup: `make -C doc doctest=true revise=true JULIA_EXECUTABLE=$HOME/.juliaup/bin/julia`\n   - To run doctest with in-tree julia (preferred): `make -C doc doctest=true revise=true`. Do not pass any other options.\n   - IMPORTANT: The doctests may take up to 15 minutes. Do NOT terminate the doctests before completion. Do NOT use a timeout for doctests.\n   - If you are ChatGPT, you may have to increase yield_timeout_ms.\n\n<!-- File: doc/src/devdocs/agents/skills/external-deps/SKILL.md (Tokens: ~302 | Category: anthropic-skill) -->\n---\nname: external-deps\ndescription: Modify Julia's external dependencies and JLLs — patches under deps/patches/, version bumps in deps/, and JLL updates. Use when touching deps/ or any *_jll folder, including refreshing checksums.\n---\n\n# External dependencies & JLLs\n\nUse this when modifying `deps/`, dependency patches, or a JLL.\n\n## External dependencies (deps/, deps/patches/)\n\nWhen modifying external dependencies (patches in `deps/patches/` or version\nupdates in `deps/`):\n\n1. Always test builds with `USE_BINARYBUILDER=0` to ensure source builds work correctly.\n2. For patches to external libraries:\n   - Verify the patch applies cleanly by running the extraction and patch steps.\n   - Test the full build of the dependency: `make -C deps USE_BINARYBUILDER=0 compile-<depname>`.\n   - Prefer using the full upstream commit in `git am` format (e.g., `git format-patch`) which includes proper commit metadata.\n3. When updating dependency versions, ensure all associated patches still apply.\n\n## External JLLs\n\nTo update a JLL to the latest version:\n\n- Update the version number in the appropriate jll folder.\n- If the dependencies in the upstream jll changed, update the `Project.toml`.\n- Run `make -f contrib/refresh_checksums.mk <jll>` to update the checksums. This may take a few minutes.\n\n<!-- File: doc/src/devdocs/agents/skills/julia-syntax-lowering/SKILL.md (Tokens: ~685 | Category: anthropic-skill) -->\n---\nname: julia-syntax-lowering\ndescription: Develop and test JuliaSyntax and JuliaLowering in Julia's source tree. Use when modifying JuliaSyntax/ or JuliaLowering/, running package or targeted tests, or checking JuliaLowering execution.\n---\n\n# JuliaSyntax & JuliaLowering development\n\nUse this when modifying `JuliaSyntax/` or `JuliaLowering/` source, tests, or\npackage metadata.\n\n## Testing JuliaSyntax\n\nRun package tests from the repository root:\n\n```sh\njulia --project=JuliaSyntax -e 'using Pkg; Pkg.test()'\n```\n\n`JuliaSyntax` is not tied only to the in-tree Julia runtime; if a change may be\nversion-sensitive, test it with the relevant installed Julia version(s).\n\n## Testing JuliaLowering\n\nPrefer the in-tree Julia runtime because compatibility with the Julia runtime\nmay matter:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'using Pkg; Pkg.test()'\n```\n\nIf `./usr/bin/julia` is unavailable, note that limitation and use an available\n`julia` executable only for preliminary validation.\n\nIn this repository, `JuliaLowering/Project.toml` points its `JuliaSyntax`\ndependency at the sibling `JuliaSyntax` checkout\n(`path = \"../JuliaSyntax\"`). Therefore, `JuliaSyntax` changes can affect\n`JuliaLowering`. When a `JuliaSyntax` change may affect lowering behavior or\nsyntax data consumed by `JuliaLowering`, run the `JuliaLowering` test command as\nwell.\n\n### Targeted JuliaLowering tests\n\nFor targeted `JuliaLowering` test execution, include\n`JuliaLowering/test/utils.jl` before the test file, matching\n`JuliaLowering/test/runtests.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); include(\"scopes.jl\"); end'\n```\n\nFor `_ir.jl` fixtures, call `test_ir_cases` after loading `utils.jl`:\n\n```sh\n./usr/bin/julia --project=JuliaLowering -e 'cd(\"JuliaLowering/test\") do; include(\"utils.jl\"); test_ir_cases(\"scopes_ir.jl\"); end'\n```\n\n## Trying JuliaLowering execution\n\nFor quick execution checks, run with the in-tree Julia runtime and the\n`JuliaLowering` project:\n\n```sh\n./usr/bin/julia --project=JuliaLowering\n```\n\nThen either evaluate code explicitly through `JuliaLowering`:\n\n```julia\nusing JuliaLowering\nJuliaLowering.include_string(Main, \"1 + 2\")\n```\n\nor activate `JuliaLowering` as the process lowerer, then evaluate subsequent\ncode normally:\n\n```julia\nusing JuliaLowering\nJuliaLowering.activate!()\n\n1 + 2\n```\n\nUse `include(\"path/to/file.jl\")` after activation when checking a file. When\nusing `JuliaLowering.activate!()` from `-e`, make the code under test a separate\ntop-level statement after activation, or put it in `include(...)`.\n\n<!-- File: doc/src/devdocs/agents/skills/test-changes/SKILL.md (Tokens: ~211 | Category: anthropic-skill) -->\n---\nname: test-changes\ndescription: Run and update Julia tests after changing test files. Use when adding to or modifying any test file under test/ or stdlib/**/test/.\n---\n\n# Julia test changes\n\nUse this when you change or add a Julia test.\n\n- If you have changed a test (e.g. `foo`), run `make test-revise-foo` for the\n  corresponding test to ensure that the test is still passing with your changes.\n- If you are adding a new test, add it to an existing test file. Do not create a\n  new test file unless explicitly instructed.\n- Write one comment at the top of the test to explain what is being tested.\n  Otherwise keep comments minimal.\n- Use the environment variable `JULIA_TEST_FAILFAST=1` to make tests fail fast.\n- Do not coordinate with fixed `sleep`s — loaded CI machines break any fixed\n  delay. Synchronize on observable state (readiness markers, round-trips), or\n  retry.\n\n<!-- File: CLAUDE.md (Tokens: ~37 | Category: claude-rule) -->\n<!--\n\nInclude the contents of AGENTS.md\n\nhttps://code.claude.com/docs/en/claude-code-on-the-web#best-practices\n\n-->\n\n@AGENTS.md\n\n<!-- File: doc/src/devdocs/agents/README.md (Tokens: ~348 | Category: subagent-persona) -->\n# Agent Skills\n\nJulia keeps canonical project-local Agent Skills under\n`doc/src/devdocs/agents/skills/`. These files follow the\n[Agent Skills](https://agentskills.io) `SKILL.md` format.\n\nThe `.agents/skills/` and `.claude/skills/` entries are symlinks to the canonical\nskills directory for automatic discovery by skills-aware agents. Do not edit\nthrough those discovery paths directly; edit the canonical `SKILL.md` under\n`doc/src/devdocs/agents/skills/`.\n\nThe documentation build renders each canonical `SKILL.md` with its Agent Skill metadata:\n\n- [`doctests`](skills/doctests/index.md) — writing and verifying `jldoctest` code blocks.\n- [`test-changes`](skills/test-changes/index.md) — running and updating tests after changing them.\n- [`c-static-analysis`](skills/c-static-analysis/index.md) — Clang static analysis and GC-rooting for C/C++ changes under `src/`.\n- [`external-deps`](skills/external-deps/index.md) — modifying external dependencies (`deps/`, patches) and JLLs.\n- [`buildkite-logs`](skills/buildkite-logs/index.md) — fetching and inspecting Buildkite CI logs without web sign-in.\n- [`ci-timing`](skills/ci-timing/index.md) — comparing a PR's Buildkite job durations against recent CI history.\n- [`compiler-jl`](skills/compiler-jl/index.md) — developing and testing Compiler.jl.\n- [`julia-syntax-lowering`](skills/julia-syntax-lowering/index.md) — developing and testing JuliaSyntax and JuliaLowering.\n</yakaai_skills>"}