# バッチ設計書 7-daily-pr-recap.yml

## 概要

本ドキュメントは、OpenCodeプロジェクトの日次PR要約ワークフロー（daily-pr-recap.yml）の設計仕様を定義する。このバッチは当日作成・更新されたコミュニティPRを分析し、レビュー優先度別に整理したレポートをDiscordに投稿する。

### 本バッチの処理概要

このバッチは、AIエージェント（OpenCode CLI）を使用して、当日オープンまたは更新されたGitHub PRを分析し、レビュー優先度別に整理した日次レポートを生成する。バグ修正、アクティブなPR、クイックウィン（すぐにマージ可能な小さなPR）を識別し、Discord Webhookを通じてチームチャンネルに投稿する。

**業務上の目的・背景**：コミュニティからのコントリビューションを見落とさないよう、日次でPRの状況を把握する必要がある。特にすぐにマージできる小さなPRや、議論が活発なPRを早期に発見することで、コミュニティへの対応を迅速化し、コントリビューターのモチベーション維持に貢献する。

**バッチの実行タイミング**：毎日22:00 UTC（EST 17:00）にスケジュール実行される。手動でのworkflow_dispatchトリガーも可能。

**主要な処理内容**：
1. リポジトリをチェックアウト
2. OpenCode CLIをインストール
3. AIエージェントで当日のPRを収集・分析
4. 新規PR、アクティブPR、クイックウィンに分類
5. バグ修正PRを優先的にハイライト
6. Discord形式のレポートを生成
7. Discord Webhookでレポートを投稿

**前後の処理との関連**：独立したバッチとして動作。daily-issues-recap.ymlと同様のアーキテクチャを持つ。

**影響範囲**：Discord通知チャンネルへのメッセージ投稿。分析・分類は読み取り専用。

## バッチ種別

通知配信 / レポート生成

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 日次 |
| 実行時刻 | 22:00 UTC |
| 実行曜日 | 毎日 |
| 実行日 | 毎日 |
| トリガー | cron（0 22 * * *）、手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| OPENCODE_API_KEY | OpenCode API認証キーがsecretsに設定 |
| GITHUB_TOKEN | GitHub APIアクセストークン |
| DISCORD_ISSUES_WEBHOOK_URL | Discord Webhook URL（オプション） |
| contents: read | リポジトリ読み取り権限 |
| pull-requests: read | PR読み取り権限 |

### 実行可否判定

ワークフローは常に実行される。DISCORD_ISSUES_WEBHOOK_URLが未設定の場合は、標準出力にレポートを表示してDiscord投稿をスキップする。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | ワークフロー引数なし |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| gh pr list | JSON | 当日作成のオープンPR一覧 |
| gh pr list (updated) | JSON | 当日更新のオープンPR一覧 |
| gh pr view | JSON | 個別PRのコメント情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| Discord | テキストメッセージ | 日次PRレポート |
| /tmp/pr_recap.txt | テキスト | 生成されたレポート（中間ファイル） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | pr_recap.txt（一時ファイル） |
| 出力先 | /tmp |
| 文字コード | UTF-8 |
| フォーマット | Discordマークダウン |

## 処理フロー

### 処理シーケンス

```
1. リポジトリチェックアウト
   └─ actions/checkout@v4（fetch-depth: 1）

2. Bunセットアップ
   └─ .github/actions/setup-bun

3. OpenCode CLIインストール
   └─ curl -fsSL https://opencode.ai/install | bash

4. AIエージェントでPR分析
   ├─ 当日作成のオープンPRを取得
   ├─ 当日更新のオープンPRを取得
   ├─ Anomalyチームメンバーを除外
   ├─ ボットコメントを除外
   ├─ バグ修正/アクティブ/クイックウィンに分類
   └─ Discord形式レポート生成

5. レポート抽出
   └─ sedで===DISCORD_START===〜===DISCORD_END===間を抽出

6. Discord投稿
   ├─ Webhook URLチェック
   ├─ 1950文字以下なら単一投稿
   └─ 超過時は分割投稿
```

### フローチャート

```mermaid
flowchart TD
    A[ワークフロー開始] --> B[checkout fetch-depth:1]
    B --> C[setup-bun]
    C --> D[OpenCode CLIインストール]
    D --> E[opencode run AIエージェント]
    E --> F[PR取得 created/updated today]
    F --> G[チーム除外・ボット除外]
    G --> H[カテゴリ分類]
    H --> I[レポート生成]
    I --> J[sedで抽出]
    J --> K{Webhook URL設定?}
    K -->|No| L[標準出力に表示]
    K -->|Yes| M{1950文字以下?}
    M -->|Yes| N[単一メッセージ投稿]
    M -->|No| O[分割投稿]
    L --> P[ワークフロー終了]
    N --> P
    O --> P
```

## データベース操作仕様

### 操作別データベース影響一覧

本ワークフローはデータベース操作を行わない。GitHub APIへの読み取りリクエストのみ。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | OpenCode CLIインストール失敗 | ネットワークエラー | 手動再実行 |
| - | AI処理失敗 | API制限/タイムアウト | ログ確認、API状態確認 |
| - | Discord投稿失敗 | Webhook URL不正 | URL設定確認 |
| - | PR取得失敗 | GitHub API制限 | API制限確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

1. AI処理失敗：ログを確認し、OPENCODE_API_KEY設定を確認
2. Discord投稿失敗：Webhook URLの有効性を確認
3. PR取得失敗：手動でgh pr listを実行して確認

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（読み取り専用） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | PR数: 0-30件/日 |
| 目標処理時間 | 5分以内 |
| メモリ使用量上限 | 特に制限なし |
| Discord文字数制限 | 1800文字以下推奨 |

## 排他制御

特になし。読み取り専用処理のため並列実行可能。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 長さログ | レポート生成後 | "Recap length: {n} chars" |
| 投稿ログ | 投稿完了時 | "Posted daily PR recap to Discord" |
| 警告ログ | Webhook未設定時 | "Warning: DISCORD_ISSUES_WEBHOOK_URL secret not set" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ワークフロー失敗 | 発生時 | GitHub Actions通知 |

## 備考

- 除外対象チームメンバー：adamdotdevin, Brendonovich, fwang, Hona, iamdavidhill, jayair, kitlangton, kommander, MrMushrooooom, R44VC0RP, rekram1-node, thdxr
- 除外対象ボット：copilot-pull-request-reviewer, github-actions
- AIモデル：opencode/claude-sonnet-4-5
- OPENCODE_PERMISSION環境変数でツール権限を制限（gh pr/searchのみ許可）
- レポート文字数ハード制限：1800文字以下
- 分割投稿時は改行位置で分割
- クイックウィン定義：50行未満の変更、承認済みまたはほぼ承認済み
- バグ修正判定：タイトルに'fix'または'bug'を含む
- コメント数取得時はボットコメントを除外してカウント
- PR情報には追加行数（additions）・削除行数（deletions）を含む
