세션 평가·라이브코치·교수자 분석 라운드 마감 + 문서 정리 + 코드품질 리팩터

- 누적 작업트리 커밋: 회기 평가 복구·durable 저장, 라이브 코치 이력/근거, 교수자 학생분석, 음성 비언어 메타, PII 마스킹, 운영 티켓/헬스 등
- 문서: 완료 기록 docs/archive/ 냉동 보관, docs/ 단일 인덱스(docs/README.md)+통합 TODO(docs/TODO.md)로 정리
- 리팩터(행위 보존): Stage enum SSOT(taxonomy 소유·state_machine re-export), store recent/masked_turns 중복 제거, speaker_ko_label 단일 헬퍼, _list_sessions N+1 제거(state/turns 배치 + 턴평가 하이드레이션 배치)
- 검증: 백엔드 pytest 352 passed, _list_sessions E2E chromium-single-run 2 passed
This commit is contained in:
Yun Chan 2026-07-02 02:50:36 +09:00
parent 7c41c3ce79
commit 778e8526d4
108 changed files with 6457 additions and 455 deletions

View file

@ -30,10 +30,11 @@ TAXONOMY_VERSION = "1.0.0" # 라벨 코드 불변 보장 버전. 새 라벨 추
# ════════════════════════════════════════════════════════════════════════════
# 1. 회기 단계 (stage) — 결정론 상태머신이 소유 (MASTERPLAN §2.2)
# 1. 회기 단계 (stage) — 라벨 enum 단일 정의(SoT). 전이 로직은 상태머신 소유(MASTERPLAN §2.2).
# services.state_machine 이 이 Stage 를 re-export 한다(중복 정의 제거).
# ════════════════════════════════════════════════════════════════════════════
class Stage(str, Enum):
"""상담 회기 단계. FastAPI 백엔드가 결정론적으로 전이(LLM 아님)."""
"""상담 회기 단계 라벨(SoT). 결정론 전이는 services.state_machine 이 소유(LLM 아님)."""
RAPPORT = "라포" # 라포 형성 — 안전감·관계 구축, 비밀보장 구조화
EXPLORE = "탐색" # 호소문제·정서·인지·위험요인 탐색
@ -51,6 +52,11 @@ class Speaker(str, Enum):
CLIENT = "client" # 내담자(가상내담자 AI)
def speaker_ko_label(speaker: str | None) -> str:
"""화자 코드 → 프롬프트용 한글 라벨(SoT). counselor→상담자, 그 외→내담자."""
return "상담자" if speaker == Speaker.COUNSELOR.value else "내담자"
# ════════════════════════════════════════════════════════════════════════════
# 3. 기법 군집 (TechniqueCategory) — 위계 상위층
# ════════════════════════════════════════════════════════════════════════════
@ -273,6 +279,7 @@ __all__ = [
"TAXONOMY_VERSION",
"Stage",
"Speaker",
"speaker_ko_label",
"TechniqueCategory",
"Technique",
"TECHNIQUE_CATEGORY",