# 끼리 (KKIRI) — 시나리오별 유즈케이스 다이어그램

작성: 페이블 · 2026-09-06
기준: 요구사항·정책 정의서(FR-01~23 · P-01~20), 시나리오 맵(①~⑤), 화면 시나리오(S0~S9) 및 쏠 A안 화면설계서(27개 화면, §10), AI 설계서(LLM ①②), 목업 `mockup/engine.js` · `app.js`. 각 유즈케이스의 「근거」 열이 어느 문서·코드에서 왔는지 가리킨다.
목적: 쏠이 그리는 A안 화면설계서·플로차트와 짝을 이루는 **기능 단위 정의**. 플로차트가 「어떤 순서로 지나가나」라면, 이 문서는 「누가 시스템에 무엇을 요구하고, 그 요구가 어떤 하위 기능을 반드시(include)·조건부로(extend) 끌어오나」를 고정한다. 개발 백로그와 테스트 케이스는 여기의 UC 번호를 그대로 쓴다.

---

## 0. 읽는 법

### 액터 7종

| 액터 | 종류 | 역할 | 근거 |
|---|---|---|---|
| **방장** | 주 액터 (사람) | 주제·인원·마감·초대 방식을 정하고, 조기 시작·연장·닫기·재조율·확정을 결정한다. **참가자를 일반화한다** — 방장도 참가자로서 답하고 재확인한다. 남의 답변은 못 보고 대신 답하지 못한다 | 요구사항 §1, FR-07, P-05 |
| **참가자** | 주 액터 (사람) | 링크로 입장해 이름을 넣고 6문항에 답한다. 결과·본인 리포트를 보고 재확인에 응답한다 | FR-03, FR-04, FR-15, FR-16 |
| **규칙 엔진** | 보조 액터 (내부, 결정적) | 거부권 필터 → 만족도 → 최저 우선 정렬 → 공개/비공개 경계. LLM이 아니다 | AI 설계서 §1·§6, P-11~P-14 |
| **LLM** | 보조 액터 (내부) | ① 자유서술 → 조건 태그 구조화, ② 집계 사실 → 설명 문장. 결정하지 않는다 | AI 설계서 §4·§5, FR-05, FR-14 |
| **스케줄러·알림** | 보조 액터 (시간 트리거) | 리마인드 2회, 답변 마감·재확인 마감 도달 시 상태 전이, 링크 만료 | P-06, P-08, P-09, FR-08, FR-09 |
| **외부 메신저** | 보조 액터 (외부 시스템) | 카카오톡·슬랙·문자/메일·QR로 초대·결과를 나른다. 목업은 공유 시트만 | 시나리오 맵 §1 S2 |
| **캘린더** | 보조 액터 (외부 시스템) | 확정 뒤 .ics 초대 | FR-18, 시나리오 맵 §5 |

### 표기

UML 유즈케이스 다이어그램을 Mermaid 플로차트로 그렸다(Mermaid에 유즈케이스 전용 문법이 없다). 규칙은 UML과 같다.

| 표기 | 뜻 |
|---|---|
| 사각형(보라 바탕) | 사람 액터. 청록 바탕은 내부 보조 액터, 앰버 바탕은 외부 시스템 |
| 둥근 상자 `UC-nn` | 유즈케이스 하나. 번호는 문서 전체에서 유일하다 |
| 큰 테두리 상자 | 시스템 경계(끼리). 안에 있는 것만 우리가 만든다 |
| 실선 | 액터가 그 유즈케이스를 시작하거나 참여한다 |
| 점선 «include», 기본 → 포함 | 기본 유즈케이스가 **항상** 끌어오는 하위 기능 |
| 점선 «extend», 확장 → 기본 | **조건이 맞을 때만** 덧붙는 기능. 조건은 표의 「대안·예외」에 있다 |
| 점선 «일반화» | 방장은 참가자의 모든 유즈케이스를 물려받는다 |

상태 표시: **[현재]** 목업에 구현 · **[제품]** 서버·인증이 필요한 후속 구현 · **[미결]** 민수 결정 대기 · **[NEXT]** 이번 범위 밖(W).

---

## 1. 전체 유즈케이스 다이어그램 — 한 장

여섯 묶음(①~⑥)이 시스템 경계 안에 있고, 사람 액터 둘과 보조 액터 다섯이 바깥에서 붙는다. 각 묶음은 아래 §2~§7에서 유즈케이스 단위로 펼친다.

```mermaid
flowchart LR
  H["방장"]:::actor
  P["참가자"]:::actor
  E["규칙 엔진"]:::sys
  L["LLM<br/>구조화 · 설명"]:::sys
  T["스케줄러 · 알림"]:::sys
  X["외부 메신저<br/>카톡 · 슬랙 · 문자"]:::ext
  C["캘린더"]:::ext
  subgraph K["끼리 (KKIRI) 시스템 경계"]
    direction TB
    A1(["① 방 만들기 · 초대<br/>UC-01 ~ UC-07"])
    A2(["② 참가 · 비공개 답변<br/>UC-10 ~ UC-19"])
    A3(["③ 마감 · 조율<br/>UC-20 ~ UC-30"])
    A4(["④ 결과 · 내 리포트<br/>UC-31 ~ UC-35"])
    A5(["⑤ 재확인 · 확정<br/>UC-36 ~ UC-44"])
    A6(["⑥ 예외 처리<br/>UC-40 · UC-46 ~ UC-49"])
  end
  H --- A1
  H --- A3
  H --- A5
  H --- A6
  P --- A2
  P --- A4
  P --- A5
  A1 --- X
  A1 --- T
  A2 --- L
  A3 --- E
  A3 --- L
  A3 --- T
  A4 --- X
  A5 --- T
  A5 --- C
  A6 --- E
  H -. «일반화» .-> P
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
```

| 묶음 | 화면 | 주 액터 | 끝나는 조건 |
|---|---|---|---|
| ① 방 만들기 · 초대 | S0 → S2 | 방장 | 초대 링크가 만들어지고 참여 현황 화면이 열린다 |
| ② 참가 · 비공개 답변 | S3 → S5 | 참가자(방장 포함) | 본인의 대리인(구조화된 조건 객체)이 제출된다 |
| ③ 마감 · 조율 | S5 → S6 | 방장 · 스케줄러 · 규칙 엔진 | 합의안 1개 + 차선 2개, 또는 후보 0개 처리로 넘어간다 |
| ④ 결과 · 내 리포트 | S7 → S8 | 전원 · 본인 | 공개 결과와 본인 리포트를 각각 봤다 |
| ⑤ 재확인 · 확정 | S8 → S9 | 참가자 → 방장 | 방장이 확정하고 공유·캘린더 초대가 나간다 |
| ⑥ 예외 처리 | 곳곳 | 시스템 → 방장 | 후보 0개·마감 미달·LLM 실패 등이 막다른 길 없이 다음 선택으로 이어진다 |

---

## 2. 시나리오 ① 방장이 방을 만들고 초대한다 (S0 → S2)

