vignette/docs/ops/session-progress-gauge-design-2026-07-14.md
2026-07-15 21:31:30 +09:00

48 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# P2 회기 계획·달성도 게이지 설계 (1p)
> 2026-07-13 한신대 회의 P2 결정의 구현 설계. 소유자 확인용 1페이지.
> 원칙: 게이지는 **백엔드 결정론 상태머신 수치에서 파생**하며, LLM이 만들지 않는다.
> CCD·정답 라벨·ideation 등 내담자 내부 설정은 계속 비노출(M6). 게이지는 "훈련 진행 신호"만 보여준다.
## 1. 무엇을 보여주나
| 표면 | 내용 |
|---|---|
| 세션 화면(좌측 트랙) | 단계별 누적 게이지 4개 — "라포 100 중 65" 식. 이번 회기 목표 단계에 목표 배지(P1 구현됨) |
| 세션 화면(관찰 패널) | **상세 수치**: 유효 개방도(%), 방어(저항) 수준(%), 라포 누적(%) + 이번 회기 증가분(+N%p) |
| 학습자 홈(페르소나 카드) | 페르소나별 라포 누적 게이지 — 회기가 이어질수록 차오르는 학습 신호 |
**학습 신호 설계 의도(회의 합의)**: 초심 상담자는 라포를 1회기에 못 만드는 게 정상이다.
게이지가 회기를 건너 누적되는 모습 자체가 "여러 회기에 걸쳐 쌓는 것"임을 가르친다.
## 2. 게이지 공식 (결정론)
상태머신(`state_machine.py`)의 기존 수치만 사용한다. 새 상태 없음.
- 단계 전이 조건은 `turns_in_stage >= STAGE_MIN_TURNS[stage]` AND `rapport_credit >= STAGE_ADVANCE_RAPPORT[stage]`.
- **단계 게이지**(stage s):
- 지나온 단계: `100`
- 미래 단계: `0`
- 현재 단계: `min(99, rapport_credit / STAGE_ADVANCE_RAPPORT[s] × 99)` — 라포 누적이 게이지의 본질.
(두 게이트를 모두 충족해 전이 대기 상태면 99에서 대기, 전이 순간 100)
- `정리`(CLOSE)는 진입 자체가 100 (전이 임계 없음)
- **누적성**: `rapport_credit`은 회기 종료 시 ×0.7로 이월(`init_state(carry)`, 기존 구현)되므로
다음 회기 게이지는 0이 아니라 이월분에서 시작한다 → "누적 게이지"가 자동 성립.
- **이번 회기 증가분**: `rapport_credit prev_rapport_credit`(세션 생성 시 저장된 이월 기준값, 기존 컬럼).
- **방어(저항) 수준**: `resistance`(0~1)를 %로. 학습자 표기는 "방어 신호(저항)" — 학술 용어화.
- **유효 개방도**: `effective_openness`(이미 학습자 노출 중인 값)를 %로.
## 3. 계약 변경
- `session_read_model.py``SessionProgress` DTO 신설:
`stages[] {stage, percent, achieved, is_goal}` + `rapport_percent, rapport_delta_percent, resistance_percent, openness_percent`.
- 파생 함수는 순수함수 `build_session_progress(state, prev_rapport_credit, goal_stages)` — 상태머신 상수를 단일 원천으로 읽는다.
- 노출 지점: `SessionDetailResponse.progress`(새로고침 복원), `TurnResponse.progress` + 스트림 `done` payload(턴마다 갱신),
대시보드 `persona_progress[].rapport_percent`(홈 카드).
- **비노출 유지**: ideation_stage, CCD, 정답 라벨, raw resistance 원값 명칭("저항 엔진" 등 내부 용어).
## 4. 비(非)작업 (회의 결정 준수)
- 별도 "치료 계획 탭" 없음 — 계획서·프로토콜은 페르소나 RAG 첨부(`/personas/sources`, 기존 경로)로 흡수.
- 회기 간 망각 기능 없음.
- 페르소나 수치의 전 회기 공유는 기존 carry-over(라포 ×0.7, resistance drift)가 이미 소유 — 변경 없음.