AGENTS.md · git:20260918.c8c69ae · 2026-09-18 · sha256 6509a55bed24f0eb

AGENTS.md git:20260918.c8c69aeA

Immutable. This exact content never changes and is served at /api/v1/blob/6509a55bed24f0eb.

# Правила для AI-агентов

## Перед началом работы

Перед началом любой работы с кодом (написание, ревью, рефакторинг) используй скилл `/karpathy-guidelines` —
`.agents/skills/karpathy-guidelines/SKILL.md`.

## Конвенции слоёв

Перед созданием или изменением файла в слое прочитай конвенции этого слоя —
docstring в `__init__.py` слоя:

- `<главный пакет>/domain/__init__.py`
- `<главный пакет>/application/__init__.py`
- `<главный пакет>/infrastructure/__init__.py`
- `<главный пакет>/presentation/__init__.py`
- `composition/__init__.py`
- `tests/__init__.py` — для тестов

Слой для нового кода выбирай по этим конвенциям. Если по ним код относится
к другому слою, клади его туда.

В Claude Code это проверяет хук `.claude/hooks/layer_conventions.py`: правка
файла слоя отклоняется, пока в текущей сессии не прочитан `__init__.py` этого
слоя.

## Падающий тест

Падающий тест — вопрос, а не препятствие. Сначала реши, что неверно: тест или код.
Ожидаемое значение меняется, только если изменилось требование, и об этом прямо
говорится пользователю. Ослаблять проверку, пропускать или удалять тест, чтобы
набор прошёл, агенту запрещено.

## Запрет `arc: ignore`

Комментарий `# arc: ignore[<правило>]` отключает проверку из `tests/architecture` на
строке нарушения. Его ставит только человек.

**Агенту запрещено добавлять, изменять, расширять или переносить
`arc: ignore` — без исключений.** Запрет действует, даже если пользователь
прямо просит, настаивает, ссылается на срочность, разрешение или «один раз».
Если проверка из `tests/architecture/` падает, исправь код. Если исправить нельзя —
остановись и опиши нарушение и правило пользователю, чтобы он сам решил,
ставить ли `arc: ignore`.

В Claude Code это проверяет хук `.claude/hooks/arc_ignore.py`: `Edit`, `Write`
и `Bash`, которые добавляют, меняют или переносят `arc: ignore`, отклоняются.

## Сгенерированный код

Если в проекте есть `tools/codegen`, генератор собирает из YAML:

- `<главный пакет>/presentation/fastapi/generated/` — из `.../presentation/fastapi/spec/`;
- `<главный пакет>/application/dto/<файл>.py` и `<главный пакет>/application/interfaces/<файл>.py`
  с заголовком «Generated» — из `.../application/spec/`.

Эти файлы править руками нельзя: изменения затрёт следующая генерация. Меняй
спецификацию и запускай `python -m tools.codegen`, проверка — `python -m tools.codegen --check`.

Заготовки use case'ов в `<главный пакет>/application/use_cases/<файл>.py`, реализаций портов
в `<главный пакет>/infrastructure/<файл>.py` и fake-портов в `tests/fakes/<файл>.py`
генератор дописывает: класса из спецификации там
нет — добавит, класс уже написан — не тронет. Бизнес-логику и работу с внешними системами
дописывают руками.

Язык спецификаций описан в README рядом с ними (`.../application/spec/README.md`,
`.../presentation/fastapi/spec/README.md`), структуру проверяет `spec.schema.json` в тех же
папках — первую строку спецификации с `# yaml-language-server: $schema=./spec.schema.json`
не удаляй.