# 끼리 A안 — 화면설계·메뉴 UX·백키 명세 v0.1

작성: 쏠 · 2026-09-06

이 문서는 본서비스 설계 제안이며 실제 저장·권한·전송 구현은 아님. 워크숍 6문항 정책 기준.

## 메뉴 구조

| 메뉴 | 대상 | 화면 | 백키 | 규칙 |
| --- | --- | --- | --- | --- |
| 시작 | 공통 | S0 → S1 / S3 | 백은 외부 이전 페이지 | 신규 만들기 또는 초대 입장 |
| 모임 | 참가자·방장 | S5 | 상단 백→S0 | 진행 상태·마감·내 응답 요약 |
| 내 답변 | 본인 | 수집 중 S4R → S4 / 조율 후 읽기 전용 | 폼 이탈은 미저장 확인 | 타인 답변 진입 경로 없음 |
| 결과 | 참가자·방장 | S7 → S8 / S7B / S9 | 상세는 열었던 곳으로 복귀 | 생성 전 준비 중 안내; 미응답자는 리포트·재확인 제외 |
| 진행 관리 | 방장만 | S5H → S2 / E2 / S6 | S5; 모달은 닫기만 | 상태 변경은 확인과 성공 응답 필요 |
| 공유 | 초대는 방장 / 결정은 열람 권한자 | S2 또는 S9 → M2 | 시트만 닫기 | 개인 링크·리포트와 공개 결과를 구분 |

## 화면별 상세

### S0 시작

- 역할: 공통
- 제안 경로: `/`
- 목표: 속마음은 지키고, 결정은 함께.
- 구성: 팀 워크숍 / 친구 여행 · 확장 제안 / 팀 회식 · 확장 제안
- 행동: 모임 만들기
- 상태: 기본 / 이어갈 방 없음
- 백키: 서비스 안 이전 화면 없음. 브라우저 백은 외부 이전 페이지로 이동한다.
- 검증·경계: MVP는 팀 워크숍. 여행·회식은 후속 주제 제안으로 구분한다.
- 근거: FR-01 / FR-21 / A안
- 연결: {'prev': None, 'next': 'S1'}

### S1 방 만들기

- 역할: 방장
- 제안 경로: `/rooms/new`
- 목표: 어떤 모임을 정할까요?
- 구성: 모임 이름: 9월 팀 워크숍 / 함께할 사람: 6명 (방장 포함) / 답변 마감: 24시간 / 초대 방식: 공용 링크 + 코드
- 행동: 초대방 만들기
- 상태: 기본 / 입력 오류 / 만드는 중
- 백키: 변경 없음→S0. 입력 변경 있음→M1 확인. 생성 성공 후 이 폼은 히스토리에서 교체한다.
- 검증·경계: 인원 3~8명. 마감 3시간/오늘 자정/24시간/48시간. 생성 중 중복 클릭 금지; 오류는 값 유지. 초대 기본값은 미결.
- 근거: FR-01 / P-01·02·07
- 연결: {'prev': 'S0', 'next': 'S2'}

### S1Q AI 질문 초안 검토

- 역할: 방장 · 확장
- 제안 경로: `/rooms/new/questions`
- 목표: 질문은 우리가 확인해요.
- 구성: 검토 전 AI 초안 / 우리 모임에서 피하고 싶은 것은? / 질문 수정 · 추가 · 제외
- 행동: 검토한 질문으로 만들기
- 상태: 초안 / 생성 오류 / 검토 완료
- 백키: S1로 돌아가 모임 설정 유지. 초안 재생성은 기존 편집을 덮기 전 확인.
- 검증·경계: 주제 확장 때만 적용하는 제안. MVP 고정 6문항 흐름에는 삽입하지 않는다. AI가 임의의 조건·발언을 만들지 않는다.
- 근거: A안 / 쏠 스타일 가이드 AI 질문 흐름
- 연결: {'prev': 'S1', 'next': 'S2'}

### S2 초대하기

- 역할: 방장
- 제안 경로: `/r/:room/invite`
- 목표: 우리끼리, 편하게 답해요.
- 구성: 9월 팀 워크숍 · 6명 / 공용 링크 + 입장 코드 482916 (예시) / 답변 마감까지 24시간 (예시)
- 행동: 내 답변 시작하기
- 상태: 공용 링크 / 개인 링크 / 공유 취소
- 백키: 방 생성 직후에도 S1로 되돌리지 않고 S5H로 이동. 공유 시트 백은 시트만 닫는다.
- 검증·경계: 공유는 사용자가 대상과 내용을 확인해 실행. 개인 링크는 대상별로 구분; 참가자 토큰을 공개 링크에 포함하지 않는다.
- 근거: FR-02 / P-07·08
- 연결: {'prev': 'S5H', 'next': 'S3'}

### S3 초대 입장 · 비공개 안내

