Skip to content

フィードバックから自動で修正PRを出すワークフローを追加 - #36

Merged
TinyKitten merged 7 commits into
devfrom
feature/auto-fix-from-feedback
Sep 21, 2026
Merged

TinyKitten merged 7 commits into
devfrom
feature/auto-fix-from-feedback

Conversation

@TinyKitten

@TinyKitten TinyKitten commented Sep 21, 2026 •

Copy link
Copy Markdown
Member

概要

アプリに届いたフィードバックのうち、原因がこのリポジトリにあると判定されたものを 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 つです。

npm run lint
npm run typecheck
npm test
npx wrangler deploy --env="" --dry-run --outdir /tmp/feedback-autofix-bundle-dev
npx wrangler deploy --env=production --dry-run --outdir /tmp/feedback-autofix-bundle-production

バンドルまで入れてあるのは、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 に触れる状態になります。
  • Node は 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:*) から素で使えます。
  • action はすべて commit SHA で固定しています。このジョブは 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 ファイルだけです。

確認したことは次のとおりです。

  • ワークフローの YAML をパースし、on / permissions / concurrency / 6 ステップが意図どおりに読めることを確認しました
  • checks に並べたコマンドが .github/actions/verify/action.yml の内容と一致していることを確認しました
  • Node のバージョンが package.json の engines(>=22)と verify の既定("22")と揃っていることを確認しました
  • 固定した SHA を 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

  • 新機能
    • 対象となる不具合・クラッシュ報告に対し、自動で修正作業を開始できるワークフローを追加しました。
    • Issue作成時または手動実行時に、修正、検証、結果報告までを自動化します。
    • 修正結果はブランチとプルリクエストとして提示されます。
    • MobileAppおよびStationAPIへの引き継ぎに対応しました。
    • 自動マージは行わず、内容を確認してから取り込めます。

@TinyKitten TinyKitten self-assigned this Sep 21, 2026
@coderabbitai

coderabbitai Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

Review Change StackReview Change Stack

Understand this PR’s impact

Explore downstream dependencies and potential security impact with Blast Radius.

View blast radius →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Essentials

Run ID: 5999afd0-9b18-4cfe-b9d1-b1fee342cc93

📥 Commits

Reviewing files that changed from the base of the PR and between cce388d and 7b54516.

📒 Files selected for processing (1)
  • .github/workflows/auto_fix_from_feedback.yml

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.


📝 Walkthrough

Walkthrough

Issue 作成または手動実行で、対象フィードバックの判定、環境準備、Claude Code による修正、検証、結果報告を行う GitHub Actions ワークフローを追加しました。

Changes

フィードバック修正自動化

Layer / File(s) Summary
フィードバック修正ワークフロー
.github/workflows/auto_fix_from_feedback.yml
Issue または手動実行を受け付けます。許可済み作成者、優先度、引き継ぎ先、検証コマンド、対応範囲を判定します。対象時のみ Node.js 22、npm ci、Claude Code、検証処理を実行します。失敗時を含めて結果を報告します。

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 に結果を報告する
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed タイトルは、フィードバックを起点に自動修正PRを作成するワークフローの追加という主要な変更を正確かつ簡潔に示しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

うさぎが Issue の扉を開く
判定が静かに道を示す
Claude Code が修正を進める
検証の足音が響く
失敗も報告へ届く
にんじん色の PR が育つ

Comment @coderabbitai help to get the list of available commands.

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
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.

2 participants