# Block 0: Rules & Conventions — VoIdea Конституция проекта VoIdea. Применяется ко всем блокам. Если в специфичном блоке нет явного описания ситуации — решение принимается по правилам Block 0. --- ## 1. Code Style Standards **Python (PEP8 + автоматизация):** - Кодировка UTF-8, отступы 4 пробела - Максимальная длина строки: 88 символов ( uff format / lack) - Именование: переменные/функции — snake_case, классы — PascalCase, константы — UPPER_SNAKE_CASE - Аннотации типов — обязательны для аргументов и возвращаемых значений всех функций - Строки: двойные кавычки " для данных, одинарные ' для docstrings - Импорты: stdlib → third-party → local (алфавитный порядок внутри групп). Абсолютные импорты, относительные запрещены - Пробелы: вокруг операторов, не внутри скобок **SQL:** - Ключевые слова — UPPERCASE (SELECT, FROM, WHERE) - Имена таблиц и полей — snake_case - Сложные запросы разбивать на строки, выравнивать JOIN и WHERE **Оптимальный размер файла:** - Если файл маршрутов/контроллеров превышает 500 строк — разбить на модули **JavaScript/TypeScript (Web/PWA):** - Formatter: Prettier (100 символов) - Linter: ESLint с правилами irbnb + eact - Типы: strict TypeScript, any запрещён - Импорты: абсолютные через @/ alias - Стили: Tailwind CSS - Состояние: zustand или RTK - Асинхронность: sync/await вместо .then() --- ## 2. Documentation - Docstrings: Google-формат для всех публичных классов, функций, методов - TODO/FIXME: с указанием причины и планируемого срока. # TODO(#TASK-N): причина - Предупреждения о рисках: если код затрагивает безопасность, производительность или совместимость - README.md: в каждой папке pp/* — краткое описание файлов внутри --- ## 3. Naming Conventions **Переменные окружения:** ` PROJECT_NAME=VoIdea PROJECT_VERSION=X.Y.Z PROJECT_ENV=local|development|staging|production SERVER_HOST=X.X.X.X SERVER_PORT=8020 SERVER_EXTERNAL_URL=http://X.X.X.X:8020 DB_HOST=localhost DB_PORT=5432 DB_NAME=voidea DB_USER=voidea DB_PASS= REDIS_HOST=localhost REDIS_PORT=6379 AI_YANDEX_KEY= AI_GIGACHAT_KEY= AI_FALLBACK_MODEL=yandex_gpt AI_TIMEOUT=10 OAUTH_YANDEX_ID= OAUTH_YANDEX_SECRET= OAUTH_GOOGLE_ID= OAUTH_GOOGLE_SECRET= SMTP_HOST= SMTP_PORT= SMTP_USER= SMTP_PASS= ` **Индексы БД:** ` ix_tablename_column uq_tablename_column fk_tablename_column ` **Ветки Git:** ` main → стабильная, продакшен develop → интеграция фич feature/* → новая функция hotfix/* → срочное исправление release/* → подготовка релиза ` **Миграции Alembic:** ` {действие}_{таблица} ` --- ## 4. Git & Versioning ### 4.1 Формат SemVer: MAJOR.MINOR.PATCH ### 4.2 CHANGELOG Формат: единый файл CHANGELOG.md с разделами по MINOR-версисиям Новый файл создаётся при смене X (major) или Y (minor): ` CHANGELOG/ ├── v1.0.md # 1.0.0 → 1.0.n (патчи добавляются в этот файл) ├── v1.1.md # 1.1.0 → 1.1.n (новый файл) └── v2.0.md # 2.0.0 → ... ` ### 4.3 Conventional Commits ` <тип>[optional scope]: <описание> ` - eat: новая функция → MINOR - ix: исправление → PATCH - BREAKING: в теле коммита → MAJOR - docs, efactor, est, chore: не влияют на версию ### 4.4 Agent Versioning Агенты версионируются независимо от проекта по SemVer (A.B.C). **Правила бампа:** - **A (major)**: breaking change в публичном интерфейсе агента - **B (minor)**: новая capability (метод, роль, prompt) - **C (patch)**: внутренние правки без изменения поведения **Механика:** - Каждый агент после `run()` вычисляет SHA256 checksum своего файла - Сравнивает с `AgentConfig.checksum` в БД - Не совпал → авто-бамп patch, запись в `CHANGELOG/agents/.md` - EvolutionAgent управляет minor/major бампами **Формат changelog:** ```markdown CHANGELOG/agents/ ├── doc_agent.md ├── audit_agent.md └── ... ``` --- ## 5. Code Review - Обязателен для всех PR в main и develop - Минимум 1 апрув от admin/owner - Чеклист ревью: - [ ] Нет секретов в коде - [ ] Нет сырых Exception в API ответах - [ ] Есть тесты (или TODO с причиной) - [ ] docs/blocks/*.md обновлён - [ ] ADR создан при архитектурных изменениях --- ## 6. Definition of Done (DoD) - [ ] Код написан (соответствует стилю §1) - [ ] Линт проходит ( uff check — 0 errors) - [ ] Тесты написаны (минимум 1 smoke) - [ ] Тесты проходят (pytest — green) - [ ] Документация блока обновлена - [ ] .env.example обновлён (если новая переменная) - [ ] Миграция написана (если менялась БД) --- ## 7. Architecture (SOLID + слоистая) **Слои (зависимости только внутрь):** ` API → Services → Integrations → Data Layer → Core ` **SOLID:** - S: каждый блок — одна доменная область - O: новые интеграции — новые классы - L: сервисы подчиняются общему интерфейсу - I: сервис принимает только нужные зависимости - D: API зависит от абстракции Service --- ## 8. Error Handling | Слой | Действие | |------|---------| | API | HTTPException с detail и status_code | | Services | Бизнес-исключения без HTTP-статусов | | Integrations | ry/except с fallback | | DB | Ошибки БД не всплывают выше | | WebUI | Flash-сообщение пользователю | --- ## 9. Security Base - .env — всегда в .gitignore - JWT: алгоритм HS256, expire = 60 минут, refresh = 30 дней - Пароли: bcrypt через passlib - Pydantic валидация на всех входах - RBAC: роли user, dmin, owner --- ## 10. Logging Standards **Формат строки лога:** ` [ISO8601] [LEVEL] [component] message key=val 2026-05-10T14:30:00.000Z INFO [auth] User logged in user_id=abc ` **Уровни по слоям:** | Слой | DEBUG | INFO | WARNING | ERROR | |------|-------|------|---------|-------| | API | Параметры | Request | — | 5xx | | Service | Входные | Операция | Превышен лимит | Ошибка БД | | Integration | Raw ответ | Успех | Timeout | Внешний API | **Запрещено:** f-строки в logger. Только %s (lazy evaluation). **Разрешено:** f-строки в logging_service.log(). --- ## 11. Sensitive Data Policy **Никогда не логировать:** - Пароли (даже хэш) - JWT токены - API keys и секреты - Email в открытом виде (логировать user_id) **Маскировать в логах:** - Email: u***@mail.ru - IP: 195.208.*.* --- ## 12. Third-party Call Fallback Pattern ` 1. Попытка (timeout: 10s) 2. Успех → return data 3. Таймаут → retry 1 (через 2s) 4. Таймаут → retry 2 (через 5s) 5. 4xx → WARNING, return None/fallback 6. 5xx → ERROR, retry → если снова 5xx → return None/fallback 7. Все retry исчерпаны → CRITICAL в SystemLog, возврат fallback ` --- ## 13. Performance Budgets | Метрика | Лимит (p95) | |---------|-------------| | API response (без GPT) | < 500ms | | DB query (одиночный) | < 100ms | | DB query (агрегатный) | < 300ms | | GPT call | < 5s (иначе fallback) | | WebUI page load | < 2s | --- ## 14. Data Retention Policy | Данные | Срок хранения | |--------|---------------| | SystemLog | 90 дней | | SecurityEvent | 1 год | | Notification | 30 дней | | PaymentTransaction | 5 лет | | User data | До удаления + 30 дней | | Session (JWT) | 24 часа | --- ## 15. Dependency Management - **patch**: в любой момент (bugfix, security) - **minor**: не чаще 1 раза в спринт - **major**: только с полным регрессом --- ## 16. Async/Sync Decision Matrix | Сценарий | Механизм | |----------|----------| | GET-запросы, CRUD | sync (await) | | Отправка email | Celery async | | GPT вызовы | Celery async | | Бэкапы | Celery async | | WebSocket / SSE | Не используется | --- ## 17. Architecture Decision Records (ADR) Любое значимое архитектурное решение фиксируется в docs/adr/NNN-title.md. Формат: `markdown # ADR-001: Название решения Статус: принято Контекст: описание проблемы Решение: что выбрано Последствия: плюсы и минусы ` --- ## 18. Tooling | Инструмент | Назначение | |------------|------------| | ruff | Линтер (E, F, W, I, N, UP) | | ruff format | Форматтер (line-length=88) | | mypy | Type checker | | pytest | Тесты (asyncio_mode=auto) | | pre-commit | Хуки (ruff, ruff-format, trailing-whitespace) | --- ## 19. AI Agents (11 ролей) | Роль | Провайдер | Описание | |------|-----------|----------| | Координатор | Yandex GPT | Управляет диалогом, обобщает результаты | | Организатор задач | Yandex GPT | Разбивает идею на шаги | | Бизнес-аналитик | Yandex GPT | Оценивает ROI, сроки, аудиторию | | Юрист | GigaChat | Проверяет соответствие законам РФ | | Финансовый консультант | Yandex GPT | Составляет смету, прогноз доходов | | Архитектор решений | Yandex GPT | Проектирует архитектуру | | Тестировщик | Yandex GPT | Составляет тест-кейсы | | UI-дизайнер | Yandex GPT | Прорабатывает интерфейс | | SMM-специалист | Yandex GPT | Планирует продвижение | | Лайф-коуч | Yandex GPT | Помогает ставить цели | | Эксперт по доступности | Yandex GPT | Проверяет инклюзивность | **Промпты хранятся в:** docs/agent_prompts.yaml (TDC) --- ## 20. System Agents (11 агентов) | Агент | Назначение | |-------|-----------| | DocAgent | Документация, комментарии, Runbook | | AuditAgent | Соблюдение правил, прогресс проекта | | SecurityAgent | Безопасность, уязвимости, 152-ФЗ | | SpecAgent | Спецификации, версионирование **проекта**, CHANGELOG | | ObserverAgent | Наблюдение за пользователями, генерация идей | | QATesterAgent | Функциональное тестирование, временные аккаунты | | FixAgent | Исправление багов, анализ логов | | UITestAgent | Визуальное тестирование | | RolloutAgent | Постепенное развёртывание (3→1%→5%→15%→100%) | | EvolutionAgent | Саморазвитие и **версионирование агентов** | | BacklogAgent | Управление отложенными задачами | **Триггеры запуска:** - Автоматически: pre-commit, push, daily cron - Вручную: кнопка в админ-панели --- ## 21. Design System Единый источник истины: docs/design-system/tokens.json | Файл | Назначение | |------|------------| | tokens.json | Единый источник (JSON) | | tokens.yaml | YAML версия для документации | | generators/*.py | Генераторы для платформ (CSS, Swift, Kotlin) | **Темы:** system (auto), dark, light **Форматы:** CSS Variables, Swift, Kotlin XML --- ## 22. Testing Standards - Модульные тесты — в ests/unit/ - Интеграционные тесты — в ests/integration/ - E2E сценарии — в docs/specs/e2e/ - Минимум: 1 smoke-тест на endpoint - Фикстуры: conftest.py в корне ests/ --- ## 23. Migration Policy - Alembic, async, одна миграция на одно изменение - Обратно совместимы (без breaking changes) - Название: {revision}_{action}_{table}.py --- ## 24. API Version Lifecycle ` Текущая: /api/v1/* — стабильная Deprecation: 3 месяца после выхода новой версии Отключение: 410 Gone ` --- ## 25. Module Public API Convention __init__.py содержит ТОЛЬКО публичный API модуля: `python from app.models.user import User __all__ = ["User", ...] ` --- ## 26. Project Glossary Глоссарий: docs/blocks/GLOSSARY.md | Термин | Значение | |--------|----------| | Idea | Основная сущность проекта (записанная пользователем) | | Agent | ИИ-агент для анализа идей (11 ролей) | | System Agent | Автоматический агент для поддержки проекта (11 штук) | | Backlog | Система отложенных задач/идей | | Rollout | Постепенное развёртывание | | Design Tokens | Единый источник стилей | --- ## 27. OAuth & Auth **Провайдеры:** - Email + пароль (классика) - Яндекс OAuth - Google OAuth - Apple OAuth (отложено) **Схема:** Один пользователь = один провайдер (нельзя привязать Google если уже есть Яндекс) --- ## 28. Car Integration (Roadmap) ГУ автомобиля — изучить и добавить в будущем: - Android Auto / Apple CarPlay - Bluetooth HID - Подключение кнопок руля --- *Документ создан: 2026-05-10* *Обновлён системными агентами автоматически*