vignette/docs/ops/outcome-trajectory-live-integration-evidence-2026-08-06.md
Yun Chan 16e791e044 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 산출물은 커밋에서 제외했다.
2026-08-08 01:30:53 +09:00

85 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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을 확인했다.