G0~G8 성과·동맹 측정 OS 작업 일괄 고정

8월 7일까지 워킹트리에만 남아 있던 미커밋 작업을 커밋한다. 여러 사본
폴더(worktree·clone)에 흩어져 있던 중간 스냅샷을 정리하기 전에 원본을
git 이력으로 고정하는 것이 목적이다.

- contracts/routes/services: measurement, outcome_trajectory, rupture_repair,
  deliberate_practice, calibration_transfer, supervision_research,
  multimodal_alliance, continuous_improvement 계열 신규 모듈과 테스트
- infra/db/init: 07~16 마이그레이션(측정 기반~calibration transfer 실행)
- apps/web: 세션 리뷰 카드·관리 화면·E2E 스펙 추가
- docs/ops: G0~G8 라이브 통합·배포·롤백 증거 문서와 evidence JSON/PNG
- scripts: smoke·ledger·릴리스 에이전트·NAS 프리뷰 운영 스크립트

engine.public 로그 .bak과 apps/web/test-results 산출물은 커밋에서 제외했다.
This commit is contained in:
Yun Chan 2026-08-08 01:30:53 +09:00
parent 93dd8f82d7
commit 16e791e044
390 changed files with 243188 additions and 499 deletions

View file

@ -21,6 +21,10 @@
gap:var(--sp-2);
min-width:0;
}
.lh-head__primary{
min-height:44px;
flex:none;
}
.lh-head__status{
flex:none;
min-height:34px;
@ -94,6 +98,7 @@
font-size:var(--fs-sm);
font-weight:700;
cursor:pointer;
min-height:44px;
}
/* D6( 구분 강화): 비활성 탭이 배경과 같아 "여러 개 중 하나" 읽혔다.
비활성 사이에만 세로 구분선을 넣는다. 활성 탭은 자체 배경/테두리로
@ -133,6 +138,13 @@
align-content:start;
gap:var(--sp-4);
}
.lh-dashboard-side__tabpanel{
min-width:0;
display:grid;
align-content:start;
gap:var(--sp-4);
grid-column:1 / -1;
}
.lh-dashboard-feedback .lh-feedback-mini{
padding-top:0;
border-top:0;
@ -783,7 +795,7 @@
align-items:center;
justify-content:space-between;
gap:10px;
min-height:40px;
min-height:44px;
margin-top:2px;
padding:0 12px;
border:1px solid color-mix(in srgb,var(--accent) 34%,transparent);
@ -959,6 +971,114 @@
font-size:11.5px;
font-style:normal;
}
.lh-voice-practice-intent{
display:grid;
grid-template-columns:minmax(0,1.45fr) minmax(320px,.85fr);
gap:var(--sp-4);
align-items:center;
padding:var(--sp-4);
border:1px solid var(--border-strong);
border-radius:var(--radius);
background:var(--accent-tint);
}
.lh-voice-practice-intent h2{
margin:5px 0 0;
color:var(--text-strong);
font-size:var(--fs-h3);
line-height:1.35;
}
.lh-voice-practice-intent p{
margin:7px 0 0;
color:var(--text-body);
font-size:var(--fs-sm);
line-height:1.6;
}
.lh-voice-practice-intent dl{
display:grid;
grid-template-columns:repeat(3,minmax(0,1fr));
gap:var(--sp-2);
margin:0;
}
.lh-voice-practice-intent dl > div{
min-width:0;
padding:var(--sp-3);
border:1px solid var(--border-subtle);
border-radius:var(--radius-sm);
background:var(--bg-surface);
}
.lh-voice-practice-intent dt{
color:var(--text-muted);
font-size:var(--fs-xs);
}
.lh-voice-practice-intent dd{
margin:4px 0 0;
overflow:hidden;
color:var(--text-strong);
font-family:var(--font-num);
font-size:var(--fs-sm);
font-weight:700;
text-overflow:ellipsis;
white-space:nowrap;
}
.lh-voice-practice-intent.is-error{
border-color:color-mix(in srgb,var(--crit-text) 45%,var(--border-subtle));
background:var(--crit-tint);
}
.lh-practice-launch-intent{
border-color:color-mix(in srgb,var(--accent) 45%,var(--border-subtle));
background:color-mix(in srgb,var(--accent-tint) 86%,var(--bg-surface));
}
.lh-practice-launch-intent dl{
grid-template-columns:repeat(auto-fit,minmax(128px,1fr));
}
.lh-practice-launch-intent__details{
min-width:0;
}
.lh-practice-launch-intent__details summary{
min-width:0;
min-height:44px;
display:grid;
grid-template-columns:auto minmax(0,1fr) auto;
align-items:center;
gap:10px;
padding:10px 12px;
border:1px solid var(--border-subtle);
border-radius:var(--radius-sm);
background:var(--bg-surface);
color:var(--text-body);
cursor:pointer;
list-style:none;
}
.lh-practice-launch-intent__details summary::-webkit-details-marker{
display:none;
}
.lh-practice-launch-intent__details summary span{
color:var(--accent-deep);
font-size:var(--fs-xs);
font-weight:760;
}
.lh-practice-launch-intent__details summary b{
min-width:0;
overflow:hidden;
color:var(--text-strong);
font-size:var(--fs-sm);
font-weight:720;
text-overflow:ellipsis;
white-space:nowrap;
}
.lh-practice-launch-intent__details summary svg{
transition:transform var(--dur-base) var(--ease-out);
}
.lh-practice-launch-intent__details[open] summary svg{
transform:rotate(90deg);
}
.lh-practice-launch-intent__details summary:focus-visible{
outline:2px solid var(--border-focus);
outline-offset:2px;
}
.lh-practice-launch-intent__details dl{
margin-top:var(--sp-2);
}
.lh-practice-layout{
min-width:0;
display:grid;
@ -1723,6 +1843,7 @@
.lh-dashboard-hero,
.lh-dashboard-columns,
.lh-history-layout,
.lh-voice-practice-intent,
.lh-practice-layout{
grid-template-columns:1fr;
}
@ -1774,13 +1895,16 @@
}
}
@media (max-width:720px){
.lh-voice-practice-intent dl{
grid-template-columns:1fr;
}
.lh-head{
display:grid;
gap:10px;
}
.lh-head__tools{
width:100%;
justify-content:space-between;
justify-content:flex-start;
align-items:center;
}
.lh-head__status{
@ -1896,6 +2020,9 @@
}
@media (max-width:460px){
.lh-head__status{display:none;}
.lh-head__primary{
width:100%;
}
.lh-history-overview{
grid-template-columns:1fr;
}
@ -2168,11 +2295,15 @@
padding-right: clamp(24px, 24%, 92px);
}
.vg-shell--learner-dashboard .lh-coach-card__cta {
background:
linear-gradient(90deg, color-mix(in srgb, var(--accent) 42%, var(--glass-surface-inset)), color-mix(in srgb, var(--accent) 58%, var(--glass-surface-inset)));
border-color: color-mix(in srgb, var(--accent) 44%, var(--lh-gold));
background:var(--accent);
border-color:color-mix(in srgb,var(--accent-deep) 78%,var(--lh-gold));
color:var(--text-on-accent);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.28);
}
.vg-shell--learner-dashboard .lh-coach-card__cta:hover:not(:disabled) {
background:var(--accent-deep);
color:var(--text-on-accent);
}
.vg-shell--learner-dashboard .lh-panel__head button,
.vg-shell--learner-dashboard .lh-panel__badge,
.vg-shell--learner-dashboard .lh-tabs {
@ -2282,6 +2413,9 @@
.vg-shell--learner-dashboard .lh-dashboard-side {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.vg-shell--learner-dashboard .lh-dashboard-side__tabpanel {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
.vg-shell--learner-dashboard .lh-root {
@ -2497,6 +2631,19 @@
}
}
@media (max-width: 720px) {
.vg-shell--learner-dashboard .lh-metric-card {
min-height: 104px;
padding: 13px 34% 13px 13px;
}
.vg-shell--learner-dashboard .lh-metric-card::after {
inset: 12px 0 8px 56%;
width: auto;
height: auto;
background-position: center;
}
.vg-shell--learner-dashboard .lh-metric-card b {
font-size: clamp(19px, 6vw, 24px);
}
.vg-shell--learner-dashboard .lh-recap {
grid-template-columns: 1fr;
}