affinage について
affinage は、GitHub のプルリクエストにあるレビュー指摘、CI 失敗、マージ競合などを評価するスキルです。単独実行では新たなレビューも加え、採用した指摘を /cure に引き継げます。
主な機能
- 01レビュー・CI・競合の指摘を評価
- 02任意で新たな /age レビューを実行
- 03採用した指摘を /cure に引き継ぎ
- 04レビュー返信の作成と投稿
- 05マージ競合を /melt に引き継ぎ
活用シーン
- 01プルリクエストのレビュー指摘を評価
- 02コード変更と併せて CI の指摘を確認
- 03PR をレビューして修正と返信を準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ paulnsorensen/ easy-cheese --skill affinageインストール後、Claude Code で/affinageを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
wedge.tomlreferences/auto-mode.mdcommands.mdflow-details.mdhandoff-templates.mdmerge-conflict.mdreport-template.md詳細
/affinage
PR に対する既存の主張に対応します。
主張の出所は、レビュー担当者、CI チェック、マージコンフリクトなどです。
各主張を /age の観点から評価します。
受け入れた主張を /cure に送ります。
/affinage は、PR 上に存在する主張を常に評価します。
起動経路によって、新しい /age の検出結果も調べるかどうかが決まります。
- 単独実行 — ユーザーが
handoff_contextなしで/affinage <pr>を開始します。 ユーザーが--no-ageを指定しない限り、PR の差分に対して/ageを実行します。 新しい検出結果を同じレポートに追加します。 - 連携実行 —
/cookまたは/cureがhandoff_contextを渡します。 この連携内ですでに/ageが実行されているため、新たなレビューは省略します。
起動ルールについては ## Fresh review を参照してください。
コンフリクトへの対応経路については ## Merge-conflict resolution を参照してください。
フェーズの開始
python3 skills/affinage/scripts/affinage.pyz wheypoint-resolve --ref <slug> を実行します。
authoritative の場合は記録を使用し、その working_context は最初の一括 tilth_read になります。
not-found の場合はクリーンな状態から進めます。legacy の場合は、その出所とスラッグを表示してから進めます。
gated、ambiguous、error の場合は停止し、ペイロードを表示します。
注意喚起としての stale-commit および grounded-path-missing の検出結果を表示します。
入力
/affinage [<pr-ref>] [--auto --stake <floor>] [--plate] [--safe] [--open-pr] [--hard] [--full] [--include-outdated]
<pr-ref> には、PR 番号、PR#<n> 形式の参照、または GitHub PR の完全な URL を指定できます。
pr-status を呼び出す前に整数を抽出してください。
このコマンドが受け付けるのは整数のみです。
参照が指定されていない場合は、現在のブランチで gh pr view --json number を実行します。
フラグ:
--auto --stake <floor>— 選択プロンプトなしで実行します。<floor>にはblocker、high、medium+、allを指定できます。--autoだけを指定した場合、デフォルトのしきい値medium+が使われます。/cureと同じしきい値ルールを使います。/cure --auto --stake <floor>を送ります。 プロンプトなしで返信を投稿します。references/auto-mode.mdを参照してください。--safe— cure の選択とコンフリクトの解決の前にゲートを追加します。 このフラグを指定しても、デフォルトの返信ゲートは省略されません。--open-pr— PR が存在しない場合に、ターミナルの/plateが新しい PR を作成できるようにします。 このフラグを指定しない場合、/plateはオープン中の PR の更新のみを行います。--plate—--auto --stake medium+ --open-prを実行します。 主張を評価します。 選択した検出結果を修正します。 返信を投稿します。 その後、/plateを実行します。--stake <floor>を明示的に指定した場合は、medium+の代わりにその値を使います。--hard— メタ認知ゲートのフラグをターミナルの/plateに渡します。--full— 重要度の低い検出結果が10件以上ある場合に、すべて表示します。--include-outdated— 期限切れのレビュースレッドを含めます。--no-age— 単独実行モードでの新規レビューを省略します。 このフラグは連携実行モードでは効果がありません。
移植性のルールについては ../cheese/references/harness-portability.md を読んでください。
ヘルパーの解決、エージェントのディスパッチ、GitHub 操作、ハンドオフの遷移について説明しています。
まずバンドルまたはリポジトリのヘルパーを使用してください。
呼び出しパスで ${CLAUDE_SKILL_DIR} 環境変数を使用しないでください。
以下のハンドオフブロックで、移植可能な契約を定義しています。
「スラッシュコマンドはホスト側の表示形式であり、制御モデルではない」というルールがここにも適用されます。
フロー
正確なコマンド、終了コード、評価理由については references/flow-details.md を読んでください。
- PR を解決します。
<pr-ref>またはgh pr view --json numberを使用します。PR#<n>形式の参照または PR の URL を整数に正規化します。 Git リモートから<owner>/<repo>を解決します。 - PR のステータスを取得します。
python3 skills/affinage/scripts/affinage.pyz pr-status <pr>を実行します。logs_expired: trueフィールドがある場合は、status: halt: pr-status-logs-expiredで停止します。 終了コードが 0 以外の場合は、status: halt: pr-status-unavailableで停止します。 マージ状態に競合または未コミットの変更がある場合は、## Merge-conflict resolutionに進みます。 - PR をチェックアウトします。
gh pr checkout <pr>を実行します。 最新のレビューと/cureは、作業ツリーから PR のヘッドを読み取ります。## Merge-conflict resolutionですでに PR をチェックアウトしている場合は、この手順をスキップします。 ブランチを切り替える前に、作業ツリーに未コミットの変更がある場合はstatus: halt: pr-checkout-dirty-treeで停止します。--safeを指定した場合は、チェックアウトする前に確認します。 チェックアウトに失敗した場合は、status: halt: pr-checkout-failedで停止します。 - コメントを取得します。
pulls/<pr>/commentsからインラインスレッドを取得します。 ユーザーが--include-outdatedを指定していない場合は、position: nullのコメントをスキップします。pulls/<pr>/reviewsからレビュー本文を取得します。 空でない本文をそれぞれ保持します。pull_request_review_idによって重複を削除します。 - 回答済みのスレッドをスキップします。 GraphQL
reviewThreadsからスレッドの解決状態を読み取ります。 GitHub が解決済みとマークしたスレッドはスキップします。 解決権限を持つ GitHub ハンドルがルートコメントの後に返信しているスレッドはスキップします。 - 最新のレビューを実行します。
--no-ageを指定せず、単独モードで実行する場合にのみ、この手順を実行します。 コンテキスト付きのレビュー入力を作成し、バンドルされたage-routeコマンドを呼び出します。 手順 5 の未解決スレッド数と CI の失敗クラスを含めます。 完全な対象計画とその根拠を使用して/ageを実行します。 新しい指摘それぞれに[from-age:<dimension>]のタグを付けます。 - 指摘を評価します。
/ageのディメンションと重大度のルールに従って、各指摘を分類します。 レビュー担当者がCHANGES_REQUESTEDを選択したことを理由に重大度を引き上げてはいけません。 対応範囲内で修正できる指摘は、重大度別のセクションに記載します。 外部の根拠が必要な指摘は## Needs-investigationに記載します。 誤りがある、根拠がない、または大規模な指摘は## Reviewer-rejectedに記載します。 現在のヘッドですでに修正されている指摘は## Already-addressedに記載します。 - レポートを作成します。
.cheese/affinage/pr-<n>.mdを作成します。 4 行のハンドオフスラッグから始めます。/ageのレポート本文と affinage の各セクションを追加します。## Outputを参照してください。 - 対応するか、確認を求めます。
## Handoffに従います。 - cure 以外の返信を下書きします。 却下した指摘と調査が必要な指摘への返信を下書きします。 CI または最新のレビューによる指摘には返信しないでください。
- cure の返信を下書きします。
/cureの後にのみ、この手順を実行します。.cheese/cure/pr-<n>.mdから### Appliedと### Deferredを読み取ります。 適用されたコメント指摘にはFixed — <applied summary>.を下書きします。 保留されたコメント指摘にはAttempted fix reverted — <reason>.を下書きします。 - cure の差分を再レビューします。
--autoを指定せずに/cureを実行した後にのみ、この手順を実行します。/cure --autoは独自のスコープ付き/ageチェーンを実行します。.cheese/cure/pr-<n>.mdが推奨する/age <slug> --scope <touched-path>コマンドを実行します。reviewerワーカーのプロンプトは、Review mode: severity-reportの行で始めます。 引き継ぎゲートではなく、/ageの指摘を使用します。## Handoffのルールに従って、新しい指摘をもう一度/cureに送ります。 2 回目の/cureは再レビューしないでください。 これらの指摘への返信は下書きしないでください。 残っている各指摘を残存課題として報告します。 - 返信を投稿します。 下書きしたすべての返信と、すでに対応済みのすべてのスレッドを一覧にした返信確認ゲートを 1 つ表示します。
--autoが有効な場合にのみ、このゲートをスキップします。 承認された返信はpython3 skills/affinage/scripts/affinage.pyz post-replyで投稿します。 返信なしで、承認された対応済みスレッドをそれぞれ解決済みにします。 - 公開します。 承認された返信をすべて投稿した後にのみ、この手順を実行します。
/cureで少なくとも 1 つの修正が適用された場合は公開します。/meltでマージ競合を解決した場合も公開します。 ターミナルで/plate [--open-pr] [--hard] [--safe]を実行します。 次に../cure/SKILL.mdの PR 後の学習内容の書き戻しを実行します。 作業ツリーに変更がない場合は、公開と書き戻しをスキップします。
新規レビュー
スタンドアロンモードでは、entry="affinage" を指定してルーターを呼び出します。
PR の参照情報とルーターの値を /age に渡します。
これにより、/age が entry="age" でより小さなルートを計算するのを防ぎます。
各結果を [from-age:<dimension>] を付けて、該当する重大度セクションに追加します。
ほかの指摘と同様に、これらの指摘を /cure に送ります。
これらの指摘について、GitHub の返信は投稿しないでください。
外部の主張を評価する前に、新規レビューを実行してください。
この順序にすると、重複する指摘を削除できます。
評価ステップと同じエージェントゲートを使用します。
各 reviewer ワーカーのプロンプトは、Review mode: severity-report の行で始めてください。
マージコンフリクトの解決
pr-status がコンフリクトを報告した場合は、PR を /melt に送ります。
/melt は mergiraf、rerere、kdiff3 を使用します。
コンフリクトを手動で解決しないでください。
デフォルトモードと --auto モードでは、/cure の前に checkout と /melt を実行します。
--safe では、まずハンドオフゲートを通過する必要があります。
/melt が失敗した場合は、status: halt: merge-conflicts-need-human と記述して停止します。
/melt は、解決結果をコミットせずに残します。
最後の /plate で、その解決結果をコミットしてプッシュします。
references/merge-conflict.md を参照してください。
サブエージェントのコンテキストゲート
会話、選択、承認状態、返信の投稿は親コンテキストで管理してください。
次のいずれかの制限に該当する場合は、読み取り専用の新しい reviewer を使用します。
- 入力が 10 件を超える。
- 差分が約 25 KB を超える。
- スレッドが 5 ファイルを超える。
共有エージェントリゾルバーを通じて reviewer を解決します。
reviewer のプロンプトは、Review mode: severity-report の行で始めてください。
この行がない場合、reviewer エージェントは blocked: missing-contract を返します。
汎用ワーカーを使用するのは、degraded: true の場合に限ります。
reviewer は、評価済みの指摘を簡潔にまとめたダイジェストを返します。
各指摘には、観点、重大度、確信度、根拠、および反論案を含めます。
親コンテキストでレポートを作成し、選択を管理し、/cure を呼び出して、返信を投稿します。
ダイジェストの制限については、../age/references/sub-agent-gate.md を参照してください。
推奨ツールとフォールバック
ソースコード操作には code-intelligence-routing.md を使用します。
次の affinage ツールを使用します。
| 必要な処理 | 優先する方法 | フォールバック |
|---|---|---|
| PR の状態 | python3 skills/affinage/scripts/affinage.pyz pr-status | gh pr checks と gh pr view |
| GitHub の取得 | gh api | なし。スキルを停止します |
| 返信の投稿 | python3 skills/affinage/scripts/affinage.pyz post-reply | なし。gh api を直接呼び出すと、投稿者情報が省略されます |
出力
レポートを .cheese/affinage/pr-<n>.md に書き込みます。
4 行のハンドオフスラッグから始めます。
続けて /age のレポート本文と ## PR status セクションを追加します。
/age の重大度セクションを使用します。
/affinage の ## Needs-investigation セクションと ## Reviewer-rejected セクションを追加します。
references/report-template.md を参照してください。
status: <canonical status field>
next: cure | done
artifact: <path-to-prior-cure-or-press-report-if-any>
<one-line orientation: what the PR does and what was graded>
ハンドバック契約に記載されている標準の status: 構文を使用します。
フェーズ固有なのは next: と追加のキー付き行のみです。
空のセクションは省略します。
評価が完了したら status: ok を使用します。
gh または pr-status が失敗した場合は、status: halt: <reason> を使用します。
## Handoff のルールに従って next: を設定します。
引き継ぎ
パイプライン: culture → mold → cook (⇄ press) → age → cure → plate.
/affinage は /age と並行して動作し、調査結果を /cure に送ります。
デフォルトでは、affinage はプロンプトなしで動作します。
選択した修正が大規模な場合、調査結果が矛盾する場合、または --safe が有効な場合に限り、確認を求めます。
- 重大度の調査結果があります。 推奨される
all-medium, cheapの選択を算出します。 確認を求める理由がなければ、その選択を通知します。 次に、ロック済みのhandoff_contextを/cureに送ります。 次に、作成した返信ごとに返信ゲートを表示します。 このゲートは、適用済み、保留、反論、調査の返信を対象とします。 確認を求める理由がある場合は、代わりに cure 選択ゲートを表示します。 共有ゲートは../cheese/references/handoff-gate.mdを使用します。 複合選択を事前選択し、大規模な項目を特定します。--autoは両方のゲートを省略します。 - 却下または調査中の主張のみがあります。
/cureは呼び出しません。 返信ゲートを表示します。 次に、選択を待ちます。--autoはこのゲートを省略します。
その後、Flow のステップ 10 から 14 に進みます。
対応が残っていない場合は、status: ok / next: done を設定します。
少なくとも 1 つの調査結果が medium+ の下限を満たす場合は、next: cure を設定します。
重大度の調査結果がない場合は、next: done を設定します。
選択された調査結果が空の場合も、next: done を設定します。
自動モード
--auto または --plate が有効な場合は、references/auto-mode.md を読みます。
ここでは、選択、cure チェーン、返信、公開の手順を定義しています。
--hard モード
終端の /plate に --hard を渡します。
/plate は最終成果物を検証した後、/hard-cheese を実行します。
このチェーンでは、/cure は /plate を呼び出しません。
そのため、ゲートは公開の境界で一度だけ実行されます。
ルール
- 各評価の根拠をコードの証拠に置きます。
- 反論よりも、範囲を限定した修正を優先します。
- 有効で範囲を限定できる品質修正は、
Lowとして/cureに送ります。 ## Reviewer-rejectedは、誤り、根拠がない、または大規模な主張に限って使用します。- affinage ではコード修正を適用しないでください。
- コード修正は
/cureに、マージ競合は/meltに送ります。 --autoが有効でない限り、承認なしで返信を投稿したり、スレッドを解決したりしないでください。- 返信の投稿には、
python3 skills/affinage/scripts/affinage.pyz post-replyのみを使用してください。 - すべての返信の末尾に
agent on behalf of <handle>を付けます。 RESPOND_GH_HANDLE、gh api user --jq .login、またはgit config user.nameから<handle>を解決します。- GraphQL は、
reviewThreadsの状態の読み取りと、対応済みスレッドの解決にのみ使用します。 ../age/references/voice.mdのボイスルールを適用します。- 確信度には
certain、speculating、またはdon't knowを使用します。 - 評価対象となる主張がない場合は、調査結果がないことを明記します。
参照資料
該当するトリガーが発生したら、各 affinage 参照資料を読みます。
references/flow-details.md— Flow のステップ 2、3、5、6、7、10、13 を実行する際に読みます。references/merge-conflict.md—pr-statusがマージ競合またはダーティなマージ状態を報告した際に読みます。references/report-template.md— Flow のステップ 8 でレポートを作成する際に読みます。references/handoff-templates.md— cure 選択ゲートまたは返信ゲートを表示する際に読みます。references/auto-mode.md—--autoまたは--plateが有効な際に読みます。references/commands.md— 同梱コマンドの正確なフラグが必要な際に読みます。 このファイルには、生成されたコマンド一覧が含まれています。
共有エージェントゲートには ../age/references/sub-agent-gate.md を使用します。
エージェントの解決
各ディスパッチは ../cheese/references/agent-resolution.md に従って解決します。
| 作業 | 推奨タイプ | 権限/分離 | 最小能力 | 労力 | フォールバック |
|---|---|---|---|---|---|
| レビューの主張と CI の証拠をトリアージする | reviewer | 読み取り専用、新しいコンテキスト | 強力 | 高 | 互換性のある reviewer、その後 general |
正規の affinage レポートには、共有の agent_resolution ブロックが含まれます。