rust-systems について
edition 2024 を使うアプリケーション層の Rust 開発向けスキルで、CLI、Web サービス、ライブラリを扱います。安全で小さな変更、並行処理とエラー処理、フォーマットやテストによる検証を重視します。
主な機能
- 01CLI、サービス、ライブラリの開発指針
- 02unsafe コードの安全性とレビュー規則
- 03非同期処理と終了制御の実践
- 04エラー処理とパースの指針
- 05フォーマット、Lint、テストの確認
活用シーン
- 01edition 2024 の Rust CLI 開発
- 02Rust Web サービスの変更レビュー
- 03unsafe コードや生ポインターの扱い
- 04納品前の Rust ワークスペース検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ iliaal/ ai-skills --skill rust-systemsインストール後、Claude Code で/rust-systemsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
SPEC.mdreferences/applications-and-testing.mdaxum-service.mdbuild-profiles.mdci-pipeline.mdcli-tools.mdmacros-and-os-boundaries.mdobservability.mdownership-and-execution.mdperformance.mdproduction-resilience.mdrustdoc.mdtoolchain-and-interfaces.md詳細
Rust システム&サービス
モダンなアプリケーション層の Rust(エディション 2024)を対象とします。CLI、Web サービス、ライブラリが含まれます。no_std/組み込みは対象外です。
作業ルール
- ライブラリではエラーのバリアントを保持し、アプリケーションの境界では運用上のコンテキストを追加します。
- 置き換えを書き込む前に、設定が存在しない場合と、ファイルを読み取れない場合や無効な場合を区別します。
- ブロッキング処理を非同期ワーカーから切り離し、キューと起動する処理数に上限を設け、シャットダウン時の動作を定義します。
- 変更を内部的なものとして扱う前に、エクスポートされたインターフェースを追跡し、インストール済みのランタイム機能を確認します。
- 並行テストでプロセス全体の状態を変更しないでください。実際のバイナリと、関連するフィーチャーの組み合わせをテストします。
Unsafe の規律
- デフォルトでは
unsafeを使いません。clippy が警告した場合も、#[allow]を付けずにリファクタリングします。以下の#[expect]による回避策はここには適用されません。unsafe に関する指摘は注釈で済ませず、修正します。 - すべての
unsafeブロックの直前に、その不変条件がそれぞれ成り立つ理由を説明する// SAFETY:コメントを付けます。コメントがなければレビューで却下します。 unsafeブロックは最小限にします。モジュール境界で安全な抽象化で包み、モジュールをpub(crate)にします。unsafeまたは生ポインター演算を含むクレートではmiri(cargo +nightly miri test)を使います。最適化によって隠される UB を検出できます。- ゼロコピーのパターンでは、手書きの transmute より
bytemuck、zerocopy、bytesを優先します。 - エディション 2024 では環境変数への書き込みは
unsafeです。書き込みはmain内で、ランタイムの開始前、またはスレッドが起動する前に限ります。 並行するgetenvは UB です。OnceLockを使っても安全にはなりません。初回使用時に遅延して行われるLD_LIBRARY_PATHのような書き込みに注意し、起動時に実行するように移します。
規律
- まずシンプルさを優先します。変更は可能な限りシンプルにし、影響を与えるコードは最小限にします。
- 必要な箇所だけを変更し、PR で無関係な変更を避けます。
- 近道として
#[allow(clippy::...)]を使わず、根本的な問題を修正します。抑制が本当に妥当な場合は、代わりに#[expect(clippy::lint_name, reason = "...")]を記述します。expectは lint が発生しなくなると警告するため、原因が解消された後も残っている抑制は、自らそのことを報告します。一方、allowはいつまでも黙って残ります。(expectには Rust 1.81 以降が必要です。エディション 2024 では最低バージョンもそれ以上になります。) - トレイトやジェネリクスを追加する前に、3 か所以上で使われることを確認します。それ以外の場合は、具体的な型のほうが明確です。
bool::then_some(x)はxを値として受け取ります。つまり、bool を確認する前に引数が評価されます。 条件と固定幅スライスを組み合わせたガードは、まさに条件で確認しようとした入力で panic を起こします。(b.len() >= 19 && b[4] == b'-').then_some(&v[..19])は、条件を未確定として報告するために書かれた関数内で、19 バイト未満の値を指定すると 101 で終了します。遅延評価されるthen(|| …)を使います。clippy はこの違いを警告しません。インデックス指定、スライス、unwrap、割り当てを行う引数を持つthen_some(を grep してください。関連事項:固定幅スライスはパースではありません。&v[..19]は ASCII 以外の文字の途中でも panic を起こします。また、そのようなプレフィックスを辞書順で比較するとタイムゾーンオフセットが無視されるため、01:00+02:00は00:00Zより後に並びますが、実際には 1 時間前です。パースして正規化するか、拒否してください。
検証
cargo fmt --all -- --checkが差分ゼロで成功するcargo clippy --workspace --all-targets --all-features -- -D warningsが成功するcargo nextest run --workspace(またはcargo test --workspace)が失敗ゼロで成功する- nextest を使用する場合は、
cargo test --doc --workspaceも成功する。nextest は doctest を実行しません - 本番環境に投入するクレートでは、
cargo deny checkが成功する(ライセンス、アドバイザリー、重複) - 新たに
unsafeを追加する場合は、必ず// SAFETY:コメントを付ける
タスク固有のリファレンス
該当する動作を実装またはレビューする前に、関連するリファレンスをお読みください。
- Cargo のセットアップ、ワークスペースの変更、パブリック API の到達可能性、ビルドプロファイル、または CI については、toolchain-and-interfaces.md を参照してください。
- エラー、所有権、解析の境界、Tokio、シャットダウン、または並行処理については、ownership-and-execution.md を参照してください。
- CLI/サービスのエントリーポイント、本番環境でのレジリエンス、テレメトリー、またはテストについては、applications-and-testing.md を参照してください。
該当するトピックに応じて、以下の既存の専門リファレンスも参照してください。
コメント
Markdown 対応