Files
kis_bot/.cursor/rules/optuna-job-engine-label.mdc
Your Name b5d7c5d848 fix(옵투나·백테웹): 휩쏘 키 통일 + 엔진 뱃지 + 잡 삭제 + race·후처리 시그니처
휩쏘 키 통일 (bt-form-postfilter-key-parity.mdc 신설)
- 저장키 vs 조회키 불일치 해소: whipsaw_enabled(옛) → whipsaw_filter_enabled(표준)
- backtest_web.py: params[..] 세팅, static/js/backtest.js: 폼 파라미터
- optuna_web_jobs·param_search_apply_snapshot·param_search_scalping: 옛 alias 제거
- bt_post_filters: 로컬 변수도 whipsaw_filter_enabled 로 통일
- scripts/scratch: 관련 스크립트 동기 반영

엔진 뱃지 (optuna-job-engine-label.mdc 신설)
- optuna_web_jobs: use_rust 명시값만 신뢰, 미상은  (전략명 하드코딩 폴백 금지)
- 스캘핑/모멘텀/돌파 Rust 포팅 확장에도 안전한 라벨링

Optuna 웹 잡 UX
- save_job: tmp 파일 PID 접미 (멀티 프로세스 race 해소)
- _spawn_job_reaper: mode_refine 완료 시 phase1/phase2 JSON 자동 등록
  → 예전 UX 복원 (실행 잡ID 위에 결과 잡ID 노출)
- delete_job / delete_jobs_bulk 신설 + API + UI 삭제 버튼
  실행 중 잡 거부, 로그·원본 결과 JSON 보존

후처리 시그니처 수정
- bt_post_filters.orderbook_reject_for_entry 호출:
  price= → current_price=, 단일 대입 → 튜플 unpack
  (매 trial 마다 TypeError 삼켜지고 후처리 무효화되던 버그)

버그 조사·룰 강화
- verify-before-conclude-cross-strategy.mdc: 함수 추적 딥다이브 → 근본 대안 3개
- .cursorrules: 룰 27~29 추가 (해외 UI 정합·휩쏘 키·엔진 뱃지)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 19:23:22 +09:00

41 lines
2.2 KiB
Plaintext

---
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/<id>.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)` 로 방어.