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,68 @@
# G6 원장 파생 프로듀서 증거 — 2026-08-07
## 판정
- G6의 attention queue와 curriculum gap은 더 이상 호출자가 계산한 JSON만 받는
control-plane에 머물지 않는다.
- API 프로세스가 G0~G5 append-only 원장을 직접 읽고, 코호트별 파생 cycle을 기동 시점부터
1시간 간격으로 반복한다.
- Phase 3 manifest는 alliance/rupture/transfer/calibration 네 도메인에 실제 행이 모두 있을 때만
생성한다. 한 도메인이라도 비면 manifest를 만들지 않는다.
- 원문 발화는 읽거나 복제하지 않으며 모든 산출물은 `clinical_claim_allowed=false`다.
## 구현
- `apps/api/app/services/supervision_research_producer.py`
- outcome trajectory의 `off_track`/`deteriorating`
- 최신 미해결 rupture 상태
- 동일 역량의 연속 2회 `overconfident`
- 실제 transfer assessment 실패
- 동일 역량의 연속 2회 `needs_retry`
를 원장 포인터가 있는 attention signal로 파생한다.
- 같은 signal 집합은 결정적 UUID를 사용해 attention snapshot과 curriculum gap에 idempotent하게
투영한다.
- 네 evidence domain의 실제 event ID 집합을 해시해 Phase 3 artifact와 source pointer를 만든다.
- `/internal/supervision-research/derive-cycle`은 호출자가 `cohort_id`만 지정할 수 있다. 계산된
signal/gap/manifest 입력은 받지 않는다.
- API lifespan은 G6 schema contract가 준비된 경우에만 주기 프로듀서를 시작하고 종료 시 취소한다.
## 검증
### 자동 테스트
- 명령: `python -X utf8 -m pytest app/test_supervision_research_producer.py app/test_supervision_research.py app/test_supervision_research_store.py -q`
- 결과: `31 passed`
- Ruff: 변경 G6 service/route/test와 main/config `All checks passed`
- OpenAPI: `/internal/supervision-research/derive-cycle` 노출 확인
### 실제 개발 PostgreSQL
- 전체 활성 코호트 cycle: `cohort_count=2`, `completed=2`, `failed=0`
- `e2e-hanshin`에서 새로 저장된 attention snapshot:
- `snapshot_id=c759dd44-8ed7-52a1-82c5-c7cc9b76896e`
- `item_count=5`
- 같은 cycle에서 저장된 curriculum gap:
- `07118660-025f-56f0-8095-c4efa102d44e`
- `competency.empathy.reflection`, `growth_stagnation`, 학습자 1명, `monitoring`
- `59c633e8-999a-57df-be58-ca15267c5fa2`
- `competency.rupture_repair`, `rupture_repair`, 학습자 4명, `observed`
- 실제 내부 HTTP 재실행:
- HTTP `201`
- 파생 signal `7`
- attention snapshot `idempotent_replay=true`
- curriculum gap `2`, 모두 `idempotent_replay=true`
- `raw_transcript_included=false`
- `clinical_claim_allowed=false`
- 네 도메인이 모두 충족되지 않아 새 Phase 3 manifest는 생성하지 않음
## 2026-08-07 후속 종료 증거
repo-approved synthetic baseline/candidate와 실제 measurement anchor를 자동 비교하는 evaluator job도
같은 주기 producer에 연결했다. first append는 batch 2·drift report 1·subgroup metric 2를 저장했고,
replay 중복은 0이었다. 6개 cohort periodic cycle과 별도 research 트랜잭션이 모두 성공했으며,
비교 실패가 기존 cohort 결과를 롤백하지 않는 것도 검증했다. 상세는
`docs/ops/outcome-os-g6-version-comparison-producer-evidence-2026-08-07.md`가 소유한다.
이로써 G6 내부 종료 게이트는 닫는다. 모든 실제 코호트에서 네 evidence domain이 채워지는 시점의
Phase 3 manifest 누적량과 교수자 UI 주기 갱신은 운영 모니터링 항목이며, 합성 버전 비교를 실제 학생
성과나 임상적 유효성으로 확대 해석하지 않는다.