전수 E2E 순회·소유자 결정 6건 구현·디자인 감사 반영

- 전수 순회: IA 전 라우트 412개 기능 인벤토리를 체크리스트 백로그로 관리
  (docs/ops/e2e-full-sweep-2026-07-27.md), 신규 full-sweep 스펙 10파일 추가.
  RED→GREEN으로 결함 12건 수정: 관리자 무한 렌더 프리즈(TanStack autoReset
  루프), 복수 코호트 저장 유실, 페르소나 보관 503(SQL 컬럼 모호성), PII 과잉
  마스킹, /admin/ai watchdog 오탐 오버레이, 모바일 겹침 2건, 설정 스크롤
  스파이, 온보딩 전화번호 무검증, 리뷰 조사·난도 라벨, pending 피드백 등.
- 소유자 결정 구현: 설정 아바타 변경, 동의 철회·재동의 전체 흐름, 신규
  학습자 기초 우선 추천, 학생 분석 테이블 가상화(@tanstack/react-virtual),
  저작 모드 죽은 레일 정리, 감정 밸런스 타임라인 차트(deep turn_valence +
  결정론 파생 폴백).
- 디자인 감사(142차): 라이트 팔레트 AA 대비, 다크 토큰 별칭 통일, 미정의
  CSS 변수 정리, 한글 keep-all 전역화, 탭 타깃 24px, LCP preconnect.
- 검증: npm run e2e 병렬 432 수집 GREEN + 직렬 49/49 exit 0, 백엔드 pytest
  421, gateway 29, typecheck/build/design-ssot/dead-code/중복 게이트 통과,
  layout-visual-gate 15/15, session-layout 8/8. 상세는 SSOT 대시보드
  142~144차 노트.
This commit is contained in:
Yun Chan 2026-07-27 14:25:24 +09:00
parent 0ae94499f2
commit 4511383cd9
55 changed files with 9333 additions and 573 deletions

View file

@ -1748,6 +1748,20 @@
padding:4px 7px;
}
}
/* 초소형 (320~420px, iPhone SE급) 전용 밴드.
기존 최소 브레이크포인트가 460px이라 구간이 비어 있었다.
320px에서 페르소나 카드는 78vw(=249.6px)이고 마크 38px + 좌우 패딩 48px + 11px를
빼면 이름 칸이 150.6px밖에 남는다. 그래서
"하린(가명) · 고3 · 진로갈등(부모기대 vs 본인욕구)" 3줄(57px) 요구하는데
기본 -webkit-line-clamp:2(38px) 걸려 마지막 19px이 통째로 사라졌다
(실측: clientHeight 38 / scrollHeight 57).
구간만 3줄까지 허용해 이름이 온전히 보이게 한다. 그보다 길어져도
-webkit-box + line-clamp를 유지하므로 세로로 깎이지 않고 말줄임()으로만 잘린다. */
@media (max-width:420px){
.lh-persona__name{
-webkit-line-clamp:3;
}
}
@media (prefers-reduced-motion:reduce){
.lh-skel__box,
.lh-skel__line{animation:none;}
@ -1764,8 +1778,8 @@
text-align: left;
padding: 9px 11px;
border-radius: var(--radius-sm);
border: 1px solid var(--border-soft, rgba(255, 255, 255, 0.09));
background: var(--bg-inset, rgba(0, 0, 0, 0.12));
border: 1px solid var(--border-subtle);
background: var(--bg-surface-2);
color: inherit;
cursor: pointer;
}
@ -1781,7 +1795,7 @@
margin: 0;
font-size: 11.5px;
line-height: 1.5;
color: var(--text-dim);
color: var(--text-muted);
}
.lh-rapport-list {
display: grid;
@ -1806,13 +1820,13 @@
margin-left: 4px;
font-size: 10.5px;
font-weight: 620;
color: var(--text-dim);
color: var(--text-muted);
}
.lh-rapport-row__bar {
display: block;
height: 5px;
border-radius: 3px;
background: var(--bg-inset, rgba(0, 0, 0, 0.16));
background: var(--neutral-100);
overflow: hidden;
}
.lh-rapport-row__bar i {
@ -1840,10 +1854,10 @@
gap: 5px;
padding: 5px 10px;
border-radius: 999px;
border: 1px solid var(--border-soft, rgba(255, 255, 255, 0.1));
border: 1px solid var(--border-subtle);
font-size: 11.5px;
font-weight: 680;
color: var(--text-dim);
color: var(--text-muted);
}
.lh-milestone.is-done {
border-color: color-mix(in srgb, var(--accent) 45%, transparent);