vignette/docs/ops/outcome-os-g7-external-proof-readiness-2026-08-07.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

4.8 KiB

G7 external proof readiness — 2026-08-07

판정

G7은 계속 BUILD다. 이번 변경은 물리 마이크나 운영 Deepgram을 사용한 실증이 아니라, 외부 증거가 들어왔을 때 synthetic·preflight·짧은 probe로 잘못 닫히지 않도록 종료 게이트를 실행 가능한 네 artifact 계약으로 만든 것이다.

이번에 닫은 내부 범위

  • Session의 첫 음성 사용은 인앱 설명과 명시 동의를 요구한다. 서버의 30일·원음 미보존 동의 원장 기록이 성공하기 전에는 getUserMedia/voice/ws를 시작하지 않는다. 거절·원장 실패·지연 권한 응답·일시정지·회기 전환은 텍스트 대안을 유지하고, 뒤늦게 도착한 MediaStream의 track을 즉시 종료한다. 숨은 Space 단축키는 제거하고 안내 가능한 Alt+M만 남겼다.
  • public WSS runner v4는 매 turn마다 interim 1개 이상과 speech-final 정확히 1개를 요구하고, 첫 interim·speech-final latency와 전체 합계를 metadata-only evidence에 기록한다. 장치 열거와 캡처는 --confirm-physical-capture 없이는 시작하지 않는다.
  • /admin/voice-runtime은 단일 API worker의 process RSS/peak RSS/CPU/thread/FD와 WebSocket, provider session, route audio buffer, streaming event queue, overflow/fallback/error high-water를 인증된 관리자에게만 반환한다. 원음·축어록·session ID·provider payload는 저장하지 않는다. production Docker Uvicorn WebSocket ingress queue는 --ws-max-queue 4로 고정했다.
  • Linux topology sampler는 exact Compose project/service, container ID, image digest, init PID, start/restart, cgroup path를 매 sample 전후 재검증한다. cgroup v2, /proc, parsed Docker stats, endpoint를 폐기한 host TCP queue/retransmit의 50분 high-water를 만들 수 있다.
  • 누적 high-water를 이번 실행의 부하로 오인하지 않도록 API worker와 대상 container는 증거 시작 120초 이내에 새로 시작된 동일 인스턴스여야 한다. checker가 시작 시각, PID/container ID와 네 artifact의 겹치는 시간창을 함께 묶어 이 조건을 fail-closed로 검증한다.
  • 독립 human-labeled held-out voice-gain 계약은 raw audio·transcript·synthetic pack을 거부하고, 사전등록·동의·participant split·model artifact·blind independent labeler provenance를 요구한다. production gate는 30명/50회기/150 paired axis, ICC(A,1) 0.75, 선택적 κ 0.70, gain 0.01, participant-cluster bootstrap 10,000회의 95% CI lower > 0을 재계산한다.
  • scripts/check-g7-external-proof.py는 같은 public host와 겹치는 시간창의 public soak, process-local runtime sampling, pinned topology sampling, independent human-gain pack 네 가지를 모두 통과시켜야 성공한다. G7 release gate는 이 checker 증거가 있을 때만 satisfied-by-validated-g7-proof로 바뀔 수 있다.

검증

  • API voice/G7 focused: 92 passed.
  • external evidence runners/checkers와 release gate contract: 31 passed; Ruff와 py_compile 통과.
  • Web typecheck와 API type contract 통과.
  • voice-success.spec.ts chromium single-run 2/2 통과. 동의 원장 응답을 의도적으로 지연한 동안 getUserMedia=0, voice WebSocket 0을 확인했고, 성공 뒤 각각 정확히 1회였다.
  • 모든 브라우저 음성 테스트는 synthetic MediaStream과 controlled provider만 사용했다. 실제 장치 열거·캡처는 수행하지 않았다.
  • 내부 hardening release SHA a8c27b0aadcb9dacea86c4be5e62e19277b9cc2678ebca51aa02998d2c2d1a0d를 격리 NAS에 승격했다. 첫 clean-candidate 실행은 오래된 동의 fixture를 23/24에서 차단하고 원격을 변경하지 않았으며, 실제 동의 순서로 고친 뒤 24/24·OpenAPI 124·auth 401·G0~G8·NAS browser SSE→DB review를 통과했다. 이 증거에서도 물리 마이크는 사용하지 않았다.

실제 종료 때 필요한 네 artifact

  1. soak-public-voice-websocket.py v4의 운영 Deepgram/OpenAI TTS·authenticated public WSS· 명시 동의 물리 마이크 50분 양방향 passed evidence.
  2. 같은 시간창에 capture-g7-runtime-evidence.py로 얻은 관리자 endpoint worker/Uvicorn queue high-water evidence.
  3. 같은 public host·exact images에 capture-g7-topology-evidence.py로 얻은 50분 cgroup/proc/Docker/TCP high-water evidence. Cloudflare 내부 큐는 직접 관측 가능하다고 주장하지 않고, public runner의 edge RTT/gap/disconnect/TLS/CF-Ray 증거를 별도 경계로 사용한다.
  4. 실제 동의 참가자와 독립 blind labeler로 만든 human held-out voice-gain evidence pack.

네 파일을 check-g7-external-proof.py에 넣어 exit 0과 artifact SHA-256을 얻기 전에는 G7을 DONE으로 표시하지 않는다.