vignette/docs/ops/backlog-2026-06-26.md
Yun Chan 93dd8f82d7 G8 실제 rollback 증명 종료와 비-secure origin 회기 리뷰 크래시 수정
G8 마지막 게이트인 receipt-bound 실제 image rollback을 격리 NAS
vignette-preview-20260807 에서 실행해 종료했다.

Gate6 계약 정정:
감사 대상 current API 이미지가 com.docker.compose.project/service/version
image label 을 갖고 있어 "helper 의 compose label 0개" 계약은 감사되지 않은
다른 이미지를 쓰지 않는 한 성립하지 않는다. 계약을 key 부재가 아니라
소속(membership) 으로 바꿔 launch-nas-preview-g8-helpers.py 에 구현했다.
image 상속 label 을 baseline 으로 읽고 container 의 모든 compose label 이
baseline 과 같거나 선언된 격리 override 인지 검사하며, 최종 project 는
target 이 아니고 service 는 api/web/db/proxy 가 아니어야 한다. docker run
argv 에 target label 을 주입하면 fake-runner 테스트가 먼저 깨진다 (37/37).

실행 결과:
- rollback-old  receipt nas-g8-723eeef22eab05e63e3fafb0 -> 79ec../c530..
- restore-current receipt nas-g8-2738846cf2cf4fbe8ce0fc26 -> 52e0../6fdb..
- release gate/approval 각 2회 멱등, audit.ci_lifecycle_event rollback/executed 2,
  audit.ci_human_approval_event authorize_rollback 2, silent auto-promotion 0
- HMAC journal 6-record 체인 검증, health 3/3, OpenAPI 126, auth 401, Web 200
- helper 0, listener 0, 비밀 env 파기. down/volume rm/prune 미실행, 공개 런타임 미접촉
- 계획했던 Windows SSH 터널은 NAS sshd 가 direct-tcpip 를 거부해 사용할 수 없어
  sshd 설정 변경 대신 같은 격리 계약의 NAS-side probe 컨테이너로 실행했다

비-secure origin 크래시 수정:
배포된 NAS 프리뷰(평문 HTTP, 비-localhost)에 회기 스펙을 돌려 24건 실패를 확인했고
원인은 하나였다. crypto.randomUUID 는 secure context 전용인데 제품 코드 18곳이
fallback 없이 호출했고 RuptureRepairCard 는 렌더 시점 호출이라 회기 리뷰 라우트
전체가 error boundary 로 떨어졌다. 릴리스 게이트 108/108 은 localhost 후보 스택에서만
돌아 이 경로를 밟은 적이 없다. src/lib/uuid.ts 의 randomUuid() 로 통일하고 fallback 도
crypto.getRandomValues 를 우선 사용해 idempotency key 의 예측 불가능성을 유지했다.
회귀는 insecure-context-uuid.spec.ts 6/6 으로 고정했다(직접 호출 0건 검사 포함).
이 수정은 아직 NAS 에 배포하지 않았다.

검증:
API 898, gateway 58, executor 28, probe 11, helper launcher 37, release agent 21,
ruff clean, web api-types/typecheck/build, SSOT FAIL 0, SSOT unit 5/5,
dashboard E2E 10/10, 학생 폐루프 실 DB 브라우저 4/4(일회용 클론),
crypto 수정 후 기존 스펙 회귀 70/70, 복원된 NAS 실제 브라우저 SSE->DB 리뷰 PASS.

부수 발견(열린 항목):
공개 API 가 engine=false 로 degraded 인데 워치독이 이를 감지하지 못한다. engine 판정이
게이트웨이 /health 의 ok 만 보고 claude readiness probe 를 돌리지 않기 때문이다.
같은 .env 와 같은 CLI 로 새 게이트웨이를 다른 포트에 띄우면 즉시 ready 이므로 상주
프로세스의 세션만 죽은 형태다. TODO A절과 대시보드에 기록했다.

이 커밋은 파일 단위로 담겼다. 위 파일들에는 이전 세션의 미커밋 G0~G8 작업이 함께
들어 있으며, hunk 를 쪼개면 대시보드/체커/TODO 정합성이 깨져 SSOT 체커가 실패한다.
2026-08-07 22:17:20 +09:00

13 KiB

Vignette 백로그 — 열린 항목만 (현행본)

SSOT는 docs/dev_dashboard.html이다. 상태·검증 증거·결정·로드맵의 권위 기준은 대시보드다. 이 파일은 대시보드와 일치하는 아직 열린 작업(외부/환경 게이트) 만 얇게 유지한다. 완료된 작업의 변경 로그·검증 기록(구 "최신 동기화 추가"·"이번 세션에 닫은 것"·B1~B3 [x] 상세)은 docs/archive/ops/backlog-2026-06-26-full-history.md로 냉동 보관했다. 필요할 때만 이력용으로 본다.

