schema: spec-driven context: | Language: Russian Пиши на русском, но: - Структурные заголовки оставляй на английском: ## ADDED/MODIFIED/REMOVED Requirements, ### Requirement:, #### Scenario: - Ключевые слова GIVEN/WHEN/THEN и RFC 2119 (SHALL/MUST/SHOULD) — на английском - Технические термины (API, REST, JWT), пути и код — на английском Имена capabilities: - Capability — это ПОВЕДЕНИЕ/домен системы, а не пакет кода (совпадение с именем пакета допустимо, но не критерий). - Существительное, понятное без знания кода: ingest, recognition, file-layout, review, notifications. НЕ qbt/worker (это реализация). - Гранулярность по принципу «требования меняются вместе». Дробить, когда в одной спеке смешиваются разные заботы. Переименовать дёшево (RENAMED Requirements) — не дроби преждевременно в маленьком проекте. RFC 2119 — это требование валидатора, не стиль: - Каждое ### Requirement ОБЯЗАНО содержать литерал SHALL или MUST, иначе `openspec validate` падает (проверено). Поэтому эти слова и WHEN/THEN не русифицируем — они несут точную нормативную/структурную семантику. Ревью (процесс, не артефакт): - Нетривиальная/архитектурная задача — два чекпоинта: ревью дизайна (после design/specs, ДО кода — дешевле чинить направление) и ревью кода (после apply, до archive). - Тривиальная задача — достаточно одного прохода (код). Конвенции кода (соблюдать при apply): - Логирование — только log/slog (структурированный JSON), без fmt.Println. Логируем все вызовы внешних сервисов; healthcheck-эндпоинты — на DEBUG. Детали: уровни, обязательные поля — docs/conventions/logging.md. - Безопасность: никаких секретов в полях логов (пароли qBittorrent, API-ключи LLM/метабаз, auth-заголовки). - Конфигурация — только TOML; секреты рендерит деплой (Ansible+Vault) в файл (config.toml не коммитится, 0600), env для конфига не используем; валидация на старте. Детали: docs/conventions/config.md. - Ошибки — stdlib, обёртка с контекстом (fmt.Errorf("...: %w", err)), проверка errors.Is/errors.As, трансляция доменной ошибки в ответ на внешней границе (наружу не отдаём текст внутренней ошибки). Детали: docs/conventions/errors.md. - Время — всегда с явным TZ (сервер в Europe/Moscow; логи — в UTC). # Project context (optional) # This is shown to AI when creating artifacts. # Add your tech stack, conventions, style guides, domain knowledge, etc. # Example: # context: | # Tech stack: TypeScript, React, Node.js # We use conventional commits # Domain: e-commerce platform # Per-artifact rules (optional) # Add custom rules for specific artifacts. rules: proposal: - Capabilities называй по поведению/домену системы, не по пакету кода specs: - Каждое ### Requirement обязано содержать SHALL или MUST (иначе валидация падает) - Заголовки и WHEN/THEN/GIVEN — на английском, остальной текст на русском