Skip to content

fix: コメント付き PR で初回向けの reason 文言が出るのを直す(#116) - #117

Merged
limit7412 merged 1 commit into
masterfrom
claude/issue-116-plan-eea8vy
Aug 10, 2026
Merged

fix: コメント付き PR で初回向けの reason 文言が出るのを直す(#116)#117
limit7412 merged 1 commit into
masterfrom
claude/issue-116-plan-eea8vy

Conversation

@limit7412

Copy link
Copy Markdown
Owner

close #116

症状

コメントの付いている PR でも、reason=assign の通知が初回向け文言「アサインされました」のままになる。#104 で入れたフォローアップ文言(「担当している PR/Issue に動きがありました」)に切り替わらない。

原因

切り替え条件の Subject#commented? は「latest_comment_urlsubject.url と異なる」ことをコメントありの根拠にしている。しかしこの判定は真になる側にしか使えない:

  • latest_comment_url は通知を発生させたイベント側を反映することがあり、コメント済みのスレッドでも push・レビュー・アサイン変更が起点の通知では subject.url に戻る
  • レビューコメント(Files changed 上のコメント)が反映されないケースもあり、レビュー上でだけ議論されている PR は常に初回扱いになる

どちらでも commented? が false になり、初回向け文言に落ちる。#104 は「latest_comment_url はスレッドの現在の最新コメントを指す」という前提だったが、その前提が「コメントが無い」側の確定には使えなかった。

対応

latest_comment_url 単独の判定をやめ、本文表示のためにどのみち取得している subject 本体のコメント数を併用する

Github::Usecase#build_message は本文のために subject.comment_url を毎回 GET している。commented? が false のとき、この URL は PR / Issue オブジェクト自体を指す(comment_url のフォールバック仕様)。PR レスポンスには comments(会話タブ)と review_comments(レビュー)、Issue レスポンスには comments が含まれるので、この取得済みレスポンスから件数を拾えばスレッドにコメントがあるかを判定できる。追加の API 呼び出しは発生しない。

followup 適用 ⇔ Subject#commented? || 取得済み本体の comments + review_comments >= 1

Subject#commented? が true のときは取得先が実コメントで件数フィールドを持たないが、その場合は先に true が確定するので影響しない。

変更点

  • src/github/models.cr
    • Commentcomments / review_comments(nilable)と #commented? を追加。コメントと subject 本体の両方をこのクラスで受けている旨をコメントに追記
    • Notification#reason_message / #pretext が取得済み Comment を任意引数で受け取り、新設の #followup? で切り替えを判定
    • Subject#commented? の doc に、偽でもコメントが無いとは限らない(片道の判定である)ことを追記
  • src/github/usecase.cr: build_message で取得済み commentpretext に渡す
  • spec: 会話コメントのみ / レビューコメントのみ / 両方 0 / 件数フィールド無し / Issue の各パターンと、Comment#commented? 単体、usecase 経由の pretext を追加

確認していないこと

CloudWatch Logs に出力されている実ペイロードで、上記 2 つの原因候補のどちらが起きているかまでは確定できていない(AWS の認証が切れていて本セッションからログを参照できなかった)。ただし修正はどちらのケースでも同じ経路で解消するため、原因の特定を待たずに入れられる内容になっている。

既知の制約(スコープ外)

  • コメント 0 件でレビュー(approve のみ等)だけが付いた PR は comments / review_comments とも 0 のため、従来どおり「アサインされました」になる。レビューの有無は PR レスポンスに含まれず追加 API が必要なため今回は許容する
  • 本文取得に失敗した通知は判定材料が無いため従来文言のまま(安全側)
  • review_requested も同じテーブルと判定を使うため、同種の取りこぼしが同時に改善される

テスト

CI(format / ameba / spec)に委ねている。この環境には Crystal ツールチェインが無く、ネットワーク制限でインストールもできなかったため、ローカルでの spec 実行はしていない。


Generated by Claude Code

reason=assign / review_requested の通知でフォローアップ文言に切り替える
判定を Subject#commented?(latest_comment_url が subject.url と異なるか)
だけに頼っていたため、コメントの付いた PR でも「アサインされました」の
ままになることがあった。

latest_comment_url は通知を発生させたイベント側を反映することがあり、
コメント済みでも push・レビュー・アサイン変更が起点の通知では subject.url
に戻る。またレビューコメントが反映されないケースもあり、「コメントが無い」
側の確定には使えない。

本文表示のためにどのみち取得している subject 本体(PR / Issue)の
レスポンスにはコメント数が含まれるので、これを判定に併用する。
Subject#commented? が false のとき comment_url は PR / Issue 自体を指す
ため、追加の API 呼び出しは発生しない。

コメント 0 件でレビューだけが付いた PR は件数に現れないため従来どおりの
文言になるが、レビューの有無の取得には追加 API が必要なため許容する。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WkcsCNsBVPds1SktQ5cFSE
@limit7412
limit7412 marked this pull request as ready for review August 10, 2026 14:49
@limit7412
limit7412 merged commit d264a03 into master Aug 10, 2026
3 checks passed
@limit7412
limit7412 deleted the claude/issue-116-plan-eea8vy branch August 10, 2026 14:53
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.

コメントのついているPRでも「アサインされました」と通知される

2 participants