- 역할: 공통
- 제안 경로: `/r/:room/join`
- 목표: 편하게 말해도 괜찮아요.
- 구성: 입장 코드: 482916 / 나를 부를 이름: 민지 / 내 답변은 다른 참가자와 방장에게 공개하지 않아요.
- 행동: 내 의견 남기기
- 상태: 첫 입장 / 코드 오류 / 이미 참여함
- 백키: 앱 상단 백→S0. 외부 초대 링크에서 브라우저 백→메신저/이전 페이지. 이름 변경 시 M1.
- 검증·경계: 코드·정원·기한 검증 후 참여 세션 발급. 동일 세션 재입장은 중복 인원 생성 없이 서버 상태로 복귀. 보관 기간은 아직 미결.
- 근거: FR-03 / FR-19 / P-08·17
- 연결: {'prev': 'S0', 'next': 'S4-1'}

### S4-1 내 답변 1 · 방식

- 역할: 본인
- 제안 경로: `/r/:room/answer/1`
- 목표: 어떤 분위기가 편해요?
- 구성: 실내 중심 / 야외 중심 / 반반이면 좋아요
- 행동: 다음 질문
- 상태: 기본 / 입력 오류 / 저장 실패
- 백키: 앞 문항으로 이동하고 입력·상한·순위를 유지한다. 첫 문항 백은 S3; 방 밖 이탈은 M1.
- 검증·경계: 필수 1개 선택. 이후 문항으로 이동해도 선택 유지. 본서비스 제안: 인증된 임시저장 성공/실패 표시; 실패 시 저장됐다고 말하지 않는다.
- 근거: FR-04·05 / P-14·15·20
- 연결: {'prev': 'S3', 'next': 'S4-2'}

### S4-2 내 답변 2 · 시간

- 역할: 본인
- 제안 경로: `/r/:room/answer/2`
- 목표: 어느 정도 시간이 편해요?
- 구성: 반나절 / 하루 / 1박 2일 / 꼭 지킬 상한: 하루
- 행동: 다음 질문
- 상태: 기본 / 입력 오류 / 저장 실패
- 백키: 앞 문항으로 이동하고 입력·상한·순위를 유지한다. 문항 사이 이동에는 이탈 확인을 띄우지 않는다.
- 검증·경계: 선호와 상한은 별도. 상한보다 긴 후보는 제외. 상한이 선호보다 짧으면 해당 필드에 오류. 본서비스 제안: 인증된 임시저장 성공/실패 표시; 실패 시 저장됐다고 말하지 않는다.
- 근거: FR-04·05 / P-14·15·20
- 연결: {'prev': 'S4-1', 'next': 'S4-3'}

### S4-3 내 답변 3 · 목적

- 역할: 본인
- 제안 경로: `/r/:room/answer/3`
- 목표: 무엇을 가장 얻고 싶나요?
- 구성: 1순위: 팀워크 / 2순위: 재충전 / 아이디어
- 행동: 다음 질문
- 상태: 기본 / 입력 오류 / 저장 실패
- 백키: 앞 문항으로 이동하고 입력·상한·순위를 유지한다. 문항 사이 이동에는 이탈 확인을 띄우지 않는다.
- 검증·경계: 1·2순위 중복 불가. 순위 교체 시 즉시 결과를 보여 준다. 본서비스 제안: 인증된 임시저장 성공/실패 표시; 실패 시 저장됐다고 말하지 않는다.
- 근거: FR-04·05 / P-14·15·20
- 연결: {'prev': 'S4-2', 'next': 'S4-4'}

### S4-4 내 답변 4 · 지역

- 역할: 본인
- 제안 경로: `/r/:room/answer/4`
- 목표: 어디에서 만나면 편할까요?
- 구성: 도심 / 근교 / 어디든 괜찮아요
- 행동: 다음 질문
- 상태: 기본 / 입력 오류 / 저장 실패
- 백키: 앞 문항으로 이동하고 입력·상한·순위를 유지한다. 문항 사이 이동에는 이탈 확인을 띄우지 않는다.
- 검증·경계: 무관은 빈 응답과 구별. 개인 위치·주소 입력을 요구하지 않는다. 본서비스 제안: 인증된 임시저장 성공/실패 표시; 실패 시 저장됐다고 말하지 않는다.
- 근거: FR-04·05 / P-14·15·20
- 연결: {'prev': 'S4-3', 'next': 'S4-5'}

### S4-5 내 답변 5 · 예산

- 역할: 본인
- 제안 경로: `/r/:room/answer/5`
- 목표: 어느 정도가 부담 없나요?
- 구성: 선호 예산: 5만 원 / 꼭 지킬 상한: 10만 원 / 상한 없음
- 행동: 다음 질문
- 상태: 기본 / 입력 오류 / 저장 실패
- 백키: 앞 문항으로 이동하고 입력·상한·순위를 유지한다. 문항 사이 이동에는 이탈 확인을 띄우지 않는다.
- 검증·경계: 선호 초과는 선호 차이; 상한 초과만 제외. 선호보다 작은 상한은 오류. 선택 값을 URL에 넣지 않는다. 본서비스 제안: 인증된 임시저장 성공/실패 표시; 실패 시 저장됐다고 말하지 않는다.
- 근거: FR-04·05 / P-14·15·20
- 연결: {'prev': 'S4-4', 'next': 'S4-6'}

### S4-6 내 답변 6 · 피할 것

