vignette/docs/archive/project-cleanup-2026-09-07/TODO-before-cleanup.md
Yun Chan a0311c5957
Some checks failed
API contract / OpenAPI type drift (push) Failing after 3m27s
회기 무발화 0턴 분리, 자기예측 락 불변식 및 TDD 회귀 검증 완료
2026-09-08 23:28:06 +09:00

72 KiB
Raw Blame History

Vignette 할 일 (안된 것들) — 통합 TODO

한 곳에서 보는 "남은 작업" 인덱스. 여러 문서에 흩어져 있던 열린 작업을 주제별로 모았다. 권위 기준은 SSOT dev_dashboard.html, 열린 게이트 추적은 ops/backlog-2026-06-26.md(얇은 현행본)다. 이 파일은 그 둘을 집계·링크하는 뷰이며, 상태가 어긋나면 대시보드를 기준으로 맞춘다. 완료된 작업 기록은 archive/(냉동 보관)에 있고 평상시 읽지 않는다.

태그: [환경] 이 워크스테이션에서 증거 생산 불가 · [외부] 기관/소유자 서면·결정 필요 · [구현] 코드로 진행 가능 · [임상] 임상팀(구훈정·어유경) 외부 콘텐츠 소유.


개선관리 워크북 동기화 (2026-08-29)

이 표는 워크북 ID와 현행 구현을 잇는 얇은 추적표다. 내부 기술 DONE의 focused 증거는 guides/testing.md, 상세 계약은 SSOT dev_dashboard.html이 소유한다. C-001은 기술 사전검증과 외부 임상 승인을 분리한다. 검토 패킷과 fail-closed 판정기는 준비됐지만 외부 증거가 없으므로 계속 열린 항목이다. 완료본은 outputs/01a04217-f73b-7303-b597-401fa7f5d290/Vignette_개선관리_완료.xlsx, SHA-256 c832547f30ae0664e54b302c8e9f62cc157f31022ad158d17803d8cac988d8bd다. 집계는 완료 9·검토 2·총 11이며 검토는 C-001 적격 외부 임상 검수와 REQ-008 실제 Windows 재부팅뿐이다.

ID 상태 현행 경계
C-001 OPEN · 외부 GATE v2 P1 합성 사례 6건·상태별 canonical 판정기와 109·수단 상세 차단·런타임/carry-over/output ideation_stage <= 3·4개 공식 source 기술 사전검증은 완료. 사례별 5필드 30개, 청소년 답변 6개, 검토자·소속·자격·검토일·결정 근거·서면 증거/해시·검토 버전/사례 해시를 포함한 승인 10필드가 있어야 닫는다. 현재 review_complete=false; F절/B4에서 추적한다.
C-002 DONE · 내부 기술 첫 회기 라포 반영·한 초점 열린 질문 체크리스트, 근거 turn 연결, 이후 회기 not-applicable
C-003 DONE · 내부 기술 종료 회기 4건 미만 insufficient, 이후 최다 페르소나 비중 0.75 이상 훈련 집중 주의; 임상·공정성 판정 아님
REQ-001 DONE · 운영 수락 provider가 검증한 모든 Google 계정은 도메인·사전등록 없이 learner·approved로 로그인한다. Pages 0c60261e…의 단일 Google CTA·공개 Playwright 2건, 기존 Gmail 인증 세션의 로그인 이메일·관리자 진입·온보딩 비전환·복구 데이터 가시성을 확인했고 소유자가 수락했다. 현재 public API 장애는 별도 운영 복구 게이트이며 이미 닫힌 수락 증거를 지우지는 않는다.
REQ-002 DONE · 내부 기술 admin protocol draft→active→retired, 라이선스 C/D 외부 LLM 금지, evaluator-only RAG·rollback; migration 17 owner-run/readiness-only
REQ-003 DONE · 내부 기술 페르소나 주호소가 JSON 키 순서나 surface 상태보다 우선
REQ-004 DONE · 내부 기술 learner 현재 설정 AND 세션 snapshot. OFF는 AI 파생 API 403/UI 무요청·혼합 결과 redaction, 사용자 입력·privacy 보존; teacher/admin 유지
REQ-005 DONE · 내부 기술·운영 실증 새 회기는 승인 페르소나 persona_id/version 고정. P20의 suicide_ideation_stage=0.9 → int(0) → DB 1..5 장애를 clamp로 제거했고, 공개 P20 회기 생성·실제 AI 응답·종료·평가를 확인
REQ-006 DONE · 내부 기술 prompt와 구조화 결과의 상담자/내담자 identity를 [COUNSELOR]/[CLIENT]로 역할 마스킹
REQ-007 DONE · 내부 기술 회기 종료를 평가보다 먼저 영속화해 평가 실패 뒤에도 같은 learner-persona case의 다음 회기 생성·턴 진행 가능. 종료·시작은 같은 case row lock 순서를 써 S2가 S1 summary/carry를 빠뜨리지 않고, 진행 중인 같은 case는 409 active_session_exists로 기존 회기만 이어간다. migration 21의 online partial unique index와 invalid-index pre/postcondition이 병렬 생성을 fail-closed로 차단
REQ-008 READY · 실제 재부팅 GATE 원본 응답 생성 실패는 기본 엔진+live-client readiness, 구조화 done 없는 SSE EOF의 client_stream_incomplete 복원과 공개 P20 실제 응답으로 닫았다. 후속 재부팅 복구는 전역 mutex·단계별 상한·프로세스 트리 종료·전체 다운 즉시복구와 PowerShell 5.1 timed WaitForExit의 process handle 선확보를 적용했다. 실제 PS5.1 계약 32 passed, detached-clean 44b7835c…·tree 06133249…, 5174 자동복구·HTTP 200, watchdog result 0/failcount 0까지 확인했지만 실제 Windows 재부팅 smoke 전에는 개선관리 상태를 검토로 유지한다. PC 비종속 상시 호스트 이전도 별도 운영 게이트다.

2026-08-29 read-only 상태(이 PC 로컬 기준): 정적 public Web과 Pages 0c60261e…(source 5bf89ff…)는 유지됐지만, 이 PC 로컬 API 8001은 연결 거부였고 이 PC의 Docker daemon 부재로 이 PC 기준 DB/API는 복구 불가였다. task는 old detached dba9b75a… runtime을 계속 가리켰다. 2026-08-31 재실측(정식 분리 확인): https://api-vignette.chanpaca.net/health는 별도 호스트(Cloudflare 뒤)에서 200·environment=prod·db=true·engine=true·engine_mode=openai로 정상 서빙 중이며, 이 PC에는 cloudflared 프로세스가 없어 public 도메인은 이 PC가 아니다. 즉 이 PC 로컬 8001/task 상태는 개발 워크스테이션의 잔여 스냅샷이고 public 도메인 장애를 뜻하지 않는다. avatar fail-closed 코드와 upload receipt는 아직 후보이고 배포하지 않았다.

2026-08-30 NAS production 재확인에서는 vignette-prod DB·API·engine이 healthy였고, restart loop이던 web/proxy는 필요 최소 capability만 추가해 두 서비스만 재생성했다. 내부 Caddy→web과 /api/health는 200이지만, compose의 Tailnet bind 주소가 NAS 인터페이스에 없어 외부 private/public GREEN은 아직 주장하지 않는다. LAN/0.0.0.0으로 노출을 넓히지 않았다. 회기 연속성 migration 21은 중복 활성 learner-persona case 14개(초과 row 28개)를 발견해 보존·종료 기준을 owner가 결정할 때까지 적용하지 않는다. 기존 20번 transactional migration과 새 21번 online index, 연속성 hunk만 포함한 production 전용 clean candidate가 필요하며 preview 전용 release agent와 8/7 manifest는 사용하지 않는다.


A. 배포·공개 런타임 게이트 [환경]

출처: ops/backlog-2026-06-26.md B2 · 대시보드 운영 탭 · ops/tailscale-vnet-runtime-2026-06-27.md · ops/public-runtime-watchdog.md · ops/handoff-goal-production-2026-08-29.md

2026-09-01 정식 배포(A 경로) 완료: Forgejo master dce85620를 NAS vignette-prod에 실배포(api/engine/web 교체·pgdata/apiuploads 무접촉·사전 dump cab6826b… 보존), 중복 활성 회기 30행 최신 유지 정책 종료 후 마이그레이션 20/21/22 온라인 적용, Cloudflare Pages도 새 빌드 배포. public health ok·db/engine true·OpenAPI 200·auth 401·dev-login 404·데이터 집계 전후 동일. 이 절의 "이 PC 런타임" 항목들은 NAS 이관으로 대체 경로가 됐다. 증거: ops/evidence/nas-prod-deploy-2026-09-01.json, 상세는 백로그 A 경로 절.

  • public API/DB 복구와 avatar fail-closed 정식 승격 — 허용 source union은 93 objects·52,973 bytes, inventory SHA-256 9d703126f78d4fc8330408835d76a7d680276240dc578d6fc9ca420c2f25e6aa다. 실제 decode는 정상 3·실패 90, 현 DB 참조는 정상 2·실패 6·missing 0이다. 후보는 손상 bytes/DB reference를 private forensic으로 보존하고 public static 응답을 404/fallback으로 막으며 decode-valid 객체만 immutable public cache에 제공한다. 신규 UUID 업로드도 URL 기록·현재 참조·GET/HEAD에서 다시 full decode하고, 업로드 뒤 손상은 current invalid/health fallback에 포함한다. 전체 API/Web/ PowerShell 회귀, 실제 브라우저 fallback, exact target/total/digest receipt, 후보 SHA와 사용자 배포 승인 전에는 Docker· API/tunnel·task·DB avatar URL·stable upload root를 바꾸지 않는다. 현재 Docker engine은 꺼져 있고 public watchdog이 활성이라 daemon 시작 즉시 기존 runtime 복구가 개입할 수 있다. 풀스택 E2E는 watchdog 일시 중지·비활성화, 고유 DB/container/volume과 56432/58000/55173 포트, exact cleanup, Docker·watchdog 원상복구를 명시 승인받은 뒤 layout-visual-gate 15/15와 session-layout 8/8을 실행한다.
  • 내장 브라우저 G8 사람 게이트 E2E — 명시적 승인·보류(keep_quarantine)·반려(reject)와 사유 입력, 증거 미충족 승인 차단은 typecheck와 route-fixture desktop/mobile 10/10을 통과했다. 빠른 3.5초/느린 8초 응답에서도 watchdog overlay 0을 확인했다. Codex 내장 브라우저의 격리 local stateful fixture에서도 8.5초 뒤 overlay 0·heading 정상, content keep_quarantine 뒤 effect 0, 증거 없는 release 승인 disabled→reject 뒤 effect 0, 증거 4종 promote 승인 뒤 lifecycle effect 정확히 1을 공동 확인했다. 로컬 사람 게이트는 GREEN이지만 실DB append-only 결정과 public proof는 아직 없으므로 current 운영 G8 전체를 GREEN으로 올리지 않는다.
  • 공개 DB 계정·회기 복구 안정화 — 2026-08-07 18:26 KST owner 승인으로 recovered named volume을 공개 vignette-dev-db:55432에 전환했다. cutover 기준 users 84/sessions 30/turns 705, Google 계정 16/소유 회기 30, orphan 0, health·engine·OAuth·watchdog가 정상이다. 전환 직전 container와 dump, 원본 volume을 보존한다. 남은 것은 사용자가 Google 재로그인한 뒤 본인 과거 회기가 보이는지 확인하는 일과 자동 백업 운영화다. 기존 인증 세션은 복사하지 않아 재로그인이 필요하다. 2026-08-09 Docker Desktop 중단과 18:02:55 KST Docker Desktop UI의 active DB 직접 stop으로 db=false가 재발했으나 동일 recovered container/volume만 재기동했고, 당시 owner read-only 집계는 users 356/sessions 193/ turns 726, Google users 16/Google-owned sessions 31이며 public db/engine true였다. watchdog·로그온 boot는 detached clean release의 Git commit/tree와 watchdog|boot/start SHA가 없으면 mutation 전에 실패하도록 코드로 고정했다. 공개 API·cloudflared는 detached-clean a73bcd24…·tree b02b3a1b…로 fresh 승격했고 receipt 47388d58…9b08가 passed다. local/public health는 status=ok·db=true·engine=true, 공개 OpenAPI 126, /admin/voice-runtime, local_whisper/small + melotts/melotts-korean, queue 4를 확인했다. 로그온·watchdog 두 task도 같은 root/commit/tree/script SHA에 재등록해 명시 실행 LastTaskResult=0을 확인했다. 2026-08-12에는 휴면 Gradle daemon의 8001 점유·cloudflared/voice sidecar 중단과 PowerShell 5.1 native stderr 조기 종료 결함을 복구했다. DB mutation 전에 custom dump 9cbda31e…0ce5(7,532,625 bytes·TOC 1,492)를 고정했고, detached-clean a73bcd24…·tree b02b3a1b…로 API/cloudflared를 fresh 승격했다. receipt 47388d58…9b08 passed, public health 3/3·db/engine true·OpenAPI 126·local voice exact, watchdog·로그온 boot 명시 실행 result 0을 확인했다. 2026-08-29에는 Windows PowerShell 5.1에서 Start-Process -PassThru의 process handle을 열기 전에 timed WaitForExit()를 호출하면 정상 web build 뒤에도 ExitCode=$null로 남아 복구를 실패로 오판하는 경계를 수정했다. 실제 PowerShell 5.1 계약 32 passed, detached-clean 44b7835c…·tree 06133249…에 두 task를 같은 핀으로 재등록했다. watchdog 3회차 복구로 5174가 자동 기동했고 후속 실행은 LastTaskResult=0·failcount 0, local/public health status=ok·db=true·engine=true다. 실제 Windows 재부팅 smoke는 아직 남아 있다. 2026-08-18에는 06:30~10:05 KST 엔진 readiness 장애(고효율 프로브 타임아웃 실패가 1800초 캐시 + 구독 사용량 소진)를 수정했다. 실패 전용 캐시 TTL 30초 분리·프로브 타임아웃 45초로 교정하고 detached-clean 4771b97c…c880으로 API/게이트웨이/task를 재승격·재등록해 LastTaskResult=0, 공개 health ok·OpenAPI 126을 재확인했다. 승격 절차에 이전 루트 apps/api/.env 복사 단계가 필요함을 확인했다(1차 승격 fail-closed·약 4분 다운타임). 남은 자동복구 gate는 실제 Windows 재부팅 smoke와 정기 DB 백업 운영화다. 상세: ops/public-db-recovery-rehearsal-2026-08-07.md.
  • 자동 DB 백업·정기 복원 리허설scripts/backup-vignette-db.ps1의 custom dump→TOC 검증→ SHA manifest 원자 게시와 현재 public-target 일회용 복원(129 tables/9,646 rows/orphan 0)을 통과했다. 남은 범위는 예약 실행, 실패 알림, NAS/off-host 암호화 복제, 주기적 restore drill과 보존 정책이다.
  • 공개 Google OAuth 실제 /turn proof — 2026-08-28 기존 Google 세션으로 callback→관리자 진입을 확인하고 P20 회기 생성→자기점검 잠금→실제 학습자 발화/AI 내담자 응답→종료→리뷰·평가→다음 회기 버튼 재노출까지 공개 브라우저 폐루프를 통과했다. 별도의 신규 Gmail 선택은 새 Vignette 계정 생성 확인 항목이다.
  • 공개 Web 모바일 보정 Pages 배포 — 2026-08-18 소유자 승인 후 detached-clean cf899b7f…7c96로 완료했다(00f851a6 후보의 모바일 보정을 포함한 상위 커밋). API type/typecheck, 2회 결정적 build(599파일 sha256 전일치), 7개 origin 자산 143개 보존(최종 742파일) 후 Cloudflare Pages production 4edc02d3 배포 — custom-domain 새 엔트리 index-BWxBaCPM.js/index-BUfQc2Rm.css 서빙, 직전 엔트리 index-BrpoQ5nP.js 200 보존, preview 200을 확인했다. 공개 API/DB·Scheduled Task는 건드리지 않았다. 증거: docs/ops/evidence/public-web-deploy-2026-08-18.json. 증거: ops/evidence/public-web-preflight-2026-08-12.json.
  • Compose 패키징용 infra/.env owner-secret — 현재 운영 direct-runtime은 독립 G3~G8 token 주입, non-owner app-role preflight와 공개 health를 통과했다. Compose로 전환할 때만 APP_DB_PASSWORD 등 패키징 비밀과 prod-safe engine/voice flags를 별도 주입하고 compose profile preflight를 다시 통과한다.
  • vnet.18ka.net/api-vnet.18ka.net 공개 live — DNS A record 등록, cloudflared의 18ka.net zone 권한, Google redirect URI https://api-vnet.18ka.net/auth/callback 등록. (현재 prod API 8001은 health OK)
  • 비-secure origin에서 회기 리뷰 크래시 수정 — 2026-08-07 격리 NAS 프리뷰 http://100.116.83.60:8088(평문 HTTP·비-localhost)에서 회기 리뷰 라우트가 crypto.randomUUID is not a function으로 error boundary에 잡혔다. crypto.randomUUID는 secure context에서만 노출되는데 제품 코드 18곳이 fallback 없이 직접 호출했고, 특히 RuptureRepairCard.tsx는 렌더 시점(useRef)에 호출해 화면 전체가 죽었다. 릴리스 게이트는 localhost 후보 스택(secure context)에서만 돌아 이 경로를 밟은 적이 없다. src/lib/uuid.tsrandomUuid()로 통일했고 fallback도 crypto.getRandomValues를 우선 사용해 idempotency key의 예측 불가능성을 유지한다. 문장 fingerprint의 crypto.subtle.digest 의존도 portable SHA-256 fallback으로 교체했다. source-only UUID/SHA 회귀 12/12와 secure/insecure exact digest 회귀를 고정했고, 최종 archive 4d15d055…119d4d의 실제 NAS 평문 origin browser review 112/112로 배포 검증까지 닫았다.
  • 워치독 engine readiness 사각지대 — 2026-08-07 22:0x KST 소유자 승인으로 9099 재기동과 판정 기준 교정을 모두 마쳤다. 복구 실측: 9099 /ready?force=true 200 ok:true, detail:OK, API 8001과 공개 api-vignette.chanpaca.net 모두 status:ok, engine:true, engine_detail:OK. 원인은 16:06부터 상주하던 9099 프로세스 하나였다. 같은 인자로 claude -p를 직접 실행하고 EngineSession을 그대로 재현하면 양쪽 다 "OK"를 반환해 CLI·코드·cwd는 무관함을 확인했다 (별도 포트 9199 실험과 동일 결론). 재발 방지 3건: (1) scripts/watch-public-runtime.ps1·scripts/start-public-runtime.ps1의 engine 판정을 /health(프로세스 liveness) → /ready(실제 생성)로 바꾸고, API 판정에 engine을 추가했다. shared secret 인스턴스를 401로 오판하지 않도록 X-Vignette-Engine-Token 헤더를 붙이고, 503 응답 본문을 로그 detail에 남긴다. (2) engine_gateway/gateway.py가 자식 claude -p의 stderr를 상시 드레인해(PIPE를 아무도 읽지 않으면 자식이 블록되는 문제도 함께 차단) 실패 detail에 exit·stderr를 붙인다. 실증: empty engine response (error: unknown option '--vignette-nonexistent-flag-xyz'). str()이 비는 TimeoutError 등에는 타입명을 최소 보장한다. (3) 기동 시 게이트웨이 로그 회전, Stop-UvicornByPortName -like python* 조건 추가 (명령 문자열만 매칭해 호출자 자신을 죽이는 사고 방지). 검증: pytest engine_gateway 58/58, 워치독 -CheckOnly healthy 5/5, 장애 재현(9299를 CLAUDE_BIN 부재로 기동)에서 /healthok:true로 통과하고 /ready는 503으로 검출되어 워치독이 unhealthy (1/3) + 503 본문을 남겼다. NAS용 9100은 2026-08-12 listener 상실을 확인했다. current relay launcher는 detached-clean HEAD/tree, launcher·Python·env SHA, exact consumer URL, explicit LAN 승인, 외부 receipt/runtime, listener owner, generation readiness와 실패 cleanup을 강제하도록 보강했고 contract 8/8을 통과했다. detached-clean f08e03de…f191·tree 00275133…0abd exact -CheckOnly도 launcher/Python/env SHA 결속, mutation=false, listener 0→0, runtime state 0으로 PASS했다. 실제 9100 시작은 소유자 승인 전 미실행이다.
  • NAS preview engine relay current 복구 — 2026-08-18 심야 current GREEN 달성으로 종결. -CheckOnly 프리플라이트(4종 SHA pin) → 실제 시작 passed → 방화벽(LAN 한정 9100) → health 3/3 status=ok·db=true·engine=true·auth 401·OpenAPI 126 → actual-origin 실회기 turn→review smoke 통과 (agy 턴 2개→종료 200→리뷰 200). 대청소 사건으로 릴레이 루트가 삭제돼 현행 루트 bf5f7352로 재핀(r3 영수증)했고, DHCP가 LAN IP를 224로 회수해 릴레이 바인딩·NAS ENGINE_URL192.168.0.224:9100으로 이전(방화벽 규칙 재발행, NAS .env(0600) 재구성 + api만 재생성), 클로드 예산 한도 재발으로 NAS ENGINE_MODE=agy_cli 전환. 잔여 권고: 공유기 DHCP 예약(호스트 MAC D8-BB-C1-A2-3C-5D), Docker VM 클럭 동기화(호스트 대비 ~4일 선행), NAS 로컬 agy 이전(릴레이·노트북 의존 제거). 증거: docs/ops/evidence/nas-relay-recovery-2026-08-18.json.
  • stable-source task 재등록 + 재부팅 후 watchdog smoke — 2026-08-27 stale AF_UNIX socket으로 Docker Desktop 백엔드와 공개 DB가 중단된 사건을 기존 container·volume 삭제/교체 없이 복구했다. 부모 IPC 폴더는 timestamp .stale 이름으로 보존했고, 기존 vignette-dev-dbvignette_recovered_prod_20260807만 재기동했다. 2026-08-28에는 detached-clean 99779a6a…fbc8·tree 57da86aa…6b91로 watchdog·로그온 boot task를 다시 등록했다. 두 작업 모두 ExecutionTimeLimit=PT1H·MultipleInstances=IgnoreNew, scheduler 재시도 0이며, launcher 전역 mutex·bounded API/voice/web build·부모/자식 process-tree 종료와 cloudflared 또는 전체 동적 서비스 hard-down 즉시복구를 회귀 50건으로 고정했다. action root/commit/tree/script SHA pin, watchdog 18:10:57 KST·boot 18:14:27 KST 수동 실행 LastTaskResult=0, failcount 0을 확인했다. 로그인 뒤 수동 복구는 증명됐지만 실제 Windows 재부팅 후 엔진/API/터널 자동 복구는 아직 실측하지 않았다. DNS 개통 후 api-vnet.18ka.net-AdditionalPublicHealthUrls로 명시 추가한다.
  • 노트북 로컬 음성 스택 STT 구현 — 2026-08-08 소유자 결정으로 음성 양쪽을 노트북 상주 로컬 모델로 쓴다(STT faster-whisper, TTS는 아래 항목대로 MeloTTS). 이전에는 코드에 로컬 STT 경로가 아예 없었고 (voice_stt_provideropenai|deepgram 둘뿐), interim/final 스트리밍 구현도 Deepgram 전용이었다. scripts/local-whisper-stt-server.py 사이드카(Higgs와 같은 loopback 상주 방식)와 voice_stt_provider=local_whisper 경로를 추가했다. 오디오는 호스트를 벗어나지 않고 외부 STT 키가 필요 없다. 실측: 저장소 합성 시드 음성 8.72초로 interim 9 · final 5 · word timestamp 12개 전부 present, 전사는 원문과 한 글자(안녕하세요안녕하세여) 차이였다. 회귀 scripts/test_local_whisper_stt_server.py 37/37, apps/api/app/test_voice_service.py 로컬 provider 케이스와 후속 계약을 포함한 current API 전체 921 passed. 발견 1: 이 노트북은 CUDA 장치는 보이지만 cuDNN(cudnn_ops64_9.dll)이 없어 GPU 추론이 네이티브 크래시로 죽는다. 같은 프로세스 try/except로는 못 잡아서 디바이스 확인을 버릴 수 있는 자식 프로세스 (--self-check)로 분리하고 auto에서 CPU로 폴백하게 했다. cuDNN 9를 설치하면 GPU(float16)로 훨씬 빨라지며 large-v3도 실시간권에 들어온다 — 설치는 소유자 판단 사항이라 하지 않았다. 발견 2: G7 종료 체커가 expected_stt_provider == "deepgram"을 하드코딩하고 있었다. 이는 결정 기록이 아니라 벤더 한 줄이었으므로, 운영하기로 한 provider 허용목록으로 바꿨다 (ALLOWED_STT_PROVIDERS/ALLOWED_TTS_PROVIDERS). 선언/실제 불일치 차단은 그대로 유지한다.
  • 노트북 로컬 음성 스택 TTS 구현 (MeloTTS) — Higgs는 연구/비상업 라이선스라 config.py가 운영에서 차단하고 있었고, 그 가드를 푸는 건 법적 판단이라 코드로 결정할 수 없었다. 그래서 상업 사용이 허용된 설치형을 다시 찾아 MeloTTS Korean(MIT) 으로 바꿨다. 가드를 건드릴 필요가 사라졌다. scripts/melotts-server.py loopback 사이드카 + voice_tts_provider=melotts 경로를 추가했고, 사전학습 다화자 모델이라 Higgs처럼 P1 프리셋 한정이 아니라 모든 페르소나에 적용된다. 실측: CPU 정상 상태 RTF 0.27~0.28(실시간의 3.6배), POST /tts 200·WAV 350,566 bytes·3.61s, 빈 텍스트 422·미지 경로 404. 왕복 검증으로 MeloTTS 합성음을 faster-whisper가 완전 일치 전사했다. 회귀 사이드카 16/16, 후속 계약을 포함한 current API 전체 921 passed, ruff clean. 검토 후 탈락: Kokoro-82M은 Apache 2.0이지만 공식 VOICES.md한국어가 없다(검색 요약이 지원한다고 했으나 오답). Piper는 GPL, XTTS-v2·Fish Speech는 비상업이라 Higgs와 같은 문제다. 설치 함정 3가지는 decisions/local-voice-stack.md에 남겼다(setuptools<81, unidic download, eunjeon). 근거: decisions/local-voice-stack.md.
  • G7 외부 종료 게이트 — 공개 runtime 선행 구현 + 사람 입력 — provider 의존 코드는 해소됐다. 2026-08-08 로컬 스택 (faster-whisper STT + MeloTTS TTS, 둘 다 MIT)으로 바꿔 외부 STT 키가 더 이상 필요 없고, 체커의 벤더 하드코딩도 운영 provider 허용목록으로 교정했다. 기계적인 부분도 scripts/run-g7-external-proof-window.py가 soak·runtime·topology 세 캡처를 하나의 겹치는 시간창에서 동시에 돌리고 checker까지 이어서 실행하도록 묶었다(회귀 20/20). 사람에게서만 받을 수 있는 마지막 두 입력은 다음이다. (1) 명시 동의 하 물리 마이크 50분 양방향 soak — 소유자가 실제로 50분 발화해야 한다. (2) 독립 blind human voice-gain pack — held-out 30명 외 calibration split 참가자 포함 총 최소 31명 / held-out 50회기 / 150 paired axis / 독립 평가자 2인 / ICC(A,1) ≥ 0.75 · κ ≥ 0.70 · gain ≥ 0.01 · participant-cluster bootstrap 10,000회 95% CI lower > 0. runner는 이 pack의 category·κ·preregistration·paired completeness·결측 ITT를 3,120초 캡처 전에 검증하며, 부적합하면 마이크를 열지 않고 exit 2로 끝낸다. 독립 검수는 python -X utf8 -B scripts/check-g7-human-voice-gain.py --input <pack.json>이고 --print-schema로 계약을 확인한다. 독립 평가팀용 prepare-g7-human-voice-gain-intake.py는 빈 header-only 템플릿을 만들고, 비식별 CSV를 production floor·ICC·κ·gain·CI로 재계산해 전부 통과한 경우에만 최종 pack을 원자 생성한다. 템플릿은 template_only=true라 증거로 컴파일할 수 없고 이름·이메일·원음·축어록·자유서술 열을 받지 않는다. 도구 준비만 끝난 상태이며 실제 독립 평가자 데이터는 아직 없으므로 G7 external GATE를 유지한다. 공개 선행 조건 완료(2026-08-09): detached-clean a73bcd24…·tree b02b3a1b…에서 OpenAPI 126, /admin/voice-runtime, exact local voice provider/model과 queue 4를 제공한다. fresh launcher receipt 47388d58…9b08가 passed이고 두 Scheduled Task도 동일 source에 pin돼 result 0이다. Cloudflare의 Python 기본 User-Agent 403 경계는 runtime sampler의 browser-compatible header와 회귀 4/4로 고정했다. 외부 실행 전 코드 P0 완료: runner 종료 코드는 canonical checker exit 0/gate_closed=true에 결속됐고, 브라우저 Origin(vignette.chanpaca.net)은 API/WSS/admin/topology host(api-vignette.chanpaca.net)와 분리된 HTTPS allowlist로 검증한다. 실제 capture는 최소 3,120초·ceil+terminal sample이고 voice/runtime/topology 공통 overlap ≥3000s를 checker가 강제한다. Windows artifact는 detached-clean HEAD/tree, runner/collector/checker SHA, exact psutil==6.1.1을 매 sample 전후 pin한다. fresh launcher는 legacy API와 exact-config cloudflared를 bounded 교체하고 새 PID/start/exe/command SHA/실제 cwd의 raw command-line 없는 receipt를 만든다. G7 runner/checker/topology human pack runtime/checker 6파일 94/94, intake 6/6, standalone validator 4/4를 합친 104/104를 통과했다. --rehearse는 인증 WSS ready/ping/close 1000, runtime 7 samples, Windows topology 7 samples를 모두 통과했고 마이크 capture false·UUID/email literal 0이다. fail-closed 경계(동의 없음·pack 없음·3,120초 미만·host/Origin/scheme 불일치)는 CLI로 실증했다. 상세: ops/outcome-os-g7-external-proof-readiness-2026-08-07.md.

격리 NAS current baseline / G8 DONE: 2026-08-09 clean-head 프리뷰 http://100.116.83.60:8088, project vignette-preview-20260807은 source HEAD 61a41d1f…6af·tree 87dec55d…3b77의 active archive 4d15d055…119d4d, exact API/Web d5021950…e4b1/ 9796c092…4b36로 실행 중이며 previous active 6030a677…c611과 이전 images도 보존한다. api/web/db/proxy 4개는 running + unless-stopped, volume은 vignette-preview-20260807_pgdata다. candidate session E2E 112/112와 실제 NAS-origin browser review 112/112(11 specs, desktop/mobile/single-run), 당시 health ok·db/engine true·auth 401·OpenAPI 126을 통과했다. 2026-08-12 current runtime은 고정 ENGINE_URL=http://192.168.0.223:9100 listener 상실 뒤 degraded였고 15:24 KST health 3회도 타임아웃했다. 따라서 G8 배포·rollback 증거는 DONE으로 보존하되 current NAS는 relay 복구와 actual-origin 재검증 전까지 DEGRADED다. fresh dump 36ec8748…24db8은 1,097,100 bytes, TOC 1,738 / TABLE DATA 129다. release agent는 DB dump/restore를 수행하지 않으므로 매 execute 직전 fresh custom dump SHA/size/TOC와 DB identity를 별도 결속한다. 자동 rollback은 image/Compose/active-state만 복구하며 적용 migration/data restore는 별도 owner 승인이 필요하다. 과거 6030a677…c611의 localhost 108/108·평문 origin UUID 24건 실패와 후속 verified rollback은 이력으로 보존한다. 매시간 vignette-e2e heartbeat 자동화는 ACTIVE다. 공개/NAS 화면과 health는 읽기 전용으로 보여주고, 소스 material milestone에서만 전용 disposable 회기 E2E를 실행한다. runner의 clean HEAD/tree·로컬 npipe Docker· loopback 동적 포트·sentinel·exact cleanup 계약과 unit 14/14는 완료됐다. 최초 세 full run은 각각 SSE body 재읽기, durable turn 전 종료, 비종료 SSE의 response.finished() 대기라는 harness 결함을 fail-closed로 잡았다. 4차 clean run은 6.3분 안에 동일 학습자 SSE·review ready·G4 원장 0→1까지 통과한 뒤, full reload가 persisted episode를 화면에 hydrate하지 못해 이미 기록된 상태를 학습자만 실행으로 되돌리는 제품 결함을 잡았다. 네 번 모두 public/NAS/active DB 접촉 0·자원 잔여 0이다. 현재 UI는 현재 session+prescription의 persisted episode를 현재 원장 상태로 복원하며 route fixture desktop/mobile 6/6을 통과했다. 5·6차 clean run은 핵심 동일 학습자 SSE·review·G4/G5 0→1→1을 연속 통과했지만 fixture 공유와 mobile success-state locator를 각각 fail-closed했다. 보정 후 7차 clean aa81af29…는 첫 전체 GREEN을 만들었다. 이후 94666192…f97e7fad… run의 disposable DB init 실패는 두 번째 receipt의 cleanup 전 로그로 detached 99_app_role.sh CRLF와 bash\r exit 127이 원인임을 확정했다. .gitattributes*.sh text eol=lf를 고정했다. 공통 톱바 desktop/mobile 44px을 포함한 clean b02bee26…·tree 8f677bba…의 최신 single full run은 487.3초에 GREEN이었다. receipt periodic-learner-e2e-20260812-171547.json·SHA-256 8c11a136…af8e3은 same-learner SSE·review·G4/G5 0→1→1, 별도 returned desktop/mobile 4/4, route mock 0, public/NAS/active DB 접촉 0과 exact cleanup 0을 증명한다. 증거: 배포 증거, 기계 판독 증거, 브라우저 증거. 이는 G7 물리 마이크·독립 사람 평가 증거를 대체하지 않는다.

  • claude_cli ↔ Anthropic API live 동일성 — provider 라우팅·모델 탐색·설정 저장 경로는 구현 완료. 남은 게이트는 연구팀/기관 ANTHROPIC_API_KEY를 게이트웨이 호스트에 주입한 뒤 같은 프롬프트의 live 응답·계량·오류 표면화를 비교하는 것이다.

B. 외부 거버넌스 [외부]

출처: 백로그 B4 · ops/hanshin-data-governance-gate.md · ops/source-docs-gap-analysis-2026-06-26.md · MASTERPLAN.md

  • 한신대 데이터/SSO 거버넌스 서면 증거 — 공식 문의서 발송·서면 응답 수령, 동의범위 매트릭스, SSO claim map, privacy review, 미성년 원본 활용동의, 개인정보 처리방침. 로컬 골격은 ops/hanshin-data-governance-gate.md.
  • L1 스택 정합성·저작권 등재 문서 반영 — 신청서/등재 문서에 FastAPI 유지 사유 + 계약 우선 Node 전환 계획 반영. 결정 기록: decisions/backend-node-transition.md.

C. Phase 3 교육용 파일럿 [외부] + [구현 scaffold 완료]

출처: 백로그 Phase3 · phase3/* · 대시보드 P3 탭. 문서·checker·exporter scaffold는 준비됨.

  • 20명 파일럿 운영 — roster, consent 법무승인(G-P3-02), session completion evidence 수집.
  • 효과성/KPI 측정 — SUS·자기효능감·κ≥0.70/ICC≥0.75·환각률≤3%. 3척도 pre/post 실측 → kpi_report.json.
  • 재귀학습 데이터셋 approved 산출approved_for_recursive_learning_seed(consent/PII/IAA/legal 승인) + 승인 export 실행.
  • 개인정보/동의 감사 서명phase3/privacy-consent-audit.md 서명 완료, withdrawal_log 종결.

D. 소유자 결정 완료(2026-06-30) → 구현 후속 [구현]

출처: 대시보드 "윤찬 결정 상세" 탭 · decisions/ · 백로그 B3. 결정 자체는 전건 확정, 아래는 후속 build.

  • s2s 2차 비교 PoC 구현·실측decisions/voice-s2s-poc.md 기준표(전사·안전·감사·지연)로 20턴 비교 리포트 → 최종 채택/폐기.
  • fast-loop 외부 폴백 구현 — 로컬 상주 분류기 우선 + Haiku/Solar 폴백, 전송 가드(데이터주권·로그·동의)·관측.
  • 운영 TTS provider 선정·통합 — 운영 경로는 OpenAI API gpt-4o-mini-tts로 고정했다. OpenAI Services Agreement의 고객 애플리케이션·최종 사용자 통합권과 출력 소유 조항을 근거로 기록하고, 공식 TTS 가이드가 요구하는 “AI 생성 음성·사람 음성 아님” 고지를 회기 시작 전과 진행 중 UI에 상시 노출한다. 로컬 Higgs와 sample provider는 무참조 synthetic seed를 쓰는 개발 전용 경로로 계속 분리한다.
  • 재귀학습 fine-tuning 파이프라인 — 동의/데이터셋 게이트 충족 후. few-shot 자동갱신은 선행 가능.
  • 헬스 retention 적용·검증 — raw 90일 / rollup 365일. escalation/그룹 자동화는 미도입 고정.
  • 한신대 실사용 피드백 1차 개선팩ops/hanshin-feedback-improvement-plan-2026-07-03.md, redteam/hanshin-feedback-plan-redteam-2026-07-03.md, redteam/hanshin-feedback-plan-counter-redteam-2026-07-03.md 기준 P0~P4 1차 완료. 완료 범위: role mapping + client-only stateless history injection, review UI 표시 자연어화, raw error display mapper, fast/deep 라벨, 명백한 출력 결함 차단, SSE full-response buffer, 교수자 설명 패널. 검증 수치는 SSOT 대시보드만 소유한다. partial stream, client 전용 resident session, fast-loop 사후 저장은 구현 완료했다. 남은 후속은 저장형 fallback/synthetic 계약, fast/deep reconciliation, 임상팀 루브릭/CBT/약물·평가 문구 확정.

D-2. 전수 E2E 순회 소유자 결정 — 전건 결정 완료(2026-07-27) → 구현 후속 [구현]

출처: ops/e2e-full-sweep-2026-07-27.md 발견 결함 로그 · ops/backlog-2026-06-26.md B3-신규. 결함 12건은 RED→GREEN으로 수정 완료(대시보드 143차). 소유자 결정 7건은 질문 도구로 전건 확정.

  • 설정 아바타 변경 UI 구현 — RED→GREEN 완료(full-sweep-settings 4/4, 무회귀 44/44)
  • 동의 철회 전체 흐름 구현 — 설정 동의 섹션+철회 2단계 확인+재동의, 실 API round-trip GREEN
  • 신규 학습자 기초 우선 추천 구현starterPersona() 난도 오름차순, 무회귀 42/42
  • 학생 분석 테이블 가상화 구현 — @tanstack/react-virtual, 300행 RED→GREEN, 무회귀 40/40+게이트 4/4
  • 저작 모드 좌측 레일 마크업 정리 — 레일 JSX·CSS 삭제, dead-code 게이트 통과
  • dev-login 재로그인 자동 재승인 — 결정: 현행 유지(코드 변경 없음, 종결)
  • 감정 밸런스 타임라인 차트 구현 — deep turn_valence+결정론 파생 폴백, 백엔드 421/421, 라이브 5pt 실측

전체 검증 수치·상세는 SSOT 대시보드 144차 노트와 ops/e2e-full-sweep-2026-07-27.md가 소유한다.

E. 코드 품질·리팩터 로드맵 [구현] (비게이트 — 여유 시)

출처: ops/code-quality-research-2026-06-26.md · decisions/backend-node-transition.md next candidates. 2026-07-02 실측: 로드맵 상당수는 이미 해결(turn_runtime·tier 제거·eval_hook 주입 등). 아래는 코드 재확인 기준 현행 상태.

  • Stage enum SSOT 통합taxonomy.Stage를 라벨 단일 정의(SoT)로, services.state_machine이 re-export(중복 class Stage 제거). 검증: 단일 enum 정체성 확인, 백엔드 pytest 352 passed, 수집 379 import 무결. (2026-07-02)
  • store recent_turns/masked_turns Type-2 중복 제거recent_turns = masked_turns()[-k:] 위임으로 단일 소유. 검증: 백엔드 352 passed. (2026-07-02)
  • 화자 한글 라벨 4× 중복 → taxonomy.speaker_ko_label 단일 헬퍼 — evaluator/live_coach/memory 프롬프트의 '상담자'/'내담자' 삼항 통합. 검증: 헬퍼 단위 + 백엔드 352 passed. (2026-07-02)
  • 턴 파이프라인 dedupturn_runtime.pyload_owned_session/record_completed_turn로 이미 추출됨.
  • _iso 중복 통합 — teacher/sessions _iso 중복 해소됨(현재 _iso_text/_iso_dt는 별개 목적 함수).
  • tier dead-contract 제거 · voice 경로 eval_hook 미주입 — gateway tier 제거 + voice eval_hook 주입 완료.
  • Speaker/Role 계약 레벨 — 검토 결과 조치 불요 — DB actor 매핑은 1곳(session_persistence.py, 중복 아님), Role app↔db는 이미 단일 dict(DB_ROLE_BY_APP/APP_ROLE_BY_DB), 엔진 AIRole은 이미 단일 Literal. 실제 중복이던 표시 라벨은 위에서 통합됨 → 별도 추상화 불요. (2026-07-02 실측)
  • _list_sessions N+1 제거(1차: state/turns) — 세션별 session_state/turns fetch 루프(1+2N) → = ANY($ids) 배치 3쿼리 + Python 그룹핑. 검증: 실 DB 동등성 50세션/109턴 불일치 0, 왕복 101→3, 백엔드 352 passed(회귀 테스트 mock 시퀀스 갱신). (2026-07-02)
  • _list_sessions N+1 제거(2차: 턴평가 하이드레이션) — 상세 뷰에서 세션별 evaluator 연결+평가 로드 루프 → 전 세션 turn_refs 배치(_hydrate_sessions_turn_evaluations, 연결 1회). 싱글 헬퍼는 플러럴 위임으로 행위 보존(_load_turn_evaluations는 이미 turn_id = ANY 배치). 검증: 백엔드 352 passed. (2026-07-02)
    • E2E 검증(실 스택): dev API(8000, 내 코드 반영)+웹+DB에서 chromium-single-run 2 passed — "위기→교수자 대시보드", "학습자 턴→리뷰+교수자 대시보드"(list_all_sessions include_turn_evaluation=True로 1·2차 N+1 경로 모두 브라우저 end-to-end). (2026-07-02)
  • fast-loop eval_hook 사용 정책 제품 결정 (현재 주입은 됨; 켤지/끌지 확정은 소유자).
  • Node 게이트웨이 구현 시: 라이브 엔드포인트 conformance, TurnEvaluationPayload 어댑터 추출, admin.py 매퍼 정리.
  • init SQL과 별도의 idempotent DB migration runner 도입 (인프라 추가 — 소유자 결정 권장).

F. 임상팀 콘텐츠 [임상] (외부 소유)

출처: ops/source-docs-gap-analysis-2026-06-26.md · 백로그 B0. 코드 구조는 선제 구축, 문안·기준은 외부 정의.

  • 태깅 축어록 4종 후속 게이트ops/tagged-data-utilization-2026-07-15.md §3 소유: golden set P8P11, 다회기 스키마 격상, gestalt/dbt 이론모드 신설(소유자 결정), P1P7 보강, 사례개념화 루브릭 draft, P8~P11 초안 검수·승인(특히 P9 자해 페르소나는 안전장치 실측 선행).

  • C1 사례개념화 확정 루브릭 콘텐츠 + AI 추출/채점 calibration (현재 scaffold_only).

  • CBT 체인·이론부합 루브릭.

  • 위기개입 프로토콜 임상 승인 — 내부 기술 사전검증은 완료했다. P1 합성 검토 사례 6건과 Draft 2020-12 v2 스키마, pending_external_review/approved/conditional/rejected 상태별 canonical fail-closed 판정기, 실제 수련생 위기의 엔진 전 차단·109 연결, 자살 수단 상세 차단, 생성·전이·이전 회기 carry-over·출력의 ideation_stage <= 3, SAMHSA·NIMH·NICE·보건복지부 source pack 계약을 고정했다. 생성·스트림 실제 경로 P1 6/6과 C-001 focused 90 passed를 통과했고, 개선관리 완료본에는 사례별 판정·근거·수정 요구·재검토·검토일 30개, 청소년 특화 답변 6개, 외부 승인 10필드를 입력하는 C-001 외부검토 시트를 추가했다. 근거는 data/clinical/, scripts/check-clinical-crisis-review.py, docs/ops/clinical-crisis-protocol-review-2026-08-27.md에 있다. 현재 관찰 패키지·작업트리 해시는 일치하고 기계 게이트는 pending-valid지만 외부 입력은 모두 비어 있어 review_complete=false다. 실제 검토자 이름·소속 기관·자격·검토일·결정·근거·서명 증거/해시·검토 버전/사례 세트 해시가 기록되기 전에는 clinical_status=approved나 개선관리 시트 완료로 바꾸지 않는다.

  • 평가 골든셋 콘텐츠.

G. 운영 후속 [구현] (비차단)

출처: 백로그 B1

  • 운영 티켓 자동 분류·처리 — Claude Recipe headless 자동 수정 후보, 관리자 승인 후 이슈 등록·PR/작업 스레드 생성, 처리 결과 audit trail 확장. 자동 수정은 운영자 승인 전까지 실행하지 않는다.

H. 2026-07-13 한신대 회의 결정 구현 [구현] (파일럿 게이트 — 7월 내)

출처: ops/hanshin-meeting-actions-2026-07-13.md (요구사항 상세·완료기준은 그 문서가 소유). 데드라인: 7월 내 배포 → 7월 말~8월 초 파일럿(대학원생 ~20명). 9~10월 연구팀 점진 이관.

  • P1. 회기 종료 시간 기반 전환 — 구현 완료(2026-07-14). 60분 시간 기반(SESSION_DURATION_MINUTES) + 10분 전 알람 바 + 시간 만료 정리 유도 다이얼로그 + 유예(+10분) 후 서버 턴 409 거부 + 시작 전 목표 1~4개 선택(goal_stages 계약, DDL·런타임 가드 포함 — 회의 권장 2개 수준, 소유자 지시 2026-07-15로 4개까지 허용). 목표 달성해도 시간 내 계속 진행. 상태머신은 채점·표시용 유지. 검증: 백엔드 pytest 393 pass, 1분 회기 실측(알람→만료 다이얼로그→409), session-layout 8/8, layout-visual-gate 12/12.
  • P2. 회기 계획·달성도 게이지 — 구현 완료(2026-07-14). 설계 1p ops/session-progress-gauge-design-2026-07-14.md. 단계별 누적 게이지(rapport_credit 파생, 회기 간 ×0.7 이월로 누적) + 상세 수치(방어/개방도/라포 누적+이번 회기 증가분) 를 세션 화면·상세 응답·스트림 done·대시보드 페르소나 카드(rapport_percent)에 노출. 계획서·프로토콜 첨부는 기존 /personas/sources(+신규 엑셀 업로드)로 흡수. 검증: 2회기 carry 실측(65%→46% 시작 = ×0.7 정확).
  • [~] P3. 파일럿 인프라 대비 — 부하 검증 완료: scripts/load-test-sessions.py, 20 동시 세션 생성 20/20 성공 (p95 125ms, RAG warm 병목 없음), 5 동시 실턴은 p50 55s로 claude_cli 상주 풀이 병목 → 파일럿 전 ENGINE_MODE=claude_api 전환 권고. 이관 절차 초안 ops/server-migration-runbook-draft.md, 파일럿 사용 지침 ops/pilot-usage-guide-draft.md. 남은 것: 실제 서버 이관(연구팀·정보처 협의) — 외부 대기.
  • P4. 데이터 업로드 흐름 검증 — 자유 양식 엑셀 업로드 경로가 없어서 신규 구축(2026-07-14): POST /personas/sources/upload(xlsx/xlsm/csv → 텍스트 결정론 변환 services/tabular_ingest.py → 기존 마스킹· hash-only 증거·sanitized chunk 경로 재사용, 원본 바이트 미저장) + PersonaStudio 파일 첨부 xlsx 지원. 검증: 파란 라벨 샘플 실업로드(NAME 마스킹·chunk 색인·임베딩 OK, raw hash-only 확인), 방어 테스트 9종 (.xls 거부·cp949 폴백·손상/빈 파일) pass.
  • [~] P5. 협업 체계 — 비개발자용 가이드 guides/collaboration-for-researchers.md 작성 완료(문구 수정 프로세스 포함). 남은 것: 저장소 초대(소유자 직접 실행).
  • ⏸️ 외부 대기(구현 착수 금지): '실패(게임오버)' 정의 / 검수 표준화 항목 / AI 평가 노출 정책 / 페르소나 추가 제작 — 전부 연구팀 몫, 수신 시 반영.

I. Outcome & Alliance OS — 정식 승격 로드맵 [에이전틱 구현]

2026-08-06 정식 승격. 상세 계약·품질 목표·의존성은 ops/vignette-outcome-alliance-os-agentic-plan-2026-08-06.md, 상태는 SSOT 대시보드의 Outcome & Alliance OS G0~G8 계획 카드가 소유한다. 아래 작업은 사람 개발자 스프린트가 아니라 에이전트가 RED → 구현 → 통합 → 적대 검증 → runtime proof → SSOT 동기화로 닫는 증거 DAG다.

I-0. G0 Measurement Truth Foundation

  • app.measurement_event, app.measurement_instrument, audit.model_run 계약과 provenance enum 구축.
  • 기존 rapport_credit, alliance_level, fast/deep 평가, Phase 3 KPI의 source map과 adapter 구축.
  • simulated_state·model_inferred·agent_reported·learner_reported·human_rated· observed_runtime 층을 섞는 read model 실패 테스트 구축.
  • goal mismatch, task mismatch, empathic miss, withdrawal, confrontation, successful/failed repair를 포함한 첫 benchmark pack 구축.
  • G0 종료 GATE 재검증 — post-merge dump의 disposable clone에 migrations 14/15/16을 각각 두 번 원자 재적용하고 current source census 29/29 producers, unknown/missing/null/orphan/호환성 위반 0을 확인했다. 증거: ops/evidence/g0-provenance-census-scratch-post-g6-g8-20260807.json.

I-1. G1 Alliance Core

  • goal/task/bond의 내담자·관찰자·수련생 3관점 측정과 회기 전·중·후 pulse 구현.
  • 현재 alliance_level을 legacy simulation signal로 격리하고 새 alliance read model 구축.
  • 학습자 리뷰의 관점 차이·근거 장면 UI 구현.
  • 교수자 재평가를 append-only measurement로 구현.
  • G1 종료 GATE — 세 관점 독립 실행·저장, 축별 비가림 UI, 골든 장면 분류·근거 span, 평가 실패의 정상 점수 폴백 0건. 증거: G1 focused backend 43 passed, PostgreSQL RLS/append-only/reveal 실원장 smoke, desktop/mobile Alliance Pulse 6/6 및 기존 회기 리뷰 12/12, prompt 1.2.0 합성 gold 방향 정확도 9/9·최종 실패 0·근거 recall 88.9%. 실제 Session 진입 전 pre pulse를 fail-closed로 잠그고 첫 라운드 뒤 mid pulse를 비차단형으로 연결했으며, stable ID 재시도·변조 409·교차 회기 404를 통과했다. desktop/mobile pre·mid focused E2E 2/2와 시각 증거 4장을 보존했다. 추가 source API/dev DB 실증은 한 회기의 pre(degraded/insufficient_transcript) → mid(ready) → post(ready)를 실제 turn UUID·ended_at과 함께 닫고, 동일 응답 안의 awaiting/external-event read skew와 degraded terminal DB 제약을 교정했다. 증거: ops/evidence/alliance-pulse-pre-mid-post-live-2026-08-07.json. 현재 승격 기준 prompt 1.2+read-skew fix+ 보수적 trailing-comma JSON 복구의 전체 재보정은 24/24 ready, 기대 방향 9/9, 오류·재시도 0, evidence recall 94.4%·precision 73.9%를 기록했다. human-AI ICC는 내부 구현 종료가 아니라 Phase 3 외부 품질 목표다.

I-2. G2 Longitudinal Outcome Trajectory

  • 최소 5회기 사례 arc와 예상 성과 궤적 분포 구현.
  • safety event와 outcome deterioration의 별도 계약·표시 구현.
  • 초기 1~5회기 off-track 탐지와 다음 확인 질문 구현.
  • case memory에 관계 사건·합의·미해결 균열을 role-safe하게 추가.
  • G2 종료 GATE — 5회기 기억·목표·관계 연속성, 악화 benchmark 조기경보 목표, false alert·uncertainty 병기, 합성 궤적의 임상 결과 오표시 0건. 증거: 4-case×5-session benchmark status 정확도 1.0·false alert 0·critical miss 0, 실제 DB/API 5회기 연속 case와 15개 독립 축, 멱등 재시도·변조 409·학습자/코호트 RLS·role-safe 관계 기억 통과, desktop/mobile 체크인·궤적 12/12와 G1/기존 리뷰 15/15 회귀 통과. 추가 실제 PostgreSQL producer→store→evaluator smoke는 합성 교육용 악화 case의 on_track→off_track→deteriorating과 단발성 noise control의 on_track→watch→on_track·false alert 승격 0건을 실제 10회기·30 measurement·case별 5 revision으로 검증했고 learner/teacher 최신 projection이 일치했다. 원점수는 증거 JSON에 복제하지 않았고 임상 주장은 금지한다.

I-3. G3 Rupture & Repair Lab

  • rupture/repair 상태머신과 이벤트 원장 구현.
  • Scenario Director의 자연스러운 균열 주입 구현.
  • 실시간 감지, 회기 후 장면 재생, 복구 분기 비교 구현.
  • 후속 발화에서 복구된 fast-loop 경고의 deep-loop reconciliation 구현.
  • G3 종료 GATE — 유형별 탐지·복구 benchmark, missed/partial/resolved E2E, 순응 유도 judge gaming 0건, 문장 암기 전략의 변형 사례 실패 검증. 증거: 11-case macro-F1 1.0·복구 상태 accuracy 1.0, critical miss/judge gaming/암기 false resolution 0, Scenario/G3 107 passed, G0~G8 계약 251 passed, desktop/mobile 리뷰 50/50, 실제 API/DB durable-turn·멱등·RLS·교수자 append-only correction·최종 resolved 검증. 기존 수동 write smoke의 missed→partial→resolved와 별도로, 실제 submit_turn/공용 finalizer callback만 사용한 자동 runtime PostgreSQL smoke에서 3 episode·10 observation· 3 reconciliation, 세 상태, learner/teacher read projection, 세션 밖 evidence 참조 0건을 재현했다.

I-4. G4 Deliberate Practice Engine

  • 평가 장면을 원자적 practice prescription으로 변환.
  • replay, branch, constrained response, voice retry, difficulty ladder 구현.
  • competency graph와 attempt evidence 저장.
  • 약한 역량과 망각 위험에 따른 다음 연습 자동 선택.
  • G4 종료 GATE 재검증 — 모든 코칭 카드의 실행 가능한 재연습 연결, 전후 비교·근거 저장, 미지 사례 전 mastery 금지, 점수 보상 해킹 benchmark 통과. 증거: G4 core/store/API 54 passed, 실제 API/DB durable-turn 처방→학습자 시도→교수자 append-only correction, 멱등 retry/변조 409, learner/cohort RLS, reward-claim practicing·mastery_allowed=false, G4 UI 8/8 및 G1~G4 리뷰 58/58. replay/branch/constrained response/voice retry/difficulty ladder 카드 CTA가 학습자 홈→사전 설정→실제 새 Session으로 이어지고 launch intent가 URL과 화면에 유지되는 desktop/mobile 22/22 및 통합 59/59를 통과했다. 추가 실제 PostgreSQL production caller smoke는 ready 평가·durable turn 2개에서 G4 submission/card/prescription/snapshot/ decision 각 1개를 자동 생성하고 재실행 시 같은 deterministic submission/card replay, episode·attempt·mastery· transfer 승격 0건을 확인했다. 실제 API/DB/엔진 smoke는 prescriptions 2·episodes 6·attempts 6· append-only correction 1·ready observer model-run 2를 통과했다. post-merge disposable clone의 브라우저는 route mock 0으로 desktop 2/2·mobile 2/2, G4 POST·read-model reload·before/after·멱등 retry를 확인했고 최종 episode/attempt/ready observer 각 1, UUID 노출·마이크 호출·overflow·중복 0이다. 증거: ops/evidence/scratch-browser-returned-practice-closed-loop-evidence-20260807.json.
  • 학생 자기주도 전체 루프 UI 계약 — 실제 src 학습 홈 추천→P1·목표 선택→텍스트/SSE 회기→ 종료·리뷰→G4 공감적 반영 처방→키보드 CTA→새 회기 사전 설정·시작까지 desktop/mobile 2/2, typecheck와 고정 캡처 9장 시각 QA를 통과했다. 홈 CTA는 40px→44px 및 4.5:1 이상 대비로 보정했고, 390×844·320×568 활성 회기의 아바타/문구 겹침 0·축어록/입력창 카드 내부 포함과 리뷰→재연습의 내부 criterion/counterevidence/UUID/영문 이론키 비노출을 고정했다. 리뷰 1~5 척도는 320px에서 3+2 반응형 배열로 전환해 다섯 선택지 44px 이상·내부/페이지 overflow 0을 desktop/mobile 8/8로 고정했다. 이 검증은 모든 미소유 /api/**를 404로 닫은 로그인 없는 route fixture이며 실제 API/DB 폐루프라고 주장하지 않는다. 상세: docs/ops/outcome-os-self-directed-learning-loop-ui-evidence-2026-08-07.md.

I-5. G5 Calibration Mirror & Transfer

  • 외부평가 공개 전 자기평가 잠금 흐름 구현.
  • 역량별 calibration error와 신뢰도 구간 계산.
  • 과신·과소신 맞춤 메타인지 연습 자동 처방.
  • 인구통계·관계스타일·난이도를 바꾼 transfer suite 구현.
  • G5 종료 GATE 재검증 — 자기평가 오염 방지·수정 이력, 반복 연습의 calibration error 감소, 새 사례 역량 유지, subgroup 평가 드리프트 리포트. 증거: 4-case expectation accuracy 1.0, lock 뒤 오염 거부 1, calibration MAE 0.667→0.267, unseen 4/4 전이, 암기 false verification 0, 합성 subgroup drift 0.667 탐지. 실제 API/DB durable-turn revision→lock→독립 reveal·멱등/409·RLS, G5 UI 4/4, G1~G5+기존 리뷰 62/62, typecheck/build 통과. transfer CTA는 novelty=unseen_transfer·suite·trial을 학습자 홈→사전 설정→실제 Session까지 보존하며 desktop/mobile 2/2와 실제 세션 통합 2/2를 통과했다. 추가 production caller 실 DB smoke는 prediction lock 전 observation 0건, lock callback 뒤 failed·model_inferred·independent_observer 관찰과 turn/session provenance model-run 각 1개를 확인했다. 재실행 중복 0, passed·assessment·transfer suite/trial/승격 0이며 learner/teacher projection이 일치한다. 학생 후속 종료 회기에서 actual-execution POST·422 대기·503 재시도· 성공 reload·멱등 재확인 UI와 내부 UUID 비노출은 desktop/mobile 16/16으로 연결했다. 실제 API/DB/엔진 smoke는 execution·model-inferred·independent observer·instrument/evidence/model-run provenance 각 1과 멱등·오류 출처·미종료·타학습자·교차 cohort 차단을 통과했다. 같은 post-merge disposable clone 브라우저는 desktop/mobile 4/4로 G5 POST→reload→before/after와 1→1 멱등 재확인을 통과했고 UUID 노출·마이크 호출· 중복 원장 0이다. 합성 교육 fixture이고 임상·실제 숙달 주장은 금지한다.

I-6. G6 Supervision & Research OS

  • attention queue와 learner drilldown을 새 측정 원장 기반으로 재구축.
  • 교수자 정정·AI 불일치를 calibration dataset으로 연결.
  • cohort curriculum gap, model drift, instrument version 비교 구현.
  • Phase 3 evidence manifest에 alliance/rupture/transfer/calibration 추가.
  • G6 종료 GATE 재검증 — 위험·정체·미해결 관계 사건 3클릭 이내, 모든 집계의 원장 drilldown, 모델·척도 버전별 재현 리포트, public/teacher/learner 경계·감사 로그 검증. 증거: 6-signal queue 순서 정확·drilldown 1/상한3, metadata-only dataset raw transcript 0, version drift 탐지, Phase3 네 도메인 전건. 실제 API/DB 멱등/409·AI-view·역할/cohort RLS·audit, version/subgroup/artifact provenance hydrate 통과. 추가 scheduled producer는 G0~G5 실제 원장에서 attention/gap을 파생하고, repo-approved synthetic baseline/candidate와 실제 measurement anchor 12개를 자동 비교해 batch 2·report 1· subgroup 2를 저장했다. replay 중복 0, periodic 6 cohort 성공, drift/provenance hydrate, transcript 0·비임상 경계를 확인했다. G6 focused 37 passed, G6 UI desktop/mobile 6/6, typecheck/build 통과. 최신 safety-event metadata-only 우선 producer는 post-merge disposable clone의 current source에서 derive 201, safety_boundary(1) > deterioration(2), direct pointer 각 1, source detail canary 1·G6 projection canary 0, raw transcript/임상 주장 0을 통과했다. NAS 승격은 배포 증거이지 internal 종료 조건과 분리한다. 상세: ops/outcome-os-g6-ledger-producer-evidence-2026-08-07.md, ops/outcome-os-g6-version-comparison-producer-evidence-2026-08-07.md, ops/evidence/g6-safety-priority-runtime-scratch-20260807.json.

I-7. G7 Multimodal Alliance

  • STT word timestamp, silence, overlap, interruption, prosody feature event 통합.
  • 텍스트·음성 평가 독립 산출 후 calibrated fusion 구현.
  • 장면별 오디오 재생과 음성 재연습 구현.
  • 비언어 특징의 과도한 임상 추론 차단 계약·테스트 구현.
  • Deepgram streaming STT adapter와 OpenAI batch fallback을 보존하고, 운영 기본 경로를 노트북 상주 local_whisper/melotts로 전환해 interim/final·word timestamp·provider event 계약을 동일하게 구현.
  • 저장 word token을 deployment SESSION_SECRET 기반 HMAC-SHA256 pseudonym으로 전환하고 원문 미보존을 고정.
  • 열린 streaming 중 동의를 1초마다 재검사해 철회 시 provider 전송·후속 저장을 중단하는 fail-closed 계약 구현.
  • 음성 단절/실패 뒤 작성 중 텍스트를 보존하고 텍스트 계속하기·키보드 가능한 음성 재연결 recovery UX 구현.
  • 외부 OpenAI TTS adapter와 AI 생성 음성 고지를 보존하면서, 운영 기본 TTS를 상업 사용 가능한 MeloTTS Korean(MIT) loopback 사이드카로 전환.
  • authenticated WSS ready에 STT/TTS provider·model을 노출하고, 마이크 열거·캡처 없는 public preflight가 네 기대값과의 정확 일치를 검사하도록 구현. full soak만 명시적 --confirm-physical-capture 뒤 장치를 연다.
  • synthetic gold target에 대해 text-only와 calibrated multimodal 출력을 직접 비교하는 1-MAE benchmark를 구현하고 0.9533→0.9673, 실측 gain +0.014(최소 0.01)와 gold 변조 반례를 통과했다.
  • consent mutation·timeline·measurement를 session 공통 PostgreSQL transaction lock으로 직렬화하고 실제 개발 DB 동시 철회에서 미커밋 중 writer 대기, 철회 커밋 뒤 저장 차단, timeline row 0을 확인했다.
  • 10MiB audio buffer를 append 전에 거부하고 streaming event queue 32, Deepgram receive queue 16을 고정했다. 단일 프로세스 cap probe는 10MiB high-water·초과 거부·clear 뒤 RSS 기준선 복귀를 확인했다.
  • 첫 음성 사용은 처리 목적·전송/전사·파생 신호·30일 보존·원음 미보존·철회/삭제·텍스트 대안을 설명하고, 서버 동의 원장 성공 전 getUserMedia와 voice WebSocket을 모두 0회로 유지한다. 원장 실패와 지연 권한 응답도 마이크 track/소켓을 남기지 않으며 숨은 Space 대신 안내 가능한 Alt+M을 사용한다.
  • process-local metadata-only /admin/voice-runtime과 Uvicorn --ws-max-queue 4를 추가해 worker RSS/CPU/FD, WebSocket·provider session·audio buffer·event queue·overflow/fallback/error high-water를 관측 가능하게 만들었다.
  • public WSS evidence v4의 turn별 interim/speech-final/latency 계약, 같은 worker를 고정하는 runtime sampler, exact image/container/cgroup/proc/Docker/TCP topology sampler, 독립 blind human-held-out voice-gain 계약과 네 artifact를 같은 public host·동시 시간창으로 묶는 check-g7-external-proof.py를 구현했다.
  • G7 내부 hardening exact SHA a8c27b0aadcb9dacea86c4be5e62e19277b9cc2678ebca51aa02998d2c2d1a0d를 격리 NAS에 승격했다. clean candidate session E2E 24/24, OpenAPI 124, auth 401, G0~G8와 실제 NAS browser SSE→DB review를 통과했고 물리 마이크는 사용하지 않았다.
  • G7 종료 GATE — 오디오·자막·측정 이벤트 시간 정렬, 물리 마이크·공개 WSS 장시간 E2E, 텍스트 단독 대비 음성 이득 benchmark, 음성 보존·삭제·동의 정책 검증. 내부 완료: 실제 API/DB 동의→단일 시계→독립 측정/융합→철회·삭제, actual-Postgres 동시 철회, synthetic gold gain benchmark, bounded queue/10MiB cap RSS probe, Deepgram adapter, HMAC word pseudonym, 1초 동의 재검사, 선행 동의 원장, recovery UX, mic-free expected-provider/model preflight와 외부 증거용 네 artifact checker를 확인했다. 최신 격리 synthetic PCM soak는 59/59 연결 종료·성공 발화 55·철회 차단 2·미동의 차단 1·overflow 거부/복구 1/1, focused 119 passed를 통과했다. 공개 G7 route는 TLS 1.3 handshake·비인증 1008·Cloudflare edge와 마이크 열거/캡처 0을 확인했다. 증거: ops/evidence/g7-public-wss-preflight-current-20260807.json. 남음: 사용자가 장치를 선택하고 명시 동의한 물리 마이크 3,120초, 공통 3,000초 양방향 soak와 동시 runtime/topology high-water, 독립 라벨 held-out/pilot의 실제 음성 이득, 실제 worker·Uvicorn·OS·Cloudflare edge를 같은 50분 시간창으로 묶은 RSS/CPU/queue high-water. preflight·synthetic·옵션 제공만으로 종료하지 않는다.

I-8. G8 Autonomous Content & Continuous Improvement

  • source pack 기반 새 사례·균열·연습·benchmark 초안 자동 생성.
  • 안전·정체성·난이도·정답 누수·문화적 편향 독립 적대 검토.
  • 승인된 콘텐츠만 catalog 승격하고 provenance 보존.
  • metadata-only 운영 incident를 승인 source로 변환해 새 adversarial benchmark pipeline을 실행.
  • repo-approved synthetic source를 durable lease/retry job으로 등록하고 API lifespan에서 opt-in 주기 실행.
  • 운영 측정의 약한 benchmark·drift를 주기적으로 탐색해 위 incident→adversarial 경로를 자동 기동.
  • 실제 Claude pending payload를 사람 검수하고 승인된 projection만 catalog에 0→1로 소비하는 관리자 browser/API/DB E2E. learner/teacher 403·replay 멱등·변조 409·민감 payload 비노출.
  • release agent의 결정적 patch·manifest·clean candidate·API/Web/회기 gate, 격리 NAS 승격, semantic runtime/browser proof, 이미지 rollback, exact-SHA SSOT handoff를 fail-closed로 구현·독립 감사.
  • 위 release agent로 변경 SHA e9b482ccba616a610c1f4862366d44aabae20ee8c82d8ef7f2cf16069f2d6e99를 실제 격리 NAS에 승격하고 postdeploy browser·DB review·rollback snapshot·exact-SHA SSOT handoff를 남겼다.
  • G8 내부 구현·실제 rollback receipt GATE — source→draft→red-team→benchmark→catalog 재현, 정답 누수·PII·무근거 임상 주장 0건, 모델 교체 자동 calibration/rollback, 운영 오류의 재현 테스트·backlog DAG 자동 환류. 현재 코드 증거: caller가 완성 JSON을 넣는 기존 경계와 별도로 source hash·PII fail-closed→structured generator→서로 결과를 공유하지 않는 red-team 2개→variant generator→독립 judge 3개 이상→durable draft_payload·pending_human_approval 저장 worker/API를 추가했다. 모델/structured output 실패, PII, answer leakage, 무근거 claim, reward hacking은 store 호출 전 차단하고 같은 submission은 model call 0으로 재생한다. repo-approved source의 durable lease/retry scheduler를 lifespan에 opt-in 연결했고 실제 claude_cli/claude-opus-4-8 7 calls→dev PostgreSQL reviewer 2·variant 3·pass rate 1.0→ pending_human_approval과 동일 UUID 0-call replay를 확인했다. full API/gateway 858 passed, Ruff·OpenAPI type check·web typecheck 통과. G6 canonical 임계값·subgroup 원장을 재검증하는 default-off drift trigger는 실 DB incident 1·DAG 4·job 1·approval/catalog 0과 동시성·멱등을 통과했다. 기존 실제 Claude pending payload는 새 모델 호출 0회로 관리자 browser에서 catalog 0→1·approval 1, 역할 403· replay 멱등·변조 409를 통과했다. release agent는 독립 감사 4건 수정 뒤 14/14와 전체 API 891 passed를 통과했다. exact SHA의 NAS runtime은 health·OpenAPI 123·auth 401·G0~G8와 browser SSE→DB review를 통과했고 transient 502 rollback/recovery와 최종 readiness 3회째 성공을 기록했다. 상세: ops/outcome-os-g8-agentic-worker-evidence-2026-08-07.md. 현재 소스의 HTTP control-plane executor는 artifact SHA·idempotency key·receipt/evidence가 일치할 때만 executed를 허용하고 미구성은 requested, 호출/receipt 실패는 failed로 남긴다. 2026-08-07 종료: 격리 NAS vignette-preview-20260807에서 실제 receipt-bound image rollback을 두 번 실행했다. 별도 executor helper(127.0.0.1:18149, host network·read-only rootfs·cap-drop ALL· no-new-privileges·uid1028/gid100·group101)와 별도 lifecycle의 control-plane API(127.0.0.1:8018, producer disabled, preview DB 172.22.0.2vignette_app role)를 띄우고, rollback-old plan은 receipt nas-g8-723eeef22eab05e63e3fafb0으로 previous 이미지 79ec…4450/c530…2f28를, restore-current plan은 receipt nas-g8-2738846cf2cf4fbe8ce0fc26으로 current 이미지 52e0…8b2d/6fdb…f215를 활성화했다. release gate·approval 각각 2회 멱등, audit.ci_lifecycle_event rollback/executed 2건과 receipt id 결속, 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 격리는 image가 상속하는 com.docker.compose.* label을 baseline으로 두고 project/service만 격리 override하는 계약으로 검증했다(scripts/launch-nas-preview-g8-helpers.py, fake-runner 37/37). 계획했던 Windows SSH 터널은 NAS sshd가 administratively prohibited로 거부해 sshd 설정 변경 대신 같은 격리 계약의 NAS-side probe 컨테이너로 실행했고 control-plane/preview origin 분리는 유지했다. down/volume rm/prune 미실행, 공개 런타임 미접촉, 비밀 env 파기, helper 0·listener 0 복귀. 상세: 런북 · 기계 판독 증거.
  • 2026-08-07 release-only SHA 6030a677…c611을 격리 NAS에 승격했다. patch 3회 결정성, localhost candidate browser E2E 108/108, postdeploy SSE→DB review 32.437s, health 3/3, OpenAPI 126·auth 401·G0~G8 route, named DB volume 보존을 확인했다. 이는 당시 runtime promotion 증거이며 현재 HEAD 배포 증거가 아니다.
  • clean-head release mode — 명시적 --source-mode clean-head와 별도 detached source root를 추가했다. tracked-dirty 차단, exact HEAD/tree/archive SHA, 2회 결정성, archive-only candidate, patch-mode 무회귀, 증거 binding, source-only insecure-context 12/12 gate(UUID 6 + SHA-256 6), commit 전 NAS-origin 11-spec rollback gate를 unit 30/30·Ruff·py_compile로 고정했다. 첫 execute는 archive CRLF를 candidate에서 정규화하도록 fail-closed했고, 두 번째 execute는 API/types/build 뒤 109/5에서 fail-closed해 둘 다 NAS mutation 0이다.
  • G8 NAS-origin 재검증randomUuid()와 portable SHA-256 수정, insecure-context 12/12 회귀를 포함한 current HEAD를 위 clean-head mode로 격리 NAS preview에 배포한다. started_at의 9시간 오차 P0는 UTC +00:00, KST 달력 날짜, KST browser focused 실DB E2E로 수정했고 API 전체 921 passed와 코칭 이력 1/1을 통과했다. 시간종료 모달 강제 닫기 우회는 없다. 첫 clean commit 5221f79e execute는 API/types/build와 candidate DB-backed 회기 후반까지 통과했지만 Vite 전용 /src/main.tsx 차단 테스트가 production hashed entry를 차단하지 못해 110/2에서 mutation 없이 중단됐다. source와 production preview에서 수정 회귀 2/2씩 통과했다. 이 테스트 수정의 새 clean commit 21461ab3 candidate 112/112 뒤 실제 NAS-origin G4 2건이 crypto.subtle 부재로 실패했고, release agent는 이전 image·health·auth·OpenAPI를 검증해 rollback했다. 문장 원문을 보내지 않는 portable SHA-256 fallback은 secure localhost 2/2와 Tailnet insecure origin 2/2에서 동일 표준 digest를 통과했다. 최종 clean source HEAD 61a41d1f…6af·tree 87dec55d…3b77·2회 동일 archive 4d15d055…119d4d를 NAS에 승격했고 candidate 112/112와 실제 http://100.116.83.60:8088 origin browser review 112/112(11 specs, desktop/mobile/single-run), health ok·db/engine true·auth 401·OpenAPI 126을 통과했다. API/Web는 d5021950…e4b1/9796c092…4b36, fresh dump는 36ec8748…24db8 1,097,100 bytes·TOC 1,738/TABLE DATA 129이며 previous 6030a677…c611을 보존했다.

I-DAG. 첫 에이전트 실행팩 AOS-001~012

  • AOS-001 기존 지표 provenance inventory — 선행 없음. 종료: 모든 현재 점수의 source map.
  • AOS-002 measurement_event ADR/schema/DDL — 선행 AOS-001. 종료: contract + rollback + RLS tests.
  • AOS-003 benchmark case schema와 첫 8개 장면 — 선행 AOS-001. 종료: deterministic fixtures.
  • AOS-004 legacy rapport/alliance adapter — 선행 AOS-002. 종료: 기존 데이터 무손실 read model.
  • AOS-005 goal/task/bond 3관점 structured schema — 선행 AOS-002/003. 종료: gold contract tests.
  • AOS-006 session measurement API — 선행 AOS-005. 종료: API/DB idempotency E2E.
  • AOS-007 학습자 self-assessment lock — 선행 AOS-002. 종료: reveal-order E2E.
  • AOS-008 Alliance Pulse 리뷰 UI — 선행 AOS-006/007. 종료: desktop/mobile visual proof.
  • AOS-009 교수자 measurement drilldown — 선행 AOS-006. 종료: role/RLS/audit E2E.
  • AOS-010 measurement drift/calibration job — 선행 AOS-003/005. 종료: version comparison report.
  • AOS-011 public/deploy proof manifest — 공개 API 126 paths, G1~G8 route, Pages asset, auth/OAuth proof.
  • AOS-012 SSOT/TODO 동기화 — dashboard/TODO/backlog/release manifest 동기화와 checker green.

지금 임계경로 (한 줄)

납품(공개 데모)의 핵심 블로커는 A(공개 /turn proof + 배포 secrets). 그 다음이 **B(한신대 거버넌스)**와 C(Phase 3 파일럿) — C는 2026-07-13 회의로 7월 말~8월 초 파일럿 일정 확정, 그 전제로 **H의 P1(회기 종료 시간 기반)**이 새 구현 게이트다. I(Outcome & Alliance OS)는 현재 감사 기준 G0~G6과 G8이 DONE이다. G8은 receipt-bound 실제 rollback과 current clean source NAS-origin 112/112를 완료했다. G7은 내부 구현 DONE과 외부 proof GATE를 분리하며, current source 공개 배포·local voice ready·authenticated WSS 무마이크 rehearsal은 완료했고, 명시 동의 mic 3,120초·동시 resource high-water·독립 라벨 benchmark·checker exit 0이 남았다. D~G는 품질·확장 작업으로 게이트가 아니다. 상세 상태·검증 증거는 SSOT 대시보드가 소유한다.

  • 직렬 E2E 게이트 잔여(코칭 기능 통합) — 소유자의 70d7cb34(AI 코칭 버튼·버블)가 세션 UI에 새 DOM을 더하며 session-mvp strict 위반('코칭' 버튼 3개)·동맹 체크포인트 포인터 타임아웃(결정적 재현)이 발생. 통합 마감 후 교사 재평가 2건 포함 전체 GREEN 재검증. settings/learner 협폭 레이아웃 결함 91건(sweep 보고)도 함께. 상세: docs/ops/evidence/usecase-tdd-2026-08-18.json