papayu/docs/IMPROVEMENT_ROADMAP.md
Yuriy 65e95a458d feat: мульти-провайдер LLM, тренды дизайна, Snyk/Documatic sync, личная автоматизация
- Мульти-провайдер: PAPAYU_LLM_PROVIDERS — сбор планов от нескольких ИИ (Claude, OpenAI), агрегация
- Тренды дизайна и иконок: вкладка в модалке, поиск по безопасным доменам (Tavily include_domains)
- Snyk Code: PAPAYU_SNYK_SYNC, REST API issues → snyk_findings в agent-sync
- Documatic: architecture_summary из .papa-yu/architecture.md в agent-sync
- Личная автоматизация: capability personal-automation (терминал git/npm/cargo, открытие URL)
- agent_sync расширен: snyk_findings, architecture_summary; analyze_project_cmd и run_batch пишут sync
- Документация: SNYK_AND_DOCUMATIC_SYNC.md, SECURITY_AND_PERSONAL_AUTOMATION.md, обновлён CLAUDE_AND_AGENT_SYNC

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-10 15:05:39 +03:00

106 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Практические рекомендации по улучшению papa-yu
Упорядочено по эффекту/риску. Привязано к стеку: Rust, Tauri, CI в GitHub Actions, `cargo test` + golden traces, частичные SSRF-защиты, нет формализованных инцидентов/метрик.
---
## 1) Самое важное: закрыть класс рисков SSRF / небезопасный fetch (Security, Critical/High)
### Что сделать
1. **Единая точка сетевого доступа** — вынести все HTTP-запросы в один модуль (`net::client`), запретить прямой `reqwest::get()` где попало.
2. **Политика allowlist + запрет приватных сетей**
- разрешённые схемы: `https``http` только если надо)
- запрет `file://`, `ftp://`, `gopher://`, `data:` и т.п.
- запрет IP: RFC1918, loopback, link-local
- защита от DNS-rebind (резолвить и проверять IP)
3. **Таймауты и лимиты** — connect/read timeout, max size ответа, ограничение редиректов.
4. **Тесты на SSRF** — набор URL → ожидаемый "deny", golden traces для фиксации отказов.
---
## 2) Минимальная наблюдаемость и журнал инцидентов (Ops, High)
### MVP за 12 дня
1. **Единый структурированный лог** — JSON, уровни error/warn/info/debug, корреляционный id, без секретов.
2. **Метрики уровня приложения** — latency ключевых операций, количество ошибок по типам.
3. **`INCIDENTS.md`** — шаблон: дата, версия, симптом, impact, причина, фикс, тест на повтор.
---
## 3) Усилить CI/CD как quality gate (DevEx/Quality, High)
### Минимальный набор гейтов
1. `cargo fmt --check`, `cargo clippy -- -D warnings`
2. `cargo test` (включая golden traces)
3. `cargo deny`, `cargo audit` — supply chain
4. (Опционально) SBOM для релизов
---
## 4) Архитектурные границы (Architecture/Tech debt, Medium/High)
- Чёткие слои: `domain` (без IO) → `services``adapters``tauri_api`
- ADR для 35 ключевых решений
---
## 5) Качество кода (Medium)
- Лимиты сложности, `thiserror` для доменных ошибок, вычистка dead code.
---
## 6) Производительность (Medium)
- Выделить 35 «дорогих» операций, измерять время/память, микробенчи (`criterion`).
---
## Приоритизированный roadmap
| Фаза | Срок | Действия |
|------|------|----------|
| Quick wins | 15 дней | SSRF: единая точка + denylist + таймауты; CI: fmt/clippy/test + cargo audit/deny; INCIDENTS.md + логи |
| Mid-term | 13 нед | Архитектурные границы; ADR; метрики по 35 операциям |
| Long-term | 12 мес | SBOM; property-based тесты; формализация SLO |
> **Выполнено (2025-01-31):** см. `docs/IMPROVEMENT_REPORT.md`
---
## Приложение: ответы на запрос данных для точного плана
### 510 строк: функции fetch/скачивание/импорт и источник URL
| Функция / модуль | URL откуда | Защита |
|------------------|------------|--------|
| `online_research/fetch.rs``fetch_url_safe()` | URL из ответа **Tavily Search API** (результаты поиска) | ✅ SSRF: localhost, RFC1918, link-local, `user:pass@`, max 2048 символов |
| `online_research/search.rs` | POST `https://api.tavily.com/search` — фиксированный URL | ✅ Не извне |
| `llm_planner.rs`, `weekly_report.rs`, `domain_notes/distill.rs`, `online_research/llm.rs` | `PAPAYU_LLM_API_URL` из env (OpenAI/Ollama) | ⚠️ Конфиг, не от пользователя |
**Единственный «внешний» URL-поток:** Tavily возвращает URL в результатах поиска → `fetch_url_safe()` их скачивает. Уже есть `is_url_allowed()` и лимиты.
### Хранение данных и синхронизация
- **Файлы JSON**, без БД:
- `store/`: `projects.json`, `project_profiles.json`, `sessions.json` в `app_data_dir`
- `.papa-yu/notes/domain_notes.json` — заметки по проекту
- `.papa-yu/cache/online_search_cache.json` — кеш Tavily
- `.papa-yu/traces/*.json` — трассировки
- `.papa-yu/project.json` — настройки проекта
- **Синхронизации нет** — только локальные файлы.
### 3 главные боли (по коду и статусу)
1. **llm_planner.rs** — большой модуль, протоколы v1/v2/v3, fallback-логика, repair, memory patch. Сложно тестировать и менять.
2. **PATCH/EDIT apply** — ERR_EDIT_AMBIGUOUS, ERR_EDIT_BEFORE_NOT_FOUND, base_sha256 mismatch; fallback v3→v2→v1 добавляет ветвления.
3. **Golden traces** — при изменении JSON Schema нужно обновлять `schema_hash` во всех фикстурах; легко забыть и сломать CI.