fix: レビュー依頼スレッドの後続通知の文言を切り替える(#104) - #106
Conversation
GitHub の reason はスレッドの購読理由でありイベント種別ではないため、 一度レビュー依頼された PR は以降のコメントも review_requested で届き、 常に「レビューを依頼されました」と表示されていた。 latest_comment_url が subject.url と異なる(=コメントが起点)場合に限り FOLLOWUP_MESSAGES の文言へ差し替える。コメントがまだ無いスレッドでは latest_comment_url に subject.url と同じ値が入るため、依頼直後の通知は 従来どおりの文言のままになる。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MoGxJDiZa8c2E3PVAnxbK8
|
CI が赤ですが、本 PR の差分とは無関係の既存問題です。
master も同じ状態です(最終成功は 2026-07-14、それ以降 対応方針の検討を #108 に切り出しました。ameba の master には修正が入っていますが安定版のリリースがまだ無いため、CI の Crystal を固定するか ameba をコミット固定で追従させるかの判断が必要です。そちらが解決しだい、本 PR の CI を確認します。 Generated by Claude Code |
|
#108 の修正 PR を #109 で用意しました(Crystal 1.21.0 固定 + ameba を Crystal 1.21 対応コミットに固定)。マージされたら本 PR に master を取り込んで CI を確認します。 Generated by Claude Code |
…-policy-to-issues-vdp4s3
|
#109(CI 修正)が green になったので、本ブランチに取り込んで CI を回しています。 そのため現時点の diff には #109 のコミットが含まれています。#109 が master にマージされれば差分から消えるので、レビューは本 PR 固有のコミット( Generated by Claude Code |
review_requested と同じく、一度アサインされた PR/Issue は以降のコメントも reason=assign で届くため、常に「アサインされました」になっていた。 FOLLOWUP_MESSAGES に assign を追加して同じ切り替えを適用する。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MoGxJDiZa8c2E3PVAnxbK8
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0adff76550
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
latest_comment_url は通知を発生させたイベントではなくスレッドの現在の最新 コメントを指すため、コメント済みスレッドに push や状態変更が来た通知でも 真になる。「コメントがつきました」だと過去のコメントを新着と誤認させる。 - 文言を「〜に動きがありました」に変更し、何が起きたかを限定しない - 述語名を comment_triggered? -> commented? に変更。実際に判定しているのは 「通知の起点がコメントか」ではなく「スレッドにコメントが存在するか」 - コメントで上記の性質と限界を明記 PR #106 のレビュー指摘対応。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MoGxJDiZa8c2E3PVAnxbK8
#106(issue #104)のマージにより master へ入った通知文言の変更を取り込む。 競合はテストヘルパーの引数追加が両側で起きたもので、双方の引数を残して解消: - spec/github/models_spec.cr: notification_from に type と url/latest_comment_url - spec/github/usecase_spec.cr: notification に type と latest_comment_url src/github/models.cr は変更箇所が異なるため自動マージ(#104 の FOLLOWUP_MESSAGES / commented? と #105 の ChecksState / checks_gated? が併存)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MoGxJDiZa8c2E3PVAnxbK8
close #104
課題
/notificationsAPI のreasonは「そのスレッドを購読している理由」であってイベント種別ではない。一度レビュー依頼/アサインされた PR・Issue は、以降のコメントや更新もすべて同じ reason で届くため、REASON_MESSAGESの固定対応では常に「レビューを依頼されました」「アサインされました」と表示されていた。変更内容
Subject#commented?を追加。latest_comment_urlがsubject.urlと異なる場合に「スレッドにコメントが 1 件以上ある」と判定するlatest_comment_urlはコメントがまだ無いスレッドではsubject.urlと同じ値が入るため、単純な空判定ではなく URL の一致で見る必要があるNotification::FOLLOWUP_MESSAGESを追加し、初回ではないと判断できる通知は文言を差し替える挙動
review_requestedreview_requestedassignassignassignは Issue にも付くため、文言は PR に限定せず「担当している PR/Issue」とした。文言を「動きがありました」に留めている理由
latest_comment_urlは通知を発生させたイベントではなく、スレッドの現在の最新コメントを指す。そのため、コメント済みスレッドに push や状態変更が来た通知でもcommented?は真になる。ここで「コメントがつきました」と書くと過去のコメントを新着と誤認させるため、何が起きたかを限定しない表現にしている。イベント種別は通知 payload に無く、追加の API 呼び出し無しでは判別できない。
commented?はあくまで「初回ではない」ことの目安として使っており、その性質と限界はコード内コメントに明記した。(レビュー指摘対応: #discussion_r3744341653)
対象外にした reason
同じ構造の問題を持つ reason は他に
authorとinvitationがあるが、author: 元の文言が「自分の PR/Issue に動きがありました」で後続通知でも実態と合っているinvitation: 後続通知がほぼ発生しないため今回は据え置いた。必要になれば
FOLLOWUP_MESSAGESへの追記だけで対応できる。テスト
spec/github/models_spec.cr/spec/github/usecase_spec.crに以下を追加。commented?の 3 パターン(コメント URL /subject.urlと同一 / 空)reason_messageの切り替え(review_requested/assignそれぞれのコメントあり・無し、対象外 reason)pretextへ反映されることCI green(format / lint / spec、deploy とも成功)。