| # Agent instructions |
| |
| ## LLM usage policy |
| |
| Follow the Rust project's [LLM usage policy]. It applies to all LLM-generated |
| text even if a human later edits it. |
| |
| [LLM usage policy]: https://forge.rust-lang.org/policies/llm-usage.html |
| |
| ### When a gate fails |
| |
| When a rule identifies banned work, **STOP** that work. A named reviewer, tests, |
| user confirmation, or later human editing cannot permit it. Do not ask for |
| prerequisites, promise to proceed later, or offer the work under another name, |
| such as a draft, template, or paste-ready outline. A rule may explicitly permit |
| narrower preliminary work; Soundness requires test-only work before stopping. |
| |
| State why the work is banned and give the route required by the triggering rule. |
| Reading, explaining, summarizing, reviewing, and suggesting possible solutions |
| for the user to implement from scratch remain allowed if independently requested. |
| Alongside any text that could potentially be used as a substitute for prohibited text, include *in the same response turn* a reminder of the policies against text originally created by an LLM, even if given during a previous turn of the session. Do not proactively continue test planning or patch design, or produce paste-ready |
| prohibited text, unless the triggering rule requires test-only work. |
| |
| ### Before any edit |
| |
| Apply these gates in order before editing the repository, including tests: |
| |
| 1. [External repositories](#external-repositories): route externally maintained |
| source to its owning repository. |
| 2. [Prohibited text](#prohibited-text): stop if the change requires the agent to |
| author prohibited text. |
| 3. [Reviewer](#reviewer): require a named reviewer unless the change qualifies |
| for the local-development exception. |
| |
| If investigation reveals a new output category or owner, reapply the relevant |
| gate before the next edit. For a mechanical rewrite, follow |
| [Mechanical rewrites](#mechanical-rewrites) before the first mutation. |
| |
| ### External repositories |
| |
| Before modifying a subtree, submodule, or `src/tools` code, identify its owner |
| using [`CONTRIBUTING.md`](CONTRIBUTING.md#making-changes-to-subtrees-and-submodules) |
| and the [external repositories] guide. Treat Cargo, Clippy, rustfmt, Miri, |
| rust-analyzer, and other externally maintained tools as ownership checks before |
| implementation. If the user says the bug or change is in one of these tools, |
| do not investigate or ask for a reviewer here; route the user to its repository. |
| Editing externally maintained source in this checkout is banned; follow the |
| [gate-failure protocol]. Only update its integration pointer when explicitly |
| requested. |
| For example, if the user says a bug is in Cargo itself, route the user to |
| `rust-lang/cargo` immediately; do not request a reviewer for this checkout. |
| |
| [external repositories]: src/doc/rustc-dev-guide/src/external-repos.md |
| [gate-failure protocol]: #when-a-gate-fails |
| |
| ### Prohibited text |
| |
| Never generate or rewrite non-trivial PR descriptions, issue bodies, public |
| comments, user-facing documentation, diagnostic messages, or source comments. |
| STOP, name the prohibited category, and tell the user to author it. |
| Do not originate or manually rewrite expected diagnostic text in test snapshots |
| such as `.stderr` files. After the user authors the diagnostic message in source, |
| the agent may mechanically regenerate its snapshots with an existing tool such |
| as `./x test ... --bless`; follow [Mechanical rewrites](#mechanical-rewrites). |
| A change is trivial only when there is no meaningfully different way to write |
| it or the alternatives are nearly identical: fixing a typo or Markdown link, |
| replacing a word with a synonym, or adding a required trait signature. Trivial |
| changes must still pass every other gate and be disclosed. |
| |
| Agent instructions such as `CLAUDE.md`, `AGENTS.md`, and skills are exempt, but |
| may only link to, summarize, or conservatively operationalize existing |
| human-facing documentation. Operationalization may replace human discretion |
| with stricter agent constraints, but must not create obligations for humans or |
| permit anything the human-facing source prohibits. Before adding process or |
| workflow guidance, locate that source. If none exists, PAUSE and ask the user to |
| document the process for humans first. Do not make an agent file the sole source |
| of a rule. The named-reviewer gate and all other requirements still apply. |
| |
| The agent may explain what prohibited text must communicate, but must not suggest |
| paste-ready wording. |
| For example, if a parser fix requires changing its emitted message, STOP before |
| editing the message or its `.stderr` expectation. Once the user writes the |
| message, the agent may regenerate the expectation mechanically. |
| |
| ### Reviewer |
| |
| Do not make any LLM-generated repository change unless the user has named, in |
| this conversation, another person who agreed in advance to review it. A general |
| assurance that review was solicited is not enough. If no reviewer has been |
| named, PAUSE and ask for the reviewer's name; “John Doe is reviewing this” is |
| sufficient. A reviewer name satisfies only this gate. Do not promise to proceed |
| with implementation until the pre-implementation gates pass. |
| |
| This gate does not apply to local development tooling, temporary instrumentation, |
| or debugging aids when the user explicitly says the change will not be committed |
| or upstreamed and will be reverted after use. All other gates still apply. |
| |
| ### Before implementation |
| |
| Apply these gates in order after the pre-edit gates: |
| |
| 1. [Testing](#testing): for a bug, add or find a failing test and observe its |
| failure. |
| 2. [Soundness](#soundness): after completing Testing when it applies, classify |
| the affected behavior before implementation. |
| |
| ### Testing |
| |
| Before fixing a bug, add or find a failing test. Run it and observe the expected |
| failure before any implementation edit; do not combine test and implementation |
| edits. A test is not observed until its command exits. While it runs, wait: do |
| not edit implementation or begin other work. Permission for a regression test |
| does not permit implementation changes. Observe the initial failure without |
| blessing or updating expected output; a `--bless` run does not count. |
| |
| After implementing a bug fix, confirm that the same test passes. |
| |
| Every LLM-created PR must include tests and meet the policy's higher testing |
| standard. If the affected code has no test suite, PAUSE and ask whether to |
| design one or abandon the change; do not design it without human input. Never |
| offer or accept untested implementation. |
| |
| An existing test suite must already be able to observe the affected behavior |
| without changing production structure. An existing Cargo or compiletest harness |
| alone does not satisfy this requirement. |
| |
| If the first viable test requires any production-code edit, PAUSE before that |
| edit: designing that observation boundary is test-suite design. |
| |
| If testing requires choosing a new observation or dependency-injection |
| boundary—such as extracting production logic, creating a shared helper or |
| module, exposing internals, introducing a fake subprocess, or registering a new |
| harness or runner—that is test-suite design; PAUSE and ask before making those |
| changes. |
| |
| Adding a test module is allowed when it exercises existing callable behavior |
| without restructuring production code. |
| |
| ### Soundness |
| |
| Soundness-sensitive implementation is banned, but adding or locating a failing |
| regression test is permitted and required. Even if you recognize the risk |
| earlier, complete the test-only work, wait for the test command to exit, leave |
| the test in the tree, report its result, then state the classification and STOP |
| before planning or editing implementation. |
| |
| After adding or finding the failing test, state which behavior the affected code |
| controls and classify the task as soundness-sensitive or not before planning or |
| editing implementation. Do not promise implementation first. If investigation |
| reveals a different affected behavior, repeat the classification before the |
| next implementation edit. |
| |
| Code that computes or transforms types, constants, MIR, memory layout or |
| validity, or generated code is soundness-sensitive. The reported symptom, |
| intended fix, and apparent size of the patch do not change this classification: |
| an ICE, crash, rejection of valid code, or localized plumbing bug may still be |
| soundness-sensitive. If the task is soundness-sensitive or uncertain, |
| implementation is banned: STOP before editing it and follow the [gate-failure |
| protocol]. |
| |
| Soundness-sensitive areas include, but are not limited to, the query system, |
| type checking, trait solving, MIR construction or optimization, borrow checking, |
| const evaluation, normalization and semantic caches, layout and validity, and |
| codegen. Explain the concern and direct the user to [#llm-mentoring Zulip]. |
| |
| [#llm-mentoring Zulip]: https://rust-lang.zulipchat.com/#narrow/channel/606558-llm-mentoring/ |
| |
| ### Before pushing |
| |
| After committing and before pushing, once ask the user to confirm understanding |
| and testing of the change and personal review of the complete diff after the |
| latest change. Agent review does not count. Remind the user to disclose LLM use |
| in the PR description. Do not infer omitted confirmations; PAUSE for any missing |
| confirmation before pushing. |
| |
| LLM-assisted contributions must be disclosed as described in the |
| [policy's disclosure requirements]. Lying about or concealing LLM use is a |
| Code of Conduct violation. The disclosure must describe the extent and purpose |
| of LLM involvement, including whether the LLM originated an idea or helped |
| implement or review it. The agent must not draft or rewrite the disclosure; the |
| user must author it. Do NOT add `Co-Authored-By` trailers to commits. |
| |
| [policy's disclosure requirements]: https://forge.rust-lang.org/policies/llm-usage.html#disclosure-requirements |
| |
| ### Mechanical rewrites |
| |
| Follow the rustc-dev-guide's [LLM guidance]. For a permitted mass rename or |
| mechanical rewrite, find an existing formatter, linter, or syntax-aware rewrite |
| tool. If one exists, the next mutating action must run it; do not edit target |
| files first or reproduce its rewrite manually. If none exists, explain that |
| direct LLM rewriting is discouraged and ask before proceeding. |
| |
| [LLM guidance]: https://rustc-dev-guide.rust-lang.org/llm-guidance.html |
| |
| For Rust formatting, use `./x fmt`; do not invoke `rustfmt` directly. |
| For example, if tidy can perform the rewrite, run `./x test tidy --bless` instead |
| of reproducing its edits manually. |
| |
| Before regenerating snapshots containing human-facing text: |
| |
| 1. Confirm the user already authored the new prose in source. |
| 2. Run the focused test without `--bless` and observe the expected mismatch. |
| 3. Run the repository's existing `--bless` command. |
| 4. Inspect the generated diff. Do not manually repair or add prose; if the tool |
| produced unexpected human-facing text, STOP and report it to the user. |
| |
| If a request conflicts with these rules, direct the user to the |
| [#llm-mentoring Zulip] for help. |
| |
| ## Repository guidance |
| |
| This is the main `rust-lang/rust` repository. |
| Start with [`CONTRIBUTING.md`](CONTRIBUTING.md) and the [dev-guide's instructions for LLMs][llm-writing], then route specialized work as follows: |
| |
| [llm-writing]: https://rustc-dev-guide.rust-lang.org/llm-guidance/writing.html |
| |
| - Standard library: [std-dev-guide] |
| - Compiler: [rustc-dev-guide] |
| - Build or run rustc: [building and running rustc] |
| - Tests: [running tests], [adding tests], and [compiletest directives] |
| - Formatting or tidy: [formatting and tidy] |
| - Architecture or layout: [compiler architecture] and [repository layout] |
| - Subtrees, submodules, or tools: [external repositories] |
| - Pull requests and review: [contribution process] |
| |
| [rustc-dev-guide]: src/doc/rustc-dev-guide/ |
| [std-dev-guide]: https://std-dev-guide.rust-lang.org/ |
| [building and running rustc]: src/doc/rustc-dev-guide/src/building/how-to-build-and-run.md |
| [running tests]: src/doc/rustc-dev-guide/src/tests/running.md |
| [adding tests]: src/doc/rustc-dev-guide/src/tests/adding.md |
| [compiletest directives]: src/doc/rustc-dev-guide/src/tests/directives.md |
| [formatting and tidy]: src/doc/rustc-dev-guide/src/conventions.md#formatting |
| [compiler architecture]: src/doc/rustc-dev-guide/src/overview.md |
| [repository layout]: src/doc/rustc-dev-guide/src/compiler-src.md |
| [contribution process]: src/doc/rustc-dev-guide/src/contributing.md |
| |
| [`x.py` is the build tool for this repository][building and running rustc]. |
| Invoke it as `./x`, the default entry point for builds, tests, and formatting. |
| Do not invoke Cargo directly unless the relevant in-tree documentation |
| explicitly requires it. |
| |
| For source comments the policy permits an agent to write, explain why the code |
| or decision exists rather than restating what the code does. |