---
name: investpilot-notion-audit-2026-07
description: Внешний код-аудит investpilot от Notion AI (JSON-fallback+RiskGuard fail-closed) + разбор урока-вебинара (долг/EBITDA гейт отклонён — нет истории данных)
metadata:
  node_type: memory
  type: project
  originSessionId: 6f344612-b945-4107-b457-8ad2163cd988
  modified: 2026-07-24T07:37:02.972Z
---

Владелец принёс `~/notion-agent-sandbox/workdir/code/investpilot/аудит
investpilot.md` на mac mini (2026-07-24) — независимый code review,
сделанный Notion AI через [[notion_agent_mcp_overview]] (свой чекаут кода
в песочнице). Оценка: код 7/10, стратегия 7.5/10 — разумно, не алармистски.

**Совпадение с собственным аудитом:** приоритет №1 Notion AI (хрупкий
JSON-aware LLM fallback у voter'а) — ровно то же, что я сам нашёл в
correctness-аудите 2026-07-23 (см. [[investpilot_recalibration_overext]]),
но тогда починил только маркировку (`llm_invalid_json`), не поведение.
Два независимых аудита пришли к одному выводу — сильный сигнал реальности
риска. Владелец выбрал приоритеты (не все 5 из аудита): JSON-fallback +
RiskGuard.

**Внедрено:**
1. `signals/analyzer.py::_one_voter` переписан по паттерну `_challenge`
   (который уже делал правильно) — при невалидном JSON переход к следующей
   модели цепочки, а не потеря голоса после ретрая только той же модели.
2. `RiskVerdict.hard_fail` (`trading/risk.py`) — важный нюанс: НЕ сделал
   лимит позиций мульти-ассетным, как звучало в первой формулировке. Разобрал
   код и нашёл, что share-only лимит УЖЕ осознанное решение (докстринг
   `buy_market`: ОФЗ/подушка не должны упираться в лимит стоп-сделок).
   Реальная дыра — fail-closed случай («портфель не читается») по ошибке
   применялся только к акциям вместе с намеренно share-only гейтами. См.
   D40 в Obsidian Decisions.md.

**Why:** внешний независимый аудит — хороший второй набор глаз даже когда
источник (сторонний LLM-сервис) не 100%-доверенный; его находки стоит
проверять по факту (не принимать на слово), но при совпадении с
собственными выводами — сильный сигнал приоритизации.

**How to apply:** при получении similar внешних аудитов (от любого
инструмента/агента) — сверять КАЖДУЮ техническую претензию с реальным кодом
до реализации, не доверять формулировке дословно (пример: «лимит позиций
не мульти-ассетный» технически верно, но неверно как «баг для фикса» —
дизайн был намеренным; реальный баг лежал рядом).

**2026-07-24 (2), связанный кейс — та же дисциплина на идее из урока-
вебинара.** Владелец принёс расшифровку записи (faster-whisper на mini),
там идея гейта «долг/EBITDA». Проверил на живых T-Invest данных ДО
реализации — поле есть, но только текущий снимок (нет истории по датам) →
честный бэктест невозможен (lookahead bias). Гейт НЕ строили (D41), вместо
этого добавили поле в LLM-досье как контекст (не бэктестится индивидуально,
как P/E/ROE). Тот же паттерн: проверять фактическую пригодность данных до
того, как соглашаться строить фичу, даже когда идея кажется разумной.