운영 원칙: 가짜 증거로 DONE 표기 금지. 실증 불가·외부 의존·소유자 결정 항목만 여기서 추적한다. 분류: B1 비차단 폴리시 · B2 환경 제약(증거 생산 불가) · B3 소유자 결정 · B4 외부 거버넌스

B0. 원천문서 갭 — 한신대 산학협력 원천문서 갭(critical/high/medium)은 SSOT 대시보드 "원천문서 갭 분석" 섹션과 상세 근거 docs/ops/source-docs-gap-analysis-2026-06-26.md에서 추적한다. C1~C3/H·M 구조는 코드로 선제 구축했고, 임상 문안·평가기준·골든셋 콘텐츠는 임상팀(구훈정·어유경) 외부 정의로 받는다.

Outcome & Alliance OS — 2026-08-06 정식 전략 실행 트랙으로 승격했다. G0 Measurement Truth, G1 현재 소스·실행 증거 재감사에서는 G0G6이 internal DONE이다. G1 승격 prompt 1.2+read-skew/JSON 복구는 24/24 ready·방향 9/9·오류 0을 재확인했고, G0 census 29/29·위반 0, G4/G5 실제 API/DB/브라우저 폐루프, G6 safety metadata-only 최우선 runtime을 disposable clone에서 확인했다. G8은 2026-08-07 격리 NAS에서 실제 receipt-bound image rollback 2회(nas-g8-723eeef2…/nas-g8-2738846c…)를 executed lifecycle receipt로 실행해 DONE이다. 과거 clean release/NAS의 route·asset·auth·browser 증거는 배포 존재 이력으로 보존하지만 현재 소스의 완료 증거로 재사용하지 않는다. G7 Multimodal Alliance는 내부 구현 DONE과 외부 proof GATE를 분리하며 Deepgram key·quota live, expected provider/model authenticated public WSS, 명시 동의 물리 마이크·50분 soak, 독립 라벨 voice-gain benchmark와 운영 topology resource high-water를 추적한다. 운영 TTS는 OpenAI API gpt-4o-mini-tts로 고정하고 공식 앱 통합·출력 소유 근거와 AI 생성 음성 고지를 반영했다. G0G8과 AOS-001~012는 docs/TODO.md I절에서 전건 추적하고, 상태는 SSOT 대시보드의 9개 계획 카드가 소유한다. 이 얇은 백로그에는 그중 외부·환경 증거가 필요한 항목만 기존 B2/B4/Phase 3 게이트와 합쳐 유지한다.


B1. 비차단 코스메틱/후속 폴리시

  • 운영 티켓 자동 분류·처리 후속 — Claude Recipe headless 자동 수정 후보, 관리자 승인 후 이슈 등록·PR/작업 스레드 생성, 처리 결과 audit trail 확장은 아직 설계/승인 필요. 담당 그룹 자동 배정·우선순위 escalation·raw/rollup 보존기간 같은 운영 정책은 B3에서 이미 결정됨(수동 승인·미도입 고정). 자동 수정은 운영자 승인 전까지 실행하지 않는다.

B1 완료 항목(학생 리뷰 1~5 척도 320px 반응형 재배치, 셸 구분선, 세션 종료 UX/다크테마, 아바타 SVG 리그 복귀와 래스터 비활성화, SEO/공유 카드, 레이아웃 정렬, 권한 위임, 메일링, 아카이브 API, TTS voice map, 빈상태 레이아웃, 평가 실패 복구 UX, SSE 저장, live-coach 표면화, 음성 메타, 위기 게이트 UI, 운영 티켓/헬스 샘플러 등)의 상세·검증 로그는 아카이브 full-history 참조.


