# PR#290 別AIレビュー反映(commit 7e7e156)
自己評価バイアス排除のため、Claudeが書いたPR#290(freeconsul修正)を**別の生成AIにレビューさせ**、指摘を実地検証の上で反映した(Anthropic Arisパターン=実行役と評価役を分離)。
## レビュアー選定の経緯(コスト最適化)
- 当初grokを検討→**ユーザー「grokだとトークン消費」**で却下
- agy(定額)を試行→180sタイムアウト(プロンプト200行で重い)
- **採用: cerebras/gpt-oss-120b(9router経由・完全無料・非中華・OpenAIオープンモデル)**。usage 3486トークンだが9router無料枠で課金なし
- 中華系(minimax/glm/qwen)はポリシーで回避
## レビュー指摘と対応(鵜呑みにせず実地検証)
| 指摘 | 重大度 | 検証結果 | 対応 |
|------|--------|---------|------|
| html.unescape使え(手動replace漏れ) | Medium | 正当(–→–が漏れてた) | **反映** |
| 終端判定の明示化 | - | - | **反映**(400応答を終端と明示) |
| UA必須・401/403リスク | High | **杞憂**(UAなしでHTTP200) | 取り込まず |
| 空配列で無限リクエスト | High | **実害なし**(範囲外は400→parse空→base_scraperのif not items:breakで停止) | 取り込まず(堅牢化コメントのみ) |
## 反映内容
- `_parse_jobs`: `_clean()` ヘルパでタグ除去+`html.unescape`(エンティティ全般デコード)
- `_is_blocked`/`_parse_jobs`: 範囲外400(`rest_post_invalid_page_number`)を終端シグナルとして明示扱い
## 検証
page1=3件維持・page2(400)=0件で停止・unescape動作(A&B–C→A&B–C)・ruff All passed
## 教訓(受け取ったコードレビューへの向き合い方)
- **レビューを鵜呑みにしない**: High2件は実地検証(curlで実API挙動確認)で否定。「UAなしHTTP200」「範囲外は400でparse空→親ループ停止」を実証
- **妥当な分は素直に反映**: html.unescapeは明確に正しい改善
- 別AIレビューは「自分が見落とした観点(エンティティ処理)」を確実に拾う。コスト無料(9router)で回せる
- requesting/receiving-code-review スキルの精神=performative agreementでもblind rejectionでもなく技術的検証
## 成果物
PR#290(2 commits・base main・マージはユーザー判断) / PR#290にレビュー反映コメント / worktree削除・本番main維持
2026-06-02 別AIレビュー(Arisパターン)実証: PR#290をcerebras gpt-ossが批評→検証して反映