通知トリガー × チャネルマトリクス
概要
Issue Outsource Platform における全通知イベントと、各通知チャネルへの配信ルールを定義する。 通知チャネルは Slack / Discord / メール / プラットフォーム内通知 の4系統とし、トリガーごとに対象者と配信先を制御する。
通知チャネル定義
| チャネル | 用途 | 特性 |
|---|---|---|
| Slack | 社内PM・レビュワー向けリアルタイム通知 | Block Kit によるアクション付きメッセージ |
| Discord | 委託者コミュニティ向け通知 | Embed + ボタンコンポーネント |
| メール | 重要イベント(報酬確定・期限)のフォールバック | ダイジェスト配信対応 |
| PF内 | プラットフォーム内の通知ベル | 全イベント記録、既読管理あり |
通知マトリクス
凡例
- ● : デフォルト有効(即時配信)
- ○ : デフォルト有効(ダイジェスト配信可)
- △ : オプション(ユーザー設定で有効化)
- ― : 配信なし
Issue ライフサイクル通知
| # | トリガー | 対象者 | Slack | Discord | メール | PF内 | 優先度 |
|---|---|---|---|---|---|---|---|
| 1 | 新規Issue公開 | 委託者全員 | ― | ● | ○ | ● | Medium |
| 2 | Issue着手(アサイン) | PM, レビュワー | ● | ― | △ | ● | Medium |
| 3 | MR提出 | レビュワー | ● | ― | △ | ● | High |
| 4 | レビューFB(差し戻し) | 委託者 | ― | ● | ● | ● | High |
| 5 | 承認・報酬確定 | 委託者, PM | ● | ● | ● | ● | Critical |
| 6 | 期限アラート(24h前) | 委託者, PM | ● | ● | ● | ● | High |
| 7 | 予算超過アラート | PM | ● | ― | ● | ● | Critical |
| 8 | レビュー滞留アラート(3日) | レビュワー, PM | ● | ― | ● | ● | High |
補助通知
| # | トリガー | 対象者 | Slack | Discord | メール | PF内 | 優先度 |
|---|---|---|---|---|---|---|---|
| 9 | コメント追加 | Issue関係者 | △ | △ | △ | ● | Low |
| 10 | Issue取り下げ | 委託者(着手済み) | ― | ● | ● | ● | Medium |
| 11 | 報酬支払完了 | 委託者 | ― | ● | ● | ● | High |
| 12 | 新規プロジェクト公開 | 委託者全員 | ― | ● | ○ | ● | Low |
| 13 | レビュワー変更 | 委託者, 旧/新レビュワー | ● | △ | △ | ● | Medium |
| 14 | 期限延長 | 委託者, PM | ● | ● | △ | ● | Medium |
対象者ロール定義
| ロール | 説明 | 主な通知チャネル |
|---|---|---|
| PM(プロジェクトマネージャー) | Issue発行・管理者。予算・進捗を監視 | Slack |
| レビュワー | MRレビュー担当。品質管理 | Slack |
| 委託者 | Issueを受注・作業するエンジニア | Discord |
| 委託者全員 | プラットフォーム登録済みの全委託者 | Discord |
優先度別配信ルール
| 優先度 | 即時配信 | ダイジェスト | リトライ | 説明 |
|---|---|---|---|---|
| Critical | 必須 | 不可 | 3回(5分間隔) | 報酬確定・予算超過など |
| High | デフォルト | 可(ユーザー設定) | 2回(10分間隔) | MR提出・期限アラートなど |
| Medium | デフォルト | 可 | 1回(30分間隔) | Issue着手・変更通知など |
| Low | オプション | デフォルト | なし | コメント・プロジェクト公開など |
エスカレーションルール
一定時間内に対応がない場合、上位通知チャネルにエスカレーションする。
| 条件 | 待機時間 | エスカレーション先 |
|---|---|---|
| レビュー未着手 | 3日 | PM へ Slack + メール |
| 期限アラート未対応 | 12時間 | PM へ Slack メンション |
| MR差し戻し後未対応 | 2日 | PM へ進捗確認通知 |
| 予算超過アラート未確認 | 1時間 | PM + 管理者 へメール |
通知データモデル
notifications テーブル
├── id: UUID (PK)
├── trigger_type: enum (ISSUE_PUBLISHED, ISSUE_ASSIGNED, MR_SUBMITTED, ...)
├── priority: enum (CRITICAL, HIGH, MEDIUM, LOW)
├── recipient_user_id: FK → users
├── recipient_role: enum (PM, REVIEWER, CONTRACTOR, ALL_CONTRACTORS)
├── channel: enum (SLACK, DISCORD, EMAIL, IN_APP)
├── status: enum (PENDING, SENT, DELIVERED, READ, FAILED)
├── payload: JSONB (通知内容)
├── related_issue_id: FK → issues (nullable)
├── related_mr_id: FK → merge_requests (nullable)
├── retry_count: int (default 0)
├── scheduled_at: timestamp
├── sent_at: timestamp (nullable)
├── read_at: timestamp (nullable)
├── created_at: timestamp
└── updated_at: timestamp配信フロー
[トリガー発生]
↓
[通知ルーター]
├── トリガー種別 → マトリクス参照
├── 対象者特定 → ロール解決
├── ユーザー設定確認 → ON/OFF・頻度チェック
└── チャネル別ディスパッチ
├── Slack Worker → Slack API
├── Discord Worker → Discord API
├── Email Worker → メール送信サービス
└── InApp Worker → DB書き込み + WebSocket Push
↓
[配信結果記録]
├── 成功 → status: DELIVERED
└── 失敗 → リトライキュー投入