コーディング規約¶
Rust¶
Formatting / Lint¶
cargo fmtを commit 前に必ず実行(rustfmt 設定:rustfmt.toml、max line 100)cargo clippy -- -D warnings(warnings は error 扱い)- clippy thresholds:
clippy.tomlでtoo-many-arguments-threshold = 16、enum-variant-name-threshold = 5を緩和済み - toolchain:
rust-toolchain.tomlで1.95.0にピン
命名¶
- 関数 / 変数 / モジュール:
snake_case - 型 / トレイト / enum:
PascalCase - 定数 / static:
SCREAMING_SNAKE_CASE - ライフタイム:
'a/'de、複雑な場合のみ'input等
イミュータビリティ¶
letを既定とし、必要なときだけlet mut- in-place mutation より新しい値を返す
- 引数は
&str/&[T]を優先、所有が必要なときのみString/Vec<T>
エラーハンドリング¶
Result<T, E>+?で伝播。production code でunwrap()/expect()禁止- ライブラリ層は
thiserrorで typed error を定義(anyhowは本プロジェクト未導入) unwrap()/expect()はテストと「真に到達不能」な状態のみ
設計パターン¶
- 外部依存はトレイト境界(Repository pattern)+ コンストラクタ注入
- 区別すべき値型は Newtype(
UserId(u64)等)で誤代入を型で防ぐ - 状態は enum で網羅、business-critical では
_ワイルドカード禁止 unsafeは// SAFETY:コメントで全不変条件を明記
Python¶
- Python 3.11+
- 型注釈は必須相当(Pyright が
pyproject.tomlの[tool.pyright]でextraPaths = ["python"]監視) - データクラスは
pydantic v2で boundary を型化(python/engine/schemas.py) - 例外は具体型を上げる、ベタな
except Exceptionを握りつぶす silent failure を禁止 - ログは
loggingモジュール経由。PII / 秘密情報はpii_scrub.pyで除去
共通¶
Silent failure 禁止¶
handshake timeout、接続断時の state リセット、エラー broadcast の request_id フィルタ、
sticky error など、失敗時に何が起きるかをコードと E2E テストの両方で示す こと。
Secrets¶
- ハードコード禁止。環境変数 + 起動時 fail-fast 検証
.envは.gitignore- Rust 側は
secrecy/zeroizecrate で in-memory 保護(既に workspace dependency)
Commit / PR¶
- 1 PR = 1 機能 / 1 修正。ドキュメント再編 PR は「リネームのみ」のコミットを冒頭に置き git rename 検知を最大化する
- 不具合修正後は必ず
/bug-postmortemを実行(development/troubleshooting.md)