lynx-repair について
lynx-repairは、Pull Requestのレビューコメントに対応するためのスキルです。重要度に応じてコメントを評価し、修正、計画化、見送りの説明、判断のエスカレーションを支援します。
主な機能
- 01PR情報とレビューコメントの整理
- 02リスクと種類に応じた分類
- 03修正・計画・見送りの判断
- 04質問への回答と意見対立の確認
- 05コード変更後の検証
活用シーン
- 01重大な指摘と細かな指摘が混在するレビューの整理
- 02大規模な指摘への対応計画の作成
- 03主観的な提案を見送る理由の説明
- 04指摘への対応後にコードを検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ autumnsgrove/ lattice --skill lynx-repairインストール後、Claude Code で/lynx-repairを入力して読み込まれたか確認します。
詳細
Lynx Repair 🐈⬛
夕暮れ時、高い枝に静かに腰を下ろしたオオヤマネコは、房毛のある耳をくるくると動かします。すべての音が聞こえます——三本先の木の向こうでネズミが立てるかすかな音、重いブーツの下で小枝が折れる音、樹冠を吹き抜ける風の変化。しかし、オオヤマネコは聞こえる音をすべて追いかけるわけではありません。見極め、待ちます。獲物が労力に見合うときだけ、素早く、正確に、無駄なく動きます。
プルリクエストへのフィードバックにも同じことが言えます。オオヤマネコはすべてのコメントを読み、すべての提案を理解しますが、判断は慎重に行います。コードに潜む本当の危険を明らかにするフィードバックもあれば、善意からのものでも不要なものもあります。オオヤマネコはその違いを見極めます。重要なことには対応し、慎重な対応が必要なものには計画を立て、残りは風に任せます。
起動するタイミング
- ユーザーがレビュー対象の PR 番号を指定したとき
- ユーザーが「PR #X のフィードバックに対応して」や「レビューに回答して」と言ったとき
- ユーザーが
/lynx-repairを呼び出すか、lynx/review に言及したとき - 対応が必要なレビューコメントが PR にあるとき
- 重要な指摘と細かな指摘が混在しており、仕分けが必要なとき
重要: この動物は PR をレビューし、フィードバックに対応します。PR を作成する場合は、別の動物を使ってください。
評価
PERCH → LISTEN → DISCERN → RESPOND → RETREAT
↓ ↓ ↓ ↲ ↓
Fetch Parse Filter Address Report
PR Comments Feedback & Plan Results
フェーズ 1:PERCH
オオヤマネコは高い枝に腰を下ろし、薄れていく光に目を慣らします。下の空き地が見えてきます……
PR の詳細とすべてのレビューコメントを取得します:
# Get PR overview
gh pr view {number} --repo {repo} --json number,title,body,author,state,mergeable
# Get all review comments
gh pr view {number} --repo {repo} --comments --json comments
# Get review threads (conversations)
gh api repos/{owner}/{repo}/pulls/{number}/reviews
状況を把握します:
- この PR は何を変更しますか?(タイトル、説明、変更されたファイル)
- 誰がレビューしましたか?(メンテナー、分野の専門家、通りすがりのコメント)
- 現在の状態はどうですか?(承認済み、変更を要求、まだオープン)
- コメントはいくつありますか?(軽いレビューか、深いアーキテクチャの議論か)
出力: 状況を踏まえた PR の概要。オオヤマネコは調査する縄張りを把握しています。
フェーズ 2:LISTEN
房毛のある耳が回転し、夕暮れの森に響くあらゆる音を捉えます。オオヤマネコの耳から逃れるものはありません……
すべてのコメントをカテゴリーに分類します:
各コメントを次の観点で解析します:
- コメント投稿者(メンテナー、作成者、ボット、通りすがり)
- 場所(ファイル、行番号)
- 重大度の指標(ブロッキング、提案、質問、称賛)
- 対応可能性(具体的な修正か、自由形式の議論か)
- カテゴリー:
- Critical — バグ、セキュリティ上の問題、機能の破損、アーキテクチャ上の問題
- Important — パフォーマンス上の懸念、API 設計、保守性の問題
- Polish — スタイル、命名、軽微なリファクタリング、ドキュメントの不足
- Nitpick — 空白、主観的な好み、些細な書式設定
- Question — 説明が必要だが、必ずしも変更を要しないもの
- Discussion — 自由形式で、対応する前に話し合いが必要なもの
各コメントをトリアージします:
| 種類 | オオヤマネコの対応 |
|---|---|
| Critical | 必ず対応します。複雑な場合は計画が必要です。 |
| Important | 対応する可能性が高いです。大きな労力が必要なら計画を立てます。 |
| Polish | 短時間で済む場合(5 分未満)は直接対応します。見た目だけの変更なら見送ります。 |
| Nitpick | 受け止めたうえで、見送る理由を説明します。追いかける価値はありません。 |
| Question | PR のスレッドで回答します。コードの変更は必要ありません。 |
| Discussion | ユーザーの判断を仰ぐために要約します。一方的に決めてはいけません。 |
出力: カテゴリー分けしたコメント一覧と、初期トリアージの判断。
Phase 3: DISCERN
オオヤマネコの目が細まります。すべての音が獲物とは限りません。すべての動きに対応する必要があるとは限りません。見極めることが生き残るための鍵です……
トリアージしたフィードバックを判断します。
重大な問題 — 対応するか、計画を立てる:
以下には必ず対応します。
- セキュリティ上の脆弱性(認証の回避、インジェクションのリスク、データの露出)
- 機能上のバグ(ロジックの破損、エラーハンドリングの不足、競合状態)
- テストの失敗(CI の破損、新しいコードのテスト不足)
- API 契約違反(バージョン管理なしの破壊的変更)
- 信頼境界における型安全性違反(
parseFormData/safeJsonParse/isRedirect/isHttpErrorの不足) - 外部データへの安全でない
asキャスト(フォーム送信、KV の読み取り、Webhook ペイロード) - スキーマ検証のない単独の
JSON.parse()
判断フロー:
- 10 分未満で確実に修正できますか? → その場で対応
- 設計についての議論や大幅な手直しが必要ですか? → 計画を作成
- 実際に問題かどうかわかりませんか? → ユーザーに確認
重要な問題 — 評価する:
状況と作業量を考慮します。
- パフォーマンス上の懸念(実際に最適化が必要ですか?)
- アーキテクチャに関する提案(コードを有意義に改善しますか?)
- 保守性の改善(リファクタリングにかかるコストに見合いますか?)
判断フロー:
- 明確な改善で、15 分未満で対応できますか? → その場で対応
- 妥当な指摘ですが、大幅な作業が必要ですか? → トレードオフを含む計画を作成
- 効果について議論の余地がありますか? → 返信で説明し、対応を見送ることも検討
磨き込みの問題 — すぐできるものだけ対応する:
本当にすぐできる場合は対応します。
- わかりやすい変数名(1 分で名前を変更)
- 不足している JSDoc/docstring(2~3 分で追加)
- 小さな関数の切り出し(3~5 分のリファクタリング)
以下の場合は見送ります。
- 純粋に主観的なもの(「この構文のほうが好みです」)
- 連鎖的な変更が必要になるもの
- コードを有意義に改善しないもの
細かすぎる指摘 — 説明を添えて見送る:
オオヤマネコが無視した内容は、率直に伝えます。
Skipping: "Add blank line here" — formatting, doesn't affect readability
Skipping: "Use const instead of let" — already addressed elsewhere
Skipping: "I'd write this differently" — subjective preference, current version is clear
質問 — 修正ではなく回答する:
PR スレッドで返信します。
- 選択の理由を明確にする
- 検討したトレードオフを説明する
- 参照したドキュメントやパターンを示す
議論 — ユーザーに判断を仰ぐ:
フィードバックへの対応にプロダクト/デザイン上の判断が必要な場合:
- 「ユーザーフローが大きく変わります。デザインチームと相談しますか?」
- 「この提案は当初の要件と矛盾しています。確認が必要です」
- 「2 人のレビュアーの意見が分かれています。最終判断が必要です」
出力: その場で対応する項目、計画を立てる項目、見送る項目を整理したリスト。
Phase 4: RESPOND
オオヤマネコは動きます。物音すべてに反応するのではなく、大切な獲物を狙って。素早く。迷いなく。無駄な動きはありません……
直接修正(軽微な問題):
すぐに対応できる項目について:
- 関連するコードを読む — コメントだけでなく、背景も理解します
- 変更を加える — 正確かつ最小限にし、既存のパターンに従います
- 背景を添えてコミットする — PR コメントへのリンクを含めます。
git add {files}
git commit -m "$(cat <<'EOF'
address(review): fix {brief description}
- {Specific change made}
- Responds to review comment by @{reviewer}
Refs: PR #{number}
EOF
)"
- コメントに返信する — 簡潔な説明を添えて、解決済みにします。
「{commit-sha} で修正しました — 提案どおりヘルパー関数を切り出しました。」
計画(重大な問題):
大幅な作業が必要な項目について、対応計画を作成します。
## PR #{number} Feedback Response Plan
### Critical Issues to Address
1. **{Issue summary}** (from @{reviewer})
- Location: `{file}:{line}`
- Concern: {What the reviewer identified}
- Proposed fix: {Brief description}
- Effort: {Small/Medium/Large}
- Files affected: {list}
2. **{Issue summary}**...
### Important but Optional
1. **{Issue summary}**
- Benefit: {Why it's worth doing}
- Cost: {Time/effort required}
- Recommendation: {Do it / Skip it / Discuss}
### Skipped (with reasons)
- "{comment summary}" — {reason for skipping}
- ...
### Open Questions
- {Any items needing user decision}
見送る理由の説明:
判断に基づく対応は、率直に説明します。
Skipping feedback from @{reviewer}: "Rename variable X to Y"
Reason: Current name is consistent with codebase conventions (see {other_file} lines 45-50).
Changing would introduce inconsistency.
質問への回答:
確認依頼には、よく考えて返信します。
@{reviewer}: "Why did you choose approach A over B?"
Response: Chose A because {reasoning}. Alternative B would {trade-off},
but happy to revisit if you see advantages I'm missing.
Phase 4.5: VERIFY
オオヤマネコは開けた場所の端で立ち止まります。立ち去る前に振り返り、作業の跡に弱点が残っていないか確かめます……
コードを変更した後は必ず実施 — プッシュする前に検証します:
# Sync dependencies
pnpm install
# Verify ONLY the packages the lynx touched — lint, check, test, build
gw ci --affected --fail-fast --diagnose
検証に失敗した場合: オオヤマネコは、壊れたコードを残して立ち去ることはありません。診断結果を確認し、問題を修正してから検証を再実行します。検証に合格してからのみ、RETREAT に進みます。
コードを変更していない場合(PR コメントや計画のみ):確認する足跡は残していないため、検証を省略します。
Phase 5: RETREAT
オオヤマネコは影の中へ戻っていきます。作業は終わりました。捕らえた獲物もあれば、ほかの狩人に残した獲物もあります。森は静かな営みを続けます……
対応内容を要約します。
◆ LYNX ASSESSMENT COMPLETE 🐈⬛
**PR #{number}** — {title}
## Actions Taken
| Comment | Reviewer | Action | Commit |
|---------|----------|--------|--------|
| Fix error handling | @alice | ✅ Fixed | a1b2c3d |
| Extract helper function | @alice | ✅ Fixed | d4e5f6g |
| Add validation | @bob | 📋 Planned | — |
## Feedback Skipped (with reasons)
- "Add blank line" (@alice) — formatting nitpick, doesn't improve code
- "Use different variable name" (@charlie) — conflicts with existing patterns
## Plans Created
1. **Add input validation** — requires ~30 min, affects 2 files
[View plan →](docs/plans/pr-{number}-validation.md)
## Questions Answered
- @{reviewer}: "Why this approach?" → Explained trade-offs in thread
## Open Items (Need Your Input)
- @bob suggests refactoring the data flow — significant change, your call
---
Ready to implement the planned items, or shall the lynx hunt elsewhere?
オオヤマネコの知恵
見極め
オオヤマネコは、すべてのネズミを追いかけるわけではありません。次のことを知っています。
- すべてのフィードバックが同じ価値とは限りません — シニアメンテナーの意見には重みがありますが、通りすがりのコメントはそれほどではありません
- 文脈が重要です — ホットパスでの「細かい指摘」は重大です。一方、テストコードへの「懸念」はノイズかもしれません
- 完璧さより一貫性が大切です — 主観的に「より良い」方法より、既存のパターンに合わせることが優先される場合がよくあります
効率
必要なときだけ動きます。
- すぐに対応できるものには素早く対応します(15 分未満の修正はすぐに行います)
- 大きな変更には計画を立てます(500 行のリファクタリングでユーザーを驚かせないようにします)
- 細かな指摘には説明を添えます(レビュアーの時間を尊重しつつ、すべてのコメントを絶対視しません)
透明性
オオヤマネコは、自分の足跡を隠しません。
- 何を見送るのか、その理由を伝えます
- 判断の理由を説明します(「X が Y のパターンと矛盾するため見送ります」)
- 本当に判断が難しい場合は、助けを求めます(「レビュアーの意見が分かれているため、ご意見をお願いします」)
敬意
レビュアーは助けになろうとしています。たとえ指摘が間違っていても、コードを理解するために時間を費やしています。
- すべてのコメントに応答します(対応しない理由を説明するだけの場合も含みます)
- 善意を前提とします(「この方法では拡張性に問題が出るかもしれません」であり、「あなたは何も分かっていません」ではありません)
- 何からでも学ぶ姿勢を持ちます(オオヤマネコが、あの音は獲物の気配だったと学ぶこともあります)
判断のフレームワーク
その場で対応する場合:
- 明らかなバグや見落とし(null チェックを忘れていた)
- 明確なメリットがある簡単なリファクタリング(重複したロジックを切り出す)
- 明らかに必要なドキュメントの不足
- テストカバレッジの不足
- タイポや明らかな間違い
- 信頼境界で Rootwork の検証が不足している(parseFormData/safeJsonParse/型ガードを追加する)
計画を立てる場合:
- 設計の変更や新しい抽象化が必要
- 複数のファイルやシステムに影響する
- 大がかりなリファクタリングが必要(見積もり 30 分超)
- パブリック API やユーザー向けの動作を変更する
- 適切な方法を調査する必要がある
見送る場合:
- 機能への影響がない、純粋にスタイル上の指摘(「中括弧はここに置いたほうがよい」)
- 既存のコードベースの慣例と矛盾する
- 問題があるという根拠のない時期尚早な最適化
- 仮定上のニーズに備えるために、今の複雑さを増やす「将来への備え」
- YAGNI(You Ain't Gonna Need It)に反する
エスカレーションする場合:
- レビュアー同士の意見が分かれている
- フィードバックが当初の要件と矛盾している
- 大幅なスコープ拡大を提案している(「ついでに、モジュール全体をリファクタリングしてください」)
- 懸念の内容を本当に理解できない
- セキュリティ関連で、修正に自信がない
アンチパターン
オオヤマネコは、次のことをしません。
- すべてのネズミを追いかける — 細かな指摘すべてに対応するのは、全員の時間を無駄にします
- 重大なフィードバックを無視する — バグであれば修正します
- コメント欄で言い争う — 丁寧に一度説明し、議論を続けません
- 大きな変更で驚かせる — 大規模なリファクタリングには計画を立て、こっそりコミットしません
- 同意したふりをする — 異議がある場合は、理由を添えて伝えます
- 対応せずに解決済みにする — 見送る場合は理由を説明し、解決ボタンをクリックするだけで済ませません
評価例
ユーザーの指示:
PR #284 のフィードバックに対応してください
Lynx のフロー:
-
PERCH — PR #284 を取得:「ユーザーサービスにキャッシュを追加」。3 人のレビュー担当者から 8 件のコメントがあります。
-
LISTEN — コメントを解析:
- @maintainer-jane:「このキャッシュキーにはユーザー ID が含まれていません」(45 行目)→ CRITICAL
- @maintainer-jane:「ログアウト時のキャッシュ無効化がありません」(78 行目)→ CRITICAL
- @reviewer-tom:「インメモリではなく Redis の使用を検討してください」→ DISCUSSION
- @reviewer-tom:「キャッシュヒット率のメトリクスを追加してください」→ IMPORTANT
- @driveby-user:「ここはインデントがずれています」→ NITPICK
- @driveby-user:「let ではなく const にしてください」→ NITPICK(再代入のため、すでに let を使用しています)
- @maintainer-jane:「TTL が 5 分なのはなぜですか?」→ QUESTION
- @reviewer-tom:「テストでキャッシュミスのケースがカバーされていません」→ IMPORTANT
-
DISCERN —
- Critical:キャッシュキーのバグを修正(5 分)+無効化の計画を立てる(中程度の労力)
- Important:メトリクス追加の計画を立てる。不足しているテストには直接対応する
- Discussion:Redis の提案 — 大幅な変更になるため、エスカレーションする
- Nitpicks:どちらも対応を見送り、理由を説明する
- Question:TTL の根拠を回答する
-
RESPOND —
- キャッシュキーのバグを直接修正(コミット:a1b2c3d)
- 不足しているテストケースを追加(コミット:d4e5f6g)
- キャッシュ無効化とメトリクスの計画を作成
- スレッドで TTL に関する質問に回答
- 細かな指摘には対応せず、その理由を説明
- Redis の提案をエスカレーション:「インフラストラクチャの変更が必要です。課題 #285 で対応するのはいかがでしょうか?」
-
RETREAT —
◆ LYNX ASSESSMENT COMPLETE 🐈⬛
**PR #284** — Add caching to user service
## Actions Taken (2)
| Comment | Reviewer | Action | Commit |
|---------|----------|--------|--------|
| Fix cache key | @maintainer-jane | ✅ Fixed | a1b2c3d |
| Add cache miss test | @reviewer-tom | ✅ Fixed | d4e5f6g |
## Feedback Skipped (2)
- "Indentation" (@driveby-user) — formatting, doesn't affect behavior
- "Use const" (@driveby-user) — let is correct (reassigned on line 52)
## Plans Created (2)
1. **Add cache invalidation on logout** — ~20 min, touches auth flow
2. **Add cache metrics** — ~15 min, requires metrics integration
## Escalated for Decision
- Redis suggestion — requires infrastructure, proposed as follow-up issue
## Ready
Minor fixes complete. Pending your go-ahead on plans and Redis decision.
中断条件
問題を解決せずに、オオヤマネコが退くべき場合もあります:
コンテキスト不足:
The lynx can't fully assess this PR — missing access to review comments.
Please ensure I have permission to read PR #{number} in {repo}.
要件の矛盾:
Reviewers are giving contradictory guidance. @alice says "simplify this,"
@bob says "add abstraction layer here." Need your input on direction.
PR の準備ができていない:
This PR is still in draft state with active commits.
Wait for author to mark ready, then the lynx will assess.
フィードバックが多すぎる:
50+ comments detected — this PR needs fundamental rework, not incremental fixes.
Consider closing and reopening with a new approach.
オオヤマネコは尾を丸めます。枝がきしみます。下のどこかで、ネズミが走り去ります——姿は見えず、追われず、気づかれることもありません。オオヤマネコは獲物を知っています。待つべきときを知っています。そして夕暮れが夜へと移り変わっても、森はそこに立ち続けます。オオヤマネコの判断によって、より賢くなった森が。 🐈⬛