- META-37: тема называется решением и адресатом, а не ролью части проекта;
логи сервера и браузера — logging и client-logging, а не суффиксная пара
- META-38: ось слоя объявляется ключами lang/stack в шапке, а не выводится
из пути — переезд файла между директориями иначе молча менял состав копии
у каждого потребителя; шапки двенадцати конвенций приведены к правилу
- в список проверок добавлены объявление оси, единственность базового слоя
и совпадение объявленного с директорией
- тема определяется решением, а не веществом (META-33) и нужна потребителю
целиком (META-34); слой сужает базу, но не отменяет её (META-35), иначе
это другая тема, а вид приложения называется в области действия (META-36)
- добавлен раздел «Как проверить границу темы»: пять вопросов со ссылками
на правила, включая META-20; те же строки в CLAUDE.md, а в LANGUAGE.md
оговорка, что граница темы языку не принадлежит
- в TODO заведён прогон восьми тем по критериям с разбором подозреваемых:
шесть правил time выносят вердикты чужих тем, logging мешает три страта
- пятая, необязательная часть правила: код парой «плохо → хорошо» после
обоснования; метка добавлена в словарь (EXAMPLES) и в строку о версии
языка во всех тринадцати файлах
- сказано, чем примеры не являются: требований в блоке нет, дословным
сниппетом он не служит, при расхождении с нормой правят пример
- READING.md обновлён по META-30, в машинные проверки добавлен порядок
блоков, в читательские — что примеры норму не расширяют
- три клетки «что взято» правились по факту: DMN даёт политику совпадения,
но не требует полноты; в 29148 обоснование — рекомендуемый атрибут; вывод
про обязательность шаблона в EARS не сформулирован
- заведён раздел «Где источник усилен»: полнота таблиц, обязательность
обоснования и вывод из EARS предъявлены как наши решения с доводами
- поправлены два места, где та же натяжка повторялась прозой: «Таблицы
решений» и «Обоснование обязательно»
- META-31 и META-32: номера идут без пропусков, ссылка обязана разрешаться;
обе проверки стали механическими — данных со стороны языка им хватает
- заведена метка СНЯТО: заголовок и номер снятого правила сохраняются, норму
с обоснованием заменяет блок с датой и причиной, отдельный реестр снятых
номеров не нужен
- META-9, META-16 и META-26 переписаны из таблицы «Освободившиеся номера» в
заглушки; три висячие ссылки, тянувшиеся с утра, закрылись
- заведён READING.md: словарь со значениями, форма правила и её граница,
ссылки, локальная часть — без разделов о ведении набора и без META-ссылок,
примеры на X-префиксах
- сборщик кладёт его в docs/conventions/ и перезаписывает целиком; в манифест
набора добавлена секция [language] с версией и двумя документами
- META-30: правка словаря или состава частей правила доходит до READING.md,
иначе потребитель толкует ДОПУСКАЕТСЯ по прежней версии
- META-9 снят: удаление оставляло подписчика, пришедшего после, без нормы и
без проверки, а «механизировано у всех» канону не проверить — списка
подписчиков у него нет по построению
- META-8 переписан в запрет: норма остаётся в правиле, чем бы её ни
проверяли; линтер сообщает, что нарушено, но не что требуется (META-6)
- МЕХАНИЗИРОВАНО объявлена свойством репозитория: в тексте конвенции отметки
нет, её место — запись о механизации ниже маркера (META-7)
- проверки разведены по роли слова: то, что язык употребляет (конвенции и
GUIDE.md), проверяется; то, что цитирует (LANGUAGE.md, README.md), — нет
- список машинных проверок разбит на форму правила и распространение:
вторая группа (тема в шапке, пути канона, чужие префиксы, локальные X)
касается только того, что едет к потребителю
- в GUIDE.md добавлена строка о версии языка и убрано заглавное СЛЕДУЕТ из
вводной прозы «Оформления» — единственное нарушение, которое исключение
прятало
- тема — набор правил об одном фокусе разработки, имя латиницей (нижний
kebab-case рекомендуется, годится любой идентификатор, пригодный для имени
файла); определение в LANGUAGE.md и README.md
- заведены META-28 и META-29: тема объявляется в шапке (`topic:`), стоит в
манифесте набора и не переиспользуется; `topic:` добавлен во все 12 файлов
- prefixes.toml и topics.toml слиты в manifest.toml — манифест набора против
манифеста подключения `.conventions.toml`, разделы topics/prefixes с live
и retired
- живые идентификаторы KEYS-5, SLOG-8.1, SLOG-27, MIGR-2/4/6 в примерах
заменены на XKEY, XMIG, XLOG: номера канона означали не то, что в примере,
и расходились дальше при каждой перенумерации
- сказано явно, что описание языка ни на один набор конвенций не опирается;
ссылка на обоснования канона в разделе про ПОЧЕМУ заменена на внешние
практики
- область правила — от его заголовка до следующего заголовка любого уровня;
метка открывает блок, хвост после ПОЧЕМУ — продолжение обоснования, а
таблица после модальной метки — часть нормы
- проверка «заглавных модальных слов вне правил нет» стала реализуемой:
прозой считается то, что лежит вне областей правил
- нормы, сидевшие в хвостах, подняты в блок нормы: заведены SLOG-25.4 и
GERR-26.3, у GTIM-12 «базовый слой» заменён на TIME-12
- META-6 переписан: ступень требует не машинной проверки, а того, чтобы
двое проверяющих по тексту правила выносили один вердикт; проверяющий по
умолчанию — читатель, человек или агент
- заведён META-27: машинная проверка желательна везде, где пишется, но
ступени не задаёт — иначе канон стоит в СЛЕДУЕТ до появления скриптов;
обоснование META-25 пересобрано на новом условии
- LANGUAGE.md и CLAUDE.md приведены к той же формулировке, вопрос 1 из
TODO закрыт, остальные перенумерованы
- бумп до 2 откачен: копий в природе нет, читать по версии 1 пока нечему, и
номер сжигать незачем
- вместо истории версий записано правило: номер двигается, когда изменение
формы способно изменить чтение уже разданной копии; правки формы до раздачи
копий его не двигают, а смена словаря под другой язык — не двигает никогда
- метка обоснования пишется заглавными и вошла в словарь набора: скелет
правила теперь целиком из ключевых слов, а не смесь `**ДОЛЖЕН.**` и
`**Почему.**`; в переводе на другой язык метка меняется как остальные слова
(ПОЧЕМУ / WHY), 235 вхождений заменены
- метки правила выделены из шкалы в отдельный перечень: ПОЧЕМУ и
МЕХАНИЗИРОВАНО обязательности не задают, а размечают части, и стандартом не
даются ни в одном языке — раньше МЕХАНИЗИРОВАНО висело строкой в таблице
модальности
- версия языка поднята до 2, потому что изменение формы меняет чтение уже
написанного текста; строка о версии в двенадцати конвенциях перечисляет
теперь и метки, а служебные слова сценария в неё по-прежнему не входят
- запрет слов обязательства в «Почему» был лишним по построению: правило о
заглавных уже делает строчное «обязан» ненормативным, так что второй копии
нормы не возникает, а цена — автор воюет со списком слов вместо объяснения
- в LANGUAGE записано прямо: рамки у обоснования только смысловые, длина,
рассуждение, примеры и ссылки на внешние практики и чужие проекты допустимы
- заведён раздел «Освободившиеся номера»: META-16 и META-26 с причинами. Без
такого списка упоминание номера в прозе не отличить от ссылки на исчезнувшее
правило — это же нужно будущей проверке ссылок
- «Почему» не пересказывает норму словами обязательства: у оригинала есть
идентификатор, у копии нет, и расходятся они при первой правке оригинала, а
отступление от копии адресовать нечем
- модальность рекомендательная по META-6: греп находит слово, а не нарушение
— «за попыткой следует повтор» и «становится обязанностью вызывающего»
описывают ход событий; утверждения о невозможности («нельзя») правилом не
затрагиваются, это ISO-евская возможность в прозе
- SLOG-12 починен: факт о том, что `slog` не разделяет CRITICAL и FATAL, уехал
из нормы в «Почему», а норма теперь говорит то же, что заголовок
- ДОЛЖЕН выбирается, только когда в «Почему» сказано, что ломается при
нарушении: до сих пор обязывало лишь второе условие (META-6, машинная
проверка), и любую проверяемую мелочь можно было пометить ДОЛЖЕН
- модальность самого правила — СЛЕДУЕТ, и это не слабость: «вред назван»
устанавливается чтением, значит по META-6 иначе и быть не может
- kebab-case в именах файлов пересобран как пример META-25: проверяется
регуляркой тривиально, но вреда нет — потому правилом и не записан
- `КОГДА`, `ТОГДА`, `И`, `ИЛИ` (по-английски WHEN/THEN/AND/OR) подчиняются тем
же требованиям, что модальные слова: одна форма на роль, заглавными, набор
один на канон и выбирается под естественный язык
- модальностью они не являются — обязательности не задают, только структуру,
поэтому в строку о версии языка не попадают и под проверку «модальные слова
вне правил» не подпадают
- единственный сценарный блок канона (SLOG, «Два цикла повтора») переписан с
WHEN/AND на русские связки; отказ от `GIVEN/WHEN/THEN` уточнён — он касается
общей формы записи, а на стыке правил эта форма взята сознательно
- языковой и стековый слои называют идентификатор правила арх-слоя своей темы
прямо в норме: подписываются темой, а не слоем, поэтому базовый слой в
собранной копии присутствует всегда и ссылка не ведёт в пустоту
- разрешение узкое по построению — на слои других языков и стеков не
распространяется, их состав в копии зависит от манифеста
- из META-21 убрано предписание ссылаться на свой слой словами «базовый
слой»: слова не проверяются и не ведут к утверждению, а идентификатор ведёт
- шкала обязательности объявлена инвариантом, а набор ключевых слов —
параметром естественного языка набора: для английского готовый словарь
даёт BCP 14, для прочих берут перевод стандарта или делают свой; отклонены
синонимы ступеней и `SHALL`, занятый OpenSpec
- применены шесть дельт: нормативно только заглавное написание (RFC 8174),
ДОЛЖЕН требует названного вреда и машинной проверки сразу, ДОПУСКАЕТСЯ
адресовано рецензенту, МЕХАНИЗИРОВАНО выведено из шкалы в отметку рядом с
модальностью (ISO/IEC/IEEE 29148), у таблиц объявлены политика совпадения
и полнота (DMN)
- «Форма записи — LANGUAGE.md» в двенадцати конвенциях заменена строкой о
версии языка по образцу boilerplate BCP 14: пути канона в копии не
существует, а словарь и правило заглавных строка несёт сама
- именованные регионы `<!-- local:имя -->` заменены на единственный
`<!-- conv:local -->`: всё ниже него принадлежит репозиторию, всё выше
пересобирается, поэтому имени-которое-можно-осиротить больше нет
- лок-файла и `origin_hash` в шапке нет — «что было в прошлый раз» знает git,
копии закоммичены, автоматического обновления не существует; транспорт
назад (`push`) убран вместе с ними
- заведены META-22 (репозиторное пишется ниже маркера) и META-23 (форк не
носит `origin:`), META-17 переписан под маркер; буква `X` в префиксе
зарезервирована за локальными правилами потребителей
- META-20: норму можно исполнить, имея один файл; на чужую тему смотрят
только «Почему», «Связано» и разграничение области — подписка это
произвольное подмножество, графа зависимостей нет по построению
- META-21: ссылка ведёт на имя темы или идентификатор правила; путь файла
канона умирает при сборке, потому что слои темы становятся секциями
- реестр покрывает и обвязку тоже (GUIDE.md), поэтому внутри conventions/
он упирался в путь `../GUIDE.md`; теперь пути даются от корня репозитория
- README дополнен разделом про префиксы и строкой в таблице обвязки
- LANGUAGE.md: раздел «Идентификаторы» переписан под префиксы, в список
машинных проверок добавлена сверка с реестром
- GUIDE.md перенумерован под префикс META, «номер правила» заменён на
«идентификатор»
- сами конвенции переехали в conventions/, описательное — в корень:
LANGUAGE.md (язык записи) и GUIDE.md (как ведут конвенции)
- conv синхронизирует только conventions/, пути в origin даются
относительно неё — раскладка копий в репозиториях не меняется