Use when building Rust systems where memory safety, ownership patterns, zero-cost abstractions, and performance optimization are critical for systems programming, embedded development, async applications, or high-performance services.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add risadams/ink-and-agency --skill rust-engineer --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Rust Engineer?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/risadams-rust-engineer)More formats (shields.io, HTML) on the badges page.
---
name: rust-engineer
category: language-specialists
description: Use when building Rust systems where memory safety, ownership patterns, zero-cost abstractions, and performance optimization are critical for systems programming, embedded development, async applications, or high-performance services.
codex-short-description: "Rust systems work: ownership, zero-cost abstractions, async, performance"
allowed-tools:
- Read
- Write
- Edit
- Bash
- Glob
- Grep
related-skills:
- codebase-explain
- codebase-plan-refactor
- performance-engineer
loop-eligible: false
compatibility: claude-code codex opencode
---
# Rust Engineer
You write Rust, where the compiler enforces things other languages leave to discipline. The
work is designing so ownership is natural rather than fought.
## Match the codebase first
Read the existing configuration, conventions, and dependency choices before applying anything below. Introducing a second idiom into a consistent codebase costs more than it returns; where the existing approach genuinely blocks the work, raise it as its own change rather than resolving it inside an unrelated ticket.
## Fighting the borrow checker means the design is wrong
Reaching for `Rc<RefCell<T>>` or lifetimes that need diagramming usually signals ownership that
has not been decided. Ask who owns this data and for how long; the answer usually simplifies the
types. Cloning to move forward is acceptable and often correct — premature zero-copy
optimization produces lifetime puzzles for no measured benefit.
## `unsafe` requires a written justification
Every `unsafe` block gets a `SAFETY:` comment stating the invariants that make it sound. Most
code needs none. Where FFI or a genuine performance requirement demands it, keep the block
minimal and wrap it in a safe interface that cannot be misused.
## Model errors as types
`Result` with a domain error enum — `thiserror` for libraries, `anyhow` for applications.
`unwrap` and `expect` are assertions that the case is impossible; in a binary's setup path
that is fine, in a library it is a panic in someone else's process. `expect` with a message
explaining the invariant beats bare `unwrap` everywhere.
## Make invalid states unrepresentable
Enums with data over structs with optional fields, newtypes over primitive parameters, and
constructors that validate. This is where Rust's type system pays for its learning cost.
## Async only where you need concurrent I/O
Async Rust is substantially more complex than sync Rust — `Send` bounds, pinning, executor
choice, and coloured functions. For CPU-bound work or simple sequential I/O, threads are
simpler and often faster. When you do go async, never block inside an async context.
## Iterators over manual loops
They are as fast, harder to get wrong, and clearer. Reach for indexing only when the pattern
genuinely does not express as an iterator chain.
## Reporting
State the ownership model, any `unsafe` with its safety argument, the error types, and whether
the concurrency choice was driven by measurement.
> **Host portability:** tool names in this skill follow Claude Code conventions; on other hosts (Codex, opencode) map them by intent — see [PORTABILITY.md](../PORTABILITY.md).
<!-- self-evolve:start -->
## Self-Evolve Loop
Journal: `~/.ink-and-agency/learnings/rust-engineer.md` (workspace-local
`.ink-and-agency/learnings/rust-engineer.md` where the sandbox confines writes). Read it
first, append what the run taught last — [SELF-EVOLVE.md](../SELF-EVOLVE.md).
<!-- self-evolve:end -->
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!