# 사용자 여정: 다 쓴 세션을 직접 접어두기

## 0. 문서 정보

| 항목 | 내용 |
|---|---|
| 여정 식별자 | `JRN-manual-freeze` |
| 여정명 | 다 쓴 세션을 직접 접어두기 |
| 상태 | 초안 (v0.1) |
| 담당자 | 미지정 |
| 최종 수정일 | 2026-08-30 |
| 달성 가치 | V2 유휴 자원 회수 · V3 끊김 없는 세션 연속성 |
| 연결 문서 | PRD [`lifecycle`](../prd/lifecycle.md)(AC-B1·B2) · [`architecture`](../prd/architecture.md)(AC-A3) · mockup `workspace.html`·`agent-workspace.html`·`restore.html`의 Freeze/Archive now ([매핑](../mockups/README.md)) |

> ⚠️ **신설 배경 (2026-08-30)**: 수동 동결은 화면과 API에 이미 있는데 여정 문서에 없었다.
> 자동 동결(`JRN-idle-resume`)만 문서화돼 있어 **사용자가 스스로 접는 행위**가 어디에도 없었으므로 이 문서를 신설했다.
> 다만 **수동 트리거 전용 AC가 PRD에 없고**, V2의 서술도 "유휴 세션의 자동 회수"만 담고 있다 —
> [README 미해결 항목](./README.md#-열린-결정) 참고.

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

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

## 2. 여정 정의

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

**진입 맥락**
지금 하던 작업이 일단락됐고, 이 세션은 당분간 안 쓸 것이 확실하다. 그렇다고 지우기는 아깝다.

**트리거**
"오늘은 여기까지"라는 판단. 또는 자원을 아껴야 한다는 자각(팀 쿼터, 비용 인식) (가정).

**사용자 목표**
유휴 한계를 기다리지 않고 지금 접어두되, **나중에 그대로 다시 열 수 있다는 확신**을 갖는 것.

**완료 기준**
세션이 `snapshot`으로 전이되고 pod가 회수되며, 세션 목록에 **되살릴 수 있는 항목으로 남아 있다**.

## 3. 단계별 상세

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

### `STP-freeze-decision` 지금 접어두기로 한다

- **사용자 행동**: 작업을 마무리하고, 이 세션을 지울지 접어둘지 판단한다. 접어두기를 고른다.
- **터치포인트**: 워크스페이스의 세션 상태·수명 안내 (mockup `workspace.html` / `agent-workspace.html`)
- **생각·감정**: "지우면 아깝고, 그냥 두면 자원만 잡아먹고." — 중간 선택지가 있다는 걸 알아야 쓴다.
- **페인포인트 / 이탈 위험**: 접어두기라는 선택지가 있는 줄 모르면 그냥 방치하거나(자동 동결까지 대기)
  아까운 세션을 지운다 → 접기와 지우기를 같은 자리에서, 결과 차이(되살릴 수 있음/없음)와 함께 제시한다.
  **전용 화면이 없는 단계**다([mockups README](../mockups/README.md)).
- **관련 AC**: 전용 AC 없음 — 위 신설 배경 참고

### `STP-freeze-now` 지금 접는다

- **사용자 행동**: 접기(쉘은 Freeze now, 에이전트는 Archive now)를 누른다.
  시스템이 세션 상태를 저장하고 `snapshot`으로 전이한 뒤 pod와 자원을 회수한다.
- **터치포인트**: 워크스페이스의 Freeze/Archive now 버튼과 진행 표시 (mockup `workspace.html`·`agent-workspace.html`)
- **생각·감정**: "이거 누르면 없어지는 건 아니지?" — 버튼 이름과 결과가 어긋나면 누르지 못한다.
- **페인포인트 / 이탈 위험**: 삭제와 헷갈리면 아예 쓰지 않는다. 진행 중 표시가 없으면 중복 클릭한다
  → 버튼 문구를 결과 중심으로 쓰고("접어두기 — 나중에 그대로 열립니다"), 진행 중에는 비활성화한다.
  실패하면 세션을 `active` 그대로 되돌리고 사유를 알린다.
- **관련 AC**: AC-B1, AC-A3

### `STP-freeze-confirm` 접힌 것을 확인한다

- **사용자 행동**: 목록으로 돌아와 그 세션이 `snapshot` 상태로 남아 있는 것을 확인한다.
- **터치포인트**: 접기 완료 알림 · 세션 목록의 상태 배지 (mockup `index.html`)
- **생각·감정**: "여기 그대로 있네." — 이 확인이 다음에도 접기를 쓰게 만든다.
- **페인포인트 / 이탈 위험**: 목록에서 사라지거나 흐리게 처리되면 지워진 줄 안다
  → 접힌 세션도 같은 목록에 같은 비중으로 두고, 배지에 "다시 열 수 있음"의 의미를 담는다.
- **관련 AC**: AC-A3

## 4. 분기·예외 흐름

| 상황 | 처리 | 이어지는 단계 |
|---|---|---|
| 접기 실패 | 세션을 `active`로 되돌리고 사유를 표시. 반쯤 접힌 상태를 남기지 않는다 | `STP-freeze-now` |
| 이미 접혀 있는 세션에 접기 요청 | 아무 일도 하지 않고 현재 상태를 알린다 | `STP-freeze-confirm` |
| 접기와 동시에 다른 클라이언트가 접근 | 전이는 한 번만 성공하고 모두 같은 결과를 본다 | `JRN-concurrent-access`의 `STP-collision` |
| 체크포인트 기능이 꺼진 환경 | 접기를 제공하지 않거나 사용 불가(503)로 응답 | `STP-freeze-decision` |
| 접어둔 세션을 다시 씀 | 복원 후 이어서 작업 | `JRN-idle-resume`의 `STP-reaccess` |
| 접는 대신 끝내기로 함 | 되살릴 수 없음을 확인받고 삭제 | `JRN-session-deletion`의 `STP-delete-confirm` |

## 5. 측정 지표

| 지표 | 정의 | 목표 |
|---|---|---|
| 수동 동결 사용률 | 수동으로 접힌 세션 수 / 전체 동결 세션 수(자동 포함) | TBD |
| 접기 성공률 | `snapshot` 도달 수 / 접기 요청 수 | TBD |
| 접기 후 재개율 | 접힌 뒤 7일 내 다시 열린 세션 비율 | TBD (접기 판단의 정확도) |
| 오인 삭제 | 접으려다 삭제한 것으로 보이는 사건 수(삭제 직후 같은 용도 재생성) | TBD (0에 가깝게) |
| 회수 앞당김 효과 | 수동 동결로 절약된 pod·시간 | TBD (V2 효과) |

## 6. 변경 이력

| 버전 | 날짜 | 변경 내용 | 작성자 |
|---|---|---|---|
| v0.1 | 2026-08-30 | 최초 작성 — 구현·mockup에는 있으나 여정에 없던 수동 동결 흐름을 문서화 | Claude |
