# G2 Longitudinal Outcome Trajectory 실통합 증거 — 2026-08-06 ## 판정 G2 종료 게이트를 통과했다. 교육용 합성 기대 궤적과 세 개 독립 축을 실제 5회기 case에 연결했고, 누락·불확실성·safety·관계 기억을 총점으로 합산하지 않는 계약을 API·DB·브라우저에서 확인했다. 이 결과는 실제 임상 규준, 치료 효과, 진단 또는 예후 주장이 아니다. 2026-08-07 보강 검증은 기존 실제 DB의 `on_track` 단일 사례 공백을 닫았다. 별도 합성 교육 fixture 두 개를 각각 실제 5회기와 15개 `measurement_event`로 만들고 production 측정 producer→store→trajectory evaluator 경계를 통과시켰다. 악화 사례는 S3 `off_track`, S4~S5 `deteriorating`으로 전이했고, 단발성 noise 대조군은 S3 `watch` 뒤 S4~S5 `on_track`으로 복귀해 false alert 승격이 0건이었다. 이 또한 임상적 효과·예후 근거가 아니라 결정 규칙과 원장 연결의 통합 증거다. ## 재현 명령 ```powershell py -3.11 -X utf8 scripts\smoke-outcome-trajectory-api.py ` --api-base-url http://127.0.0.1:8005 ` --out docs\ops\evidence\outcome-trajectory-live-five-session-2026-08-06.json py -3.11 -X utf8 scripts\smoke-outcome-trajectory-alerts.py ` --out docs\ops\evidence\outcome-trajectory-alerts-live-2026-08-07.json ``` 스모크는 고유한 dev/E2E 학습자·교수자 fixture를 만들고 삭제하지 않는다. 쿠키·자격증명·전자우편 주소· 축어록 본문은 출력하지 않는다. ## 실제 HTTP·DB 결과 - 한 case에서 `session_no=1..5`가 연속됐고 각 회기 종료 후 세 축 자기보고를 append했다. - 최종 읽기 모델은 `5회기 × 3축 = 15`개 observed evidence를 보존했고 모든 합성 on-track fixture를 `on_track`으로 분류했다. - `distress_load`, `daily_functioning`, `learning_engagement`는 독립 축이며 total/overall score는 없다. - 동일 `submission_id`와 동일 payload 재시도는 같은 3개 measurement ID를 반환했다. 같은 ID의 변경 payload는 HTTP 409로 거부됐다. - 회기 리뷰는 화면 anchor `t1`과 별도로 실제 `app.turns.id` UUID를 `turn_id`로 노출했고, 측정·관계 원장은 UUID evidence FK만 사용했다. - 같은 cohort 교수자는 5회기 궤적과 supervisor 관계 요약을 읽었다. 다른 학습자와 다른 cohort 교수자는 HTTP 404로 차단됐다. - 관계 메모리는 counselor/supervisor별 문장을 따로 저장·투영했으며 다른 역할의 summary map은 응답에 없었다. - synthetic arc는 15개 기대분포, `data_classification=synthetic_educational`, `clinical_claim_allowed=false`를 함께 반환했다. ## 실제 악화·단발성 noise DB 보강 결과 — 2026-08-07 - 로그인·HTTP fixture나 trajectory 결과 직접 삽입 없이 production `create_outcome_observations`→`submit_outcome_observations` 경계를 호출했다. 이 경계가 실제 `app.measurement_event`를 쓰고 evaluator를 실행해 immutable revision/observation을 만든다. - 악화 사례의 session 상태는 `on_track → on_track → off_track → deteriorating → deteriorating`이었다. S4 악화 축에는 직전 회기 대비 adverse-z 변화와 다음 확인 질문이 함께 투영됐다. - noisy control은 `on_track → on_track → watch → on_track → on_track`이었다. S3에는 `inside_off_track_threshold`, `deviation_not_yet_sustained` 반대근거가 남았고 `off_track`/`deteriorating` 승격은 0건이었다. - 두 사례의 실제 10회기에서 `learner_reported`/`learner_self_report` 30개 측정이 생성됐다. 각 사례는 revision 1~5와 supersession 4개를 보존했고, 최신 revision의 30개 observation snapshot은 원본 측정 30개를 빠짐없이 참조했다. - 같은 cohort learner/teacher 읽기 모델은 동일한 최신 revision과 상태를 투영했다. 측정 metadata와 응답은 `clinical_claim_allowed=false`를 유지했다. - 결과 JSON에는 fixture 원점수를 복사하지 않고 UUID, 상태 전이, provenance 집계만 보존했다. 보강 실행 증거는 [`evidence/outcome-trajectory-alerts-live-2026-08-07.json`](./evidence/outcome-trajectory-alerts-live-2026-08-07.json)이 소유한다. 실행 metadata와 생성 UUID는 [`evidence/outcome-trajectory-live-five-session-2026-08-06.json`](./evidence/outcome-trajectory-live-five-session-2026-08-06.json)에 보존한다. ## 자동 회귀 - G2 contract/store/schema와 G3 통합 focused backend: **90 passed**. - durable review turn UUID 회귀: `test_session_turn_persistence.py` **37 passed**. - Outcome Trajectory desktop/mobile 및 학습자 check-in: **12/12 passed**. - Alliance Pulse + 기존 Session Review desktop/mobile 회귀: **15/15 passed**. - OpenAPI 생성 계약, API type check, web typecheck 통과. - 2026-08-07 G2 focused contract/schema/store: **40 passed**. 새 smoke Ruff·`py_compile`·실제 PostgreSQL 검증을 통과했다. 동시 G8 변경 수렴 뒤 전체 API도 **855 passed**를 통과했다. ## UI 인수 기준 회기 리뷰는 1~5회기 타임라인, 세 축의 방향·상태·불확실성·근거·반대근거, 다음 확인 질문, safety 별도 영역, 역할 안전 관계 기억을 한 작업대에서 제공한다. 학습자는 최신 종료 회기에만 축별 상태와 확신도를 제출할 수 있고, 오류 재시도 동안 submission ID를 유지하며 성공 응답으로 즉시 궤적을 갱신한다. desktop/mobile에서 키보드 조작, 근거 장면 이동, 중복 제출 차단, 가로 overflow 0을 확인했다.