- «Почему» не пересказывает норму словами обязательства: у оригинала есть
идентификатор, у копии нет, и расходятся они при первой правке оригинала, а
отступление от копии адресовать нечем
- модальность рекомендательная по META-6: греп находит слово, а не нарушение
— «за попыткой следует повтор» и «становится обязанностью вызывающего»
описывают ход событий; утверждения о невозможности («нельзя») правилом не
затрагиваются, это ISO-евская возможность в прозе
- SLOG-12 починен: факт о том, что `slog` не разделяет CRITICAL и FATAL, уехал
из нормы в «Почему», а норма теперь говорит то же, что заголовок
- `КОГДА`, `ТОГДА`, `И`, `ИЛИ` (по-английски WHEN/THEN/AND/OR) подчиняются тем
же требованиям, что модальные слова: одна форма на роль, заглавными, набор
один на канон и выбирается под естественный язык
- модальностью они не являются — обязательности не задают, только структуру,
поэтому в строку о версии языка не попадают и под проверку «модальные слова
вне правил» не подпадают
- единственный сценарный блок канона (SLOG, «Два цикла повтора») переписан с
WHEN/AND на русские связки; отказ от `GIVEN/WHEN/THEN` уточнён — он касается
общей формы записи, а на стыке правил эта форма взята сознательно
- 31 регион `<!-- local:имя -->` в двенадцати файлах удалён, а не перенесён:
локальное принадлежит копии и живёт ниже маркера `<!-- conv:local -->`
(META-22), так что наполнять регионы в каноне нечем
- вместе с ними ушли два опустевших раздела «Связано» — в arch и ansible
слоях app-directories канонических ссылок нет, а пустой заголовок ничего
не адресует; CLAUDE.md уточнён: раздел заводят, когда ссылки есть
- форма проверена скриптом: у всех правил модальность и «Почему», префиксы
сходятся с реестром, дыр в нумерации нет
- шкала обязательности объявлена инвариантом, а набор ключевых слов —
параметром естественного языка набора: для английского готовый словарь
даёт BCP 14, для прочих берут перевод стандарта или делают свой; отклонены
синонимы ступеней и `SHALL`, занятый OpenSpec
- применены шесть дельт: нормативно только заглавное написание (RFC 8174),
ДОЛЖЕН требует названного вреда и машинной проверки сразу, ДОПУСКАЕТСЯ
адресовано рецензенту, МЕХАНИЗИРОВАНО выведено из шкалы в отметку рядом с
модальностью (ISO/IEC/IEEE 29148), у таблиц объявлены политика совпадения
и полнота (DMN)
- «Форма записи — LANGUAGE.md» в двенадцати конвенциях заменена строкой о
версии языка по образцу boilerplate BCP 14: пути канона в копии не
существует, а словарь и правило заглавных строка несёт сама
- 41 ссылка вида `lang/go/logging.md` заменена на «конвенция `logging`»,
идентификатор правила или «базовый слой» для своей же темы
- MIGR-8 больше не отсылает за форматом меток времени, а называет его;
MIGR-11 перенёс ссылку на KEYS-1/KEYS-2 из нормы в «Почему»
- идентификатор правила теперь `<ПРЕФИКС>-<номер>` вместо `R<номер>`:
префикс уникален по всему канону, поэтому ссылка больше не требует пути
к файлу и не зависит от того, на какой оси файл лежит
- префикс выбирается под файл, а не выводится по формуле, и хранится в
conventions/prefixes.toml вместе с выбывшими; номера сохранены один в
один вместе с дырами
- arch R13: валидное по RFC 3339 значение с чужим офсетом нормализуется при
разборе; канонический вид — обязательство писателя, не контракт с партнёром
- go R13: исключение регистрируется директивой //nolint на месте вызова, а не
exclude-записью в конфиге, которая адресует путём и отвязывается
- R25: 500 и ERROR с признаком непокрытой — без признака забытая ветвь
неотличима в логах от упавшей базы
- R26: HTTP-запрос завершается 500, цикл продолжается со следующего
элемента, а упавший выводится из оборота — иначе poison message
- R1 больше не ветвится по признаку внешней адресуемости: заранее отличить
внутренние сущности, которые станут внешними, невозможно
- целочисленный ключ остаётся у существующих схем и идёт вместе с
AUTOINCREMENT — переиспользованный rowid молча наводит протухшую ссылку
на другую строку (db-schema R12)
- таблица R5 ограничена внешними источниками, регион «решение» убран
- убраны неверные утверждения: покрытие forbidigo сужено до честного,
таблица классов доменного отказа больше не претендует на полноту,
механизация не подаётся как факт канона
- введены недостающие определения (доменная и внешняя границы, объявление
пути), критерий постоянного поля сведён к одному на R16.1 и R17
- kebab-case имени файла убран из правил в прозу: обоснование не
формулировалось, номер R16 оставлен свободным
- сами конвенции переехали в conventions/, описательное — в корень:
LANGUAGE.md (язык записи) и GUIDE.md (как ведут конвенции)
- conv синхронизирует только conventions/, пути в origin даются
относительно неё — раскладка копий в репозиториях не меняется