### 概要
freeeサインは freee グループに Join したプロダクトでありながら、認証・ドメイン・ユーザー所属モデルが freee 基盤と分断されており、サインの今後の事業拡張に対して構造的なボトルネックになっていた。本プロジェクトでは、サインを freee ドメイン配下に移し、認証主体を freee ID に寄せ、所属モデルを freee 基盤と整合させる統合アーキテクチャを設計した。
### 目指す利益
- freee 基盤を利用した横断機能開発が着手可能になる
### 解決したい顧客課題
- freee とサインで二重ログインが発生し、操作のロスと UX 低下を招いていた
### 担当
- 統合アーキテクチャ設計(ドメイン・認証・セッション・データモデル)
- 段階リリース計画の再編
- 設計書からユーザーストーリー作成・タスク分解・スプリント計画・Jira 起票までの一貫リード
### 出した成果
- 送信者・受領者の8パターン Before/After 画面遷移図を FigJam で作成、TechLead/PdL/QA との体験整理を効率化
- Design Doc に「検討した代替案と却下理由」セクションを追加する型を確立、非同期レビューの質を底上げ
- 同期ミーティングは初期の方向合わせ1回に収束、以降は Design Doc 起点の非同期レビューで進行
- 設計書からユーザーストーリー17件・タスク54件・19スプリント計画・Jira チケット50枚規模の起票までを一貫リード
### 成果に繋がった工夫
#### 1. 縮退設計の徹底
##### 1.1 課題
統合期間中にユーザーがログイン不能になるリスクが最大の障害だった。サイン既存ユーザー、freee 連携済みユーザー、freee 未連携ユーザー、新規ユーザーの4状態が並存し、いずれの状態でも体験を壊さない設計が必要だった。
##### 1.2 対応
###### 1.2.1 並行稼働設計
旧ドメインを移行期間中は残置し、新ドメインを正規入口として確立。撤去条件を管理し、段階的に旧ドメイン依存を解消する設計とした。
###### 1.2.2 例外状態の許容
未紐付け・未作成・同期遅延などの例外状態を許容し、フォールバック導線・自動補完処理で吸収。「ユーザーが突然ログイン不能になる状態を発生させない」を全 Phase 共通の前提として徹底した。
###### 1.2.3 各 Phase でロールバック可能な状態を維持
致命的障害時に旧導線・旧ドメインへ即時フォールバックできる状態を組み込んだ。
##### 1.3 結果
「ログイン不能ゼロ」という測定可能な目標を、開発・運用・CS 全関係者で共有できる共通言語として確立。
#### 2. 段階リリースの再編
##### 2.1 課題
当初の Phase 0〜5 の6段階構成は、PdM/QA/SRE への説明と意思決定で認知負荷が高く、運用判断のオーバーヘッドになっていた。
##### 2.2 対応
###### 2.2.1 説明粒度と実装粒度の分離
外部説明・進行管理は Stage 1/2/3 の3段階に集約。実装側では Phase 0〜5 と Feature Flag で細粒度の制御を継続する二層構造を採用。
###### 2.2.2 Go 条件を Stage 単位に定義
各 Stage の Go 条件(新ドメイン安定稼働率/既存ユーザーの freee ログイン移行率/旧 URL アクセスの誘導率など)を明文化し、判断の客観性を確保。
##### 2.3 結果
説明・運用判断のコストが下がり、ステークホルダー横断の合意形成が円滑化。
#### 3. データモデル統合の不整合解消
##### 3.1 課題
サインの Team と freee の Company が、データ生成順序によって整合しなくなる構造的な問題があった。
##### 3.2 対応
###### 3.2.1 データのあるべき姿を先に定義
To-Be のデータモデル(Team:Company = 1:1, FreeeUser:User = 1:1, TeamUser.role ↔ RoleAssignment.role_key)を先に確定。
###### 3.2.2 データ生成順序のパターン列挙
freee 起点・サイン起点・並行稼働期の例外パターンを網羅し、各パターンでの整合性確保ルールを明文化。
###### 3.2.3 データモデル・データクラス設計
Membership Builder(サインの権限を freee に反映させる常設同期コンポーネント)の設計土台を作成。
##### 3.3 結果
Phase 1 以降の実装タスクを依存関係付きでチケット化できる状態に到達。
#### 4. CSRF / Cookie 移行戦略の明文化
##### 4.1 課題
ドメイン統合に伴う Cookie 共有の論点が散逸し、セキュリティ要件の整理がされていなかった。
##### 4.2 対応
###### 4.2.1 freee 共通 CSRF 機構の採用
新ドメイン移行後は freee 共通 CSRF 機構を利用、state-changing API(POST 系)は全て CSRF トークン検証必須とした。
###### 4.2.2 Cookie 移行の段階方針
新ドメインでは freee 共通セッション、旧ドメインは旧 Cookie で稼働、Phase 5 で旧 Cookie 完全廃止という三段階の方針を確定。
##### 4.3 結果
セキュリティ要件を踏まえた移行計画として確立し、PSIRT レビューに通る状態を整備。
#### 5. プロダクト境界の設計判断 ― OEM の取り扱い
##### 5.1 課題
freeeサインの OEM 提供プロダクトは freee 基盤と関係ない領域にあり、ID/セッション統合のスコープに含めるか否かの境界判断が必要だった。
##### 5.2 対応
OEM を別プロダクトとして切り出すことも代替案として検討したが、開発・運用コストが見合わなかった。OEM を同プロダクトに包含し、旧ドメインで継続稼働させる設計を採用した。
##### 5.3 結果
OEM ユーザーの既存体験を維持しつつ、ID/セッション統合のスコープ境界を明確化。
#### 6. 認証・権限・招待のスコープ判断 ― 既存実装の継続採用
##### 6.1 課題
サインは認証に devise gem を採用し、権限基盤・招待機能も独自実装で運用していた。これらの基盤をすべて freee 側に寄せるか、サイン側の既存実装を残すかの境界判断が必要だった。
##### 6.2 対応
すべての基盤を freee に寄せる案も代替案として検討したが、以下の理由で却下した。
- サイン既存プロダクションコードへの改修範囲が過大(devise を捨てた認証実装の入れ替え、権限・招待の総書き換え)
- ID/セッション統合という目的に対し、認証・権限・招待まで寄せるのはオーバーエンジニアリング
- 既存実装に依存する周辺機能への波及リスクが大きい
採用した設計は、freee 側に寄せるのはセッション・認証主体・組織コンテキスト(Company/Membership)に限定し、devise による認証実装・権限基盤・招待機能はサイン側の既存実装を継続採用する方針とした。
##### 6.3 結果
改修範囲を ID/セッション周辺に限定でき、既存機能の安定性を維持したまま統合を進められる設計に到達。
#### 7. ストーリー作成・タスク分解プロセスのスキル化
##### 7.1 課題
設計書(Design Doc)からユーザーストーリー、タスク分解、依存関係図、スプリント計画、Jira 起票までを一貫してリードする必要があった。1〜2 名チーム × 19 スプリント規模の計画を設計者一人の頭の中で進めると、属人化のリスクがあった。
##### 7.2 対応
設計書を起点とする一連のプロセスを Claude Code のカスタムスキルとして型化した。
###### 7.2.1 ストーリー作成(/self-story-mapping)
設計書から Phase ごとにユーザーストーリーを抽出し、ユーザー視点のストーリー文・受入条件・依存関係・スプリント配置までを一気通貫で生成。17件のストーリー・依存関係図・19スプリントマッピングを得た。
###### 7.2.2 タスク分解と Jira 起票(/self-jira-create)
ストーリーマップから具体的なタスクを依存関係付きで分解し、Jira チケットの一括起票までを実行。54件のタスク・50枚規模の Jira チケットを起票した。
##### 7.3 結果
- 設計→ストーリー→タスク→Jira 起票のプロセスを再現可能な型として確立し、属人化を解消
- 同じスキルを別プロジェクトへ横展開可能な状態に
#### 8. 検証ハーネスのスキル化 ― 計画段階と実装段階の自律検証
##### 8.1 課題
ID 統合プロジェクトは扱うユースケースが多く(送信者・受領者の旧/新ドメイン各ジャーニー × 新規/既存ユーザー × freee 未連携/連携済 × 単一/複数事業所など組合せが爆発する)、計画段階と実装段階の両方で網羅性を担保するのが難しかった。属人的な「気合の網羅」では、受入条件の漏れ・実装の意図ズレ・PR 規約のブレが避けられない構造になっていた。
##### 8.2 対応
計画段階の網羅性検証と、実装段階の受入条件準拠・規約準拠を、4 つの Claude Code カスタムスキルとして型化した。
###### 8.2.1 受入条件の生成(/self-acceptance-criteria)
ユースケースを軸に、ユーザー視点の受入条件を網羅的に生成するスキルを作成。「画面遷移パターン × ユーザー状態 × 入力境界 × 例外パス」の組合せで漏れを防止する型を組み込んだ。
###### 8.2.2 MECE レビューと QA プラン生成(/self-mece-plan-review)
生成された受入条件と設計を MECE 観点で逆算的にレビューし、未カバーのユースケースを検出するスキルを作成。検出結果はそのまま QA プランとして利用可能な形式に整理される。
###### 8.2.3 実装の品質レビュー(/self-quality-review)
実装完了後に、生成された受入条件に対してロジックが網羅されているかを検証するスキルを作成。RuboCop/ESLint で検出できない設計レベルの問題(受入条件未カバー、エッジケース未対応、責務分離の崩れ等)を検出する。
###### 8.2.4 PR 前の最終レビュー(/self-final-review)
コミット前・PR 作成前のタイミングで、プロジェクト規約への準拠とコードパターンの一貫性を自律的に確認・修正するスキルを作成。
##### 8.3 結果
- 受入条件生成(8.2.1)→ MECE 検証(8.2.2)→ 実装準拠チェック(8.2.3)→ 規約準拠チェック(8.2.4)の 4 段ハーネスが完成し、計画段階・実装段階の両方で AI が自律的に抜け漏れを検証する仕組みが成立
- ユースケースが多い領域でも属人性に頼らず、設計ロジックの漏れと実装の意図ズレを構造的に検出可能に
- 「気合で網羅する」運用から「型で網羅する」運用へ転換
### 得られた知見
#### 設計の構造化のポイント
- 設計の規模が大きい時、「説明粒度」と「実装粒度」を分離すると意思決定コストが下がる
- 縮退設計は「ログイン不能ゼロ」のような測定可能な目標で表現すると、関係者全員が共通言語で議論できる
#### 非同期コミュニケーションのポイント
- Design Doc に「検討した代替案と却下理由」を必ず含めることで、非同期レビューの質が大幅に向上する
- 設計の結論だけを書くと、非同期レビューで「なぜその判断をしたのか」が伝わらず、結果として同期ミーティングが必要になる
#### プロセスのスキル化のポイント
- プロジェクト固有の進め方を「使い捨て」にせず Claude Code スキルとして型化すると、組織のアセットとして横展開できる
- 計画段階と実装段階の検証を別レイヤーのスキルに切り分けると、疎結合に磨けて全体として強い検証ハーネスになる
- 生成系スキルと検証系スキルを組み合わせると、属人的な網羅性に頼らず構造的に漏れと意図ズレを潰せる
### キャリアビジョンに対するふりかえり
#### 具体的にやりたいことのアップデート
- Design Doc 駆動と「検討した代替案と却下理由」セクション必須化により、複雑な仕様を非同期に伝えられる型を確立
- 縮退設計を「測定可能な目標」で語る型を獲得
- ストーリー作成・タスク分解のプロセスを Claude Code スキル(/self-story-mapping, /self-jira-create)として型化
- 計画段階の網羅性検証(/self-acceptance-criteria, /self-mece-plan-review)と実装段階の準拠検証(/self-quality-review, /self-final-review)を Claude Code スキルとして型化し、4 段の自律検証ハーネスを構築
#### 今後の課題
- 設計者交代時の引き継ぎ品質を高める仕組みづくり
- ステークホルダー横断(PM/SRE/QA/Security)の合意形成プロセスの再現性確保