- 역할: 본인
- 제안 경로: `/r/:room/answer/6`
- 목표: 이것만은 피하고 싶어요.
- 구성: 술을 마시지 않는 일정이면 좋겠어요. / 목록에서 고르기 / 입력하지 않고 넘어가기
- 행동: 조건 확인하기
- 상태: 기본 / 입력 오류 / 저장 실패
- 백키: 앞 문항으로 이동하고 입력·상한·순위를 유지한다. 문항 사이 이동에는 이탈 확인을 띄우지 않는다.
- 검증·경계: 선택 문항. 해석 실패 원문을 자동으로 버리지 않는다. 목록 선택 또는 명시적 비우기 뒤 진행. 본서비스 제안: 인증된 임시저장 성공/실패 표시; 실패 시 저장됐다고 말하지 않는다.
- 근거: FR-04·05 / P-14·15·20
- 연결: {'prev': 'S4-5', 'next': 'S4R'}

### S4R 구조화 확인 · 제출

- 역할: 본인
- 제안 경로: `/r/:room/answer/review`
- 목표: 내 조건, 이렇게 이해했어요.
- 구성: 술 없는 일정 · 꼭 지켜요 / 시간은 하루 이하 / 예산은 10만 원 이하 / 각 항목은 나만 확인할 수 있어요.
- 행동: 이 조건으로 제출하기
- 상태: 확인 필요 / 해석 실패 / 제출 중 / 제출 오류
- 백키: S4-6으로 복귀해 원문·태그 유지. 제출 성공 후 S5로 교체; 백으로 제출을 취소하지 않는다.
- 검증·경계: 해석 결과 수정/확인 필수. 실패 상태에서 제출 불가. 재시도는 같은 요청 식별자로 처리; 성공 여부 불명확하면 상태부터 조회.
- 근거: FR-05·06 / NF-04
- 연결: {'prev': 'S4-6', 'next': 'S5'}

### S5 모임 홈 · 대기

- 역할: 공통
- 제안 경로: `/r/:room`
- 목표: 내 의견은 잘 도착했어요.
- 구성: 내 답변: 제출 완료 / 답변 4 / 6명 · 가상 예시 / 답변 마감까지 2시간 · 가상 예시
- 행동: 내 답변 확인
- 상태: 답변 대기 / 조율 시작됨 / 미응답 제외
- 백키: 상단 백→S0. 시스템 백은 유효한 직전 화면; 이미 제출한 입력 URL은 S5로 상태 보정한다.
- 검증·경계: 방장도 남의 답변을 볼 수 없다. 답변 수정은 수집 중에만. 조율 시작 이벤트 수신 시 읽기 전용과 상태 이동을 안내.
- 근거: FR-06·07 / P-05
- 연결: {'prev': 'S0', 'next': 'S6'}

### S5H 진행 관리

- 역할: 방장
- 제안 경로: `/r/:room/manage`
- 목표: 모두의 진행만 확인해요.
- 구성: 민지 · 답변 완료 / 준호 · 답변 완료 / 수연 · 작성 중 / 전체 4 / 6명 답변 · 예시
- 행동: 조기 시작 검토
- 상태: 수집 중 / 시작 확인 / 알림 대기시간
- 백키: S5로 복귀. 조기 시작 확인창에서 백/ESC는 취소만 한다; 조율은 시작하지 않는다.
- 검증·경계: 3명 이상 답변해야 시작. 미응답자의 계산·리포트·재확인 제외를 확인창에 표시. 수동 알림 쿨다운 30분. 권한은 서버에서 검사.
- 근거: FR-07~10 / P-05·06
- 연결: {'prev': 'S5', 'next': 'S6'}

### S6 조율 진행

- 역할: 공통
- 제안 경로: `/r/:room/progress`
- 목표: 조건을 함께 맞추고 있어요.
- 구성: 1. 조건 모으기 / 2. 꼭 지킬 조건 확인 / 3. 후보 비교 / 4. 추천 이유 정리
- 행동: 모임 홈으로
- 상태: 계산 중 / 설명 대체 / 다시 연결 필요
- 백키: S5로 나가도 서버 조율은 계속된다. 재입장은 새 계산을 시작하지 않고 현재 작업 상태를 조회한다.
- 검증·경계: 사람 단위 가짜 발언·가짜 진행률 금지. 설명만 30초 넘으면 템플릿. 계산 자체 실패는 E5; 결과가 없는데 성공처럼 넘어가지 않는다.
- 근거: FR-11·12·14 / P-16
- 연결: {'prev': 'S5', 'next': 'S7'}

### S7 결과 · 후보 비교

- 역할: 공통
- 제안 경로: `/r/:room/result`
- 목표: 함께 정할 안을 찾았어요.
- 구성: 양평 리트릿 워크숍 · 가상 추천 / 하루 · 1인 9만 원 · 가상 예시 / 공통 이유와 선호 차이 / 대안 두 개 더 보기
- 행동: 내 최종 의견 남기기
- 상태: 재확인 중 / 전원 동의 / 방장 확정 / 조건 미반영
- 백키: S5로 복귀. 대안 상세 시트가 열렸다면 시트만 닫고 결과 스크롤 위치를 복원한다.
- 검증·경계: 전원 동의=계산 대상 전원의 명시 동의. 미응답·기권·조건부를 자동 동의로 처리하지 않는다. 방장 확정은 중립 배지; 단독 조건 내용은 공개 금지.
- 근거: FR-13 / P-05·09·12 / A안
- 연결: {'prev': 'S5', 'next': 'S7B'}

