diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 1bebba1..e4ff8b9 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -11,7 +11,7 @@ - 공개 웹: `https://vignette.chanpaca.net` - 공개 API: `https://api-vignette.chanpaca.net` - 최신 앱 배포 소스 commit: `0ec266a` (`동의 게이트와 런타임 안정화`) -- 최신 Cloudflare Pages production deploy: `24c90784`, branch `main`, dirty local source deploy. +- 최신 Cloudflare Pages production deploy: 2026-06-29 manual deploy, branch `main`, custom domain assets `assets/index-9KEDuuBQ.js` + `assets/index-DC83qEpU.css`. - Google OAuth 허용 이메일 도메인: `hs.ac.kr`, `twentyoz.kr` - 최신 백엔드 회귀: `python -m pytest app/ -q` → `130 passed` - X1 재귀학습 export 1차: `scripts/export-recursive-dataset.py` 기본 read-only dry-run, `--write-dataset` 명시 시에만 `ds.*` write, approved export는 steward/legal/IAA gate 없으면 거부. @@ -33,7 +33,7 @@ - `frontenddesign` 스킬은 현재 세션의 사용 가능 스킬 목록에 없었다. 대신 `docs/DESIGN_CONCEPT.md`를 SSOT로 사용했다. - 공개 API 터널은 현재 `C:\Users\encep\.cloudflared\vignette-config.yml`에서 `http://127.0.0.1:8001`을 본다. - 공개용 API 프로세스는 `127.0.0.1:8001`에서 `ENVIRONMENT=prod`로 떠 있다. 로컬 개발 API `127.0.0.1:8000`과 Tailnet 개발 API `127.0.0.1:8010`도 `ENVIRONMENT=dev`로 떠 있다. -- 2026-06-27 05:34:32 UTC 모바일 502는 cloudflared 로그상 `127.0.0.1:8001` origin connection refused와 일치한다. 현재 public API는 복구됐고, watchdog 기본 검사에서 아직 DNS가 없는 `api-vnet.18ka.net`을 제외해 향후 설치 시 불필요한 restart loop를 막았다. 2026-06-28 11:05 KST 재확인: `https://vignette.chanpaca.net/login` 200 with `assets/index-HjXyC0JT.js` + `assets/index-C8JKXhNP.css`, `https://api-vignette.chanpaca.net/health` prod/db/engine true, public unauth `GET /personas` 401. +- 2026-06-27 05:34:32 UTC 모바일 502는 cloudflared 로그상 `127.0.0.1:8001` origin connection refused와 일치한다. 현재 public API는 복구됐고, watchdog 기본 검사에서 아직 DNS가 없는 `api-vnet.18ka.net`을 제외해 향후 설치 시 불필요한 restart loop를 막았다. 2026-06-29 KST 재확인: `https://vignette.chanpaca.net/login?deploy=20260629` 200 with `assets/index-9KEDuuBQ.js` + `assets/index-DC83qEpU.css`, `https://api-vignette.chanpaca.net/health` prod/db/engine true, public unauth `GET /personas` 401. - `GET /personas`는 이제 인증 필요다. 검증 당시 로컬 `http://127.0.0.1:8000/personas`와 현재 공개 `https://api-vignette.chanpaca.net/personas` 모두 비로그인 401 확인 완료. - 로컬 웹이 `http://127.0.0.1:5175`처럼 다른 Vite 포트로 떠도 로그인은 `로컬 테스트 계정으로 계속` 버튼을 사용한다. Google OAuth 버튼은 로컬에서는 disabled로 둔다. 현재 OAuth callback이 공개 API로 돌아가기 때문에 로컬 Google OAuth는 로컬 세션에 붙을 수 없다. - 현재 확인용 프로세스는 `127.0.0.1:9099` engine gateway, `127.0.0.1:8001` prod public API, `127.0.0.1:8000` dev API, `127.0.0.1:8010` Tailnet dev API, `127.0.0.1:5173` Vite dev web, `127.0.0.1:5174` public preview, `cloudflared` tunnel 1개다. Tailnet URL은 `https://alpaca-home.taile93291.ts.net/login`이다. stale Vite allowedHosts로 403이 났던 상태는 재검증 시 `login` 200, `/api/health` dev/db/engine true, `/api/auth/config` 200이었다. `alpaca-home.taile93291.ts.net`는 Vite 기본 `allowedHosts`에도 포함했다. @@ -169,8 +169,8 @@ - API 8001 health and public `https://api-vignette.chanpaca.net/health` both returned `environment:"prod"`, `db:true`, `engine:true` - Public web deployment: - `wrangler pages deploy dist --project-name vignette --branch main --commit-dirty=true` - - Production deployment `24c90784` - - `https://vignette.chanpaca.net/` serves `assets/index-HjXyC0JT.js` and `assets/index-C8JKXhNP.css` + - 2026-06-29 manual deployment, preview `https://eb2ed257.vignette-b1q.pages.dev` + - `https://vignette.chanpaca.net/` serves `assets/index-9KEDuuBQ.js` and `assets/index-DC83qEpU.css` - `https://vignette.chanpaca.net/live2d/mao/Mao.model3.json`, Haru model, and Cubism core routes return 404 - Public login screen: - `npx playwright test e2e/auth.spec.ts --project=chromium-desktop --grep "public login"` diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index e443698..69b9e7e 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -808,7 +808,7 @@
운영 확인용 프로세스와 로컬/Tailnet 검증용 dev 프로세스를 의도적으로 분리해 유지한다.
9099 engine, 8001 prod API, 8000/8010 dev API, 5173 web, cloudflared tunnel 1개
Get-NetTCPConnection에서 대상 포트별 listener 확인
SSO 클레임, 추가 축어록 수급, 미성년 원본 활용동의, 개인정보 처리방침을 P1 진입 전 외부 의존성으로 명확히 둔다. 로컬 문서 골격은 준비됐지만 한신대/데이터 steward의 written evidence는 아직 필요하다.
docs/ops/hanshin-data-governance-gate.md, 공문 질의 항목, 동의 범위 체크리스트, SSO claim mapping 표
문서 artifact 작성 완료; IRB 게이트가 아니라 데이터/SSO 게이트로 외부 증거 필요 상태 유지
24c90784가 현재 dirty local source dist로 배포됐고, 운영 반영 전 남은 핵심 증거는 공개 Google OAuth 실제 /turn smoke다. 런타임 mock/demo 자산은 운영 번들에서 제거하고 테스트 fixture만 남긴다./turn smoke다. 런타임 mock/demo 자산은 운영 번들에서 제거하고 테스트 fixture만 남긴다.이전 "완료" 카드 내용을 탭 안에서 항목별로 보존한다.
session-persistence, teacher, voice는 /api/personas에서 실제 DB persona를 가져온다.
seed persona 직접 결합 제거, 실제 persona catalog 기반 E2E
persona 관련 E2E가 DB-backed persona로 통과
실제 운영 도메인에 반영됐는지, 서버가 하나로 정리됐는지, 완료라고 말할 증거가 있는지 확인하는 탭이다.
커스텀 도메인의 로그인 페이지가 현재 production asset을 정상 응답한다. 2026-06-29 재확인 기준 로그인 HTML과 asset HEAD가 모두 200이다.
https://vignette.chanpaca.net/login, assets/index-D7zOEf4x.js, assets/index-DJ9AFoSk.css
Invoke-WebRequest https://vignette.chanpaca.net/login → 200 + current assets
커스텀 도메인의 로그인 페이지가 현재 production asset을 정상 응답한다. 2026-06-29 재확인 기준 로그인 HTML과 asset HEAD가 모두 200이다.
https://vignette.chanpaca.net/login, assets/index-9KEDuuBQ.js, assets/index-DC83qEpU.css
Invoke-WebRequest https://vignette.chanpaca.net/login?deploy=20260629 → 200 + current assets
터널은 prod API 8001을 보고, API는 DB와 engine을 모두 확인한다. 로컬 dev API 8010도 같은 엔진/DB 경로로 정상이다.
environment:"prod", environment:"dev", db:true, engine:true, engine_mode:"claude_cli"
https://api-vignette.chanpaca.net/health, http://127.0.0.1:8001/health, http://127.0.0.1:8010/health 모두 OK
로컬 web/api/engine을 Tailscale Serve로 묶어 같은 Tailnet PC·모바일에서 HTTPS로 접근한다. Vite proxy와 API 포트가 어긋나지 않도록 dev-up.ps1에서 VITE_API_PROXY_TARGET을 ApiPort와 동기화한다. Tailnet dev-origin에서는 공개 OAuth callback으로 세션이 섞이지 않게 dev-login을 기본 검증 경로로 둔다.
https://alpaca-home.taile93291.ts.net, scripts/start-tailscale-runtime.ps1, VITE_ALLOWED_HOSTS, vite.config.ts, auth.py
/login 200, /api/auth/config 200, redirect_uri=https://api-vignette.chanpaca.net/auth/callback, dev_login_enabled:true. Vite host-header block 재현 안 됨.
더미 운영 env 기준 fresh compose 기동을 통과했다. API 컨테이너 import 실패, 구현 없는 RAG 사이드카, 로컬 apps/api/.env 이미지 혼입, startup owner-DDL, 빈 admin_engine_config 행 때문에 prod가 죽던 경로를 수정했다. 루트 계산은 app.paths.repo_root()로 모았고, backend requirements는 exact pin으로 고정했다.
패키징은 OK지만 실제 이식 전에는 배포지 infra/.env에 APP_DB_PASSWORD, OAuth client id/secret, OPENAI_API_KEY, SESSION_SECRET 등 소유자 비밀값을 채워야 한다. data/kb live-coaching source pack은 commit 또는 같은 경로 provision이 필요하다. 현재 로컬 env의 ENGINE_MODE=claude_p와 prod 금지 샘플 TTS 플래그는 운영값으로 쓰면 안 된다.
docker compose -f infra/docker-compose.yml config --quiet, API/Web image build, API image .env* 미포함, prod import smoke, fresh docker compose up -d --build → /api/health 200, preflight OK requirements_pinned/live_coach_kb/env_file.
python -m compileall app engine_gatewaypython scripts\check-phase3-artifacts.py --help + pytest app/test_phase3_artifact_checker.py -qnpm run buildwrangler pages deploy dist --project-name vignette --branch main --commit-dirty=true24c90784, dirty local source deployhttps://vignette.chanpaca.net/loginindex-D7zOEf4x.js, index-DJ9AFoSk.csswrangler pages deploy dist --project-name vignette --branch main --commit-dirty=truehttps://eb2ed257.vignette-b1q.pages.devhttps://vignette.chanpaca.net/login?deploy=20260629index-9KEDuuBQ.js, index-DC83qEpU.css/live2d/mao/* / /live2d/haru/* / /live2d/live2dcubismcore.min.jsdocker compose -f infra\docker-compose.yml config --quietrag.server sidecar removed.docker build -f apps/api/Dockerfile . / docker run ... python -c "import app.main" / docker build -f apps/web/Dockerfile apps/webnode_modules; API image excludes local .env files.auth.spec.ts --grep public loginstart/watch/install-public-runtime*.ps1api-vnet.18ka.net; add future domains explicitly with -AdditionalPublicHealthUrls.https://api-vignette.chanpaca.net/healthhttps://vignette.chanpaca.net/login / https://api-vignette.chanpaca.net/health / https://alpaca-home.taile93291.ts.net/loginassets/index-D7zOEf4x.js, assets/index-DJ9AFoSk.css), public API health status=ok, environment=prod, db=true, engine=true, engine_mode=claude_cli, unauth public /personas 401. Earlier local/Tailnet checks remain recorded separately; vnet DNS A records are still 0.https://vignette.chanpaca.net/login / https://api-vignette.chanpaca.net/health / https://alpaca-home.taile93291.ts.net/loginassets/index-9KEDuuBQ.js, assets/index-DC83qEpU.css), public API health status=ok, environment=prod, db=true, engine=true, engine_mode=claude_cli, unauth public /personas 401. Earlier local/Tailnet checks remain recorded separately; vnet DNS A records are still 0.PLAYWRIGHT_BASE_URL=http://127.0.0.1:5175 auth.spec.tslearner.spec.ts + readiness.spec.ts desktop/mobilelearn-empty-desktop.png / learn-empty-mobile-compact.png