```mermaid
flowchart LR
  H["방장"]:::actor
  T["스케줄러 · 알림"]:::sys
  X["외부 메신저"]:::ext
  subgraph K["끼리 — ① 방 만들기 · 초대"]
    direction TB
    UC01(["UC-01 결정 주제 고르기"])
    UC01a(["UC-01a 준비 중 주제 안내 보기<br/>(여행 · 회식 NEXT)"])
    UC02(["UC-02 방 설정하기<br/>인원 3~8 · 마감 · 초대 방식 · 이름"])
    UC03(["UC-03 초대 링크 · 코드 만들기<br/>공용 링크+6자리 / 이름별 개인 링크"])
    UC04(["UC-04 초대 보내기<br/>카톡 · 슬랙 · 문자 · QR · 복사"])
    UC05(["UC-05 참여 현황 보기<br/>누가 답했는지만"])
    UC06(["UC-06 수동 리마인드 보내기<br/>쿨다운 30분"])
    UC07(["UC-07 자동 리마인드 보내기<br/>남은 시간 절반 · 마감 1시간 전"])
  end
  H --- UC01
  H --- UC02
  H --- UC04
  H --- UC05
  H --- UC06
  UC01a -.->|«extend»| UC01
  UC02 -.->|«include»| UC03
  UC04 -.->|«include»| UC03
  UC06 -.->|«extend»| UC05
  UC04 --- X
  UC06 --- X
  T --- UC07
  UC07 --- X
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
```

| UC | 이름 | 주 액터 | 사전조건 | 기본 흐름 | 대안 · 예외 | 사후조건 | 상태 · 근거 |
|---|---|---|---|---|---|---|---|
| UC-01 | 결정 주제 고르기 | 방장 | 랜딩(S0) 진입 | 주제 카드 중 「팀 워크숍」 선택 → S1 | 여행·회식 카드는 비활성. 누르면 UC-01a 안내만 | 주제가 방에 고정, 질문 6문항·후보 5개가 그 주제로 결정 | [현재] FR-01, FR-21(W) |
| UC-02 | 방 설정하기 | 방장 | UC-01 완료 | 인원(스테퍼 3~8) → 마감(3h/자정/24h 기본/48h) → 초대 방식(공용/개인) → 방장 이름 → 「초대방 만들기」 | 3 미만·8 초과는 버튼 비활성. 이름 1~12자 | 방 생성. 리마인드 시각(UC-07)과 마감 분기(UC-22)가 이 값으로 계산됨 | [현재] FR-01, P-01, P-02, P-06. 초대 기본값 공용+코드 (P-07 확정 2026-09-06) |
| UC-03 | 초대 링크 · 코드 만들기 | 시스템 | UC-02의 초대 방식 | 공용: 링크 + 6자리 입장 코드, 정원 차면 닫힘. 개인: 이름별 링크, 중복 입장 불가 | 링크 만료 = 답변 마감 시각(P-08) | 링크·코드가 저장되고 S2에 표시 | [현재·시뮬레이션] FR-02, P-07, P-08, NF-03 |
| UC-04 | 초대 보내기 | 방장 | UC-03 완료 | 공유 시트에서 채널 선택 → 외부 메신저로 링크 전달 | 목업은 실제 발송 없이 시트만. QR·복사·캘린더 초안 포함 | 참가자가 UC-10으로 입장 가능 | [현재·시뮬레이션] 시나리오 맵 §1 S2 |
| UC-05 | 참여 현황 보기 | 방장 | 방 생성 | 슬롯별 「답변 완료 / 작성 중 / 미접속」과 마감까지 남은 시간 | **답변 내용은 절대 표시하지 않음**(FR-07). 아직 아무도 없으면 빈 상태 문구 | — | [현재] FR-07, P-12, 화면 시나리오 S2 |
| UC-06 | 수동 리마인드 보내기 | 방장 | 미응답자 존재, 마지막 리마인드 뒤 30분 경과 | 「다시 알리기」 → 미응답자에게만 발송 | 쿨다운 중이면 버튼 비활성과 남은 시간 표시. 공용 링크 방은 방 전체에 | 미응답자에게 알림 | [현재·시뮬레이션] FR-08, P-06, `REMIND_COOLDOWN` |
| UC-07 | 자동 리마인드 보내기 | 스케줄러 | 마감 미도달, 미응답자 존재 | 남은 시간 절반 지점과 마감 1시간 전에 미응답자에게만 발송 | 개인 링크 방은 사람별, 공용 링크 방은 방 전체 | — | [현재·시뮬레이션] FR-08, P-06, `advance()` |

---

## 3. 시나리오 ② 참가자가 입장해 6문항에 답한다 (S3 → S5)

방장도 이 시나리오를 참가자로서 그대로 수행한다(«일반화»).

```mermaid
flowchart LR
  P["참가자"]:::actor
  H["방장"]:::actor
  L["LLM ① 구조화"]:::sys
  subgraph K["끼리 — ② 참가 · 비공개 답변"]
    direction TB
    UC10(["UC-10 방에 입장하기"])
    UC11(["UC-11 입장 코드 확인하기<br/>공용 링크"])
    UC11b(["UC-11b 개인 링크 검증하기<br/>이름별 링크"])
    UC12(["UC-12 비공개 약속 읽고 이름 넣기<br/>1~12자, 중복은 숫자 부여"])
    UC46(["UC-46 정원 초과 · 만료 안내<br/>「정원이 찼어요」"])
    UC13(["UC-13 6문항 답하기<br/>방식 · 시간 · 목적 1·2순위 · 지역 · 예산"])
    UC14(["UC-14 상한(거부권) 켜기<br/>Q2 시간 · Q5 예산"])
    UC15(["UC-15 피하고 싶은 것 적기<br/>Q6 자유서술 또는 건너뛰기"])
    UC16(["UC-16 구조화 결과 확인하기<br/>「이렇게 이해했어요」"])
    UC16a(["UC-16a 목록에서 직접 고르기<br/>구조화 실패 시"])
    UC17(["UC-17 대리인 보내기 (제출)"])
    UC17a(["UC-17a 임시 저장 · 복원<br/>새로고침 · 오프라인"])
    UC19(["UC-19 대기실에서 현황 보기<br/>내 조건 요약은 본인만"])
    UC18(["UC-18 답변 고치기<br/>협상 시작 전까지"])
  end
  P --- UC10
  P --- UC13
  P --- UC17
  P --- UC19
  H -. «일반화» .-> P
  UC10 -.->|«include»| UC12
  UC11 -.->|«extend»| UC10
  UC11b -.->|«extend»| UC10
  UC46 -.->|«extend»| UC10
  UC14 -.->|«extend»| UC13
  UC15 -.->|«extend»| UC13
  UC15 -.->|«include»| UC16
  UC16a -.->|«extend»| UC16
  UC16 --- L
  UC13 -.->|«include»| UC17
  UC17a -.->|«extend»| UC17
  UC17 -.->|«include»| UC19
  UC18 -.->|«extend»| UC19
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
```

