# Supabase Branching — PR 別 DB プレビュー

監査 P0 (B3 / 2026-04-26): PR ごとに migration を適用済みの隔離 DB を立てて、
壊れる migration が main / dev に流入する前に検出する。

> **状態:** 雛形のみ。まず Pro plan へのアップグレードと branch 設定が必要。
> 本ドキュメントの手順を踏むと branching が稼働する。

## 何ができる

- PR を開くたびに `pr-123` のような **エフェメラル DB branch** が自動生成される
- main の最新 migrations + その PR が触る migration を全部適用した状態
- E2E / Schemathesis を branch DB に向けて実行できる
- PR が merge / close されると branch DB は自動破棄

公式 docs: https://supabase.com/docs/guides/platform/branching

## 前提

- Supabase project が **Pro plan** 以上 (free plan では branching 不可)
- Project Ref: `afmyqhicretqrjwmvsaa`
- GitHub 連携済み (Supabase Dashboard → Project Settings → Integrations → GitHub)

## セットアップ手順

### 1. Pro plan へのアップグレード (manual)

Supabase Dashboard → Project Settings → Subscription Plan → Pro。
月額 $25。Parky は本番化前に必須。

### 2. Branching を有効化 (manual)

Project Settings → Branching → Enable。"Persistent branch" として `main` を設定。
GitHub repo `high-field/parky` をリンク。

### 3. supabase/config.toml で branch policy を定義

config 雛形は [parky/infra/supabase/config.toml](../../infra/supabase/config.toml) の末尾に
コメントアウト状態で配置済み (Phase 33)。**Pro plan upgrade 後にコメントを外す**。

```toml
[experimental.branching]
enabled = true

# main / dev は persistent (常時稼働)、PR は ephemeral (close で破棄)
[experimental.branching.persistent]
branches = ["main", "dev"]

[experimental.branching.ephemeral]
auto_destroy_after_close = true
```

### 4. PR テンプレに branch 名を追加 (任意)

`.github/PULL_REQUEST_TEMPLATE.md` に branch URL の自動展開コメント枠を用意する。

### 5. CI で branch DB を target にして migration drift / unit test を実行

実装は [.github/workflows/supabase-branch-validate.yml](../../.github/workflows/supabase-branch-validate.yml) (Phase 33)。

仕組み:
1. PR を開くと Supabase GitHub App が PR comment に branch URL を post
2. workflow は `gh api` で PR comments を読み取り、`postgresql://...` を抽出
3. URL を `DATABASE_URL` env として `check-migration-drift.ts` / `npm run test:unit` を実行
4. branch URL が無い (branching 未有効) 場合は早期 skip — Pro plan 化前でも安全に merge 可能

```yaml
# 抜粋: comment から URL 抽出
comment_body=$(gh api "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" \
  --jq '.[] | select(.user.login == "supabase[bot]") | .body')
url=$(echo "$comment_body" | grep -oE 'postgresql://[^ )]+' | tail -n1)
```

E2E (Playwright) は別途 `e2e-smoke.yml` で扱う。branch URL を Playwright fixture に渡す配線は次 Wave。

## 運用ルール

### `migration` の書き方

- branching が有効になると、Supabase が **PR の migration 差分を全部 branch に流す**
- そのため migration は べき等 + 後方互換 を厳守 (CLAUDE.md §1 と同じ)
- DROP / TRUNCATE / DELETE は branch でも危険なので避ける (memory: feedback_supabase_mcp_auto_approve)

### 既知の制約

- branching は Auth ユーザーを **コピーしない** (空の auth.users で始まる)
- E2E では seed-test-user (memory: project_parky_e2e_framework_2026_04_26) を fixture migration で投入する必要あり
- Storage bucket / Edge Functions は branch にコピーされない (Phase 2 で対応)

## コスト

- Pro plan $25/mo 固定
- Branch ごとに minor compute / storage、PR 1 件あたり数 cent
- ephemeral なので PR が閉じれば 0

## 関連

- [memory: project_parky_e2e_framework_2026_04_26](../../.memory/project_parky_e2e_framework_2026_04_26.md) — test user seed の方針
- [parky/infra/supabase/migrations/](../../infra/supabase/migrations/) — 193 migrations
- [memory: feedback_supabase_db_best_practices](../../.memory/feedback_supabase_db_best_practices.md)
- 公式: https://supabase.com/docs/guides/platform/branching
