Skip to content

Fix: 自分の Pull Request でレビューを投稿できない不具合を直す(v8.5.2) - #133

Merged
takemi-ohama merged 3 commits into
mainfrom
fix/cross-refactoring-own-pr-comment
Aug 22, 2026
Merged

Fix: 自分の Pull Request でレビューを投稿できない不具合を直す(v8.5.2)#133
takemi-ohama merged 3 commits into
mainfrom
fix/cross-refactoring-own-pr-comment

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

何のために

/ndf:cross-refactoring のレビュー担当が、対象が自分の Pull Request のときに投稿へ
必ず失敗する。5 回目の実機試行(Pull Request #131)で観測した。

$ gh api repos/devbasex/ai-plugins/pulls/131/reviews -X POST -f event=APPROVE -f body='...'
gh: Unprocessable Entity (HTTP 422)
{"message":"Unprocessable Entity",
"errors":["Review Can not approve your own pull request"]}

レビュープロンプトは判定を APPROVE / REQUEST_CHANGES の 2 値に限り、その値をそのまま
投稿の event に使う。GitHub は自分の Pull Request への両方を拒むため、レビューが成立しない。
cross-review は作成者を照合して COMMENT へ倒す仕組みを持つが、cross-refactoring
には無かった。

過去 2 回の試行で「codex がレビュー結果を残さない」と記録していた事象は、これが原因である。

何を

対象変更
scripts/refactor.pyinitgh api user と Pull Request の作成者を照合し、is_own_pr / event_downgrade / review_post_note を状態ファイルへ書く
scripts/launch-cli.sh状態ファイルの投稿指示を RF_POST_EVENT_NOTE としてレビュープロンプトへ渡す
prompts/review.md判定の節に「投稿の event」を追加し、指示を差し込む
docs/03-review-viewpoints.md判定と投稿の event が別物であることを明記

判定は本文の先頭行と結果ファイルへ APPROVE / REQUEST_CHANGES のまま残る。収束判定は
結果ファイルの判定を見るため、投稿を倒しても評価は変わらない。cross-reviewintent
posted_as の分離と同じ形になる。

投稿指示の文面は検証側(refactor.py)で組み立てて状態ファイル経由で渡す。語彙の受け渡しと
同じ形にして、文面の分岐が起動シェルへ散らないようにしている。

Test plan

  • plugins/ndf-shared/skills/cross-refactoring/tests/test_init.py に 2 件追加
    • 自分の Pull Request では投稿の event を COMMENT へ倒す
    • 他者の Pull Request では判定をそのまま投稿する
  • uv run --with pytest python -m pytest plugins/ndf-shared/skills/cross-refactoring/tests plugins/ndf-shared/skills/cross-review/tests -q468 passed(追加前 466)
  • claude plugin validate が marketplace / ndf-claude / playwright-kit-claude とも通る
  • python3 scripts/check-skill-frontmatter.py がエラー 0 件 / 警告 0 件

残っている課題

5 回目の試行で見つけた残り 2 件はこの Pull Request の対象外。

  • 投稿に失敗すると結果ファイルを書かずに終わる(不具合 19)
  • 投稿されていないレビューが承認として通る(不具合 20)

GitHub は自分の Pull Request への APPROVE と REQUEST_CHANGES をどちらも
HTTP 422 で拒む。cross-refactoring のレビュープロンプトは判定を 2 値に限り、
その値をそのまま投稿の event に使っていたため、対象が自分の Pull Request の
ときはレビュー担当が必ず投稿に失敗していた。
init が gh api user と Pull Request の作成者を照合し、一致するときは投稿の
event だけを COMMENT へ倒す指示をレビュープロンプトへ渡す。判定は本文の
先頭行と結果ファイルへ APPROVE / REQUEST_CHANGES のまま残るため、収束判定は
変わらない。cross-review の intent と posted_as の分離と同じ形になる。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤖 cross-review | round 1 | codex | REQUEST_CHANGES

未完了 state からの再開パスで、今回追加した投稿 event の downgrade 指示を state に補完する必要があります。

Comment threadplugins/ndf-shared/skills/cross-refactoring/scripts/refactor.py Outdated

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤖 cross-review | round 1 | gemini | APPROVE

自身の PR では投稿の event を COMMENT へ倒すことで 422 エラーを回避し、収束判定の要件も満たせています。

init は状態ファイルが残っていて未完了なら、その状態をそのまま使って戻る。
投稿の event を倒す 3 項目は初期化の分岐でしか書いていなかったため、この指示が
入る前の版で作った状態ファイルから再開すると項目が無いまま進む。起動側は
`.review_post_note // ""` で読むので指示は空になり、自分の Pull Request で
`HTTP 422` を踏み続ける。
3 項目の組み立てを `_apply_post_event` へ集め、初期化と再開の両方から呼ぶ。
値は GitHub 側の照合結果だけで決まるので、再開のたびに入れ直しても判定は
変わらない。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UjJqoXkDs3LhhK4aFhh84p
@takemi-ohama

Copy link
Copy Markdown
ContributorAuthor

🔧 レビュー対応 (round 1)

コミット: 9d8289a

指摘元の重要度再判定対応
未完了 state からの再開で投稿 event の指示が入らない (refactor.py)majormajor(据え置き)修正

再判定の根拠

init は状態ファイルが残っていて finalNone なら、その状態をそのまま返して戻ります。投稿の event を倒す 3 項目は初期化の分岐にしか無かったため、この指示が入る前の版で作った状態ファイルから再開すると項目が欠けます。起動側は .review_post_note // "" で読むので指示が空になり、自分の Pull Request で HTTP 422 を踏み続けます。中断・再開はこの Skill の通常の経路であり、この PR が直そうとしている不具合がそのまま残るため major のままとしました。

修正の内容

3 項目(is_own_pr / event_downgrade / review_post_note)の組み立てを _apply_post_event へ集め、初期化と再開の両方から呼ぶようにしました。値は gh api user と Pull Request 作成者の照合結果だけで決まるので、再開のたびに入れ直しても判定は変わりません。再開の分岐では入れ直した状態を保存してから戻します。分岐が 1 箇所になるため、今後この種の項目が増えても片側だけに入る事故が起きません。

再開の経路を踏む回帰テストを 1 件追加しました。

検証

項目結果
pytest(cross-refactoring / cross-review)469 passed(従来 468 + 追加 1)
bash scripts/build-runtime-plugins.sh配布物 3 ランタイムへ同期済み(同一コミットに同梱)
python3 scripts/check-skill-frontmatter.pySkill 35 個 / エラー 0・警告 0
claude plugin validate .通過
claude plugin validate plugins/ndf-claude通過
修正前の CI全 7 チェック SUCCESS

deferred / rejected はありません。

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤖 cross-review | round 2 | codex | APPROVE

修正必須の指摘はありません。

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤖 cross-review | round 2 | gemini | REQUEST_CHANGES

GitHub Actions 等の bot トークン(GITHUB_TOKEN)を利用した実行環境では gh api user が 403 エラーになります。例外を許容してフォールバックするよう、check=False を指定してください。

※ 修正後は bash scripts/build-runtime-plugins.sh を実行して各ランタイム向けの生成物を更新してください。

Comment threadplugins/ndf-shared/skills/cross-refactoring/scripts/refactor.py Outdated
`init` は自分の Pull Request かどうかを判定するために `gh api user` で
ログイン名を読む。この呼び出しが `check=True` だったため、bot トークン
(Actions の `GITHUB_TOKEN` など)のように `/user` を読めず `HTTP 403` を
返す環境では、判定より前に init 全体が中断していた。
この値は投稿の event を倒すかどうかにしか使わず、判定側は元から
`bool(viewer)` で空を許容している。取得に失敗したら他者の Pull Request と
して扱えばよいので `check=False` を指定し、失敗しても進むようにした。
読めない環境を踏む回帰テストを追加した。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UjJqoXkDs3LhhK4aFhh84p
@takemi-ohama

Copy link
Copy Markdown
ContributorAuthor

🔧 レビュー対応 (round 2)

コミット: e4d89d1

指摘元の重要度再判定対応
bot トークン環境で gh api userHTTP 403 になり init が中断する (refactor.py:774)majormajor(据え置き)修正

codex は round 2 で APPROVE、指摘はありませんでした。

再判定の根拠

_sh は既定の check=True で失敗時に die を呼ぶため、/user を読めない環境では判定に入る前に init 全体が終了します。ログイン名は投稿の event を倒すかどうかの判定にしか使わず、判定側は元から bool(viewer) で空文字を許容する形になっていました。取得できないだけで実行不能になるのは影響が大きいため、major のままとしています。

修正の内容

viewer の取得だけ check=False にしました。読めなければ空文字となり、他者の Pull Request として扱われて従来どおりの挙動になります。同じ init 内の gh repo view / gh pr view は無いと進めない情報なので check=True のままです。

回帰テストを 1 件追加しました。修正前の版でこのテストが HTTP 403 で落ちること、修正後に通ることを実測しています。

検証

項目結果
pytest(cross-refactoring / cross-review)470 passed(従来 469 + 追加 1)
bash scripts/build-runtime-plugins.sh配布物 3 ランタイムへ同期済み(同一コミットに同梱)
python3 scripts/check-skill-frontmatter.pyエラー 0
claude plugin validate .通過
claude plugin validate plugins/ndf-claude通過
修正前の CI全 7 チェック SUCCESS

deferred / rejected はありません。

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤖 cross-review | round 3 | codex | APPROVE

修正必須の新規指摘はありません。

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤖 cross-review | round 3 | gemini | APPROVE

自分のPull Requestに対するレビュー投稿時の HTTP 422 回避策として適切に実装されており、エッジケースの考慮やテストも十分に備わっています。指摘事項はありません。

@takemi-ohama
takemi-ohama merged commit 39b78c7 into mainAug 22, 2026
7 checks passed
@takemi-ohama
takemi-ohama deleted the fix/cross-refactoring-own-pr-comment branch August 22, 2026 01:37
Sign up for freeto 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

@takemi-ohama