| UC | 이름 | 주 액터 | 사전조건 | 기본 흐름 | 대안 · 예외 | 사후조건 | 상태 · 근거 |
|---|---|---|---|---|---|---|---|
| UC-10 | 방에 입장하기 | 참가자 | 초대 링크 수신, 마감 전 | 링크 열기 → 방 정보 카드(주제·방장·마감) → UC-12 | 공용 링크면 UC-11, 개인 링크면 UC-11b가 붙는다. 정원 초과·만료면 UC-46 | 참가자 슬롯 점유, 방장 현황에 「작성 중」 | [현재] FR-02, FR-03, P-07, P-08 |
| UC-11 | 입장 코드 확인하기 | 참가자 | 공용 링크 방 | 6자리 코드 입력 → 일치 시 통과 | 불일치 → 오류 문구, 재입력 | — | [현재·시뮬레이션] NF-03, 요구사항 §5 |
| UC-11b | 개인 링크 검증하기 | 시스템 | 개인 링크 방 | 링크의 이름 슬롯이 비어 있으면 통과 | 이미 쓴 링크 → 중복 입장 불가 안내 | — | [현재·시뮬레이션] P-07 |
| UC-12 | 비공개 약속 읽고 이름 넣기 | 참가자 | UC-10 | 「답변은 다른 참가자와 방장에게 공개되지 않아요」 확인 → 이름 1~12자 → 「질문 시작하기」 | 같은 방 중복 이름은 뒤에 숫자 자동 부여. 입력 전 버튼 비활성 | 이름이 현황·결과에만 표시. 답변 원문에는 안 붙음 | [현재] FR-03, 화면 시나리오 S3 |
| UC-13 | 6문항 답하기 | 참가자 | UC-12 | Q1 방식 → Q2 시간 → Q3 목적 1·2순위 → Q4 지역 → Q5 예산 → Q6 → UC-17 | 선택 전 「다음」 비활성. 「이전」으로 돌아가도 선택 유지 | 선호 4항목 + 목적 가중치가 대리인 조건 객체에 담김 | [현재] FR-04, P-13, `QUESTIONS` |
| UC-14 | 상한(거부권) 켜기 | 참가자 | Q2 또는 Q5 | 「이 이상은 어려워요」 / 「이 금액을 넘으면 어려워요」 토글 ON | 1박 2일·「상관없음」 선택 시 토글이 숨겨지고 기존 상한 해제(무의미하므로) | 그 값보다 긴·비싼 후보가 UC-27에서 탈락 | [현재] P-14, 시나리오 맵 §2-5 |
| UC-15 | 피하고 싶은 것 적기 | 참가자 | Q6 | 한 줄 자유서술 → UC-16 | 「건너뛰기」 가능. 제출 전 UC-16 확인이 필수 | 금지 태그가 조건 객체에 담김 | [현재] FR-05, P-15 |
| UC-16 | 구조화 결과 확인하기 | 참가자 · LLM ① | UC-15 원문 있음 | LLM ①(목업은 키워드 7종)이 태그로 바꾸고 「이렇게 이해했어요」 카드 → 확인·수정 | 태그 0개 또는 신뢰도 0.6 미만 → UC-16a. 원문은 다른 사람 답변과 절대 함께 보내지 않음 | 닫힌 어휘 태그만 저장. 원문은 만료 시각과 함께 별도 보관 | [현재] 키워드 / [제품] LLM. FR-05, AI 설계서 §4, NF-04 |
| UC-16a | 목록에서 직접 고르기 | 참가자 | UC-16 실패 | 태그 7종 목록에서 선택 또는 건너뛰기 | 「다음」은 목록 선택·건너뛰기 뒤에만 활성 | — | [현재] AC-07 |
| UC-17 | 대리인 보내기 | 참가자 | Q1~Q5 답 완료 | 「내 대리인 보내기」 → 조건 객체 저장 → UC-19 | 제출 실패(오프라인) → UC-17a | 방장 현황이 「답변 완료」로. 답변 ≥ 3명이면 UC-20 버튼 활성 | [현재] 화면 시나리오 S4 |
| UC-17a | 임시 저장 · 복원 | 시스템 | 답변 중 | 브라우저 새로고침 시 복원, 제출 실패 시 로컬 보관 + 재시도 | — | — | [현재] 부분 / [제품] 서버 저장 |
| UC-18 | 답변 고치기 | 참가자 | 제출 완료, 협상 시작 전 | 대기실 「답변 고치기」 → UC-13으로 복귀 → 재제출 | 협상 시작 뒤에는 버튼 없음 | 조건 객체 교체 | [현재] FR-06 |
| UC-19 | 대기실에서 현황 보기 | 참가자 | UC-17 | 「N / M 답변 완료」, 남은 시간, **본인에게만** 내 조건 요약 | 전원 완료 시 3초 뒤 자동으로 UC-30. 방장에게는 UC-20 버튼 | — | [현재] 화면 시나리오 S5 |

---

## 4. 시나리오 ③ 마감이 오거나 방장이 시작해 조율한다 (S5 → S6)

```mermaid
flowchart LR
  H["방장"]:::actor
  A["전원"]:::actor
  T["스케줄러"]:::sys
  E["규칙 엔진"]:::sys
  L["LLM ② 설명"]:::sys
  subgraph K["끼리 — ③ 마감 · 조율"]
    direction TB
    UC20(["UC-20 지금 협상 시작하기<br/>답변 ≥ 3명"])
    UC21(["UC-21 미응답 제외 확인하기<br/>확인 모달 1회"])
    UC22(["UC-22 답변 마감 처리하기"])
    UC23(["UC-23 자동 시작하기<br/>응답 ≥ 3명"])
    UC24(["UC-24 마감 연장하기<br/>24시간 · 최대 2회"])
    UC25(["UC-25 방 닫기"])
    UC26(["UC-26 조율 실행하기"])
    UC27(["UC-27 거부권 필터 적용<br/>상한 · 금지 태그, 한 명만 걸려도 탈락"])
    UC28(["UC-28 만족도 계산 · 순위 정렬<br/>최저 → 평균 → 비용 → 일정"])
    UC29(["UC-29 공개 이유 · 설명 만들기<br/>2명 이상 공통만"])
    UC29a(["UC-29a 템플릿으로 대체하기<br/>30초 초과"])
    UC40(["UC-40 후보 0개 처리하기<br/>→ §7"])
    UC30(["UC-30 조율 진행 4단계 보기<br/>사람 단위 발언 없음"])
  end
  H --- UC20
  H --- UC24
  H --- UC25
  T --- UC22
  A --- UC30
  UC20 -.->|«include»| UC21
  UC20 -.->|«include»| UC26
  UC23 -.->|«extend»| UC22
  UC24 -.->|«extend»| UC22
  UC25 -.->|«extend»| UC22
  UC23 -.->|«include»| UC26
  UC26 -.->|«include»| UC27
  UC26 -.->|«include»| UC28
  UC26 -.->|«include»| UC29
  UC29a -.->|«extend»| UC29
  UC40 -.->|«extend»| UC26
  UC26 -.->|«include»| UC30
  UC27 --- E
  UC28 --- E
  UC29 --- L
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
```