### S8 내 리포트

- 역할: 본인
- 제안 경로: `/r/:room/me/report`
- 목표: 나의 조건은 이렇게 반영됐어요.
- 구성: 내 시간 상한은 지켜졌어요. / 예산 상한은 지켜졌어요. / 선호 예산보다 비용이 높아요.
- 행동: 내 최종 의견 남기기
- 상태: 본인 확인됨 / 권한 만료
- 백키: 진입한 S7 또는 S9로 복귀. 외부 직접 진입 시 권한을 확인한 후 S7로 돌아가기 제공.
- 검증·경계: 방장에게도 본인 외 리포트 접근 금지. URL/공유 미리보기/방장 집계/로그에 개인 값 포함 금지. 세션 만료 시 화면을 가리고 E4.
- 근거: FR-15·19 / P-12
- 연결: {'prev': 'S7', 'next': 'S7B'}

### S7B 최종 의견

- 역할: 계산 대상 참가자
- 제안 경로: `/r/:room/ratify`
- 목표: 이 안으로 함께할 수 있나요?
- 구성: 동의해요 / 조건부로 동의해요 / 다시 조율해야 해요
- 행동: 의견 보내기
- 상태: 동의 / 조건부 동의 / 재조율 요청 / 1회 사용함 / 마감됨
- 백키: 입력 없음→진입한 S7/S8. 작성 중 조건이 있으면 M1. 제출 성공 후 결과로 교체; 백은 제출 취소가 아니다.
- 검증·경계: 조건부는 공개 가능한 실행 조건 필수 + 공개 미리보기. 재조율은 비공개 조건 구조화 성공 후 방당 1회 원자적 차감. 실패 시 권한 유지. 결과 버전이 바뀌면 이전 동의 재사용 금지(제안).
- 근거: FR-16·17 / P-09·10
- 연결: {'prev': 'S7', 'next': 'S7'}

### S7C 결정 확정 확인

- 역할: 방장
- 제안 경로: `/r/:room/result?confirm`
- 목표: 이 내용으로 확정할까요?
- 구성: 동의 3 · 조건부 1 · 기권 0 · 예시 / 공개 실행 조건: 저녁 8시 전에 종료 / 계산에 포함되지 않은 참가자 2명 · 예시
- 행동: 결정 확정하기
- 상태: 확정 가능 / 재조율 처리 중 / 조건 검토 필요
- 백키: 백/ESC/취소→S7. 확정 API 성공 전에는 완료 화면으로 이동하지 않는다.
- 검증·경계: 재조율 없음 AND (전원 응답 OR 24시간 마감) 조건. 공개 실행 조건 충돌이 있으면 확정 차단을 제안. 기권 존재 시 전원 동의 배지 금지.
- 근거: FR-17 / P-09 / UX 제안
- 연결: {'prev': 'S7', 'next': 'S9'}

### S9 결정 완료

- 역할: 공통
- 제안 경로: `/r/:room/done`
- 목표: 이제 함께 실행해요.
- 구성: 양평 리트릿 워크숍 · 예시 / 방장 확정 · 전원 동의 미확인 / 실행 조건: 저녁 8시 전에 종료
- 행동: 결정 공유하기
- 상태: 전원 동의 후 확정 / 방장 확정 / 공유 취소
- 백키: S5 읽기 전용 홈. 브라우저 백으로 재확인 폼이 열려도 서버 완료 상태에 따라 S9로 보정.
- 검증·경계: 공유는 공개 결정·실행 조건만. 캘린더 파일 생성은 외부 예약·일정 등록과 다름. 열람/삭제 기간 숫자는 정책 확정 전 약속하지 않는다.
- 근거: FR-18 / P-17·18
- 연결: {'prev': 'S5', 'next': 'M2'}

### E1 입장할 수 없음

- 역할: 공통
- 제안 경로: `/r/:room/join?error`
- 목표: 초대 내용을 확인해 주세요.
- 구성: 코드를 다시 확인해 주세요. / 새 참가자 입장이 마감됐어요. / 정원이 찼어요.
- 행동: 코드 다시 입력
- 상태: 코드 오류 / 정원 초과 / 초대 만료
- 백키: S0 또는 외부 초대 원래 페이지. 기존 참가자는 세션 검증 후 S5/S7/S9로 복귀 가능(제안).
- 검증·경계: 신규 초대 만료와 기존 참가자 열람 권한을 분리한다는 제품 제안. 같은 이름만으로 기존 참가자를 식별하지 않는다.
- 근거: P-08 / NF-03 / UX 제안
- 연결: {'prev': 'S0', 'next': 'S3'}

### E2 인원 미달 · 마감

