- область правила — от его заголовка до следующего заголовка любого уровня;
метка открывает блок, хвост после ПОЧЕМУ — продолжение обоснования, а
таблица после модальной метки — часть нормы
- проверка «заглавных модальных слов вне правил нет» стала реализуемой:
прозой считается то, что лежит вне областей правил
- нормы, сидевшие в хвостах, подняты в блок нормы: заведены SLOG-25.4 и
GERR-26.3, у GTIM-12 «базовый слой» заменён на TIME-12
- бумп до 2 откачен: копий в природе нет, читать по версии 1 пока нечему, и
номер сжигать незачем
- вместо истории версий записано правило: номер двигается, когда изменение
формы способно изменить чтение уже разданной копии; правки формы до раздачи
копий его не двигают, а смена словаря под другой язык — не двигает никогда
- метка обоснования пишется заглавными и вошла в словарь набора: скелет
правила теперь целиком из ключевых слов, а не смесь `**ДОЛЖЕН.**` и
`**Почему.**`; в переводе на другой язык метка меняется как остальные слова
(ПОЧЕМУ / WHY), 235 вхождений заменены
- метки правила выделены из шкалы в отдельный перечень: ПОЧЕМУ и
МЕХАНИЗИРОВАНО обязательности не задают, а размечают части, и стандартом не
даются ни в одном языке — раньше МЕХАНИЗИРОВАНО висело строкой в таблице
модальности
- версия языка поднята до 2, потому что изменение формы меняет чтение уже
написанного текста; строка о версии в двенадцати конвенциях перечисляет
теперь и метки, а служебные слова сценария в неё по-прежнему не входят
- «Почему» не пересказывает норму словами обязательства: у оригинала есть
идентификатор, у копии нет, и расходятся они при первой правке оригинала, а
отступление от копии адресовать нечем
- модальность рекомендательная по 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: пути канона в копии не
существует, а словарь и правило заглавных строка несёт сама
- «Почему» у TIME-5 и TIME-6 после перенумерации в dcdd922 указывало на
TIME-3 и TIME-2 вместо KEYS-3 и KEYS-2: массовая замена подставила
префикс своего файла, и ссылки молча поехали на чужие по смыслу правила
- заодно ушли два последних нарушения META-21 — путь `arch/db-identifiers.md`
в тексте конвенции
- 41 ссылка вида `lang/go/logging.md` заменена на «конвенция `logging`»,
идентификатор правила или «базовый слой» для своей же темы
- MIGR-8 больше не отсылает за форматом меток времени, а называет его;
MIGR-11 перенёс ссылку на KEYS-1/KEYS-2 из нормы в «Почему»
- реестр покрывает и обвязку тоже (GUIDE.md), поэтому внутри conventions/
он упирался в путь `../GUIDE.md`; теперь пути даются от корня репозитория
- README дополнен разделом про префиксы и строкой в таблице обвязки
- идентификатор правила теперь `<ПРЕФИКС>-<номер>` вместо `R<номер>`:
префикс уникален по всему канону, поэтому ссылка больше не требует пути
к файлу и не зависит от того, на какой оси файл лежит
- префикс выбирается под файл, а не выводится по формуле, и хранится в
conventions/prefixes.toml вместе с выбывшими; номера сохранены один в
один вместе с дырами
- arch R13: валидное по RFC 3339 значение с чужим офсетом нормализуется при
разборе; канонический вид — обязательство писателя, не контракт с партнёром
- go R13: исключение регистрируется директивой //nolint на месте вызова, а не
exclude-записью в конфиге, которая адресует путём и отвязывается
- R34: глобальный слушатель htmx:responseError — на 5xx htmx ничего не
свопит, и интерфейс замирает без признака сбоя
- R35: 400 вместо поверхности по умолчанию, иначе своп идёт с чужим id
- в R14 снято противоречие: слушатель больше не числится среди
отвергаемых настроек
- R25: 500 и ERROR с признаком непокрытой — без признака забытая ветвь
неотличима в логах от упавшей базы
- R26: HTTP-запрос завершается 500, цикл продолжается со следующего
элемента, а упавший выводится из оборота — иначе poison message
- R20: конфига нет — не стартуем; умолчания существуют для неполного файла,
а не для отсутствующего
- R21: значение поля в сообщении валидатора печатается по тому же признаку
секретности, что у R15 и R16, второй список не заводится
- в перечень проверок R18 добавлен формат идентификаторов сущностей
- R1 больше не ветвится по признаку внешней адресуемости: заранее отличить
внутренние сущности, которые станут внешними, невозможно
- целочисленный ключ остаётся у существующих схем и идёт вместе с
AUTOINCREMENT — переиспользованный rowid молча наводит протухшую ссылку
на другую строку (db-schema R12)
- таблица R5 ограничена внешними источниками, регион «решение» убран
- убраны неверные утверждения: покрытие forbidigo сужено до честного,
таблица классов доменного отказа больше не претендует на полноту,
механизация не подаётся как факт канона
- введены недостающие определения (доменная и внешняя границы, объявление
пути), критерий постоянного поля сведён к одному на R16.1 и R17
- kebab-case имени файла убран из правил в прозу: обоснование не
формулировалось, номер R16 оставлен свободным
- сами конвенции переехали в conventions/, описательное — в корень:
LANGUAGE.md (язык записи) и GUIDE.md (как ведут конвенции)
- conv синхронизирует только conventions/, пути в origin даются
относительно неё — раскладка копий в репозиториях не меняется