event-storming-explorer
event-storming-explorer 스킬
Big Picture Event Storming을 수행해 도메인 전반의 과거형 이벤트 타임라인과 액터를 뽑고, 이벤트 클러스터에서 서브도메인 후보를 식별한다.
Alberto Brandolini의 Event Storming 정통 방법을 스킬화한 것. 정책·커맨드·시스템 이름은 이 단계에서 다루지 않는다 (후속 단계의 Design-Level ES 몫).
이 스킬의 산출물은 2개:
event-flow.md— 이벤트 타임라인 + 액터 + 핫스팟subdomain-map.md— 서브도메인 후보 (분류 전 상태, Core/Supporting/Generic 컬럼은 비어 있음)
분류는 다음 스킬 subdomain-classifier에서 같은 파일을 이어서 채운다.
대화 UX 규약 (필수)
- 카테고리 선택은 숫자 메뉴. 자유 입력 금지.
- 1문 1답 기본. 단순 Yes/No만 2~3개까지 번호 달아 묶기 허용.
- 진행 표시:
[Q 3/12 · 근거: ...] - "나중에" / "모름" / "스킵" 항상 허용 →
⚠️ 미정으로 산출물에 기록. - 자가 진단·평가는 ✅/⚠️/❌ 3단계. 숫자 점수 금지.
- 이벤트는 반드시 과거형 — 한국어 "~됨/~함" / 영어 "PastParticiple". 정책·시스템 이름 금지.
1. 언제 트리거하는가
/ddd-workshop:event-storming-explorerrequirements-refiner출력 직후- "이벤트 스토밍", "빅픽처", "서브도메인 후보 찾아줘"
- 기존
event-flow.md업데이트 →--update
2. 입력
docs/requirements.md— 주 입력- 도메인 브리프, MUST/SHOULD 요구사항, 액터 목록, 맥락
- UL 기본 언어 설정 (한국어 / 영어)
3. Step 0 — Upstream 일관성 스캔
자동 점검:
requirements.md존재 확인. 없으면 "먼저requirements-refiner실행하세요" 안내.- 맥락(학습/개인/사내/B2B/B2C) 로드 → 세션 규모 조정.
- UL 기본 언어 로드. 미지정이면 사용자에게 1회 질문.
- 도메인 브리프에서 액터 후보와 주요 활동 동사 미리 뽑아 질문 시드로 보관.
결과 공개:
📋 Upstream 스캔
- 맥락: 사내 HR 플랫폼
- UL 기본 언어: 한국어
- 액터 후보: 사원, 관리자, 결재자
- 활동 동사 후보: 신청, 승인, 반려, 조정, 소멸
- ⚠️ 미정: 자동 부여 주기 근거법 조항 (requirements.md)
진행할까요? (1) 진행 2) 미정 해소 후 진행 3) 요구사항 수정으로 복귀)
4. 진행 단계
Step 1 — 주요 액터 확정
[Q · 액터 식별]
이 도메인의 주요 액터를 확정합니다. requirements에서 뽑은 후보:
1) 사원 (휴가 신청·조회)
2) 결재자 (승인·반려)
3) 관리자 (잔고 조정, 권한 관리)
4) 시스템 (자동 부여, 만료 처리)
5) 기타 추가
(복수 선택 가능, 예: 1,2,3)
시스템 액터도 포함. 자동 적립·만료·알림 발송 등은 시스템이 주체.
Step 2 — 이벤트 추출 (과거형 강제)
각 액터별로 "이 액터의 활동으로 시스템에 일어난 사건"을 과거형 동사로 수집:
[Q · 액터: 사원]
이 액터가 관여해서 시스템에 일어난 사건들은?
예시 포맷:
- 사원_초대됨 / EmployeeInvited
- 연차_신청됨 / LeaveRequested
- 연차_취소됨 / LeaveRequestCancelled
주의:
- 현재형·미래형 금지 ("신청한다" ❌ → "신청됨" ✅)
- 정책 아님 ("3일 이상은 특별승인" ❌)
- 커맨드 아님 ("연차 신청 제출" ❌ → "연차가 제출됨" ✅)
- 시스템 이름 아님 ("카프카에 발행됨" ❌)
자유 기술 후 1문 1답으로 다듬는다.
수집 후 확인: "이 이벤트가 진짜 도메인 사건이 맞는가, 아니면 기술적 처리인가?"
- "DB에 저장됨" ❌ (기술 레이어)
- "연차가 차감됨" ✅ (도메인 사건)
Step 3 — 이벤트 타임라인 배치
수집된 이벤트를 시간순으로 배치. 병렬·분기는 괄호로 표기.
[Q · 타임라인 배치]
다음 이벤트들을 시간순으로 배치했습니다. 맞나요?
1. 사원_초대됨
2. 사원_활성화됨
3. 연차잔고_초기화됨
4. 연차_적립됨 (매월)
5. 연차_신청됨
6. 신청이_제출됨
7. (분기)
6a. 신청이_승인됨 → 연차가_차감됨
6b. 신청이_반려됨
8. 연차_소멸됨 (1년 경과)
1) 맞음
2) 순서 수정
3) 누락된 이벤트 추가
4) 이벤트 제거
Step 4 — 핫스팟(Hotspot) 식별
핫스팟 = 모순·미정·논란 지점. 빨간 스티커에 해당.
[Q · 핫스팟 식별]
이 흐름에서 미정이거나 모순된 지점이 있나요?
체크 항목:
- 예외 흐름이 명확하지 않은 곳
- 이해관계자 간 의견이 달랐던 곳
- 자동·수동 경계가 모호한 곳
- 법·규제 요건이 불명확한 곳
예: ⚠️ "퇴사 시 진행 중 신청을 자동 취소? 수동? 미정"
Step 5 — 서브도메인 후보 클러스터링
타임라인의 이벤트를 언어·리듬·액터·관심사로 묶어 서브도메인 후보를 제안.
[Q · 서브도메인 후보]
이벤트를 다음과 같이 묶어봤습니다. 동의하시나요?
A. 조직 관리
- 사원_초대됨, 사원_활성화됨, 사원_퇴사됨, 부서_생성됨
B. 연차 잔고 회계
- 연차잔고_초기화됨, 연차_적립됨, 연차_차감됨, 연차_소멸됨
C. 연차 신청·결재
- 연차_신청됨, 신청이_제출됨, 신청이_승인됨, 신청이_반려됨
D. 알림
- 이메일_발송됨, 웹푸시_발송됨
1) 이대로 OK
2) 클러스터 병합/분리
3) 이벤트를 다른 클러스터로 이동
4) 서브도메인 이름 변경
주의: 이 단계에서는 분류(Core/Supporting/Generic) 금지. 그건 다음 스킬의 일. 지금은 "무엇이 있나"만.
Step 6 — 동음이의어·미정 항목 정리
- 같은 단어가 서로 다른 맥락에서 다른 의미로 쓰이면 표시 → 후속 BC 설계의 경계 단서.
- 핫스팟·미정 항목을
⚠️로 마킹.
5. 산출물
5.1 docs/shared/event-flow.md
기본 경로 docs/shared/event-flow.md. 프로젝트 관례가 다르면 사용자에게 확인.
Frontmatter 없음. 본문만.
# Event Flow (Big Picture)
## 전제
- 시점: 전역 시간축
- 포함: 과거형 도메인 이벤트, 액터
- 제외: 정책(Policy), 커맨드, 시스템 이름, 분기 로직
- UL 기본 언어: 한국어 (Code Identifier는 영어 병기)
## 액터
- **사원**: 연차 신청·조회
- **결재자**: 승인·반려
- **관리자**: 잔고 조정, 권한 관리
- **시스템**: 자동 부여·만료, 알림 발송
## 이벤트 타임라인
### 1. 사원 생애주기
- 사원이 초대됨 (EmployeeInvited)
- 사원이 활성화됨 (EmployeeActivated)
- 연차잔고가 초기화됨 (LeaveBalanceInitialized)
- ...
- 사원이 퇴사함 (EmployeeTerminated)
### 2. 연차 부여·소멸
- 연차가 적립됨 (LeaveBalanceAccrued) — 매월
- 연차가 소멸됨 (LeaveBalanceExpired) — 부여 후 1년
### 3. 연차 신청·승인
- [사원] 연차 신청을 작성함
→ 신청이 임시저장됨 (LeaveRequestDrafted)
→ 신청이 제출됨 (LeaveRequestSubmitted)
- [결재자]
→ 신청이 승인됨 (LeaveRequestApproved)
→ 연차가 차감됨 (LeaveBalanceConsumed)
→ 또는 신청이 반려됨 (LeaveRequestRejected)
- [사원]
→ 신청이 취소됨 (LeaveRequestCancelled)
→ 연차가 복원됨 (LeaveBalanceRestored)
## 핫스팟 (⚠️ 미정·모순)
- ⚠️ 퇴사 시 진행 중 신청 자동 취소 여부
- ⚠️ 만료 경계에서 취소된 신청의 복원 처리
- ⚠️ 자동 부여 주기의 근거 법조항 (근기법 60조?)
## 동음이의어 후보
- "연차" — 잔고 개념 vs 휴가 종류 (종일/반차) 구분 필요
- "취소" — 신청 단계 vs 승인 후 단계 구분 필요
5.2 docs/shared/subdomain-map.md (분류 전)
# Subdomain Map
> 이 문서는 2단계(event-storming-explorer)에서 **후보 식별**까지 작성됨.
> 3단계(subdomain-classifier)에서 Core/Supporting/Generic **분류** 컬럼이 채워짐.
## 서브도메인 후보
| # | 서브도메인 | 포함 이벤트 | 분류 | Why |
|---|---|---|---|---|
| A | 조직 관리 | 사원 생애주기, 부서, 직위 | _미정_ | _미정_ |
| B | 연차 잔고 회계 | 적립·차감·소멸·조정 | _미정_ | _미정_ |
| C | 연차 신청·결재 | 신청·제출·승인·반려·취소 | _미정_ | _미정_ |
| D | 알림 | 이메일·웹푸시 발송 | _미정_ | _미정_ |
## 각 서브도메인 상세
### A. 조직 관리
- 관여 액터: 관리자, 시스템
- 핵심 언어: 사원, 부서, 직위, 직책, 초대, 활성화, 퇴사
- 경계 근거: 사원 생애주기 이벤트 군집
### B. 연차 잔고 회계
- 관여 액터: 사원, 관리자, 시스템
- 핵심 언어: 연차(잔고), 적립, 차감, 복원, 조정, 소멸, 원장
- 경계 근거: 회계성 이벤트(append-only) 군집
### C. 연차 신청·결재
...
## 다음 단계
→ `subdomain-classifier` 실행.
- 각 서브도메인에 Core/Supporting/Generic 분류 + Why 작성
- Slice-first 대상 Core 선정
6. 업데이트 모드 (--update)
requirements.mdupdated_at비교 → stale 경고.- "무엇을 업데이트?" 숫자 메뉴:
1) 액터 추가/제거 2) 이벤트 추가/제거/순서 수정 3) 핫스팟 추가/해소 4) 서브도메인 클러스터 재편 - 해당 부분만 delta 질문.
주의: subdomain-map.md의 분류 컬럼이 이미 채워져 있으면 subdomain-classifier에 영향 → 경고 후 진행.
7. 강제 체크리스트
□ Step 0 upstream 스캔 완료
□ 액터 목록 확정 (시스템 액터 포함)
□ 모든 이벤트 과거형
□ 기술 레이어 이벤트 제외 (DB·Kafka 등)
□ 정책·커맨드·시스템 이름 없음
□ 타임라인 시간순 배치
□ 핫스팟 식별 (없으면 "없음" 명시)
□ 서브도메인 후보 3~7개
□ subdomain-map.md 분류 컬럼은 비어 있음 (_미정_)
□ Frontmatter 없음
8. 맥락별 조정
| 맥락 | 이벤트 수 | 클러스터 수 | 깊이 |
|---|---|---|---|
| 학습 | 5~10 | 1~2 | 얕음 |
| 개인 | 10~20 | 2~3 | 중간 |
| 사내 | 15~40 | 3~5 | 중간 |
| B2B | 20~60 | 4~7 | 깊음 |
| B2C | 30~80 | 4~7 | 깊음 |
9. 절대 하지 말 것
- 이벤트에 정책·커맨드·시스템 이름 섞기 ("Kafka에 발행됨" ❌).
- 현재형·미래형 이벤트 ("신청한다" ❌).
- 서브도메인을 Core/Supporting/Generic으로 분류하기 (다음 스킬 몫).
- BC(Bounded Context)로 바로 넘어가기 (4단계
context-designer몫). - 기술 스택 이름 언급 (Spring·Kafka·Redis 등).
- 타임라인 없이 이벤트 목록만 나열.
- Frontmatter 추가.
10. 왜 이 순서인가
Evans/Vernon 정통 전략적 설계 순서:
Domain → Subdomain 식별 → UL → Bounded Context → Context Map
이 스킬은 Subdomain 식별을 담당한다. Big Picture Event Storming은 이벤트 클러스터로 서브도메인 경계의 1차 증거를 만든다.
분류(Core/Supporting/Generic)를 같이 하지 않는 이유:
- 식별은 기술적·현상적 사고 (도메인 전문가와).
- 분류는 전략적·투자 판단 (비즈니스 결정자와).
- 섞으면 "Core가 될 만한 것"을 먼저 찾는 편향이 생겨 식별이 왜곡.
- 전체 목록을 보고 분류하는 게 상대적 비교 품질 ↑.
More from dev-goraebap/skills
claude-hook-notify-setup
>
23media-storage
파일 업로드·저장소·첨부 관리 패턴. Actions: 파일 업로드, 이미지 업로드, 파일 처리, 저장소 연동, 썸네일 첨부, 색상 추출, file upload, image upload, storage, attachment, thumbnail. Patterns: Active Storage, blobs 테이블, attachments 테이블, 다형적 첨부, 중복 파일 감지. Storage: Cloudflare R2, AWS S3, @aws-sdk/client-s3, UUID key, 2-level 디렉토리, CDN URL, presigned URL. DB: Drizzle ORM, blob, checksum, MD5, metadata JSON, MIME, byte_size. Color: 지배적 색상 추출, dominant color, Gemini API, hex, blobs.metadata. Query: 썸네일 조회, 서브쿼리, leftJoin, view-model, CDN URL 변환.
22sveltekit-progressive-architecture
SvelteKit 프로젝트 아키텍처·코드 규칙. Actions: 작성, 구현, 리뷰, 리팩터, 검토, 추가, 설계, 수정, write, implement, review, refactor, fix. Base Rules: 컴포넌트 재사용, $lib, 라우트 배치, 인라인 타입 금지, interface, type, script 섹션, 주석, 가독성, code style, TypeScript. Server Architecture: 서버 아키텍처, Active Record, Query Service, REST API, Drizzle, +server.ts, +page.server.ts, server/domain, server/infra, 뷰모델, view-model, form actions, ORM, schema, 레이어 분리, CUD, load.
18agent-wiki
>
15html-prototype
>
12mvp-preview
아이디어나 기능을 빠르게 만들어 링크로 공유하는 MVP 워크플로우. 사용자가 '프로토타입 만들어줘', '데모 페이지 필요해', '빠르게 만들어줘', '클라이언트한테 보여줄 거 만들어줘', '아이디어 구체화해줘', '링크 공유해야 해', '배포해줘', 'MVP 만들기', '기획 검토용 화면'처럼 말하면 반드시 이 스킬을 사용한다. 아이디어가 막연해도 괜찮다. 토론으로 범위를 좁히고, 최소 코드로 가치를 증명하고, 링크 하나로 전달하는 전 과정을 다룬다.
12