아바타 v3 세션 연결 수용 기록과 기준 상태판 동기화
This commit is contained in:
parent
613bcb603e
commit
97c6d5d8ab
4 changed files with 65 additions and 6 deletions
|
|
@ -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)을 따른다. |
|
| 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-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) |
|
| 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 세션 연결·소유자 시각 확인, 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`, 공개 웹 반영은 소유자 실행 대기). 남음: 공개 웹 반영·소유자 시각 확인, 3단계 API `avatar_cue`·지문 어휘 가이드, 4단계 7명 외형 SSOT. [결정문](./decisions/avatar-expression-engine-v3.md) |
|
||||||
| USER-LATENCY (JEV-001) | 실제 경로에서 text display·voice onset·완료 준비를 분리 측정한다. | 안전 검사를 유지한 최적화 뒤 반복 비교로 사용자 체감 지연을 평가한다. 현재 CUA 관측상한과 소수 audit은 속도 개선 증거가 아니다. |
|
| USER-LATENCY (JEV-001) | 실제 경로에서 text display·voice onset·완료 준비를 분리 측정한다. | 안전 검사를 유지한 최적화 뒤 반복 비교로 사용자 체감 지연을 평가한다. 현재 CUA 관측상한과 소수 audit은 속도 개선 증거가 아니다. |
|
||||||
| G6-PRODUCER-CONFLICT | 기존 submission id와 content hash를 읽기 전용으로 대조한다. | `SupervisionResearchConflictError`의 동일 id 재실행 idempotency 충돌을 해소하고 해당 테스트와 실제 cycle 성공을 확인한다. Jev·세션 경로와 분리된 기존 운영 충돌이며, 이번 배포 회귀로 단정하지 않는다. |
|
| G6-PRODUCER-CONFLICT | 기존 submission id와 content hash를 읽기 전용으로 대조한다. | `SupervisionResearchConflictError`의 동일 id 재실행 idempotency 충돌을 해소하고 해당 테스트와 실제 cycle 성공을 확인한다. Jev·세션 경로와 분리된 기존 운영 충돌이며, 이번 배포 회귀로 단정하지 않는다. |
|
||||||
| VNET-001 | `vnet.18ka.net` 공개 전환의 외부 설정을 마친다. | DNS, Cloudflare zone 권한, Google redirect URI가 모두 준비된 뒤 live 검증. |
|
| VNET-001 | `vnet.18ka.net` 공개 전환의 외부 설정을 마친다. | DNS, Cloudflare zone 권한, Google redirect URI가 모두 준비된 뒤 live 검증. |
|
||||||
|
|
|
||||||
|
|
@ -461,6 +461,50 @@ type Performance = {
|
||||||
- **로드 실패**: 레이어 하나라도 실패하면 `data-load-state="error"`와 콜백으로 알린다. 세션(2B-2)은 이때 기존 SVG 리그로 되돌아간다. 이 환경에서 SVG `<image>`의 load·error 이벤트가 발동하지 않아(원인 미확인, 2단계-B-1b 관찰) 같은 href를 `HTMLImageElement`로 미리 불러 로드 상태를 집계한다.
|
- **로드 실패**: 레이어 하나라도 실패하면 `data-load-state="error"`와 콜백으로 알린다. 세션(2B-2)은 이때 기존 SVG 리그로 되돌아간다. 이 환경에서 SVG `<image>`의 load·error 이벤트가 발동하지 않아(원인 미확인, 2단계-B-1b 관찰) 같은 href를 `HTMLImageElement`로 미리 불러 로드 상태를 집계한다.
|
||||||
- 새 공연(`playPerformance`)은 이전 공연의 **미발동 cue를 모두 취소**한다. 이미 재생 중인 클립은 자연 종료한다.
|
- 새 공연(`playPerformance`)은 이전 공연의 **미발동 cue를 모두 취소**한다. 이미 재생 중인 클립은 자연 종료한다.
|
||||||
|
|
||||||
|
### 8.5 세션 연결 (2단계-B-2, 2026-10-01 설계)
|
||||||
|
|
||||||
|
- 연결 지점 지도(탐색 보고)
|
||||||
|
- `Session.tsx`의 ClientAvatar: 시작 전 정지 화면(size 168, animated false)과 진행 중 화면(state·affect·analyser·rapport, size 220)
|
||||||
|
- TTS 재생: `playTtsAudio` — decodeAudioData → `source.start()`, 실패 시 HTMLAudio
|
||||||
|
- 발화 텍스트: 텍스트 모드 `clientReply`, 음성 모드 reply `payload.text`. 자막 원문에 괄호 지문이 남아 있다.
|
||||||
|
- 실제 아바타 박스 크기는 `session.css`가 정한다: 진행 중 58~204px, 시작 전 88~168px.
|
||||||
|
- **분기**
|
||||||
|
- ClientAvatar의 기존 props(확정 인터페이스)는 바꾸지 않는다. 선택 prop만 더한다.
|
||||||
|
- 페르소나에 리노컷 리그가 있으면(리그 레지스트리 `v3/rigs/index.ts`, 지금은 P1만) 내부에서 v3 래퍼(`v3/ClientAvatarV3.tsx`)로 그린다.
|
||||||
|
- 빌드 플래그 `VITE_AVATAR_V3=0`이면 모두 기존 SVG다. 기본은 켜짐이다.
|
||||||
|
- **같은 캐릭터는 어디서나 같은 그림**: 시작 전 화면과 학습자 홈 썸네일(`animated=false`)도 v3로 그린다. 렌더러는 `running=false`여도 기본 자세 한 프레임을 계산해 벡터 부위를 그려야 한다. 지금은 얼굴이 비어 보인다.
|
||||||
|
- **로드**: 리그 이미지가 준비될 때까지 기존 SVG를 보이고, 준비되면 300ms에 걸쳐 v3로 바꾼다. `data-load-state="error"`면 기존 SVG로 남는다(§8.4 로드 실패).
|
||||||
|
- **엔진**
|
||||||
|
- 래퍼가 소유한다. `createAvatarEngine({ demeanor: demeanorFor(persona), seed, reducedMotion })`이고, seed는 페르소나 코드 해시다. 페르소나가 바뀔 때만 다시 만든다.
|
||||||
|
- 시계 함수는 안정 참조(ref)로 넘긴다. 인라인 함수는 리렌더마다 rAF 루프를 다시 시작시킨다.
|
||||||
|
- reduced motion은 `prefers-reduced-motion`을 따른다.
|
||||||
|
- **상태·표정**
|
||||||
|
- state prop을 `engine.setState`로 넘긴다.
|
||||||
|
- affect(겉표정)와 강도를 `setSurface`로 넘긴다.
|
||||||
|
- 새 선택 prop은 `openness?`(세션 `effective_openness`)와 `surfaceIntensity?`다. surfaceIntensity는 Session이 `surfaceIntensityFor`(performance.ts)로 계산한다.
|
||||||
|
- 없으면 openness는 rapport로 대신하고, 강도는 0.5로 둔다.
|
||||||
|
- **발화**: 새 선택 prop `speech?: AvatarSpeech | null`을 둔다.
|
||||||
|
- 형태: `{ id: string; text: string; audio?: { buffer: AudioBuffer; context: BaseAudioContext; startAt: number } }`
|
||||||
|
- text는 괄호 지문을 포함한 원문이다.
|
||||||
|
- startAt은 `source.start(when)`의 when이다.
|
||||||
|
- Session이 TTS 재생을 시작할 때 넘긴다. decode 직후 `when = ctx.currentTime + 0.08`로 예약해, 래퍼가 그 사이 타임라인을 만들게 한다.
|
||||||
|
- 래퍼는 id가 바뀌면 `buildPerformance`(지문 → cue, speakableText)를 호출하고, `buildSpeechTimeline`(오디오 포락선 정렬)과 `buildCoSpeechPlan`으로 계획을 만든다.
|
||||||
|
- 매 프레임 `tMs = (context.currentTime − startAt)·1000`(오디오 시계)으로 `sampleSpeech`·`sampleCoSpeech`를 표본한다.
|
||||||
|
- 지문 cue는 `playPerformance`로 재생한다.
|
||||||
|
- HTMLAudio 폴백(AudioBuffer 없음)이나 TTS 실패면 `speech = { id, text }`(audio 없음)를 넘긴다. 래퍼는 텍스트 타이밍(`demeanor.speech.syllablesPerSec`)으로 엔진 시계에서 말한다.
|
||||||
|
- **토큰 스트리밍 중(speaking이지만 speech 없음)에는 입을 움직이지 않는다.** 지금은 텍스트가 나올 때와 음성이 나올 때 두 번 입이 움직인다.
|
||||||
|
- 재생 중단(일시정지·위기·건너뛰기 등 기존 stop 경로)에서 Session은 speech를 null로 바꾼다. 래퍼는 발화층·동반층을 비우고, 미발동 cue는 다음 playPerformance가 취소한다.
|
||||||
|
- **화면**
|
||||||
|
- 박스가 120px 이상이면 bust 크롭, 미만이면 face 크롭이다.
|
||||||
|
- 원형 오브 안에서는 래퍼가 원형으로 자르고, 배경 색면은 원 안에 그대로 둔다.
|
||||||
|
- 모티프는 이번에 세션에 넣지 않는다(무대 레이아웃 변경, 별도 결정).
|
||||||
|
- **누설**: 2단계에서는 내지 않는다(3단계 API `avatar_cue`). 지금 웹의 `inner_reaction`은 피드백 정책에 따라 오지 않을 수 있다.
|
||||||
|
- **테스트 계약**
|
||||||
|
- v3 루트는 `data-avatar-renderer="linocut"`, `data-load-state`, 그리고 발화 중 `data-viseme`(현재 비짐)을 낸다.
|
||||||
|
- `avatar-expression.spec.ts`의 P1 SVG 기대는 v3 기대로 바꾸고, P2~P7은 SVG 그대로 둔다.
|
||||||
|
- 레이아웃 게이트(`layout-visual-gate`, `session-layout`)는 P1·P2 둘 다로 통과해야 한다.
|
||||||
|
- 세션 E2E로 모킹한 TTS 오디오 재생 중 `data-viseme`가 바뀌는지 확인한다.
|
||||||
|
|
||||||
### 8.3 외형 SSOT (4단계)
|
### 8.3 외형 SSOT (4단계)
|
||||||
|
|
||||||
- 캐릭터 카드에 `avatar` 블록(`look`: 나이 표지·성별 골격·얼굴형·눈매·헤어·의상·소품·캐릭터 신호, `demeanor`: 기본 자세·expressivity·깜빡임·시선 회피·idle 클립 빈도)을 두고 `PersonaSummary`로 내보낸다.
|
- 캐릭터 카드에 `avatar` 블록(`look`: 나이 표지·성별 골격·얼굴형·눈매·헤어·의상·소품·캐릭터 신호, `demeanor`: 기본 자세·expressivity·깜빡임·시선 회피·idle 클립 빈도)을 두고 `PersonaSummary`로 내보낸다.
|
||||||
|
|
@ -473,7 +517,7 @@ type Performance = {
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 0 | 아트 디렉션 선택 | 스타일 프레임 4종 생성·오케스트레이터 검수·소유자 선택 |
|
| 0 | 아트 디렉션 선택 | 스타일 프레임 4종 생성·오케스트레이터 검수·소유자 선택 |
|
||||||
| 1 | 엔진 코어(웹): 채널·프리셋·클립·믹서·지문 파서·성향 기본값 + 디버그 렌더러 + dev Lab(`/dev/avatar-lab`) | typecheck·build 통과, Lab에서 28표정×강도·26클립·지문 텍스트 입력 재생 확인, 구분 가능성 불변량 검증, Playwright Lab 스펙 |
|
| 1 | 엔진 코어(웹): 채널·프리셋·클립·믹서·지문 파서·성향 기본값 + 디버그 렌더러 + dev Lab(`/dev/avatar-lab`) | typecheck·build 통과, Lab에서 28표정×강도·26클립·지문 텍스트 입력 재생 확인, 구분 가능성 불변량 검증, Playwright Lab 스펙 |
|
||||||
| 2 | P1 리그 v3(선택된 스타일) + 세션 연결(P1만, 나머지는 기존 리그) | 세션·레이아웃 게이트 무회귀(§2 AGENTS), 소유자 시각 확인 |
|
| 2 | P1 리그 v3(선택된 스타일) + 세션 연결(P1만, 나머지는 기존 리그) | 세션·레이아웃 게이트 무회귀(§2 AGENTS), 소유자 시각 확인. **운영 배포는 세션 연결(2단계-B-2) 뒤에 함께 한다**(2026-10-01 소유자 결정 — 세션 연결 전에는 배포해도 수련생 화면이 바뀌지 않는다) |
|
||||||
| 3 | API `avatar_cue`·청자 반응 조기 이벤트, Jev 경로 연결 | pytest·check:api-types, legacy/jev 양쪽 동작 |
|
| 3 | API `avatar_cue`·청자 반응 조기 이벤트, Jev 경로 연결 | pytest·check:api-types, legacy/jev 양쪽 동작 |
|
||||||
| 4 | 7명 외형 SSOT·리그 v3 전환, 구 SVG 리그·RasterBust·live2d 메타데이터 정리 | 소유자 시각 확인, 자산 삭제는 소유자 확인 후 |
|
| 4 | 7명 외형 SSOT·리그 v3 전환, 구 SVG 리그·RasterBust·live2d 메타데이터 정리 | 소유자 시각 확인, 자산 삭제는 소유자 확인 후 |
|
||||||
|
|
||||||
|
|
@ -530,6 +574,21 @@ type Performance = {
|
||||||
|
|
||||||
- **2단계-B-1d 수용(2026-10-01)**: F10(hairFront 턱선 잉크 자산 제거 + 렌더러 hairFront 구멍 원복, 중립 합성 차 1e-5)·F11(head 구멍을 입 중심 아래로 한정 — 코~인중이 들릴 때 볼 가장자리에 배경이 비치던 틈 제거) 뒤, 오케스트레이터가 out11의 볼 가장자리·턱(X·A·O art 1.0·A art 0.6)·코~입 확대를 직접 확인했다. 틈 없음, 턱선 한 줄, 코 음영 한 겹. 검증 6종과 avatar-lab E2E 19 passed. 남은 항목: 소유자 시각 확인(Lab), Lab "TTS 음성으로" 버튼(선택 항목, 미구현 — 오디오 파일 경로로 대신 확인), Lab 숨긴 미리보기의 rAF 정지.
|
- **2단계-B-1d 수용(2026-10-01)**: F10(hairFront 턱선 잉크 자산 제거 + 렌더러 hairFront 구멍 원복, 중립 합성 차 1e-5)·F11(head 구멍을 입 중심 아래로 한정 — 코~인중이 들릴 때 볼 가장자리에 배경이 비치던 틈 제거) 뒤, 오케스트레이터가 out11의 볼 가장자리·턱(X·A·O art 1.0·A art 0.6)·코~입 확대를 직접 확인했다. 틈 없음, 턱선 한 줄, 코 음영 한 겹. 검증 6종과 avatar-lab E2E 19 passed. 남은 항목: 소유자 시각 확인(Lab), Lab "TTS 음성으로" 버튼(선택 항목, 미구현 — 오디오 파일 경로로 대신 확인), Lab 숨긴 미리보기의 rAF 정지.
|
||||||
|
|
||||||
|
- **2단계-B-2 세션 연결 수용(2026-10-01)**
|
||||||
|
- 구현: §8.5 설계대로 구현했다.
|
||||||
|
- 리그 레지스트리, `ClientAvatarV3`, 발화 구동 공용 모듈 `engine/speechDriver.ts`(Lab도 이 모듈을 쓴다)
|
||||||
|
- Session의 발화 전달·해제, 정지 프레임, 실측 폭 크롭
|
||||||
|
- 오케스트레이터가 diff를 직접 읽고 두 가지를 고쳤다.
|
||||||
|
- 크기 감지 중복 11줄을 `v3/observeWidth.ts`로 묶었다(웹 중복 0건).
|
||||||
|
- P1 레이아웃 시험이 320×568에서도 아바타가 보이길 기대하던 것을 바로잡았다. 이 화면은 설계상 `.sx-orb-wrap`을 숨긴다(기존 SVG도 같다).
|
||||||
|
- 검증
|
||||||
|
- typecheck·build·check:avatar-presets·check:avatar-lipsync·check:dead-code 통과
|
||||||
|
- E2E: session-layout·avatar-session-speech·avatar-expression 11 passed(3 workers), avatar-lab 19 passed(4 workers), uc-session-prestart·conversation·coach-voice 통과
|
||||||
|
- check:duplication 실패는 apps/api 파이썬 기존 중복 때문이다. 이 작업은 apps/api 변경이 없다.
|
||||||
|
- 11~12 worker 전면 병렬에서는 시간 초과가 났지만 단독 재실행에서는 재현되지 않았다(testing.md 3.5 포화 양상).
|
||||||
|
- 실화면(1440·1024·881·390): 시작 전 168px와 진행 중 202px는 bust 크롭, 112·88·62px는 face 크롭이다. v3 박스는 스테이지 원과 일치하고, 기존 SVG는 남지 않는다.
|
||||||
|
- 반영: master `613bcb60`. 공개 웹 반영 명령은 자동 권한 판정이 막아 소유자 실행을 기다린다.
|
||||||
|
|
||||||
### 2단계-B-1c P1 모티프 스프라이트 — 봉오리 1차 반려, 재배치 수용 (2026-09-30)
|
### 2단계-B-1c P1 모티프 스프라이트 — 봉오리 1차 반려, 재배치 수용 (2026-09-30)
|
||||||
|
|
||||||
- codex imagegen(`gpt-5.6-terra`, 스타일 프레임 참조)으로 봉오리 4상태 시트·날씨 5종 시트를 각 1회에 생성. 프롬프트는 오케스트레이터 작성(`docs/avatar-art/p1-linocut/motif/prompts/`).
|
- codex imagegen(`gpt-5.6-terra`, 스타일 프레임 참조)으로 봉오리 4상태 시트·날씨 5종 시트를 각 1회에 생성. 프롬프트는 오케스트레이터 작성(`docs/avatar-art/p1-linocut/motif/prompts/`).
|
||||||
|
|
|
||||||
|
|
@ -1043,7 +1043,7 @@
|
||||||
<div class="task-row"><div><span class="task-status s-plan">GATE</span></div><div><b>한신대 공문/데이터 거버넌스 게이트 정리</b><p>SSO 클레임, 추가 축어록 수급, 미성년 원본 활용동의, 개인정보 처리방침을 P1 진입 전 외부 의존성으로 명확히 둔다. 로컬 문서 골격은 준비됐지만 한신대/데이터 steward의 written evidence는 아직 필요하다.</p></div><div><b>산출물</b><p><code>docs/ops/hanshin-data-governance-gate.md</code>, 공문 질의 항목, 동의 범위 체크리스트, SSO claim mapping 표</p></div><div><b>검증</b><p>문서 artifact 작성 완료; IRB 게이트가 아니라 데이터/SSO 게이트로 외부 증거 필요 상태 유지</p></div></div>
|
<div class="task-row"><div><span class="task-status s-plan">GATE</span></div><div><b>한신대 공문/데이터 거버넌스 게이트 정리</b><p>SSO 클레임, 추가 축어록 수급, 미성년 원본 활용동의, 개인정보 처리방침을 P1 진입 전 외부 의존성으로 명확히 둔다. 로컬 문서 골격은 준비됐지만 한신대/데이터 steward의 written evidence는 아직 필요하다.</p></div><div><b>산출물</b><p><code>docs/ops/hanshin-data-governance-gate.md</code>, 공문 질의 항목, 동의 범위 체크리스트, SSO claim mapping 표</p></div><div><b>검증</b><p>문서 artifact 작성 완료; IRB 게이트가 아니라 데이터/SSO 게이트로 외부 증거 필요 상태 유지</p></div></div>
|
||||||
<div class="task-row"><div><span class="task-status s-doing">JEV-001</span></div><div><b>Jev 감정 판단 실증과 기존 내담자 경로 반복 비교</b><p>수용: 신규 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축 감정 영속화. 보류: 성능 우위·정확도·품질 승격과 사용자 체감 지연 개선.</p></div><div><b>산출물</b><p>runner/probe·배포 artifact는 <a href="./decisions/jev-client-affect.md">Jev 결정문</a>과 <a href="./ops/evidence/jev-production-deploy-2026-09-22.json">운영 증거</a>에서 관리한다.</p></div><div><b>검증</b><p>새로고침 뒤 6발화 복원, 종료 review의 실제 6발화 요약·deep-loop 완료와 DB 종료 상태를 확인했다. USER-LATENCY는 text display·voice onset·완료 준비의 실제 경로 분리 측정과 안전 검사 유지 최적화가 남는다. 일시 502 관측 때문에 무중단을 주장하지 않는다.</p></div></div>
|
<div class="task-row"><div><span class="task-status s-doing">JEV-001</span></div><div><b>Jev 감정 판단 실증과 기존 내담자 경로 반복 비교</b><p>수용: 신규 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축 감정 영속화. 보류: 성능 우위·정확도·품질 승격과 사용자 체감 지연 개선.</p></div><div><b>산출물</b><p>runner/probe·배포 artifact는 <a href="./decisions/jev-client-affect.md">Jev 결정문</a>과 <a href="./ops/evidence/jev-production-deploy-2026-09-22.json">운영 증거</a>에서 관리한다.</p></div><div><b>검증</b><p>새로고침 뒤 6발화 복원, 종료 review의 실제 6발화 요약·deep-loop 완료와 DB 종료 상태를 확인했다. USER-LATENCY는 text display·voice onset·완료 준비의 실제 경로 분리 측정과 안전 검사 유지 최적화가 남는다. 일시 502 관측 때문에 무중단을 주장하지 않는다.</p></div></div>
|
||||||
<div class="task-row"><div><span class="task-status s-doing">JEV-002</span></div><div><b>Jev 내담자 평가·표현 v2와 속마음 공개</b><p>수용: P0 가드레일 수단어 오탐("고독"·"다른 방법은") 제거, P1 20문항 질문 세트·반응/기분 분리·생성 지시 v2(1차 반려: noul 응답 필드), P2 migration 24·같은 트랜잭션 저장·세 경로 노출·리뷰(1차 반려: 교수자 cohort 누락·readiness 미등록), P3a 회기·리뷰 속마음 UI(2차 반려: 모바일 스위치 깨짐·컨트롤 바 높이 회귀), P3b 관리자 v2 표시. 보류: 실제 생성 대사 관측, 한국어 판정 정확도·전문가 보정, 운영 배포.</p></div><div><b>산출물</b><p><a href="./decisions/jev-client-affect-v2.md">v2 프로토콜</a>, <code>infra/db/init/24_client_inner_reaction.sql</code>, <code>scratch/jev/v2-appraisal-live.json</code>, <code>scratch/jev/inner-reaction-verify/</code></p></div><div><b>검증</b><p>HEAD <code>bda7ebb9</code> 대조로 full-sweep-session :644·:878·:974와 layout-visual-gate :970을 사전 실패로 분리했다. 보정 관찰: 공감 반영을 <code>a_understood</code>가 "비껴갔다"로 판정한 1건, <code>a_sore_spot</code> 고확률 선택 2/3건.</p></div></div>
|
<div class="task-row"><div><span class="task-status s-doing">JEV-002</span></div><div><b>Jev 내담자 평가·표현 v2와 속마음 공개</b><p>수용: P0 가드레일 수단어 오탐("고독"·"다른 방법은") 제거, P1 20문항 질문 세트·반응/기분 분리·생성 지시 v2(1차 반려: noul 응답 필드), P2 migration 24·같은 트랜잭션 저장·세 경로 노출·리뷰(1차 반려: 교수자 cohort 누락·readiness 미등록), P3a 회기·리뷰 속마음 UI(2차 반려: 모바일 스위치 깨짐·컨트롤 바 높이 회귀), P3b 관리자 v2 표시. 보류: 실제 생성 대사 관측, 한국어 판정 정확도·전문가 보정, 운영 배포.</p></div><div><b>산출물</b><p><a href="./decisions/jev-client-affect-v2.md">v2 프로토콜</a>, <code>infra/db/init/24_client_inner_reaction.sql</code>, <code>scratch/jev/v2-appraisal-live.json</code>, <code>scratch/jev/inner-reaction-verify/</code></p></div><div><b>검증</b><p>HEAD <code>bda7ebb9</code> 대조로 full-sweep-session :644·:878·:974와 layout-visual-gate :970을 사전 실패로 분리했다. 보정 관찰: 공감 반영을 <code>a_understood</code>가 "비껴갔다"로 판정한 1건, <code>a_sore_spot</code> 고확률 선택 2/3건.</p></div></div>
|
||||||
<div class="task-row"><div><span class="task-status s-doing">AVATAR-V3</span></div><div><b>가상 내담자 아바타 v3 — 표현 엔진·반응 모션·리노컷 리그</b><p>소유자 결정(2026-09-30): 렌더는 벡터 리그 고도화를 혼합으로 구체화(덩어리는 판화 질감 이미지 레이어, 표정 부위는 코드 벡터), 강도 비례 하이브리드, P1 서연 파일럿, 아트는 리노컷 판화 + 작은 모티프·배경 색 변화. 수용: 0단계 아트 디렉션(1차 브리프 미충족 → 2차 수용), 트레이싱·참조 편집 spike, 1단계 엔진 코어(채널 33·표정 28·반응 클립 26·지문 파서·보조 cue)와 <code>/dev/avatar-lab</code>, 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 오디오 선분석 정렬, <code>mouthRound</code> 채널, 페르소나 조음 폭)를 구현·검증(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). 남음: 소유자 시각 확인. 남음: 2단계-B-2 세션 연결·소유자 시각 확인, 3단계 API <code>avatar_cue</code>·지문 어휘 가이드, 4단계 7명 외형 SSOT. 운영 모델은 괄호 지문을 거의 쓰지 않는다(6턴 0개).</p></div><div><b>산출물</b><p><a href="./decisions/avatar-expression-engine-v3.md">아바타 v3 결정문</a>, <code>apps/web/src/components/avatar/engine/</code>, <code>docs/avatar-art/art-direction-v3/</code>, <code>docs/avatar-art/p1-linocut/</code></p></div><div><b>검증</b><p><code>npm run check:avatar-presets</code> 통과(표정 378쌍 구분, 최소 L1 0.95), <code>e2e/avatar-lab.spec.ts</code> 6 passed(오케스트레이터 재실행), typecheck·build·check:dead-code 통과(워커 보고)</p></div></div>
|
<div class="task-row"><div><span class="task-status s-doing">AVATAR-V3</span></div><div><b>가상 내담자 아바타 v3 — 표현 엔진·반응 모션·리노컷 리그</b><p>소유자 결정(2026-09-30): 렌더는 벡터 리그 고도화를 혼합으로 구체화(덩어리는 판화 질감 이미지 레이어, 표정 부위는 코드 벡터), 강도 비례 하이브리드, P1 서연 파일럿, 아트는 리노컷 판화 + 작은 모티프·배경 색 변화. 수용: 0단계 아트 디렉션(1차 브리프 미충족 → 2차 수용), 트레이싱·참조 편집 spike, 1단계 엔진 코어(채널 33·표정 28·반응 클립 26·지문 파서·보조 cue)와 <code>/dev/avatar-lab</code>, 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 오디오 선분석 정렬, <code>mouthRound</code> 채널, 페르소나 조음 폭)를 구현·검증(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 "괜찮네")하고 작업 브랜치 <code>YunChan/avatar-v3-linocut-p1-20261001</code>를 forgejo에 푸시했다(master 미병합·미배포). 운영 배포는 세션 연결(2단계-B-2) 뒤에 함께 한다(소유자 결정). 진행: P2~P7 리노컷 캐스트(외형·상징 설계 <code>docs/avatar-art/linocut-cast.md</code>, 원화 후보 v2 생성·소유자 선택 대기, 자산 파이프라인 공통화 <code>docs/avatar-art/linocut-pipeline/</code> — P1 재실행 바이트 동일), 2단계-B-2 세션 연결 수용(결정문 §8.5·§11: P1 세션·시작 전·썸네일 v3, 오디오 시계 립싱크, TTS 실패 시 텍스트 타이밍, <code>VITE_AVATAR_V3</code> 플래그. 세션 레이아웃·발화·표정 E2E 11 passed, avatar-lab 19 passed) · master <code>613bcb60</code> 반영, 공개 웹(Pages) 반영은 소유자 실행 대기. 남음: 공개 웹 반영·소유자 시각 확인, 3단계 API <code>avatar_cue</code>·지문 어휘 가이드, 4단계 7명 외형 SSOT. 운영 모델은 괄호 지문을 거의 쓰지 않는다(6턴 0개).</p></div><div><b>산출물</b><p><a href="./decisions/avatar-expression-engine-v3.md">아바타 v3 결정문</a>, <code>apps/web/src/components/avatar/engine/</code>, <code>docs/avatar-art/art-direction-v3/</code>, <code>docs/avatar-art/p1-linocut/</code></p></div><div><b>검증</b><p><code>npm run check:avatar-presets</code> 통과(표정 378쌍 구분, 최소 L1 0.95), <code>e2e/avatar-lab.spec.ts</code> 6 passed(오케스트레이터 재실행), typecheck·build·check:dead-code 통과(워커 보고)</p></div></div>
|
||||||
<div class="task-row"><div><span class="task-status s-doing">ADMIN-OPENROUTER-001</span></div><div><b>관리자 OpenRouter 복구의 웹 검증과 새 OAuth 재시도</b><p>수용: <code>AmbiguousColumnError</code>의 기존 refresh column 참조와 <code>EXCLUDED.extra</code>의 text 캐스트 제거(JSONB 비교)를 수정했고, 실제 PostgreSQL rollback·API 교체·보존 census를 확인했다. 웹 focused 선택 16개와 정적 검증, NAS web·Pages 배포, public entry/health 200과 관리자 UI의 ready·복구 화면 없음은 수용했다. 진행 중: 새 사용자 OAuth finish 성공 관측.</p></div><div><b>산출물</b><p><a href="./ops/evidence/admin-openrouter-recovery-2026-09-22.json">운영 영수증</a></p></div><div><b>검증</b><p>API 1173 passed·1 skipped·0 failed, focused 16 passed, health <code>ok</code>·DB/engine true. API 교체 직후 census에서 133개 테이블 중 130개 동일이며 활동 메타데이터 3개는 변했다. OpenRouter UI 미연결과 Jev <code>live_verified=false</code>는 live 검증이 아니며, OAuth finish 성공은 아직 주장하지 않는다.</p></div></div>
|
<div class="task-row"><div><span class="task-status s-doing">ADMIN-OPENROUTER-001</span></div><div><b>관리자 OpenRouter 복구의 웹 검증과 새 OAuth 재시도</b><p>수용: <code>AmbiguousColumnError</code>의 기존 refresh column 참조와 <code>EXCLUDED.extra</code>의 text 캐스트 제거(JSONB 비교)를 수정했고, 실제 PostgreSQL rollback·API 교체·보존 census를 확인했다. 웹 focused 선택 16개와 정적 검증, NAS web·Pages 배포, public entry/health 200과 관리자 UI의 ready·복구 화면 없음은 수용했다. 진행 중: 새 사용자 OAuth finish 성공 관측.</p></div><div><b>산출물</b><p><a href="./ops/evidence/admin-openrouter-recovery-2026-09-22.json">운영 영수증</a></p></div><div><b>검증</b><p>API 1173 passed·1 skipped·0 failed, focused 16 passed, health <code>ok</code>·DB/engine true. API 교체 직후 census에서 133개 테이블 중 130개 동일이며 활동 메타데이터 3개는 변했다. OpenRouter UI 미연결과 Jev <code>live_verified=false</code>는 live 검증이 아니며, OAuth finish 성공은 아직 주장하지 않는다.</p></div></div>
|
||||||
<div class="task-row"><div><span class="task-status s-done">DONE</span></div><div><b>ADMIN-AFFECT-001 관리자 감정 관측 trace·그래프 운영 수용</b><p>수용: 완료 내담자 턴 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 컨테이너 유지.</p></div><div><b>산출물</b><p><a href="./decisions/jev-client-affect.md">Jev 결정문</a>, <a href="./ops/evidence/admin-affect-runtime-2026-09-23.json">운영 영수증</a>, <code>/admin/emotions</code>, <code>/admin/affect/sessions</code></p></div><div><b>검증 경계</b><p>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을 주장하지 않는다.</p></div></div>
|
<div class="task-row"><div><span class="task-status s-done">DONE</span></div><div><b>ADMIN-AFFECT-001 관리자 감정 관측 trace·그래프 운영 수용</b><p>수용: 완료 내담자 턴 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 컨테이너 유지.</p></div><div><b>산출물</b><p><a href="./decisions/jev-client-affect.md">Jev 결정문</a>, <a href="./ops/evidence/admin-affect-runtime-2026-09-23.json">운영 영수증</a>, <code>/admin/emotions</code>, <code>/admin/affect/sessions</code></p></div><div><b>검증 경계</b><p>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을 주장하지 않는다.</p></div></div>
|
||||||
<div class="task-row"><div><span class="tag info">B1-LAYOUT-720-001</span></div><div><b>720px prestart 시작 버튼 ancestor clipping</b><p>prestart <code>회기 시작</code>의 clip(<code>left=25</code>, <code>right=695</code>)이 baseline <code>d22cd988</code>과 현재 작업트리에서 동일하다. 감정 관측 기능 원인으로 단정하지 않고 cosmetic backlog로 추적한다.</p></div><div><b>다음 행동</b><p>원인을 분리한 뒤 focused browser 재현·수정 검증을 수행한다.</p></div><div><b>검증 경계</b><p>현재 전체 layout-visual-gate는 15개 중 1 passed·1 failed·13 not run이다. 관리자 3개와 session-layout desktop/mobile 각 4개 통과가 전체 gate 통과를 대체하지 않는다.</p></div></div>
|
<div class="task-row"><div><span class="tag info">B1-LAYOUT-720-001</span></div><div><b>720px prestart 시작 버튼 ancestor clipping</b><p>prestart <code>회기 시작</code>의 clip(<code>left=25</code>, <code>right=695</code>)이 baseline <code>d22cd988</code>과 현재 작업트리에서 동일하다. 감정 관측 기능 원인으로 단정하지 않고 cosmetic backlog로 추적한다.</p></div><div><b>다음 행동</b><p>원인을 분리한 뒤 focused browser 재현·수정 검증을 수행한다.</p></div><div><b>검증 경계</b><p>현재 전체 layout-visual-gate는 15개 중 1 passed·1 failed·13 not run이다. 관리자 3개와 session-layout desktop/mobile 각 4개 통과가 전체 gate 통과를 대체하지 않는다.</p></div></div>
|
||||||
|
|
@ -1148,7 +1148,7 @@
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>Web typecheck</td><td><code>npm run typecheck</code></td><td>Passed</td></tr>
|
<tr><td>Web typecheck</td><td><code>npm run typecheck</code></td><td>Passed</td></tr>
|
||||||
<tr><td>Design SSOT / auth visual</td><td><code>npm run check:design-ssot</code> / <code>npx playwright test e2e/auth-visual.spec.ts --project=chromium-single-run --reporter=line</code> / <code>npx playwright test e2e/layout-visual-gate.spec.ts --project=chromium-single-run --reporter=line</code></td><td>SSOT checker passed; login/onboarding light-dark desktop-mobile 1 passed; 14 core screens × 7 widths visual gate 14 passed.</td></tr>
|
<tr><td>Design SSOT / auth visual</td><td><code>npm run check:design-ssot</code> / <code>npx playwright test e2e/auth-visual.spec.ts --project=chromium-single-run --reporter=line</code> / <code>npx playwright test e2e/layout-visual-gate.spec.ts --project=chromium-single-run --reporter=line</code></td><td>SSOT checker passed; login/onboarding light-dark desktop-mobile 1 passed; 14 core screens × 7 widths visual gate 14 passed.</td></tr>
|
||||||
<tr><td>Full Playwright E2E baseline</td><td><code>npm run e2e:parallel</code> / <code>npm run e2e:single-run</code> / <code>npm run e2e:list</code></td><td>2026-09-30 <code>check-dev-dashboard-ssot.py</code>의 실제 수집 기준 현재 수집은 <b>1315 tests / 73 files</b>다. 이 숫자는 수집량이며 현 작업트리 전체 GREEN과 동일하지 않다. G8 clean-head release gate는 candidate 112/112와 실제 NAS-origin 112/112를 통과했다. 이전 단일 120/120과 2026-07-15의 fixture desktop/mobile 166/166 + DB/engine/provider 직렬 49/49 = 215/215는 범위가 다른 역사 기준선으로 보존한다.</td></tr>
|
<tr><td>Full Playwright E2E baseline</td><td><code>npm run e2e:parallel</code> / <code>npm run e2e:single-run</code> / <code>npm run e2e:list</code></td><td>2026-09-30 <code>check-dev-dashboard-ssot.py</code>의 실제 수집 기준 현재 수집은 <b>1321 tests / 74 files</b>다. 이 숫자는 수집량이며 현 작업트리 전체 GREEN과 동일하지 않다. G8 clean-head release gate는 candidate 112/112와 실제 NAS-origin 112/112를 통과했다. 이전 단일 120/120과 2026-07-15의 fixture desktop/mobile 166/166 + DB/engine/provider 직렬 49/49 = 215/215는 범위가 다른 역사 기준선으로 보존한다.</td></tr>
|
||||||
<tr><td>Refactor governance P1~P8</td><td><code>ruff check app</code> / <code>pytest -q app</code> / <code>pytest -q engine_gateway</code> / <code>npm run typecheck</code> / <code>npm run check:api-types</code> / <code>npm run check:design-ssot</code> / <code>npm run check:dead-code</code> / <code>npm run check:duplication</code> / <code>npm run build</code> / <code>npm audit --audit-level=high</code> / full Playwright</td><td>Backend 400 passed, gateway 29 passed, web gates/build/audit passed, vulnerabilities 0, production duplication 1 clone/15 lines/0.03%, Playwright 215/215 passed. 상세 근거는 <code>archive/project-cleanup-2026-09-07/refactor-governance-2026-07-15.md</code>.</td></tr>
|
<tr><td>Refactor governance P1~P8</td><td><code>ruff check app</code> / <code>pytest -q app</code> / <code>pytest -q engine_gateway</code> / <code>npm run typecheck</code> / <code>npm run check:api-types</code> / <code>npm run check:design-ssot</code> / <code>npm run check:dead-code</code> / <code>npm run check:duplication</code> / <code>npm run build</code> / <code>npm audit --audit-level=high</code> / full Playwright</td><td>Backend 400 passed, gateway 29 passed, web gates/build/audit passed, vulnerabilities 0, production duplication 1 clone/15 lines/0.03%, Playwright 215/215 passed. 상세 근거는 <code>archive/project-cleanup-2026-09-07/refactor-governance-2026-07-15.md</code>.</td></tr>
|
||||||
<tr><td>API typegen SSOT</td><td><code>npm run check:api-types</code></td><td>Passed; FastAPI OpenAPI → <code>src/lib/api.gen.ts</code> stale check</td></tr>
|
<tr><td>API typegen SSOT</td><td><code>npm run check:api-types</code></td><td>Passed; FastAPI OpenAPI → <code>src/lib/api.gen.ts</code> stale check</td></tr>
|
||||||
<tr><td>Outcome & Alliance OS G0</td><td><code>py -3.11 -X utf8 -m pytest -p no:cacheprovider apps/api/app/test_measurement_contract.py apps/api/app/test_runtime_schema_ssot.py -q</code> / <code>scripts/check-measurement-ledger.sql</code> / measurement·API contract checks / web typecheck / DB-backed <code>session-persistence</code> focused E2E 3종</td><td>G0 contract/schema 11 passed, 기존 backend 100 passed, auth 39 passed. Python→JSON Schema→TypeScript→PostgreSQL enum·필수필드 계약이 일치하고 8개 deterministic benchmark가 검증됐다. Live PostgreSQL에서 learner/client/evaluator 가시 행 1/1/2, 교차 누수 0, append-only guard 2를 확인했다. 학습자 턴→교수자 대시보드, 워크시트 검수, 종료 deep 평가→durable 리뷰 E2E는 각각 1 passed. G0/AOS-001~004 완료.</td></tr>
|
<tr><td>Outcome & Alliance OS G0</td><td><code>py -3.11 -X utf8 -m pytest -p no:cacheprovider apps/api/app/test_measurement_contract.py apps/api/app/test_runtime_schema_ssot.py -q</code> / <code>scripts/check-measurement-ledger.sql</code> / measurement·API contract checks / web typecheck / DB-backed <code>session-persistence</code> focused E2E 3종</td><td>G0 contract/schema 11 passed, 기존 backend 100 passed, auth 39 passed. Python→JSON Schema→TypeScript→PostgreSQL enum·필수필드 계약이 일치하고 8개 deterministic benchmark가 검증됐다. Live PostgreSQL에서 learner/client/evaluator 가시 행 1/1/2, 교차 누수 0, append-only guard 2를 확인했다. 학습자 턴→교수자 대시보드, 워크시트 검수, 종료 deep 평가→durable 리뷰 E2E는 각각 1 passed. G0/AOS-001~004 완료.</td></tr>
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ Vignette 저장소의 모든 검증 수단(백엔드 단위 테스트, 웹 타
|
||||||
| API 타입 생성 체크 | `apps/web` | `npm run check:api-types` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
| API 타입 생성 체크 | `apps/web` | `npm run check:api-types` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||||
| 웹 타입체크 | `apps/web` | `npm run typecheck` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
| 웹 타입체크 | `apps/web` | `npm run typecheck` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||||
| 웹 빌드 | `apps/web` | `npm run build` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
| 웹 빌드 | `apps/web` | `npm run build` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||||
| Playwright E2E(전체) | `apps/web` | `npm run e2e` | **필요(+시드)** | **필요** | 자동기동 | 일부만 | **필요** | 현재 수집 1315 tests / 73 files · 현 작업트리 전체 GREEN 미검증 |
|
| Playwright E2E(전체) | `apps/web` | `npm run e2e` | **필요(+시드)** | **필요** | 자동기동 | 일부만 | **필요** | 현재 수집 1321 tests / 74 files · 현 작업트리 전체 GREEN 미검증 |
|
||||||
|
|
||||||
핵심 원칙: **단위 테스트(pytest)와 타입체크/빌드는 외부 서비스 없이 단독 실행된다.**
|
핵심 원칙: **단위 테스트(pytest)와 타입체크/빌드는 외부 서비스 없이 단독 실행된다.**
|
||||||
**E2E만 풀스택(DB+API+웹+브라우저)을 요구한다.** 아래 각 절에서 근거와 절차를 설명한다.
|
**E2E만 풀스택(DB+API+웹+브라우저)을 요구한다.** 아래 각 절에서 근거와 절차를 설명한다.
|
||||||
|
|
@ -326,7 +326,7 @@ VITE_API_BASE=http://127.0.0.1:8000 npm run e2e # 프록시 대신 API
|
||||||
|
|
||||||
### 3.6 실측 테스트 개수 (현재)
|
### 3.6 실측 테스트 개수 (현재)
|
||||||
|
|
||||||
2026-09-30 `py -3.11 -X utf8 scripts/check-dev-dashboard-ssot.py`가 실행한 `npx playwright test --list` 실제 수집 기준 **현재 수집 1315 tests / 73 files**다
|
2026-10-01 `py -3.11 -X utf8 scripts/check-dev-dashboard-ssot.py`가 실행한 `npx playwright test --list` 실제 수집 기준 **현재 수집 1321 tests / 74 files**다
|
||||||
(유스케이스 16테마 `uc-*.spec.ts` 239 시나리오 포함).
|
(유스케이스 16테마 `uc-*.spec.ts` 239 시나리오 포함).
|
||||||
이 숫자는 수집량이지 통과량이 아니다. 현 작업트리 전체 완주는 아직 증거가 없으며,
|
이 숫자는 수집량이지 통과량이 아니다. 현 작업트리 전체 완주는 아직 증거가 없으며,
|
||||||
과거 전체 GREEN 기록과 이번 focused/release gate 결과를 구분해 적는다.
|
과거 전체 GREEN 기록과 이번 focused/release gate 결과를 구분해 적는다.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue