Skip to content

Review Agent: 検収結果を PR コメントにフォールバック投稿 - #11

Merged
Mameta29 merged 2 commits into
mainfrom
dogfood/review-comment-fallback
Jun 14, 2026
Merged

Mameta29 merged 2 commits into
mainfrom
dogfood/review-comment-fallback

Conversation

@Mameta29

Copy link
Copy Markdown
Owner

Closes #10

概要

Review Agent の検収結果を PR に必ず残すためのフォールバックを実装しました。
submitReview(formal な APPROVE / REQUEST_CHANGES)が失敗したとき
(自分の PR への review は GitHub 仕様で 422、token に pull_requests:write が無い場合は
403)、同じ検収本文を通常の PR コメントとして投稿します。

検収基準への対応

  • submitReview が失敗したとき createPrComment で検収結果を PR コメントとして投稿するフォールバックがある
  • approve と reject の両方でコメントが投稿される(postReviewOutcome が両 verdict を処理)
  • 既存テストが通る
  • CI が通過している

変更点

  • review.ts: postReviewOutcome(event, body) を追加。formal review を試し、失敗時に
    createPrComment へフォールバック。tool 経路(submitReviewComment)・server 経路
    (LLM が tool 未呼び出し時)の両方がこれを使う。

Mameta29 added 2 commits June 14, 2026 17:02
Review Agent の検収結果を PR に必ず残すため、submitReview(APPROVE/REQUEST_CHANGES)
が失敗した場合(自分の PR への review は GitHub 仕様で 422、token に pull_requests:write
が無い場合は 403)に、同じ検収本文を通常の PR コメントとして投稿するフォールバックを
追加。approve / reject の両方、tool 経路・server 経路の両方でフォールバックする。
…s review feedback)

PR #11 の検収で「フォールバックのユニットテストが無い」と差し戻されたため、
フォールバックの単体テストを追加。さらに dogfood 運用中に発見した2つの重大バグも修正:

1. コメントフォールバック(当初スコープ): formal review が 422/403 で失敗したら
   検収本文を通常 PR コメントとして投稿。approve/reject 両方・テスト付き。

2. 判定二重化の解消: LLM の submitReviewComment tool に投稿副作用を持たせると、
   tool 時点の判定と最終 JSON の判定が食い違い、最終 reject なのに PR には approve
   コメントが残る事故が起きた(PR #11 で実際に発生)。tool は副作用なしにし、
   PR への投稿は最終 verdict から **サーバが1回だけ** 行う一元化に変更。

3. false-approve の決定的ガード: 「テスト追加」が検収基準にあるのに diff に
   テストファイルが無い場合、LLM が approve しても **コード側で reject に強制**
   (enforceDeterministicGuards)。gpt-5.1 が『今回は許容範囲』とテスト欠如を
   approve した実例を踏まえた恒久対策。金が動く判定の最終決定権はコードが持つ。

review.test.ts: フォールバックtest + ガードtest を追加(計8件)。全33テスト通過。
@Mameta29

Copy link
Copy Markdown
Owner Author

Review passed — Agentic Gig-Flow(formal review を投稿できないため comment として記録)

✅ Review passed by Agentic Gig-Flow

Quality score: 92/100
Reviewer: Azure OpenAI gpt-5.1 on Microsoft Foundry
PR: #11

検収基準の判定

# 基準 結果 証拠 (diff より)
1 submitReview が失敗したとき createPrComment で検収結果を PR コメントとして投稿するフォールバックがある packages/functions/src/agents/review.ts: } catch (err) { 以降で submitReview 失敗時に logger.warn(... 'submitReview failed; falling back to a plain PR comment') とし、続けて `await createPrComment({ repository: input.repository, prNumber: input.prNumber, body: \
      `${header}\\n\\n${body}`\n        });` によりコメント投稿フォールバックを実装。 |

| 2 | approve と reject の両方でコメントが投稿される | ✅ | packages/functions/src/agents/review.ts: const event = parsed.verdict === 'approve' ? 'APPROVE' : 'REQUEST_CHANGES'; で両 verdict を分岐し、const header = event === 'APPROVE' ? '✅ **Review passed** — ...' : '❌ **Review needs changes** — ...'; としてどちらの場合も createPrCommentbody: ${header}\n\n${body}`` を渡す設計になっている。 |
| 3 | フォールバックのユニットテストが追加されている | ✅ | packages/functions/src/agents/review.test.ts: 新規テスト `it('falls back to a plain PR comment when submitReview fails (own-PR 422)', async () => { ... })` 内で `submitReview` を投げるモックにし、`createPrComment` が呼ばれることを `expect(createPrComment).toHaveBeenCalledOnce();` などで検証している。 |
| 4 | 既存テストが通る | ✅ | コード変更は型整合が取れており、既存テストのモック (`fetchDiff`, `submitReview`, `mergePr`) は引き続き正しく注入されている。CI ステータスも `success` が入力として与えられている。 |
| 5 | CI が通過している | ✅ | 入力 JSON の `"ciStatus":"success"` より、本 PR の CI は成功状態であることが確認できる。 |
| 6 | テストが追加されている | ✅ | `packages/functions/src/agents/review.test.ts`: 末尾に `it('falls back to a plain PR comment when submitReview fails (own-PR 422)', async () => { ... });` と `it('deterministic guard overrides LLM false-approve when no test file is in the diff', async () => { ... });` の 2 つの新しいユニットテストが追加されている。 |

コメント

フォールバック処理が runReview の最終 verdict から一元的に行われるよう整理されており、LLM ツール呼び出しとの二重投稿問題も同時に解消されている点がよく出来ています。決定的ガードの導入により「テスト追加」基準の逸脱もコード側で防げており、堅牢性・可観測性のバランスも良好です。


このPRをマージすると、1000 JPYC@Mameta29 に Polygon 経由で自動送金されます (Settlement Agent → JPYC transfer())。

@Mameta29
Mameta29 merged commit 378b97f into main Jun 14, 2026
1 check passed
@Mameta29

Copy link
Copy Markdown
Owner Author

💴 JPYC 送金完了 — Settled by Agentic Gig-Flow

項目
金額 1,000 JPYC
受取アドレス 0x7F37…9389
Tx Hash 0xd66719e3db0050215ef10da82b2429f2692255ad16f8a814850277b8e571c1a8
ブロック 40128903
所要時間 (merge → 着金) 約 4.5 秒
Order ID: f4f0b4f0-8103-4268-83cf-bb19793cac34

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.

Review Agent の検収レビューを PR コメントとして必ず残す改修

1 participant