# 非機能要件定義書

## 概要

本ドキュメントは、Liamプロジェクト（ERD可視化・データベース設計支援ツール）の非機能要件を定義するものです。プロジェクトコードの解析結果に基づき、性能、可用性、セキュリティ、拡張性、保守性、運用・監視の観点から要件を整理しています。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| 画面表示 | 3秒以内 | Next.js App Routerによるサーバーサイドレンダリング |
| API応答 | 1秒以内 | Edge Runtime対応のAPIルート |
| 静的アセット配信 | 即時（CDN経由） | Vercel CDN + Cache-Control: stale-while-revalidate=86400 |
| E2Eテストタイムアウト | 15秒 | Playwright設定による |
| ストリーミング処理 | タイムアウト制御あり | withTimeoutAndAbort関数によるリクエストタイムアウト管理 |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 同時接続数 | Vercelプランに依存 | Vercel Serverless Functionsのスケーラビリティ |
| API最大行数 | 1000行/リクエスト | Supabase API設定 (max_rows = 1000) |
| コネクションプール | 最大100クライアント | Supabase DB Pooler (max_client_conn = 100) |
| デフォルトプールサイズ | 20接続/ユーザー | Supabase DB Pooler設定 |
| Turborepo並列度 | 15 | turbo.json concurrency設定 |

### リトライ設定

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| Supabase操作リトライ | 最大3回 | 指数バックオフ: 1s, 2s, 4s (最大8s) |
| ワークフローノードリトライ | 最大3回 (テスト時: 1回) | RETRY_POLICY設定 |
| E2Eテストリトライ | CI: 5回 / ローカル: 0回 | Playwright設定 |
| QA Agentリトライ | CI: 0回 / 本番: 3回 | MAX_RETRY_ATTEMPTS |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | Vercel SLAに準拠 | Vercelプラットフォーム依存 |
| 計画停止時間 | 最小限 | Vercelによるゼロダウンタイムデプロイ |
| 障害復旧時間（RTO） | 数分程度 | Vercel自動復旧機能 |
| 目標復旧時点（RPO） | リアルタイム | Supabaseリアルタイム同期 |
| キャンセル対応 | 対応済み | Vercel Functions supportsCancellation: true |

### 冗長構成

- **デプロイメント**: Vercelプラットフォームによる自動スケーリング・冗長化
- **データベース**: Supabase (PostgreSQL) による冗長構成
- **CDN**: Vercel Edge Networkによるグローバル分散

## セキュリティ要件

### 認証・認可

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| 認証基盤 | Supabase Auth | OAuth / Email認証対応 |
| GitHub OAuth | 対応済み | 外部プロバイダー連携 |
| セッション管理 | JWTトークン (3600秒有効) | リフレッシュトークンローテーション有効 |
| リフレッシュトークン再利用 | 10秒間隔 | refresh_token_reuse_interval |
| MFA | 最大10要素 | TOTP/Phone/WebAuthn対応可能 |
| 最小パスワード長 | 6文字 | minimum_password_length |
| Cookieセキュリティ | httpOnly, sameSite: lax, secure (本番) | returnTo Cookie設定 |

### 暗号化

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| トークン暗号化 | AES-256-GCM | GitHub OAuth トークン |
| 初期化ベクトル | 12バイト (ランダム生成) | 暗号化処理ごとに生成 |
| 認証タグ | 16バイト | GCMモード標準 |
| 鍵管理 | 環境変数 (LIAM_GITHUB_OAUTH_KEYRING) | Base64エンコード、複数鍵ローテーション対応 |

### アクセス制御

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| ルート保護 | Next.js Middleware | 認証必須ルートのリダイレクト制御 |
| ERD直接アクセス | 本番環境でブロック | x-liam-rewrite-source ヘッダー検証 |
| CORS | Server Actions allowedOrigins | 本番: liambx.com, app.liambx.com |
| セキュリティヘッダー | 設定済み | X-Content-Type-Options: nosniff, X-Frame-Options: DENY |

### マルチテナンシー

- **データ分離**: organization_idによる組織単位のデータ分離
- **チェックポイント**: 組織IDベースのアクセス制御

