Rust Development
Runtime dispatch
Detect the runtime once, before the workflow:
- Claude Code (
Agent,AskUserQuestion, andSkilltools available) β readruntime-claude.md. - OMP (
taskandasktools available, withskill://β¦readable throughread) β readskill://rust-dev/runtime-omp.md. - Any other tool surface β stop and report that this skill has no dispatch table for the runtime.
The selected file is a prompt asset, not a role declaration. Its implementation and review labels name the exact runtime subagent arguments. If a named agent is unavailable, stop before delegation: never substitute the generic task or general-purpose agent and never implement delegated work inline.
Workflow
For any non-trivial Rust change:
Discover project guidelines β Read
CLAUDE.md,AGENTS.md(in repo root and.claude/,.cursor/,.codex/subdirs),rustfmt.toml,clippy.toml,.clippy.toml,deny.toml, and[workspace.lints]/[lints]sections inCargo.toml. These rules apply in addition to Core Rules below.Implement β Delegate through the runtime dispatch table's implementation entry. It rediscovers guidelines, implements, then verifies its own work with
cargo clippy --workspace --tests -- -D warningsandcargo test --workspacebefore reporting done.Review β Delegate through the dispatch table's review entry after implementation completes. This is mandatory, not optional. Convert findings into TODOs: critical/warning β fix; suggestions β triage.
Fix issues one by one β Delegate each fix through the implementation entry. Do not batch unrelated fixes into one delegation.
Final build β Run
cargo build --workspacedirectly.
Core Rules
- Edition 2024: Always
edition = "2024"in Cargo.toml - FAIL FAST: Every error MUST propagate with
?orreturn Err. Logging is NOT handling. See error-handling.md - Dependency versions: Use
x.xformat (e.g.,serde = "1.0"). Find latest withpython3 scripts/check_crate_version.py <crate> - Workspace architecture: Root Cargo.toml defines workspace only. Separate crates for lib/cli/client
- Error types:
thiserror(with backtrace) for libraries,anyhowfor binaries/tests - CLI-first config: Never bypass CLI args. Use
from_cli_args(), neverDefaultthat reads env - No
env::set_varin tests: Pass config through function parameters - Async: Use tokio consistently
- Visibility: Private (default) >
pub(crate)>pub - No magic numbers: Use
constor CLI args
Adding Dependencies
- Run
python3 scripts/check_crate_version.py <crate-name>to find latest version - Add to
[workspace.dependencies]in root Cargo.toml withx.xformat - Reference in member crates:
serde = { workspace = true }
Common deps: thiserror = "2.0", anyhow = "1.0", tokio = { version = "1", features = ["full"] }, serde = { version = "1.0", features = ["derive"] }, clap = { version = "4.5", features = ["derive"] }
Creating New Projects
Use the template in assets/workspace-template/:
project/
βββ Cargo.toml # Workspace root, no code
βββ project/ # Library crate (thiserror)
β βββ Cargo.toml
β βββ src/lib.rs
βββ project-cli/ # Binary crate (anyhow + clap)
βββ Cargo.toml
βββ src/main.rsModule Organization
Split modules when file exceeds ~500 lines or tests take 50%+ of file. See module-organization.md for patterns.
Error Handling
The most critical standard. See error-handling.md for full rules and examples.
Quick check: If you see if let Err or match ... Err without return Err or ?, it's a bug.
References
- error-handling.md β FAIL FAST rules, thiserror/anyhow patterns, error chain preservation
- module-organization.md β When/how to split modules, test extraction
- dependency-guide.md β Workspace deps, feature flags, common crates
Scripts
scripts/check_crate_version.pyβ Query crates.io for latest dependency versions