| UC | 이름 | 주 액터 | 사전조건 | 기본 흐름 | 대안 · 예외 | 사후조건 | 상태 · 근거 |
|---|---|---|---|---|---|---|---|
| UC-20 | 지금 협상 시작하기 | 방장 | 답변 ≥ 3명, 마감 전 | 버튼 → UC-21 모달 → 확인 → UC-26 | 전원 완료면 모달 없이 3초 뒤 자동. 답변 < 3명이면 버튼 비활성 | 협상 시작. 이후 UC-18(답변 고치기) 불가 | [현재] FR-10 |
| UC-21 | 미응답 제외 확인하기 | 방장 | UC-20, 미응답자 존재 | 「미응답자의 조건은 이번 계산과 재확인에서 제외됩니다」 확인 | 취소 → 대기실 유지. **방장이 대신 답하는 선택지는 없다** | 미응답자는 계산·리포트·재확인 제외, 결과에 「미응답 N명」 배너 | [현재] P-05, `eligibleParticipants` |
| UC-22 | 답변 마감 처리하기 | 스케줄러 | 마감 시각 도달, 협상 미시작 | 응답 수를 세어 분기 | ≥ 3명 → UC-23. < 3명 → 방장에게 UC-24 / UC-25 선택 요청 | 링크 만료(P-08) | [현재] FR-09, P-03, `advance()` |
| UC-23 | 자동 시작하기 | 시스템 | UC-22, 응답 ≥ 3 | UC-21과 같은 제외 규칙으로 UC-26 실행 | — | 결과에 미응답 배너 | [현재] AC-01 |
| UC-24 | 마감 연장하기 | 방장 | UC-22, 응답 < 3, 연장 횟수 < 2 | 「24시간 연장」 → 미응답자에게 리마인드(UC-07) | 3회째는 UC-25만 가능 | 마감 시각 +24h, 연장 횟수 +1 | [현재] P-04, `MAX_EXTENSIONS` |
| UC-25 | 방 닫기 | 방장 | UC-22 미달 또는 UC-40 | 확인 → 방 종료 | — | 방 상태 「닫힘」, 원문 삭제(UC-44) | [현재] P-04 |
| UC-26 | 조율 실행하기 | 규칙 엔진 | 유효 응답 ≥ 3 | UC-27 → UC-28 → UC-29 → UC-30. 같은 입력이면 같은 결과 | 생존 후보 0개 → UC-40. 생존 1개 → 결과에 「조건만으로 결정」 배지 | 합의안 1 + 차선 2, 탈락 후보와 사유 주제 | [현재] FR-11, NF-05, `negotiate()` |
| UC-27 | 거부권 필터 적용 | 규칙 엔진 | UC-26 | 시간 상한·예산 상한·금지 태그를 후보마다 대조. 한 명만 걸려도 탈락 | — | 후보 5 → M | [현재] P-14, `vetoes()` |
| UC-28 | 만족도 계산 · 순위 정렬 | 규칙 엔진 | UC-27 생존 ≥ 1 | 사람 × 후보 0~100(목적 40·방식 25·지역 20·시간 15, 예산 초과 −5/−10) → 최저 → 평균 → 비용 ↑ → 일정 짧은 순 → ID | 동점·근소한 차 배지는 UC-49 (P-21 확정 2026-09-06) | 순위 확정 | [현재] P-11, P-13, `satisfaction()`, `compareRows()` |
| UC-29 | 공개 이유 · 설명 만들기 | LLM ② (목업은 템플릿) | UC-28 | 집계 사실만 입력(개인 답변·단독 조건 제외) → 공개 이유 ≤ 3문장 + 탈락 사유 1문장/후보 → 숫자·명사 대조 검증 | 30초 초과 또는 검증 실패 → UC-29a. **계산 참여자 3명이면 공개 이유·탈락 사유 주제·집계 수치를 만들지 않고 일반 설명만 (P-19 확정)** | 2명 이상 공통 조건만 구체화, 단독은 건수만 | [현재] 템플릿 / [제품] LLM. FR-13, FR-14, P-12, AI 설계서 §5 |
| UC-29a | 템플릿으로 대체하기 | 시스템 | UC-29 실패 | `reasons()` · `concessions()` 템플릿 문장 | — | 결과에 「설명은 간략하게 제공돼요」 배지 | [현재] P-16, `LLM_TIMEOUT_MS` |
| UC-30 | 조율 진행 4단계 보기 | 전원 | UC-26 진행 중 | 「응답 N건 구조화 → 거부권 N건 적용, 후보 5→M → 최저 만족도 우선 비교 → 공통 이유 생성」 | 끝나면 자동으로 UC-31 | — | [현재] FR-12, AC-03, `makeLog()` |

---

## 5. 시나리오 ④ 결과와 내 리포트를 본다 (S7 → S8)

```mermaid
flowchart LR
  A["전원"]:::actor
  P["본인"]:::actor
  X["외부 메신저"]:::ext
  subgraph K["끼리 — ④ 결과 · 내 리포트"]
    direction TB
    UC31(["UC-31 합의 결과 보기<br/>최종안 · 공통 이유 · 선호 차이 집계 · 공정성"])
    UC31a(["UC-31a 배너 · 배지 보기<br/>미응답 N명 · 규칙 설명 · 조건만으로 결정 · 재조율 1회"])
    UC35(["UC-35 차선 · 탈락 후보 보기<br/>차선 2개 · 탈락 사유 주제"])
    UC34(["UC-34 결과 공유하기"])
    UC32(["UC-32 내 대리인 리포트 보기<br/>지켜진 조건 · 선호 차이 · 1순위 반영 · 내 만족도"])
    UC33(["UC-33 개인 토큰으로 인증하기<br/>URL만 아는 타인 차단"])
  end
  A --- UC31
  P --- UC32
  UC31 -.->|«include»| UC35
  UC31a -.->|«extend»| UC31
  UC34 -.->|«extend»| UC31
  UC32 -.->|«include»| UC33
  UC34 --- X
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
```

| UC | 이름 | 주 액터 | 사전조건 | 기본 흐름 | 대안 · 예외 | 사후조건 | 상태 · 근거 |
|---|---|---|---|---|---|---|---|
| UC-31 | 합의 결과 보기 | 전원 | UC-26 완료 | 최종안 카드 · 공통 이유 · 선호와 다른 지점(2명 이상 집계) · 지켜진 조건 건수 · 공정성(최저/평균) → UC-35 | **개인 조건·정확한 상한·단독 선호 내용은 표시하지 않음.** 단독은 「그 외 단독 선호 차이 N건」. **계산 참여자 3명이면 공통 이유·조건별 인원수·단독 건수·최저/평균 수치 숨김 (P-19 확정)** | 재확인(UC-36) 진입 가능 | [현재] FR-13, P-12, AC-04 |
| UC-31a | 배너 · 배지 보기 | 시스템 | 해당 조건 | 「미응답 N명 조건 미반영」 · 「규칙 설명」 · 「조건만으로 결정」 · 「재조율 1회 반영」 | 조건 없으면 표시 없음 | — | [현재] P-05, P-16, 시나리오 맵 §3 |
| UC-35 | 차선 · 탈락 후보 보기 | 전원 | UC-31 | 차선 2개(최저·평균 포함), 탈락 후보마다 사유 **주제**(예산 상한 1건 · 술자리 제외 1건) | 누구의 조건인지는 비공개 | — | [현재] FR-13, `dead` |
| UC-34 | 결과 공유하기 | 참가자 | UC-31 | 공유 시트 → 외부 메신저 | 공유 내용은 공개 결과만. 리포트 링크는 포함되지 않음 | — | [현재·시뮬레이션] FR-18 |
| UC-32 | 내 대리인 리포트 보기 | 본인 | UC-33 통과 | 내 상한·금지가 지켜졌는지 · 내 선호와 다른 항목 · 내 1순위 반영 여부 · 내 만족도 | 미응답자에게는 리포트 없음(P-05). 다른 사람 리포트는 어떤 경로로도 볼 수 없음 | — | [현재] FR-15, AC-05, `receipt()` |
| UC-33 | 개인 토큰으로 인증하기 | 시스템 | 리포트 요청 | 개인 토큰(`/p/{token}`) 검증 → 본인 리포트만 | 토큰 없음·불일치 → 접근 거부. 목업은 참가자 전환 패널로 시뮬레이션 | — | [제품] FR-19, NF-03 |

---

## 6. 시나리오 ⑤ 최종 재확인과 확정 (S8 → S9)

