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 산출물은 커밋에서 제외했다.
5.5 KiB
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, S4S5 S5 deteriorating으로 전이했고, 단발성 noise
대조군은 S3 watch 뒤 S4on_track으로 복귀해 false alert 승격이 0건이었다. 이 또한 임상적
효과·예후 근거가 아니라 결정 규칙과 원장 연결의 통합 증거다.
재현 명령
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.idUUID를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_report30개 측정이 생성됐다. 각 사례는 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이
소유한다.
실행 metadata와 생성 UUID는
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.py37 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을 확인했다.