---
generated_at: 2026-02-25 02:32:00
metrics:
  claims_total: 45
  claims_with_evidence: 43
  claims_without_evidence: 2
confidence_derived: 0.96
---

# 根拠レポート：非機能要件定義書

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：43 / 45、根拠なし：2
- 優先レビュー（高）
  1. **稼働率目標値（99.9%）**：明示的なSLA定義が見つからない
  2. **RTO/RPO目標値**：復旧目標の明示的な定義が見つからない

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `config/puma.rb` - Pumaサーバー設定（ワーカー、スレッド、GC設定）
- E-02: `config/cache.yml` - キャッシュ設定（max_age: 60日）
- E-03: `config/queue.yml` - Solid Queue設定（バッチサイズ、スレッド数）
- E-04: `config/cable.yml` - Solid Cable設定（polling_interval、message_retention）
- E-05: `config/environments/production.rb` - 本番環境設定（SSL、キャッシュ、ログ）
- E-06: `config/database.sqlite.yml` - SQLite設定（pool: 5、timeout: 5000）
- E-07: `config/database.mysql.yml` - MySQL設定（pool: 50、timeout: 5000）
- E-08: `config/recurring.yml` - 定期ジョブスケジュール設定
- E-09: `config/deploy.yml` - OSS版デプロイ設定
- E-10: `saas/config/deploy.production.yml` - SaaS版本番デプロイ設定（6 Webサーバー、6 LB）
- E-11: `saas/config/database.yml` - SaaS版DB設定（Primary/Replica、max_execution_time）
- E-12: `config/initializers/content_security_policy.rb` - CSP設定
- E-13: `config/initializers/filter_parameter_logging.rb` - パラメータフィルタリング設定
- E-14: `app/models/ssrf_protection.rb` - SSRF対策実装
- E-15: `app/models/webhook/delivery.rb` - Webhook配信実装（タイムアウト、署名）
- E-16: `app/controllers/concerns/authentication.rb` - 認証実装
- E-17: `app/controllers/concerns/authorization.rb` - 認可実装
- E-18: `app/controllers/concerns/request_forgery_protection.rb` - CSRF対策
- E-19: `app/jobs/concerns/smtp_delivery_error_handling.rb` - SMTP配信リトライ設定
- E-20: `saas/lib/fizzy/saas/engine.rb` - SaaS版初期化（Sentry、Yabeda、暗号化）
- E-21: `Gemfile` - 依存関係（bcrypt、brakeman、bundler-audit）
- E-22: `Dockerfile` - コンテナ設定（jemalloc、bootsnap）
- E-23: `lib/fizzy.rb` - DBアダプター切り替えロジック
- E-24: `config/initializers/web_push.rb` - Web Push設定（タイムアウト）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | 静的アセット5分間キャッシュ | E-05（54行目: max-age=5.minutes.to_i） | ○ |
| C-02 | WebSocket polling_interval 0.1秒 | E-04（7行目: polling_interval: 0.1.seconds） | ○ |
| C-03 | Webhook配信タイムアウト7秒 | E-15（8行目: ENDPOINT_TIMEOUT = 7.seconds） | ○ |
| C-04 | DNS解決タイムアウト2秒 | E-14（4行目: DNS_RESOLUTION_TIMEOUT = 2） | ○ |
| C-05 | Puma 1ワーカー/CPU、1スレッド | E-01（31-32行目: workers, threads 1, 1） | ○ |
| C-06 | DBプール50接続 | E-07（7行目: pool: 50）, E-11（22行目: pool: 50） | ○ |
| C-07 | ジョブワーカー物理CPUコア数 | E-03（8行目: Concurrent.physical_processor_count） | ○ |
| C-08 | ジョブスレッド3/ワーカー | E-03（7行目: threads: 3） | ○ |
| C-09 | バッチサイズ500件 | E-03（4行目: batch_size: 500） | ○ |
| C-10 | キャッシュ有効期限60日 | E-02（3行目: max_age: 60.days.to_i） | ○ |
| C-11 | メッセージ保持1日 | E-04（8行目: message_retention: 1.day） | ○ |
| C-12 | 稼働率99.9%以上 | **根拠なし** | △ |
| C-13 | RTO 1時間以内、RPO 15分以内 | **根拠なし** | △ |
| C-14 | SaaS版6台Webサーバー | E-10（5-11行目: 6ホスト定義） | ○ |
| C-15 | SaaS版2台ジョブサーバー | E-10（15-17行目: 2ホスト定義） | ○ |
| C-16 | SaaS版6台ロードバランサー | E-10（71-77行目: 6ホスト定義） | ○ |
| C-17 | 通知バンドル配信30分毎 | E-08（6-7行目: schedule: every 30 minutes） | ○ |
| C-18 | 完了ジョブクリーンアップ毎時12分 | E-08（18-19行目: schedule: every hour at minute 12） | ○ |
| C-19 | Webhookクリーンアップ15分毎 | E-08（20-22行目: schedule: every 15 minutes） | ○ |
| C-20 | Webhook 7日経過で削除 | E-15（6行目: STALE_TRESHOLD = 7.days） | ○ |
| C-21 | bcryptパスワードハッシュ | E-21（25行目: gem "bcrypt", "~> 3.1.7"） | ○ |
| C-22 | 署名付きCookie（httponly、same_site） | E-16（96行目: httponly: true, same_site: :lax） | ○ |
| C-23 | Bearer Token認証 | E-16（59行目: request.authorization.to_s.include?("Bearer")） | ○ |
| C-24 | CSRF header_only方式 | E-18（5行目: protect_from_forgery using: :header_only） | ○ |
| C-25 | TLS強制（force_ssl） | E-05（83行目: config.force_ssl） | ○ |
| C-26 | Active Record Encryption | E-20（142-144行目: encryption keys） | ○ |
| C-27 | Webhook HMAC-SHA256署名 | E-15（116行目: OpenSSL::HMAC.hexdigest("SHA256"...）） | ○ |
| C-28 | CSP default-src: self | E-12（52行目: policy.default_src :self） | ○ |
| C-29 | CSP object-src: none | E-12（66行目: policy.object_src :none） | ○ |
| C-30 | SSRF対策DNS 1.1.1.1, 8.8.8.8 | E-14（6-9行目: DNS_NAMESERVERS） | ○ |
| C-31 | プライベートIPブロック | E-14（23-31行目: blocked_address?メソッド） | ○ |
| C-32 | パラメータフィルタリング | E-13（6-8行目: filter_parameters） | ○ |
| C-33 | SQLiteデフォルト（OSS） | E-23（9行目: saas? ? "mysql" : "sqlite"） | ○ |
| C-34 | MySQL SaaS版デフォルト | E-23（9行目: saas? ? "mysql" : "sqlite"） | ○ |
| C-35 | RuboCop使用 | E-21（53行目: gem "rubocop-rails-omakase"） | ○ |
| C-36 | Brakeman使用 | E-21（47行目: gem "brakeman"） | ○ |
| C-37 | Bundler Audit使用 | E-21（48行目: gem "bundler-audit"） | ○ |
| C-38 | Bootsnap有効 | E-21（14行目: gem "bootsnap"） | ○ |
| C-39 | jemalloc有効 | E-22（20、28行目: libjemalloc設定） | ○ |
| C-40 | Process.warmup | E-01（38-39行目: Process.warmup） | ○ |
| C-41 | ログ出力STDOUT | E-05（86行目: Logger.new(STDOUT)） | ○ |
| C-42 | ログタグrequest_id | E-05（91行目: log_tags = [ :request_id ]） | ○ |
| C-43 | Sentry監視 | E-20（91-103行目: Sentry.init） | ○ |
| C-44 | Prometheusメトリクス | E-20（106-129行目: Yabeda設定） | ○ |
| C-45 | SMTPリトライpolynomially_longer | E-19（6、11行目: retry_on ... wait: :polynomially_longer） | ○ |

## 4) 不足情報（Unknown / Missing）
- **稼働率目標値（C-12）**: コードベースにSLA定義が見つからない。これはビジネス要件として外部で定義されている可能性が高い
  - 候補：SLAドキュメント / 契約書 / サービス利用規約
- **RTO/RPO目標値（C-13）**: 災害復旧計画の明示的な定義がない。インフラ構成から推測した値
  - 候補：災害復旧計画書 / 運用マニュアル / インシデント対応手順書

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**: 性能設定値（C-01〜C-11）- 設定ファイルで明確に定義
- **0（低リスク）**: セキュリティ設定（C-21〜C-32）- 実装コードで確認可能
- **0（低リスク）**: 監視・ログ設定（C-41〜C-45）- 設定ファイルで明確に定義
- **1（中リスク）**: 可用性目標（C-12、C-13）- ビジネス要件として要確認

## 6) レビュアーチェックリスト（最小）
- [ ] 稼働率目標（99.9%）がビジネス要件として妥当か確認
- [ ] RTO/RPO目標がインフラ構成で達成可能か確認
- [ ] SaaS版のマルチリージョン構成が正確に反映されているか確認
- [ ] 定期ジョブのスケジュールが実際の運用要件と一致するか確認
- [ ] セキュリティ設定（CSP、SSRF対策）が最新のベストプラクティスに沿っているか確認
