フィードバックから自動で修正PRを出すワークフローを追加 - #36
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
|
Understand this PR’s impact Explore downstream dependencies and potential security impact with Blast Radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (1)
Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 5 reviews per hour. 📝 WalkthroughWalkthroughIssue 作成または手動実行で、対象フィードバックの判定、環境準備、Claude Code による修正、検証、結果報告を行う GitHub Actions ワークフローを追加しました。 Changesフィードバック修正自動化
Priority: ➖ Normal Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Feature Sequence Diagram(s)sequenceDiagram
participant GitHubActions as GitHub Actions
participant Prepare as feedback-autofix/prepare
participant ClaudeCode as Claude Code
participant Report as feedback-autofix/report
GitHubActions->>Prepare: Issue 番号と入力情報を渡す
Prepare-->>GitHubActions: 対象判定と修正プロンプトを返す
GitHubActions->>ClaudeCode: 対象時に修正を実行する
ClaudeCode-->>GitHubActions: 修正結果と終了状態を返す
GitHubActions->>Report: 実行結果を渡す
Report-->>GitHubActions: Issue に結果を報告する
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
うさぎが Issue の扉を開く Comment |
v1が作成者の許可リストを含む406de87を指すようになったため。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
P3のBugはBugなので、直す場所が決まっている点ではP2のBugと変わらない。作るものから 決めるFeature RequestとImprovementはカテゴリの条件が弾く。件数も2026年で3件、 月0.3件なので費用の理由も立たない。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
このジョブはcontents: writeとpull-requests: writeを持ち、secretも渡している。 可変タグのままだと、タグが差し替えられた時点でその内容がここで動く。SHAは git ls-remoteで確認している。あわせて月あたりの件数を6件弱から6件程度に直した。 54件を8.6か月で割ると6.25件で、弱ではない。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
prepareにはISSUES_REPO_TOKENを渡していて、非公開の管理チケットを読める。外部の3つ より権限が大きいので、こちらこそタグではなくSHAで固定する。v1タグは今日1度動かして いるので、タグが動く前提も実際に成り立っている。版はコメントで残す。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
Sonnetのままにする。まず費用を見たいため。上げるかどうかは「直せない」と誤って 判断した件数で決める。その経路だけは人のレビューで止まらず、管理チケットに 「済み」の目印が残って手つかずのまま対応済みに見える。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
共通アクションのv1タグは、作りかけの実装に打ってしまったため削除された。SHAは devの先頭のままなので動作は変わらないが、# v1 と書いたままだと存在しないタグを 指すことになる。マージ元のPR番号に差し替えた。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
概要
アプリに届いたフィードバックのうち、原因がこのリポジトリにあると判定されたものを Claude Code に読ませ、直せる不具合であれば修正の Pull Request まで作るワークフローを足します。直せないと分かった場合は PR を作らず、その理由を
TrainLCD/Issuesの管理チケットにコメントして終わります。起点は
src/consumers/feedbackTriage.tsのトリアージが自分でこのリポジトリに立てるスタブ issue です(フィードバック対応: TrainLCD/Issues#1277の形)。COMPONENT_REPOSの判定とPUBLIC_ISSUE_MIN_CONFIDENCE(0.7)で原因のリポジトリは決まっているので、ここで振り分けをやり直しません。判定・無害化・プロンプトの組み立て・結果の報告は TrainLCD/feedback-autofix の composite action が持っています。MobileApp と StationAPI でも同じものを使うので、文面や判定を直すときは 1 か所で済みます。
出来上がった PR は必ず人がレビューしてください。フィードバックの本文はアプリの利用者がそのまま書いたもので、誰かが内容を確かめる工程がありません。個人情報を取り除いたうえでデータとして渡していますが、プロンプトインジェクションの抜け道を完全にはふさげません。自動マージもしません。
変更内容
.github/workflows/auto_fix_from_feedback.ymlを 1 ファイル足すだけです。既存のワークフローには触れていません。起動条件
issues: openedとworkflow_dispatchです。スタブ issue の作成者を数値 ID の許可リスト(32848922)で確かめてから、本文の管理チケット番号を読みます。このリポジトリは公開されていて issue は誰でも立てられるので、これが無いと第三者が管理チケットの番号を書いた issue を立てるだけで、非公開チケットの本文を取得させられます。対象にするのは管理チケットに優先度ラベル(
🟠 P1 / High/🟡 P2 / Medium/🟢 P3 / Low)のいずれかが付いていて、かつ🐛 Bugか💣 Crashが付いているものです。💩 Spam/duplicate/wontfix/invalidは除きます。優先度を 3 つとも入れたのでこの条件はほぼ素通りになりますが、外していません。優先度が付く前の issue を先に渡さないための関門になっています。作るものから決める
✨ Feature Requestと🛠️ Improvementは、カテゴリの条件が弾きます。エージェントに通させるチェック
.github/actions/verify/action.ymlが回すものと同じ 5 つです。バンドルまで入れてあるのは、
verifyの注記どおりtscが型しか見ないためです。import の解決ミスやnodejs_compatで賄えない Node API はバンドルして初めて落ちるので、3 つだけにするとエージェントの PR が CI のビルドで落ちます。--dry-runは Cloudflare API を叩かないため認証情報が要りません。production側も回すのは、wrangler.jsoncのenv.productionだけが壊れている状態を見逃さないためです。手を入れてよい範囲
src/**の Worker のコードとtest/**のテストです。エージェントに渡す道具とモデル
道具は
Edit,Read,Write,Glob,Grep,TodoWrite,Bash(npm:*),Bash(npx:*),Bash(git:*),Bash(gh:*),Bash(node:*)に絞ってあります。Bash(npx:*)は上のバンドル確認のために入れています。ISSUES_REPO_TOKENはこのステップに渡していません。モデルは
claude-sonnet-5です。まず費用を見たいので Sonnet で始めます。上げるかどうかを何で決めるかはワークフローのコメントに書きました。「直せない」と誤って判断した件数で見ます。その経路だけは人のレビューで止まらず、管理チケットに「済み」の目印が残って手つかずのまま対応済みに見えるためです。そのほか
environmentを宣言していません。ci.ymlと同じ理由で、宣言するとこのジョブがその環境へのデプロイとして履歴に載り、環境 Secret に触れる状態になります。22です。package.jsonのenginesと.github/actions/verifyの既定に揃えてあります。concurrencyはスタブ issue の番号ではなく題名で束ねます。同じ管理チケットを指すスタブが 2 つあると番号が違うため、番号で束ねるとエージェントが 2 つ動き、同じ名前のブランチを取り合います。題名にコロンが入るので値は引用符で囲んであります。permissionsにissues: readを入れてあります。permissions:を書いた時点で挙げなかった権限はnoneになるため、これが無いとスタブ issue の取得で止まります。checkoutにpersist-credentials: falseを付けています。既定のtrueだと書き込み権限付きのGITHUB_TOKENがローカルの git 設定に残り、npm ciの postinstall とエージェントのBash(git:*)から素で使えます。contents: writeとpull-requests: writeを持ち、prepareにはISSUES_REPO_TOKENを渡すので、可変タグのままにはしていません。共通アクションにはバージョンタグが無いため、SHA の出どころはコメントに PR 番号(feedback-autofix#1)で残しました。影響範囲
追加したのは
.github/workflows/の下の 1 ファイルだけで、src/**にもwrangler.jsoncにも触れていません。バインディング・secret・キュー・KV・R2・Cron のいずれも変更していません。既存のワークフローも変更していないので、ci.ymlとデプロイの挙動は変わりません。このワークフローが動き出すのは
ANTHROPIC_API_KEYとISSUES_REPO_TOKENの両方を設定したあとです。どちらかが欠けていれば、警告を出すだけで何もせずに終わります。マージしただけでは何も起きません。HANDOFF_ISSUE_TOKENは任意です。省くと「原因は MobileApp にあります」と管理チケットに書くだけで、向こうは動きません。テスト
コードに変更が無いため
npm run lint/npm run typecheck/npm testは実行していません。追加したのはワークフローの YAML 1 ファイルだけです。確認したことは次のとおりです。
on/permissions/concurrency/ 6 ステップが意図どおりに読めることを確認しましたchecksに並べたコマンドが.github/actions/verify/action.ymlの内容と一致していることを確認しましたpackage.jsonのengines(>=22)とverifyの既定("22")と揃っていることを確認しましたgit ls-remoteで確認しました。checkoutとsetup-nodeのv4は軽量タグ、claude-code-actionのv1は注釈付きタグなのでrefs/tags/v1^{}の指すコミット、feedback-autofixはタグが無いのでrefs/heads/devですprepare/reportの入力名が、固定した SHA のものと一致していることを確認しましたci.ymlのpathsにこのファイルが入っていないので、この PR では CI が走りません。ワークフロー自体は secret が未設定のため実際には走らせていません。関連Issue
マージ前に必要なこと
secret の設定。
ANTHROPIC_API_KEYとISSUES_REPO_TOKEN(TrainLCD/Issuesの Issues read and write)。引き継ぎまで動かすならHANDOFF_ISSUE_TOKEN(MobileApp と StationAPI の Issues write)も。ANTHROPIC_API_KEYを設定する前に、TrainLCD/Website#262(プライバシーポリシーへの追記)を反映してください。この PR 自体は secret が無ければ何もしないので、マージの前後は問いません。🤖 Generated with Claude Code
https://claude.ai/code/session_018jUHQb3vwnKPNYL2Cm1mxw
Summary by CodeRabbit