```mermaid
flowchart LR
  P["참가자"]:::actor
  H["방장"]:::actor
  T["스케줄러"]:::sys
  L["LLM ① 구조화"]:::sys
  C["캘린더"]:::ext
  X["외부 메신저"]:::ext
  subgraph K["끼리 — ⑤ 재확인 · 확정"]
    direction TB
    UC36(["UC-36 최종 재확인 응답하기"])
    UC36a(["UC-36a 동의하기"])
    UC36b(["UC-36b 조건부 동의하기<br/>실행 조건 한 줄 필수"])
    UC36c(["UC-36c 다시 조율 요청하기<br/>새 금지 조건 · 요청자 비공개"])
    UC16(["UC-16 구조화 결과 확인하기"])
    UC37(["UC-37 재확인 마감 처리하기<br/>24시간 · 미응답 = 기권"])
    UC38(["UC-38 다시 조율하기<br/>방당 1회"])
    UC26(["UC-26 조율 실행하기"])
    UC39(["UC-39 결정 확정하기"])
    UC39a(["UC-39a 방장 이탈 시 미확정 종료<br/>24시간 유예 · 자동 확정 없음"])
    UC41(["UC-41 확정 카드 · 공유"])
    UC42(["UC-42 캘린더 초대 만들기 (.ics)"])
    UC43(["UC-43 실행 체크리스트 보기<br/>예약 · 일정 공유 · 실행 조건 N건"])
    UC44(["UC-44 원문 삭제하기<br/>확정·종료 시 즉시"])
  end
  P --- UC36
  H -. «일반화» .-> P
  H --- UC38
  H --- UC39
  H --- UC43
  T --- UC37
  T --- UC44
  UC36a -.->|«extend»| UC36
  UC36b -.->|«extend»| UC36
  UC36c -.->|«extend»| UC36
  UC36c -.->|«include»| UC16
  UC16 --- L
  UC38 -.->|«include»| UC26
  UC39 -.->|«include»| UC41
  UC39 -.->|«include»| UC42
  UC43 -.->|«extend»| UC39
  UC39a -.->|«extend»| UC39
  UC39 -.->|«include»| UC44
  UC41 --- X
  UC42 --- C
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
```

| UC | 이름 | 주 액터 | 사전조건 | 기본 흐름 | 대안 · 예외 | 사후조건 | 상태 · 근거 |
|---|---|---|---|---|---|---|---|
| UC-36 | 최종 재확인 응답하기 | 참가자(유효 응답자만) | UC-31 결과 있음, 재확인 마감 전 | 리포트 아래 3택 라디오 카드 중 하나 → 제출 | 미응답자(P-05)는 재확인 대상 아님. 24시간 미응답 → 기권(UC-37) | 집계 +1 (동의/조건부/재조율) | [현재] FR-16, `validateRatify` |
| UC-36a | 동의하기 | 참가자 | UC-36 | 입력 없음 | — | 동의 +1 | [현재] |
| UC-36b | 조건부 동의하기 | 참가자 | UC-36 | 실행 조건 한 줄(예: 시작 오후 1시 이후) → 제출 | 빈 값 → 「실행 조건을 적어주세요」 차단 | 조건부 +1, 문구가 결과·확정 카드 「실행 조건」과 UC-43에 표시 | [현재] AC-06 |
| UC-36c | 다시 조율 요청하기 | 참가자 | UC-36, 방의 재조율 미사용 | 새 금지 조건 자유서술 → UC-16 구조화 확인 → 제출 | 빈 값·구조화 실패 → 제출 불가(권한은 유지). 방이 이미 1회 썼으면 버튼 비활성 「방당 한 번만」 | 재조율 +1, 요청자 비공개. 방장에게 UC-38 버튼 활성 | [현재] P-10, AC-06 |
| UC-37 | 재확인 마감 처리하기 | 스케줄러 | 결과 후 24시간 | 미응답을 기권으로 집계 | 미처리 재조율 요청이 있으면 UC-38 먼저 처리해야 하며 그 상태로 UC-39 불가(결정서 §2, 2026-09-06 정정). 방장이 24시간 안에 확정하지 않으면 UC-39a | UC-39 가능(요청 0건일 때) | [현재] FR-17, P-09, `RATIFY_HOURS` |
| UC-38 | 다시 조율하기 | 방장 | 재조율 요청 ≥ 1, 방당 미사용 | 요청자 조건에만 새 태그 추가 → UC-26 재실행 → 새 결과, 재확인 집계 초기화 | 두 번째부터 버튼 비활성 | 결과에 「재조율 1회 반영」 배너 | [현재] P-10, `renegotiate()` |
| UC-39 | 결정 확정하기 | 방장 | 전원 응답 또는 UC-37 마감, 미처리 재조율 요청 없음 | 「확정하기」 → UC-41 · UC-42 · UC-44 | 전원 명시 동의가 확인된 경우에만 청록 「전원 동의」 상태. 그 외는 중립 「방장 확정 · 전원 동의 미확인」(통합 스타일 보드 규칙). 방장이 24시간 안에 확정하지 않으면 UC-39a 미확정 종료 (P-22 확정) | 방 상태 「완료」. 종료 후 7일(168h) 읽기 전용, 이후 삭제·토큰 폐기 (P-18 확정) | [현재] FR-17, FR-18, 스타일 보드 §1 #4~6 |
| UC-39a | 방장 이탈 시 미확정 종료 | 스케줄러 | UC-37 마감 후 방장 확정 유예 24시간 경과, 또는 생성 후 7일(168h) 수명 상한 도달 | 방을 「미확정 종료」로 닫고 UC-44 실행. **자동 확정은 하지 않는다** | — | 미확정 종료는 완료·동의 지표에 넣지 않음. 읽기 전용 7일(P-18) | [제품] P-22 (확정 2026-09-06) |
| UC-41 | 확정 카드 · 공유 | 방장 | UC-39 | 최종안 카드 + 실행 조건 N건 → 외부 메신저 공유 | — | — | [현재] FR-18 |
| UC-42 | 캘린더 초대 만들기 | 시스템 | UC-39 | .ics 생성 → 캘린더 | — | — | [현재·시뮬레이션] FR-18 |
| UC-43 | 실행 체크리스트 보기 | 방장 | UC-39 | 장소 예약 · 일정 공유 · 실행 조건 N건 체크 | 예약 연결은 [NEXT] FR-22 | — | [현재] 시나리오 맵 §5 |
| UC-44 | 원문 삭제하기 | 스케줄러 | 결정 완료 또는 방 닫힘 | 확정 또는 방 종료 시 원문(피할 것·재조율 사유·조건부 동의 문장) 즉시 삭제, 구조화 태그만 보관 | 미완료 방은 생성 후 7일(168h)에 미확정 종료와 함께 삭제. 종료 후 7일에 결과·구조화 조건·리포트·이벤트도 삭제하고 토큰 폐기(P-18) | 로그·저장소·캐시·복구본에 원문 없음(출시 전 검증) | [제품] P-17 · P-18 (확정 2026-09-06), NF-04 |

---

## 7. 시나리오 ⑥ 예외 — 막다른 길이 없어야 한다

정상 흐름의 기본 유즈케이스에 «extend»로 붙는 예외를 한 장에 모았다. 각 예외는 반드시 **다음 선택지**로 이어진다.

