構造矛盾検出器 — モジュール間の暗黙の契約違反を LLM で検出
偽陰性コスト ≈ 29× 偽陽性コスト → Phase 1 で広く拾い、Phase 2 で絞る
サブプロセスとして再帰呼び出し。LLM タイムアウトが1バッチに閉じる。他バッチへの影響なし。
scripts/ 配下の主要モジュール。色はパイプラインでの役割を示す。
4つの独立した軸で優先度を多角的に評価。3層マージ: defaults ← config.json ← profile
git log からの月次変更頻度。log₂(1+x) で外れ値抑制。月3回以上で max(0.5〜10.0)
git grep からの被参照ファイル数。5ファイル以上で max(1.0〜10.0)
1 + log₂(1 + days/30) × churn_ratio — 放置期間 × 変更頻度で加速
certainty=uncertain は roi_score × 0.3 に減額
| # | パターン名 | 検出対象 | メカニズム |
|---|---|---|---|
| ① | Asymmetric Defaults | 入出力パスで同じ値の扱いが異なる | copy_divergence |
| ② | Semantic Mismatch | 共有名がモジュール間で異なる意味 | copy_divergence |
| ③ | External Spec Divergence | RFC・言語仕様とコードが乖離 | one_sided_evolution |
| ④ | Guard Non-Propagation | 並行パスでバリデーション欠落 | one_sided_evolution |
| ⑤ | Paired-Setting Override | 独立に見える2設定が暗黙に干渉 | independent_collision |
| ⑥ | Lifecycle Ordering | 実行順序の前提が崩れる | independent_collision |
| # | パターン名 | 検出対象 | 箇所数 |
|---|---|---|---|
| ⑦ | Dead Code / Unreachable Path | 未使用エクスポート、永久OFFフラグ | 1箇所可 |
| ⑧ | Duplication Drift | コピペコードの片方だけ更新 | 2箇所 |
| ⑨ | Interface Mismatch | 呼び出し側と定義側で引数不一致 | 2箇所 |
| ⑩ | Missing Abstraction | 同一ロジックが3箇所以上に散在 | 1箇所可 |
LLM は不安定 → 「壊れても最善を尽くす」設計
claude -p ($0) → Anthropic SDK → raw HTTP。CLI不可でもAPI、APIも不可ならHTTP直叩き
markdownブロック抽出 → 直接parse → [...]ブラケット抽出 → rawテキスト(parse_error: true)
Phase 2 が失敗 → Phase 1 結果を全件通過。精度は下がるが検出は止めない(graceful degradation)
サブプロセス再帰呼び出し。1バッチのタイムアウトが全体に波及しない。失敗バッチは警告のみ
依存未インストール → npm install / pip install / brew install を自動実行。全滅でもdry-runで動作
コード変更で code_hash 不一致 → サプレスが自動的に無効化。再レビューを強制
完全一致ハッシュ → trigram類似度55% → エンティティ重複60%。LLMの表現揺れを吸収
検出0件時の3段階: sibling拡大 → 横断契約チェック → 最低確信候補の報告。黙って0件を返さない
明示的に指定された上位が常に勝つ。指定されたキーだけ上書き。
モデル、閾値、容量制限、severity。argparse のフラグに対応。
プロンプト追加指示、無効化パターン、スコアリング重み、テンプレート。