--- description: Optuna job 엔진 뱃지(Rust⚡/Python🐢) — use_rust 명시 저장, 폴백 하드코딩 금지 alwaysApply: true --- # Optuna Job 엔진 뱃지 라벨링 이 대화에서 실제로 난 사고: 파이썬으로 돌린 스캘핑 job이 UI에서 `Rust⚡`로, 러스트 스캘핑 refine2 가 헷갈리게 표시. 원인은 `optuna_web_jobs.py`에서 `use_rust` 필드가 없는 옛 JSON에 **전략명 하드코딩 폴백**(“tail이면 Rust, 나머지는 Python”)을 붙였기 때문. ## 1. 원칙 - Optuna job(`logs/optuna_web_jobs/.json`) 저장 시 **`use_rust: true|false` 를 항상 명시 저장**한다. 프론트 뱃지·필터·정렬이 이 필드를 진리로 사용한다. - 백엔드 job_list 렌더링은 `use_rust` 가 **없거나 None이면** `engine_label = "미상"` (예: `❔`) 로만 표기. **전략명에 따라 임의로 Rust/Python을 부여하지 말 것.** - 프론트도 `engine_label` 문자열을 신뢰. 하드코딩 매핑 금지. ## 2. 금지 - `if "tail" in strategy: label = "Rust⚡" else "Python🐢"` 류 폴백. - 신규 Rust 포팅 전략(스캘핑·모멘텀·돌파 등)이 늘어날 때 이 조건을 늘려 유지보수하는 방식. - 옛 JSON을 뒤늦게 스캔하며 라벨을 “추정”해 덮어쓰기. ## 3. 필수 저장 필드 `optuna_web_jobs` 저장 시 아래를 반드시 포함: - `use_rust: bool` — 실제 실행 엔진 - `strategy: str` — 전략 코드 - `mode: str` — Optuna mode (tpe/fast/coarse/…) - `label: str` — UI 표시용(예: `1·2차TPE·스캘핑`). 초기화 실패 시 `_labels.get(strat, strat)` 폴백만 허용. ## 4. 완료 전 스모크 1. Rust로 스캘핑 mode 1회 실행 → UI에서 `Rust⚡` 로 뜨는지 2. Python으로 스캘핑 mode 1회 실행 → `Python🐢` 로 뜨는지 3. `use_rust` 누락 옛 JSON 하나 열어 → `❔` (미상) 으로 뜨는지 4. 브라우저 검증 URL은 `http://192.168.0.149:5050/` (`backtest-web-restart.mdc`) ## 5. 참고 - `label`이 `None` 이면 UI가 `study_short`(`refine2` 등)로 폴백하며 사용자에게는 의미 없는 표기가 됨. 라벨은 항상 `_base_label = label if label else _labels.get(strat, strat)` 로 방어.