Files
elmer/doc/opus-questions.md
T

147 lines
7.8 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.
# Вопросы к Opus 4.8 по проекту elmAI
> v0.35.0-dev, 31 мая 2026
> Сервер: Ubuntu 24, Python/Flask, gunicorn + nginx
> Android: Kotlin, minSdk 24, OkHttp
> LLM: api.aillm.ru, модель gpt-oss-120b
---
## Какие файлы смотреть (и только их)
### Сервер (elmer/)
- `obd/protocol.py` — ELM327 стейт-машина AndrOBD (State, Rsp, AdaptiveTiming)
- `brain/client.py` — Diagnoser (HTTP к LLM API)
- `brain/prompts.py` — SYSTEM_PROMPT для диагностики
- `api/routes.py` — все 5 эндпоинтов (script, upload, chat, ping, ping-llm)
- `api/db.py` — SQLite: таблица sessions (30+ полей)
- `api/scripts.py` — сборка диагностических скриптов
- `api/parser.py` — парсинг ответов ELM327
- `web/app.py` — точка входа Flask
- `doc/architecture.md` — описание архитектуры
### Android (elmer-android/)
- `script/ScriptRunnerService.kt` — сервис фоновой диагностики
- `script/ScriptEngine.kt` — движок выполнения скриптов
- `script/UploadProgress.kt` — таймер прогресса загрузки
- `server/ServerClient.kt` — HTTP-клиент (OkHttp, retry 3x)
- `elm/ElmProtocol.kt` — ELM327 стейт-машина (Kotlin)
- `elm/ObdDecoder.kt` — декодер PID/DTC/VIN
- `ui/MainActivity.kt` — главный экран
- `db/SessionDb.kt` — локальная SQLite
---
## Вопрос 1. Стейт-машина ELM327: баги и крайние случаи
**Файлы**: `obd/protocol.py`, `elm/ElmProtocol.kt`
Стейт-машина — 1:1 копия AndrOBD (ElmProt.java). Ключевые моменты:
- Байт-за-байтом чтение с 1мс поллингом
- `>` как разделитель ответов
- Адаптивный таймаут (200мс ± 4мс)
- Восстановление после BUS ERROR (ATPC → ATSP0)
Вопросы:
1. Есть ли race conditions или deadlocks в переходах состояний?
2. Что если `>` приходит НЕ после полного ответа (мусор в буфере)?
3. Корректна ли логика восстановления после BUS ERROR? Не теряем ли мы ответы при ATPC→ATSP0?
4. Достаточен ли 1мс поллинг или на некоторых ELM нужен меньше?
5. Есть ли риск бесконечного цикла в `_exec()` (10 ретраев)?
---
## Вопрос 2. HTTP 499 при upload с мобильной сети
**Файлы**: `script/ScriptRunnerService.kt`, `server/ServerClient.kt`, `api/routes.py`
**Симптом**: сервер получает POST, но клиент обрывает соединение (nginx: 499).
- Connect timeout: 30с, read: 180с, write: 60с
- 3 ретрая с задержкой 2с
- nginx: client_body_timeout 120s, proxy_read_timeout 300s
- gunicorn: timeout 180s
Вопросы:
1. Какие ещё причины HTTP 499 на мобильной сети кроме таймаутов?
2. Достаточна ли стратегия ретраев? Может, нужен exponential backoff?
3. Может ли проблема быть в отправке тела запроса (write timeout) на медленной сети?
4. Стоит ли разбивать upload на чанки или сжать JSON?
5. Корректно ли мы обрабатываем случай, когда сервер получил запрос но клиент упал — данные могут дублироваться?
---
## Вопрос 3. Архитектура: три модуля + Android пакеты
**Файлы**: `doc/architecture.md`, `web/app.py`, `api/routes.py`
Сервер разбит на `obd/`, `brain/`, `api/`. Android — на `elm/`, `server/`, `script/`, `db/`, `ui/`.
Вопросы:
1. Чистые ли границы между модулями? Нет ли неявных зависимостей?
2. `api/routes.py` делает `from brain.client import Diagnoser` внутри функций — это нормально или лучше на уровне модуля?
3. Стоит ли вынести `config.yaml` из `api/` на уровень выше?
4. `web/app.py` зависит от `api/routes.py` — это правильное направление?
5. Какие модули можно было бы легко заменить (например, `brain/` на локальный LLM)?
---
## Вопрос 4. SQL схема: таблица sessions
**Файлы**: `api/db.py`
Таблица `sessions` — 30+ колонок (IP, телефон, ELM, авто, сессия, LLM). VIN — nullable.
Также старые таблицы: `cars`, `diagnostic_tokens`, `llm_messages`, `ecu_parameters`, `dtc_codes`.
Вопросы:
1. 30+ колонок в одной таблице — это нормально для SQLite или лучше разбить?
2. raw_responses хранится как JSON TEXT — ок ли для SQLite?
3. Индексы: по `created_at`, `vin`, `elm_mac`, `android_id` — достаточны?
4. Старые таблицы (cars, dtc_codes) всё ещё создаются в `_init_schema()` но не используются. Удалять или оставить для совместимости?
5. Нет ли проблем с конкурентным доступом к SQLite из gunicorn (4 воркера)?
---
## Вопрос 5. LLM-интеграция: промпты и таймауты
**Файлы**: `brain/client.py`, `brain/prompts.py`, `api/routes.py`
- Diagnoser использует `requests.post` без streaming
- SYSTEM_PROMPT — 10 правил ответа
- Для /chat — лимит 20 строк, история диалога (последние 10 сообщений)
Вопросы:
1. Достаточен ли промпт для качественной диагностики? Чего не хватает?
2. `requests.post` без streaming при таймауте 180с — ок или лучше streaming + heartbeat?
3. Для /chat: правильно ли форматируется история диалога? Не переполнит ли контекст?
4. Модель gpt-oss-120b — адекватный выбор? Какие альтернативы для авто-диагностики?
5. Как правильно обрабатывать ошибки LLM API (rate limit, timeout, bad response)?
---
## Вопрос 6. Безопасность API
**Файлы**: `api/routes.py`, `web/app.py`
- API без аутентификации, только HTTPS через nginx
- API ключ LLM на сервере, не в APK
- `usesCleartextTraffic` убран из манифеста
Вопросы:
1. Достаточен ли HTTPS без API-ключей для MVP? Какие риски?
2. Какие минимальные меры добавить: rate limiting, API key в APK, CORS?
3. `raw_responses` пишутся в БД — есть ли риск инъекции через ответы ELM327?
4. `/api/v1/chat` без аутентификации — можно ли его абузить (спамить токенами)?
5. Нужно ли скрывать API-ключ LLM за прокси или текущая схема ок?
---
## Формат ответа
Пожалуйста, запиши ответ в файл `/home/naeel/elmer/doc/opus-review.md`.
По каждому вопросу:
- 🔴 Критическая проблема (если есть)
- 🟡 Потенциальная проблема / улучшение
- 🟢 Всё ок
- Конкретные рекомендации с примерами кода где уместно