docs: состояние после фаз 2–4

AGENTS.md и docs/ai/plan.md — фаза 2 закрыта (линки, брокерские потоки,
ручные цены), фазы 3 и 4 закрыты и протестированы на живых отчётах и
фикстурах; порядок шагов пересчёта дополнен benchmarks/rebalance/income/tax.
This commit is contained in:
Dmitry
2026-09-19 10:57:00 +03:00
parent df49d99af4
commit 95cd6f176e
2 changed files with 111 additions and 5 deletions
+28
View File
@@ -476,6 +476,26 @@ instruments; экраны: позиции, карточка инструмент
неизвестный ISIN → pending, после резолва лоты пересобраны; pdf и xlsx ВТБ за один период
дают одинаковые `dedupe_key`; парсеры без зависимости от БД.
**Статус: закрыта.** Все проверки пройдены на живых отчётах, кроме одной: pdf-выгрузок ВТБ у
пользователя нет, и сверить два формата не на чем. Вместо неё сверены два xlsx с
перекрывающимися периодами, а контракт, который обязан соблюсти будущий `vtb/pdf.py`, чтобы
ключи совпали (брокер, номер соглашения, «№ сделки»), записан в `vtb/common.py`.
Что выяснилось по ходу и чего в плане не было:
- CSV-выгрузка Snowball **сводная по всем брокерам и не содержит разбивки по счетам**, а
также закрывающих позиций и остатков. Как сверка она годится для потоков, сделок и выплат
на уровне портфеля, но не для позиций по счетам. Целевой счёт указывает пользователь, и на
счёте с другим `primary_event_source` события лягут `shadow`;
- в ней же 4 строки — не операции, а правки остатка самим Snowball (3 среди `CASH_OUT`,
1 среди `CASH_IN`), причём одна на −1017,84 ₽, то есть крупнее настоящего вывода. Отличать
их можно только по тексту `Note`, порог по сумме ошибается;
- два `SPLIT` по `T` — одно корпоративное действие, увиденное на двух счетах; схлопываются в
один `dedupe_key`, и это верно: иначе коэффициент 10 применился бы дважды;
- `CUSTOM_HOLDING_PRICE` закрывает ручной ценой только `SIBN6P4`;
`NDM_TBNK-PP-FIXPRCNT-08.25` в выгрузке отсутствует, его дыра остаётся открытой;
- отчёты Сбера не содержат дивидендов, налогов и купонной секции вовсе.
### Фаза 4 — доходы, ребалансировка, бенчмарки, цели, налоги
`sync_events.py` (GetDividends, GetBondCoupons, GetBondEvents), MOEX как второй источник
с правилами приоритета, `analytics/income.py`, `rebalance.py` (целевые веса по категориям,
@@ -488,6 +508,14 @@ instruments; экраны: позиции, карточка инструмент
одной сетке без дыр в праздники; лот > 3 лет помечен `ldv_eligible`, налоговый вид
сходится с ручным примером.
**Статус: код и тесты закрыты (157 backend-тестов), прогон на живом портфеле — нет.**
Четыре шага (`income`, `tax`, `benchmarks`, `rebalance`) зарегистрированы в
`register_steps`, оба источника выплат (`tinvest_events`, `moex_payouts`) — в реестре
источников, но ни разу не выполнялись против боевой БД: `metrics refresh` с ними ещё не
запускался. Бенчмарки (IMOEX/MCFTR/RGBITR) — данные, не код: пока в `benchmark` не добавлена
ни одна строка, `/analytics/benchmarks` пуст. S&P (вопрос 2) не тронут — по-прежнему только
ручной CSV.
### Фаза 5 — полировка и эксплуатация
Адаптивные раскладки, тёмная тема, offline-кэш с баннером «данные на…», release-сборка
Android, Linux/Windows в CI, пустые/ошибочные состояния, экран настроек, runbook