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 — на английском, остальной текст на русском
