# 02-BUGS.md — Known Bugs

> **Обновляется bug-hunter агентом. Читается при каждом code review.**

**Последнее обновление:** 2026-06-18 (восстановление journal.csv)

---

## Контекст миграции

⚠️ **Все баги, связанные со старой VSA-стратегией, больше не применимы** (см. раздел "FIXED (Migrated to Neural Network)" внизу).

Текущая стратегия — нейросетевая (LSTM/Transformer/MLP) с Triple Barrier labeling.

---

## Активные баги (по severity)

### 🟡 Medium: `journal.csv` не записывается при закрытии сделок (FIXED 2026-06-18)
- **Было:** Старая версия `virtual_trading.py` (commit d95afa1) — `execute_signal()` проверял выходы внутри себя, вызывал `_log_closed_trade()` → `self.journal.add_trade()`, но из-за ошибки в логике вызов либо не происходил, либо падал. journal.csv создан 15 июня и ни разу не модифицировался.
- **Fix:** Процессы на старом коде остановлены. journal.csv восстановлен скриптом `scripts/reconstruct_journal.py` из `signals.log`. Текущий код (post-refactoring) использует `check_all_exits()` → `add_trade()`, баг исправлен.
- **Профилактика:** Не запускать более 1 экземпляра сканера из одной директории. При рестарте убедиться, что процессы убиты.

### 🟢 ALL CLEAN (2026-06-16)

После рефакторинга удалено всё неиспользуемое. Актуальных багов нет.
Тесты: 143/143 pass.

### 🟡 Medium: `trade_journal.py` formations/opened always 0 — FIXED
- **Было:** `formations = 0; opened = 0` без инкрементации — в отчётах всегда 0
- **Fix:** Заменено на `len(trades)` для обоих полей

### Старые исправления (Neural pipeline)

Все баги из рефакторного анализа исправлены. См. `04-CHANGELOG.md` для деталей.

Исправлены 3 теста, которые падали после внедрения MIN_RR=1.5 в `validate_barrier_levels()`:
1. `test_long_valid_no_change` — ожидает TP=101.5 (RR-forced)
2. `test_short_valid_no_change` — ожидает TP=98.5 (RR-forced)
3. `test_predict_with_mocked_trainer` — `pytest.approx()` для float-сравнений

| # | Баг (из анализа) | Файл | Статус |
|---|-----------------|------|:------:|
| R1 | `NeuralSignal` дублирован в 2 местах | `domain/models.py`, `ai/inference_v2.py` | 🟢 FIXED |
| R2 | `ticker=""` в `_close_position` | `backtest/engine.py` | 🟢 FIXED |
| R3 | Дефолты моделей расходятся | `domain/constants.py`, `TrainerConfig` | 🟢 FIXED |
| R4 | `Any` не импортирован | `backtest/engine.py` | 🟢 FIXED |
| R5 | `ticker_id=0` всегда в inference | `ai/inference_v2.py` | 🟢 FIXED |
| R6 | `_default_predictor` — private access | `scanner/cli.py` → `StrategyScanner` | 🟢 FIXED |
| R7 | `confidence = strength` в strategy | `scanner/strategy_scanner.py` | 🟢 FIXED |
| R8 | `from __future__ import annotations` | 39 файлов | 🟢 FIXED |

### Старые баги (Neural pipeline)

| # | Баг | Статус |
|---|-----|:------:|
| N1 | `entry_signal` positive rate 99% (regression risk) | 🟢 FIXED |
| N2 | Scaler не сохраняется с моделью | 🟢 FIXED |
| N3 | Feature engineering duplication | 🟢 FIXED |
| N4 | `add_technicals()` не кэшируется | 🟢 FIXED |
| N5 | `MultiTaskOutput.entry_proba` — не property | 🟢 FIXED |
| N6 | Random `train_test_split` | 🟢 FIXED |
| N7 | `requirements.txt` без `xgboost` | 🟢 NOT NEEDED |
| N8 | Scanner MOEX пропуск между сессиями | 🟢 FIXED |

---

## 🟢 FIXED (Migrated to Neural Network)

Все VSA-баги были устранены при миграции (2026-06-02) — старые модули полностью удалены.

| Old # | VSA Bug | Решение при миграции |
|-------|---------|---------------------|
| 1 | `allow_short` из DB переопределяет CLI | `NeuralBacktester` принимает `--sides LONG,SHORT`, не зависит от DB |
| 2 | SL-буфер 98% SL-hit | Модель предсказывает SL на основе контекста |
| 3 | Partial close убивает RR | `NeuralBacktester` не имеет partial close — полный TP/SL |
| 4 | Утренняя сессия токсична (WR=24%) | Модель обучается на полной сессии H1 |
| 5 | `apply_rr_exits()` SHORT bug | `NeuralBacktester` использует предсказанные TP/SL, нет RR фиксированного |
| 6 | Dead code в `data_loader.py` | `core/data_loader.py` упрощён до H1 (216 → ~150 строк) |
| 7 | `requirements.txt` без `xgboost` | xgboost удалён из neural pipeline (только PyTorch) |
| 8 | Feature duplication | Единый `ai/features.py` |
| 9 | `levels` param ignored | Модель не использует SR levels — features достаточно |
| 10 | Backtester использует `BacktestPosition`, не `domain.Position` | `NeuralBacktester` использует `NeuralSignal` (единый) |
| 11 | `pyproject.toml` без пакетов | Все пакеты включены |
| 12 | Holiday list 2026 only | Расширен до 2023-2026 |
| 13 | `DEFAULT_RISK_PER_TRADE` mismatch | `.env`/`constants` синхронизированы |
| 14 | `create_backtester_for_ticker()` дважды | `NeuralBacktester` — единый класс |
| 15 | `CREATE_TABLE_SQL` vs `DEFAULT_PARAMS` | DB-based params больше не используются |
| 16 | `config._config` мутация | `NeuralBacktester` не мутирует config |
| 17 | `ModelArchitecture` enum без MLP | `domain/enums.py` теперь LSTM/TRANSFORMER/MLP |
| 18 | `VirtualPosition.ticket` typo | `VirtualPosition.ticker` |

---

## Риски (НЕ баги, а предупреждения)

### R1: Positive rate 99% при переписывании labeling
Если кто-то перепишет `create_training_targets()` и использует `entry_signal = (outcome != 0)`, получим 99% positive rate. **Тест `test_labeling.py:test_create_training_targets_positive_rate` проверяет** это.

### R2: Scaler забыт при сохранении
`MultiTaskTrainer.save(path)` сохраняет и модель, и scaler. Если кто-то изменит это, чтобы сохранять только `state_dict()`, предсказания сломаются.

### R3: Feature engineering drift
`ai/features.py` — single source. Если кто-то добавит индикатор в `ai/dataset_v2.py` или `ai/inference_v2.py` локально, train/inference разойдутся.

### R4: Time leak
`MultiTickerDataset.build_dataset()` использует **хронологический** split. Если кто-то добавит `shuffle=True` в `train_test_split`, будет time leak.

### R5: Model on wrong device
PyTorch модель должна быть на том же device, что input tensor. Trainer перемещает модель, inference перемещает input. Если кто-то забудет — RuntimeError.

---

## Статистика

- **Всего багов зарегистрировано:** 26 (18 старых VSA + 8 новых neural)
- **Active (V2):** 0 critical, 0 high, 0 medium, 0 low
- **Fixed (Migrated):** 18 (все VSA-баги)
- **Fixed (Neural bugs):** 8 (N1-N6 + R1-R7)
- **Risks (warnings):** 5 (R1-R5) — все предупреждения, не баги