- 역할: 방장
- 제안 경로: `/r/:room/expired`
- 목표: 아직 조율을 시작할 수 없어요.
- 구성: 답변 2명 / 최소 3명 · 예시 / 24시간 연장 가능 / 이번 방을 닫을 수도 있어요.
- 행동: 24시간 연장 검토
- 상태: 연장 가능 / 2회 사용함 / 참가자 보기
- 백키: S5H 또는 참가자는 S5. 백은 연장도 종료도 실행하지 않는다.
- 검증·경계: 24시간씩 최대 2회. 참가자에게 관리 버튼 숨김. 연장 성공 후 초대 시각 갱신; 기존 링크 재활성화 정책은 구현 확인 대상.
- 근거: FR-09 / P-04
- 연결: {'prev': 'S5H', 'next': 'S2'}

### E3 후보 없음

- 역할: 공통
- 제안 경로: `/r/:room/no-candidate`
- 목표: 모든 조건을 지키는 안이 없어요.
- 구성: 누군가의 조건을 임의로 낮추지 않아요. / 공개 가능한 제외 사유만 보여요. / 새 모임에서는 조건을 다시 확인해요.
- 행동: 모임 홈으로
- 상태: 후보 없음 / 방장 보기 / 참가자 보기
- 백키: S5 상태 홈. 시스템 백으로 과거 추천이 보이더라도 현재 후보 없음 상태로 보정.
- 검증·경계: 현 범위: 방장은 확인 후 방 닫기/새 방. 참가자는 상태 열람. 상한 완화 동의 라운드는 NEXT이며 작동 버튼으로 제공하지 않는다.
- 근거: FR-20·23 / AI 설계 §7
- 연결: {'prev': 'S5', 'next': None}

### E4 본인 확인 필요

- 역할: 공통
- 제안 경로: `/r/:room/verify`
- 목표: 내 정보는 확인 후 보여드려요.
- 구성: 개인 리포트 내용을 숨겼어요. / 기존 개인 링크나 유효한 참여 세션으로 돌아오세요. / 방장도 다른 사람의 리포트는 볼 수 없어요.
- 행동: 모임 홈으로
- 상태: 세션 만료 / 다른 참가자 / 복구 수단 없음
- 백키: 공개 가능한 S5로 이동. 재인증 성공 후 권한 허용된 요청 화면으로만 복귀.
- 검증·경계: 공용 링크/이름만으로 개인 리포트를 복구하지 않는다. 새 기기 복구 방식은 미결; 복구 성공을 보장하는 카피 금지.
- 근거: FR-19 / NF-03
- 연결: {'prev': 'S5', 'next': 'S8'}

### E5 연결 오류 · 재시도

- 역할: 공통
- 제안 경로: `현재 화면의 오류 상태`
- 목표: 아직 처리 결과를 확인하지 못했어요.
- 구성: 입력은 현재 화면에 유지돼요. / 저장 완료는 확인되지 않았어요. / 연결 후 현재 상태부터 확인할게요.
- 행동: 현재 상태 다시 확인
- 상태: 오프라인 / 처리 결과 불명 / 다른 탭 변경
- 백키: 미저장 변경이 있으면 M1; 읽기 화면이면 이전 화면. 백이나 재시도로 생성·제출·차감을 반복하지 않는다.
- 검증·경계: 성공 여부 불명 시 조회 우선. 서버 버전 충돌이면 최신 상태 안내; 초안을 덮어쓰지 않고 별도 비교. 기기 종료 후 초안 복구 보장은 미결.
- 근거: NF-04 / UX 제안
- 연결: {'prev': 'S5', 'next': None}

### M1 작성 중 이탈 확인

- 역할: 공통
- 제안 경로: `오버레이 · URL 없음`
- 목표: 작성 중인 내용이 있어요.
- 구성: 이 화면에 남아 계속 작성할 수 있어요. / 나가면 저장되지 않은 수정은 사라져요. / 이미 제출한 답변은 그대로예요.
- 행동: 계속 작성하기
- 상태: 미저장 수정 / 저장 실패
- 백키: 백/ESC는 이 확인창만 닫고 작성 화면으로 복귀. 나가기 명시 선택 때만 보류한 이동을 실행.
- 검증·경계: 작성 중인 폼을 떠날 때만 표시. 문항 이전 이동은 제외. 취소에 초기 포커스; 포커스 가두기·복귀. 외부 브라우저 이탈에 커스텀 모달 보장 불가.
- 근거: NF-01 / MDN beforeunload / UX 제안
- 연결: {'prev': 'S4-1', 'next': None}

### M2 공유 · 캘린더

- 역할: 공통
- 제안 경로: `네이티브 시트 / 대체 대화상자`
- 목표: 함께 볼 결정만 공유해요.
- 구성: 공개 제목·일정·장소·실행 조건 / 개인 조건·리포트 링크 제외 / 링크 복사 / 캘린더 파일 내려받기
- 행동: 공유 미리보기
- 상태: 공유 준비 / 시트 취소 / 복사 실패
- 백키: 시트 백은 시트만 닫아 S9의 원래 스크롤·포커스로 복귀. 취소를 공유 성공으로 표시하지 않는다.
- 검증·경계: 공유 대상 선택은 사용자가 실행. Web Share 미지원→명시적 복사; 클립보드 거절→선택 가능한 텍스트. 예약·일정 등록 완료로 표기 금지.
- 근거: FR-18 / A안
- 연결: {'prev': 'S9', 'next': 'S9'}

