diff --git a/.gitignore b/.gitignore
index 68871c972..756e74151 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,11 +7,17 @@ __pycache__/
build/
develop-eggs/
dist/
+# [REV-7] Vite 빌드 산출물은 prebuilt 정책으로 commit 한다 (위 dist/ 규칙의 예외)
+!webui/static/v2/dist/
+!webui/static/v2/dist/**
downloads/
eggs/
.eggs/
lib/
lib64/
+# Python lib/ 규칙의 예외 — Svelte 소스 디렉터리는 commit 한다
+!webui/v2_src/src/lib/
+!webui/v2_src/src/lib/**
parts/
sdist/
var/
@@ -48,16 +54,38 @@ Desktop.ini
*.parquet
*.h5
*.hdf5
+_database/
+finetune_csv/data/stom_*.csv
+finetune_csv/data/stom_*.json
+webui/stom_predictions/*.csv
+webui/stom_predictions/*.json
+webui/stom_predictions/
+webui/qlib_backtests/*.json
+webui/qlib_backtests/*.csv
+webui/rl_runs/
+finetune/qlib_exports/
+finetune/qlib_backtests/
+finetune/outputs/
+finetune/data/processed_datasets/
+finetune/data/stom_qlib*/
+qlib_data/
# Model files (large files)
*.pth
*.pt
*.ckpt
*.bin
+finetune_csv/finetuned/
# Logs
*.log
logs/
+.omx/
+# Local agent/workflow/session state
+.codegraph/
+.gjc/
+.omc/
+.omo/
# Environment
.env
diff --git a/.omc/skill-candidates.md b/.omc/skill-candidates.md
new file mode 100644
index 000000000..801a1a518
--- /dev/null
+++ b/.omc/skill-candidates.md
@@ -0,0 +1,135 @@
+# Kronos v2 — 스킬 후보 (session-wrap 2026-05-18 추출)
+
+본 세션에서 7개 탭에 걸쳐 반복적으로 등장한 패턴들. 추후 `/oh-my-claudecode:skillify` 또는 `/oh-my-claudecode:learner` 로 재사용 스킬로 변환 가능.
+
+---
+
+## P1 · 5단 카드 헤더 패턴
+
+**등장**: 7개 탭 전부, ~20곳 이상
+
+```svelte
+
+
+
+
{ENDPOINT_OR_PHASE}
+
{HUMAN_TITLE}
+
+ {STATUS_LABEL}
+
+
+
+```
+
+5층 계층: card → header → eyebrow(작은 라벨) → title(굵은 제목) → 우측 status pill. 데이터 출처 표기(/api/...)는 eyebrow 에, 사람이 읽는 제목은 title 에, 현재 상태는 pill 에.
+
+---
+
+## P2 · KPI 메트릭 스트립 (.metric × N)
+
+**등장**: Live Training, History, System Health, STOM, Artifacts
+
+```svelte
+
+
+
+ {LABEL}
+ ▼ {pct}%
+
+
{value}{unit}
+
{context_data}
+
+ ...
+
+```
+
+핵심: `tabular-nums` 로 숫자 정렬 + delta 화살표 색상 분기(▼=down=success / ▲=up=danger) + 미니 컨텍스트.
+
+---
+
+## P3 · Status Pill 4-way 분기
+
+**등장**: 모든 탭
+
+```ts
+function statusKind(s: string): 'success' | 'danger' | 'accent' | 'warn' | '' {
+ if (['completed','complete','success','done'].includes(s)) return 'success';
+ if (['failed','error'].includes(s)) return 'danger';
+ if (['running','active'].includes(s)) return 'accent';
+ if (['waiting','pending'].includes(s)) return 'warn';
+ return '';
+}
+```
+
+색상 매핑 단일 owner 함수 → CSS `.pill.success / .danger / .accent / .warn` 와 자동 매칭.
+
+---
+
+## P4 · ECharts theme-aware palette 추출
+
+**등장**: W3, W5, SystemHealth, Forecast
+
+```ts
+let palette = $derived.by(() => {
+ void currentTheme; // ← theme store 의존성 강제 등록
+ if (typeof window === 'undefined') return null;
+ const cs = getComputedStyle(document.documentElement);
+ return {
+ accent: cs.getPropertyValue('--accent').trim(),
+ grid: cs.getPropertyValue('--border-faint').trim(),
+ text: cs.getPropertyValue('--fg').trim(),
+ // ...
+ };
+});
+```
+
+light/dark 전환 시 CSS 변수가 자동으로 바뀌고 `theme` store 구독으로 derived 가 재계산 → ECharts option 이 새 palette 로 setOption 호출됨.
+
+---
+
+## P5 · Svelte 5 stores + subscribe 패턴
+
+**등장**: 모든 컴포넌트
+
+```svelte
+
+```
+
+핵심: `$state + subscribe + $derived` 3단 체인으로 store 데이터를 reactive 하게 사용. App.svelte 가 polling 시작 → stores 갱신 → 모든 컴포넌트가 자동 업데이트.
+
+---
+
+## P6 · data-active 속성 기반 토글
+
+**등장**: Sidebar nav, tabs, seg buttons, file rows
+
+```svelte
+
+```
+
+```css
+.nav-item[data-active="true"] { background: var(--accent-soft); border-color: var(--accent); }
+.tabs button[data-active="true"] { border-bottom: 2px solid var(--accent); color: var(--accent-strong); }
+```
+
+class 분기 대신 data attribute 로 토글 — CSS attribute selector 가 더 가벼우면서 JS 코드 단순화.
+
+---
+
+## 변환 우선순위
+
+가장 가치 큰 순서:
+1. **P1 (5단 카드 헤더)** — 새 탭 추가 시 boilerplate 자동화
+2. **P4 (ECharts palette 추출)** — 다른 차트 라이브러리 도입 시 동일 패턴 재사용
+3. **P3 (Status pill 분기)** — 다른 도메인의 status 표시 통일
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 000000000..5a435f079
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,98 @@
+# Kronos Project Knowledge Base
+
+**Generated:** 2026-06-03 KST
+**Last reviewed:** 2026-06-03 KST, init-deep update mode
+**Branch observed:** `feature/stom-rl-lab`
+**Commit observed:** `943222b`
+
+## Overview
+
+Kronos is now a combined research/operations repo: core Kronos model code, STOM
+1-second/tick data pipelines, rule/RL trading research, and the official Flask +
+Svelte dashboard for inspection. Treat it as an experimental trading research
+platform, not as a live-trading product.
+
+## Current Direction
+
+| Area | Current stance | Reason |
+|---|---|---|
+| `ts_imb` opening gap-up rule | Main research baseline | Prior docs show the strongest useful curve here; it is a RULE strategy, not RL. |
+| Skip-gate / state-exit gates | Deprioritize unless new hypothesis is preregistered | Full-universe docs report `NO-GO`. |
+| Plain PPO/DQN RL | Do not present as usable | Existing PPO/DQN/orderbook runs are `NO-GO` or research-only. |
+| Orderbook RL | Keep as isolated experiment/falsification tool | Useful for testing action design and dashboard comparison, not live readiness. |
+| Dashboard | Continue as evidence viewer | It should expose failure, baselines, costs, and split metadata clearly. |
+
+## Structure
+
+```text
+Kronos/
++-- model/ # Kronos model/tokenizer implementation
++-- finetune/ # STOM/Qlib export, training, evaluation CLIs
++-- stom_rl/ # STOM rule/RL experiments, gates, backtests, readiness
++-- webui/ # Flask API and official dashboard adapters
++-- webui/v2_src/ # Svelte/Vite dashboard source (internal path name)
++-- tests/ # pytest coverage for model, STOM, web, dashboard
++-- docs/ # handoff, verdict, preregistration, result documents
++-- _database/ # local data; do not mutate casually
++-- .omx/artifacts/, webui/rl_runs/ # generated experiment artifacts
+```
+
+## Where To Look
+
+| Task | Location | Notes |
+|---|---|---|
+| RL/orderbook environment | `stom_rl/orderbook_rl_env.py` | Marketable-fill, orderbook feature environment. |
+| SB3 orderbook smoke | `stom_rl/orderbook_sb3_smoke.py` | Research-only DQN/PPO-style experiments. |
+| Gap-up rule baseline | `stom_rl/gap_up_backtest.py` | Main `ts_imb` rule reference. |
+| Skip/state gates | `stom_rl/skip_gate.py`, `stom_rl/state_exit_gate.py` | Existing full-universe `NO-GO` results. |
+| RL dashboard backend | `webui/rl_dashboard.py`, `webui/app.py` | Read-only artifact/API layer. |
+| RL dashboard frontend | `webui/v2_src/src/tabs/RLTradingTab.svelte` | Main RL/trading dashboard tab. |
+| Latest direction docs | `docs/stom_rl_resume_commit_2026-05-29.md`, `docs/stom_state_exit_result_2026-06-02.md` | Re-read before changing strategy direction. |
+
+## Trading Honesty Rules
+
+- Do **not** call the gap-up `ts_imb` curve "reinforcement learning". It is a
+ rule strategy unless a real RL policy produced it.
+- Do **not** claim live-trading readiness, profitability, or broker readiness.
+ Current work is local backtest/research/dashboard evidence only.
+- Primary cost assumption is 23bp round trip unless a test/document explicitly
+ states otherwise.
+- For high-frequency/opening work, prefer marketable-fill accounting where
+ possible (`buy@ask`, `sell@bid`) and label assumptions.
+- Preserve leading-zero stock codes. Never coerce codes like `000250` to int.
+- Treat local Korean DB columns and generated docs as UTF-8-sensitive.
+- Negative/shuffle controls and OOS splits are not optional for alpha claims.
+- If a model fails cost gate, baseline comparison, or drawdown gate, surface
+ `NO-GO` plainly in docs and UI.
+
+## Commands
+
+```powershell
+# Core RL/dashboard regression set
+py -3.11 -m pytest tests/test_stom_rl_dashboard_api.py tests/test_stom_rl_dashboard_tab.py tests/test_stom_rl_orderbook_env.py tests/test_stom_rl_orderbook_sb3.py -q
+
+# Broader STOM rule/gate checks
+py -3.11 -m pytest tests/test_stom_rl_gap_up_backtest.py tests/test_stom_rl_skip_gate.py tests/test_stom_rl_state_exit_gate.py tests/test_stom_rl_marketable_fill.py -q
+
+# Svelte dashboard build/check
+cd webui/v2_src
+npm run build
+```
+
+## Status Hygiene
+
+- Keep source/docs changes separate from generated outputs.
+- Treat `.omc/`, `.codegraph/`, `.omx/artifacts/`, `webui/rl_runs/`, and
+ frontend dist assets as generated/session state unless explicitly requested.
+- If committing later, review untracked files carefully before staging.
+- `webui/v2_src` expects Node 20 or 22 and npm 9+ per `package.json`.
+
+## Gotchas
+
+- `webui/rl_runs/`, `.omx/artifacts/`, `finetune/outputs/`, and large CSV/DB
+ directories are generated data. Use them as evidence; do not design from one
+ cherry-picked artifact.
+- `webui/v2_src` is a separate frontend project with its own package scripts.
+- `webui/app.py` is broad and central; API changes need targeted tests.
+- Existing docs intentionally use `NO-GO` heavily. Treat those as guardrails,
+ not as failure to hide.
diff --git a/DESIGN.md b/DESIGN.md
new file mode 100644
index 000000000..b6bf87328
--- /dev/null
+++ b/DESIGN.md
@@ -0,0 +1,134 @@
+# Design
+
+## Source of truth
+- Status: Active
+- Last refreshed: 2026-05-20
+- Primary product surfaces:
+ - `http://127.0.0.1:5070/`
+ - `http://127.0.0.1:5070/training`
+ - STOM/Kronos 학습 상태, GPU 상태, 예측/실제값 비교, 데이터 진단 대시보드
+- Evidence reviewed:
+ - `webui/v2_src/src/styles/core.css`
+ - `webui/v2_src/src/styles/components.css`
+ - `webui/v2_src/src/tabs/LiveTrainingTab.svelte`
+ - `webui/v2_src/src/tabs/StomDiagnosticsTab.svelte`
+ - `webui/v2_src/src/layout/HeroStrip.svelte`
+ - `webui/training_monitor.py`
+ - `finetune/qlib_exports/stom_1s_grid_pred60_2025/stom_qlib_export_report.json`
+
+## Brand
+- Personality: 차분하고 신뢰 가능한 ML 운영 도구, 숫자 중심이지만 비전문가도 빠르게 이해할 수 있는 설명형 대시보드.
+- Trust signals: 실제 데이터 범위, 학습 단계, ETA, GPU, checkpoint, 검증 지표를 숨기지 않고 카드와 표로 노출.
+- Avoid: 과장된 수익 표현, “정확도 보장” 같은 단정, 맥락 없는 원시 로그만 던지는 화면, 페이지마다 다른 색/간격/타이포그래피.
+
+## Product goals
+- Goals:
+ - STOM tick/1초봉 데이터를 Kronos 파인튜닝에 어떤 범위로 사용 중인지 즉시 확인.
+ - 장시간 학습 중 현재 단계, 속도, ETA, GPU, 손실 추이를 웹에서 계속 감시.
+ - 학습 완료 후 실제값과 예측값을 종목/전체 통계로 비교할 수 있는 흐름을 유지.
+- Non-goals:
+ - 실거래 자동 주문 판단을 대시보드가 단독으로 보장하지 않는다.
+ - 모델 성능을 검증하지 않은 상태에서 투자 의사결정으로 직접 연결하지 않는다.
+- Success signals:
+ - 사용자가 “지금 무엇을 학습 중인지”, “얼마나 남았는지”, “어떤 데이터 범위인지”를 10초 안에 이해.
+ - 모든 주요 수치는 API 근거와 로그 근거로 재현 가능.
+
+## Personas and jobs
+- Primary personas:
+ - STOM/Kronos 학습을 운영하는 개발자/트레이더.
+ - 장시간 GPU 학습을 감시하고 중간 실패를 빠르게 파악해야 하는 사용자.
+- User jobs:
+ - 데이터 범위와 feature가 의도한 전체 STOM tick 학습과 일치하는지 확인.
+ - tokenizer/predictor 진행률, ETA, checkpoint 준비 상태를 추적.
+ - 학습 완료 후 예측 품질을 그래프와 통계로 검증.
+- Key contexts of use:
+ - 로컬 워크스테이션 RTX 4080 SUPER/Threadripper 환경.
+ - 장시간 학습 중 브라우저와 Codex 대화에서 병행 모니터링.
+
+## Information architecture
+- Primary navigation: 좌측 사이드바 중심의 탭형 구조.
+- Core routes/screens:
+ - `/`: 개요/홈.
+ - `/training`: 실시간 학습 대시보드.
+ - STOM 진단/예측 비교 관련 탭: 데이터 품질, 예측 결과, 통계 요약.
+- Content hierarchy:
+ 1. 현재 학습 상태와 핵심 지표.
+ 2. 학습 데이터 범위/feature/분할 정보.
+ 3. 손실 곡선, 변동성, ETA, GPU, 로그.
+ 4. 학습 완료 후 예측-실제 비교와 종목별 통계.
+
+## Design principles
+- Principle 1: “근거 먼저” — 각 수치가 어떤 run/report/log에서 나온 것인지 숨기지 않는다.
+- Principle 2: “장시간 감시 친화” — 새로고침과 상태 변화가 눈에 잘 보이되 시끄럽지 않게 표현한다.
+- Principle 3: “한글 우선, 약어 보조” — 사용자가 보는 UI는 한글 설명을 우선하고, step/GPU/ETA 같은 약어는 보조로 유지한다.
+- Tradeoffs:
+ - 원시 정보량이 많으므로 첫 화면은 요약 카드, 상세는 표/칩/로그로 분리한다.
+ - 모델 성능은 방향성/검증 지표로 표현하고 투자 판단 단정은 피한다.
+
+## Visual language
+- Color: 기존 토큰을 그대로 사용한다. 메인 포인트는 민트/틸 `--accent`, 주의/보완 설명은 warm/warn 계열.
+- Typography: Pretendard + Malgun Gothic fallback, 숫자는 JetBrains Mono/D2Coding과 tabular number 사용.
+- Spacing/layout rhythm: 16px 카드 간격, 20px 카드 padding, 큰 화면은 4열/3:1 grid, 작은 화면은 1열로 축소.
+- Shape/radius/elevation: `--r-lg`, `--r-pill`, `--shadow-glow`, `--border` 기반의 부드러운 카드.
+- Motion: 실시간 상태는 pulse/soft transition만 사용, 장시간 감시 화면에서 과한 애니메이션 금지.
+- Imagery/iconography: 추가 이미지보다 badge, dot, chip, sparkline, chart로 설명.
+
+## Components
+- Existing components to reuse:
+ - `.card`, `.metric`, `.pill`, `.text-eyebrow`, `.text-caption`, `.text-mono`, `.tnum`
+ - `W3LossCurve`, `W4EtaTimeline`, `W5GpuSparkline`, `W6LossVolatility`, `W9LogTail`
+- New/changed components:
+ - `/training` 상단 데이터 범위 요약 카드: STOM 2025, 1초봉, 09:00~09:30, lookback/pred, split, feature를 표시.
+- Variants and states:
+ - 데이터 요약 사용 가능: accent 카드.
+ - report 미탐지/불완전: warn pill과 간단한 안내.
+ - 진행 중: live badge와 ETA/step 유지.
+- Token/component ownership:
+ - 전역 토큰은 `core.css`, 공통 컴포넌트 스타일은 `components.css`.
+ - 탭 단위 특수 레이아웃은 해당 Svelte 파일의 scoped style에 둔다.
+
+## Accessibility
+- Target standard: WCAG 2.1 AA 수준의 대비와 키보드 포커스 유지.
+- Keyboard/focus behavior: 탭/버튼은 `:focus-visible`을 유지하고 포커스 outline을 제거하지 않는다.
+- Contrast/readability: dark/light theme 모두 `--fg`, `--muted`, `--accent` 토큰만 사용.
+- Screen-reader semantics: section, table, header, caption성 텍스트를 의미 있게 사용.
+- Reduced motion and sensory considerations: 핵심 정보 이해가 animation에 의존하지 않도록 한다.
+
+## Responsive behavior
+- Supported breakpoints/devices: 데스크톱 우선, 1200px 이하 2열, 720px/560px 이하 1열.
+- Layout adaptations: 요약 카드는 grid에서 stack으로 자연스럽게 변경.
+- Touch/hover differences: hover에만 의존하지 않고 모든 상태를 텍스트/색/숫자로 함께 표시.
+
+## Interaction states
+- Loading: 수치가 없을 때 `-` 또는 “확인 중”으로 표시.
+- Empty: report/API 없음은 경고 카드로 원인과 다음 확인 항목 표시.
+- Error: 원시 오류 대신 “데이터 요약을 읽지 못했습니다” + path/근거 일부 표시.
+- Success: checkpoint/데이터 요약/실시간 상태는 success 또는 accent pill 사용.
+- Disabled: 실행 불가 버튼은 낮은 대비와 설명 텍스트를 함께 제공.
+- Offline/slow network, if applicable: 마지막 갱신 시각과 seconds since update를 함께 표시.
+
+## Content voice
+- Tone: 짧고 직접적인 한국어, 중요한 숫자는 표기 단위를 붙인다.
+- Terminology:
+ - “전체 진행률”은 tokenizer+predictor 전체 run 기준.
+ - “단계 진행률”은 현재 tokenizer 또는 predictor 내부 기준.
+ - “samples”는 sliding window 학습 샘플 수.
+ - “rows”는 1초봉으로 정규화된 행 수.
+- Microcopy rules:
+ - 예측 성능은 “검증 필요”, “비교 가능”, “개선 후보”처럼 보수적으로 표현.
+ - 사용자가 혼동한 용어는 한글 설명과 영문 약어를 병기.
+
+## Implementation constraints
+- Framework/styling system: Svelte 5 + Vite + repo CSS design tokens.
+- Design-token constraints: 새 색상/새 폰트/새 디자인 시스템을 추가하지 않는다.
+- Performance constraints: `/training`은 주기 갱신되므로 API 응답은 요약만 반환하고 대형 report 원문은 보내지 않는다.
+- Compatibility constraints: Windows 로컬 경로, 한국 시간 표시, 장시간 학습 중 웹 재시작 가능성을 고려.
+- Test/screenshot expectations:
+ - `npm run build`
+ - `python -m py_compile webui/training_monitor.py`
+ - `/api/training/status`와 `/training` HTTP 200 확인
+ - 가능하면 브라우저에서 `/training` 직접 확인
+
+## Open questions
+- [ ] 학습 완료 후 예측-실제 비교 대시보드에서 기본 정렬 기준을 loss/방향정확도/종목별 MAE 중 무엇으로 둘지 결정 필요.
+- [ ] 1초봉 pred30/pred60/pred120 비교를 같은 화면에서 토글할지, 별도 실험 페이지로 분리할지 결정 필요.
diff --git a/docs/AGENTS.md b/docs/AGENTS.md
new file mode 100644
index 000000000..d9041c69c
--- /dev/null
+++ b/docs/AGENTS.md
@@ -0,0 +1,32 @@
+# docs Knowledge
+
+## Overview
+
+`docs/` is the decision ledger for STOM/Kronos research. Handoffs, preregistration
+notes, result reports, and verdicts here are evidence artifacts, not marketing.
+
+## Rules
+
+- Preserve exact dates, commands, costs, splits, and verdict labels.
+- Use `RULE`, `supervised gate`, `RL experiment`, and `baseline` precisely.
+- Do not rewrite a prior `NO-GO` into a softer conclusion without new evidence.
+- If a document reports a trading result, include the cost assumption and whether
+ it is in-sample, OOS, smoke, full-universe, or paper/read-only.
+- Prefer a new dated result document over mutating an old verdict document.
+- Mark generated/session files separately from durable project documents.
+
+## Where To Look
+
+| Need | Document type |
+|---|---|
+| Resume context | `*_resume_*`, `*_handoff_*` |
+| Pre-registered hypothesis | `*_prereg_*` |
+| Final experimental result | `*_result_*`, `*_verdict_*`, `*_candidate_*` |
+| Current direction | `stom_development_direction_review_2026-06-03.md` |
+
+## Anti-Patterns
+
+- Calling a rule backtest an RL result.
+- Reporting a favorable curve without baseline/no-trade/cost context.
+- Treating dashboard visuals as proof of profitability.
+- Editing old result docs to hide failed experiments.
diff --git a/docs/ai_handoff_retrain_option_d_2026-05-19.md b/docs/ai_handoff_retrain_option_d_2026-05-19.md
new file mode 100644
index 000000000..b450ca26c
--- /dev/null
+++ b/docs/ai_handoff_retrain_option_d_2026-05-19.md
@@ -0,0 +1,327 @@
+# AI 핸드오프 — STOM tokenizer 재학습 (옵션 D) + 대시보드 모니터링
+
+> **이 문서 하나로 다른 AI 세션이 사용자의 재학습 작업을 그대로 이어받아 진행할 수 있다.** 코드 변경, 변수 선정 근거, 명령어, 예상 시간, 위험 대응, 다음 단계까지 단일 파일에 정리됨.
+
+**작성일**: 2026-05-19 KST
+**작성자**: Claude (이전 세션)
+**상태**: 코드/대시보드 준비 완료, **사용자가 학습 명령 실행 직전**
+**대상 AI**: 이 문서를 받은 다음 Claude 세션
+**프로젝트**: `D:\Chanil_Park\Project\Programming\Kronos`
+
+---
+
+## 0. 30초 컨텍스트
+
+- **무엇을 하나**: validation OOM 으로 실패한 STOM tokenizer 학습을 옵션 D (풀 최대 활용) 변수로 재시작하고, v2 대시보드에서 실시간 모니터링.
+- **왜**: 이전 학습 99.98% (step 4.7M 거의 끝) 에서 validation forward OOM → checkpoint 0개 → predictor 미시작 → STOM 예측 진단/Forecast 워크벤치 검증 불가.
+- **무엇이 준비됐나**: finetune 코드에 AMP/torch.compile/persistent_workers opt-in flag 추가 (commit `dc7315a`), W9 로그 tail 위젯 추가 (commit `0563734`).
+- **남은 1단계**: 사용자가 §4 명령어를 별도 PowerShell 콘솔에 붙여넣고 실행. 보정된 명령은 이전 실패 run 과 동일한 `n-train-iter=18806883`, `n-val-iter=3925397` 및 predictor 고속 설정을 포함한다. 옵션 D 성공 시 6~12시간 목표, 보수적으로 8~16시간 후 학습 종료 예상.
+
+---
+
+## 1. 시스템 사양 (실측 — 변수 선정 근거)
+
+| 자원 | 값 |
+|---|---|
+| **CPU** | AMD Ryzen Threadripper 3990X · 32 cores / 64 logical threads |
+| **GPU** | NVIDIA RTX 4080 SUPER · 16 GiB VRAM (free 12.4 GiB) · driver 591.86 |
+| **System RAM** | 273 GB |
+| **PyTorch** | 2.9.0 + CUDA 12.8 |
+| **GPU arch** | Ada Lovelace (sm_89) — bf16 native 지원 |
+| **OS** | Windows 11 |
+| **Python** | C:\Python\64\Python3119\python.exe (3.11.13) |
+| **Disk D:** | 1.9 TB / 528 GB free |
+
+---
+
+## 2. 이전 실패 진단
+
+| 항목 | 값 |
+|---|---|
+| 실패 commit | `7742cb8` — "장시간 tokenizer 학습 결과를 validation OOM 전에 보존하다" |
+| 마지막 step | **4,701,000 / 4,701,721** = 99.98% (train loop 거의 완료) |
+| OOM 위치 | `finetune/train_tokenizer.py:196` rotary attention forward (validation 진입 직전 또는 직후) |
+| 학습 시간 | 약 83시간 (2026-05-11 04:43 → 2026-05-14 15:39) |
+| 체크포인트 | **0개** (pre_validation_checkpoint 코드는 line 201 에 있으나 OOM 이 그 전에 발생) |
+| 안전 옵션 추가 | commit `7742cb8` 에서 `--tokenizer-val-batch-size`, `latest_train_model` 자동 저장, CUDA cache 정리, validation_failure.json 기록 |
+
+---
+
+## 3. 본 세션에서 추가된 작업
+
+### 3.1 finetune 코드 — 옵션 C/D opt-in flag 도입 (commit `dc7315a`)
+
+`finetune/config.py` 신규 attribute 5종 + KRONOS_* 환경변수 5종:
+- `persistent_workers` / `prefetch_factor`
+- `tokenizer_enable_amp` / `tokenizer_amp_dtype` (bf16/fp16/fp32)
+- `tokenizer_enable_compile` / `tokenizer_compile_mode` / `tokenizer_compile_fullgraph`
+
+`finetune/train_tokenizer.py` 적용:
+- DataLoader 에 `persistent_workers`/`prefetch_factor` (num_workers > 0 일 때만)
+- `autocast_ctx()` 컨텍스트 매니저 (AMP 비활성 시 nullcontext)
+- train forward + loss 를 autocast 로 래핑
+- GradScaler (fp16 일 때만 — bf16 은 불필요)
+- validation forward 도 autocast 로 래핑
+- 모델 생성 직후 `torch.compile()` 적용 (try/except 로 실패 시 eager fallback)
+
+`finetune/run_stom_1s_finetune.py` CLI args 7종 추가:
+- `--persistent-workers` / `--prefetch-factor`
+- `--tokenizer-amp` / `--tokenizer-amp-dtype`
+- `--tokenizer-compile` / `--tokenizer-compile-mode` / `--tokenizer-compile-fullgraph`
+- 옵션 활성 시 자동 env 전파 (KRONOS_* 환경변수)
+
+**모든 옵션은 opt-in (default False) — 기존 학습 명령은 영향 없음.**
+
+### 3.2 대시보드 — W9 로그 tail 위젯 (commit `0563734`)
+
+`webui/v2_src/src/widgets/W9_LogTail.svelte` 신규:
+- `/api/training/logs?stage=<>&lines=N` 폴링 (10초 주기)
+- 색상 분기: **Loss=시안**, **LR=주황**, **sps/checkpoint=초록**, **step=흰**, **compile=시안진**, **AMP=초록**, **error/OOM=빨강**
+- 10/20/50 tail 토글
+- Live Training 탭 하단 (W5 GPU 다음) 자동 노출
+- 신규 API endpoint 0건 (기존 `/api/training/logs` 활용)
+
+### 3.3 테스트 갱신
+`tests/test_training_monitor.py` P6 cutover 경로 갱신 (`/training` → `/v1/training`).
+
+### 3.4 runbook 갱신
+`docs/retrain_stom_1s_grid_pred60_2025_full_small.md` §2.1 옵션 D 명령어 + §2.1a 대시보드 검증 흐름 + §2.1b 폴백 옵션 추가.
+
+---
+
+## 4. 학습 시작 명령 (사용자가 별도 PowerShell 콘솔에 붙여넣기)
+
+```powershell
+cd D:\Chanil_Park\Project\Programming\Kronos
+
+# 1. 실패 run archive (기존 logs 보존)
+Rename-Item -Path 'finetune\outputs\stom_1s_grid_pred60_2025_full_small' -NewName 'stom_1s_grid_pred60_2025_full_small_failed_OOM_20260514'
+
+# 2. validation OOM 회피 (필수)
+$env:KRONOS_TOKENIZER_VAL_BATCH_SIZE = "1"
+
+# 3. 옵션 D 풀 최대 활용 학습 시작
+C:\Python\64\Python3119\python.exe finetune\run_stom_1s_finetune.py `
+ --horizon 60 --mode full --train-stage both `
+ --dataset-dir finetune\qlib_exports\stom_1s_grid_pred60_2025\processed_datasets `
+ --output-root finetune\outputs `
+ --run-name stom_1s_grid_pred60_2025_full_small `
+ --dataset-sample-mode full_sequential `
+ --n-train-iter 18806883 `
+ --n-val-iter 3925397 `
+ --tokenizer-batch-size 64 `
+ --tokenizer-val-batch-size 1 `
+ --predictor-batch-size 16 `
+ --predictor-num-workers 2 `
+ --epochs 1 `
+ --num-workers 12 `
+ --persistent-workers `
+ --prefetch-factor 6 `
+ --tokenizer-amp `
+ --tokenizer-amp-dtype bf16 `
+ --tokenizer-compile `
+ --tokenizer-compile-mode max-autotune
+```
+
+### 4.1 변수 선정 근거
+
+| 변수 | 값 | 근거 |
+|---|---:|---|
+| `--tokenizer-batch-size` | **64** | AMP bf16 으로 VRAM ~12 GiB (4 GiB 안전 마진) |
+| `--num-workers` | **12** | 64-core 중 19% 활용 — 데이터 로딩 충분 |
+| `--prefetch-factor` | **6** | RAM 273 GB 이라 부담 0 |
+| `--persistent-workers` | ✅ | DataLoader 재초기화 비용 ↓ |
+| `--tokenizer-amp-dtype` | **bf16** | 4080 SUPER native + GradScaler 불필요 |
+| `--tokenizer-compile-mode` | **max-autotune** | 6~12시간 목표 학습이라 컴파일 오버헤드 (~120s) ROI 충분 |
+| `--tokenizer-val-batch-size` | **1** | validation OOM 회피 (env 강제) |
+
+---
+
+## 5. 예상 타임라인 (옵션 D)
+
+| 구간 | 시간 | 누적 |
+|---|---:|---:|
+| 명령 실행 → 첫 step 진입 | ~30s | 30s |
+| **torch.compile max-autotune 1st epoch** | ~60~180s | ~3분 |
+| tokenizer train loop (약 294k step, batch 64, train 18,806,883 samples) | ~5~10h | ~5~10h |
+| tokenizer validation (batch=1, val 3,925,397 samples) | ~30~120min | ~6~12h |
+| predictor train loop | ~1~4h (batch 16 + num_workers 2) | ~7~16h |
+| predictor validation | ~10~30min | ~7~16h |
+| **총 예상** | | **6~12h 목표 / 8~16h 보수** |
+
+기존 83h 대비 **약 5~14x faster 목표**. 실제 ETA는 첫 5~10분 sps 실측으로 재계산한다.
+
+---
+
+## 6. 대시보드 모니터링 흐름
+
+### 6.1 학습 시작 직후 즉시 확인 (브라우저)
+
+`http://127.0.0.1:5070/` → 좌측 NAV "실시간 학습" 탭 → 하단으로 스크롤 → **W9 학습 로그 tail** 카드:
+
+| 시점 | 보이는 줄 (색상) |
+|---|---|
+| 1분 | `[Rank 0] BATCHSIZE (per GPU): 64` |
+| 1분 | `[Rank 0] AMP enabled — dtype=bf16 scaler=False` (초록) |
+| 1분 | `[Rank 0] torch.compile enabled — mode=max-autotune fullgraph=False` (시안) |
+| 3분 후 | `[Rank 0, Epoch 1/1, Step N/294000] LR 0.00X (주황), Loss: -0.XX (시안)` |
+| 학습 중 | `samples/s=500~700 (초록)` |
+| OOM 발생 시 | `out of memory / Traceback (빨강 강조)` |
+| checkpoint 저장 시 | `checkpoint saved / pre-validation epoch 1 (초록)` |
+
+### 6.2 옵션 D 작동 신호 — 메트릭 카드
+
+- **현재 손실**: 시안 색상 (정상)
+- **학습 속도**: **500~700 samples/s** (이전 옵션 C 의 5배+, 기존 batch 4 의 10배+)
+- **학습률 (LR)**: 주황 색상, scheduled
+- **현재 Epoch**: 1/1
+
+### 6.3 GPU 트렌드 (W5)
+- util 90%+ 도달 → 자원 풀가동 신호
+- VRAM ~12 GiB / 16 GiB ~ 75% → 옵션 D batch 64 정상
+- 온도 ~60~70°C (학습 부하 적정)
+
+### 6.4 ETA (W2/W4)
+- 학습 시작 5~10분 후 **6~12시간 목표 / 8~16시간 보수** 범위 표시 → 옵션 D 작동
+- KST 완료 예상 시각 자동 표시
+
+---
+
+## 7. 위험 + 대응
+
+| 위험 | 신호 | 대응 |
+|---|---|---|
+| batch 64 → train OOM | W9 에 빨간 `out of memory` | 즉시 학습 중단 → §7.1 옵션 폴백 |
+| torch.compile max-autotune 실패 | W9 에 주황 `torch.compile failed` | 자동 eager fallback (학습 계속) — 또는 §7.2 |
+| compile 컴파일 너무 오래 (~5분+) | W9 에 step 증가 안 함 | `--tokenizer-compile-mode reduce-overhead` 로 변경 |
+| validation OOM 재발 | tokenizer.stdout.log 에 OOM | pre_validation `latest_train_model` weights 자동 보존됨 — 별도 PR 로 복구 |
+| GPU 다른 프로세스 점유 | nvidia-smi 에 다른 PID | 해당 프로세스 종료 후 재시작 |
+
+### 7.1 옵션 D OOM 시 폴백 (runbook §2.1b)
+```powershell
+# 옵션 B 수준 (안전)
+... --tokenizer-batch-size 16 --num-workers 4 --persistent-workers --tokenizer-amp --tokenizer-amp-dtype bf16
+# torch.compile 제거, batch 4분의 1
+```
+
+### 7.2 max-autotune 실패 시
+```powershell
+... --tokenizer-compile-mode reduce-overhead # max-autotune → reduce-overhead
+```
+
+---
+
+## 8. 학습 종료 후 다음 단계
+
+학습이 성공적으로 끝나면 (`/api/training/status` 가 `status=completed` + `readiness.predictor_complete=true`):
+
+1. **v2 대시보드 자동 갱신** — 모든 탭이 새 predictor 데이터로 채워짐
+2. **예측 워크벤치 탭** — 새 모델로 실제 예측 실행 가능
+3. **예측 진단 (STOM) 탭** — 새 prediction CSV 가 file 목록에 자동 노출
+4. **아티팩트 & 모델 탭** — checkpoint/weight 카운트 정상 표시
+5. **P5 정식 quality gate** — Lighthouse a11y/perf 측정 (docs/session-wrap-followups-2026-05-18.md §2 참조)
+
+---
+
+## 9. 핵심 commit 추적 (시간순)
+
+| Commit | 설명 |
+|---|---|
+| `7742cb8` | 이전 OOM 실패 + 안전 옵션 추가 (--tokenizer-val-batch-size 등) |
+| `908766c` | 재학습 runbook 정식 docs 고정 |
+| `dc7315a` | tokenizer 재학습 풀 최적화 — torch.compile + bf16 AMP + persistent workers 옵션 도입 |
+| `0563734` | **옵션 D 풀 활용 + W9 로그 tail 카드로 대시보드 가시성 완성** ← 본 세션 핵심 |
+
+---
+
+## 10. 다른 AI 가 작업 이어가기 (재진입 절차)
+
+### 10.1 새 AI 세션 시작 시 첫 명령
+
+```powershell
+# 1. 본 핸드오프 문서 읽기 (필수)
+# (Read tool 사용)
+# D:\Chanil_Park\Project\Programming\Kronos\docs\ai_handoff_retrain_option_d_2026-05-19.md
+
+# 2. git 히스토리 확인 — 본 세션 마지막 commit 도달했는지
+cd D:\Chanil_Park\Project\Programming\Kronos
+git log --oneline -5
+# 마지막 commit 이 0563734 (옵션 D + W9) 인지 확인
+
+# 3. 작업 디렉터리 클린 상태 확인
+git status --short
+
+# 4. 학습 진행 상태 확인 (Flask 가 떠있는지)
+curl -s -o NUL -w "HTTP=%{http_code}\n" http://127.0.0.1:5070/
+
+# 5. Flask 가 죽었으면 재시작
+$env:KRONOS_WEBUI_PORT = "5070"
+$env:KRONOS_WEBUI_OPEN_BROWSER = "0"
+$env:KRONOS_V2_DIST = "1"
+C:\Python\64\Python3119\python.exe webui\run.py
+# (별도 콘솔에서 실행 — 백그라운드 유지)
+
+# 6. 학습 진행 상태 (API 직접 호출)
+curl -s http://127.0.0.1:5070/api/training/status | python -m json.tool
+```
+
+### 10.2 학습이 아직 시작 안 됐다면
+
+본 문서 §4 명령어를 사용자에게 안내. 사용자가 별도 PowerShell 콘솔에 붙여넣고 실행.
+
+### 10.3 학습이 진행 중이라면
+
+- W9 로그 tail 카드 확인 → AMP/compile 활성 정상인지 검증
+- 메트릭 카드의 sps 가 500+ 인지 확인 → 옵션 D 작동 신호
+- ETA 6~12시간 목표 또는 8~16시간 보수 범위 표시 확인
+- 사용자에게 진행률 보고
+
+### 10.4 학습이 실패했다면 (OOM 등)
+
+- `finetune/outputs/stom_1s_grid_pred60_2025_full_small/logs/tokenizer.stdout.log` tail 확인
+- §7.1 옵션 B 폴백 명령 제시 (batch 16, no compile)
+- 또는 §7.2 compile mode reduce-overhead 변경
+
+### 10.5 학습이 성공했다면
+
+- §8 다음 단계 진행 (예측 워크벤치 검증 → STOM 진단 → P5 quality gate)
+- 별도 PR 로 P3.5 (Forecast Candlestick), P4.5 (STOM Plotly heatmap) 진행 — `docs/session-wrap-followups-2026-05-18.md` 참조
+
+---
+
+## 11. 주요 참조 문서 색인
+
+| 파일 | 용도 |
+|---|---|
+| `docs/ai_handoff_retrain_option_d_2026-05-19.md` | **본 문서** (AI 핸드오프) |
+| `docs/retrain_stom_1s_grid_pred60_2025_full_small.md` | 재학습 runbook (옵션 D 명령 + 모니터링 + 폴백) |
+| `docs/claude_designer_handoff.md` | v2 SPA 디자이너 핸드오프 (전체 8 탭 구조) |
+| `docs/kronos_dashboard_overhaul_plan.md` | P0~P6 ralplan 합의 마스터 플랜 |
+| `docs/session-wrap-followups-2026-05-18.md` | 11개 후속 작업 우선순위 |
+| `.omc/skill-candidates.md` | 6 재사용 패턴 (skillify 후보) |
+| `webui/v2_src/README.md` | v2 SPA 빌드/배포/디렉터리 |
+
+---
+
+## 12. 절대 금지 사항 (Hard Constraints)
+
+| 영역 | 이유 |
+|---|---|
+| `webui/app.py` 의 `/api/*` 엔드포인트 수정 | 모든 v2 탭 + v1 화면이 공유 |
+| `webui/templates/{index,training_dashboard,stom_dashboard}.html` | v1 archive (6개월 보존) |
+| `finetune/` 외 학습 코드, `_database/` | 데이터/모델 무결성 |
+| 신규 `/api/*` endpoint 추가 | 기존 24 개만 사용 |
+| predictor 미완료 상태에서 정확도/수익률 ready 표시 | readiness gate 정책 |
+| KRONOS_TOKENIZER_VAL_BATCH_SIZE=1 해제 | validation OOM 회피 정책 (commit 7742cb8 Directive) |
+
+---
+
+## 13. 한 줄 미션 (다음 AI 에게)
+
+> **"사용자가 §4 명령으로 옵션 D 학습을 시작했는지 확인하고, W9 로그 tail + 메트릭 카드의 sps/ETA 로 옵션 D 작동을 검증한 뒤, 6~12시간 목표 또는 보수 8~16시간 후 학습이 끝나면 §8 다음 단계 (예측 검증 + STOM 진단 + P5 gate) 로 자연스럽게 이어가라. OOM/compile 실패 시 §7 폴백 명령 제시."**
+
+---
+
+*작성: Claude (현 세션, 2026-05-19 KST)*
+*다음 세션은 본 문서를 first read 로 진입할 것*
+*세션 종료 후에도 본 문서 + commit 히스토리만 살아있으면 작업 100% 복원 가능*
diff --git a/docs/claude_designer_handoff.md b/docs/claude_designer_handoff.md
new file mode 100644
index 000000000..1586af78a
--- /dev/null
+++ b/docs/claude_designer_handoff.md
@@ -0,0 +1,231 @@
+# Kronos 통합 대시보드 — Claude Designer 리모델링 핸드오프
+
+> **이 문서 하나로 Claude `frontend-design` 스킬이 전체 대시보드를 시각적으로 리모델링할 수 있도록 작성한 단일 핸드오프 파일이다. 기존 도메인 기능과 API는 그대로 두고 UI 표현 계층만 재구성한다.**
+
+**작성일**: 2026-05-16 KST · **마지막 갱신**: 2026-05-18 KST (Designer 프로토타입 통합 + P6 cutover 반영)
+**대상 스킬**: `document-skills:frontend-design`
+**핸드오프 범위**: webui v2 SPA (`/`) 전체 시각 리모델링 + 미구현 탭(P2~P6) 디자인 사양 포함
+**대상 디렉터리**: `D:\Chanil_Park\Project\Programming\Kronos\webui\v2_src\src\`
+**금지 디렉터리**: `D:\Chanil_Park\Project\Programming\Kronos\webui\app.py`, `finetune/`, `model/`, `_database/` (백엔드/모델 무변경)
+
+---
+
+## 0. 최종 상태 (2026-05-18)
+
+| Phase | 상태 | Commit |
+|---|---|---|
+| P0 합의 계획 | ✅ 완료 | 5c46ccd |
+| P1 SSR Jinja shell | ✅ 완료 | 888bb08 |
+| P1.5 Vite+Svelte 빌드 인프라 | ✅ 완료 | 2695151 |
+| 디자인 시스템 v2 (light+dark, mint accent) | ✅ 완료 | ce42ab4 |
+| Live Training 탭 리디자인 | ✅ 완료 | a631b54 |
+| Artifacts/SystemHealth/Settings/History 탭 | ✅ 완료 | 7ff0d71 ~ 8f1beb4 |
+| Forecast Workbench (P3) | ✅ 완료 | 7e38c18 |
+| STOM Diagnostics (P4) | ✅ 완료 | 98d66d2 |
+| **P6 Cutover** — `/` = v2, `/v1/*` archive, `/v2` → 301 | ✅ 완료 | **8562c64** |
+| P5 Lighthouse a11y/perf gate | ⏸ 미진행 | - |
+
+**핵심 결과**:
+- 사용자는 이제 `http://127.0.0.1:5070/` 로 진입하면 새 통합 대시보드를 본다
+- 기존 화면 3개 (`/`, `/training`, `/stom`) 는 `/v1/*` 로 archive (6개월 후 삭제 판단)
+- `/v2` 북마크는 `/` 로 영구 리다이렉트 (301)
+- 7개 탭 모두 정식 기능 작동 (placeholder 0개)
+
+---
+
+## 1. TL;DR (3문장 요약)
+
+1. **무엇이 있는가**: Flask + 7 탭 v2 SPA (`/`) + 5개 legacy 라우트 (`/v1/*`) + 24개 read-only API. Svelte 5 + Vite 5 + Tailwind prebuilt + ECharts + Pretendard Variable + JetBrains Mono. light+dark 토글.
+2. **무엇이 더 필요한가**: P5 Lighthouse 정식 측정 + a11y 검증 + 잔여 폴리시 (Candlestick / Plotly heatmap / top-k 카드 / CSV 다운로드).
+3. **무엇을 건드리면 안 되는가**: Flask `app.py` 의 `/api/*`, 학습 코드, DB, finetune outputs, readiness gate 정책.
+
+---
+
+## 2. 프로젝트 컨텍스트
+
+### 2.1 Kronos
+- **도메인**: K-line(캔들차트) 시계열 예측 모델 (금융 시장 데이터)
+- **모델**: 2단계 학습 — Tokenizer → Predictor
+- **데이터**: STOM (Securities Time-series Open Market), pred60
+- **사용자**: 단일 ML 엔지니어 (Windows 11, RTX 4080 SUPER, Python 3.11.13)
+
+### 2.2 학습 현황
+- 마지막 run `stom_1s_grid_pred60_2025_full_small`: tokenizer ~75% 에서 validation OOM 으로 실패
+- predictor 미진입 → checkpoint 0개 → readiness gate `waiting`
+- 재학습 시 OOM 원인 수정 필요 (batch size 축소 등) — 별도 PR
+
+---
+
+## 3. 라우트 맵 (P6 cutover 이후)
+
+| URL | 핸들러 | 대상 | 비고 |
+|---|---|---|---|
+| **`/`** | `webui/v2/__init__.py::v2_root` | v2 SPA (dist 모드: `webui/static/v2/dist/index.html`, fallback: `webui/templates/v2_shell.html`) | **신 통합 대시보드** |
+| **`/v1/`** | `webui/app.py::v1_index` | `templates/index.html` | v1 메인 예측 화면 (legacy) |
+| **`/v1/training`** | `webui/app.py::v1_training_dashboard_page` | `templates/training_dashboard.html` | v1 학습 모니터 |
+| **`/v1/stom`** | `webui/app.py::v1_stom_dashboard_page` | `templates/stom_dashboard.html` | v1 STOM 진단 |
+| `/v2` | `webui/v2/__init__.py::v2_legacy_redirect` | 301 → `/` | 호환 |
+| `/v2/` | `webui/v2/__init__.py::v2_legacy_subpath` | 301 → `/` | 호환 |
+| `/api/*` | 변경 없음 | `webui/app.py` | 24개 read-only endpoint |
+
+---
+
+## 4. v2 SPA 탭 (7개, 전부 정식 구현 완료)
+
+| 탭 ID | 라벨 | 구현 상태 | 사용 API | 핵심 위젯/기능 |
+|---|---|---|---|---|
+| `live-training` | 실시간 학습 | ✅ 정식 | status/history/artifacts/gpu | Hero 도넛 + 스테퍼 + 메트릭 4 카드 + W3 Loss + W6 통계 + W4 ETA + W5 GPU |
+| `forecast` | 예측 워크벤치 | ✅ 정식 (P3) | available-models / data-files / load-model / load-data / **predict** | 모델/데이터 selector + 4 슬라이더 + Seed 토글 + 결과 차트 |
+| `stom` | 예측 진단 | ✅ 정식 (P4) | stom/summary + 8개 list/detail | DB KPI 4 + 파일 브라우저 + diagnostics 자동 조회 |
+| `artifacts` | 아티팩트 & 모델 | ✅ 정식 | training/artifacts | Checkpoint/Weight/Predictor 3 카드 + 파일 row |
+| `history` | 기록 & 런 | ✅ 정식 (P2) | training/runs | 4 KPI + 필터/정렬 + 14 run 그리드 |
+| `system-health` | 시스템 상태 | ✅ 정식 | training/gpu | 3 KPI + 시계열 차트 + 하드웨어 표 |
+| `settings` | 설정 | ✅ 정식 | localStorage only | 테마 카드 + 새로고침 5단계 + Notification API + 초기화 |
+
+---
+
+## 5. 디자인 시스템 v2 (현재 적용 중)
+
+### 5.1 핵심 결정
+- **방향**: human-approachable (Airbnb/Mercury 톤) + ML 운영 도구 정보 밀도 (Datadog/Linear)
+- **베이스**: 라이트 cool-tint `oklch(98% 0.004 240)` (다크 토글 가능)
+- **액센트**: 민트 `oklch(56% 0.12 170)` — 페이지당 최대 2회 등장
+- **글로우**: 활성 RUN + 핵심 KPI 2곳에만
+- **이모지 금지** — 모든 아이콘 inline SVG
+
+### 5.2 토큰 owner
+- 색상: `webui/v2_src/src/styles/core.css` `:root` / `[data-theme="dark"]`
+- 컴포넌트: `webui/v2_src/src/styles/components.css` (`.card / .metric / .pill / .signal / .stepper / .hero ...`)
+- TS 토큰: `webui/v2_src/src/lib/theme.ts` (ECharts/Plotly 옵션 owner)
+
+### 5.3 폰트
+- 디스플레이/본문: `Pretendard Variable` (CDN)
+- 모노: `JetBrains Mono` (Google Fonts)
+- 시스템 폴백: Segoe UI / Malgun Gothic
+
+---
+
+## 6. 절대 제약 사항 (Hard Constraints)
+
+### 6.1 변경 금지
+| 경로 | 이유 |
+|---|---|
+| `webui/app.py` (특히 `/api/*` 핸들러) | 24개 endpoint — 모든 SPA + v1 화면이 공유 |
+| `webui/templates/{index,training_dashboard,stom_dashboard}.html` | v1 archive (6개월 보존) |
+| `finetune/`, `model/`, `_database/` | 학습 코드 + 모델 + DB |
+| `webui/v2/__init__.py` | Flask Blueprint 분기 + cutover 라우팅 (P6 완료) |
+
+### 6.2 행동 금지
+- ❌ 신규 `/api/*` endpoint 추가 (모든 데이터는 기존 24개)
+- ❌ predictor 미완료 상태에서 정확도/수익률 ready 표시
+- ❌ `power_draw_available=false` 시 추정값 표시
+- ❌ KST 변환을 API timestamp 자체에서 (표시 계층에서만)
+- ❌ 이모지 아이콘
+- ❌ 보라/바이올렛 그라데이션 배경
+
+### 6.3 행동 의무
+- ✅ SSR meta marker (`kronos-v2-shell`, `kronos-v2-version`) 모든 변형에서 보존
+- ✅ Vite `base: '/static/v2/dist/'` 유지
+- ✅ light + dark 양 모드 모두 검증
+- ✅ Dist commit 정책 (REV-7) — `webui/static/v2/dist/`는 git에 포함
+
+---
+
+## 7. 미진행 / 보강 후보
+
+### 7.1 P5 정식 quality gate (남은 가장 큰 작업)
+- [ ] Lighthouse a11y ≥ 90 측정 (`lighthouse http://127.0.0.1:5070/ --output=json`)
+- [ ] Lighthouse perf ≥ 80 측정 (FLASK_ENV=production + gzip + waitress 환경에서)
+- [ ] code-reviewer 결과를 `docs/kronos_dashboard_overhaul_p5_review.md` 별도 저장
+- [ ] WCAG AA 색상 대비 4.5:1 검증 (특히 light 모드 muted 텍스트)
+- [ ] 키보드 네비게이션: Tab/Enter 로 모든 탭/슬라이더 접근
+
+### 7.2 잔여 폴리시 (응답 스키마 확정 후)
+- [ ] Forecast Candlestick 차트 (현재 라인) — `/api/predict` 응답 OHLC 형태 확정 시
+- [ ] STOM Plotly heatmap (dynamic import) — `/api/stom/diagnostics` 응답 hexmap 구조 확정 시
+- [ ] STOM top-k 추천 카드 — `/api/stom/recommendations?date=` 검증
+- [ ] STOM backtest 상세 모달 — `/api/stom/backtest-report?file=` 검증
+- [ ] Forecast CSV 다운로드 (client-side Blob)
+- [ ] Settings 학습 단계 알림 watcher (Notification API)
+- [ ] History run 클릭 시 손실 곡선 미니어처 (run 별 history endpoint 필요 — P3.5)
+
+### 7.3 운영
+- [ ] production 배포 환경 (FLASK_ENV=production + waitress 또는 gunicorn)
+- [ ] v1 archive 6개월 후 삭제 검토
+
+---
+
+## 8. 빌드/배포 (운영 절차)
+
+```powershell
+# 빌드 (변경 후 매번)
+cd D:\Chanil_Park\Project\Programming\Kronos\webui\v2_src
+npm run build
+
+# Flask 가동
+cd D:\Chanil_Park\Project\Programming\Kronos
+$env:KRONOS_WEBUI_PORT = "5070"
+$env:KRONOS_V2_DIST = "1"
+C:\Python\64\Python3119\python.exe webui\run.py
+
+# 접속
+# http://127.0.0.1:5070/ — 새 통합 대시보드 (v2 SPA)
+# http://127.0.0.1:5070/v1/ — v1 메인 (legacy archive)
+# http://127.0.0.1:5070/v1/training — v1 학습 모니터
+# http://127.0.0.1:5070/v1/stom — v1 STOM 진단
+
+# 테스트
+C:\Python\64\Python3119\python.exe -m pytest tests/test_v2_route.py tests/test_v2_dist_marker.py tests/test_v2_blueprint_isolation.py -v
+
+# Rollback (v1 임시 사용 / dist 비활성화)
+$env:KRONOS_V2_DIST = "0" # P1 SSR Jinja shell 로 폴백
+# 또는
+git revert
+```
+
+---
+
+## 9. 참고 파일 색인
+
+### 9.1 필독
+- `webui/v2_src/README.md` — 빌드/배포/디렉터리 구조
+- `docs/kronos_dashboard_overhaul_plan.md` — RALPLAN-DR 합의 마스터 플랜
+- `docs/kronos_dashboard_p1_5_design_spec.md` — 디자인 토큰 상세
+- `docs/kronos_dashboard_p1_5_build_checklist.md` — 빌드 운영 체크리스트
+
+### 9.2 디자인 시스템 출처
+- `template/extracted/DESIGN.md` — human-approachable 디자인 철학 + 토큰 사양
+- `template/extracted/styles/core.css` — 라이트/다크 OKLch 토큰
+- `template/extracted/styles/components.css` — `.card / .metric / .stepper` 등
+
+### 9.3 최근 commit 히스토리
+```
+8562c64 P6 cutover — / 가 v2 SPA, /v1/* archive, /v2 → 301
+98d66d2 예측 진단 (STOM) 탭 P4 본격 구현
+7e38c18 예측 워크벤치 탭 P3 본격 구현
+8f1beb4 기록 & 런 탭 P2 정식 패널 구현
+3f17e78 설정 탭 확장 (테마 카드 + 새로고침 + 알림 + 초기화)
+5ba3009 시스템 상태 탭 정식화
+7ff0d71 아티팩트 & 모델 탭 정식화
+a631b54 Live Training 탭 본격 리디자인
+ce42ab4 Designer 프로토타입 디자인 시스템 v2 이식
+2695151 P1.5 Vite Svelte SPA 정식 전환
+9411a23 P1.5 디자인 스펙 + 운영 체크리스트
+888bb08 P1 SSR 골격 구축
+5c46ccd ralplan 합의 계획 (P0)
+```
+
+---
+
+## 10. 한 줄 미션 (달성 완료)
+
+> ~~"학습 모니터링 + 예측 워크벤치 + STOM 진단 + 아티팩트 + 시스템 상태 — 5개 도메인을 단 하나의 시각적으로 화려하고 직관적인 Svelte SPA로 통합하라."~~
+>
+> ✅ **달성**: 7개 탭 모두 실 API 통합 + 디자인 시스템 v2 (human-approachable, light+dark, mint accent) + P6 cutover 완료.
+>
+> **다음 미션**: P5 Lighthouse quality gate + 잔여 폴리시 + 재학습.
+
+---
+
+*핸드오프 작성자: Claude (현 세션)*
+*최초 작성: 2026-05-16 KST · 마지막 갱신: 2026-05-18 KST*
diff --git a/docs/kronos_dashboard_overhaul_plan.md b/docs/kronos_dashboard_overhaul_plan.md
new file mode 100644
index 000000000..a63e45441
--- /dev/null
+++ b/docs/kronos_dashboard_overhaul_plan.md
@@ -0,0 +1,581 @@
+# Kronos 웹 대시보드 전면 개편 RALPLAN-DR 계획 (Draft, iteration 1 revised)
+
+작성일: 2026-05-12 KST
+실행 모드: `$ralplan` 합의 계획 단계 (Architect+Critic iteration 1 반영)
+대상 repo: `D:\Chanil_Park\Project\Programming\Kronos`
+Confidence: **medium-high** (iteration 1 후 risk surface 좁힘, npm 의존성을 학습 완료 후로 격리)
+Scope-risk: **moderate** (학습 중 작업은 SSR Jinja 골격으로만 진행, Vite/Node는 predictor 완료 후 별도 PR)
+
+---
+
+## 0. TL;DR (결론 먼저)
+
+- **방향**: 통합 단일 페이지 SPA를 학습이 끝날 때까지 **2단계로 분리** 진행. 기존 Flask 라우트 3개(`/`, `/stom`, `/training`)는 학습 완료 cutover 시점까지 그대로 유지한다.
+- **2단계 도입 (iteration 1 핵심 변경)**:
+ - **P1 (학습 중, npm 0)**: SSR Jinja `templates/v2_shell.html` + Alpine.js CDN + ECharts CDN 만으로 hero/stage/loss/eta/gpu 6개 위젯의 읽기 전용 골격. server-side marker로 grep 검증 가능.
+ - **P1.5 (predictor 완료 후, 별도 PR)**: 그 시점에 `webui/v2_src/` 생성, `npm ci` (Node 20 LTS pin), Vite 도입 + Svelte 5 + Tailwind prebuilt. P1 골격을 progressive enhancement.
+- **추천 스택 (최종 형태)**: Svelte 5 + Vite + ECharts + Tailwind prebuilt. 단 학습 중에는 적용하지 않는다.
+- **차트**: 메인 **Apache ECharts 5.x** (학습 곡선/스파크라인/대규모 시계열). STOM Diagnostics 탭에서만 **Plotly 2.35.2 dynamic import** 유지.
+- **빌드 파이프라인**: Flask가 `webui/static/v2/dist`의 prebuilt 산출물을 정적 서빙. `dist/`는 commit (prebuilt 정책), `node_modules/`는 `.gitignore`. dev Vite 서버는 P1.5 이후에만, 별도 포트.
+- **rollback 안전망**: `/v2` 별도 라우트 + `KRONOS_V2_ENABLED` env feature flag + git revert + v1 templates는 cutover 후 `/v1/*` prefix로 **6개월 archive**.
+- **학습은 절대 건드리지 않는다.** P1 진행 중 npm/Node 0 의존성, P1.5는 학습 종료 후에만 시작.
+
+상태: **pending approval (Architect+Critic 합의 전)** — 마지막 줄에서 다시 명시.
+
+---
+
+## 1. 현재 기준선 스냅샷 (read-only 관측)
+
+| 항목 | 값 |
+|---|---:|
+| run | `stom_1s_grid_pred60_2025_full_small` |
+| status | `running` |
+| stage | `tokenizer` |
+| tokenizer step | 1,852,000 / 4,701,721 |
+| tokenizer 진행률 | 약 39.39% |
+| 전체 both-stage 진행률 | 약 19.69% |
+| predictor stage | 미시작 |
+| checkpoint 파일 | 0개 |
+| GPU | RTX 4080 SUPER · Util 40% · VRAM 22% · 37°C |
+| ETA | 약 50시간 (tokenizer만 기준) |
+
+이전 안전 계획 `docs/stom_dashboard_safe_parallel_improvement_plan.md`에서 1~6단계 (공통 readiness UI, artifacts API, history, GPU/ETA 카드, /stom gate, code-review)가 모두 완료되어 read-only 모니터링 토대는 이미 견고하다. 이번 개편은 그 위에 시각적 화려함과 단일 진입점을 얹는다.
+
+---
+
+## 2. RALPLAN-DR 요약
+
+### 2.1 원칙 (Principles, 5개)
+
+1. **학습 불간섭 (P1)**: 실행 중인 STOM full training과 `finetune/` 일체를 절대 수정/재시작하지 않는다. Vite/npm은 별도 프로세스에서만 동작하고, GPU/CUDA/PyTorch 환경에 손대지 않는다.
+2. **읽기 전용 데이터 흐름 (P2)**: 모든 신규 API/UI는 read-only. predictor checkpoint가 만들어지기 전까지 정확도/수익률 ready 표시를 절대 켜지 않는다 (기존 readiness gate 정책 100% 계승).
+3. **빌드 산출물 분리 (P3)**: 학습 중에는 npm 자원 경쟁을 피하기 위해 Vite dev 서버는 옵션이고, 운영 배포는 prebuilt static 자산만으로 동작한다. Python 측은 `webui/static/v2/dist/*`만 본다.
+4. **공존 가능한 점진적 마이그레이션 (P4)**: 기존 `/`, `/stom`, `/training`은 학습 완료 cutover 시점까지 모두 살아 있다. 신규 SPA는 `/v2`에서 격리 검증된 후 합의로 cutover.
+5. **시각적 화려함은 비용과 함께 평가 (P5)**: 모션/3D/heavy WebGL은 차트와 분리한다. 화려함은 micro-interaction과 정보 계층 명확성으로 표현하고, 학습 중 GPU 자원 점유를 늘리지 않는다.
+
+### 2.2 결정 동인 (Decision Drivers, Top 3)
+
+1. **D1 학습 보호 (절대 우선)**: 50시간짜리 학습이 깨지면 사용자 손실이 가장 크다. 모든 결정은 "학습에 영향을 주는가"가 첫 필터.
+2. **D2 사용자 경험 통합성**: 현재 3개 페이지를 왔다갔다하며 같은 readiness 상태를 다시 확인해야 한다. 단일 SPA에서 한 번에 본다.
+3. **D3 시각적 직관성 + 화려함**: tokenizer→predictor 전환 카운트다운, GPU 트렌드, 학습 곡선이 한눈에 들어와야 하며 따분하지 않아야 한다.
+
+(보조 드라이버: 유지보수성, 번들 크기, Windows + Python 3.11.9 환경 호환성)
+
+### 2.3 Viable Options (2개 viable + 1개 invalidated)
+
+> **iteration 1 변경**: 옵션 A의 도입 시점을 P1.5(학습 종료 후)로 명시 격리. P1(학습 중)에는 옵션 B(Alpine.js + ECharts CDN)의 패턴을 SSR Jinja로 그대로 사용한다. 즉 A/B는 양자택일이 아니라 **시간축 분할 시퀀스**다.
+
+#### Option A — **Svelte 5 + Vite + ECharts** (P1.5 이후 채택, 최종 형태)
+
+| 항목 | 내용 |
+|---|---|
+| 프론트 프레임워크 | Svelte 5 (runes API), TypeScript |
+| 빌드 | Vite 5 (`base: '/static/v2/dist/'`) |
+| 차트 | Apache ECharts 5 (메인) + Plotly 2.35.2 (STOM diagnostics, dynamic import만) |
+| 스타일 | TailwindCSS **prebuilt** (`@tailwindcss/cli` 또는 PostCSS) + 커스텀 dark/navy 테마 — **Play CDN은 금지** (AC-1) |
+| 라우팅 | client-side 단일 SPA, `/v2/` catch-all은 v2 prefix 내부에서만 (글로벌 catch-all 금지, REV-2) |
+| 번들 추정 | gzip 약 150~220KB (Svelte ~10KB + ECharts core ~180KB + Tailwind 압축 후 ~30KB) |
+| Node version | **20.x LTS pin** (`package.json#engines.node`), `npm ci`로 lockfile 기반 재현 가능 install |
+
+**Pros**
+
+- Svelte는 가상 DOM이 없어 런타임 오버헤드 최소, 학습 중 브라우저 부담 적음
+- ECharts는 학습 곡선(2M+ step)도 부드럽게 처리 (Canvas 기반)
+- 컴파일 결과가 가벼워 Windows powershell 빌드 시간도 짧음 (initial install ~80MB node_modules)
+- Plotly와 공존 가능 (script tag 격리)
+- micro-interaction (slot transition, FLIP)이 자연스러워 "화려함" 요구를 코드 양 늘리지 않고 달성
+
+**Cons**
+
+- 사용자 측 Svelte 학습 곡선 (단, 코드 수정자가 Claude/사용자 본인이므로 큰 부담 아님)
+- npm 의존성 추가 (학습 중 install은 백그라운드/저우선순위 필요)
+- 두 차트 라이브러리 공존 = 번들 일시 증가 (단 lazy load로 완화)
+
+#### Option B — **Alpine.js + ECharts CDN, SSR Jinja shell (P1 채택, 학습 중)**
+
+| 항목 | 내용 |
+|---|---|
+| 프론트 | Alpine.js 3 (CDN) — HTMX는 P1 범위에 불필요 (read-only fetch만) |
+| 빌드 | 없음. `templates/v2_shell.html` Jinja 한 장 |
+| 차트 | ECharts 5 (CDN, `
+