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 산출물은 커밋에서 제외했다.
85 lines
5.5 KiB
Markdown
85 lines
5.5 KiB
Markdown
# 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을 확인했다.
|