## 백키 매트릭스

| ID | 상황 | 처리 | 데이터 | 확인 | 목적지 |
| --- | --- | --- | --- | --- | --- |
| B01 | 문항 2~6에서 백 | 이전 문항 | 선택·상한·순위 유지 | 없음 | S4 이전 |
| B02 | 첫 문항에서 백 | 비공개 안내 | 현재 입력 유지 | 방 밖 이탈 때만 | S3 |
| B03 | 미저장 폼에서 다른 메뉴 | 목적지 보류 | 제출본과 초안 분리 | M1 계속 작성/나가기 | 보류 목적지 |
| B04 | 대화상자·공유 시트 열림 | 최상단 레이어 닫기 | 본문 스크롤·포커스 유지 | ESC=취소 | 열었던 화면 |
| B05 | 방 생성 직후 백 | 모임 홈 | 생성 완료 유지 | 재생성 금지 | S5H |
| B06 | 답변 제출 성공 후 백 | 모임 홈 | 제출 취소 아님 | 수정은 명시 버튼 | S5 |
| B07 | 결과 → 내 리포트 → 백 | 열었던 결과/완료 | 개인 내용 캐시 노출 차단 | 권한 매번 확인 | S7/S9 |
| B08 | 의견 입력 중 백 | 진입한 결과/리포트 | 미전송 글 유지 또는 명시 폐기 | 변경 있으면 M1 | S7/S8 |
| B09 | 의견 전송/확정 성공 후 백 | 최신 결과/완료 | 상태 되돌림 없음 | 중복 제출 금지 | S7/S9 |
| B10 | 직접 링크 진입 후 앱 백 | 상위 모임 홈 | 본인 권한 검사 | 내부 이전 화면 추측 금지 | S5 또는 S0 |
| B11 | 외부 첫 진입 후 OS/브라우저 백 | 외부 이전 페이지 허용 | 초안 저장 성공 여부만 안내 | 브라우저 기본 확인은 보장 불가 | 외부 |
| B12 | 새로고침 / 앱 전환 후 복귀 | 서버 상태 재검사 | 검증된 저장분만 복원 | 제출 재실행 금지 | F06 상태 라우팅 |
| B13 | 조율 중 백 | 모임 홈 | 서버 작업 계속 | 취소로 해석 금지 | S5 |
| B14 | 네트워크 오류 중 백 | 저장 상태에 따라 분기 | 현재 메모리 입력 유지 | 미저장 시 M1 | 이전 화면 |
| B15 | 닫힌 방/만료된 리포트 URL | 만료·권한 안내 | 개인 내용 렌더 금지 | 세션/방상태 재검사 | E1/E4 |
| B16 | 브라우저 앞으로가기/복원 캐시 | 최신 상태로 보정 | 완료된 폼 재노출 금지 | 권한·버전 재조회 | S5/S7/S9 |

## 제안·미결

| ID | 항목 | 정의 |
| --- | --- | --- |
| A-01 | 모바일 웹 우선·회원가입 없는 방 단위 세션 | 본서비스 제안. 계정 기반 내 모임 목록은 추가하지 않음. |
| A-02 | 임시저장·다기기 복원 | 서버 인증 초안 저장을 제안. 보관 기간·새 기기 복구는 미결. 이 문서의 시연 입력은 메모리만 사용. |
| A-03 | 초대 마감과 기존 참가자 열람 분리 | P-08 초대 만료를 신규 입장 제한으로 구체화하는 제안. 참가자 접근 토큰의 수명은 별도 결정 필요. |
| A-04 | 조건부 응답·결과 버전 | 조건부는 전원 동의에 포함하지 않음. 실행 조건 충돌 시 확정 차단, 결과 변경 시 재동의는 추가 UX 제안. |
| A-05 | 원문/태그/리포트 보관·방장 이탈 | 기존 미결을 유지. 자동 확정·7일 보관 등을 확정값처럼 표시하지 않음. |
| A-06 | 주제 범위 | A안 스타일을 적용하되 동작 명세는 확정된 워크숍 6문항 기준. 여행/회식/AI 질문 편집은 확장으로 표시. |

## 흐름도 원본

```mermaid
%% 01 · 방 만들기 · 초대 · 진행 관리
flowchart TD
  h["S0 시작"]
  s["S1 방 만들기"]
  v{"입력 유효?"}
  i["S2 초대하기"]
  j["S3 내 답변 시작"]
  e["S1 입력 오류<br/>입력값 유지"]
  m["S5H 진행 관리"]
  d{"답변 3명 이상?"}
  c["시작 확인<br/>미응답 제외 안내"]
  p["S6 조율 진행"]
  w["S5 대기 계속"]
  a["S1Q AI 질문 검토<br/>주제 확장 때만"]
  h -->|"만들기"| s
  s -->|"생성 요청"| v
  v -->|"예 · 성공"| i
  v -->|"아니오"| e
  i -->|"방장도 참여"| j
  i -->|"진행 보기"| m
  m -->|"조기 시작"| d
  d -->|"예"| c
  d -->|"아니오"| w
  c -->|"명시 확인"| p
  s -->|"확장 제안"| a
```

