# 사용자 여정: 여러 세션 사이 자유 전환

## 0. 문서 정보

| 항목 | 내용 |
|---|---|
| 여정 식별자 | `JRN-multi-session-switch` |
| 여정명 | 여러 세션 사이 자유 전환 |
| 상태 | 초안 (v0.2) |
| 담당자 | 미지정 |
| 최종 수정일 | 2026-08-30 |
| 달성 가치 | V4 자유로운 멀티세션 전환 · V3 끊김 없는 세션 연속성 |
| 연결 문서 | PRD [`state-api`](../prd/state-api.md)(AC-C2·C4) · [`lifecycle`](../prd/lifecycle.md)(AC-B2·B3) · mockup `index.html`·`workspace.html`·`agent-workspace.html` ([매핑](../mockups/README.md)) |

## 1. 서비스 개요 (참고)

[`JRN-session-creation`](./JRN-session-creation.md#1-서비스-개요-참고)과 동일. 가치 정의는 [`../values.md`](../values.md).

## 2. 여정 정의

**대상 사용자 (페르소나)**
P1 멀티세션 작업자 ([README](./README.md#p1-멀티세션-작업자)).

**진입 맥락**
세션을 여러 개 갖고 있고, 그중 몇 개는 한동안 손대지 않아 상태가 제각각이다(`active`/`idle`/`snapshot`).

**트리거**
맥락 전환. 빌드를 걸어놓고 다른 작업을 보러 가거나, 리뷰 요청을 받고 잠깐 다른 세션을 열어야 한다.

**사용자 목표**
"어느 세션이 지금 살아 있는지"를 계산하지 않고, 아무거나 골라 바로 이어서 일하는 것.

**완료 기준**
서로 다른 세션 두 개를 오간 뒤, **두 세션 모두에서 전환 직전 상태 그대로 작업이 이어진다**.

## 3. 단계별 상세

> 단계 식별자는 순번이 아닌 슬러그다. 순서가 바뀌어도 식별자는 유지한다.

### `STP-session-list` 내 세션들을 훑어본다

- **사용자 행동**: 보유한 세션과 각 상태를 한 화면에서 확인하고 들어갈 세션을 고른다.
- **터치포인트**: 세션 목록 화면 — 이름·워크로드 타입 태그·상태 배지 (mockup `index.html`)
- **생각·감정**: "아까 그 빌드 돌던 게 어느 거였지?" — 이름과 최근 활동으로 식별한다.
- **페인포인트 / 이탈 위험**: 세션이 늘어나면 이름만으로 구분이 안 되고, 상태 배지의 의미가 불분명하면
  `snapshot` 세션을 죽은 것으로 오해해 새로 만든다 → 마지막 활동 시각과 타입을 함께 보여주고,
  상태를 "다시 열 수 있음/없음" 관점의 문구로 설명한다.
- **관련 AC**: 전용 AC 없음 — [README 미해결 항목](./README.md#-열린-결정) 참고

### `STP-switch-away` 다른 세션으로 옮겨간다

- **사용자 행동**: 작업 중이던 세션 A를 두고 세션 B로 이동한다. A를 정리하거나 저장하는 절차는 밟지 않는다.
- **터치포인트**: 목록 ↔ 워크스페이스 네비게이션 (mockup `index.html` ↔ `workspace.html` / `agent-workspace.html`)
- **생각·감정**: "그냥 나가도 되나?" — 저장 버튼을 찾게 되면 이미 설계가 진 것이다.
- **페인포인트 / 이탈 위험**: 떠나기 전에 확인 절차를 요구하면 전환 비용이 생겨 세션을 덜 쓰게 된다
  → 떠나는 데 아무 절차도 두지 않고, A의 실행 중인 작업이 계속 돈다는 사실만 알린다.
- **관련 AC**: AC-C4

### `STP-target-activation` 고른 세션이 깨어난다

- **사용자 행동**: B를 연다. B가 이미 `active`면 바로 들어가고, 접혀 있었으면 복원을 기다린 뒤 들어간다.
  작업자가 하는 일은 어느 경우든 똑같다 — 그냥 클릭한다.
- **터치포인트**: 워크스페이스 화면, 접혀 있었다면 복원 안내 화면 (mockup `restore.html`)
- **생각·감정**: "왜 어떤 건 바로 열리고 어떤 건 기다려야 하지?" — 이유를 설명해주면 납득하지만,
  이유 없이 느리면 고장으로 읽는다.
- **페인포인트 / 이탈 위험**: 대상 상태에 따라 진입 경험이 달라지는 것 자체가 V4를 깎는다
  → 상태와 무관하게 같은 입구를 쓰고, 차이는 "복원 중" 표시 하나로만 드러나게 한다.
- **관련 AC**: AC-C4, AC-B2

### `STP-switch-back` 원래 세션으로 돌아온다

- **사용자 행동**: 다시 A로 돌아와 하던 작업을 잇는다. 떠나 있는 동안 A가 접혔을 수도 있다.
- **터치포인트**: 목록 → 워크스페이스 (전용 화면 없음 — [mockups README](../mockups/README.md))
- **생각·감정**: "돌아왔더니 그대로네." — 왕복이 무해하다는 경험이 쌓여야 세션을 마음 편히 늘린다.
- **페인포인트 / 이탈 위험**: 왕복 한 번에 상태가 한 번이라도 어긋나면, 이후로는 세션을 하나만 쓰게 된다
  → 전환은 격리(1 세션 = 1 워크로드 파드)를 깨지 않으며, 왕복 후 동일성은 회귀 테스트로 계속 지킨다.
- **관련 AC**: AC-C4, AC-B3

## 4. 분기·예외 흐름

| 상황 | 처리 | 이어지는 단계 |
|---|---|---|
| 대상 세션이 접혀 있음 | 복원 후 `active`로 전이하고 같은 워크스페이스로 진입 | `STP-target-activation` |
| 대상 세션이 이미 삭제됨 | 없음(404)을 알리고 목록으로 되돌린다. 빈 세션을 새로 만들지 않는다 | `STP-session-list` |
| 전환 중 다른 클라이언트가 같은 세션을 건드림 | 단일 상태로 수렴 | `JRN-concurrent-access`의 `STP-collision` |
| 떠나 있는 동안 A가 유휴 한계 도달 | 자동 동결 후, 돌아올 때 복원 | `JRN-idle-resume`의 `STP-auto-freeze` |
| 세션이 너무 많아 고르기 어려움 | 정리 | `JRN-session-deletion`의 `STP-delete-intent` |

## 5. 측정 지표

| 지표 | 정의 | 목표 |
|---|---|---|
| 전환 성공률 | 전환 후 정상 입력 가능에 도달한 횟수 / 전환 시도 수 | TBD |
| 전환 체감 지연 | 세션 선택 → 입력 가능까지 시간, `active` 대상과 `snapshot` 대상을 나눠 (p50/p95) | TBD |
| 동시 보유 세션 수 | 사용자당 30일 내 접근한 세션 수 중앙값 | TBD (V4 채택 신호) |
| 목록 이탈률 | 목록 진입 후 어떤 세션도 열지 않고 나간 비율 | TBD (식별 실패 신호) |
| 왕복 상태 불일치 | 왕복 후 이전 상태와 다르다는 신고 건수 | TBD (0 유지) |

## 6. 변경 이력

| 버전 | 날짜 | 변경 내용 | 작성자 |
|---|---|---|---|
| v0.1 | 2026-06-18 | 최초 작성 (구 식별자 J3) | 미지정 |
| v0.2 | 2026-08-30 | 전면 재작성 — 슬러그 식별자 전환, 여정 정의·분기·지표·변경 이력 추가. `STP-session-list`의 "PRD에 없음" 경고는 구현 확인으로 해소하고 README 미해결 항목으로 이동 | Claude |
