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 산출물은 커밋에서 제외했다.
6.9 KiB
Outcome & Alliance OS 공개 배포 증거 — 2026-08-07
판정
G8 Continuous Improvement와 AOS-011 public/deploy proof는 실제 공개 API·정적 자산·인증 경계·watchdog에서 종료 조건을 통과했다. G7은 공개 WSS transport까지만 확인됐으며, 명시적 사용자 동의가 필요한 물리 마이크와 인증 회기의 50분 장시간 실측이 없어 종료하지 않는다.
배포 입력과 사전 게이트
- base commit:
76d0b9ae9bb11b62af86ccd9a55e798bbedc9e31 - 최초 공개 승격에 사용한 release-only patch: SHA-256
d9ac3c85c219640d14f74e705f766e6e1728464b0e32cc59e13acf8a45934d41, 229 files, 3,350,569 bytes - clean worktree:
D:\workspace\vignette-outcome-release-20260807 - manifest 분류: dirty 257, Outcome 관련 235, mixed 4, 보존 제외 18, 미분류 0
- direct-runtime preflight: 필수 환경키 통과,
current_user=vignette, non-owner app role - 내부 ingestion token 6개: 독립 난수값을 운영 API 환경에 주입했으며 값은 로그·문서·프로세스 인자에 출력하지 않았다.
- 생성 API 타입은 clean worktree에서 공식 생성기로 다시 만들었고 선언된 SHA-256
ba813bb5a16ab4a66e9e167213885ba66a334b1ddd8f945d462c2692d8077af3과 일치했다. Windows checkout의 CRLF 차이는 공식 재생성 후 제거했다.
clean release 검증
| 게이트 | 결과 |
|---|---|
| G0~G8 backend focused | 362 passed, 기존 경고 1건 |
| release/secret/G7 guard unit | 21 passed |
| Ruff | passed |
| TypeScript + API contract + production build | passed |
| 회기·학생 자기주도·G1/G4/G5/G7/G8 desktop/mobile | 126 passed, 의도적 mobile-only 제외 2 |
| layout visual gate | 15/15 passed |
| release manifest | dirty 전건 1회 분류, mixed fail-closed, patch SHA binding passed |
공개 API 증거
2026-08-07 03:07~03:13 KST에 production API 8001을 clean worktree의 app.main:app으로 교체했다.
https://api-vignette.chanpaca.net/health:status=ok,environment=prod,db=true,engine=true,engine_mode=claude_cli- 공개 OpenAPI: 69 paths에서 119 paths로 증가
- G1
/sessions/{session_id}/alliance-pulses: 존재 - G2
/sessions/{session_id}/outcome-trajectory: 존재 - G3
/sessions/{session_id}/ruptures: 존재 - G4
/practice/learners/me: 존재 - G5
/calibration/learners/me: 존재 - G6
/supervision-research/supervision-view: 존재 - G7
/sessions/{session_id}/multimodal-alliance: 존재 - G8
/continuous-improvement: 존재 - 인증 기준선
GET /sessions: 401 - G8 human route
GET /continuous-improvement: 401이며 404가 아님 - Google OAuth
GET /auth/login?provider=google&next=/learn: 302, Google location, state cookie 존재
공개 Web 증거
- Cloudflare Pages production deployment:
3d53dc4b-2cd5-4422-805c-7c6e8a95d1a2 - immutable preview:
https://3d53dc4b.vignette-b1q.pages.dev - custom domain:
https://vignette.chanpaca.net - 두 주소 모두 200이며 entry asset은
/assets/index-C3MqrpyJ.js,/assets/index-BbmNnVmr.css - Codex in-app browser에서 custom domain이
/login으로 렌더되고 Vignette 제품명과 학교 Google 로그인 CTA가 보이는 것을 확인했다.
운영 지속성
VignettePublicRuntimeWatchdog를 clean worktree의 scripts/watch-public-runtime.ps1과 5분 반복으로 재등록했다. 설치 직후 Ready, LastTaskResult=0이며 action·working directory 모두 D:\workspace\vignette-outcome-release-20260807을 가리킨다. 실제 재부팅 복구 smoke는 별도 B2 게이트로 유지한다.
G7 voice hardening 재배포 — 04:31~04:38 KST
최초 공개 승격 기록은 위의 d9ac3c... 입력과 배포 증거로 보존한다. 후속 G7 voice hardening은
base commit은 유지한 채 release-only patch SHA-256
3197805058e39a709897d3408f01f166f693791d400ea20e76d2e599d30002bc
(235 files, 3,534,013 bytes)를 D:\workspace\vignette-outcome-g7-release-20260807에 적용해 배포했다.
배포 뒤 증거 문서와 dashboard를 포함해 다시 만드는 patch는 별도의 post-evidence 검증 산출물이며,
그 새 SHA를 이 시점의 실제 배포 입력으로 확대하지 않는다.
- clean backend 전체:
770 passed, 기존 Starlette 경고 1건 - Web: API contract check, TypeScript typecheck, production build 통과
- production API 8001: PID
46732, CWDD:\workspace\vignette-outcome-g7-release-20260807\apps\api - local/public health:
environment=prod,db=true,engine=true,engine_mode=claude_cli - local/public voice health: STT
openai / gpt-4o-transcribe, batch fallback available, TTSopenai / gpt-4o-mini-tts - 공개 OpenAPI 119 paths, 미인증
GET /sessions401, Google OAuth 302 + state cookie - 공개
wss://api-vignette.chanpaca.net/voice/ws: errornot authenticated뒤 close code1008 - Pages production deployment:
6d7e89d5-a98c-4118-a0a4-fde77e1cc7c8 - immutable preview:
https://6d7e89d5.vignette-b1q.pages.dev - immutable/custom entry:
/assets/index-DZZoYvZq.js, Session JS/assets/Session-CHuKU2Sg.js, Session CSS/assets/Session-DPMJ7ZSw.css - 두 도메인에서 JS/CSS MIME 200과 Session 청크의 AI 생성 음성 고지 문구를 확인했다.
- 최근 production 5세대의 JS/CSS 의존 그래프를 병합해 이전 자산 103개를 보존한 뒤 새 파일 30개를 업로드했다.
- watchdog action·working directory를 새 clean worktree로 재등록하고 실행 직후
Ready,LastTaskResult=0을 확인했다. - 검증용 API 8015는 PID·CWD를 대조한 뒤 종료했고 production 8001과 다른 로컬 런타임은 건드리지 않았다.
현재 운영에는 Deepgram 자격증명이 주입되지 않아 STT가 OpenAI batch provider를 선택한다. 따라서 이번
재배포는 Deepgram live interim/final, authenticated public ready, 물리 마이크 또는 50분 양방향 soak의
증거가 아니며 G7 상태를 DONE으로 바꾸지 않는다.
G7의 남은 외부 게이트와 안전 사건
공개 TLS 1.3/WSS handshake와 비인증 1008 not authenticated 차단은 확인했지만 authenticated ready·양방향 50분 soak는 실행하지 않았다. 실행기는 --confirm-physical-capture 없이는 마이크 캡처 함수 전에 exit 3으로 차단하며 비밀값·session ID·축어록·응답·원음을 증거에 기록하지 않는다.
안전장치 추가 전 G533 물리 마이크가 명시적 사용자 동의 없이 3초씩 두 번 열렸다. 신호는 약 -90 dBFS로 사실상 무음이었고 원음·축어록은 보존하지 않았으며 즉시 추가 캡처를 중단했다. 이 실행은 G7 증거로 인정하지 않는다. 상세 감사 기록은 ops/evidence/g7-external-voice-gate-audit-2026-08-07.json이다.
최종 경계
이 증거로 G8과 AOS-011을 닫는다. AOS-012는 이 문서와 dev_dashboard.html, TODO.md, 현행 백로그를 동기화한 뒤 dashboard/release checker가 green일 때 닫는다. G7은 물리 마이크 사용에 대한 사용자의 명시적 동의와 인증된 공개 50분 실측 전까지 BUILD로 유지한다.