B2. 환경 제약 — 이 워크스테이션에서 증거 생산 불가

  • 공개 DB 계정·회기 복구 안정화 — 2026-08-07 18:26 KST owner 승인으로 recovered named volume을 vignette-dev-db:55432에 전환했다. public owner 집계 users 84, sessions 30, turns 705, Google 계정 16, Google 소유 회기 30, orphan 0이며 health·engine·OAuth·watchdog가 정상이다. 기존 인증 세션은 복사하지 않아 사용자는 Google 재로그인이 필요하다. current dump·old-original dump·전환 직전 rollback container를 모두 보존하며, 실제 사용자의 소유 회기 확인과 자동 백업 운영화 전에는 제거하지 않는다. 상세: docs/ops/public-db-recovery-rehearsal-2026-08-07.md.
  • DB 백업 운영화 — 검증형 one-shot custom dump와 실제 일회용 restore drill은 통과했다. 예약 실행, 실패 알림, NAS/off-host 암호화 복제, restore drill 주기와 보존 정책을 운영 게이트로 남긴다.
  • vnet.18ka.net 공개 live 전환 — 코드/스크립트는 vnet.18ka.net·api-vnet.18ka.net 허용까지 갱신됨. 남은 블로커: (1) vnet.18ka.net/api-vnet.18ka.net DNS A record 부재, (2) cloudflared 현재 인증 컨텍스트가 18ka.net zone이 아니라 chanpaca.net zone에 route dns 생성, (3) Google Console redirect URI https://api-vnet.18ka.net/auth/callback 등록 필요. 현재 prod API 8001은 db:true/engine:true로 건강. 상세: docs/ops/tailscale-vnet-runtime-2026-06-27.md.
  • Compose 패키징용 infra/.env owner-secret fill-in — 현재 production direct-runtime은 서로 다른 G3~G8 내부 토큰 6개, 필수 운영키, DB current_user=vignette non-owner app-role preflight와 공개 health를 통과했다. 향후 Compose 패키징 전환 시 APP_DB_PASSWORD 등 패키징 비밀과 prod-safe engine/voice flags를 별도 주입하고 compose profile preflight를 다시 닫는다.
  • 공개 Google OAuth 실제 /turn proof — 로그인 가능한 계정으로 storageState 캡처 후 E2E_PUBLIC_AUTH=1
    • chromium-public-auth 1회 통과 필요. (소유자 지시로 보류 중.) 실행 명령은 대시보드 "다음 실행 명령" 참조.
  • 음성 캐스케이드 live — 공개 G7 API route와 TLS 1.3 WSS handshake, 비인증 1008 차단, 로컬 synthetic short soak는 통과했다. Deepgram streaming adapter/interim/final/word timestamp, HMAC word pseudonym, streaming 중 1초 동의 재검사, 공통 consent transaction lock, bounded queue/10MiB cap, 텍스트 보존·음성 재연결 UX, ready provider/model 계약은 code/internal 완료다. actual-Postgres 동시 철회는 writer 대기→커밋 뒤 차단과 timeline row 0, synthetic gold benchmark는 text-only 1-MAE 0.9533→multimodal 0.9673을 확인했다. public runner의 preflight는 auth cookie·소유 회기로 WSS ready/ping과 기대 STT/TTS provider/model 네 값을 마이크 열거·캡처 없이 검사한다. full soak는 --confirm-physical-capture 없이는 장치를 열기 전에 exit 3이다. Session 첫 음성 사용은 30일·원음 미보존 서버 동의 원장을 먼저 기록하며, 성공 전 getUserMedia와 voice WebSocket은 0회다. public runner v4의 turn별 interim/speech-final/latency, 관리자 single-worker runtime high-water, exact image/container/cgroup/proc/Docker/TCP topology sampler, 30명/50회기/150축 독립 blind human-held-out voice-gain evaluator와 이를 같은 public host·동시 50분 시간창으로 묶는 canonical checker까지 code/internal 준비를 마쳤다. 운영 TTS는 OpenAI API gpt-4o-mini-tts와 공식 Services Agreement 근거, 회기 전·중 AI 생성 음성 고지로 닫았다. 남은 범위: 실제 Deepgram 운영 key·quota의 live interim/final, 기대값과 일치하는 authenticated public ready, 실행 직전 명시 동의 물리 마이크와 50분 양방향 soak, 독립 라벨 held-out/pilot voice-gain benchmark, 같은 실행의 실제 worker·Uvicorn·OS·Cloudflare edge RSS/CPU/queue high-water. 네 artifact가 scripts/check-g7-external-proof.py exit 0을 만들기 전에는 닫지 않는다. 격리 NAS 프리뷰 http://100.116.83.60:8088은 전용 Compose 프로젝트·포트·네트워크·볼륨에 배포했고, 실제 브라우저 회기와 review API 저장 축어록 2턴을 확인했다. 기존 프로젝트 중단·재생성 명령은 실행하지 않았다. 매일 04:30 KST Vignette 회기 E2E 정기 검증 (automation id vignette-e2e)은 ACTIVE이며 material milestone+release-only patch 결정성·manifest·clean-index·NAS preflight+배포 SHA 변경 때만 프리뷰를 갱신한다. current exact SHA 6030a677af7e87cbfabc422b553d108d53414fd3c446548734a13b036d35c611은 API/Web 새 이미지, 전체 browser E2E 108/108, OpenAPI 126, auth 401, G0~G8, postdeploy browser SSE→DB review와 health 3/3을 통과했다. 실제 receipt-bound rollback은 같은 프리뷰에서 별도 helper로 두 번 실행해 종료했다(런북, 기계 판독 증거). 첫 예약 실행 이력은 대기 상태다. 증거: 배포 증거, 브라우저 증거. 물리 마이크 캡처 미승인과 Deepgram 운영 키 부재는 해소되지 않았으므로 G7은 BUILD로 유지한다.
  • claude_cli ↔ Anthropic API live 동일성 — provider 라우팅·Anthropic /v1/models 탐색·지원 추론 강도·관리자 fail-closed 저장 경로는 구현 완료. 남은 범위는 연구팀/기관 ANTHROPIC_API_KEY를 게이트웨이 호스트에 주입한 live 응답·계량·오류 표면화 비교다. Claude CLI·Codex CLI(Terra/Medium)·Agy CLI(Gemini 3.6 Flash/High)는 로컬 live probe를 통과했다.
  • 재부팅 후 watchdog smokewatch-public-runtime.ps1 + Scheduled Task가 재부팅 후 엔진/API/터널을 복구하고 public /turn이 통과하는지 실측. 재부팅 불가로 미실행(parser/check-only 경로는 확인). DNS 개통 후 api-vnet.18ka.net-AdditionalPublicHealthUrls로 명시 추가. 상세: docs/ops/public-runtime-watchdog.md.

