# G4/G5 production session-learning caller 실 DB 증거 — 2026-08-07 ## 판정 회기말 ready 평가가 실제 G4 처방과 G5 잠금 후 독립 관찰로 이어지는 production caller 경계를 PostgreSQL에서 검증했다. G4/G5 결과 테이블을 fixture가 직접 쓰지 않고 `session_learning_producer.produce_session_learning_artifacts`와 prediction lock route가 호출하는 `produce_locked_prediction_history`만 사용했다. 검증 fixture는 합성 교육 데이터다. 외부 모델을 호출하지 않았고 실제 수련생의 역량 숙달, 전이, 임상 효과를 주장하지 않는다. ## 재현 명령 ```powershell py -3.11 -X utf8 scripts\smoke-session-learning-producer.py ` --out docs\ops\evidence\session-learning-producer-live-2026-08-07.json ``` 고유한 `dev:e2e` 학습자·교수자와 append-only 원장 행은 재현 가능한 개발 증거로 남긴다. 로그인, 물리 마이크, 외부 provider, 배포는 사용하지 않는다. ## 실제 실행 경계 1. 실제 P1 회기를 만들고 counselor/client 발화를 `session_persistence.append_turn`으로 저장해 durable turn UUID 두 개를 확보했다. 2. counselor 턴의 fast 평가에는 `reflection` intent deviation을, 회기말 평가에는 같은 competency의 `status=ready`, `scope=session_end` deep 판정을 production persistence로 저장했다. 3. prediction lock 전 `produce_session_learning_artifacts`를 직접 호출했다. G4는 prescription/card를 생성했고 G5는 `locked_prediction_missing`으로 차단됐으며 observation은 0건이었다. 4. production prediction revision/lock route를 호출했다. lock route의 `produce_locked_prediction_history` callback이 잠긴 competency와 ready 평가를 결합해 failed 독립 관찰과 audit model-run을 생성했다. 5. caller를 다시 호출했다. G4는 같은 deterministic submission/card를 `idempotent_replay=true`로 반환했고, G5는 이미 관찰된 history를 다시 소비하지 않아 모든 행 수가 그대로였다. ## PostgreSQL 결과 - source: 종료 회기 1개, durable turn 2개, ready session evaluation 1개, intent-deviation supervisor comment 1개. - G4: submission/card/prescription/snapshot/curriculum decision 각 1개. card와 prescription은 두 durable turn UUID를 모두 참조한다. - G4 graph: 모든 competency band가 `unassessed`, attempt 합계 0, episode/attempt 0이다. 생성 처방은 `scenario_novelty=familiar`이며 unseen transfer를 주장하지 않는다. - G5: prediction history/revision/lock/failed observation 각 1개. 잠금 전 observation 0, 잠금 뒤 1이다. - G5 observation: `status=failed`, `source_kind=model_inferred`, `perspective=independent_observer`; 두 durable turn UUID와 counterevidence를 보존한다. - model-run: 1개이며 counselor turn UUID, session UUID, evaluator role, `session-learning-producer-v1`, input evidence hash에 연결된다. metadata의 `auto_mastery`와 `auto_transfer`는 모두 false다. - 자동 승격 금지: mastered episode, transfer-verified snapshot, passed observation, transfer trial/assessment, drift report, calibration assessment/suite는 모두 0건이다. - learner/teacher read projection은 G4 처방 1개·episode 0개, G5 history 1개·failed observation 1개로 일치했고 `clinical_claim_allowed=false`를 유지했다. 실행 UUID와 row-count 증거는 [`evidence/session-learning-producer-live-2026-08-07.json`](./evidence/session-learning-producer-live-2026-08-07.json)에 보존한다. 축어록 본문과 원시 평가 문장은 결과 JSON에 포함하지 않는다. ## 회귀 - G4/G5 caller·core·store focused: **100 passed**. - 전체 API: **855 passed**. - Ruff, `py_compile`, 실제 PostgreSQL smoke, dashboard SSOT checker 통과. ## 증거 범위 이 smoke는 ready 평가·durable turn·prediction lock에서 G4/G5 production caller와 원장/read projection까지의 연결을 증명한다. 외부 evaluator provider의 판단 품질, 실제 수련생 효과, mastery, unseen transfer, 공개 배포를 증명하지 않는다.