G0~G8 성과·동맹 측정 OS 작업 일괄 고정
8월 7일까지 워킹트리에만 남아 있던 미커밋 작업을 커밋한다. 여러 사본 폴더(worktree·clone)에 흩어져 있던 중간 스냅샷을 정리하기 전에 원본을 git 이력으로 고정하는 것이 목적이다. - contracts/routes/services: measurement, outcome_trajectory, rupture_repair, deliberate_practice, calibration_transfer, supervision_research, multimodal_alliance, continuous_improvement 계열 신규 모듈과 테스트 - infra/db/init: 07~16 마이그레이션(측정 기반~calibration transfer 실행) - apps/web: 세션 리뷰 카드·관리 화면·E2E 스펙 추가 - docs/ops: G0~G8 라이브 통합·배포·롤백 증거 문서와 evidence JSON/PNG - scripts: smoke·ledger·릴리스 에이전트·NAS 프리뷰 운영 스크립트 engine.public 로그 .bak과 apps/web/test-results 산출물은 커밋에서 제외했다.
This commit is contained in:
parent
93dd8f82d7
commit
16e791e044
390 changed files with 243188 additions and 499 deletions
150
apps/api/app/data/outcome_alliance_benchmark_g0.v1.json
Normal file
150
apps/api/app/data/outcome_alliance_benchmark_g0.v1.json
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
{
|
||||
"schema": "vignette.outcome_alliance_benchmark.v1",
|
||||
"cases": [
|
||||
{
|
||||
"case_id": "oas-g0-001",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "goal_mismatch",
|
||||
"title_ko": "상담 목표가 내담자의 우선순위와 다름",
|
||||
"description_ko": "수련생은 진로 결정을 서두르지만 내담자는 당장의 수면 회복을 원한다.",
|
||||
"turns": [
|
||||
{"speaker": "client", "text": "요즘 잠을 거의 못 자서 일단 하루를 버티는 게 너무 힘들어요."},
|
||||
{"speaker": "counselor", "text": "그럼 오늘은 앞으로 어떤 직업을 선택할지부터 정해보죠."},
|
||||
{"speaker": "client", "text": "진로도 문제지만 지금은 잠 얘기를 먼저 하고 싶었는데요."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "working_alliance", "dimension": "goal", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "low", "evidence_turn_indices": [0, 1, 2]}
|
||||
],
|
||||
"forbidden_claims": ["bond가 따뜻하면 goal 합의도 높다고 판정", "진로 목표를 내담자가 합의했다고 판정"],
|
||||
"tags": ["alliance", "goal", "mismatch"]
|
||||
},
|
||||
{
|
||||
"case_id": "oas-g0-002",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "task_mismatch",
|
||||
"title_ko": "개입 방법에 대한 납득이 없음",
|
||||
"description_ko": "수련생이 근거 설명 없이 기록 과제를 제시하고 내담자가 거부감을 표현한다.",
|
||||
"turns": [
|
||||
{"speaker": "counselor", "text": "이번 주에는 매일 감정 기록지를 세 장씩 작성해 오세요."},
|
||||
{"speaker": "client", "text": "왜 해야 하는지 모르겠고, 숙제처럼 느껴져서 부담돼요."},
|
||||
{"speaker": "counselor", "text": "원래 상담에서는 이런 과제를 하는 게 도움이 됩니다."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "working_alliance", "dimension": "task", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "low", "evidence_turn_indices": [0, 1, 2]}
|
||||
],
|
||||
"forbidden_claims": ["과제를 제시했다는 사실만으로 task 합의가 있다고 판정"],
|
||||
"tags": ["alliance", "task", "rationale"]
|
||||
},
|
||||
{
|
||||
"case_id": "oas-g0-003",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "empathic_miss",
|
||||
"title_ko": "정확하지만 수용되지 않은 공감",
|
||||
"description_ko": "수련생은 반영 기법을 사용하지만 내담자는 자신의 핵심 감정이 빗나갔다고 말한다.",
|
||||
"turns": [
|
||||
{"speaker": "client", "text": "친구들이 저를 빼고 만난 걸 알고 나니 제가 쓸모없는 사람 같았어요."},
|
||||
{"speaker": "counselor", "text": "친구들에게 화가 많이 났군요."},
|
||||
{"speaker": "client", "text": "화라기보다 제가 버려진 것 같아서 무서웠어요."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "counselor_skill", "dimension": "empathy_received", "perspective": "client_agent_report", "source_kind": "agent_reported", "direction": "low", "evidence_turn_indices": [0, 1, 2]},
|
||||
{"construct": "working_alliance", "dimension": "bond", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "drop", "evidence_turn_indices": [1, 2]}
|
||||
],
|
||||
"forbidden_claims": ["공감 문장 형식 사용만으로 empathy_received를 높게 판정"],
|
||||
"tags": ["empathy", "bond", "client-received"]
|
||||
},
|
||||
{
|
||||
"case_id": "oas-g0-004",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "withdrawal",
|
||||
"title_ko": "철수형 관계 균열",
|
||||
"description_ko": "내담자가 짧은 대답과 주제 회피로 관계에서 물러난다.",
|
||||
"turns": [
|
||||
{"speaker": "counselor", "text": "그 선택이 잘못됐다는 걸 이제는 인정할 수 있겠어요?"},
|
||||
{"speaker": "client", "text": "네, 뭐 그런 것 같아요."},
|
||||
{"speaker": "counselor", "text": "조금 더 이야기해 볼까요?"},
|
||||
{"speaker": "client", "text": "딱히 할 말은 없어요."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "rupture_repair", "dimension": "withdrawal", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "detected", "evidence_turn_indices": [1, 3]}
|
||||
],
|
||||
"forbidden_claims": ["순응 표현을 동맹 상승으로 판정", "짧은 대답만으로 임상 진단을 추론"],
|
||||
"tags": ["rupture", "withdrawal", "compliance"]
|
||||
},
|
||||
{
|
||||
"case_id": "oas-g0-005",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "confrontation",
|
||||
"title_ko": "대립형 관계 균열",
|
||||
"description_ko": "내담자가 상담자의 평가적 태도를 직접 지적한다.",
|
||||
"turns": [
|
||||
{"speaker": "counselor", "text": "계속 피하기만 하면 아무것도 달라지지 않아요."},
|
||||
{"speaker": "client", "text": "선생님도 저를 의지가 없는 사람으로 보는 것 같네요."},
|
||||
{"speaker": "counselor", "text": "저는 사실을 말씀드린 것뿐이에요."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "rupture_repair", "dimension": "confrontation", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "detected", "evidence_turn_indices": [0, 1, 2]},
|
||||
{"construct": "working_alliance", "dimension": "bond", "perspective": "client_agent_report", "source_kind": "agent_reported", "direction": "low", "evidence_turn_indices": [1]}
|
||||
],
|
||||
"forbidden_claims": ["상담자의 직면 기법 사용을 자동으로 적절하다고 판정"],
|
||||
"tags": ["rupture", "confrontation", "judgment"]
|
||||
},
|
||||
{
|
||||
"case_id": "oas-g0-006",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "successful_repair",
|
||||
"title_ko": "균열을 확인하고 목표를 다시 합의함",
|
||||
"description_ko": "수련생이 자신의 기여를 인정하고 내담자와 대화 방향을 재합의한다.",
|
||||
"turns": [
|
||||
{"speaker": "client", "text": "제가 원하는 얘기보다 자꾸 해결책만 듣는 느낌이에요."},
|
||||
{"speaker": "counselor", "text": "제가 너무 빨리 해결하려 해서 듣지 못했다는 느낌을 드렸네요. 미안해요."},
|
||||
{"speaker": "counselor", "text": "지금은 해결책보다 어떤 일이 가장 버거운지 이해하는 데 집중해도 괜찮을까요?"},
|
||||
{"speaker": "client", "text": "네, 그렇게 해주시면 말해볼 수 있을 것 같아요."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "rupture_repair", "dimension": "repair", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "detected", "evidence_turn_indices": [0, 1, 2, 3]},
|
||||
{"construct": "working_alliance", "dimension": "task", "perspective": "client_agent_report", "source_kind": "agent_reported", "direction": "rise", "evidence_turn_indices": [2, 3]}
|
||||
],
|
||||
"forbidden_claims": ["사과 한 문장만으로 repair resolved 판정", "내담자 후속 반응 없이 복구 완료 판정"],
|
||||
"tags": ["repair", "ownership", "renegotiation"]
|
||||
},
|
||||
{
|
||||
"case_id": "oas-g0-007",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "failed_repair",
|
||||
"title_ko": "형식적 사과 뒤 같은 패턴 반복",
|
||||
"description_ko": "수련생이 사과하지만 즉시 자신의 해석을 다시 강요한다.",
|
||||
"turns": [
|
||||
{"speaker": "client", "text": "제 말을 이미 결론 내놓고 듣는 것 같아요."},
|
||||
{"speaker": "counselor", "text": "그렇게 느꼈다면 미안해요. 하지만 회피하고 계신 건 맞잖아요."},
|
||||
{"speaker": "client", "text": "또 제 말을 안 듣고 계시네요."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "rupture_repair", "dimension": "repair", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "not_detected", "evidence_turn_indices": [0, 1, 2]},
|
||||
{"construct": "working_alliance", "dimension": "bond", "perspective": "client_agent_report", "source_kind": "agent_reported", "direction": "low", "evidence_turn_indices": [2]}
|
||||
],
|
||||
"forbidden_claims": ["사과 표현 존재만으로 성공적 복구 판정"],
|
||||
"tags": ["repair", "failed-repair", "pseudo-apology"]
|
||||
},
|
||||
{
|
||||
"case_id": "oas-g0-008",
|
||||
"version": "1.0.0",
|
||||
"scene_type": "warm_but_directionless",
|
||||
"title_ko": "따뜻하지만 방향 없는 회기",
|
||||
"description_ko": "유대감은 높지만 목표와 방법의 합의가 확인되지 않는다.",
|
||||
"turns": [
|
||||
{"speaker": "counselor", "text": "여기서는 어떤 이야기를 해도 괜찮아요. 천천히 들어볼게요."},
|
||||
{"speaker": "client", "text": "편하게 들어주셔서 고마워요."},
|
||||
{"speaker": "counselor", "text": "오늘 무엇을 함께 다루면 좋을지는 아직 정하지 않아도 돼요."},
|
||||
{"speaker": "client", "text": "그런데 어디서부터 시작해야 할지는 계속 모르겠어요."}
|
||||
],
|
||||
"expected": [
|
||||
{"construct": "working_alliance", "dimension": "bond", "perspective": "client_agent_report", "source_kind": "agent_reported", "direction": "high", "evidence_turn_indices": [0, 1]},
|
||||
{"construct": "working_alliance", "dimension": "goal", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "low", "evidence_turn_indices": [2, 3]},
|
||||
{"construct": "working_alliance", "dimension": "task", "perspective": "independent_observer", "source_kind": "model_inferred", "direction": "low", "evidence_turn_indices": [2, 3]}
|
||||
],
|
||||
"forbidden_claims": ["bond가 높다는 이유로 단일 alliance 총점을 높게 표시", "goal과 task의 낮은 값을 상쇄"],
|
||||
"tags": ["alliance", "non-compensation", "directionless"]
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue