diff --git a/docs/TODO.md b/docs/TODO.md index e1c856a..58a6385 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -27,7 +27,7 @@ | ADMIN-OPENROUTER-001 | 새 사용자 OAuth finish 성공을 관측한다. | API/web 복구·실제 PostgreSQL rollback·배포/보존 census·공개 관리자 UI를 수용했다. OpenRouter UI 상태는 미연결이고 health의 Jev `live_verified=false`는 live 검증이 아니며, 새 OAuth finish 성공 관측 전까지 진행 중이다. [운영 영수증](./ops/evidence/admin-openrouter-recovery-2026-09-22.json)을 따른다. | | JEV-001 | 충분한 한국어 독립 평가와 전체 지연 반복 비교를 마친다. | 운영 API, 합성·인증 브라우저 3턴 runtime과 DB 감정 영속화는 수용했지만 품질 승격은 보류한다. API legacy baseline 1191 passed·1 skipped·0 failed, gateway 82 passed는 구현 회귀 증거이며 품질·성능 우위 증거가 아니다. 위 품질 게이트를 닫은 뒤 전체 사용자 흐름 완료 여부를 판단하며, 최신 probe·수용/반려 근거는 [Jev 결정문](./decisions/jev-client-affect.md)을 따른다. | | JEV-002 | v2 평가·표현 프로토콜을 운영에 올리고 실제 대사 영향을 관측한다. | 로컬 구현·실 Jev 16/16·실 DB RLS 15항목·실 스택 레이아웃을 수용했다. 운영은 migration 24를 먼저 적용한 뒤 API·web을 배포한다(스키마 없이 배포하면 readiness가 기동을 막는다). 로컬 `claude_cli` 생성 엔진 시간 초과로 v2 지시가 실제 대사에 미치는 영향은 미관측이다. 보정 관찰(`a_understood` 문구, `a_sore_spot` 과다 선택)은 전문가 검토 대상이다. [v2 프로토콜](./decisions/jev-client-affect-v2.md) | -| AVATAR-V3 | 가상 내담자 아바타 v3(표현 엔진·반응 모션·리노컷 리그)를 P1부터 세션에 연결한다. | 1단계 엔진·`/dev/avatar-lab` 수용(check:avatar-presets 통과·E2E 6 passed), 2단계-A P1 리노컷 레이어 수용. 2단계-B-1b 렌더러 기능 계약·B-1c 모티프 수용. 진행: 2단계-B-1d 표정 판독성 개정(입술 결 래스터, 눈썹 중심선 랜드마크, 이마 주름, 작은 크기 선 보정)과 발화층 립싱크(한글 비짐 + 오디오 선분석, 결정문 §5.4 — 구현·검증됨), 발화 동반층 §5.5·하관 띠 변형(턱·코·볼)·원화 픽셀 입술 구현, 2단계-B-1d 수용(소유자 시각 확인 대기). 2단계-B-2 세션 연결 수용·운영 반영(master `613bcb60`, 공개 웹 Pages `dd96c2d5`, 2026-10-01). 남음: 운영 화면 소유자 시각 확인, 3단계 API `avatar_cue`·지문 어휘 가이드, 4단계 7명 외형 SSOT. [결정문](./decisions/avatar-expression-engine-v3.md) | +| AVATAR-V3 | 가상 내담자 아바타 v3(표현 엔진·반응 모션·리노컷 리그)를 P1부터 세션에 연결한다. | 1단계 엔진·`/dev/avatar-lab` 수용(check:avatar-presets 통과·E2E 6 passed), 2단계-A P1 리노컷 레이어 수용. 2단계-B-1b 렌더러 기능 계약·B-1c 모티프 수용. 진행: 2단계-B-1d 표정 판독성 개정(입술 결 래스터, 눈썹 중심선 랜드마크, 이마 주름, 작은 크기 선 보정)과 발화층 립싱크(한글 비짐 + 오디오 선분석, 결정문 §5.4 — 구현·검증됨), 발화 동반층 §5.5·하관 띠 변형(턱·코·볼)·원화 픽셀 입술 구현, 2단계-B-1d 수용(소유자 시각 확인 대기). 2단계-B-2 세션 연결 수용·운영 반영(master `613bcb60`, 공개 웹 Pages `dd96c2d5`, 2026-10-01). P2~P7 리노컷 캐스트 리그 수용·세션 활성화(2026-10-01, 결정문 §8.4.1, 공개 웹 미반영). 남음: P2~P7 공개 웹 반영, 운영 화면 소유자 시각 확인, 흰자 색 원화 실측·`data-render-mode` v3 반영·공황 창백 오버레이 사각 경계(후속 다듬기), 3단계 API `avatar_cue`·지문 어휘 가이드, 4단계 7명 외형 SSOT. [결정문](./decisions/avatar-expression-engine-v3.md) | | USER-LATENCY (JEV-001) | 실제 경로에서 text display·voice onset·완료 준비를 분리 측정한다. | 안전 검사를 유지한 최적화 뒤 반복 비교로 사용자 체감 지연을 평가한다. 현재 CUA 관측상한과 소수 audit은 속도 개선 증거가 아니다. | | G6-PRODUCER-CONFLICT | 기존 submission id와 content hash를 읽기 전용으로 대조한다. | `SupervisionResearchConflictError`의 동일 id 재실행 idempotency 충돌을 해소하고 해당 테스트와 실제 cycle 성공을 확인한다. Jev·세션 경로와 분리된 기존 운영 충돌이며, 이번 배포 회귀로 단정하지 않는다. | | VNET-001 | `vnet.18ka.net` 공개 전환의 외부 설정을 마친다. | DNS, Cloudflare zone 권한, Google redirect URI가 모두 준비된 뒤 live 검증. | diff --git a/docs/decisions/avatar-expression-engine-v3.md b/docs/decisions/avatar-expression-engine-v3.md index f05252b..898b9bb 100644 --- a/docs/decisions/avatar-expression-engine-v3.md +++ b/docs/decisions/avatar-expression-engine-v3.md @@ -461,6 +461,67 @@ type Performance = { - **로드 실패**: 레이어 하나라도 실패하면 `data-load-state="error"`와 콜백으로 알린다. 세션(2B-2)은 이때 기존 SVG 리그로 되돌아간다. 이 환경에서 SVG ``의 load·error 이벤트가 발동하지 않아(원인 미확인, 2단계-B-1b 관찰) 같은 href를 `HTMLImageElement`로 미리 불러 로드 상태를 집계한다. - 새 공연(`playPerformance`)은 이전 공연의 **미발동 cue를 모두 취소**한다. 이미 재생 중인 클립은 자연 종료한다. +### 8.4.1 캐스트 확장 (P2~P7, 2026-10-01 설계) + +- **원화 선택**: 소유자 지시("모든 사람 병렬로, 지금 아트웍 스타일을 따라서, 다양한 표정과")에 따라 오케스트레이터 추천안을 쓴다. 소유자가 바꾸면 해당 페르소나만 다시 돈다. + + | 페르소나 | 후보 파일 | + |---|---| + | P2 | front-b | + | P3 | front-v2b | + | P4 | front-v2b | + | P5 | front-v2a | + | P6 | front-v2b | + | P7 | front-v2b | + +- **편집본을 원본 구도에서 만든다**: 얼굴 없는 기본형·몸 원본은 정규화 전 원화를 참조로 codex 편집한다. 페르소나마다 2장씩 만든다. 프롬프트는 `pN-linocut/prompts/`에 있고, P1 문구에서 사람·소지품만 바꿨다. + - 패딩된 가장자리를 모델이 "고치는" 일을 막기 위해서다. + - 편집본은 `register_edit.py`(ECC 정렬)로 원화 좌표에 맞춘다. + - 머리카락·옷·얼굴 윤곽의 에지 챔퍼 거리로 수용한다. + - faceless: 중앙값 ≤1.0px, p90 ≤2.5px, 윤곽 띠 p90 ≤2.0px + - body: 중앙값 ≤1.5px, p90 ≤3.0px +- **정규화**: `normalize_base.py`가 원화·얼굴 없는 기본형·몸 원본을 한 변환으로 P1 캔버스 1005×1566에 옮긴다. + - 머리 배율은 P1과 같게 한다. 눈-턱·눈 사이 거리 비의 평균이다. + - 폭은 반드시 덮는다(배율은 s = max(s_head, 1005/원화 폭)). 두 눈 중점은 P1에 맞춘다. + - 위아래 빈 곳은 반사 패딩한다. + - 렌더러 기하 상수(px)가 P1 머리 크기 기준이라, 머리 크기를 맞추는 것이 조건이다. 측정한 s_head는 0.91~0.97이다. + - 아래쪽 판화 끝선이 캔버스 바닥보다 위에서 끊길 수 있다. 이는 portrait 크롭에서만 보이고, 세션의 bust·face 크롭에는 들어오지 않는다. +- **눈썹 굵기를 원화에서 잰다**: 리그 계약 `RigBrow.halfWidth?: [안쪽, 꼭짓점, 바깥]`을 추가했다. + - 렌더러 반두께가 P1 설계값 [4.5, 3.2, 1.0]으로 고정이면, 굵은 눈썹(남성·성인) 원화가 가는 벡터 눈썹으로 바뀌어 "원화를 따른다"는 원칙이 깨진다. + - brow_centerline이 잉크 띠 반두께를 재고 export_rig이 쓴다. + - P1은 `browHalfWidthFromArt: false`로 기존 리그를 유지한다(소유자 검수본). +- **세션 반영 단위**: 파이프라인이 만든 리그는 Lab(`import.meta.glob`)에서 바로 보인다. 세션 레지스트리(`linocutRigFor`)에는 오케스트레이터가 표정 시트를 판정한 페르소나만 넣는다. +- **표정 검수**: 페르소나마다 4가지를 본다. + - 16표정 bust·face 시트 + - 비짐 9종 + - neutral 렌더와 원화 대조 + - P1과 같은 판정 기준: 중립 렌더 = 원화, 얼굴이 원화 인물 그대로, 표정 구분 +- 모티프 스프라이트(시계·촛불·연·참새·고치/나비·달팽이)는 세션에 아직 배치하지 않아(§8.5) 이번 범위 밖이다. +- **제작 중 확정한 추가 규칙(2026-10-01 P7 시범 판정)** + - **얼굴 해칭은 원화 픽셀로 지킨다** + - codex 얼굴 지우기 편집은 눈·입뿐 아니라 얼굴 전체 해칭(다크서클·볼 빗금·팔자·수염)까지 지운다. + - persona.json `faceDetail.region: "face"`이면 faceDetail이 얼굴 윤곽 안쪽 전체(윤곽에서 `faceInsetPx` 24px 안쪽, 윤곽 잉크선은 빼서 턱선이 두 겹이 되지 않게 함)를 원화 픽셀로 덮는다. + - 눈·눈썹·입 제외 영역만 faceless로 채운다. + - `matchFacelessColor`는 그 채움을 주변 원화 피부색에 상수 평행이동으로 맞춘다(보간·블러 금지). + - 머리카락 알파 0 마스크는 원화·faceless 분할의 합집합이다. + - P1은 `features`(기존)를 유지한다. + - **눈썹은 원화 스프라이트** + - 벡터 눈썹(반투명 띠 + 털 획)은 P1의 가늘고 옅은 눈썹에 맞춘 것이라, 굵은 판화 눈썹이 "갈색 막대"가 됐다. + - `RigBrow.sprite` + - `brow_sprite.py`가 원화 눈썹 잉크를 뜬다. + - 알파는 잉크 농도이고, L_ink = 잉크 픽셀 휘도 중앙값, 경계 1.5px다. 색은 피부 오염을 역산한다. + - 실제로 위에 그려지는 hairFront 레이어 알파 아래 픽셀은 뺀다. 분할 category로 빼면 굵은 눈썹이 머리카락으로 오분류돼 82%가 사라졌다. + - 렌더러는 이를 세로 16띠로 나눠, 벡터 눈썹과 같은 계수의 inner·peak·outer 변위를 2차 보간으로 옮긴다. + - P7 중립 합성 평균절대차는 7.8/5.0(알파>0 영역)이다. + - **눈꺼풀 선 굵기·홍채는 원화에서 잰다** + - `RigEye.lineScale` + - 원화 윗눈꺼풀 잉크 두께 ÷ P1 2.0px이고, [1, 2.5]로 제한한다. + - 늘어나는 분량은 눈꺼풀 선 **바깥쪽**으로만 더한다. 안쪽으로 두꺼워지면 홍채가 가려져 눈이 졸려 보였다. + - 홍채 중심·반지름은 원화 실측을 쓴다(`irisFromArt`). MediaPipe 홍채는 P7에서 14~15% 컸다. + - P1은 세 필드 모두 false로 기존 리그를 유지한다. + - **정규화 위쪽 빈 곳은 종이색으로 채운다.** 반사 패딩은 머리카락이 원화 위 끝 가까이 오는 후보(P3·P5·P6·P7)에서 머리 위에 뒤집힌 머리카락을 만들었다. + - **QA 시트는 깜빡임을 피해 찍는다.** 3연사 중 눈 윤곽이 가장 큰 장을 고른다. + ### 8.5 세션 연결 (2단계-B-2, 2026-10-01 설계) - 연결 지점 지도(탐색 보고) diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index 72518d8..b965712 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -1043,7 +1043,7 @@
GATE
한신대 공문/데이터 거버넌스 게이트 정리

SSO 클레임, 추가 축어록 수급, 미성년 원본 활용동의, 개인정보 처리방침을 P1 진입 전 외부 의존성으로 명확히 둔다. 로컬 문서 골격은 준비됐지만 한신대/데이터 steward의 written evidence는 아직 필요하다.

산출물

docs/ops/hanshin-data-governance-gate.md, 공문 질의 항목, 동의 범위 체크리스트, SSO claim mapping 표

검증

문서 artifact 작성 완료; IRB 게이트가 아니라 데이터/SSO 게이트로 외부 증거 필요 상태 유지

JEV-001
Jev 감정 판단 실증과 기존 내담자 경로 반복 비교

수용: 신규 artifact 보존 갱신, API legacy baseline 1191 passed/1 skipped/0 failed, engine 82 passed, web typecheck/build/API types 통과, NAS API 배포·공개 JS/CORS preflight, 인증 브라우저 3왕복·6발화와 DB 9축 감정 영속화. 보류: 성능 우위·정확도·품질 승격과 사용자 체감 지연 개선.

산출물

runner/probe·배포 artifact는 Jev 결정문과 운영 증거에서 관리한다.

검증

새로고침 뒤 6발화 복원, 종료 review의 실제 6발화 요약·deep-loop 완료와 DB 종료 상태를 확인했다. USER-LATENCY는 text display·voice onset·완료 준비의 실제 경로 분리 측정과 안전 검사 유지 최적화가 남는다. 일시 502 관측 때문에 무중단을 주장하지 않는다.

JEV-002
Jev 내담자 평가·표현 v2와 속마음 공개

수용: P0 가드레일 수단어 오탐("고독"·"다른 방법은") 제거, P1 20문항 질문 세트·반응/기분 분리·생성 지시 v2(1차 반려: noul 응답 필드), P2 migration 24·같은 트랜잭션 저장·세 경로 노출·리뷰(1차 반려: 교수자 cohort 누락·readiness 미등록), P3a 회기·리뷰 속마음 UI(2차 반려: 모바일 스위치 깨짐·컨트롤 바 높이 회귀), P3b 관리자 v2 표시. 보류: 실제 생성 대사 관측, 한국어 판정 정확도·전문가 보정, 운영 배포.

산출물

v2 프로토콜, infra/db/init/24_client_inner_reaction.sql, scratch/jev/v2-appraisal-live.json, scratch/jev/inner-reaction-verify/

검증

HEAD bda7ebb9 대조로 full-sweep-session :644·:878·:974와 layout-visual-gate :970을 사전 실패로 분리했다. 보정 관찰: 공감 반영을 a_understood가 "비껴갔다"로 판정한 1건, a_sore_spot 고확률 선택 2/3건.

-
AVATAR-V3
가상 내담자 아바타 v3 — 표현 엔진·반응 모션·리노컷 리그

소유자 결정(2026-09-30): 렌더는 벡터 리그 고도화를 혼합으로 구체화(덩어리는 판화 질감 이미지 레이어, 표정 부위는 코드 벡터), 강도 비례 하이브리드, P1 서연 파일럿, 아트는 리노컷 판화 + 작은 모티프·배경 색 변화. 수용: 0단계 아트 디렉션(1차 브리프 미충족 → 2차 수용), 트레이싱·참조 편집 spike, 1단계 엔진 코어(채널 33·표정 28·반응 클립 26·지문 파서·보조 cue)와 /dev/avatar-lab, 2단계-A P1 리노컷 레이어(1차 반려 → 분할 마스크 재작업 수용, 정지 합성 평균 절대차 1.22). 2단계-B-1b 렌더러는 기능 계약·E2E 수용, 모티프 스프라이트(2단계-B-1c) 수용. 진행: 2단계-B-1d 표정 판독성 개정 — 3차 캡처 판정에서 입(단색 렌즈 → 원화 입술 결 래스터 + 벡터 모양), 중립 눈썹 사선(원인: 눈썹 랜드마크가 잉크 띠 중심선이 아닌 모서리), 이마 주름 평행선, bust 200px 약한 표정 구분 불가를 반려하고 결정문 §8.4를 개정해 자산·렌더러 워커 병렬 재작업. 소유자 관찰(비탄 눈썹이 너무 위 → 프리셋을 AU1+AU4로, 말하는 입이 인위적 → 립싱크 재설계)에 따라 발화층 §5.4(한글 자모 비짐 9종 + TTS 오디오 선분석 정렬, mouthRound 채널, 페르소나 조음 폭)를 구현·검증(check:avatar-lipsync, avatar-lab E2E 16 passed)했고, 소유자 관찰(입술만 움직여 기괴함)로 발화 동반층 §5.5(억양·강세에 맞춘 고개 표류·끄덕임·들숨·눈썹 박·시선 회피·깜빡임)와 하관 띠 변형(턱·코 들썩, 볼 불룩, §8.4)을 구현했다. 입은 원화 픽셀 입술 스프라이트(24띠 변형, 중립 = 원화)로 바꿨고, 턱 두 줄 결함(투명 음영 비침·정적 clip·head 원본·hairFront 자산 오분류 턱선)과 볼 가장자리 틈을 규명·수정해 2단계-B-1d를 수용했다(out11 직접 확인, avatar-lab E2E 19 passed, 발화 중 rAF p95 6.2ms·long task 0). 소유자가 Lab에서 확인(2026-10-01 "괜찮네")하고 작업 브랜치 YunChan/avatar-v3-linocut-p1-20261001를 forgejo에 푸시했다(master 미병합·미배포). 운영 배포는 세션 연결(2단계-B-2) 뒤에 함께 한다(소유자 결정). 진행: P2~P7 리노컷 캐스트(외형·상징 설계 docs/avatar-art/linocut-cast.md, 원화 후보 v2 생성·소유자 선택 대기, 자산 파이프라인 공통화 docs/avatar-art/linocut-pipeline/ — P1 재실행 바이트 동일), 2단계-B-2 세션 연결 수용(결정문 §8.5·§11: P1 세션·시작 전·썸네일 v3, 오디오 시계 립싱크, TTS 실패 시 텍스트 타이밍, VITE_AVATAR_V3 플래그. 세션 레이아웃·발화·표정 E2E 11 passed, avatar-lab 19 passed) · master 613bcb60·공개 웹(Pages dd96c2d5) 반영 완료(2026-10-01, 운영 묶음·P1 자산 200 확인). 남음: 운영 화면 소유자 시각 확인, 3단계 API avatar_cue·지문 어휘 가이드, 4단계 7명 외형 SSOT. 운영 모델은 괄호 지문을 거의 쓰지 않는다(6턴 0개).

산출물

아바타 v3 결정문, apps/web/src/components/avatar/engine/, docs/avatar-art/art-direction-v3/, docs/avatar-art/p1-linocut/

검증

npm run check:avatar-presets 통과(표정 378쌍 구분, 최소 L1 0.95), e2e/avatar-lab.spec.ts 6 passed(오케스트레이터 재실행), typecheck·build·check:dead-code 통과(워커 보고)

+
AVATAR-V3
가상 내담자 아바타 v3 — 표현 엔진·반응 모션·리노컷 리그

소유자 결정(2026-09-30): 렌더는 벡터 리그 고도화를 혼합으로 구체화(덩어리는 판화 질감 이미지 레이어, 표정 부위는 코드 벡터), 강도 비례 하이브리드, P1 서연 파일럿, 아트는 리노컷 판화 + 작은 모티프·배경 색 변화. 수용: 0단계 아트 디렉션(1차 브리프 미충족 → 2차 수용), 트레이싱·참조 편집 spike, 1단계 엔진 코어(채널 33·표정 28·반응 클립 26·지문 파서·보조 cue)와 /dev/avatar-lab, 2단계-A P1 리노컷 레이어(1차 반려 → 분할 마스크 재작업 수용, 정지 합성 평균 절대차 1.22). 2단계-B-1b 렌더러는 기능 계약·E2E 수용, 모티프 스프라이트(2단계-B-1c) 수용. 진행: 2단계-B-1d 표정 판독성 개정 — 3차 캡처 판정에서 입(단색 렌즈 → 원화 입술 결 래스터 + 벡터 모양), 중립 눈썹 사선(원인: 눈썹 랜드마크가 잉크 띠 중심선이 아닌 모서리), 이마 주름 평행선, bust 200px 약한 표정 구분 불가를 반려하고 결정문 §8.4를 개정해 자산·렌더러 워커 병렬 재작업. 소유자 관찰(비탄 눈썹이 너무 위 → 프리셋을 AU1+AU4로, 말하는 입이 인위적 → 립싱크 재설계)에 따라 발화층 §5.4(한글 자모 비짐 9종 + TTS 오디오 선분석 정렬, mouthRound 채널, 페르소나 조음 폭)를 구현·검증(check:avatar-lipsync, avatar-lab E2E 16 passed)했고, 소유자 관찰(입술만 움직여 기괴함)로 발화 동반층 §5.5(억양·강세에 맞춘 고개 표류·끄덕임·들숨·눈썹 박·시선 회피·깜빡임)와 하관 띠 변형(턱·코 들썩, 볼 불룩, §8.4)을 구현했다. 입은 원화 픽셀 입술 스프라이트(24띠 변형, 중립 = 원화)로 바꿨고, 턱 두 줄 결함(투명 음영 비침·정적 clip·head 원본·hairFront 자산 오분류 턱선)과 볼 가장자리 틈을 규명·수정해 2단계-B-1d를 수용했다(out11 직접 확인, avatar-lab E2E 19 passed, 발화 중 rAF p95 6.2ms·long task 0). 소유자가 Lab에서 확인(2026-10-01 "괜찮네")하고 작업 브랜치 YunChan/avatar-v3-linocut-p1-20261001를 forgejo에 푸시했다(master 미병합·미배포). 운영 배포는 세션 연결(2단계-B-2) 뒤에 함께 한다(소유자 결정). P2~P7 리노컷 캐스트 리그 수용(2026-10-01, 결정문 §8.4.1: 추천 원화로 병렬 제작 — codex 얼굴 없는 기본형·몸 편집 → ECC 정렬 → P1 머리 크기 정규화 → 공통 파이프라인. 얼굴 해칭은 원화 픽셀(faceDetail region face), 눈썹은 원화 스프라이트 16띠, 눈꺼풀 굵기·홍채는 원화 실측. P1 재실행 바이트 동일. 세션 레지스트리 P1~P7 전원 활성, 표정 E2E v3 기대로 갱신 — 아바타·세션 E2E 79 passed/1 skipped, build·typecheck·presets·lipsync·dead-code 통과), 2단계-B-2 세션 연결 수용(결정문 §8.5·§11: P1 세션·시작 전·썸네일 v3, 오디오 시계 립싱크, TTS 실패 시 텍스트 타이밍, VITE_AVATAR_V3 플래그. 세션 레이아웃·발화·표정 E2E 11 passed, avatar-lab 19 passed) · master 613bcb60·공개 웹(Pages dd96c2d5) 반영 완료(2026-10-01, 운영 묶음·P1 자산 200 확인). 남음: 운영 화면 소유자 시각 확인, 3단계 API avatar_cue·지문 어휘 가이드, 4단계 7명 외형 SSOT. 운영 모델은 괄호 지문을 거의 쓰지 않는다(6턴 0개).

산출물

아바타 v3 결정문, apps/web/src/components/avatar/engine/, docs/avatar-art/art-direction-v3/, docs/avatar-art/p1-linocut/

검증

npm run check:avatar-presets 통과(표정 378쌍 구분, 최소 L1 0.95), e2e/avatar-lab.spec.ts 6 passed(오케스트레이터 재실행), typecheck·build·check:dead-code 통과(워커 보고)

ADMIN-OPENROUTER-001
관리자 OpenRouter 복구의 웹 검증과 새 OAuth 재시도

수용: AmbiguousColumnError의 기존 refresh column 참조와 EXCLUDED.extra의 text 캐스트 제거(JSONB 비교)를 수정했고, 실제 PostgreSQL rollback·API 교체·보존 census를 확인했다. 웹 focused 선택 16개와 정적 검증, NAS web·Pages 배포, public entry/health 200과 관리자 UI의 ready·복구 화면 없음은 수용했다. 진행 중: 새 사용자 OAuth finish 성공 관측.

산출물

운영 영수증

검증

API 1173 passed·1 skipped·0 failed, focused 16 passed, health ok·DB/engine true. API 교체 직후 census에서 133개 테이블 중 130개 동일이며 활동 메타데이터 3개는 변했다. OpenRouter UI 미연결과 Jev live_verified=false는 live 검증이 아니며, OAuth finish 성공은 아직 주장하지 않는다.

DONE
ADMIN-AFFECT-001 관리자 감정 관측 trace·그래프 운영 수용

수용: 완료 내담자 턴 trace의 공개 payload 비노출, API, 격리 PostgreSQL RLS·cascade, 성공·rollback 원자성, canonical artifact 기술 6/6, migration 23 운영 적용(RLS 2개 정책·grants·기존 행 0), API legacy baseline 1191 passed/1 skipped/0 failed와 gateway 82 passed, API 운영 health와 Pages 공개 index/AdminAffect JS/CSS·기존 사용자 bundle 200, 인증 CUA의 trace 1개·9축·5단계 분포와 새로고침 복원, NAS web build·컨테이너 교체 exit 0 및 API·engine·DB 컨테이너 유지.

산출물

Jev 결정문, 운영 영수증, /admin/emotions, /admin/affect/sessions

검증 경계

web generate/check API types, typecheck, build, design SSOT와 focused 16개를 통과했고 dark/mobile/추이/관계 캡처 및 실제 리뷰 평가도 수용했다. 실제 1턴 관계 표시는 데이터 부족이며 fixture의 5개 이상 관계 계산 검증과 구분한다. watchdog은 한 차례 반려 뒤 root marker 보완으로 고정 수용했다. 전체 layout-visual-gate는 15개 중 1 passed·1 failed·13 not run이므로 전체 GREEN을 주장하지 않는다.

B1-LAYOUT-720-001
720px prestart 시작 버튼 ancestor clipping

prestart 회기 시작의 clip(left=25, right=695)이 baseline d22cd988과 현재 작업트리에서 동일하다. 감정 관측 기능 원인으로 단정하지 않고 cosmetic backlog로 추적한다.

다음 행동

원인을 분리한 뒤 focused browser 재현·수정 검증을 수행한다.

검증 경계

현재 전체 layout-visual-gate는 15개 중 1 passed·1 failed·13 not run이다. 관리자 3개와 session-layout desktop/mobile 각 4개 통과가 전체 gate 통과를 대체하지 않는다.