Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions docs/adr/adr-038-local-llm-finding-classification.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,44 @@ LLM 入力時には runner が `#` で始まる leading 行を skip し `diff --
- post-merge-feedback T3-2 (Frequency Medium / Effort S / Adoption Risk None) として採用
- Phase b/c/d で fixture 追加が継続するため、設計意図のドリフトを構造的に防ぐ

## classify モデル格上げの評価と見送り (2026-07-05 追記、WP-04)

### 動機と方法

classify モードの精度向上 (特に `false_positive_likely` 判定改善による下流の無駄 fix 削減) を狙い、`mistral:7b` からの格上げ候補を実測評価した。方法は本 ADR Phase a の lint-screen eval と同じく **Claude (Opus) 出力を gold baseline** とする:

- eval セット: real CodeRabbit findings 30 件 (過去 PR harvest) + キュレート FP 例 5 件 = **35 件**。各 finding に Opus が gold action (`auto_fix` / `human_review` / `false_positive_likely` / `informational`) を付与。
- 候補: `mistral:7b` (現行 baseline) / `gemma4:12b` (中 dense) / `gemma4:26b` / `gemma4:31b` / `qwen3-coder:30b`。
- 指標: gold 一致率 (accuracy) / FP 処理 / human_review 安全軸 / latency / VRAM。

### 実測結果 (RTX PRO 5000 48GB、num_ctx 8192)

| モデル | accuracy | FP→auto_fix (有害) | human_review 誤送 auto_fix (危険) | invalid | latency 中央 | VRAM |
|---|---|---|---|---|---|---|
| **mistral:7b** | 0.63 | 4/6 | **0/14 (完璧)** | 0 | 0.35s | 5.6GB |
| gemma4:12b | 0.57 | 4/6 | 0/14 | 3 | 0.75s | 8.4GB |
| gemma4:26b | 0.20 | — | — | **27 (破綻)** | 1.46s | 17.6GB |
| gemma4:31b | 0.57 | 3/6 | 0/14 | 0 | 1.49s | 20.9GB |
| qwen3-coder:30b | 0.69 | 3/6 | **1/14 (安全後退)** | 0 | 0.34s | 19.4GB |

### 決定: 格上げを見送り、`mistral:7b` を維持

- **FP 検出は全モデルで未達**: gold FP 6 件のうち正しく `false_positive_likely` にできたのは最良 (qwen3-coder) でも 1 件、全モデルが 3〜4 件を有害な `auto_fix` に誤分類。計画の主目的 (FP 判定改善) を満たす候補が無い。→ これは mistral 固有ではなく、この規模の局所 LLM の **能力上の限界**。
- **mistral:7b は安全軸で完璧**: 人間判断を要する finding (design / state / concurrency / security) を一度も `auto_fix` に倒さない。プロンプトの保守バイアス (「迷ったら human_review」) が正しく機能。accuracy が僅かに上 (+0.06) の qwen3-coder は逆に human_review を 1 件 auto_fix に誤送する **安全後退**を起こす。分類器の目的 (安全な triage) では、accuracy より「人間判断案件を auto_fix に倒さない」保守性が優先される。
- **中型 dense は劣化・破綻**: gemma4:12b / 31b は mistral より accuracy が低く、gemma4:26b は 35 件中 27 件で invalid action を返し破綻 ([ADR-046](adr-046-local-llm-review-spike.md) WP-01 で観測した gemma4:26b の大入力破綻と同系)。
- accuracy 差 (0.63 vs 0.69) は temperature 0.1 のばらつき (±0.03) と同程度で有意でない。mistral:7b は最軽量 (5.6GB) ・最速 (0.34s) ・安全軸完璧のため、格上げを正当化する候補が無い。

### 再利用可能な知見

- **classify モードの eval 手法**: Opus gold baseline との action 一致率 + FP 処理 + 安全軸 (human_review→auto_fix 誤送) の 3 軸評価は、将来のモデル/プロンプト再評価に再利用できる (`cli-finding-classifier` の lint-screen eval と同型)。
- **保守バイアスは分類器の安全機能**: 「迷ったら human_review」は accuracy を下げるが、誤自動修正リスクを構造的に抑える。格上げ候補は accuracy だけでなく安全軸で評価すべき。
- **FP 検出はプロンプト再調整の余地**: `classify.txt` は mistral 向けに tune 済み。FP 検出強化プロンプトで能力限界かプロンプト不適合かを切り分ける follow-up は順位 256。候補の VRAM/latency 実測は [ADR-040](adr-040-local-llm-context-size.md) の新 GPU 再 calibration (順位 255) にも供する。

### 妥当性の脅威

- gold は Opus 判断で `auto_fix` にやや寛容な一方、`classify.txt` は保守設計 (迷ったら human_review) のため、auto_fix/human_review 軸の一致率は過小評価気味。ただし結論を支える 2 軸 (FP 全滅・human_review 安全軸) はこの較正差に頑健。
- N=35 (FP 6 件) と小さい。ただし 5 モデルで一貫した傾向。

## 関連

- [ADR-018: cli-pr-monitor の takt ベース移行](adr-018-pr-monitor-takt-migration.md)
Expand Down
4 changes: 3 additions & 1 deletion docs/harness-improvement-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Anthropic 公式のハーネスエンジニアリング指針(決定論的基
| WP-01 | 1-A | ローカル LLM レビュアー選定スパイク | S-M | なし | 見送り (ADR-046: 意味的再現率 ~13% ≪ 50%、GPU 再calibration → 順位 255) |
| WP-02 | 1-A | `local_review` stage 実装 | M | WP-01 | 見送り (WP-01 前提不成立、ADR-046 で却下) |
| WP-03 | 1-A | CodeRabbit クォータ設計(`.coderabbit.yaml` 新設) | S | なし | 実装済(ADR-019 amendment、dogfood 観測待ち: rate 解除待ち < 1 回/日) |
| WP-04 | 1-A | classifier モデル格上げ(7b → 27b 級) | XS-S | WP-01 | 未着手 |
| WP-04 | 1-A | classifier モデル格上げ(7b → 27b 級) | XS-S | WP-01 | 見送り (ADR-038 amendment: FP 検出改善なし + qwen3-coder は安全後退、mistral:7b 維持。FP-tune 再評価 → 順位 256) |
| WP-05 | 1-A | Stop hook 高速化(nextest + 変更 crate 限定) | M | なし | 未着手 |
| WP-06 | 1-B | 反証(refute)facet 追加 | S-M | なし | 未着手 |
| WP-07 | 1-B | facet 間受け渡しの JSON 化 | M | なし | 未着手 |
Expand Down Expand Up @@ -130,6 +130,8 @@ Anthropic 公式のハーネスエンジニアリング指針(決定論的基

### WP-04: classifier モデル格上げ

> **見送り (2026-07-05、[ADR-038](adr/adr-038-local-llm-finding-classification.md) amendment)**: 実測済み。real findings 30 件 + キュレート FP 5 件 = 35 件を Opus gold baseline とし、5 モデル (mistral:7b / gemma4:12b/26b/31b / qwen3-coder:30b) を比較。**どの候補も FP 検出を改善せず**(全モデル 3〜4/6 の FP を有害な auto_fix に誤分類)、accuracy 最良の qwen3-coder は human_review を auto_fix に誤送する安全後退を起こし、中型 dense は劣化 (12b/31b) or 破綻 (26b=27 invalid)。mistral:7b は安全軸完璧・最軽量のため維持。結論・eval 手法・安全軸の知見は ADR-038 amendment に移管。FP 検出強化プロンプトでの再評価は順位 256。以下は当初ステップ (記録用)。

- **目的**: ADR-038 の findings classification 精度向上(`false_positive_likely` の判定改善で下流の無駄な fix を削減)。
- **ステップ**: WP-01 と同時実施。設定のモデル名変更 + 過去の classification 結果を新モデルで再分類して一致率・改善点を確認。ADR-040 amendment(実測値更新)。
- **注意**: classification はレビューより軽いタスクのため、27b 級が最適とは限らない。WP-01 の候補に加えて中型 dense(例: `gemma4:12b`、7.6GB、256K context)も比較対象に含め、精度が同等なら速度・メモリで有利な方を採る。候補の鮮度確認は WP-01 ステップ 1 と同じ。
Expand Down
1 change: 1 addition & 0 deletions docs/todo-summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@
| 253 | 💎 Tier 3 | **ADR-030 に PR #239 の feedback silent skip 実装記録を追記 (PR #239 post-merge-feedback T3-2 採用)** | todo13.md | XS | なし (owner_repo 検出失敗 → marker 未書込 → L2 recovery 未発動の silent skip シナリオ (PR #238 実観測) と `AiStepContext::SkipWithMarker` による対処を ADR-030 に実装記録として残す。Severity Low = 既修正、次回 ADR-030 参照 PR への同乗で消化可) |
| 254 | 🔧 Tier 2 | **pr_size_check の base を remote tracking ref に変更 — 並列 workspace のローカル master 遅延による誤計測解消 (順位242 push で実観測)** | todo13.md | XS-S | なし (`[pr_size_check] default_branch = "master"` がローカル bookmark 基準の revset `master..@` を使うため、ADR-045 並列 workspace でローカル master が遅延すると merge 済み PR 分を合算して誤計測。順位 242 push で実 diff ~160 行が 1604 行と誤 block された実害、PR #239/#240 でも warning を静かに誤超過。ADR-013 の「remote tracking ref を使う」原則 (sync_local で test 固定済) を pr_size_check にも適用、`[file_length_gate] base` も同点検、順位 250 と相補) |
| 255 | 💎 Tier 3 | **ADR-040 の実測値を新 GPU (RTX PRO 5000 48GB) で再 calibration (ADR-046 WP-01 スパイクで陳腐化を観測)** | todo13.md | S | なし (ADR-038/040 が前提とする RTX 3070 8GB は RTX PRO 5000 Blackwell 48GB に更新済み。27-31B Q4 モデルが 100% GPU で動き VRAM が制約でなくなったため、ADR-040 の VRAM/latency trade-off 表と「VRAM scarcity → model swap 制約」framing が陳腐化。ADR-046 で mistral:7b / gemma4 / qwen3-coder の VRAM・latency を実測済 → ADR-040 amendment に反映、num_ctx 選定 flow の memory 軸を latency 軸へ再重み付け) |
| 256 | ⏳ Tier 5 | **classifier FP 検出強化プロンプトで格上げ候補を再評価 (WP-04 見送りの follow-up、ADR-038 amendment 由来)** | todo13.md | M | なし (WP-04 実測で全候補が FP 検出未達 = 能力限界か `classify.txt` の mistral 向け tune 不適合かが未分離。FP 検出強化プロンプト版で qwen3-coder:30b 等を再測し、能力限界と確認できれば恒久見送り、プロンプト不適合なら該当モデル + 専用プロンプトで格上げ。eval 手法・gold セットは scratchpad WP-04 資産を再利用。materially better な新モデル出現時も再評価トリガー) |

**戦略**: Tier 1 を 2〜3 セッションで片付け → Tier 2 で ADR-032 の前提 + rate-limit + convergence cost 削減を進める → Tier 3 で ADR-032 を land + ドキュメント整備。Tier 4-5 は cleanup / 外部展開で daily efficiency への直接効果は小さい。

Expand Down
25 changes: 25 additions & 0 deletions docs/todo13.md
Original file line number Diff line number Diff line change
Expand Up @@ -721,6 +721,31 @@

---

### classifier FP 検出強化プロンプトで格上げ候補を再評価 (WP-04 見送りの follow-up、ADR-038 amendment 由来)

> **動機**: WP-04 (classifier モデル格上げ) の実測で、mistral:7b からの格上げ候補 (gemma4:12b/26b/31b, qwen3-coder:30b) は **いずれも `false_positive_likely` 検出を改善しなかった** (gold FP 6 件中、正検出は最良 qwen3-coder でも 1 件、全モデルが 3〜4 件を有害な auto_fix に誤分類)。ただし eval で使った `classify.txt` は mistral:7b 向けに tune 済みのため、「FP 検出が能力限界なのか、プロンプト不適合なのか」が未分離。FP 検出を明示的に強化したプロンプト版で候補を再測し、切り分ける。
>
> **参照**: ADR-038 § classify モデル格上げの評価と見送り (2026-07-05 追記、WP-04)、`src/cli-finding-classifier/prompts/classify.txt`、`src/cli-finding-classifier/src/main.rs` (`--prompt-file` で差し替え可)、WP-04 scratchpad の eval セット (Opus gold 35 件) + ハーネス。ADR-019 § 既知 CodeRabbit FP パターン (キュレート FP 例の出典)。
>
> **実行優先度**: ⏳ Tier 5 — Effort M。現行 mistral:7b は安全軸完璧・最軽量で運用に支障なく、優先度は低い。materially better な新 local モデル出現時も再評価トリガー。

#### 作業計画

- [ ] FP 検出強化版 `classify.txt` を作成 (false_positive_likely の positive signal をより明示、Windows 専用/test mock/合成 fixture 等の既知 FP パターンを few-shot 化)
- [ ] WP-04 の Opus gold eval セット (35 件) で qwen3-coder:30b 等を再測、FP recall と human_review 安全軸を確認
- [ ] 能力限界と確認できれば恒久見送りとして本 entry 削除。プロンプト不適合なら該当モデル + 専用プロンプトで格上げ (ADR-038 の model default 変更 + amendment)
- [ ] 本 entry 削除 + todo-summary.md 行削除

#### 完了基準

- FP 検出が「モデル能力限界」か「プロンプト不適合」かが実測で切り分けられ、格上げ採否が結論付けられていること。

#### 詰まっている箇所

- なし (WP-04 の eval 資産・gold セットあり、プロンプト改訂のみ)。

---

## 既知課題 (記録のみ、本セッションで未対応)

(現時点で本ファイルへの既知課題は無し。docs/todo10.md / todo9.md 末尾を参照。)