---
generated_at: 2026-02-25 10:30:00
metrics:
  claims_total: 35
  claims_with_evidence: 33
  claims_without_evidence: 2
confidence_derived: 0.94
---

# 根拠レポート：1-サインアップ

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.94**
  - 根拠あり：33 / 35、根拠なし：2
- 優先レビュー（高）
  1. **テンプレートセットアップ詳細**：setup_customer_templateの具体的な処理内容は未確認
  2. **AccountNameGenerator**：アカウント名生成ロジックの詳細実装は未確認

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

- E-01: `app/controllers/signups_controller.rb`（35行）
- E-02: `app/controllers/signups/completions_controller.rb`（42行）
- E-03: `app/controllers/sessions/magic_links_controller.rb`（89行）
- E-04: `app/models/signup.rb`（100行）
- E-05: `app/models/identity.rb`（35行）
- E-06: `app/models/magic_link.rb`（43行）
- E-07: `app/models/account.rb`（56行）
- E-08: `app/models/user.rb`（43行）
- E-09: `app/models/session.rb`（3行）
- E-10: `app/controllers/concerns/authentication.rb`（107行）
- E-11: `app/mailers/magic_link_mailer.rb`（8行）
- E-12: `app/views/signups/new.html.erb`（25行）
- E-13: `app/views/signups/completions/new.html.erb`（37行）
- E-14: `app/views/sessions/magic_links/show.html.erb`（31行）
- E-15: `config/routes.rb`（255行）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | マジックリンク認証を使用している | E-04 (21行目: send_magic_link for: :sign_up) | ○ |
| C-02 | メールアドレス形式バリデーション（URI::MailTo::EMAIL_REGEXP） | E-04 (9行目: validates :email_address, format: { with: URI::MailTo::EMAIL_REGEXP }) | ○ |
| C-03 | マジックリンクは6桁コード | E-06 (2行目: CODE_LENGTH = 6) | ○ |
| C-04 | マジックリンク有効期限15分 | E-06 (3行目: EXPIRATION_TIME = 15.minutes) | ○ |
| C-05 | レート制限は3分間10回 | E-01 (4行目: rate_limit to: 10, within: 3.minutes) | ○ |
| C-06 | 未認証ユーザーのみアクセス可能 | E-01 (5行目: before_action :redirect_authenticated_user) | ○ |
| C-07 | テナント制限の確認 | E-01 (6行目: before_action :enforce_tenant_limit), E-07 (Account.accepting_signups?) | ○ |
| C-08 | メール送信は非同期処理 | E-05 (27行目: deliver_later) | ○ |
| C-09 | コード消費時に削除される | E-06 (27-30行目: def consume; destroy; self; end) | ○ |
| C-10 | Identity作成はfind_or_create_by! | E-04 (20行目: @identity = Identity.find_or_create_by!(email_address: email_address)) | ○ |
| C-11 | Account.create_with_ownerでアカウント作成 | E-07 (24-29行目), E-04 (57-68行目) | ○ |
| C-12 | システムユーザーとオーナーユーザー作成 | E-07 (26-27行目: users.create!(role: :system), users.create!(role: :owner)) | ○ |
| C-13 | セッションはCookieで管理 | E-10 (96行目: cookies.signed.permanent[:session_token]) | ○ |
| C-14 | メールアドレス正規化 | E-05 (15行目: normalizes :email_address, with: ->(value) { value.strip.downcase.presence }) | ○ |
| C-15 | secure_compareでメールアドレス照合 | E-03 (36行目: ActiveSupport::SecurityUtils.secure_compare) | ○ |
| C-16 | 氏名最大240文字 | E-04 (11行目: validates :full_name, length: { maximum: 240 }) | ○ |
| C-17 | マジックリンクコードはユニーク | E-06 (15行目: validates :code, uniqueness: true) | ○ |
| C-18 | purposeでsign_upを区別 | E-06 (7行目: enum :purpose, %w[ sign_in sign_up ]) | ○ |
| C-19 | JoinCode自動作成 | E-07 (19行目: after_create :create_join_code) | ○ |
| C-20 | エラー時にaccount.destroy! | E-04 (76-82行目: def destroy_account; @account&.destroy!) | ○ |
| C-21 | サインアップ完了でランディング画面へリダイレクト | E-02 (29行目: redirect_to landing_url(script_name: @signup.account.slug)) | ○ |
| C-22 | マジックリンクメールにコード含む | E-11 (6行目: subject: "Your Fizzy code is #{ @magic_link.code }") | ○ |
| C-23 | コード入力画面でmaxlength=6 | E-14 (14行目: maxlength: "6") | ○ |
| C-24 | 開発環境でコード表示 | E-14 (21-27行目: if Rails.env.development? && flash[:magic_link_code]) | ○ |
| C-25 | ルーティング: /signup | E-15 (164行目: resource :signup, only: %i[ new create ]) | ○ |
| C-26 | レイアウト: public | E-01 (8行目: layout "public") | ○ |
| C-27 | 無効コードでshakeアニメーション | E-03 (65行目: redirect_to session_magic_link_path, flash: { shake: true }) | ○ |
| C-28 | Session作成時にuser_agent, ip_address記録 | E-10 (89行目: sessions.create!(user_agent: request.user_agent, ip_address: request.remote_ip)) | ○ |
| C-29 | verified_atを現在時刻で設定 | E-07 (27行目: verified_at: Time.current) | ○ |
| C-30 | 422エラーでhead :unprocessable_entity | E-01 (19行目: head :unprocessable_entity) | ○ |
| C-31 | コード生成はループで重複回避 | E-06 (34-37行目: loop do ... break candidate unless self.class.exists?(code: candidate)) | ○ |
| C-32 | activeスコープで有効期限チェック | E-06 (9行目: scope :active, -> { where(expires_at: Time.current...) }) | ○ |
| C-33 | MagicLinksController: 15分間10回レート制限 | E-03 (4行目: rate_limit to: 10, within: 15.minutes) | ○ |
| C-34 | setup_customer_templateの具体的処理 | E-04 (68行目で呼び出しのみ確認) | △ |
| C-35 | AccountNameGeneratorの詳細ロジック | E-04 (72行目で呼び出しのみ確認) | △ |

## 4) 不足情報（Unknown / Missing）
- **setup_customer_template**: Account::Seedeableモジュールに定義されていると推測されるが、具体的な処理内容（どのようなボード・カードが作成されるか）は未確認
  - 候補: `app/models/concerns/account/seedeable.rb` / `app/models/account/seedeable.rb`
- **AccountNameGenerator**: アカウント名の自動生成ロジックの詳細が未確認
  - 候補: `app/models/account_name_generator.rb` / `app/services/account_name_generator.rb`

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 認証・セッション管理は標準的なRails実装に準拠
- 0: 低リスク - マジックリンクのセキュリティ対策（有効期限、レート制限、secure_compare）は適切
- 1: 中リスク - setup_customer_templateの処理内容によっては初期データ作成に時間がかかる可能性あり

## 6) レビュアーチェックリスト（最小）
- [ ] マジックリンクの有効期限（15分）がビジネス要件と合致しているか
- [ ] レート制限（3分間10回、15分間10回）が適切か
- [ ] setup_customer_templateで作成される初期データの内容を確認
- [ ] AccountNameGeneratorの命名規則がビジネス要件と合致しているか
- [ ] テナント制限（Account.accepting_signups?）の条件を確認