## 拡張性要件

### 水平スケーラビリティ

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| フロントエンド | Vercel Serverless | 自動スケーリング |
| データベース | Supabase (PostgreSQL) | トランザクションプーリングモード |
| Edge Functions | Supabase Edge Runtime | oneshot/per_workerポリシー対応 |

### モジュラーアーキテクチャ

- **モノレポ構成**: pnpm workspaces + Turborepo
- **パッケージ分離**: apps/packages/internal-packages構成
- **独立デプロイ**: 各アプリケーションの個別ビルド・デプロイ

### ワークフロー拡張性

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| 再帰制限 | 10 (デフォルト) | DEFAULT_RECURSION_LIMIT |
| QA Agent再帰制限 | 50 | 3回リトライ対応 |

## 保守性要件

### コード品質

| 項目 | ツール・設定 | 備考 |
| --- | --- | --- |
| 静的解析 | ESLint | パッケージ別設定 |
| 型検査 | TypeScript 5.9 | strictモード |
| フォーマット | Turborepo fmt | 統一フォーマット |
| 依存関係管理 | syncpack / knip | 重複・未使用依存の検出 |
| スタイルリント | Stylelint | CSS Modules対応 |

### テスト

| 項目 | ツール | 備考 |
| --- | --- | --- |
| 単体テスト | Vitest | カバレッジ計測対応 |
| 統合テスト | Vitest (integration config) | 別設定ファイル |
| E2Eテスト | Playwright | Chrome + Mobile Safari |
| ベンチマーク | schema-bench | スキーマ解析性能測定 |

### ドキュメント

- LangGraph開発ガイド
- マイグレーション操作ガイド
- スキーマパターンガイド

## 運用・監視要件

### エラー監視

| 項目 | ツール | 設定 |
| --- | --- | --- |
| エラートラッキング | Sentry | 全プラットフォーム統合 |
| トレースサンプルレート | 100% | tracesSampleRate: 1 |
| リプレイセッションサンプル | 10% | replaysSessionSampleRate: 0.1 |
| エラー時リプレイ | 100% | replaysOnErrorSampleRate: 1.0 |
| 環境分離 | 対応済み | NEXT_PUBLIC_ENV_NAME |

### ロギング

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| アプリケーションログ | console.info/error/warn | 構造化ログ対応 |
| アクセスログ | Vercel標準 | リクエストヘッダー情報含む |
| 分析ログ | Supabase Analytics | PostgreSQLバックエンド |

### CI/CD

| 項目 | ツール | 備考 |
| --- | --- | --- |
| ビルド | Turborepo | キャッシュ最適化 |
| デプロイ | Vercel | ゼロダウンタイム |
| データベースマイグレーション | Supabase Branching | PR連動プレビュー環境 |
| リリース管理 | Changesets | セマンティックバージョニング |
| スキーマドリフト検出 | 日次CI | 9:00 JST実行、Slack通知 |

### キャッシュ設定

| リソース | 設定 | 備考 |
| --- | --- | --- |
| 公開ルート | Cache-Control: public, max-age=0, s-maxage=60, stale-while-revalidate=86400 | CDNキャッシュ60秒、SWR 24時間 |
| ビルドキャッシュ | Turborepo | タスク出力キャッシュ |
| 開発サーバー | キャッシュ無効 | dev: cache: false |

## 備考

### 技術スタック

- **フロントエンド**: React 19, Next.js 15
- **スタイリング**: CSS Modules (typed)
- **可視化**: @xyflow/react (React Flow)
- **バリデーション**: Valibot
- **AIエージェント**: LangGraph.js
- **データベース**: Supabase (PostgreSQL 15)
- **ホスティング**: Vercel

### 環境依存設定

| 環境 | 特記事項 |
| --- | --- |
| 本番 (production) | ERD直接アクセスブロック、CDNアセットプレフィックス |
| プレビュー | Supabase Branchingプレビュー |
| ローカル開発 | Supabase CLI (localhost:54321) |

### 制約事項

- Supabase APIの最大行数制限 (1000行)
- LangGraphワークフローの再帰制限
- Vercel Serverless Functionsのタイムアウト制限
