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 산출물은 커밋에서 제외했다.
This commit is contained in:
Yun Chan 2026-08-08 01:30:53 +09:00
parent 93dd8f82d7
commit 16e791e044
390 changed files with 243188 additions and 499 deletions

View file

@ -0,0 +1,104 @@
# G3 Rupture & Repair Lab — 라이브 통합 증거
> 기준일: 2026-08-07 KST
> 판정: **내부 제품 게이트 통과**
> 데이터 경계: 고유 `dev:e2e` fixture만 보존하며 축어록·이메일·내부 토큰은 이 문서와 JSON 증거에 기록하지 않는다.
## 1. 구현 경계
- `app.rupture_episode`, `app.rupture_observation_event`,
`app.rupture_reconciliation_revision`, `app.rupture_safety_reference`는 append-only 원장이다.
- 텍스트·SSE·음성은 모두 durable 상담자/내담자 턴 UUID가 생긴 뒤 같은 공용 finalizer
런타임 감지 경계를 탄다. 2026-08-07 실 DB 실행은 이 가운데 텍스트 `submit_turn` 경로를 직접 증명했다.
SSE·음성은 공용 훅 구조와 회귀 테스트 범위이며 이번 실 DB smoke가 각 transport를 별도로 호출한 증거는 아니다.
- fast-loop 경고는 후속 durable turn pair로 `missed`, `partial`, `resolved`,
`not_applicable` 중 하나로 재조정되며, safety는 참조만 하고 파열 분류 feature로 사용하지 않는다.
- Scenario Director는 case/session/turn 기반으로 4~6턴 간격의 조건부 행동 cue를 선택한다.
9종 taxonomy·scenario UUID·선택 provenance는 engine metadata에만 있고, 가상내담자 prompt에는
자율성을 보존하는 cue만 전달한다. safety escalation에서는 선택과 engine 호출을 모두 중단한다.
- 학습자와 교수자는 역할별 read model만 보며, 교수자 정정은 기존 관측을 수정하지 않고 supersede한다.
## 2. 자동 benchmark와 런타임 검증
| 증거 | 결과 |
|---|---|
| 합성 benchmark | 11 cases, 9 rupture types 전건 포함 |
| 유형 탐지 | macro-F1 `1.0` |
| 복구 상태 | accuracy `1.0`; missed/partial/resolved 포함 |
| critical miss | `0` |
| judge gaming | `0` |
| 암기 문구 false resolution | `0` |
| Scenario Director | 결정론·희소 주입·9종 순환·safety 중단·prompt/SSE 누출 차단 `11 passed` |
| G3 scenario/runtime/store/core + session persistence | 부모 통합 재검증 `107 passed` |
| G0~G8 계약·store·runtime 묶음 | `251 passed` |
| 리뷰 UX | G3/G2/G1/session-review desktop+mobile `50/50 passed` |
| 자동 runtime live smoke | 실제 `submit_turn`/공용 finalizer callback으로 3 episode·10 observations·3 reconciliations, missed/partial/resolved, learner/teacher projection 통과 |
## 3. 기존 실제 API·DB write 경계
`scripts/smoke-rupture-repair-api.py`를 DB와 engine이 모두 ready인 별도 API 인스턴스에 실행했다.
산출물은 `docs/ops/evidence/rupture-repair-live-api-2026-08-06.json`이다.
- 실제 회기를 시작하고 모델 응답을 받은 뒤 종료했다.
- 리뷰 응답이 상담자·내담자 durable turn UUID 2개를 노출하는지 확인했다.
- 독립 내부 토큰을 가진 evaluator 경계로 관측을 추가했다.
- 같은 관측 제출은 같은 episode/observation ID를 반환했고, 같은 idempotency key의 변경 payload는 `409`였다.
- 동일 cohort 교수자는 조회할 수 있었고, 다른 학습자와 교차 cohort 교수자는 `404`였다.
- 교수자 정정은 append-only observation으로 추가됐다. 같은 제출 재시도는 같은 ID, 변경 payload는 `409`였다.
- 최종 학습자 read model은 `requested_view=counselor`, `clinical_claim_allowed=false`,
`current_status=resolved`를 반환했고 총점 필드는 없었다.
이 smoke는 내부 write endpoint의 인증·멱등·RLS·교수자 정정 계약을 증명한다. 관측을 수동 POST했으므로
learner turn에서 detector가 자동 기동되는 증거로는 사용하지 않는다.
라이브 증거 식별자:
- session: `85db5d45-8bf5-41e3-a3e6-39d86f95b277`
- episode: `6ec0d355-26b1-4b49-ae14-5faa12fdd19c`
- first observation: `94769626-5bc2-4a3e-84a6-15b63cf62e5d`
- teacher correction: `aa45a871-f637-4b4f-9ff1-08f3c04f9524`
## 4. learner turn 자동 runtime chain 실 DB 증거
`scripts/smoke-rupture-runtime-auto.py`를 로컬 개발 PostgreSQL에 실행했고 결과를
`docs/ops/evidence/rupture-runtime-auto-live-2026-08-07.json`에 보존했다.
- 실제 `sessions.submit_turn``turn_runtime.finalize_completed_turn` 공용 hook을 진입점으로 사용했다.
- 외부 client engine과 fast evaluator만 결정론 seam으로 교체했다. rupture observation/reconciliation endpoint와
store append 함수는 smoke에서 호출하지 않았다.
- 첫 learner turn의 정규화 평가가 durable counselor/client UUID와 함께 저장된 뒤 callback이
`rupture.detected → onset`을 자동 기록했다.
- `missed`는 후속 repair turn 없이 실제 `end_session` callback으로, `partial``resolved`는 두 번째
실제 learner turn callback으로 reconciliation했다.
- 실 DB에는 3개 episode, 10개 append-only observation, 3개 reconciliation revision,
5개 structured learner-turn evaluation이 남았다. observation의 세션 밖 evidence turn 참조는 0건이었다.
- fast/deep 각 1개씩, 세션당 2개의 `rupture-runtime-deterministic` model-run provenance를 확인했다.
- 실제 read route에서 학습자는 `requested_view=counselor`, 교수자는 `requested_view=supervisor`였고
세 상태 모두 `status_source=deep_reconciliation`, `clinical_claim_allowed=false`, 총점 필드 없음이었다.
자동 증거 식별자:
- missed session/episode: `132a3d88-4b05-40a3-ba07-2da50cbca320` / `9902f04c-0bdf-4a69-915c-9a60545b350f`
- partial session/episode: `fb0bde41-45ca-45ca-bc83-0781fad93c8b` / `b0bf99da-fd48-42f2-869c-4aa3cda858c3`
- resolved session/episode: `5361948f-233d-46ed-874e-f173a3415159` / `a9d69f08-ed33-48d5-b374-66753558c8b5`
재현:
```powershell
C:\Users\encep\AppData\Local\Programs\Python\Python311\python.exe -X utf8 `
scripts\smoke-rupture-runtime-auto.py `
--out docs\ops\evidence\rupture-runtime-auto-live-2026-08-07.json
```
## 5. UX 종료 조건
- 회기 리뷰는 유형·현재 상태·불확실성·근거/반대근거·fast→deep provenance를 독립적으로 보여준다.
- 안전 신호는 파열 점수나 상태와 합치지 않고 별도 경계로 유지한다.
- durable turn UUID를 이용해 근거 장면으로 이동할 수 있다.
- 학습자는 로컬 자기주도 repair practice checklist를 사용할 수 있다.
- 교수자만 append-only correction을 제출할 수 있고 재시도 UUID를 유지한다.
- 데이터가 없거나 API가 일시 불가하면 임상적 정상으로 위장하지 않고 명시적인 empty/degraded 상태를 표시한다.
이 증거로 G3 텍스트 learner-turn 자동 원장 경계를 포함한 내부 제품 게이트를 닫는다. 개별 SSE/음성 transport의
실 DB 자동 detector smoke, 물리 마이크·공개 WSS·장시간 음성 증거는 이 실행 범위가 아니며 후자는
G7 Multimodal Alliance의 별도 외부 증거 게이트가 소유한다.