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

@ -37,7 +37,6 @@
gap:16px;
align-items:start;
}
.ps-rail,
.ps-inspector{
position:sticky;
top:76px;
@ -45,9 +44,7 @@
gap:14px;
min-width:0;
}
.ps-rail__head,
.ps-editor__top,
.ps-workflow,
.ps-inspector__block{
border:1px solid var(--border-subtle);
border-radius:var(--radius);
@ -55,14 +52,12 @@
padding:16px;
box-shadow:var(--shadow-sm);
}
.ps-rail__head,
.ps-editor__top{
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:12px;
}
.ps-rail__head b,
.ps-editor__top h2{
display:block;
margin:4px 0 0;
@ -73,167 +68,15 @@
line-height:1.25;
letter-spacing:0;
}
.ps-list,
.ps-approved,
.ps-review-cards,
.ps-check{
display:grid;
gap:8px;
}
.ps-list-row{
width:100%;
display:grid;
grid-template-columns:42px minmax(0,1fr);
gap:10px;
align-items:center;
padding:10px;
border:1px solid var(--border-subtle);
border-radius:var(--radius);
background:var(--bg-surface);
color:inherit;
text-align:left;
cursor:pointer;
}
.ps-list-row:hover,
.ps-list-row.is-active{
border-color:var(--accent);
background:var(--accent-tint);
}
.ps-list-row:disabled{
opacity:.55;
cursor:not-allowed;
}
.ps-list-row__code{
display:grid;
place-items:center;
min-width:38px;
min-height:34px;
border:1px solid var(--hair);
border-radius:var(--radius-sm);
color:var(--accent-deep);
background:var(--bg-surface-2);
font-weight:760;
font-family:var(--font-num);
}
.ps-list-row__body{
min-width:0;
}
.ps-list-row__body b,
.ps-list-row__body small{
display:block;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.ps-list-row__body small,
.ps-muted,
.ps-approved-row span,
.ps-review span{
color:var(--text-muted);
font-size:var(--fs-xs);
}
.ps-approved{
padding:14px;
border:1px solid var(--border-subtle);
border-radius:var(--radius);
background:var(--bg-surface);
}
.ps-workflow{
display:grid;
gap:10px;
}
.ps-workflow-step{
display:grid;
grid-template-columns:30px minmax(0,1fr);
align-items:center;
gap:10px;
padding:10px;
border:1px solid var(--hair);
border-radius:var(--radius-sm);
background:var(--bg-surface-2);
color:var(--text-muted);
}
.ps-workflow-step > span{
display:grid;
place-items:center;
width:30px;
height:30px;
border:1px solid var(--border-subtle);
border-radius:50%;
background:var(--bg-surface);
color:var(--text-muted);
font-family:var(--font-num);
font-weight:760;
}
.ps-workflow-step b,
.ps-workflow-step small{
display:block;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.ps-workflow-step b{
color:var(--text-strong);
font-size:var(--fs-sm);
}
.ps-workflow-step small{
margin-top:2px;
font-size:11px;
}
.ps-workflow-step.is-current{
border-color:var(--accent);
background:var(--accent-tint);
color:var(--accent-deep);
}
.ps-workflow-step.is-current > span,
.ps-workflow-step.is-done > span{
border-color:var(--accent);
background:var(--accent);
color:var(--text-on-accent);
}
.ps-approved-row{
display:grid;
grid-template-columns:38px minmax(0,1fr);
gap:8px 10px;
align-items:center;
padding:8px 0;
border-top:1px solid var(--hair);
}
.ps-approved-row:first-of-type{border-top:0;}
.ps-approved-row__code{
font-family:var(--font-num);
font-size:var(--fs-xs);
color:var(--text-muted);
}
.ps-approved-row__body{
min-width:0;
display:grid;
gap:2px;
}
.ps-approved-row b{
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
font-size:var(--fs-xs);
}
.ps-approved-row small{
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
color:var(--text-muted);
font-size:11px;
}
.ps-approved-row__actions{
grid-column:1 / -1;
display:grid;
grid-template-columns:repeat(2,minmax(0,1fr));
gap:6px;
}
.ps-approved-row__actions .vg-btn{
width:100%;
}
.ps-editor{
display:grid;
gap:14px;
@ -493,8 +336,8 @@
}
.ps-prompt-section__head h3{
margin:0;
color:var(--text-heading);
font-size:var(--fs-md);
color:var(--text-strong);
font-size:var(--fs-body);
line-height:1.25;
}
.ps-prompt-section__head p,
@ -516,7 +359,7 @@
gap:10px;
align-items:start;
padding:8px 0;
border-top:1px solid var(--border-faint);
border-top:1px solid var(--hair);
}
.ps-prompt-row dt{
color:var(--text-muted);
@ -671,9 +514,6 @@
.ps-layout{
grid-template-columns:1fr;
}
.ps-rail{
position:static;
}
.ps-inspector{
grid-template-columns:1fr;
}
@ -931,7 +771,7 @@
min-height:58px;
padding:9px 16px;
border:0;
border-top:1px solid var(--border-faint);
border-top:1px solid var(--hair);
background:transparent;
color:var(--text-body);
text-align:left;
@ -959,7 +799,7 @@
.ps-catalog-hero__count b{color:var(--text-strong);font-family:var(--font-num);font-size:54px;line-height:1;letter-spacing:-.06em;}
.ps-catalog-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;}
.ps-settings-list{display:grid;margin:18px 0 0;}
.ps-settings-list > div{display:grid;grid-template-columns:minmax(130px,.4fr) minmax(0,1fr);gap:18px;padding:11px 0;border-top:1px solid var(--border-faint);}
.ps-settings-list > div{display:grid;grid-template-columns:minmax(130px,.4fr) minmax(0,1fr);gap:18px;padding:11px 0;border-top:1px solid var(--hair);}
.ps-settings-list dt{color:var(--text-muted);font-size:var(--fs-xs);font-weight:720;}
.ps-settings-list dd{margin:0;color:var(--text-strong);font-size:var(--fs-sm);text-align:right;overflow-wrap:anywhere;}
.ps-distribution{display:grid;gap:14px;margin-top:18px;}
@ -967,7 +807,7 @@
.ps-distribution span{color:var(--text-body);font-size:var(--fs-xs);}
.ps-distribution b{color:var(--text-strong);font-family:var(--font-num);font-size:12px;}
.ps-catalog-list{margin-top:16px;border-top:1px solid var(--border-subtle);}
.ps-catalog-list button{width:100%;display:grid;grid-template-columns:48px minmax(0,1fr) minmax(70px,.25fr) 46px 20px;gap:12px;align-items:center;padding:12px 4px;border:0;border-bottom:1px solid var(--border-faint);background:transparent;color:var(--text-body);text-align:left;cursor:pointer;}
.ps-catalog-list button{width:100%;display:grid;grid-template-columns:48px minmax(0,1fr) minmax(70px,.25fr) 46px 20px;gap:12px;align-items:center;padding:12px 4px;border:0;border-bottom:1px solid var(--hair);background:transparent;color:var(--text-body);text-align:left;cursor:pointer;}
.ps-catalog-list button:hover{background:var(--bg-surface-2);}
.ps-catalog-list button > span:nth-child(2){min-width:0;display:grid;gap:3px;}
.ps-catalog-list button b,.ps-catalog-list button small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
@ -987,7 +827,7 @@
.ps-persona-table{overflow:hidden;border:1px solid var(--border-subtle);border-radius:var(--radius);background:color-mix(in srgb,var(--bg-surface) 88%,transparent);}
.ps-persona-table__head,.ps-persona-row{display:grid;grid-template-columns:minmax(300px,1.5fr) minmax(135px,.55fr) minmax(100px,.4fr) minmax(110px,.42fr) 54px minmax(190px,.72fr);gap:12px;align-items:center;}
.ps-persona-table__head{padding:10px 14px;background:var(--bg-surface-2);color:var(--text-muted);font-size:10px;font-weight:780;}
.ps-persona-row{min-height:70px;padding:10px 14px;border-top:1px solid var(--border-faint);}
.ps-persona-row{min-height:70px;padding:10px 14px;border-top:1px solid var(--hair);}
.ps-persona-row:hover{background:color-mix(in srgb,var(--bg-surface-2) 72%,transparent);}
.ps-persona-row__identity{min-width:0;display:grid;grid-template-columns:44px minmax(0,1fr);gap:11px;align-items:center;padding:0;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer;}
.ps-persona-row__identity > span:last-child,.ps-persona-row__usage{min-width:0;display:grid;gap:3px;}
@ -1008,7 +848,7 @@
.ps-review-card__top{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.ps-review-card h3{margin:0;color:var(--text-strong);font-size:17px;}
.ps-review-card > p{margin:0;color:var(--text-muted);font-size:var(--fs-xs);line-height:1.5;}
.ps-review-card dl{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:0;border-top:1px solid var(--border-faint);}
.ps-review-card dl{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:0;border-top:1px solid var(--hair);}
.ps-review-card dl > div{display:grid;gap:4px;padding:10px 8px 0;}
.ps-review-card dt{color:var(--text-muted);font-size:10px;}
.ps-review-card dd{margin:0;color:var(--text-body);font-size:11px;overflow-wrap:anywhere;}
@ -1024,13 +864,13 @@
.ps-chip-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:20px;}
.ps-chip-row span{padding:5px 8px;border:1px solid var(--border-subtle);border-radius:var(--radius-sm);color:var(--text-muted);font-size:11px;}
.ps-detail-facts dl{display:grid;margin:0;}
.ps-detail-facts dl > div{display:flex;justify-content:space-between;gap:16px;padding:10px 0;border-top:1px solid var(--border-faint);}
.ps-detail-facts dl > div{display:flex;justify-content:space-between;gap:16px;padding:10px 0;border-top:1px solid var(--hair);}
.ps-detail-facts dl > div:first-child{border-top:0;}
.ps-detail-facts dt{color:var(--text-muted);font-size:var(--fs-xs);}
.ps-detail-facts dd{margin:0;color:var(--text-strong);font-size:var(--fs-xs);font-weight:720;text-align:right;}
.ps-learning-detail{display:grid;gap:14px;}
.ps-point-list{display:grid;margin-top:14px;border-top:1px solid var(--border-subtle);}
.ps-point-list > div{display:grid;grid-template-columns:minmax(0,1fr) 70px 120px;gap:12px;padding:11px 0;border-bottom:1px solid var(--border-faint);color:var(--text-body);font-size:var(--fs-xs);}
.ps-point-list > div{display:grid;grid-template-columns:minmax(0,1fr) 70px 120px;gap:12px;padding:11px 0;border-bottom:1px solid var(--hair);color:var(--text-body);font-size:var(--fs-xs);}
.ps-point-list b{font-family:var(--font-num);font-variant-numeric:tabular-nums;}
.ps-point-list small{color:var(--text-muted);text-align:right;}
.ps-stepper{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:1px solid var(--border-subtle);border-radius:var(--radius);overflow:hidden;background:color-mix(in srgb,var(--bg-surface) 78%,transparent);}
@ -1044,7 +884,6 @@
.ps-stepper button.is-current{background:var(--accent-tint);color:var(--accent-deep);}
.ps-stepper button.is-current > span:first-child,.ps-stepper button.is-done > span:first-child{border-color:var(--accent);background:var(--accent);color:var(--text-on-accent);}
.ps-authoring-layout{grid-template-columns:minmax(0,1fr) minmax(260px,320px);}
.ps-authoring-layout > .ps-rail{display:none;}
.ps-authoring-layout[data-authoring-step="source"] .ps-tabs,
.ps-authoring-layout[data-authoring-step="source"] .ps-edit-panel,
.ps-authoring-layout[data-authoring-step="generate"] .ps-tabs,
@ -1074,7 +913,7 @@
.ps-kpi > b{font-size:30px;}
.ps-performance__metrics{grid-template-columns:1fr;gap:18px;}
.ps-review-summary__grid{grid-template-columns:1fr;}
.ps-review-summary__grid > div{padding:12px 0;border-right:0;border-bottom:1px solid var(--border-faint);}
.ps-review-summary__grid > div{padding:12px 0;border-right:0;border-bottom:1px solid var(--hair);}
.ps-usage-table__head{display:none;}
.ps-usage-row{grid-template-columns:minmax(0,1fr) repeat(2,58px);gap:8px;}
.ps-usage-row strong:nth-last-child(-n+2){display:none;}
@ -1094,14 +933,14 @@
padding:14px;
}
.ps-persona-row__identity{grid-column:1 / -1;}
.ps-persona-row__usage{grid-column:1 / -1;padding:9px 0;border-top:1px solid var(--border-faint);border-bottom:1px solid var(--border-faint);}
.ps-persona-row__usage{grid-column:1 / -1;padding:9px 0;border-top:1px solid var(--hair);border-bottom:1px solid var(--hair);}
.ps-persona-row > span:nth-child(3),
.ps-persona-row > span:nth-child(4){justify-self:start;}
.ps-version{justify-self:end;}
.ps-persona-row__actions{grid-column:1 / -1;justify-content:stretch;}
.ps-persona-row__actions .vg-btn{flex:1 1 0;}
.ps-review-page__summary{grid-template-columns:1fr;}
.ps-review-page__summary > div{border-right:0;border-bottom:1px solid var(--border-faint);}
.ps-review-page__summary > div{border-right:0;border-bottom:1px solid var(--hair);}
.ps-review-board{grid-template-columns:1fr;}
.ps-drill-head{grid-template-columns:1fr;}
.ps-drill-head__actions{justify-content:flex-start;}