```mermaid
flowchart LR
  H["방장"]:::actor
  P["참가자"]:::actor
  E["규칙 엔진"]:::sys
  subgraph K["끼리 — ⑥ 예외 처리"]
    direction TB
    UC40(["UC-40 후보 0개 처리하기<br/>탈락 사유 주제 집계"])
    UC40a(["UC-40a 상한 완화 익명 동의 요청하기<br/>누구 조건인지 비공개"])
    UC25(["UC-25 방 닫기"])
    UC24(["UC-24 마감 연장하기<br/>3회째는 닫기만"])
    UC46(["UC-46 정원 초과 · 만료 안내"])
    UC16a(["UC-16a 목록에서 직접 고르기"])
    UC29a(["UC-29a 템플릿으로 대체하기"])
    UC47(["UC-47 재조율 2회째 차단<br/>「방당 한 번만」"])
    UC48(["UC-48 조건부 빈 값 차단<br/>「실행 조건을 적어주세요」"])
    UC49(["UC-49 동점 · 근소한 차 표시<br/>dMin·dMean 기준"])
    B26(["UC-26 조율 실행"]):::base
    B22(["UC-22 답변 마감"]):::base
    B10(["UC-10 방 입장"]):::base
    B16(["UC-16 구조화 확인"]):::base
    B29(["UC-29 설명 생성"]):::base
    B36c(["UC-36c 재조율 요청"]):::base
    B36b(["UC-36b 조건부 동의"]):::base
    B28(["UC-28 순위 정렬"]):::base
  end
  E --- UC40
  UC40 -.->|«extend»| B26
  UC40a -.->|«extend»| UC40
  UC25 -.->|«extend»| UC40
  H --- UC40a
  H --- UC25
  H --- UC24
  UC40a --- P
  UC24 -.->|«extend»| B22
  UC25 -.->|«extend»| B22
  UC46 -.->|«extend»| B10
  UC16a -.->|«extend»| B16
  UC29a -.->|«extend»| B29
  UC47 -.->|«extend»| B36c
  UC48 -.->|«extend»| B36b
  UC49 -.->|«extend»| B28
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
  classDef base fill:#F3F1EE,stroke:#8C859B,color:#625E70,stroke-dasharray:4 3
```

| UC | 예외 | 붙는 곳 | 발생 조건 | 시스템이 하는 일 | 다음 선택지 | 상태 · 근거 |
|---|---|---|---|---|---|---|
| UC-40 | 후보 0개 처리하기 | UC-26 | 거부권 필터 뒤 생존 후보 0 | 어떤 조건 **주제**가 몇 개 후보를 지웠는지 집계해 표시(누구 조건인지 비공개) | UC-40a 또는 UC-25 | [현재] FR-20, `negotiate()` ok:false |
| UC-40a | 상한 완화 익명 동의 요청하기 | UC-40 | 방장이 요청 | 해당 상한을 낸 사람에게만 완화 여부를 익명으로 묻고, 동의 시 UC-26 재실행 | 동의 없음 → UC-25 | [현재] 안내 UI / [제품] 요청 흐름. 대리인 완화 라운드는 [NEXT] FR-23 |
| UC-24 | 마감 연장하기 | UC-22 | 마감 시 응답 < 3 | +24h, 리마인드 | 연장 2회 뒤에도 미달 → UC-25만 | [현재] P-04 |
| UC-46 | 정원 초과 · 만료 안내 | UC-10 | 공용 링크 정원 초과 / 마감 지남 / 개인 링크 재사용 | 「정원이 찼어요」 · 「이 방은 마감됐어요」 | 마감 지남이면 결과 화면 또는 「새 결정 시작하기」 | [현재] 문구 / [제품] 검증. 요구사항 §5 |
| UC-16a | 목록에서 직접 고르기 | UC-16 | 태그 0개 · 신뢰도 < 0.6 | 「이해하지 못했어요 — 목록에서 골라주세요」 | 목록 선택 또는 건너뛰기 | [현재] AC-07 |
| UC-29a | 템플릿으로 대체하기 | UC-29 | 30초 초과 · 검증 실패 | 템플릿 문장 + 배지 | 결과는 그대로 진행 | [현재] P-16 |
| UC-47 | 재조율 2회째 차단 | UC-36c | 방의 재조율 1회 사용됨 | 버튼 비활성 + 「방당 한 번만」 | 동의 / 조건부 동의 | [현재] P-10, AC-06 |
| UC-48 | 조건부 빈 값 차단 | UC-36b | 실행 조건 빈 값 | 제출 차단 + 문구 | 조건 입력 또는 동의 선택 | [현재] AC-06 |
| UC-49 | 동점 · 근소한 차 표시 | UC-28 | 거부권 통과 후보 ≥ 2 | `dMin`·`dMean`(엔진 정렬 값) 둘 다 0 → 「만족도 동점」, 둘 다 1 미만(동점 제외) → 「근소한 차」 배지. 정렬은 P-11 그대로 | 생존 후보 1개면 표시 없음 | [제품] P-21 (확정 2026-09-06) |

---

## 8. 주제 확장 시나리오 — NEXT 범위의 확장점

여행·회식·모임·선물은 **현재 범위 밖**(FR-21 W)이다. 다섯 활용 시나리오(쏠, `docs/use-cases`)가 본서비스에 들어올 때 기존 유즈케이스의 어디에 «extend»로 붙는지만 표시한다. 결정 규칙(UC-27·UC-28)은 주제가 바뀌어도 그대로다.

```mermaid
flowchart LR
  H["방장"]:::actor
  L["LLM ③ 후보 생성 · ④ 완화 라운드"]:::sys
  R["예약 · 일정 서비스"]:::ext
  subgraph K["끼리 — 주제 확장 (NEXT)"]
    direction TB
    B01(["UC-01 결정 주제 고르기"]):::base
    B13(["UC-13 6문항 답하기"]):::base
    B26(["UC-26 조율 실행"]):::base
    B40(["UC-40 후보 0개 처리"]):::base
    B43(["UC-43 실행 체크리스트"]):::base
    UC50(["UC-50 주제 고르기 — 여행 · 회식 · 모임 · 선물"])
    UC51(["UC-51 주제별 문항 세트 답하기<br/>AI 초안 → 방장 검토 뒤 사용"])
    UC52(["UC-52 후보안 생성하기<br/>고정 5개 대신"])
    UC53(["UC-53 대리인 완화 제안 라운드"])
    UC54(["UC-54 예약 · 일정 등록 연결하기"])
  end
  H --- UC50
  UC50 -.->|«extend»| B01
  UC51 -.->|«extend»| B13
  UC52 -.->|«extend»| B26
  UC53 -.->|«extend»| B40
  UC54 -.->|«extend»| B43
  UC52 --- L
  UC53 --- L
  UC54 --- R
  classDef actor fill:#F0EDFF,stroke:#5842D8,color:#262335,stroke-width:1.5px
  classDef sys fill:#E3F3F0,stroke:#0F766E,color:#0B5C56,stroke-width:1.5px
  classDef ext fill:#FFF3D6,stroke:#7A4F00,color:#7A4F00,stroke-width:1.5px
  classDef base fill:#F3F1EE,stroke:#8C859B,color:#625E70,stroke-dasharray:4 3
```

| UC | 확장 | 붙는 곳 | 무엇이 달라지나 | 변하지 않는 것 | 상태 · 근거 |
|---|---|---|---|---|---|
| UC-50 | 주제 고르기(여행·회식·모임·선물) | UC-01 | 랜딩 카드 활성화, 주제별 아이콘 타일 색 | 방 설정(UC-02)·초대(UC-03) | [NEXT] FR-21, 스타일 보드 #14 |
| UC-51 | 주제별 문항 세트 | UC-13 | 문항 수·선택지·상한 항목이 주제별로. AI가 초안을 내고 **방장이 검토한 뒤** 사용 | 선호/상한/금지의 3분류, UC-16 구조화 확인 | [NEXT] 요구사항 §1, 쏠 가이드 AI 질문 UX |
| UC-52 | 후보안 생성 | UC-26 | 고정 5개 대신 LLM ③이 후보를 만들고 태그를 붙임. 태그 어휘는 UC-16과 동일해야 함 | UC-27·UC-28 결정 규칙 | [NEXT] AI 설계서 §7, P-15 |
| UC-53 | 대리인 완화 제안 라운드 | UC-40 | 후보 0개일 때 LLM ④가 각 상한에 「한 단계 완화」를 제안, 본인 동의 뒤 재계산 | 익명·본인 동의 필수 | [NEXT] FR-23 |
| UC-54 | 예약·일정 등록 연결 | UC-43 | 확정 뒤 예약·캘린더 서비스로 바로 연결 | UC-42 .ics는 유지 | [NEXT] FR-22 |

