Skip to content

perf(cli-finding-classifier): Ollama eval を env opt-in 化 (push T1) - #279

Merged
aloekun merged 2 commits into
masterfrom
perf/lint-screen-evals-opt-in
Jul 16, 2026
Merged

perf(cli-finding-classifier): Ollama eval を env opt-in 化 (push T1)#279
aloekun merged 2 commits into
masterfrom
perf/lint-screen-evals-opt-in

Conversation

@aloekun

@aloekun aloekun commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Summary

  • assert ゼロの計測専用テスト run_lint_screen_against_all_fixtures
    LINT_SCREEN_EVALS env opt-in 化し、quality_gate と takt fix step の
    cargo test -- --ignored から除外
  • --ignored スイート全体が 63s → 21s (-42s)。dogfood push の quality_gate は
    93.9s (PR feat(cli-push-runner): stage 別の所要時間ログを追加 (push パイプライン改善 T0) #278) → 46.5s
  • step_timeout を 600 → 300 に right-size。600 の根拠だった eval が消えたため、
    cold build 実測 (最遅 = cargo test 28s) に約 10 倍のマージンで再設定
  • tests/lint_screen_evals.rs{main.rs, e2e.rs} に分割 (file-length ratchet 対応)
  • ADR-038 に eval の起動手順と、ADR-040 の resource 数値が stale である旨を記録
  • T0 の実測記録コミット (docs) を同梱

Context

push パイプラインの遅延調査 (docs/push-pipeline-fix-plan.md) の T1。
#[ignore] 付きだが、gate と takt fix step が --ignored を無条件で付けるため
毎 push (fix があれば 2 回) 実 LLM を呼んでいた。このテストは assert を持たず
(report_summary は println のみ)、gate では時間だけ払って何も検証しない。
削除ではなく opt-in 化したのは、モデル/プロンプト変更時の人手評価に価値があるため。

着手前の実測で計画の前提が崩れたため、期待効果を修正した上で実施している。
計画が根拠に引いていた「eval 269s」は再現せず 63s だった (GPU が RTX PRO 5000 48GB に
更新済みで mistral:7b の推論が高速化)。期待効果を -2〜4.5 分/push → -42s/push に
下方修正し、§1 結論の「eval が 12 分超の主犯」という認定も訂正した (真の主犯は
takt の execute/fix = T10/T12)。判断根拠は §8 判定記録に記載。

Scope: ファイル分割は T1 に付随して発生した (対象ファイルが変更前から 799 行 =
上限 800 で、ガード追加分が入らなかった)。rename 検出により diff は 518 行に収まり、
PR size の warning 閾値 800 を下回るため分割 PR にはしていない。

Validation

  • cargo test: 全 workspace pass (失敗 0)。--ignored も pass
  • cargo clippy --workspace --all-targets --all-features -- -D warnings: clean
  • pnpm lint / pnpm lint:docs: OK
  • opt-in 経路の smoke test: LINT_SCREEN_EVALS=1 で 15 fixture が実行され
    agreement 86.7% (13/15、GO) を確認。未設定時は skip メッセージを出して即 return
  • gate 経路の実測: --ignored 63s → 21s、eval 単体 41.3s → 0s
  • pnpm push pre-push review: verdict=APPROVE (simplicity / security とも、
    fix iteration 0)。simplicity の non-blocking 指摘 (e2e.rs のモジュールコメントが
    自身の gate 境界を不正確に記述) は修正し、再 push で再 APPROVE

References

Summary by CodeRabbit

  • 新機能
    • lint-screen のローカル LLM 評価を、環境変数で明示的に有効化した場合のみ実行できるようになりました。
    • 評価実行時に、適合率・再現率・混同行列・レイテンシなどの集計結果を確認できます。
  • 改善
    • 通常のパイプライン実行では評価処理をスキップし、実行時間を短縮しました。
    • 品質ゲートのタイムアウト設定を見直し、600秒から300秒へ短縮しました。
  • ドキュメント
    • 評価の実行手順、測定結果、設定変更の背景を追記しました。

aloekun and others added 2 commits July 16, 2026 23:25
T0 (PR #278) の dogfood push で得た stage 別実測を §5 T0 に記録した。
あわせて、その実測が T1 の前提と食い違う点を T1 セクションに申し送りとして残す。

- quality_gate 実測 93.9s に対し、T1 が根拠に引く 269s は約 3 倍。
  T1 の期待効果 (-2〜4.5 分/push) と受け入れ基準 (269s → 90s 未満) は
  そのままでは使えない可能性が高い。
- 想定原因はローカル LLM 環境の更新 (ADR-040 記録時 RTX 3070 8GB →
  現 RTX PRO 5000 48GB)。ADR-040 の resource 数値は stale。
- T1 着手前に `--ignored` スイート全体と eval テスト単体を実測し、
  前提が生きているかを判定してから方針を決める手順を記載。

T1 は別セッションで実施するため、そのセッションが本ファイルだけで
判断できるよう計測コマンドと判断分岐まで書き下している。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e から除外 (push パイプライン改善 T1)

assert を持たない計測専用テスト run_lint_screen_against_all_fixtures が、
quality_gate と takt fix step の `cargo test -- --ignored` に巻き込まれて
毎 push 実行されていた。LINT_SCREEN_EVALS が truthy のときだけ走るよう
テスト側にガードを入れる (呼出箇所が gate / fix / 手動と複数あるため
コマンド側では漏れる)。

実測 (2026-07-16, Ollama 起動状態):
- --ignored スイート全体: 63s → 21s (-42s)
- eval 単体: 41.3s → 0s (skip)
- opt-in 経路は 15 fixture が正常実行され agreement 86.7% (GO)

なお計画が根拠に引いていた 269s は再現せず 63s だった (GPU 更新により
mistral:7b の推論が高速化)。期待効果を -2〜4.5 分/push → -42s/push に
下方修正し、ADR-040 の resource 数値が stale である旨を記録した。

step_timeout: 600 → 300。600 に上げた主因 (eval) が消えたため実測ベースで
right-size。cold build 実測の最遅コマンドは cargo test の 28s で、約 10 倍の
マージンを確保。step_timeout は group 単位でなくコマンド単位の適用。

tests/lint_screen_evals.rs は変更前から 799 行 (上限 800) でガード追加分が
入らないため、main.rs (schema/metrics) と e2e.rs (実 Ollama 呼出) に分割した。
Cargo が tests/<name>/main.rs を test target として認識するため target 名と
起動コマンドは不変。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

lint-screen の Ollama eval を LINT_SCREEN_EVALS による opt-in 実行へ分離し、E2E 実装と集計処理を e2e.rs に移動した。quality gate の step_timeout を 600 秒から 300 秒へ変更し、実測結果を関連文書へ反映した。

Changes

lint-screen eval 実行制御

Layer / File(s) Summary
E2E eval ランナーと集計
src/cli-finding-classifier/tests/lint_screen_evals/e2e.rs, src/cli-finding-classifier/tests/lint_screen_evals/main.rs
Ollama を使う eval を e2e.rs へ分離し、LINT_SCREEN_EVALS の truthy 判定、個別評価、confusion matrix、precision/recall、レイテンシ、Phase b verdict の出力を追加した。
パイプライン設定と実測記録
push-runner-config.toml, docs/adr/adr-038-local-llm-finding-classification.md, docs/push-pipeline-fix-plan.md
quality_gate.step_timeout を 600 秒から 300 秒へ変更し、eval の opt-in 手順、実測時間、効果見込み、完了判定を更新した。

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant TestRunner
  participant lint_screen_evals
  participant Ollama
  participant screen_diff
  TestRunner->>lint_screen_evals: LINT_SCREEN_EVALS を確認
  lint_screen_evals->>Ollama: eval 用モデルを呼び出す
  Ollama-->>screen_diff: LLM の分類結果
  screen_diff-->>lint_screen_evals: AgreementMetrics と latency
  lint_screen_evals-->>TestRunner: 集計レポートを出力
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Ollama eval の env opt-in 化という主要変更を簡潔に示しており、変更内容と一致しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch perf/lint-screen-evals-opt-in

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: issue_comment (created) / 実行 run
  • CI: CodeRabbit のみが registered check として存在し pending (Review in progress)。他の CI check は未検出。mergeStateStatus は UNSTABLE(CodeRabbit pending が原因と推測、mergeable 自体は MERGEABLE
  • レビュー状況: CodeRabbit — レビュー未完了("Currently processing new changes... please wait" の in-progress コメントのみ、findings 未生成)。人間レビューアーの review / inline comment / conversation comment は 0 件
  • Verdict: approved(現時点で applicable な指摘が 0 件のため。CodeRabbit のレビュー完了後に再評価が必要な可能性あり)

Applicable Findings (Critical / High / Major)

該当なし

Applicable Findings (Medium 以下)

該当なし

Filtered (not applicable)

該当なし(レビュー指摘自体が 0 件のため、fitness filter 適用対象なし)

次のアクション

  • CodeRabbit のレビューが完了し次第、findings の有無を再確認する(このバックストップは待機しないため、次の issue_comment イベントで再評価される)
  • diff 概要(軽量サマリー、レビュー指摘 0 件のため):
    • docs/adr/adr-038-local-llm-finding-classification.md: T1 実施結果セクションを追記(env opt-in 手動実行手順、実測値、GPU 更新に伴う ADR-040 stale 指摘)
    • docs/push-pipeline-fix-plan.md: T0/T1 のステータス更新、着手前実測・実施結果・受け入れ基準達成状況の記録
    • push-runner-config.toml: quality_gate.step_timeout600300 に right-size、変更理由をコメントで追記
    • src/cli-finding-classifier/tests/lint_screen_evals/e2e.rs(新規、214行): 実 Ollama 呼出テストを main.rs から分離し、LINT_SCREEN_EVALS env opt-in ガードを追加
    • src/cli-finding-classifier/tests/lint_screen_evals.rstests/lint_screen_evals/main.rs(リネーム、76% similarity): e2e 関連コードを e2e.rs へ移動、mod e2e; を追加
    • 変更の性質: ドキュメント更新 + テストファイル分割/ガード追加 + 設定値変更。ADR-035 docs-only の対象外(テストロジック変更・config 変更を含むため)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/push-pipeline-fix-plan.md`:
- Around line 281-286: 同文書内の旧ファイル参照を更新し、削除済みの tests/lint_screen_evals.rs
と旧行番号ではなく、分割後の tests/lint_screen_evals/e2e.rs
にある該当関数名を参照してください。分割後の構成および記録内容と一致する表記に揃えてください。
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 11a0cd07-9efc-46eb-9610-76caafa65d6a

📥 Commits

Reviewing files that changed from the base of the PR and between a05ddcc and ea830d8.

📒 Files selected for processing (5)
  • docs/adr/adr-038-local-llm-finding-classification.md
  • docs/push-pipeline-fix-plan.md
  • push-runner-config.toml
  • src/cli-finding-classifier/tests/lint_screen_evals/e2e.rs
  • src/cli-finding-classifier/tests/lint_screen_evals/main.rs

Comment on lines +281 to +286
- **ファイル分割 (T1 に付随して発生)**: `tests/lint_screen_evals.rs` が変更前から 799 行
(上限 800) で、ガード追加分が入らなかった。file-length linter は touch-trigger ratchet
のため、`tests/lint_screen_evals/{main.rs,e2e.rs}` に分割した (main = schema/metrics の
常時実行テスト 608 行 / e2e = env ガード + 実 Ollama 呼出 + レポート)。
Cargo が `tests/<name>/main.rs` を test target として自動認識するため、
target 名 `lint_screen_evals` と既存の起動コマンドは不変。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

同文書内の旧ファイル参照も更新してください。

Lines 209-210 は削除済みの tests/lint_screen_evals.rs と旧行番号を参照したままです。tests/lint_screen_evals/e2e.rs の関数名参照へ更新し、分割後の記録と整合させてください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/push-pipeline-fix-plan.md` around lines 281 - 286,
同文書内の旧ファイル参照を更新し、削除済みの tests/lint_screen_evals.rs と旧行番号ではなく、分割後の
tests/lint_screen_evals/e2e.rs にある該当関数名を参照してください。分割後の構成および記録内容と一致する表記に揃えてください。

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: pull_request_review (submitted) / 実行 run
  • CI: CodeRabbit = success (review completed)。analyze (本バックストップ自身の check) = pending (自己参照のため実質ブロッカーではない)。他の CI check は未登録 (このリポジトリは push-runner による push 時ゲート運用のため、PR 上の build/test check は無い設計と推測)。mergeStateStatus は UNSTABLE だが mergeable: MERGEABLEanalyze pending が原因と推測。
  • レビュー状況: CodeRabbit — レビュー完了、actionable comment 1 件投稿 (2026-07-16T15:48:53Z、直近のバックストップコメント 15:46:18Z より後)。人間レビューアーの review は 0 件。
  • Verdict: approved

Applicable Findings (Critical / High / Major)

該当なし

Applicable Findings (Medium 以下)

該当なし

Filtered (not applicable)

# File (Line) Issue Filter Reason
1 docs/push-pipeline-fix-plan.md (281-286) CodeRabbit: 「同文書内の旧ファイル参照 (tests/lint_screen_evals.rs) が削除済みファイル・旧行番号を参照したままなので tests/lint_screen_evals/e2e.rs の関数名参照へ更新すべき」 該当パラグラフは「tests/lint_screen_evals.rs が変更前から 799 行だったため分割した」という過去形の実施結果記録であり、この文書の「実施結果」節に一貫する意図的な歴史的記述パターン (before/after を記録する convention。§5 の他の実施結果パラグラフも同様に旧状態を明示的に記述)。旧ファイル名への言及自体が「なぜ分割したか」の根拠説明そのものであり、これを新ファイル名に書き換えると文意が破綻する (分割前の単一ファイルの行数を述べている箇所であるため)。行番号への言及もこの段落には存在しない。intentional design と判定し filter。

次のアクション

  • 対応不要。CodeRabbit の唯一の指摘は文書の意図的な過去形記述への誤検知と判断したため、マージ判断への影響なし。
  • analyze check が pending のまま残る場合、mergeStateStatus の UNSTABLE 解消のため本バックストップ workflow 自体の完了を待つのみでよい (追加対応不要)。

@aloekun
aloekun merged commit 35abee3 into master Jul 16, 2026
2 checks passed
@aloekun
aloekun deleted the perf/lint-screen-evals-opt-in branch July 16, 2026 16:03
aloekun added a commit that referenced this pull request Jul 16, 2026
* fix(cli-push-runner): 空 `@` 時の bookmark_check 誤誘導を修正 (push パイプライン改善 T8)

`@` が空で bookmark が `@-` にある状態 (jj new 直後の正常な再 push 状態) で、
同一 run 内の advance_jj_bookmarks が「bookmark を @- に自動更新」と報告した
直後に bookmark_check が「bookmark が見つかりません」と報告し、
`jj bookmark create <name> -r @` を案内していた。従うと空の WIP コミットに
bookmark が付く破壊的操作になる。PR #279 (T1) の dogfood push で実際に発火。

根本原因は「@ が空なら @- を対象にする」規則の二重定義。advance は
determine_target_revision() で規則を持つのに、bookmark_check は
OWN_WORKSPACE_BOOKMARKS_REVSET ("@" 厳密一致) で独自に検査していたため、
両者の判定が食い違った。

修正:
- determine_target_revision() から working_copy_is_empty() を切り出し、
  bookmark_check と共有する (規則の二重定義を解消)。
- 「@ に bookmark が無い」を 2 ケースに切り分ける判定 enum
  BookmarkCheckOutcome と pure function decide_bookmark_check() を追加。
  jj 呼び出しは closure 注入 (ADR-021 原則 3、既存 dispatch_bookmark_advance
  と同じ流儀)。
  - `@` 空 + bookmark が @-: `jj edit @-` + 空 WIP の abandon を案内
    (T1 セッションで実証済みの回避策)。
  - bookmark 皆無: 従来の作成案内が正しいので維持。
- main.rs に重複していた同じ誤案内を撤去し、ケース別案内を出す
  bookmark_check に一本化。

exit 7 による中断は維持し、案内文のみを正す方針を採った。計画の方針 2
(検査を @- 対象にして続行) は、[diff] command = "jj diff -r @" のため
`@` が空のまま続行すると diff が空になり takt レビューが無言 skip された
まま push される (誤誘導バグをレビューバイパスに置き換える) ため不採用。
方針 3 の「push すべき新変更がない」も、再現記録の事実 4 (jj edit @- 後に
push 成功 = 変更はあった) と矛盾するため不採用。

ADR-021 原則 5 との関係: bookmark_check が `@` 厳密一致に狭めているのは
PR #271 (他 workspace の bookmark 混入) の対策。本修正の @- 照会は案内文の
出し分け (診断) 専用で、push 対象の組み立ては `@` のまま維持する。

テスト: mod t8_empty_head_misdirection に 7 本追加 (186 → 193 passed)。
由来 incident と再現状態を module doc に明記 (ADR-049 の流儀)。bad =
2 ケースが潰れないこと、good = bookmark 皆無が NoBookmarks のままである
ことを固定。サンドボックス jj repo で配布 exe が記録の出力を逐語再現する
ことを確認した上で修正後 exe と before/after 比較した。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(review): CodeRabbit Major 2 件 + simplicity 警告 2 件を反映 (PR #280 / push T8)

PR #280 のレビュー指摘を反映する。いずれも「T8 が直したはずの穴が、条件違いで
残っていた」類の指摘で、本タスクの主題 (正確な案内) そのものに関わる。

## CodeRabbit Major (2 件、採用)

1. 判定順を反転し、bookmark が空の `@` にある場合も中断する

   従来は「`@` に bookmark があれば続行」を先に判定していたため、bookmark が
   空の `@` に付いていると Proceed していた。この経路は `jj diff -r @` が空に
   なり、祖先の未 push 変更が AI レビューを経ずに push される — 本タスクが
   方針 2 を却下した理由と同じ穴が、bookmark の位置違いで残っていた。
   `advance_jj_bookmarks` は非 trunk bookmark が 2 つ以上あると fallback 更新を
   skip するため、この状態は実在する (サンドボックスで再現確認済み: 修正前は
   「非 trunk bookmark 検出 (1 件): feat/b」で通過し PR diff 0 行へ進んでいた)。
   「レビュー範囲 = `@` だから `@` は非空でなければならない」という本タスクの
   不変条件に判定順を揃えた。

2. `@-` 照会の失敗を握り潰さない

   `unwrap_or_default()` が照会失敗を「親はあるが bookmark 無し」に変換して
   いたため、`@-` の存在を確認できていないのに実行不能な `jj edit @-` を
   案内し得た。ParentState::Unavailable として保持し、親を確認できない場合は
   `jj edit @-` を案内しない。

## simplicity-review 非ブロッキング警告 (2 件、採用)

3. `query_parent_state()` の jj 失敗を log する

   同ファイルの他の jj 失敗処理や push_jj_bookmark.rs は log_info する慣習が
   あり、ここだけ欠落していた。親を確認できない理由が残らないと、root commit
   なのか jj 不調なのかを切り分けられない。

4. `@-` に bookmark が無い場合の案内を分ける

   `jj edit @-` だけを案内すると次は `NoBookmarks` で止まり根本解決にならない。
   bookmark 作成まで含めて 1 度に案内する 3 つ目の variant に分けた。

## 不採用

CodeRabbit Minor の日付指摘は不採用: CodeRabbit は UTC 基準で「2026-07-16」と
指摘しているが、本 repo の記録は JST 基準 (既存の T0/T1 も同様) のため
2026-07-17 が正しい。同指摘のうち PR 番号 (未採番 → #280) は採用した。

テスト: t8_empty_head_misdirection を 7 → 12 本に拡充 (193 → 198 passed)。
バイパス経路を固定していた既存テスト 1 本は中断側へ反転させた。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant