ddd-workshop/skills/context-designer/SKILL.md
ddd-workshop 파이프라인의 4단계. 분류된 서브도메인에서 Bounded Context를 설계하고, **BC마다 BC Canvas(1페이지 요약, per-BC Ubiquitous Language 내장) 파일**과 **Context Map(BC 간 관계)** 을 생성한다. UL은 전역이 아니라 per-BC이며 각 BC Canvas 안에 "용어 | Code Identifier | 의미" 이중 표기로 들어간다. Cross-BC 공용 용어·enum·ID 타입만 별도 published-language.md에 둔다. Slice-first 권장: 선택된 Core 서브도메인의 BC부터 설계하고 직접 경계하는 이웃 BC만 함께 그린다. 산출물 폴더는 domains/가 아니라 contexts/. "BC 설계", "bounded context", "context map", "BC canvas", "컨텍스트 맵", "캔버스", "context designer", "ddd-workshop 4단계" 같은 요청에 트리거한다.
npx skillsauth add dev-goraebap/skills context-designerInstall 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.
서브도메인(문제 공간) 에서 Bounded Context(해결 공간) 를 설계한다. 서브도메인 ↔ BC 매핑은 1:1이 기본이지만, 1:N(큰 서브도메인을 쪼갬)이나 N:1(작은 서브도메인 묶음)도 가능하다.
이 스킬의 산출물은 3종류:
docs/shared/context-map.md — 전역 1장, BC 목록 + BC 간 관계docs/shared/contexts/<bc>/_canvas.md — BC마다 1장, per-BC UL 내장docs/shared/published-language.md — (선택) cross-BC 공용 용어만UL은 전역이 아니라 per-BC라는 정통 원칙에 따라 Canvas 내부에 박는다. 전역 ubiquitous-language.md는 사용하지 않는다.
Slice-first 권장: subdomain-classifier가 선택한 Core 서브도메인의 BC부터 설계하고, 그 BC와 직접 경계하는 이웃 BC만 함께 그린다. 전체 BC 맵은 시간이 흐르며 완성.
[Q 3/12 · 근거: ...]⚠️ 미정으로 산출물에 기록./ddd-workshop:context-designersubdomain-classifier 출력 직후context-map.md 또는 _canvas.md 업데이트 → --updatedocs/shared/subdomain-map.md — 주 입력
docs/shared/event-flow.md — 이벤트·동음이의어 근거 (BC 경계의 1순위 증거)docs/shared/requirements.md — 조직·외부 시스템 맥락, UL 기본 언어자동 점검:
subdomain-map.md의 "Slice-first 결정" 섹션 확인.event-flow.md의 동음이의어 목록을 BC 경계의 1순위 증거로 로드.requirements.md의 외부 시스템 목록 → ACL/Conformist 후보로 보관.결과 공개:
📋 Upstream 스캔
- Slice-first 대상: B. 연차 잔고 회계 (Core)
- UL 기본 언어: 한국어
- 동음이의어 2종 로드 (연차, 취소)
- 외부 시스템: 이메일 공급자(미정), FCM
- ⚠️ 미정: 결재선 범용화 여부 (requirements.md)
진행할까요? (1) 진행 2) 미정 해소 후 진행 3) [3]으로 복귀)
이번 세션에서 BC 설계 범위를 확정합니다.
Slice-first 대상 서브도메인: B. 연차 잔고 회계
포함할 이웃 BC 후보:
- A. 조직 관리 (사원 정보 공급)
- C. 연차 신청·결재 (잔고 차감·복원 호출)
- D. 알림 (이벤트 구독)
이 범위로 진행할까요?
1) 그대로 진행
2) 이웃 BC 조정
3) 전체 BC 맵 설계 (slice 중단, 모든 서브도메인 일괄)
옵션 3은 요구사항 변동 위험 경고 후 사용자 재확인.
각 서브도메인에 대해:
[Q · 서브도메인: B. 연차 잔고 회계]
이 서브도메인의 BC 구성을 결정합니다.
1) 1:1 — 서브도메인 전체를 하나의 BC로 (Leave Balance BC)
2) 1:N — 두 개 이상의 BC로 쪼갬
3) N:1 — 인접 서브도메인과 묶음
4) 모름 / 나중에
현재 언어 증거: 동음이의어 "연차"(잔고) vs "종일 휴가"(휴가 종류)
→ 잔고 계산 BC와 휴가 종류 분리 여지
BC마다 다음 항목을 묶음 질문:
[BC Canvas: Leave Balance]
다음을 확정합니다. 1문씩 묶어 질문합니다.
Q1. Purpose (한 문장):
제안: "연차 잔고의 회계 권위. 부여·사용·조정·소멸 무결성 보장."
1) 그대로 2) 수정
Q2. Strategic Classification:
- Domain: Core (subdomain-map 그대로)
- Why: requirements Why 인용
Q3. Inbound Communication:
- Commands: consume, restore, adjust
- Queries: getBalance, getLedger
- Subscribed Events: EmployeeActivated, EmployeeTerminated
Q4. Outbound Communication:
- Events: LeaveBalanceAccrued, LeaveBalanceExpired,
LeaveAdjusted, LeaveConsumed, LeaveRestored
- Calls: checkPermission (to Access Control)
Q5. Business Decisions (3~5개):
제안:
- 잔고 = 원장 누적 합계 (불변식)
- Accrual은 (employeeId, accrualPeriod) 단위 idempotent
- 잔고 부족 시 consume 거부
1) 그대로 2) 추가/수정
Q6. Ubiquitous Language (이중 표기):
| 용어 | Code Identifier | 의미 |
| 연차 | AnnualLeave | 사원의 유급휴가 잔고 |
...
Q7. Assumptions / Open Questions
BC 쌍마다 관계 패턴을 결정:
[Q · 관계: [Leave Request] → [Leave Balance]]
이 두 BC는 어떻게 연결되나요?
1) Customer-Supplier (이벤트 기반)
2) Conformist (하류가 상류 모델 그대로 수용)
3) ACL (하류가 자체 인터페이스, 상류 모델 번역·격리)
4) Shared Kernel (공유 모델, 매우 드물게)
5) Open Host Service + Published Language (상류가 공용 프로토콜 공개)
6) Partnership (두 팀 공동 소유)
7) Separate Ways (통합 안 함)
8) 모름
권장: ACL — Core(Leave Balance) 보호, 차감·복원 로직을 Leave Balance 내부가 책임
텍스트 다이어그램으로 관계 시각화. 기존 패턴 유지.
진짜 cross-BC에 공유되는 것만 여기 분리. 일반 용어는 각 BC Canvas에만.
[Q · Published Language 후보]
여러 BC가 **같은 이름·같은 의미**로 공유하는 용어/Enum/ID가 있나요?
예: Permission enum (Access Control이 정의, 모든 BC가 참조)
예: EmployeeId (Organization이 발행, 다른 BC는 ID 타입으로만 참조)
1) 있음 (목록 제공 → published-language.md 생성)
2) 없음 (이 파일 생성 안 함)
다음을 명시:
Frontmatter 없음. 본문만.
docs/shared/context-map.md# Context Map
## Slice 범위
- 대상 Core BC: Leave Balance
- 포함 이웃 BC: Organization, Leave Request, Notification
- 제외: Access Control (별 슬라이스), Identity (범위 밖)
## 서브도메인 → BC 매핑
| 서브도메인 | 분류 | BC | 매핑 | 비고 |
|---|---|---|---|---|
| B. 연차 잔고 회계 | Core ⭐ | Leave Balance | 1:1 | Slice 대상 |
| A. 조직 관리 | Supporting | Organization | 1:1 | |
| C. 연차 신청·결재 | Supporting | Leave Request | 1:1 | |
| D. 알림 | Generic | Notification | 1:1 | |
---
## Bounded Context 상세
각 BC의 상세는 `contexts/<bc>/_canvas.md` 참조.
### Leave Balance ⭐
- 핵심 책임: 연차 잔고의 회계 권위
- Canvas: `contexts/leave-balance/_canvas.md`
### Organization
- 핵심 책임: 조직·사원 마스터
- Canvas: `contexts/organization/_canvas.md`
(이하 생략)
---
## Context Map (관계 다이어그램)
(다이어그램)
## BC 간 관계 표
| From | To | 관계 | 근거 |
|---|---|---|---|
| Leave Request | Leave Balance | ACL | Core 보호, 차감·복원 명시 호출 |
| Organization | Leave Balance | Customer-Supplier (이벤트) | EmployeeTerminated 등 수신 |
| ... | ... | ... | ... |
## ⚠️ 경계 판단 애매 지점
## ⚠️ 고위험 관계
## ⚠️ 미확인 사항
## 다음 단계
→ `aggregate-designer`로 Core BC의 Aggregate 설계.
docs/shared/contexts/<bc>/_canvas.mdBC마다 1개. 언더스코어 접두사로 Aggregate 파일과 구분.
# Leave Balance — BC Canvas
## Purpose
연차 잔고의 회계 권위. 부여·사용·조정·소멸의 무결성을 보장.
## Strategic Classification
- **Domain**: Core ⭐
- **Why Core**: 근기법 기반 잔고 계산은 우리 HR의 핵심 차별점.
오류 시 법적·재무적 리스크가 큼.
- **Business Model**: Compliance + Revenue
- **Evolution**: Product
---
## Inbound Communication
### Commands (from Leave Request BC)
- `consume(employeeId, amount, requestId, reason)`
- `restore(employeeId, amount, requestId, reason)`
### Commands (from Admin UI)
- `adjust(employeeId, delta, reason, adjustedBy)`
### Queries
- `getBalance(employeeId)`
- `getLedger(employeeId, range)`
### Subscribed Events (from Organization BC)
- `EmployeeActivated` → LeaveBalanceInitialized
- `EmployeeTerminated` → 진행 중 정산
---
## Outbound Communication
### Events Published
- `LeaveBalanceAccrued`
- `LeaveBalanceExpired`
- `LeaveAdjusted`
- `LeaveConsumed`
- `LeaveRestored`
- `LeaveLedgerEntryAppended`
### Calls (sync)
- `Access Control.checkPermission(...)` — 모든 관리자 커맨드 앞
---
## Ubiquitous Language
| 용어 | Code Identifier | 의미 |
|---|---|---|
| 연차 | AnnualLeave | 사원의 유급휴가 잔고 |
| 잔여 연차 | LeaveBalance | 현재 사용 가능한 일수 (원장 합계 파생) |
| 원장 | LeaveLedger | 잔고 변동 회계 기록 (append-only) |
| 원장 엔트리 | LeaveLedgerEntry | 원장의 한 줄 |
| 부여 | Accrual | 근기법 공식 기반 자동 적립 |
| 사용 | Consumption | 승인된 신청에 따른 차감 |
| 복원 | Restoration | 취소 시 되돌림 |
| 조정 | Adjustment | 관리자 수기 보정 |
| 소멸 | Expiration | 발생 후 1년 경과분 자동 폐기 |
| 부여 주기 | AccrualPeriod | Accrual 멱등성 키 (YYYY-MM 등) |
### 주의사항 (동음이의어·범위)
- "연차"(여기)는 **잔고 개념**. 휴가 종류의 "종일 휴가"와 별개.
- "신청"은 이 BC의 언어가 **아님** — Leave Request BC 소관.
---
## Business Decisions
1. **잔고 = 원장 누적 합계** (불변식)
2. Accrual은 `(employeeId, accrualPeriod)` 단위 idempotent
3. 잔고 부족 시 `consume` 거부
4. `EmployeeTerminated` 수신 시 진행 중 Accrual 중단 + 미사용분 정산
5. Adjustment는 `adjustedBy` + `reason` 필수, audit log 영구 보존
---
## Assumptions
- 결재·승인 로직은 Leave Request BC가 소유, 이 BC는 결과만 수신
- 이메일 공급자는 Notification BC가 추상화
## Open Questions
- ⚠️ 11개월 근무 후 퇴사 시 1개 적립 여부 (근기법 해석)
- ⚠️ 만료 경계 ±1일 처리
---
## Aggregates (이 BC 소속)
- AnnualLeaveBalance (권위 Aggregate)
- LeaveLedgerEntry (append-only)
각각의 상세 명세는 `./<aggregate>.md` 참조.
docs/shared/published-language.md (선택)# Published Language — 전사 공용 프로토콜
이 파일의 용어는 **여러 BC가 동일 의미로 공유**하는 것만 담는다.
특정 BC 내부 언어는 각 BC Canvas의 UL 섹션에.
## 공용 Enum
### Permission
Access Control BC가 정의하고 모든 BC가 참조.
| 값 | Code | 의미 |
|---|---|---|
| 휴가 관리 | LEAVE_MANAGE | 타인의 연차 조정 |
| 휴가 승인 | LEAVE_APPROVE | 휴가 신청 결재 |
## 공용 Event 이름 규약
- 이벤트 네이밍: `<주어>_<과거형 동사>` / `<Subject><PastVerb>`
- 예: `사원_초대됨` / `EmployeeInvited`
## 공용 ID 타입
- `EmployeeId` — Organization BC가 발행, 다른 BC는 ID로만 참조 (강결합 금지)
--update)updated_at 비교 (git) → stale 경고.1) Slice 범위 변경
2) 서브도메인 → BC 매핑 수정
3) 특정 BC Canvas 수정
4) BC 간 관계 재설계
5) 새 외부 시스템 추가
6) Published Language 항목 추가/제거
□ Step 0 upstream 스캔 완료
□ Slice 범위 명시됨 (대상 BC + 이웃 BC)
□ 서브도메인 → BC 매핑 표 완성
□ 각 BC마다 _canvas.md 파일 생성
□ 각 Canvas에 Purpose / Classification / I-O / UL / Decisions / Questions
□ UL 테이블이 이중 표기 (용어 / Code / 의미)
□ 동음이의어가 Canvas의 "주의사항"에 명시됨
□ BC 쌍마다 관계 패턴 결정 (미정은 ⚠️)
□ 외부 시스템은 ACL 또는 Conformist (Partnership 희귀)
□ Context Map 다이어그램 포함
□ Published Language는 진짜 공용만 (없으면 파일 생성 안 함)
□ 산출물 폴더: domains/ 가 아니라 contexts/
□ Frontmatter 없음
| 맥락 | BC 수 | Slice 강도 | 관계 주의 | |---|---|---|---| | 학습 | 1~2 | 매우 강함 | 단순 | | 개인 | 2~3 | 강함 | 과분리 금지 | | 사내 | 3~6 | 강함 | 조직 경계 존중 | | B2B | 3~6 | 강함 | 멀티테넌시 경계 별도 | | B2C | 3~7 | 중간 | 외부 연동 많음, ACL 중심 |
ubiquitous-language.md 한 파일에 몰아넣기 (per-BC 원칙 위반).domains/ 에 배치 (contexts/ 사용).Evans/Vernon 정통: UL은 Bounded Context 안에서만 일관된다.
그래서 이 스킬은:
ubiquitous-language.md를 만들지 않음published-language.md에 분리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 접속" 같은 요청에 트리거한다.