🌲

イベントストーミングの図を起点に要件定義を始める

に公開

昨日参加した Kiro の紹介イベント で、「イベントストーミングで作った図から要件定義を始めた」という話が出ていた。
これが面白かったので、試しに Team Kit を使って同じ流れを再現してみた。

使ったのは Miro で紹介されていたイベントストーミングの図。
テンプレートをキャプチャして Team Kit の初期要件(README.md)に貼り込み、そこから feature.yml を生成 する形で進めた。

さらに、生成された feature.yml を、そのまま Event Storming の図として読みやすいフォーマット に変更。
これまで feature.yml の位置づけがあいまいだったが、「イベントストーミング図のテキスト表現」という立て付けがしっくりくると感じた。


feature.ymlを生成するために読み込ませたキャプチャ

生成された feature.yml から生成したイベントストーミング図

生成されたコード

graph LR
%% ===== スタイル定義 =====
classDef actor fill:#ffeb3b,stroke:#f57f17,color:#000
classDef external fill:#e91e63,stroke:#880e4f,color:#fff
classDef aggregate fill:#fff59d,stroke:#f9a825,color:#000
classDef event fill:#ff9800,stroke:#e65100,color:#fff
classDef policy fill:#9c27b0,stroke:#6a1b9a,color:#fff
classDef pivotal fill:#4fc3f7,stroke:#0288d1,color:#000,stroke-width:3px
classDef note fill:#fff9c4,stroke:#f9a825,color:#000

%% ===== 開始: 更新トリガー =====
PIV_Start[更新が<br>トリガーされた]:::pivotal

%% ===== フェーズ1: 90日レビュー =====
A_BPO[BPO<br>Partner]:::actor
PIV_Start --> A_BPO

EV_90day[90日レビューが<br>実行された]:::event
A_BPO --> EV_90day

AGG_Account[アカウント]:::aggregate
EV_90day --> AGG_Account

EV_Reviewed[アカウントが<br>レビューされた]:::event
AGG_Account --> EV_Reviewed

%% ===== 分岐: 損失あり/なし =====
EV_WithLoss[損失あり<br>アカウント抽出]:::event
EV_NoLoss[損失なし<br>アカウント抽出]:::event
EV_Reviewed --> EV_WithLoss
EV_Reviewed --> EV_NoLoss

%% ===== 損失なしルート: 標準更新 =====
EV_Standard[標準更新が<br>決定された]:::event
EV_NoLoss --> EV_Standard

POL_Conditional[条件付き更新<br>通知ポリシー]:::policy
EV_Standard --> POL_Conditional

EXT_Email[Email]:::external
EXT_USMail[US Mail]:::external
EXT_RulesRegs[Rules and<br>Regs]:::external
POL_Conditional --> EXT_Email
POL_Conditional --> EXT_USMail
POL_Conditional --> EXT_RulesRegs

EV_CondNotice[条件付き更新<br>通知が送付された]:::event
EXT_Email --> EV_CondNotice

%% ===== 損失ありルート: 非更新 =====
A_UW1[Underwriter]:::actor
EV_WithLoss --> A_UW1

EV_NonRenewal[非更新が<br>決定された]:::event
A_UW1 --> EV_NonRenewal

POL_NonRenewal[非更新<br>通知ポリシー]:::policy
EV_NonRenewal --> POL_NonRenewal

EXT_RulesRegs2[Rules and<br>Regs]:::external
POL_NonRenewal --> EXT_Email
POL_NonRenewal --> EXT_USMail
POL_NonRenewal --> EXT_RulesRegs2

EV_NonNotice[非更新通知が<br>送付された]:::event
EXT_USMail --> EV_NonNotice

%% ===== フェーズ2: 更新リクエスト開始 =====
A_Broker[Broker]:::actor
A_Customer[Customer]:::actor
EV_CondNotice --> A_Broker
A_Customer --> A_Broker

EV_RequestStart[契約更新リクエストが<br>開始された]:::event
A_Broker --> EV_RequestStart

POL_Context[コンテキスト<br>自動収集ポリシー]:::policy
EV_RequestStart --> POL_Context

EXT_ECM[ECM]:::external
POL_Context --> EXT_ECM

EV_ContextGathered[アカウントコンテキストが<br>収集された]:::event
EXT_ECM --> EV_ContextGathered