---

## 9. 액터 × 유즈케이스 매트릭스

● 시작한다 · ○ 참여·수신한다 · — 관여 없음. 방장 열은 참가자 열을 물려받은 것(일반화)은 빼고 방장 고유 권한만 적었다.

| UC | 이름 | 방장 | 참가자 | 규칙 엔진 | LLM | 스케줄러 | 외부 메신저 | 캘린더 |
|---|---|---|---|---|---|---|---|---|
| UC-01 | 결정 주제 고르기 | ● | — | — | — | — | — | — |
| UC-02 | 방 설정하기 | ● | — | — | — | ○ | — | — |
| UC-03 | 초대 링크 · 코드 만들기 | ○ | — | — | — | — | — | — |
| UC-04 | 초대 보내기 | ● | ○ | — | — | — | ○ | — |
| UC-05 | 참여 현황 보기 | ● | — | — | — | — | — | — |
| UC-06 | 수동 리마인드 | ● | ○ | — | — | — | ○ | — |
| UC-07 | 자동 리마인드 | — | ○ | — | — | ● | ○ | — |
| UC-10 | 방에 입장하기 | — | ● | — | — | — | — | — |
| UC-12 | 약속 읽고 이름 넣기 | — | ● | — | — | — | — | — |
| UC-13 | 6문항 답하기 | — | ● | — | — | — | — | — |
| UC-14 | 상한(거부권) 켜기 | — | ● | — | — | — | — | — |
| UC-15 | 피하고 싶은 것 적기 | — | ● | — | — | — | — | — |
| UC-16 | 구조화 결과 확인하기 | — | ● | — | ○ ① | — | — | — |
| UC-17 | 대리인 보내기 | — | ● | — | — | — | — | — |
| UC-18 | 답변 고치기 | — | ● | — | — | — | — | — |
| UC-19 | 대기실 현황 보기 | — | ● | — | — | — | — | — |
| UC-20 | 지금 협상 시작하기 | ● | — | ○ | — | — | — | — |
| UC-22 | 답변 마감 처리 | ○ | — | — | — | ● | — | — |
| UC-24 | 마감 연장하기 | ● | ○ | — | — | ○ | — | — |
| UC-25 | 방 닫기 | ● | ○ | — | — | — | — | — |
| UC-26 | 조율 실행하기 | — | — | ● | ○ ② | — | — | — |
| UC-30 | 조율 진행 보기 | — | ● | — | — | — | — | — |
| UC-31 | 합의 결과 보기 | — | ● | — | — | — | — | — |
| UC-32 | 내 리포트 보기 | — | ● 본인 | — | — | — | — | — |
| UC-34 | 결과 공유하기 | — | ● | — | — | — | ○ | — |
| UC-36 | 최종 재확인 응답 | — | ● | — | ○ ① (재조율) | — | — | — |
| UC-37 | 재확인 마감 처리 | — | ○ | — | — | ● | — | — |
| UC-38 | 다시 조율하기 | ● | ○ | ○ | ○ ② | — | — | — |
| UC-39 | 결정 확정하기 | ● | ○ | — | — | — | ○ | ○ |
| UC-40 | 후보 0개 처리 | ○ | ○ | ● | — | — | — | — |
| UC-44 | 원문 삭제 | — | — | — | — | ● | — | — |

---

## 10. 화면 ↔ 유즈케이스 대응 (쏠 A안 화면설계서 27개 화면 기준)

