docs: add full phase roadmap to dashboard

This commit is contained in:
Yun Chan 2026-06-26 15:38:00 +09:00
parent bf6c313027
commit 22ee0c6b89

View file

@ -103,6 +103,38 @@
.list { display:grid; gap:10px; margin:0; padding:0; list-style:none; } .list { display:grid; gap:10px; margin:0; padding:0; list-style:none; }
.list li { display:grid; grid-template-columns:10px minmax(0,1fr); gap:10px; color:var(--ink-2); font-size:13px; } .list li { display:grid; grid-template-columns:10px minmax(0,1fr); gap:10px; color:var(--ink-2); font-size:13px; }
.list li:before { content:""; width:6px; height:6px; margin-top:8px; border-radius:50%; background:var(--accent); } .list li:before { content:""; width:6px; height:6px; margin-top:8px; border-radius:50%; background:var(--accent); }
.roadmap {
display:grid;
grid-template-columns:repeat(5,minmax(0,1fr));
gap:12px;
align-items:stretch;
}
.phase-card {
min-width:0;
background:var(--surface);
border:1px solid var(--hair);
border-radius:12px;
padding:16px;
box-shadow:0 1px 2px rgba(28,42,42,.05);
}
.phase-card.current { border-color:color-mix(in srgb, var(--accent) 42%, var(--hair)); background:linear-gradient(180deg, var(--accent-tint), var(--surface) 58%); }
.phase-card.next { border-color:color-mix(in srgb, var(--warn) 35%, var(--hair)); }
.phase-top { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:10px; }
.phase-id { font:760 13px/1 var(--num); color:var(--accent-deep); }
.phase-card h3 { margin:0; font-size:15px; line-height:1.35; }
.phase-card p { margin:8px 0 0; color:var(--ink-2); font-size:12px; }
.phase-list { display:grid; gap:6px; margin:12px 0 0; padding:0; list-style:none; }
.phase-list li { color:var(--ink-2); font-size:12px; line-height:1.45; }
.phase-list li b { color:var(--ink); font-weight:700; }
.source-note {
margin-top:14px;
padding:14px 16px;
border:1px solid var(--hair);
border-radius:12px;
background:var(--paper-2);
color:var(--ink-2);
font-size:13px;
}
code { font-family:var(--num); font-size:12px; background:var(--paper-2); padding:2px 6px; border-radius:6px; } code { font-family:var(--num); font-size:12px; background:var(--paper-2); padding:2px 6px; border-radius:6px; }
.wide { grid-column:1 / -1; } .wide { grid-column:1 / -1; }
.commands { display:grid; gap:10px; } .commands { display:grid; gap:10px; }
@ -116,6 +148,7 @@
main { width:min(100% - 28px, 1180px); padding-top:28px; } main { width:min(100% - 28px, 1180px); padding-top:28px; }
.hero { grid-template-columns:1fr; } .hero { grid-template-columns:1fr; }
.grid { grid-template-columns:1fr; } .grid { grid-template-columns:1fr; }
.roadmap { grid-template-columns:1fr; }
} }
@media (max-width:520px) { @media (max-width:520px) {
.summary { grid-template-columns:1fr; } .summary { grid-template-columns:1fr; }
@ -127,14 +160,14 @@
<body> <body>
<header> <header>
<div class="brand"><span class="mark" aria-hidden="true"></span><span>Vignette 개발 대시보드</span></div> <div class="brand"><span class="mark" aria-hidden="true"></span><span>Vignette 개발 대시보드</span></div>
<div class="stamp">2026-06-26 15:18 KST</div> <div class="stamp">2026-06-26 15:35 KST</div>
</header> </header>
<main> <main>
<div class="hero"> <div class="hero">
<div> <div>
<div class="kicker">team lead review</div> <div class="kicker">team lead review</div>
<h1>Phase 0는 <em>검증 가능한 운영 안전장치와 E2E 안정화</em>까지 마무리됐다.</h1> <h1>전체 로드맵 기준 현재 위치는 <em>Phase 0 종료 직전</em>다.</h1>
<p class="lead"> <p class="lead">
이번 세션은 seed persona 결합 제거, 비개발 fail-closed 설정, compose OAuth 주입, 이번 세션은 seed persona 결합 제거, 비개발 fail-closed 설정, compose OAuth 주입,
admin 모바일 overflow 수정, persona 인증 경계 보강, 전체 Playwright 재통과, 공개 API prod 전환까지 완료했다. admin 모바일 overflow 수정, persona 인증 경계 보강, 전체 Playwright 재통과, 공개 API prod 전환까지 완료했다.
@ -145,6 +178,7 @@
Cloudflare Pages production 배포 `0fe8f3cc`도 완료했고, 커스텀 도메인이 새 asset을 서빙하는 것을 확인했다. Cloudflare Pages production 배포 `0fe8f3cc`도 완료했고, 커스텀 도메인이 새 asset을 서빙하는 것을 확인했다.
과거 Mao/Haru Live2D demo 자산은 repo와 번들에서 제거했고, `/live2d/*` 운영 경로는 404로 차단했다. 과거 Mao/Haru Live2D demo 자산은 repo와 번들에서 제거했고, `/live2d/*` 운영 경로는 404로 차단했다.
로컬 프로세스는 prod API 8001, engine gateway 9099, cloudflared tunnel 1개만 남기고 dev API와 임시 Vite preview를 내렸다. 로컬 프로세스는 prod API 8001, engine gateway 9099, cloudflared tunnel 1개만 남기고 dev API와 임시 Vite preview를 내렸다.
다만 이 HTML은 지금까지 Phase 0 상태판처럼 쓰였고, 아래에 Phase 1 이후 전체 계획을 보강했다.
공개 Google OAuth 실제 `/turn` 증명만 storageState 캡처 후 남아 있다. 공개 Google OAuth 실제 `/turn` 증명만 storageState 캡처 후 남아 있다.
</p> </p>
</div> </div>
@ -153,11 +187,75 @@
<div class="metric"><span>Pages Production</span><b>0fe8f3cc</b></div> <div class="metric"><span>Pages Production</span><b>0fe8f3cc</b></div>
<div class="metric"><span>Public API</span><b>prod OK</b></div> <div class="metric"><span>Public API</span><b>prod OK</b></div>
<div class="metric"><span>Backend unittest</span><b>20 OK</b></div> <div class="metric"><span>Backend unittest</span><b>20 OK</b></div>
<div class="metric"><span>App Commit</span><b>543d48c</b></div> <div class="metric"><span>Roadmap</span><b>P0-P3</b></div>
<div class="metric"><span>Decision</span><b>조건부 GO</b></div> <div class="metric"><span>Decision</span><b>P0 조건부</b></div>
</div> </div>
</div> </div>
<section>
<div class="section-head">
<div>
<h2>전체 개발 로드맵</h2>
<p>`docs/MASTERPLAN.md`와 `docs/redteam/MASTERPLAN_REVISIONS.md`를 합친 팀장 판단용 단계표</p>
</div>
</div>
<div class="roadmap">
<article class="phase-card current">
<div class="phase-top"><span class="phase-id">Phase 0</span><span class="tag doing">closing</span></div>
<h3>기반 정렬 / 운영 안전장치</h3>
<p>인프라, 인증 경계, fail-closed, 공개 배포, 회귀 테스트 안정화.</p>
<ul class="phase-list">
<li><b>상태:</b> 대부분 완료, 공개 `/turn` proof만 남음</li>
<li><b>검증:</b> build + backend 20 + Playwright 72</li>
<li><b>운영:</b> prod API 8001, engine 9099, tunnel 1개</li>
</ul>
</article>
<article class="phase-card next">
<div class="phase-top"><span class="phase-id">Phase 1</span><span class="tag doing">next</span></div>
<h3>MVP 코어 루프</h3>
<p>1 페르소나 상담, 실제 턴 저장, 회기말 피드백, 저항 엔진 검증.</p>
<ul class="phase-list">
<li><b>DoD:</b> 로그인 → P1 상담 완주 → 피드백 수신</li>
<li><b>추가:</b> 음성 왕복 1턴 PoC 포함</li>
<li><b>증거:</b> cost/turn DB 적재 + openness 곡선 대조</li>
</ul>
</article>
<article class="phase-card">
<div class="phase-top"><span class="phase-id">Phase 2a</span><span class="tag info">planned</span></div>
<h3>3역할 / OAuth / 페르소나</h3>
<p>학습자, 교수자, 관리자 권한 분리와 페르소나 확장.</p>
<ul class="phase-list">
<li><b>DoD:</b> 타인 session 직접 접근 403</li>
<li><b>범위:</b> OAuth BFF, RBAC, 교수 검수 루프</li>
<li><b>주의:</b> visible_to와 인간 권한은 별도 레이어</li>
</ul>
</article>
<article class="phase-card">
<div class="phase-top"><span class="phase-id">Phase 2b</span><span class="tag info">planned</span></div>
<h3>음성 캐스케이드</h3>
<p>STT → 엔진 → TTS 왕복, WSS/터널 안정성, barge-in 로깅.</p>
<ul class="phase-list">
<li><b>DoD:</b> 50분 WSS 끊김 실측</li>
<li><b>범위:</b> Deepgram STT, OpenAI TTS, voice preset</li>
<li><b>리스크:</b> 실시간 레이턴시는 실측 전 완료 표기 금지</li>
</ul>
</article>
<article class="phase-card">
<div class="phase-top"><span class="phase-id">Phase 3</span><span class="tag info">planned</span></div>
<h3>교육용 파일럿 / 효과성</h3>
<p>수련생 파일럿, 사전사후 효과 측정, 재귀학습 데이터셋 산출.</p>
<ul class="phase-list">
<li><b>DoD:</b> 20명 완주 + KPI 충족</li>
<li><b>측정:</b> SUS, 자기효능감, κ/ICC, 환각률</li>
<li><b>정정:</b> IRB 게이트가 아니라 데이터 활용동의/개인정보 게이트</li>
</ul>
</article>
</div>
<div class="source-note">
정정 기준: `MASTERPLAN` 원본의 IRB 신청/승인 게이트는 `MASTERPLAN_REVISIONS` 기준으로 제거한다. Phase 2는 2a(3역할/OAuth/페르소나)와 2b(음성 캐스케이드)로 분리하고, Phase 1 DoD에는 얇은 음성 왕복 1턴 PoC를 포함한다.
</div>
</section>
<section> <section>
<div class="section-head"> <div class="section-head">
<div> <div>
@ -382,7 +480,7 @@ powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start-public-runtime
<ul class="list"> <ul class="list">
<li>`frontenddesign` 스킬은 현재 세션에 없었다. 다음 세션에서 보이면 먼저 사용하고, 없으면 `docs/DESIGN_CONCEPT.md`를 따른다.</li> <li>`frontenddesign` 스킬은 현재 세션에 없었다. 다음 세션에서 보이면 먼저 사용하고, 없으면 `docs/DESIGN_CONCEPT.md`를 따른다.</li>
<li>학습자 홈과 active session UX는 사용자가 강하게 불만을 말한 영역이다. fake 기록/통계 금지, 0회 기록은 실제 서버 세션 0개 기반 빈 상태로 유지, active session 전체화면/무문서스크롤 유지.</li> <li>학습자 홈과 active session UX는 사용자가 강하게 불만을 말한 영역이다. fake 기록/통계 금지, 0회 기록은 실제 서버 세션 0개 기반 빈 상태로 유지, active session 전체화면/무문서스크롤 유지.</li>
<li>worktree는 원래부터 dirty다. 관련 없는 변경을 되돌리지 말 것.</li> <li>추적 파일 기준 worktree는 깨끗하게 유지한다. `.env`, 로그, `node_modules` 같은 ignored runtime 파일은 운영/개발 상태로만 취급하고 커밋하지 않는다.</li>
<li>OAuth secret은 출력하지 말 것. 실제 secret은 환경 파일/인프라 설정에만 둔다.</li> <li>OAuth secret은 출력하지 말 것. 실제 secret은 환경 파일/인프라 설정에만 둔다.</li>
</ul> </ul>
</section> </section>