전수 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

@ -26,6 +26,11 @@ body {
letter-spacing: 0;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
/* 한국어 조판: 기본값(normal) 한글을 음절 단위로 끊어 "오전" "오/전",
"검토 대기" "검/토 대기" 쪼개진다. 어절 단위로 끊고, 끊을 없는
토큰(URL·ID) 강제 줄바꿈한다. 세션 화면이 쓰던 규칙을 전역으로 올렸다. */
word-break: keep-all;
overflow-wrap: break-word;
}
/* 링크 기본: accent 텍스트, 밑줄은 hover에서만 (양산형 회피) */

View file

@ -16,11 +16,14 @@
--neutral-100: #f0ede6; /* 표면 hover / subtle fill */
--neutral-150: #e4dccf; /* 금빛이 아주 옅게 섞인 hairline */
--neutral-200: #d7cdbd; /* divider 진함 */
--neutral-400: #9b9a92; /* placeholder / disabled */
--neutral-400: #6f6e68; /* placeholder / disabled (기존 #9b9a92 — 2.4:1 AA 미달) */
--ink: #17231f; /* 시안의 거의 검정인 웜 포레스트 잉크 */
--ink-2: #5f635d; /* 보조 텍스트 */
--ink-3: #8f928a; /* 캡션/메타 */
/* 2026-07-27 접근성 보정: 라이트 3단 위계를 유지하면서 전부 WCAG AA(4.5:1)
넘긴다. 최악 조건은 가장 어두운 표면 --glass-canvas(#f2eee5) 기준으로 잰다.
강도 13.9:1 · 본문 6.9:1 · 캡션 4.6:1 (색상은 원래 그레이 색조 유지). */
--ink-2: #4d514b; /* 보조 텍스트 (기존 #5f635d — 위계 간격 확보용 보정) */
--ink-3: #6a6c65; /* 캡션/메타 (기존 #8f928a — 2.7:1 AA 미달이라 보정) */
--hair: #e4dccf; /* 1px 헤어라인 */
--botanical-gold: #b49a67;
--botanical-hair: rgba(180, 154, 103, 0.28);
@ -80,6 +83,10 @@
--text-body: var(--ink-2); /* 본문 보조 */
--text-muted: var(--ink-3); /* 캡션 */
--text-on-accent: #fbfaf8; /* accent 버튼 위 텍스트 */
/* accent를 "글자색"으로 전용 별칭.
--accent(#3e7a6e) 채움색 기준으로 고른 값이라 어두운 표면(--glass-canvas)
본문 크기에서 4.3:1로 AA에 미달한다. 텍스트는 항상 별칭을 쓴다. */
--text-accent: var(--accent-deep);
--border-subtle: var(--neutral-150);
--border-strong: var(--neutral-200);
@ -155,11 +162,13 @@
--neutral-100: #1b2725;
--neutral-150: #2b332f;
--neutral-200: #3b4039;
--neutral-400: #747970;
/* 2026-07-27 접근성 보정: 다크 표면 가장 밝은 카드(#223330) 기준으로도
AA(4.5:1) 넘도록 올렸다. 기존 값은 placeholder 2.97:1, 캡션 4.08:1 이었다. */
--neutral-400: #949b8f; /* placeholder / disabled (기존 #747970) */
--ink: #eee7d9;
--ink-2: #c4bfb3;
--ink-3: #8d9086;
--ink-3: #979a8f; /* 캡션/메타 (기존 #8d9086) */
--hair: #30372f;
--botanical-gold: #b9a275;
--botanical-hair: rgba(185, 162, 117, 0.26);
@ -183,9 +192,11 @@
--bg-surface-2: #111c1c;
--bg-tint: #192522;
--bg-stage: #091315;
--text-strong: #eee7d9;
--text-body: #c4bfb3;
--text-muted: #8d9086;
/* 라이트와 동일하게 primitive 별칭으로 잇는다. 이전엔 여기서 값을 다시 하드코딩해
위쪽 --ink-* 고쳐도 다크에는 반영되지 않는 이중 진실원본이었다. */
--text-strong: var(--ink);
--text-body: var(--ink-2);
--text-muted: var(--ink-3);
--text-on-accent: #0f1a17;
--border-subtle: #30372f;
--border-strong: #45483e;