diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 12f9d45..f04eeae 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -10,8 +10,8 @@ - 로컬 engine gateway 기본 포트: `http://127.0.0.1:9099` - 공개 웹: `https://vignette.chanpaca.net` - 공개 API: `https://api-vignette.chanpaca.net` -- 최신 앱 배포 소스: commit `c78834346722b481eac517a6ea7d36daf95ff363` (`master`, origin push 완료). 운영 안정화, 관리자 AI capability, 세션 non-blocking 입력·빠른 live client lane, 로컬 Higgs 음성 경로까지 포함한다. -- 최신 Cloudflare Pages production deploy: 2026-07-31 guarded manual deploy `https://505155c4.vignette-b1q.pages.dev` (`505155c4-01f3-4eac-ad59-c2d323a0bb51`), branch `main`, custom domain entry `assets/index-BU5JjRnR.js`. 최근 5개 production 배포의 HTML·JS·CSS 의존 그래프를 보존했고 preview/custom 모두 같은 entry를 `application/javascript` 200으로 제공한다. 공개 로그인은 1280×720 실제 렌더, Google 버튼 2개 enabled, 브라우저 warning/error 0을 확인했다. +- 최신 앱 배포 소스: commit `12bdc594970be8fbd8727800c720d14d7d5b4e25` (`master`, origin push 완료). 사용자 제공 1536×1024 세션 시안 기반의 326px 컨텍스트 레일, 중앙 인물 무대·자막, 357px 라이브 코칭 레일, 116px 제어바와 투명 WebP 식물 장식을 포함한다. +- 최신 Cloudflare Pages production deploy: 2026-07-31 guarded manual deploy `https://ed0cddb4.vignette-b1q.pages.dev`, branch `main`, custom domain entry `assets/index-CzevzoM7.js`. 세션 청크 `Session-BWMFTqgE.js`·`Session-D7DZVnh0.css`와 `session-botanical/leaf-1.webp`가 커스텀 도메인에서 올바른 MIME으로 200을 반환한다. 공개 로그인 실렌더, Google 버튼 2개 enabled, boot diagnostic 0, 브라우저 warning/error 0을 확인했다. - 최신 학습 세션 런타임: 실시간 내담자 응답은 `VIGNETTE_LIVE_CLIENT_PROVIDER=claude_cli` 전용 lane으로 evaluator와 분리하고, 응답 저장·SSE done 뒤 fast-loop 평가는 백그라운드 처리한다. 입력창은 생성·TTS 중에도 초안 작성과 보존이 가능하다. 로컬 `-UseHiggsVoice`는 설치된 `higgs-audio-v3-tts-4b`를 P1에 사용하지만 연구/비상업 라이선스 때문에 dev 전용이며, 공개 `/voice/health`는 `openai / gpt-4o-mini-tts`로 유지한다. - 관리자 AI 엔진 capability: 공급자 6종을 드롭다운으로 선택하고 설치·인증 상태에 따라 live 모델과 추론 강도만 선택한다. 공개 인증 E2E에서 Codex 7개 모델의 기본 `gpt-5.6-terra / medium`, Agy 11개 모델의 기본 `gemini-3.6-flash-high / high`를 확인했으며 설정은 저장하지 않았다. Anthropic API는 키가 없어 fail-closed unavailable이다. - Google OAuth 허용 이메일 도메인: `hs.ac.kr`, `twentyoz.kr` @@ -28,7 +28,7 @@ - 턴 런타임 리팩터 2차: `turn_runtime.finalize_completed_turn`으로 REST submit/stream/voice WS의 `record_completed_turn` + `record_safety_event` 호출쌍을 공통화했다. gateway `/v1/stream` route 레벨에서 `token/done/error` SSE 프레임 contract tests를 추가했다. 검증: focused backend 40 passed. - Phase3 artifact checker 강화: `scripts/check-phase3-artifacts.py`가 CSV enum, KPI report 필수 field, approved export의 PII pass·κ/ICC·withdrawn exclusion·consent scope·file sha256을 검증한다. `app/test_phase3_artifact_checker.py` 5 tests 추가. 실제 파일럿 evidence와 steward/legal/IAA gate는 그대로 외부 의존이다. - 세션 종료 UX/dark theme SSOT 정리: 드래그형 `SlideToEnd`를 명시 확인 다이얼로그로 교체하고, Topbar/Settings theme 토글을 `lib/theme.ts` 단일 경로로 통합했다. 저장값이 없으면 dark를 기본으로 두고 앱 부팅 시 theme를 먼저 적용해 초기 flash를 줄인다. API 기본 preference `system`은 Settings에서 light로 오해하지 않고 현재 초기 테마를 따른다. 회기 리뷰·설정 포함 주요 페이지의 흰 섹션 잔재도 dark 작업면으로 맞췄다. 검증: `npm run typecheck`, `npm run build`, `npx playwright test e2e/layout-visual-gate.spec.ts e2e/settings.spec.ts e2e/session-review.spec.ts --project=chromium-desktop --project=chromium-mobile --project=chromium-single-run --workers=1` 22 passed. -- 아바타 렌더 기준: 사용자 피드백에 따라 서연 P1과 P4~P7의 생성 이미지/PSD 래스터 파츠 연결을 전부 끊고, 모든 실제 화면과 dev 미리보기에서 기존 SVG 도형 기반 파라미터 리그만 렌더링한다. `RasterBust`와 래스터 원본·파츠는 재검토용으로 보존하지만 앱에서 로드하지 않는다. active session 데스크톱 스테이지의 `상태 라벨 / 아바타 / 현재 상태` 3행 구조는 유지한다. +- 아바타 렌더 기준: 사용자 피드백에 따라 서연 P1과 P4~P7의 생성 이미지/PSD 래스터 파츠 연결을 전부 끊고, 모든 실제 화면과 dev 미리보기에서 기존 SVG 도형 기반 파라미터 리그만 렌더링한다. `RasterBust`와 래스터 원본·파츠는 재검토용으로 보존하지만 앱에서 로드하지 않는다. active session 데스크톱 스테이지의 `상태 라벨 / 아바타 / 현재 상태` 3행 구조는 유지하며, 사용자 제공 수채화 잎 5장은 인물 파츠가 아닌 독립 배경 장식으로만 사용한다. - M3 인증 claim 1차: Google/SAML/dev-login이 설정 기반 cohort map과 SAML cohort claim을 `cohort_ids`로 넘기고, 관리 사용자 `external_id`는 provider subject 기반(`google:`/`saml:`/`dev:`)으로 저장한다. 운영 SAML 서명검증·기관 claim schema·deprovisioning audit은 후속. - 페르소나 저작/P4~P7 적재 2차: `data/personas/P4.json`~`P7.json`을 저장소 관리 `PersonaCard`로 읽어 `materialize_seed_personas()`와 seed fallback catalog에 포함했다. 검증: `python -m pytest app/test_persona_review.py -q` 22 passed, 로컬 dev DB materialize 결과 `approved_codes=P1,P2,P3,P4,P5,P6,P7`, 인증된 로컬 `GET /personas`도 `P1..P7` 반환. - Google OAuth 진단 1차: provider callback error는 `access_denied`/`provider_error`로 분리하고, 로그인 화면은 실패 reason code를 함께 표시한다. 실제 Google 계정 완료 proof는 아직 owner 로그인/storageState가 필요하다. diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index 7fad26f..13334e1 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -607,7 +607,7 @@
154차 적용(2026-07-30): 153차 AI 엔진 capability 변경을 공개 런타임까지 반영했다. API PID 11788과 gateway PID 44488를 신규 코드로 교체하고 Cloudflare Pages production 2f52f8e3-f992-441f-ada4-f6396cbb1a2b를 게시했다. 최종 custom domain은 index-B54GMBSf.js와 AdminAi-ClAJvCvx.js를 application/javascript 200으로 제공한다. 최초 production a3819e6e 검증에서 5세대 전 엔트리 index-Cwtfyfq5.js의 보존 누락을 발견했기 때문에, scripts/preserve-pages-assets.ps1가 최근 production preview의 HTML·JS·CSS 의존 그래프를 재귀적으로 수집하고 MIME을 검사해 현재 dist에 병합하도록 고친 뒤 최종 배포로 교체했다. custom domain에서 현재와 이전 4세대 엔트리가 모두 JavaScript 200이며, lazy 청크 첫 요청 강제 실패도 문서 재로드 1회 뒤 1/1 복구됐다. 실제 Google 슈퍼 관리자 사용자 행에 연결한 15분 임시 세션으로 공개 /admin/ai에서 공급자 6개, Codex 7개 / gpt-5.6-terra / medium, Agy 11개 / gemini-3.6-flash-high / high를 확인했고 저장 없이 세션을 즉시 삭제했다. 공개 health는 status=ok, environment=prod, db=true, engine=true이며 auth config 200, 비인증 personas·admin capability 401, watchdog LastTaskResult=0다. 153차의 공개 배포 전 상태 표기는 이 증거로 대체한다.
155차 적용(2026-07-31): 세션 텍스트 입력이 AI 생성·TTS 종료까지 잠기고 답변 표시 뒤에도 evaluator가 끝날 때까지 다음 전송이 약 24초 묶이던 학습 UX를 실제 브라우저와 gateway/API 계량으로 분해했다. textarea는 회기 종료·일시정지에서만 잠기며 생성·음성 준비·재생 중에는 다음 질문 초안을 계속 작성·보존하고, 내담자 응답 저장 직후에는 음성 재생과 무관하게 다음 전송을 허용한다. 관리자 DB의 Agy/Gemini 설정은 evaluator/review에 유지하되 실시간 client 역할은 VIGNETTE_LIVE_CLIENT_PROVIDER=claude_cli 전용 lane으로 분리해 회기별 claude -p 프로세스를 재사용한다. stream learner/client turn과 결정론 상태를 먼저 durable 저장하고 SSE done을 보낸 뒤 fast-loop 평가는 백그라운드에서 같은 learner turn normalized row에 붙이며 평가 기반 코칭 충전도 한 번만 적용한다. Agy fallback도 stream-json delta를 실제 SSE token으로 전달한다. 로컬 음성은 -UseHiggsVoice로 설치된 higgs-audio-v3-tts-4b를 loopback 상주시켜 P1 실제 답변을 24kHz WAV로 합성하며 저장소의 무참조 synthetic seed만 reference로 허용하고 non-dev는 fail-closed한다. 실증: 변경 전 full API 완료 24.17/24.57초, 변경 후 실제 UI 첫 응답·전송 해제 9.58초와 상주 연속 턴 6.96초, 생성 중 초안 enabled/보존, TTS 중 보내기 enabled. Higgs full API 362,924 bytes/7.56초 WAV, provider/model 헤더 확인. backend 432/432, gateway 44/44, typecheck·API types·build, session stream 1/1, voice skip/draft 1/1 통과. 배포·공개 실증: commit c7883434를 origin/master에 push하고 Cloudflare Pages production 505155c4-01f3-4eac-ad59-c2d323a0bb51로 게시했다. custom/preview 모두 index-BU5JjRnR.js를 JavaScript 200으로 서빙하고 최근 5개 배포의 의존 자산을 보존한다. 공개 API는 prod·db=true·engine=true, auth config Google configured/dev login disabled, 비인증 personas·voice speech 401, Google 시작 302다. 실제 공개 로그인 1280×720 렌더에서 버튼 2개 enabled, 브라우저 warning/error 0을 확인했다. 공개 음성은 라이선스 경계상 openai / gpt-4o-mini-tts를 유지한다.
156차 적용(2026-07-31): 활성 상담 세션이 전역 테마와 무관하게 .sx-page--active에서 다크 팔레트를 다시 정의해, 라이트 설정에서도 화면은 다크인데 공통 Surface inset인 AI 코치만 밝게 뜨는 혼합 테마 결함을 수정했다. 세션 전용 --bg-surface/--text-*/--accent 덮어쓰기를 제거하고 전역 data-theme·tokens.css·공통 Surface를 그대로 사용해 라이트는 종이·글래스, 다크는 차콜·세이지로 함께 전환한다. 우측 레일은 AI 코치 → 현재 신호 → 음성·AI 응답 상태 순으로 재배치하고 의미 없는 equalizer 막대와 중복 화면 모드 행을 제거했다. 700px 이하 높이에서는 발화 예시·보조 흐름을 먼저 접고 코치 판단과 근거/이력 액션을 보존하며, 기존 사각지대였던 881~1180px에서도 코칭 모드에 AI 코치 카드만 전폭으로 남긴다. 검증: npm run check:design-ssot, typecheck, build 통과, 세션 전수 desktop/mobile 30 passed / 2 skipped, session-layout 8/8, 7폭 layout-visual-gate 15/15, 라이트 1366×640 코치·1024×640 압축 코치 및 다크 1440/1024/390 캡처 직접 확인. 로컬 작업트리 기준이며 배포 전이다.
157차 적용(2026-07-31): 사용자 제공 1536×1024 활성 세션 시안을 실제 세션 화면에 반영했다. 데스크톱을 좌측 단일 컨텍스트 레일 326px / 중앙 인물 무대+자막 / 우측 단일 라이브 코칭 레일 357px / 하단 116px 제어바로 재구성하고, 상태 신호 모드에서도 AI 코치의 개입 시점·남은 기회·코칭 포인트를 미리 이해할 수 있게 했다. 제공된 수채화 잎 5장은 BEN2로 투명 분리한 뒤 600×800 이하 알파 WebP로 최적화해 합계 약 158KB로 줄였고, 좌우 캔버스와 아바타 뒤에 장식 계층으로 연결했다. 새 E2E는 1408px 상단/본문, 1468px 제어바, 326/357px 레일, WebP 응답과 computed background 연결을 1536×1024에서 고정한다. 1366×768 이하에서는 스테이지를 압축해 자막이 주 작업영역을 잃지 않게 했다. 검증: npm run check:design-ssot, typecheck, build 통과, 세션 전수 desktop/mobile 32 passed / 2 skipped, session-layout 8/8, 7폭 layout-visual-gate 15/15, 1536×1024 라이트 캡처 직접 확인. 로컬 작업트리 기준이며 배포 전이다.
157차 적용(2026-07-31): 사용자 제공 1536×1024 활성 세션 시안을 실제 세션 화면에 반영했다. 데스크톱을 좌측 단일 컨텍스트 레일 326px / 중앙 인물 무대+자막 / 우측 단일 라이브 코칭 레일 357px / 하단 116px 제어바로 재구성하고, 상태 신호 모드에서도 AI 코치의 개입 시점·남은 기회·코칭 포인트를 미리 이해할 수 있게 했다. 제공된 수채화 잎 5장은 BEN2로 투명 분리한 뒤 600×800 이하 알파 WebP로 최적화해 합계 약 158KB로 줄였고, 좌우 캔버스와 아바타 뒤에 장식 계층으로 연결했다. 새 E2E는 1408px 상단/본문, 1468px 제어바, 326/357px 레일, WebP 응답과 computed background 연결을 1536×1024에서 고정한다. 1366×768 이하에서는 스테이지를 압축해 자막이 주 작업영역을 잃지 않게 했다. 검증: npm run check:design-ssot, typecheck, build 통과, 세션 전수 desktop/mobile 32 passed / 2 skipped, session-layout 8/8, 7폭 layout-visual-gate 15/15, 1536×1024 라이트 캡처 직접 확인. commit 12bdc594를 Cloudflare Pages production ed0cddb4로 배포했고, 커스텀 도메인의 index-CzevzoM7.js, Session-BWMFTqgE.js, Session-D7DZVnh0.css, leaf-1.webp가 각각 올바른 JavaScript/CSS/WebP MIME으로 200을 반환했다. 공개 로그인 실렌더·브라우저 warning/error 0, API prod/db/engine=true, 비로그인 personas 401, Google OAuth 시작 302, watchdog 5항목 healthy도 확인했다.