# web-ai V1 루트 → `signal_v1/` Rename Design

**작성일**: 2026-05-16
**작성자**: gahusb
**상태**: Approved for implementation
**선행 spec**:
- Confidence Signal Pipeline V2 Phase 0 (`2026-05-15-confidence-signal-pipeline-v2-architecture.md`)
- stock-lab → stock graduation (`2026-05-15-stock-lab-rename-to-stock.md`) — 동일 atomic refactor 패턴

---

## 1. 목표

`web-ai/` 디렉토리에 V1 자동매매 시스템 (main_server.py + modules/ + 자체 LSTM + KIS + Telegram Bot) 과 V2 시그널 파이프라인 (`signal_v2/` Phase 2 시작) 이 함께 거주할 예정. V1 자산을 모두 `signal_v1/` 하위로 격리해 신/구 분리 명확.

**Why**: 사용자 명시 ("기존 기능들도 봤을때 헷갈리지 않게 signal_v2에서 사용하는거 아니면 web-ai/signal_v1 으로 몰아넣어줘"). V2 Phase 6 deprecation 시점에 `rm -rf signal_v1/` 단순화. Phase 2 spec 작성 전에 새 이름 `signal_v1/` 기준으로 진행하면 후속 갱신 비용 회피.

본 리네이밍은 **Phase 2 brainstorming 의 도중 분기**한 별도 슬라이스 — stock-lab → stock graduation 과 동일 패턴.

---

## 2. 범위

### 포함

- `git mv` web-ai 루트의 모든 V1 자산을 `signal_v1/` 안으로:
  - 진입점: `main_server.py`, `warmup_and_restart.py`, `watchlist_manager.py`, `backtester.py`, `theme_manager.py`, `backtest_runner.py`
  - 모듈: `modules/` (전체)
  - 데이터: `data/` (전체 — runtime data 보존)
  - 테스트: `tests/` (전체)
  - 스크립트: `start.bat`
  - 문서: `KIS_SETUP.md`, `README.md`, `CLAUDE.md` (기존 V1 가이드)
  - 로그: `bot_ipc.json`, `bot_output.log`, `daily_launcher.log`, `server.log`, `telegram_bot.log`, `warmup.log`
  - `__pycache__/` (gitignore)
- `web-ai/CLAUDE.md` 신규 — web-ai 루트의 새 가이드 (signal_v1 + signal_v2 디렉토리 안내, 공유 `.env`, Phase 6 deprecation 계획)
- `web-ai/start.bat` 신규 — `cd signal_v1 && python main_server.py` (또는 절대 경로 형태)
- 운영 검증: 자체 자동매매 봇 정상 기동 + Telegram Bot polling + KIS 토큰 로딩

### 범위 외 (NOT)

- Python import 경로 변경 — `signal_v1/` 안에서 진입점 실행 시 cwd 가 `signal_v1/` 이라 기존 `from modules.X` 그대로 작동. import 전면 갱신 불필요.
- `signal_v2/` 디렉토리 생성 — Phase 2 spec 의 작업.
- `.env` 분리 — V1 + V2 환경변수 모두 `web-ai/.env` 한 곳 (signal_v1 의 python 진입점이 cwd 기준 `.env` 로드 시 path 갱신 필요, 단순 조정).
- `.gitignore` — 기존 패턴 그대로 (`signal_v1/__pycache__`, `signal_v1/data/*.db` 등은 일반 패턴으로 커버).
- 다른 lab / web-backend / web-ui 영향 — 0.
- start_signal_v2.bat — Phase 2 spec 의 작업.

---

## 3. 변경 매트릭스

### 3.1 web-ai 루트 (작업 전)

```
web-ai/
├── .env                    ← 유지
├── .gitignore              ← 유지
├── CLAUDE.md               ← signal_v1/ 로 mv (현 V1 가이드)
├── KIS_SETUP.md            ← signal_v1/ 로 mv
├── README.md               ← signal_v1/ 로 mv
├── main_server.py          ← signal_v1/ 로 mv
├── warmup_and_restart.py   ← signal_v1/ 로 mv
├── watchlist_manager.py    ← signal_v1/ 로 mv
├── backtester.py           ← signal_v1/ 로 mv
├── backtest_runner.py      ← signal_v1/ 로 mv
├── theme_manager.py        ← signal_v1/ 로 mv
├── start.bat               ← signal_v1/ 로 mv (이후 web-ai/start.bat 신규)
├── modules/                ← signal_v1/ 로 mv
├── data/                   ← signal_v1/ 로 mv
├── tests/                  ← signal_v1/ 로 mv
├── __pycache__/            ← signal_v1/ 로 mv (gitignore)
├── bot_ipc.json            ← signal_v1/ 로 mv
├── bot_output.log          ← signal_v1/ 로 mv
├── daily_launcher.log      ← signal_v1/ 로 mv
├── server.log              ← signal_v1/ 로 mv
├── telegram_bot.log        ← signal_v1/ 로 mv
└── warmup.log              ← signal_v1/ 로 mv
```

### 3.2 web-ai 루트 (작업 후)