B3. 소유자(윤찬) 결정 — 전건 확정(2026-06-30)

7건(평가설계 H1 κ/ICC·환각률, s2s 2차 PoC 채택, 페르소나 음성 모델·권리, fast-loop 외부 API 허용, 재귀학습 fine-tuning 범위, 운영 보존기간·에스컬레이션, 추가 축어록 수급 20건/1개월)은 전건 확정됐다. 결정 상세는 대시보드 "윤찬 결정 상세" 탭, ADR은 docs/decisions/(voice-s2s-poc.md, backend-node-transition.md)에 있다. 각 결정의 구현·실측은 후속 build/GATE로 남는다.

B3-신규 (2026-07-27 전수 E2E 순회에서 제기 → 2026-07-27 소유자 전건 결정 완료)

소유자(윤찬)가 질문 도구로 7건 전건 결정(2026-07-27). 결정 내용과 구현 상태:

  • 설정 화면 아바타 변경 UI — 결정: 설정에 추가. 구현 완료(RED→GREEN, 대시보드 144차).
  • 동의 관리·철회 UI와 재동의 흐름 — 결정: 전체 흐름 구현(설정 동의 섹션 + 철회 + 재동의 경로). 구현 완료(RED→GREEN, 대시보드 144차).
  • 신규 학습자 첫 추천 난도 — 결정: 기초 우선 추천(회기 기록 없는 신규 학습자는 기초 난도 페르소나를 첫 추천으로). 구현 완료(RED→GREEN, 대시보드 144차).
  • 학생 분석 테이블 — 결정: 지금 가상화 도입. 구현 완료(RED→GREEN, 대시보드 144차).
  • 저작 모드 좌측 레일 잔존 마크업 — 결정: 정리(저작 모드에서 레일 미렌더). 구현 완료(RED→GREEN, 대시보드 144차).
  • dev-login 재로그인 자동 재승인 — 결정: 현행 유지(dev/E2E 편의 의도 확정). 코드 변경 없음.
  • 감정 밸런스 타임라인 차트(결함 로그 #21) — 결정: 지금 구현(평가 데이터 생산→저장→ 리드모델→차트 연결). 구현 완료(RED→GREEN, 대시보드 144차).

근거·상세: docs/ops/e2e-full-sweep-2026-07-27.md 발견 결함 로그 #2·#4·#6·#14·#15·#16·#21.


B4. 외부 거버넌스 — 한신대/데이터 steward 서면 증거

  • 한신대 데이터/SSO 거버넌스 게이트 — SSO claim mapping, 추가 축어록 수급, 미성년 원본 활용동의, 개인정보 처리방침. 로컬 골격 docs/ops/hanshin-data-governance-gate.md 준비됨, 외부 서면 증거 필요. (소유자 보류 중.)
  • L1 스택 정합성·저작권 등재 문서 반영 — 백엔드는 Node.js 교체 가능성 우선으로 결정됐지만, 신청서/저작권 등재 문서에는 현재 FastAPI 유지 사유와 계약 우선 전환 계획을 반영해야 한다. 로컬 결정 기록은 docs/decisions/backend-node-transition.md; 외부 제출/등재 증거 필요.

Phase 3 파일럿 게이트 (실참여자 필요)

  • 20명 교육용 파일럿 운영 / 효과성·KPI 측정(SUS·자기효능감·κ/ICC·환각률) / 재귀학습 데이터셋 approved 산출 / 개인정보·동의 감사. 문서·checker·dry-run exporter는 준비됨(docs/phase3/*, scripts/check-phase3-artifacts.py, scripts/export-recursive-dataset.py, scripts/export-phase3-kpi.py). 공식 문항 확정, 통계 검정, 실험/통제군 배정, 실제 approved evidence는 파일럿·steward/legal 검수·IAA 통과 시점의 GATE다.