/* ===================================================================== SessionReview 더미(mock) 데이터. ⚠️ 전부 mock — 실제 백엔드 연동 전, 화면이 살아있게 채우는 용도. 백엔드 계약(SessionEndResponse/digest)이 붙으면 이 파일을 교체한다. 톤(§5.7): 점수/등급/합불 없음 → 성장 신호·한줄요약·기법분포·잘한순간·개선점. ===================================================================== */ /** 상담 기법 군집 (taxonomy 군집 기반: 관계/탐색/개입/안정/구조화). */ export type TechniqueKind = | "empathy" // 관계 — 공감/반영적 경청 | "explore" // 탐색 — 개방형 질문 | "reflect" // 탐색 — 반영 | "confront" // 개입 — 직면 | "closed"; // 살펴볼 점 — 닫힌 질문 export interface Technique { kind: TechniqueKind; /** 칩에 표시할 라벨 */ label: string; } export type Speaker = "learner" | "client"; export type NoteAuthor = "ai" | "instructor"; export interface SupervisorNote { /** ai = 자동 코멘트, instructor = 교수자 직접 */ author: NoteAuthor; /** good(잘한 점) → accent-tint, watch(살펴볼 점) → warn-tint */ tone: "good" | "watch"; title: string; /** 본문. quote 부분은 컴포넌트가 italic 강조 */ body: string; /** 인용 대안 발화(있으면 italic 강조 블록) */ quote?: string; } export interface Turn { id: string; /** "MM:SS" 또는 "M:SS" */ ts: string; speaker: Speaker; /** 화자 표기 (예: "나 (학습자)", "서연 (내담자)") */ who: string; text: string; /** 학습자 발화에만: 감지된 기법 라벨(0~2개) */ techniques?: Technique[]; /** 인라인 슈퍼바이저 노트(있으면 발화 아래 들여쓴 콜아웃) */ note?: SupervisorNote; } export interface PhaseSegment { key: "rapport" | "explore" | "intervene" | "closing"; label: string; /** 소요 비례 가중치(flex) */ weight: number; } export interface ValencePoint { /** 0~1 정규화 시간축 위치 */ t: number; /** -1 ~ +1 정서가(valence) */ v: number; } export interface RubricRow { name: string; /** taxonomy 군집 라벨 (관계/탐색/개입/안정/구조화) */ cluster: string; /** 0~1 — 빈도+적절성 종합(점수 아님, 막대 길이) */ ratio: number; /** good = 충분/적절, watch = 과다·과소(살펴볼 점) */ quality: "good" | "watch"; /** 빈도 메타 (예: "8회 · 적절") */ freq: string; } export interface GrowthPoint { title: string; body: string; /** 연결된 타임라인 발화 id(클릭 점프) */ jumpTo?: string; } export interface SessionReviewData { client: { name: string; initial: string; persona: string; }; date: string; // 표시용 한국어 durationLabel: string; /** 진행 단계 신호 (성장 신호 톤 — 점수 아님) */ reachedPhase: string; /** SESSION 칸 — 성장 신호 (점수 금지) */ sessionSignal: string; /** SUPERVISOR 칸 — 검토 상태 */ supervisorState: string; supervisorName: string; /** 한 줄 요약. hl 토큰()으로 accent 강조 구간 표시 */ summary: string; phases: PhaseSegment[]; /** 단계 막대 시간축 라벨 */ phaseAxis: string[]; valenceAxis: string[]; clientValence: ValencePoint[]; counselorBaseline: ValencePoint[]; turns: Turn[]; rubric: RubricRow[]; goodMoments: GrowthPoint[]; growthPoints: GrowthPoint[]; nextLine: string; /** AI 내담자 피드백 (italic 1인칭) */ clientFeedback: string; } export const MOCK_REVIEW: SessionReviewData = { client: { name: "서연", initial: "서", persona: "17세 · 우울 호소 청소년", }, date: "2026-06-25", durationLabel: "32분 14초", reachedPhase: "탐색 단계까지 진행", sessionSignal: "라포 형성 신호 뚜렷", supervisorState: "검토 대기", supervisorName: "김", summary: "라포는 안정적으로 형성됐어요. 다만 탐색 단계에서 닫힌 질문이 몇 차례 반복되면서, 서연이 막 열기 시작한 자기개방이 잠깐씩 멈췄습니다.", phases: [ { key: "rapport", label: "라포 형성", weight: 1.4 }, { key: "explore", label: "탐색", weight: 2.6 }, { key: "intervene", label: "개입", weight: 1.0 }, { key: "closing", label: "정리", weight: 0.8 }, ], phaseAxis: ["00:00", "09:12", "24:30", "32:14"], valenceAxis: ["0분", "8분", "16분", "24분", "32분"], // 내담자 valence: 위축(낮음) → 자기개방 들어가며 완만히 상승, 닫힌 질문 구간(16~17분) 잠깐 하강 → 회복 clientValence: [ { t: 0.0, v: -0.55 }, { t: 0.12, v: -0.4 }, { t: 0.24, v: -0.18 }, { t: 0.36, v: 0.05 }, { t: 0.5, v: -0.32 }, // 닫힌 질문 구간 위축 { t: 0.62, v: -0.1 }, { t: 0.76, v: 0.18 }, { t: 0.9, v: 0.28 }, { t: 1.0, v: 0.22 }, ], // 상담자 baseline: 안정적 중립 톤 유지(점선) counselorBaseline: [ { t: 0.0, v: 0.1 }, { t: 0.18, v: 0.16 }, { t: 0.36, v: 0.12 }, { t: 0.5, v: 0.18 }, { t: 0.64, v: 0.14 }, { t: 0.8, v: 0.2 }, { t: 1.0, v: 0.16 }, ], turns: [ { id: "t1", ts: "10:42", speaker: "learner", who: "나 (학습자)", text: "학교에 가는 게 많이 버겁게 느껴지는 것 같아요. 혹시 어떤 순간이 가장 힘든지 조금 더 들려줄 수 있을까요?", techniques: [{ kind: "explore", label: "탐색 · 개방형 질문" }], note: { author: "instructor", tone: "good", title: "잘한 점", body: '서연이 먼저 꺼내기 어려워하던 지점을 압박 없이 열어줬어요. 시간 여유를 둔 표현("조금 더")이 안전감을 만들었습니다.', }, }, { id: "t2", ts: "11:05", speaker: "client", who: "서연 (내담자)", text: "아침에… 눈을 뜨면요. 그냥 천장만 보고 있어요. 일어나야 하는 건 아는데, 몸이 안 움직여요. 그게 제일… 무서워요.", }, { id: "t3", ts: "11:28", speaker: "learner", who: "나 (학습자)", text: "눈을 떠도 몸이 따라주지 않는 그 무력감이, 무섭게까지 느껴지는군요.", techniques: [{ kind: "empathy", label: "공감 · 반영적 경청" }], note: { author: "ai", tone: "good", title: "잘한 점", body: '내담자의 단어("무서워요")를 그대로 반영하며 감정의 강도까지 받아냈어요. 직후 서연의 자기개방이 한 단계 깊어졌습니다.', }, }, { id: "t4", ts: "16:54", speaker: "learner", who: "나 (학습자)", text: "그럼 학교는 그냥 가기 싫은 거예요?", techniques: [{ kind: "closed", label: "닫힌 질문" }], note: { author: "instructor", tone: "watch", title: "살펴볼 점", body: "'예/아니오'로 닫히는 질문이라 서연이 \"그런 건 아니고요…\" 하고 짧게 답했어요. 같은 의도를", quote: '"학교를 떠올리면 어떤 마음이 먼저 드는지 들려줄래요?" 처럼 열어두면 자기개방이 이어졌을 거예요.', }, }, { id: "t5", ts: "17:10", speaker: "client", who: "서연 (내담자)", text: "…그런 건 아니고요. 그냥… 모르겠어요.", }, { id: "t6", ts: "21:36", speaker: "learner", who: "나 (학습자)", text: "방금 잠깐 말문이 막혔던 것 같아요. 괜찮아요, 천천히 해도 돼요. 요즘 친구들과 함께 있을 때는 어떤 느낌이 드는지 궁금해요.", techniques: [ { kind: "reflect", label: "반영" }, { kind: "explore", label: "탐색" }, ], note: { author: "ai", tone: "good", title: "잘한 점", body: "닫힌 질문 뒤 위축을 알아채고 페이스를 늦춘 회복이 좋았어요. 곧바로 열린 질문으로 전환해 대화가 다시 흐르기 시작했습니다.", }, }, ], rubric: [ { name: "반영적 경청", cluster: "관계", ratio: 0.82, quality: "good", freq: "6회 · 적절", }, { name: "공감 · 타당화", cluster: "관계", ratio: 0.74, quality: "good", freq: "5회 · 적절", }, { name: "개방형 질문", cluster: "탐색", ratio: 0.48, quality: "watch", freq: "3회 · 더 늘려보기", }, { name: "닫힌 질문", cluster: "탐색", ratio: 0.58, quality: "watch", freq: "5회 · 다소 잦음", }, { name: "침묵 견디기", cluster: "안정", ratio: 0.66, quality: "good", freq: "여백 활용 양호", }, ], goodMoments: [ { title: "감정을 그대로 받아낸 반영", body: "서연의 표현을 빌려 무력감을 비춰줬고, 직후 자기개방이 깊어졌어요.", jumpTo: "t3", }, { title: "위축을 알아챈 회복", body: "닫힌 질문 뒤 멈춤을 감지하고 페이스를 늦춰 안전감을 되찾았어요.", jumpTo: "t6", }, ], growthPoints: [ { title: "닫힌 질문을 열어두기", body: "탐색 단계에서 '예/아니오' 질문이 몇 차례 반복됐어요. 의도는 같아도 열린 형태로 바꿔보면 좋겠어요.", jumpTo: "t4", }, { title: "침묵을 조금 더 견디기", body: "서연이 망설일 때 바로 다음 질문을 채우기보다, 잠깐의 여백을 두면 스스로 더 말할 공간이 생겨요.", }, { title: "감정 단어를 함께 명명하기", body: '"무섭다"처럼 등장한 감정 단어를 다음 회기에서 조금 더 풀어 물으면 자기이해가 깊어집니다.', }, ], nextLine: '"그 마음을 떠올리면, 가장 먼저 어떤 장면이 생각나는지 들려줄래요?"', clientFeedback: "선생님이 제 말을 진짜로 들어준다는 느낌이 들 때가 있었어요. 근데 중간에 '학교 가기 싫은 거냐'고 물었을 땐… 제 마음이 그렇게 단순하진 않은데, 하고 살짝 멈칫했어요. 그냥 그때 얼마나 막막했는지를 먼저 알아줬으면 했어요.", };