EV_NonPhysical[非物理的申請が<br>受領された]:::event
A_Broker --> EV_NonPhysical

%% ===== フェーズ3: レーティングと評価 =====
POL_Rating[自動レーティング<br>ポリシー]:::policy
EV_ContextGathered --> POL_Rating

EXT_Rater[Rater]:::external
POL_Rating --> EXT_Rater

EV_Rated[申請が<br>レーティングされた]:::event
EXT_Rater --> EV_Rated

EXT_DebitCredit[Debit Credit<br>Tool]:::external
EV_Rated --> EXT_DebitCredit

EV_DebitCredit[デビット・クレジットが<br>決定された]:::event
EXT_DebitCredit --> EV_DebitCredit

POL_Financial[財務分析<br>連携ポリシー]:::policy
EV_Rated --> POL_Financial

EXT_Primary[Primary<br>Insurance]:::external
EXT_Financial[Financial<br>Analysis]:::external
POL_Financial --> EXT_Primary
POL_Financial --> EXT_Financial

A_UW2[Underwriter]:::actor
EXT_Financial --> A_UW2

EV_RiskAssessed[リスクが<br>評価された]:::event
A_UW2 --> EV_RiskAssessed

EV_ExcessIns[超過保険が<br>確認された]:::event
EXT_Primary --> EV_ExcessIns

%% ===== フェーズ4: 除外事項と見積もり仕様 =====
POL_Exclusion[除外事項<br>自動提案ポリシー]:::policy
EV_RiskAssessed --> POL_Exclusion

A_UW3[Underwriter]:::actor
POL_Exclusion --> A_UW3

EV_Exclusions[除外事項が<br>リストアップされた]:::event
A_UW3 --> EV_Exclusions

AGG_Quote[見積もり仕様]:::aggregate
EV_Exclusions --> AGG_Quote

EV_QuoteSpec[見積もり仕様が<br>記録された]:::event
AGG_Quote --> EV_QuoteSpec

POL_Forms[書類要件<br>判定ポリシー]:::policy
EV_QuoteSpec --> POL_Forms

EV_FormsDecided[必要書類が<br>決定された]:::event
POL_Forms --> EV_FormsDecided

%% ===== フェーズ5: エスカレーション分岐 =====
POL_Escalation[自動エスカレーション<br>ポリシー]:::policy
EV_RiskAssessed --> POL_Escalation

A_UWMgr[Underwriters<br>Manager]:::actor
POL_Escalation -->|エスカレーション| A_UWMgr

EV_Escalated[申請が<br>エスカレーションされた]:::event
A_UWMgr --> EV_Escalated

EV_Referred[権限者への<br>照会が行われた]:::event
EV_Escalated --> EV_Referred

EV_ReviewedRisk[リスク評価が<br>レビューされた]:::event
EV_Referred --> EV_ReviewedRisk

%% ===== 承認/拒否分岐 =====
EV_Approved[申請が<br>承認された]:::event
EV_Denied[申請が<br>拒否された]:::event
EV_ReviewedRisk -->|承認| EV_Approved
EV_ReviewedRisk -->|拒否| EV_Denied

POL_ApprovalNotice[承認<br>通知ポリシー]:::policy
EV_Approved --> POL_ApprovalNotice
POL_ApprovalNotice --> EXT_Email

POL_DenialNotice[拒否<br>通知ポリシー]:::policy
EV_Denied --> POL_DenialNotice
POL_DenialNotice --> EXT_Email

%% ===== フェーズ6: 見積もり作成 =====
POL_QuoteGen[見積書<br>自動生成ポリシー]:::policy
EV_FormsDecided --> POL_QuoteGen
EV_Approved --> POL_QuoteGen

EXT_WordDoc[Word Doc]:::external
POL_QuoteGen --> EXT_WordDoc
POL_QuoteGen --> EXT_Rater

%% ===== 終了: 見積もり作成完了 =====
PIV_End[見積もりが<br>作成された]:::pivotal
EXT_WordDoc --> PIV_End

EXT_ECM2[ECM]:::external
PIV_End --> EXT_ECM2

feature.yml からイベントストーミング図を生成するコマンド

https://github.com/tango238/teamkit/blob/main/.claude/commands/teamkit/show-event.md


イベントストーミングの図 → feature.yml → また図、というこの循環は、仕様に揺らぎが出たときにも使えそうなので、もう少し試したい。

Discussion