```mermaid
%% 02 · 초대 입장 · 내 답변 · 수정
flowchart TD
  j["S3 입장 · 비공개 안내"]
  q1["S4-1 방식 → S4-2 시간"]
  q3["S4-3 목적 → S4-4 지역"]
  q5["S4-5 예산 → S4-6 피할 것"]
  r["S4R 구조화 확인"]
  v{"확인·검증 성공?"}
  w["S5 대기 · 제출 완료"]
  err["해석 실패<br/>수정 / 목록 / 명시적 비우기"]
  ed{"아직 수집 중?"}
  rw["S4-1 답변 수정<br/>기존 제출 답변은 유지"]
  lock["수정 잠금<br/>현재 결과로 안내"]
  j -->|"참여 세션 발급"| q1
  q1 -->|"다음 · 입력 유지"| q3
  q3 -->|"다음 · 입력 유지"| q5
  q5 -->|"조건 확인"| r
  r -->|"제출"| v
  v -->|"아니오"| err
  v -->|"예 · 서버 성공"| w
  w -->|"답변 고치기"| ed
  ed -->|"예"| rw
  ed -->|"아니오"| lock
```

```mermaid
%% 03 · 방 안 메뉴 · 상세 · 백키
flowchart TD
  home["S5 모임"]
  ans{"내 답변 메뉴"}
  res{"결과 메뉴"}
  manage["S5H 진행 관리<br/>방장만"]
  edit["수집 중 → S4R 확인/수정"]
  wait["조율 전 → 준비 중 안내<br/>새 결과 요청 없음"]
  result["준비됨 → S7 결과"]
  invite["S2 초대 정보"]
  report["S8 내 리포트<br/>본인 인증"]
  vote["S7B 내 최종 의견"]
  done["완료됨 → S9 결정"]
  share["M2 공유 시트"]
  home -->|"내 답변"| ans
  home -->|"결과"| res
  home -->|"관리"| manage
  ans -->|"수집 중"| edit
  res -->|"아직 없음"| wait
  res -->|"결과 생성됨"| result
  manage -->|"초대 보기"| invite
  result -->|"본인 리포트"| report
  result -->|"의견 남기기"| vote
  result -->|"확정된 방"| done
  done -->|"공유"| share
```

```mermaid
%% 04 · 결과 · 재확인 · 확정
flowchart TD
  r["S7 추천 결과"]
  v["S7B 최종 의견"]
  yes["동의<br/>명시적 전송"]
  cond["조건부 동의<br/>실행 조건 공개 미리보기"]
  again["재조율 요청<br/>비공개 구조화 + 1회 검사"]
  calc["S6 재조율<br/>실패 시 1회 권한 유지"]
  gate{"재조율 없음 AND<br/>(전원 응답 OR 24h 마감)?"}
  wait["S7 재확인 대기"]
  confirm["S7C 방장 확정 확인"]
  done["S9 완료<br/>동의/기권/조건부 구분"]
  r -->|"리포트 열람 후도 가능"| v
  v -->|"동의"| yes
  v -->|"조건부"| cond
  v -->|"재조율"| again
  again -->|"검증 성공 · 권한 있음"| calc
  yes -->|"익명 집계"| gate
  cond -->|"조건 검토"| gate
  gate -->|"아니오"| wait
  gate -->|"예"| confirm
  confirm -->|"서버 확정 성공"| done
```

```mermaid
%% 05 · 백키 우선순위 · 작성 중 이탈
flowchart TD
  b["뒤로가기 발생"]
  o{"시트·대화상자 열림?"}
  close["최상단 레이어만 닫기<br/>포커스 복귀"]
  q{"이전 문항으로 이동?"}
  prev["이전 문항<br/>선택·상한·순위 유지"]
  dirty{"폼 밖 이동 + 미저장 변경?"}
  guard["M1 작성 중 이탈 확인"]
  stay["계속 작성 / ESC<br/>현재 폼 복귀"]
  dest{"유효한 이전 목적지?"}
  last["이전 화면 복귀<br/>현재 방 상태 재검사"]
  fallback["직접 진입: 앱 백→모임 홈<br/>브라우저 백→외부 허용"]
  b -->|"우선 검사"| o
  o -->|"예"| close
  o -->|"아니오"| q
  q -->|"예"| prev
  q -->|"아니오"| dirty
  dirty -->|"예"| guard
  dirty -->|"아니오"| dest
  guard -->|"계속 작성"| stay
  guard -->|"나가기 확인"| dest
  dest -->|"예"| last
  dest -->|"아니오"| fallback
```

```mermaid
%% 06 · 새로고침 · 딥링크 · 재진입
flowchart TD
  u["초대/결과/리포트 URL<br/>새로고침·탭 복귀"]
  auth{"요청 화면에 유효한 권한?"}
  no["E4 본인 확인 필요<br/>개인 내용 숨김"]
  status["서버 방 상태 조회"]
  input["수집 중 + 미제출<br/>S3 / 마지막 저장 문항"]
  wait["수집 중 + 제출됨<br/>S5 대기"]
  calc["조율 중<br/>S6 진행 조회"]
  result["결과 있음 → S7<br/>현재 버전 재확인"]
  done["완료됨 → S9<br/>이전 폼은 읽기 전용"]
  end["만료/후보 없음<br/>E1·E2·E3 상태별 안내"]
  u -->|"민감정보 렌더 전"| auth
  auth -->|"아니오"| no
  auth -->|"예 / 공개 허용"| status
  status -->|"수집 중"| input
  status -->|"제출 완료"| wait
  status -->|"계산 중"| calc
  input -->|"상태가 결과로 변경 시"| result
  wait -->|"완료된 방 재입장"| done
  calc -->|"종료/후보 없음"| end
```

