ddd-workshop/skills/event-storming-explorer/SKILL.md
ddd-workshop 파이프라인의 2단계 (전략적 설계 시작점). requirements-refiner 산출물에서 Big Picture Event Storming — 과거형 도메인 이벤트와 액터를 시간순 타임라인으로 추출하고, 그 흐름을 클러스터링해 서브도메인 후보를 식별한다. 서브도메인 **식별만** 담당하며 Core/Supporting/Generic 분류는 다음 스킬(subdomain-classifier)에서. 산출물은 event-flow.md(흐름)와 subdomain-map.md(분류 전 후보 목록). "이벤트 스토밍", "event storming", "빅픽처", "도메인 이벤트 흐름", "서브도메인 식별", "서브도메인 후보", "event-storming-explorer", "ddd-workshop 2단계" 같은 요청에 트리거한다.
npx skillsauth add dev-goraebap/skills event-storming-explorerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Big Picture Event Storming을 수행해 도메인 전반의 과거형 이벤트 타임라인과 액터를 뽑고, 이벤트 클러스터에서 서브도메인 후보를 식별한다.
Alberto Brandolini의 Event Storming 정통 방법을 스킬화한 것. 정책·커맨드·시스템 이름은 이 단계에서 다루지 않는다 (후속 단계의 Design-Level ES 몫).
이 스킬의 산출물은 2개:
event-flow.md — 이벤트 타임라인 + 액터 + 핫스팟subdomain-map.md — 서브도메인 후보 (분류 전 상태, Core/Supporting/Generic 컬럼은 비어 있음)분류는 다음 스킬 subdomain-classifier에서 같은 파일을 이어서 채운다.
[Q 3/12 · 근거: ...]⚠️ 미정으로 산출물에 기록./ddd-workshop:event-storming-explorerrequirements-refiner 출력 직후event-flow.md 업데이트 → --updatedocs/requirements.md — 주 입력
자동 점검:
requirements.md 존재 확인. 없으면 "먼저 requirements-refiner 실행하세요" 안내.결과 공개:
📋 Upstream 스캔
- 맥락: 사내 HR 플랫폼
- UL 기본 언어: 한국어
- 액터 후보: 사원, 관리자, 결재자
- 활동 동사 후보: 신청, 승인, 반려, 조정, 소멸
- ⚠️ 미정: 자동 부여 주기 근거법 조항 (requirements.md)
진행할까요? (1) 진행 2) 미정 해소 후 진행 3) 요구사항 수정으로 복귀)
[Q · 액터 식별]
이 도메인의 주요 액터를 확정합니다. requirements에서 뽑은 후보:
1) 사원 (휴가 신청·조회)
2) 결재자 (승인·반려)
3) 관리자 (잔고 조정, 권한 관리)
4) 시스템 (자동 부여, 만료 처리)
5) 기타 추가
(복수 선택 가능, 예: 1,2,3)
시스템 액터도 포함. 자동 적립·만료·알림 발송 등은 시스템이 주체.
각 액터별로 "이 액터의 활동으로 시스템에 일어난 사건"을 과거형 동사로 수집:
[Q · 액터: 사원]
이 액터가 관여해서 시스템에 일어난 사건들은?
예시 포맷:
- 사원_초대됨 / EmployeeInvited
- 연차_신청됨 / LeaveRequested
- 연차_취소됨 / LeaveRequestCancelled
주의:
- 현재형·미래형 금지 ("신청한다" ❌ → "신청됨" ✅)
- 정책 아님 ("3일 이상은 특별승인" ❌)
- 커맨드 아님 ("연차 신청 제출" ❌ → "연차가 제출됨" ✅)
- 시스템 이름 아님 ("카프카에 발행됨" ❌)
자유 기술 후 1문 1답으로 다듬는다.
수집 후 확인: "이 이벤트가 진짜 도메인 사건이 맞는가, 아니면 기술적 처리인가?"
수집된 이벤트를 시간순으로 배치. 병렬·분기는 괄호로 표기.
[Q · 타임라인 배치]
다음 이벤트들을 시간순으로 배치했습니다. 맞나요?
1. 사원_초대됨
2. 사원_활성화됨
3. 연차잔고_초기화됨
4. 연차_적립됨 (매월)
5. 연차_신청됨
6. 신청이_제출됨
7. (분기)
6a. 신청이_승인됨 → 연차가_차감됨
6b. 신청이_반려됨
8. 연차_소멸됨 (1년 경과)
1) 맞음
2) 순서 수정
3) 누락된 이벤트 추가
4) 이벤트 제거
핫스팟 = 모순·미정·논란 지점. 빨간 스티커에 해당.
[Q · 핫스팟 식별]
이 흐름에서 미정이거나 모순된 지점이 있나요?
체크 항목:
- 예외 흐름이 명확하지 않은 곳
- 이해관계자 간 의견이 달랐던 곳
- 자동·수동 경계가 모호한 곳
- 법·규제 요건이 불명확한 곳
예: ⚠️ "퇴사 시 진행 중 신청을 자동 취소? 수동? 미정"
타임라인의 이벤트를 언어·리듬·액터·관심사로 묶어 서브도메인 후보를 제안.
[Q · 서브도메인 후보]
이벤트를 다음과 같이 묶어봤습니다. 동의하시나요?
A. 조직 관리
- 사원_초대됨, 사원_활성화됨, 사원_퇴사됨, 부서_생성됨
B. 연차 잔고 회계
- 연차잔고_초기화됨, 연차_적립됨, 연차_차감됨, 연차_소멸됨
C. 연차 신청·결재
- 연차_신청됨, 신청이_제출됨, 신청이_승인됨, 신청이_반려됨
D. 알림
- 이메일_발송됨, 웹푸시_발송됨
1) 이대로 OK
2) 클러스터 병합/분리
3) 이벤트를 다른 클러스터로 이동
4) 서브도메인 이름 변경
주의: 이 단계에서는 분류(Core/Supporting/Generic) 금지. 그건 다음 스킬의 일. 지금은 "무엇이 있나"만.
⚠️ 로 마킹.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 승인 후 단계 구분 필요
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 선정
--update)requirements.md updated_at 비교 → stale 경고.1) 액터 추가/제거
2) 이벤트 추가/제거/순서 수정
3) 핫스팟 추가/해소
4) 서브도메인 클러스터 재편
주의: subdomain-map.md의 분류 컬럼이 이미 채워져 있으면 subdomain-classifier에 영향 → 경고 후 진행.
□ Step 0 upstream 스캔 완료
□ 액터 목록 확정 (시스템 액터 포함)
□ 모든 이벤트 과거형
□ 기술 레이어 이벤트 제외 (DB·Kafka 등)
□ 정책·커맨드·시스템 이름 없음
□ 타임라인 시간순 배치
□ 핫스팟 식별 (없으면 "없음" 명시)
□ 서브도메인 후보 3~7개
□ subdomain-map.md 분류 컬럼은 비어 있음 (_미정_)
□ Frontmatter 없음
| 맥락 | 이벤트 수 | 클러스터 수 | 깊이 | |---|---|---|---| | 학습 | 5~10 | 1~2 | 얕음 | | 개인 | 10~20 | 2~3 | 중간 | | 사내 | 15~40 | 3~5 | 중간 | | B2B | 20~60 | 4~7 | 깊음 | | B2C | 30~80 | 4~7 | 깊음 |
context-designer 몫).Evans/Vernon 정통 전략적 설계 순서:
Domain → Subdomain 식별 → UL → Bounded Context → Context Map
이 스킬은 Subdomain 식별을 담당한다. Big Picture Event Storming은 이벤트 클러스터로 서브도메인 경계의 1차 증거를 만든다.
분류(Core/Supporting/Generic)를 같이 하지 않는 이유:
testing
도메인 일반 패턴을 강의 모드로 가르치는 인지과학 기반 학습 스킬. AI가 가상 도메인 전문가(선생님) 역할을 하고 사용자가 학생으로 낯선 도메인을 차근차근 배운다. 메뉴로 시작해서 페이즈를 골라 잠수 → 능동 회상 Q&A → 자기 설명(Feynman) 순서로 진행. Dunlosky 메타분석 기반 인지과학 8원칙(Cognitive Load, Practice Testing, 정교화 질문, Self-Explanation, Schema 연결, Dual Coding, Desirable Difficulty, 분산 학습)을 본문에 명시 적용. 도메인의 법령·산업 표준·인증을 학습 본문에 정식 통합 (출처 인용이 아니라 학습 대상). AI가 판단해 보편적이고 자료 풍부한 도메인은 자료 요청 없이 진행, 좁고 깊은 도메인일 때만 사용자에게 자료 있는지 묻기. 산출물은 학습 노트 스타일 (진도 체크박스 + 페이즈별 일관 구조 + 출처 링크). 페르소나 강요 없이 보편 액터 표현("사원 A", "관리자 A"). bigpicture의 이전 단계로 작동하거나 단독 사용 가능. Triggers — "도메인 학습", "낯선 도메인 가르쳐줘", "이 산업 어떻게 굴러가요", "선생님 모드", "1:1 강의", "도메인 입문", "도메인 일반 패턴", "HR 플랫폼이 뭔지", "이커머스 흐름", "domain classroom", "/domain-classroom".
development
빅픽처 이벤트스토밍의 1:1 분석 도구. 학습 단계(domain-classroom)에서 머리에 박힌 도메인 일반 패턴을 클라이언트 시스템에 매핑해 빅픽처 산출물(시간순 도메인 이벤트·페이즈·액터·외부시스템·핫스팟·피벗)을 누적한다. domain-classroom의 학습 노트(docs/learning-notes/{도메인}- classroom.md)와 클라이언트 자료(RFP·요구사항정의서·기존 시스템 스키마)를 입력으로 받아 페이즈 단위로 진행. 페르소나·서사 없는 분석 톤. 도메인 이벤트 판별 4기준(도메인 전문가 관심·비즈니스 상태 변화·법적 의미·다른 흐름 트리거)을 명시 적용해 UI/Telemetry 이벤트 혼입 방지. 이벤트는 한국어 자연어 + Code Identifier 이중 표기. 핫스팟에 ID·답할 위치·확신도 태그 부여. 산출물은 docs/eventstorming.md 단일 파일로 시작, 후속 단계 스킬(process-modeling·software-design)이 추가될 때 폴더로 자연 분기. Initial/Update/Cycle 모드 지원 — 코드 작성 후에도 다시 사이클 가능. Triggers — "빅픽처", "빅픽처 만들어줘", "이벤트스토밍", "도메인 이벤트 정리", "Big Picture EventStorming", "페이즈 매핑", "도메인 산출물 정리", "/bigpicture".
data-ai
빅픽처 이벤트스토밍의 1:1 학습 친화 변형. 그룹 워크샵에서 도메인 전문가가 던지는 이벤트를 받아 적는 대신, AI가 가상 도메인 전문가 역할을 하고 사용자가 학습자로 1:1 인터뷰하며 빅픽처를 누적한다. 산출물(시간순 도메인 이벤트·액터· 외부시스템·핫스팟·피벗)은 빅픽처 이벤트스토밍과 거의 동일하지만, 한 보드에 한 번에 펼치는 방식이 아니라 **한 액터·한 챕터씩 시간순 서사로 누적**한다. 각 장면마다 "왜 이게 필요한가?" 설명을 곁들여 학습자가 따라올 수 있게 한다. RFP·요구사항정의서·기존 도메인 자료를 입력으로 받거나, 자료가 없으면 AI 사전 리서치(보편 사례·법령·산업 표준)로 보충해 진행. 페르소나 시점의 챕터 단위 (5~7개 장면) + 확신도 태그 [확실/일반론/추측]로 검증 지점 명시 + 사용자 인터랙션 + 액터 전환으로 빅픽처를 점진적으로 채운다. 산출물 저장은 옵셔널 — 이해 자체가 목적이다. Triggers — "낯선 도메인 이해", "도메인 차근차근 알려줘", "1:1 빅픽처", "솔로 이벤트스토밍", "RFP 분석", "비즈니스 흐름 이해", "액터 시나리오", "신규 프로젝트 도메인 파악", "빅픽처 스토리타임", "bigpicture storytime", "/bigpicture-storytime".
databases
PostgreSQL DB에 직접 접근하는 스킬. DB 조회, 테이블 구조 확인, 데이터 검증이 필요할 때 사용한다. Node.js 스크립트로 직접 연결하며 접속 정보는 환경변수 또는 credentials 파일에서 읽는다. "postgres 조회", "DB 확인", "테이블 구조", "pg-query", "쿼리 실행", "데이터 검증", "PostgreSQL 접속" 같은 요청에 트리거한다.