정규식 폴백에 한국어 고위험 패턴 추가: 구체 날짜(2001.4.18→[DATE])·금액(1200원→[MONEY])·행정구역 주소(서울시 강남구 역삼동→[ADDR]). 상담 생성(generate/stream)·fast/deep 평가의 외부 LLM 호출 직후 audit.llm_call_log에 provider/model/token/cost/inference_geo/latency만 적재한다. prompt/completion 본문은 저장하지 않는다. 로컬 dev-login 실제 /turn smoke에서 audit.llm_call_log가 8→11로 3행 증가했다. 이번 패스에서 app_user에 이름·소속·학과·학년/직위·연락처·주소/수령지·닉네임·자기소개·아바타 URL·약관/개인정보 동의 시각·버전을 추가했다. 로그인 후 onboarding_completed_at이 없으면 전역 OnboardingGate가 /onboarding 외 URL(/learn, /settings, /admin, /dev/avatar-preview, /login 포함)을 모두 온보딩으로 돌리고, 온보딩 중에는 공용 셸 메뉴 없이 가입 직후 사용자 정보 입력 폼만 보여준다. learner 회기 시작도 온보딩 완료 전에는 막는다. /users/me/avatar는 PNG/JPG/WebP MIME·시그니처·3MB 제한 후 파일을 USER_UPLOAD_DIR/profile-avatars에 저장하고 URL만 보관한다. 약관·개인정보 처리방침 초안은 /users/legal-docs에서 제공한다. 관리자/교수자 권한은 온보딩에서 받지 않고 allowlist/관리자 사용자 관리로만 부여한다. 검증: pytest app/ -q 145 passed, pytest engine_gateway/ -q 9 passed, npm run check:api-types, npm run typecheck, npm run build, auth E2E 7 passed, 최종 PLAYWRIGHT_PORT=5174 npm run e2e 113 passed.
이름/기관명은 NER 필요(Presidio ko 모델·spaCy ko, 무거움 — TODO 명시). 미성년/guardian 및 법무 검토가 필요한 최종 서명 동의서·개인정보 처리방침·약관 evidence는 외부 게이트다. 공개 Google OAuth 실제 /turn proof는 별도 운영 게이트.
정규식 폴백에 한국어 고위험 패턴 추가: 구체 날짜(2001.4.18→[DATE])·금액(1200원→[MONEY])·행정구역 주소(서울시 강남구 역삼동→[ADDR]). 상담 생성(generate/stream)·fast/deep 평가의 외부 LLM 호출 직후 audit.llm_call_log에 provider/model/token/cost/inference_geo/latency만 적재한다. prompt/completion 본문은 저장하지 않는다. 로컬 dev-login 실제 /turn smoke에서 audit.llm_call_log가 8→11로 3행 증가했다. 이번 패스에서 app_user에 이름·소속·학과·학년/직위·연락처·주소/수령지·닉네임·자기소개·아바타 URL·약관/개인정보 동의 시각·버전을 추가했다. 로그인 후 onboarding_completed_at이 없으면 전역 OnboardingGate가 /onboarding 외 URL(/learn, /settings, /admin, /dev/avatar-preview, /login 포함)을 모두 온보딩으로 돌리고, 온보딩 중에는 공용 셸 메뉴 없이 가입 직후 사용자 정보 입력 폼만 보여준다. learner 회기 시작도 온보딩 완료 전에는 막는다. /users/me/avatar는 PNG/JPG/WebP MIME·시그니처·3MB 제한 후 파일을 USER_UPLOAD_DIR/profile-avatars에 저장하고 URL만 보관한다. 약관·개인정보 처리방침 초안은 /users/legal-docs에서 제공한다. 관리자/교수자 권한은 온보딩에서 받지 않고 allowlist/관리자 사용자 관리로만 부여한다. 검증: pytest app/ -q 178 passed, pytest engine_gateway/ -q 11 passed, npm run check:api-types, npm run typecheck, npm run build, auth E2E 7 passed, 최종 PLAYWRIGHT_PORT=5174 npm run e2e 113 passed.
이름/기관명은 NER 필요(Presidio ko 모델·spaCy ko, 무거움 — TODO 명시). 미성년/guardian 및 법무 검토가 필요한 최종 서명 동의서·개인정보 처리방침·약관 evidence는 외부 게이트다. 공개 Google OAuth 실제 /turn proof는 별도 운영 게이트.