```
web-ai/
├── .env                    ← 공유 (V1 + V2 변수)
├── .gitignore              ← 기존
├── CLAUDE.md               ← 신규 (web-ai 레벨 가이드)
├── start.bat               ← 신규 (signal_v1 진입)
├── signal_v1/
│   ├── CLAUDE.md           ← 기존 V1 가이드 (이동)
│   ├── KIS_SETUP.md
│   ├── README.md
│   ├── main_server.py
│   ├── warmup_and_restart.py
│   ├── ... (이하 모든 V1 자산)
│   ├── start.bat           ← 이동본 (사용 안 함, 향후 정리)
│   ├── modules/
│   ├── data/
│   ├── tests/
│   └── (log 파일들)
└── signal_v2/              ← Phase 2 작업 (본 spec 외)
```

### 3.3 신규 파일 2개 — 정확한 내용

**`web-ai/CLAUDE.md` (신규)**:
```markdown
# web-ai — Workspace 가이드

Windows AI 머신 (AMD 9800X3D + RTX 5070 Ti) 의 두 시그널 파이프라인 컨테이너.

## 디렉토리 구조

| 경로 | 역할 | 상태 |
|------|------|------|
| `signal_v1/` | V1 자체 자동매매 시스템 (main_server.py + Trading Bot + Telegram Bot + LSTM + Ollama + KIS 자동주문) | 운영 중. Confidence Signal Pipeline V2 Phase 6 에서 deprecation 예정 |
| `signal_v2/` | V2 신호 파이프라인 (stock pull worker + Chronos-2 + signal API client) | Phase 2 에서 신설 |
| `.env` | V1 + V2 환경변수 공유 | KIS_*, TELEGRAM_*, STOCK_API_URL, WEBAI_API_KEY 등 |
| `start.bat` | V1 진입 (signal_v1 디렉토리 안 main_server.py 실행) | V2 별도 start 스크립트는 signal_v2/start.bat |

## 운영 가이드

- V1 시작: `start.bat` 또는 `cd signal_v1 && python main_server.py`
- V2 시작 (Phase 2 이후): `cd signal_v2 && python -m uvicorn main:app --port 8001`
- 둘 다 동시 실행 가능 (포트 분리: V1=8000, V2=8001)

## Phase 진행 상태 (Confidence Signal Pipeline V2)

`web-ui/docs/superpowers/specs/2026-05-15-confidence-signal-pipeline-v2-architecture.md` 참조.

자세한 V1 가이드는 `signal_v1/CLAUDE.md` 참조.
```

**`web-ai/start.bat` (신규)**:
```bat
@echo off
cd /d "%~dp0\signal_v1"
python main_server.py
```

### 3.4 운영 영향 — `.env` 로드 경로

기존 V1 코드 (`signal_v1/modules/config.py` 등) 는 `load_dotenv()` 호출 시 cwd 또는 절대 경로의 `.env` 를 찾음. cwd 가 `signal_v1/` 이라면 `.env` 가 `web-ai/.env` (parent) 이라 못 찾을 수 있음.

**해결**: 진입점 (`signal_v1/main_server.py` 등) 의 `load_dotenv()` 호출에 명시적 경로 추가:
```python
from pathlib import Path
from dotenv import load_dotenv

# web-ai/.env (signal_v1/ 의 parent) 명시 로드
load_dotenv(Path(__file__).parent.parent / ".env")
```

작업 매트릭스:
- `signal_v1/main_server.py` 의 `load_dotenv()` 1-2 줄 갱신
- `signal_v1/warmup_and_restart.py` 동일
- `signal_v1/modules/config.py` 같은 환경변수 로딩 위치 점검

---

## 4. 작업 순서

```
1. 사전 검토 (10분)
   - web-ai 자체 자동매매 봇 운영 중 → 작업 시간대 결정 (장외: 평일 16:00 이후 / 주말)
   - 본 spec §3 매트릭스 모든 파일 grep cross-check
   - .env 로드 위치 grep — `load_dotenv` 호출 모두 찾기
   - 데이터 파일 (data/, *.log, *.json) 손실 위험 없음 확인 (git mv 는 history 보존)

2. atomic refactor (1 commit)
   - mkdir signal_v1
   - git mv (위 매트릭스 항목 전부) signal_v1/
   - signal_v1/main_server.py 외 .env 로드 위치 갱신
   - web-ai/CLAUDE.md 신규
   - web-ai/start.bat 신규

3. 로컬 검증 (cwd=signal_v1)
   - python -m pytest tests/unit -q  (기존 V1 테스트 통과)
   - python main_server.py 시작 검증
   - .env 로딩 확인 (KIS / Telegram / Ollama 환경변수)
   - 봇 정상 시작 → telegram 알림 도착 → /status 응답 → 종료

4. git push (web-ai repo)
   - sub Gitea: https://gitea.gahusb.synology.me/gahusb/ai-trade.git
   - 본 작업은 NAS deploy 와 무관 (web-ai 는 로컬 Windows 머신).

5. 사용자 수동 검증
   - 시장 시작 (다음 평일 09:00) 시점 봇 정상 동작 확인 또는 일/주말 가짜 트리거
```

---

## 5. 위험 및 완화

| 위험 | 완화 |
|------|------|
| `.env` 로드 실패 → KIS 토큰 못 가져옴 → 자동매매 중단 | 진입점 (main_server.py / warmup_and_restart.py) 의 `load_dotenv` 명시 경로 추가. 시작 직후 KIS auth 확인 |
| 자동매매 중 작업 → 거래 중단 | 작업 시간대를 장외 (평일 16:00+ 또는 주말) 로 제한 |
| Python import 회귀 | `signal_v1/` cwd 기준 `from modules.X` 그대로. 외부 import 불필요. 기존 76+ 테스트 통과로 검증 |
| 데이터 파일 (data/models/, data/ensemble_history.json 등) 손실 | git mv 사용 — history 보존, 파일 내용 무변경. 사전 git status 로 dirty 없음 확인 |
| Telegram Bot 중복 polling (이전 프로세스 미종료) | start.bat 재시작 시 main_server.py 의 좀비 정리 로직 자동 동작 |
| .env 의 절대 경로 참조 (e.g. `data/kis_token.json` 같은 상대 경로) | cwd 변경 영향 — 진입점이 working directory 를 `signal_v1/` 으로 설정하면 기존 상대 경로 그대로 작동. start.bat 의 `cd /d "%~dp0\signal_v1"` 가 보장 |
| 향후 web-ai 레벨 외부 호출 (e.g. agent-office → web-ai :8000) | V1 main_server.py 는 port 8000 유지. URL 변경 없음. |
| signal_v2 진입점이 signal_v1 의 IPC 와 충돌 | Phase 2 가 별도 port :8001 + 별도 디렉토리. IPC SharedMemory 이름 분리 (V1 의 `web_ai_bot_ipc` 그대로 유지, V2 는 IPC 사용 안 함) |

---

## 6. 테스트 / 검증

### 6.1 자동

```bash
# V1 테스트 전체 통과
cd /c/Users/jaeoh/Desktop/workspace/web-ai/signal_v1
python -m pytest tests/unit -q
# Expected: 기존 PASS 개수 그대로

# stock-lab → stock 의 잔여 참조 패턴 검증과 동일 — V1 안에서 import 회귀 없음
grep -rn "from web-ai" /c/Users/jaeoh/Desktop/workspace/web-ai/signal_v1
# Expected: 0 lines (없어야 함)
```

### 6.2 수동

- `cd web-ai && start.bat` (또는 `cd web-ai/signal_v1 && python main_server.py`)
- 콘솔 로그에 KIS 인증 성공 / Telegram Bot connected / Ollama 모델 로드 확인
- Telegram /status 명령 → 정상 응답
- 30분 관측 후 Watchdog 정상 (자식 프로세스 healthy)

---

## 7. 운영 영향

| 항목 | 영향 |
|------|------|
| 다운타임 | 작업 시간 + 첫 시작 검증 = ~30분 |
| 사용자 영향 | V1 자동매매 봇 일시 중단 (장외 시간대 진행 권장) |
| `.env` 갱신 | 없음 (위치 그대로, 진입점만 명시 경로 변경) |
| frontend 영향 | 없음 |
| 다른 lab / web-backend | 없음 (web-ai 외부 의존 0) |
| Gitea push | web-ai repo 만 |

---

## 8. 완료 조건 (DoD)

- [ ] `web-ai/signal_v1/` 디렉토리 신설 + 매트릭스의 모든 V1 자산 mv 완료 (git history 보존)
- [ ] `web-ai/CLAUDE.md` 신규 (web-ai 레벨 가이드)
- [ ] `web-ai/start.bat` 신규 (signal_v1 cd 후 main_server.py)
- [ ] `signal_v1/main_server.py`, `warmup_and_restart.py` 등의 `load_dotenv()` 가 `web-ai/.env` 를 명시 로드
- [ ] `signal_v1/tests/unit/` 전체 pytest 통과 (기존 baseline 그대로)
- [ ] `cd web-ai && start.bat` 으로 V1 봇 정상 시작 + Telegram /status 응답
- [ ] grep `from web-ai\.` 또는 `from web-ai/` 결과 0 lines
- [ ] web-ai repo push 완료 (단일 commit)

---

## 9. Phase 2 와의 관계

본 리네이밍 완료 후 즉시 **Phase 2 brainstorming 재개**. Phase 2 spec 은:
- 새 이름 `web-ai/signal_v2/` 기준
- Phase 2 의 모든 결정 (배치 = 별도 FastAPI app :8001 / scope = 3 항목 / scheduler = asyncio cron / client = httpx + 자체 retry / rate limit = SQLite / test = pytest-asyncio) 그대로 반영
- 디자인 섹션 1 (목표/scope) + 섹션 2 (파일 구조 = web-ai/signal_v2/) 의 검토 완료 상태에서 섹션 3-7 진행

```
[본 리네이밍 spec/plan/실행]   →   [Phase 2 spec 작성 재개]
       ~30분-1시간                        ~15분 (남은 섹션)
```
