Анти-отпечаток
Отдельная глава, потому что это отдельная проблема.
Код, написанный языковой моделью без стандарта, узнаётся мгновенно: не по ошибкам, а по тяготению к середине распределения. Модель выбирает самое вероятное имя (handleData, processItems, utils.ts), самый вероятный комментарий (пересказ следующей строки), самую вероятную защиту (try/catch вокруг чистой функции). Получается код без автора.
Ровно то же происходит с человеком, который пишет «как принято» и ни разу не спросил, почему принято именно так.
Правила стандарта убирают это как побочный эффект: закрытый словарь глаголов физически не содержит handle, теговые комментарии не позволяют пересказ, роли файлов не оставляют места для utils.ts. Дополнительно запрещено:
| Тик | Почему |
|---|---|
| Эмодзи в коде, логах, коммитах | Лог читает grep |
// Шаг 1:, // Step 2: | Пересказ потока управления |
| JSDoc, повторяющий сигнатуру | Типы уже написаны и проверяются компилятором |
const result = await x(); return result | Переменная на одну строку |
?. там, где тип не допускает null | Защита от невозможного маскирует настоящие баги |
try/catch вокруг чистой функции | Чистая функция не отказывает |
// ============ | Структуру задаёт разбиение на файлы |
Enhanced, Advanced, V2 в именах | Оценка вместо описания |
Что GRAIN сознательно не регламентирует
Стандарт, который лезет во всё, перестаёт быть инженерным документом.
| Не наше дело | Почему |
|---|---|
| Отступы, кавычки, точки с запятой, длина строки | Работа форматтера. Спор об этом не стоит ни одной минуты |
| Выбор библиотек и фреймворков | Зависит от задачи и меняется чаще, чем стандарт |
| Слоистая архитектура, DDD, гексагоны | GRAIN задаёт направление зависимостей и роли файлов; какую школу строить поверх — решает команда |
| Стиль коммитов и ветвление | Другой документ, другая дисциплина |
| Покрытие тестами в процентах | Метрика, которой легко соврать |
Как спорить со стандартом
Правило, которое мешает, — повод его изменить, а не тихо обойти.
- Приведи код, где правило делает хуже. Не описание, а код.
- Предложи правку словаря
grain.synxи документа — одним изменением, они меняются только вместе. - Пока правка не принята — работает
// grain:allow <правило> — <причина>. Причина обязательна: она и есть аргумент в споре.
Стандарт без процедуры изменения превращается в скрижаль, а скрижаль обходят молча.