기준은 쏠의 A안 화면설계서 화면 ID 27개(S0 · S1 · S1Q · S2 · S3 · S4-1~S4-6 · S4R · S5 · S5H · S6 · S7 · S8 · S7B · S7C · S9 · E1~E5 · M1 · M2, https://kkiri-plan.pages.dev/screen-design-a/)다. 이 문서의 다이어그램 제목에 쓴 S0→S9는 화면 시나리오(`KKIRI_SCREEN_SCENARIO.md`)의 10개 화면 번호이므로, 셋째 열에 교차 표기했다. 「시작되는 UC」는 그 화면의 주 행동이 트리거하는 것, 「결과가 보이는 UC」는 다른 액터(엔진·스케줄러·LLM·다른 사람)가 실행한 결과가 그 화면에 나타나는 것이다.

| 쏠 화면 | 역할 | 이 문서 S 번호 | 이 화면에서 시작되는 UC | 이 화면에 결과가 보이는 UC | 비고 |
|---|---|---|---|---|---|
| S0 시작 | 공통 | S0 랜딩 | UC-01, UC-01a | — | 여행·회식 카드는 UC-50 [NEXT] 안내만 |
| S1 방 만들기 | 방장 | S1 설정 | UC-02 | — | 초대 기본값 P-07 (§11) |
| S1Q AI 질문 초안 검토 | 방장 · 확장 | (없음) | UC-51 | UC-50 | [NEXT] MVP 고정 6문항 흐름에는 없음 |
| S2 초대하기 | 방장 | S2 초대 · 현황 (앞부분) | UC-04 | UC-03 | 참여 현황은 S5H로 분리됨. 공유 시트는 M2와 같은 패턴 |
| S3 초대 입장 · 비공개 안내 | 공통 | S3 약속 · 이름 | UC-10, UC-11, UC-11b, UC-12 | UC-46 (→E1) | |
| S4-1 내 답변 1 · 방식 | 본인 | S4 질문 6문항 | UC-13 | UC-17a | |
| S4-2 내 답변 2 · 시간 | 본인 | S4 | UC-13, UC-14 | UC-17a | 선호와 상한 분리 (P-14) |
| S4-3 내 답변 3 · 목적 | 본인 | S4 | UC-13 | UC-17a | 1·2순위 중복 불가 |
| S4-4 내 답변 4 · 지역 | 본인 | S4 | UC-13 | UC-17a | |
| S4-5 내 답변 5 · 예산 | 본인 | S4 | UC-13, UC-14 | UC-17a | 「상한 없음」은 P-20 페널티만 |
| S4-6 내 답변 6 · 피할 것 | 본인 | S4 | UC-15, UC-16a (목록에서 고르기) | UC-17a | |
| S4R 구조화 확인 · 제출 | 본인 | S4 (제출) | UC-16, UC-16a, UC-17 | UC-16 (LLM ① 결과) | 해석 실패 상태에서는 제출 불가 = UC-16a 강제 |
| S5 모임 홈 · 대기 | 공통 | S5 대기실 | UC-18, UC-19 | UC-07, UC-21 (미응답 제외 안내), UC-22, UC-23 | |
| S5H 진행 관리 | 방장 | S2 초대 · 현황 (뒷부분) + S5 | UC-05, UC-06, UC-20, UC-21, UC-24, UC-25 | UC-07, UC-22 | 이 문서 S2의 현황 부분이 여기로 옮겨진 것 |
| S6 조율 진행 | 공통 | S6 조율 중 | — | UC-26, UC-27, UC-28, UC-29, UC-29a, UC-30, UC-40 (→E3), UC-52 [NEXT] | |
| S7 결과 · 후보 비교 | 공통 | S7 합의 결과 | UC-34, UC-36 (진입) | UC-31, UC-31a, UC-35, UC-49 | 재확인 중 / 전원 동의 / 방장 확정 상태 = 스타일 보드 §1 #4~6 |
| S8 내 리포트 | 본인 | S8 내 리포트 · 재확인 (앞부분) | UC-32 | UC-33 (권한 만료 → E4) | |
| S7B 최종 의견 | 계산 대상 참가자 | S8 (뒷부분) | UC-36, UC-36a, UC-36b, UC-36c | UC-47, UC-48 | 이 문서 S8의 재확인 3버튼이 여기로 분리된 것 |
| S7C 결정 확정 확인 | 방장 | S9 (앞부분) | UC-38, UC-39 | UC-37 (집계) | 확정 전 확인창. 이 문서에는 S9 안에 있었음 |
| S9 결정 완료 | 공통 | S9 결정 완료 | UC-41, UC-42, UC-43 | UC-39, UC-39a, UC-44 | 열람 기간 P-18 |
| E1 입장할 수 없음 | 공통 | (S3 예외) | — | UC-11 (코드 오류), UC-46 | |
| E2 인원 미달 · 마감 | 방장 | (S2 · S5 예외) | UC-24, UC-25 | UC-22 | |
| E3 후보 없음 | 공통 | (S7 예외) | UC-25 (방장 방 닫기), UC-40a [제품] | UC-40, UC-53 [NEXT] | 쏠 명세대로 상한 완화 요청은 작동 버튼이 아니라 안내만 |
| E4 본인 확인 필요 | 공통 | (S8 예외) | UC-33 | — | |
| E5 연결 오류 · 재시도 | 공통 | (공통 예외) | UC-17a | — | 새 UC 없음. UC-02·16·17·36·39의 「대안/예외」 열 |
| M1 작성 중 이탈 확인 | 공통 | — | — | — | UC-02·13·15·18·36의 「대안/예외」 열 |
| M2 공유 · 캘린더 | 공통 | S9 (공유) | UC-34, UC-41, UC-42 | UC-54 [NEXT] | |

**덮임 확인**: 유즈케이스 62개 중 이 표에 한 번 이상 나오는 것은 62개다(스크립트로 셌다). E5·M1은 화면이지만 새 UC를 만들지 않고 기존 UC의 예외 흐름으로 처리한다.

**이 문서 S 번호 → 쏠 화면 (역방향)**

| 이 문서 S 번호 | 쏠 화면 | 갈라진 이유 |
|---|---|---|
| S0 랜딩 | S0 | 같음 |
| S1 설정 | S1 (+ S1Q 확장) | S1Q는 주제 확장 때만 |
| S2 초대 · 현황 | S2 + S5H | 쏠은 초대(공유)와 진행 관리(현황·조기 시작·연장)를 분리 |
| S3 약속 · 이름 | S3 (+ E1) | 예외를 별도 화면으로 |
| S4 질문 6문항 | S4-1 ~ S4-6 + S4R (+ M1) | 문항당 1화면, 구조화 확인을 별도 화면으로 |
| S5 대기실 | S5 (+ S5H 방장, E2) | 방장 관리 동작을 S5H로 |
| S6 조율 중 | S6 (+ E3, E5) | 후보 0개·연결 오류를 별도 화면으로 |
| S7 합의 결과 | S7 | 같음 |
| S8 내 리포트 · 재확인 | S8 + S7B (+ E4) | 리포트 열람과 최종 의견 제출을 분리 |
| S9 결정 완료 | S7C + S9 + M2 | 확정 확인창과 공유 시트를 분리 |

**정합성 점검에서 나온 차이 3건** (문서를 고치지 않고 표기만 맞춘 것)
1. UC-40a(상한 완화 익명 동의 요청)는 이 문서에서 [현재] 안내 UI / [제품] 요청 흐름인데, 쏠 E3는 「작동 버튼으로 제공하지 않는다」로 더 보수적이다. 화면 기준은 쏠을 따른다: E3에는 안내만, 요청 흐름은 [제품].
2. 쏠 S7B는 「결과 버전이 바뀌면 이전 동의 재사용 금지」를 제안한다. 이 문서 UC-38(다시 조율하기)의 사후조건에는 없다. 채택하면 UC-38 사후조건에 「기존 재확인 응답 초기화」 한 줄이 추가된다(제안, 미반영).
3. 쏠 S1Q(AI 질문 초안 검토)는 UC-51과 같은 기능이지만 이 문서 다이어그램 8(주제 확장)에서는 방장 검토 단계를 노드로 그리지 않았다. 확장 범위이므로 그대로 둔다.

---

## 11. 세는 법 · 미결 · 근거

**개수**: 유즈케이스 62개 = 기본 42개(UC-01~07, UC-10~44) + 하위 변형 11개(a/b/c) + 예외 4개(UC-46~49) + 확장 5개(UC-50~54). 상태별로는 [현재] 53개(그중 UC-16·17a·29·40a·46 다섯은 LLM·서버 부분만 [제품]), [제품] 4개(UC-33, UC-44, UC-39a, UC-49), [NEXT] 5개(UC-50~54), [미결] 0개. UC-39a · UC-49 · UC-02 초대 기본값 · UC-44 보관 기간은 2026-09-06 결정(P-07 · P-17 · P-18 · P-21 · P-22)으로 값이 정해졌다. 이 숫자는 문서의 UC 번호와 명세 표 상태 열을 스크립트로 세어 얻었다.

**이 문서가 새로 정한 것은 없다.** 모든 UC는 요구사항 정의서의 FR/P 번호나 코드 함수에 대응한다. 새로 이름 붙인 것은 UC-11b(개인 링크 검증)·UC-17a(임시 저장)·UC-40a(상한 완화 요청)·UC-46~49(예외 이름)뿐이고, 동작 자체는 기존 문서에 있던 것이다.

**결정 반영(2026-09-06)**: 초대 기본값(P-07) · 원문 보관(P-17, UC-44) · 종료 후 열람(P-18) · 소수 응답 보호(P-19, UC-29 · UC-31) · 동점 표시(P-21, UC-49) · 방장 이탈(P-22, UC-39a)은 민수 위임으로 쏠이 결정했다(`OUTBOX/KKIRI/KKIRI_POLICY_DECISIONS_2026_09_06.md`, https://kkiri-plan.pages.dev/docs/policy-decisions). 이 문서에는 값만 옮겼고 새로 정한 것은 없다. UC-37 대안 문구는 결정서와 충돌해 정정했다.

**근거**
- `OUTBOX/KKIRI/KKIRI_REQUIREMENTS_AND_POLICY.md` — FR-01~23, P-01~20, §5 예외, §6 수용 기준
- `OUTBOX/KKIRI/KKIRI_SCENARIO_MAP.md` — 시나리오 ①~⑤, 엔진 실행 18건
- `OUTBOX/KKIRI/KKIRI_SCREEN_SCENARIO.md` — S0~S9 화면과 상태
- `OUTBOX/KKIRI/KKIRI_AI_DESIGN.md` — LLM ①②③④ 경계, 폴백
- `OUTBOX/KKIRI/KKIRI_USER_FLOW.md` — 상태 머신·타임아웃(https://kkiri-plan.pages.dev/docs/user-flow)
- `mockup/engine.js` `vetoes()` · `satisfaction()` · `compareRows()` · `negotiate()`, `mockup/app.js` `advance()` · `validateRatify()` · `renegotiate()`
- 통합 디자인 스타일 보드 §1 #4~6 (전원 동의 · 방장 확정 상태 규칙)