```mermaid
%% 07 · 마감 · 후보 없음 · 연결 오류
flowchart TD
  deadline["답변 마감"]
  count{"응답 3명 이상?"}
  calc["S6 자동 조율"]
  short["E2 인원 미달"]
  extend{"연장 횟수 남음?"}
  yes["24시간 연장<br/>S2 초대 시각 갱신"]
  closed["종료 확인 → 방 닫힘<br/>S5 상태 홈"]
  cand{"통과 후보 있음?"}
  result["S7 추천 결과"]
  none["E3 후보 없음<br/>완화 라운드 NEXT"]
  net["E5 연결/결과 불명"]
  retry["조회 우선 → 동일 요청 재시도<br/>중복 생성·차감 없음"]
  deadline -->|"마감 이벤트"| count
  count -->|"예"| calc
  count -->|"아니오"| short
  short -->|"방장만"| extend
  extend -->|"예 · 연장 확인"| yes
  extend -->|"아니오 / 종료 선택"| closed
  calc -->|"필터 완료"| cand
  cand -->|"예"| result
  cand -->|"아니오"| none
  net -->|"연결 회복"| retry
```

```mermaid
%% 08 · 방 상태 · 되돌릴 수 없는 경계
flowchart TD
  draft["초안<br/>S1"]
  collect["답변 수집 중<br/>S2·S3·S4·S5"]
  nego["조율 중<br/>S6"]
  ratify["재확인 중<br/>S7·S8·S7B"]
  confirm["결정 완료<br/>S9"]
  expire["인원 미달<br/>E2"]
  noc["후보 없음<br/>E3"]
  re["재조율 1회<br/>새 결과 버전 생성"]
  ret["열람 만료 / 방 종료<br/>보관·복구 기간 미결"]
  draft -->|"생성 성공 · 폼 교체"| collect
  collect -->|"전원/조기/마감 ≥3"| nego
  collect -->|"마감 <3"| expire
  nego -->|"후보 있음"| ratify
  nego -->|"후보 없음"| noc
  ratify -->|"검증된 재조율"| re
  ratify -->|"방장 확정 성공"| confirm
  confirm -->|"확정 정책에 따라"| ret
```

## 실서비스 인수 기준 (미실시)

1. 전원이 답해도 전원 동의 배지가 나타나지 않는다. 조건부·기권이 있으면 방장 확정은 중립 상태다.

2. 문항 5에 예산을 선택하고 문항 4로 돌아온 뒤 다시 문항 5로 가면 동일한 값이 보인다.

3. 폼 밖 이동 시 미저장 변경이 있으면 계속 작성/나가기 확인이 뜬다. ESC는 폼을 유지한다.

4. 제출 성공 뒤 브라우저 백/앞으로가기를 반복해도 중복 제출이나 입력 초기화가 발생하지 않는다.

5. 미응답자는 계산·리포트·최종 의견 대상에서 제외되며 결과 화면에 제외 수가 표시된다.

6. 다른 참가자의 리포트 URL, 방장 세션, 만료 세션으로 개인 데이터가 렌더되지 않는다.

7. 재조율 요청이 동시에 발생해도 방당 1회만 적용하며 실패·해석 실패는 권한을 소모하지 않는다.

8. 조율 중 화면을 닫았다 다시 들어오면 같은 작업 상태를 조회하고 조율을 중복 시작하지 않는다.

9. 마감 경계에서 늦은 제출은 서버 시간을 기준으로 거절되며 성공 토스트를 표시하지 않는다.

10. 네트워크 성공 여부가 불명확하면 먼저 현재 상태를 조회한 뒤 동일 요청으로 재시도한다.

11. 공유 시트 취소·클립보드 거절은 공유 성공으로 표시되지 않는다. 개인 리포트 URL은 공유되지 않는다.

12. 완료/만료 이벤트, 새 탭 변경, 브라우저 복원 캐시 재진입 시 권한과 결과 버전을 다시 확인한다.

13. 인원 미달은 연장 최대 2회만 허용한다. 후보 없음에서 본인 동의 없이 조건을 완화하지 않는다.

14. 대화상자는 포커스 가두기·ESC·호출 버튼 복귀를 제공하고 터치 영역은 48px 이상으로 설계한다.

## 출처

- https://kkiri-plan.pages.dev/design-review/a

- OUTBOX/KKIRI/KKIRI_REQUIREMENTS_AND_POLICY.md

- OUTBOX/KKIRI/KKIRI_USER_FLOW.md

- https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event

- https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState

모바일 종료 확인은 보장 불가. 성공 후 replaceState와 재진입 권한·상태 검사는 구현 제안이다.