| name | bug_fix_protocol |
| description | バグ修正時のリグレッションテスト作成義務と、グローバル状態共有の禁止ルール。 |
バグ修正プロトコル
[!CAUTION]
テストの Source of Truth は「現在のコード」ではなく「仕様(docs/SPECIFICATION.md)」である。
1. リグレッションテストファースト(絶対ルール)
バグ修正は必ずこの順序で行う:
- テストを先に書く: 修正前のコードで失敗するテストを書き、失敗を確認
- コードを修正する: テストがパスするまで修正
- 全テスト実行:
cargo test --workspace で既存テストへの影響を確認
[!CAUTION]
「修正してからテストを書く」は禁止。 テストがバグを検出できるか保証できなくなる。
2. トートロジー(自己正当化)の防止
AIが「現在のコードの挙動」を正解としてテストを書くと、バグを保護するテストが生まれる。
絶対ルール
- テストの期待値は
docs/SPECIFICATION.md / README.md の仕様から導出する
- 仕様が不明確な場合は、テストを書く前にユーザーに確認する
- 仕様が未定義の挙動を実装する場合は、まず
docs/SPECIFICATION.md に仕様を追記してから実装
3. グローバル状態共有の禁止(プロファイル隔離の本質)
CSW はプロファイルごとにデータ(ディレクトリ・Keychain)を完全に分離するアプリであり、共有されたグローバル状態はプロファイル間の漏洩バグの温床になる。テストでもプロセスグローバルな可変状態を共有しない(並列テストで競合・偽合格を生む)。
static MOCK_STORE: Lazy<Mutex<HashMap<String, String>>> = Lazy::new(|| Mutex::new(HashMap::new()));
thread_local! {
static MOCK_STORE: RefCell<HashMap<String, String>> = RefCell::new(HashMap::new());
}
実コードでも、あるプロファイルの操作が別プロファイルの Keychain / データに波及しないことを常に保証する。
テストで検証すべき観点
| 観点 | テスト内容 |
|---|
| データ分離 | プロファイル A への操作がプロファイル B に影響しない |
| 初期状態 | 新規プロファイルは空データ(または明示した共有元)で開始 |
| 永続化整合性 | 退避したデータが復元で正しく戻る |
| 並列安全性 | テストを並列実行しても Keychain モック等の共有状態が競合しない |
| default の特別扱い | default プロファイルが実ユーザーディレクトリを指す分岐が正しく動く |