guide: язык употребляется, значит и проверяется как в конвенции

- проверки разведены по роли слова: то, что язык употребляет (конвенции и
  GUIDE.md), проверяется; то, что цитирует (LANGUAGE.md, README.md), — нет
- список машинных проверок разбит на форму правила и распространение:
  вторая группа (тема в шапке, пути канона, чужие префиксы, локальные X)
  касается только того, что едет к потребителю
- в GUIDE.md добавлена строка о версии языка и убрано заглавное СЛЕДУЕТ из
  вводной прозы «Оформления» — единственное нарушение, которое исключение
  прятало
This commit is contained in:
av
2026-07-26 15:34:49 +03:00
parent c1cb240540
commit fe61ecd6c5
5 changed files with 61 additions and 54 deletions
+6
View File
@@ -143,6 +143,12 @@ code in this repository.
проверять машиной». Ни одна из проверок не реализована, поэтому при ревью их проверять машиной». Ни одна из проверок не реализована, поэтому при ревью их
выполняют чтением. выполняют чтением.
Проверяется всё, что язык **употребляет**: конвенции и `GUIDE.md` (он несёт
правила META и строку о версии языка). `LANGUAGE.md` и `README.md` язык
цитируют — ключевые слова в них предмет описания, а не норма. Проверки
распространения (тема в шапке, самодостаточность нормы, отсутствие путей
канона) касаются только конвенций: обвязка к потребителю не едет.
## Коммиты ## Коммиты
Русский, строчная буква, без точки в конце, прошедшее время или страдательный Русский, строчная буква, без точки в конце, прошедшее время или страдательный
+8 -1
View File
@@ -12,6 +12,13 @@ prefix: META
[LANGUAGE.md](LANGUAGE.md). Здесь — про то, зачем конвенции заводятся, где [LANGUAGE.md](LANGUAGE.md). Здесь — про то, зачем конвенции заводятся, где
живут и как соотносятся с соседними видами документов. живут и как соотносятся с соседними видами документов.
Правила ниже записаны тем же языком, что и сами конвенции, и проверяются так
же.
Ключевые слова ДОЛЖЕН, НЕ ДОЛЖЕН, СЛЕДУЕТ, НЕ СЛЕДУЕТ, ДОПУСКАЕТСЯ и метки
ПОЧЕМУ и МЕХАНИЗИРОВАНО толкуются как описано в языке конвенций версии 1 —
тогда и только тогда, когда написаны заглавными.
## Область действия ## Область действия
Правила ниже адресованы автору конвенции — тому, кто заводит новый файл или Правила ниже адресованы автору конвенции — тому, кто заводит новый файл или
@@ -36,7 +43,7 @@ prefix: META
записано, и это случай META-25: регуляркой имя проверяется тривиально, но записано, и это случай META-25: регуляркой имя проверяется тривиально, но
вреда от нарушения нет — тема объявлена в шапке (META-28), и сборка идёт по вреда от нарушения нет — тема объявлена в шапке (META-28), и сборка идёт по
объявленному имени, а не по имени файла. Значит, и высшей модальности нет, а объявленному имени, а не по имени файла. Значит, и высшей модальности нет, а
на СЛЕДУЕТ такое правило не окупает строчку. ступенью ниже такое правило не окупает строчку.
## Канон и копии ## Канон и копии
+24 -14
View File
@@ -471,21 +471,21 @@ XMIG-6 не соблюдается в легаси-таблицах `show_histor
## Что стоит проверять машиной ## Что стоит проверять машиной
Проверки применяются к файлам конвенций; обвязка канона в них не входит — Проверке подлежит всё, что язык **употребляет**: файлы конвенций и документ,
она ключевые слова цитирует, а не употребляет. Ни одна пока не реализована, которым канон сам себя ведёт (в этом каноне — `GUIDE.md`, префикс META). Файл,
поэтому при ревью их выполняют чтением. который язык **цитирует**, — это описание вроде текущего: ключевые слова стоят
в нём как предмет разговора, а не как норма, и проверки к нему не применяются.
Различает не расположение файла, а роль слова в нём.
Разбором текста: Ни одна проверка пока не реализована, поэтому при ревью их выполняют чтением.
**Форма правила** — разбором текста, в любом файле, который язык употребляет:
- модальные и служебные слова принадлежат объявленному словарю канона, а не - модальные и служебные слова принадлежат объявленному словарю канона, а не
смеси словарей; смеси словарей;
- префикс в шапке файла совпадает с манифестом набора, состоит из четырёх - префикс в шапке файла совпадает с манифестом набора, состоит из четырёх
заглавных заглавных латинских букв, не начинается на `X` и не значится в списке
латинских букв, не начинается на `X` и не значится в списке выбывших; выбывших;
- шапка файла несёт имя темы, и это имя стоит в манифесте набора — среди
живых, а не среди выбывших;
- имя темы, названное в ссылке или в подписке потребителя, тоже разрешается по
манифесту: ссылка на снятую тему не проходит молча;
- заголовки правил файла используют только его собственный префикс; - заголовки правил файла используют только его собственный префикс;
- номера уникальны внутри файла и не имеют пропусков вниз (новое правило - номера уникальны внутри файла и не имеют пропусков вниз (новое правило
берёт следующий свободный, а не первый освободившийся); берёт следующий свободный, а не первый освободившийся);
@@ -494,22 +494,32 @@ XMIG-6 не соблюдается в легаси-таблицах `show_histor
- вводная проза содержит строку о версии языка; - вводная проза содержит строку о версии языка;
- ссылки вида `<ПРЕФИКС>-<n>` — хоть в тексте канона, хоть в локальной части - ссылки вида `<ПРЕФИКС>-<n>` — хоть в тексте канона, хоть в локальной части
копии — указывают на правила, которые ещё существуют; копии — указывают на правила, которые ещё существуют;
- префиксы локальных правил копии начинаются на `X`;
- заглавные модальные слова не встречаются вне областей правил (область — - заглавные модальные слова не встречаются вне областей правил (область —
от заголовка правила до следующего заголовка) — кроме строки о версии от заголовка правила до следующего заголовка) — кроме строки о версии
языка, которая их перечисляет по назначению; языка, которая их перечисляет по назначению;
- модальная метка стоит первой в своём абзаце: заглавное слово в середине - модальная метка стоит первой в своём абзаце: заглавное слово в середине
фразы — упоминание ступени, а не вторая норма правила; фразы — упоминание ступени, а не вторая норма правила.
**Распространение** — разбором текста, только в файлах конвенций: эти проверки
о том, что документ уезжает к потребителю, а документ, которым канон ведёт
себя, не уезжает никуда.
- шапка файла несёт имя темы, и это имя стоит в манифесте набора — среди
живых, а не среди выбывших;
- имя темы, названное в ссылке или в подписке потребителя, тоже разрешается по
манифесту: ссылка на снятую тему не проходит молча;
- префиксы локальных правил копии начинаются на `X`;
- префикс **чужой темы** не встречается в абзаце с модальностью (META-20); - префикс **чужой темы** не встречается в абзаце с модальностью (META-20);
префикс арх-слоя своей темы там допустим (META-24), префикс другого языка префикс арх-слоя своей темы там допустим (META-24), префикс другого языка
или стека — нет; или стека — нет;
- путь файла канона не встречается в тексте конвенции (META-21). - путь файла канона не встречается в тексте конвенции (META-21).
Чтением, потому что машине не даётся: **Чтением**, потому что машине не даётся:
- строки таблицы взаимоисключающи либо политика совпадения объявлена; - строки таблицы взаимоисключающи либо политика совпадения объявлена;
- перечисленные в таблице случаи покрывают область действия; - перечисленные в таблице случаи покрывают область действия;
- норма исполнима без обращения к другим файлам; - норма исполнима без обращения к другим файлам (в файлах конвенций: они
уезжают по одной, а обвязка ссылается на соседей свободно);
- обоснование отвечает на «что сломается», а не пересказывает норму; - обоснование отвечает на «что сломается», а не пересказывает норму;
- хвост обоснования не вводит требований, которых нет в блоке нормы. - хвост обоснования не вводит требований, которых нет в блоке нормы.
+20 -36
View File
@@ -4,28 +4,12 @@
решения. Закрытый вопрос отсюда удаляется — принятое решение живёт в решения. Закрытый вопрос отсюда удаляется — принятое решение живёт в
`README.md`, `GUIDE.md` или `LANGUAGE.md`, а не в этом файле. `README.md`, `GUIDE.md` или `LANGUAGE.md`, а не в этом файле.
Две секции: сначала язык и подход, потом канон с тулингом. Пункты 1–5 Две секции: сначала язык и подход, потом канон с тулингом. Пункты 1–4
пришли из внешнего ревью описания языка и проверены по файлам на месте. пришли из внешнего ревью описания языка и проверены по файлам на месте.
# Язык и подход # Язык и подход
## 1. GUIDE выведен из-под проверок ложным основанием ## 1. МЕХАНИЗИРОВАНО не переживает нового подписчика
`LANGUAGE.md` исключает обвязку из проверок формулировкой «она ключевые слова
цитирует, а не употребляет». Для `GUIDE.md` это неверно: META-правила
употребляют ДОЛЖЕН нормативно, а префикс META стоит в `[prefixes.live]`
манифеста набора, где прямо сказано, что правила записаны тем же языком.
Три следствия. META-правила не попадают ни под одну проверку формы. В
`GUIDE.md` нет строки о версии языка, то есть у META-правил формально нет
ключа к толкованию. И нарушение уже есть: раздел «Оформление» содержит
заглавное СЛЕДУЕТ во вводной прозе — в файле конвенции это было бы
нарушением, а исключение обвязки его прячет.
Честнее развести: `GUIDE.md` язык **употребляет** и проверяется как
конвенция, `LANGUAGE.md` и `README.md` — цитируют.
## 2. МЕХАНИЗИРОВАНО не переживает нового подписчика
META-8 запрещает удалять норму, пока механизирована не у всех, и защищает META-8 запрещает удалять норму, пока механизирована не у всех, и защищает
тем самым потребителей, существующих **на момент удаления**. Будущих не тем самым потребителей, существующих **на момент удаления**. Будущих не
@@ -43,7 +27,7 @@ META-8 запрещает удалять норму, пока механизир
в тексте канона, то есть ровно то, что запрещает META-4. Либо это законное в тексте канона, то есть ровно то, что запрещает META-4. Либо это законное
исключение, и тогда его надо назвать, либо конфликт. исключение, и тогда его надо назвать, либо конфликт.
## 3. Семантика ключевых слов в копию не едет ## 2. Семантика ключевых слов в копию не едет
Строка о версии языка перечисляет слова, но не их значения, а всё Строка о версии языка перечисляет слова, но не их значения, а всё
нетривиальное в шкале живёт только в `LANGUAGE.md`, который в репозиторий не нетривиальное в шкале живёт только в `LANGUAGE.md`, который в репозиторий не
@@ -59,7 +43,7 @@ META-8 запрещает удалять норму, пока механизир
копиями короткую выжимку семантики; расширить строку о версии до копиями короткую выжимку семантики; расширить строку о версии до
двух-трёх предложений; или признать ограничение и записать его явно. двух-трёх предложений; или признать ограничение и записать его явно.
## 4. Две «механические» проверки без источника данных ## 3. Две «механические» проверки без источника данных
В списке «разбором текста» стоят два пункта, которые без дополнительного В списке «разбором текста» стоят два пункта, которые без дополнительного
реестра нерешаемы: реестра нерешаемы:
@@ -70,13 +54,13 @@ META-8 запрещает удалять норму, пока механизир
- **«ссылки указывают на правила, которые ещё существуют»** — упоминание - **«ссылки указывают на правила, которые ещё существуют»** — упоминание
снятого номера в прозе выглядит как висячая ссылка. снятого номера в прозе выглядит как висячая ссылка.
`GUIDE.md` завёл для себя раздел «Освободившиеся номера», но язык не требует `GUIDE.md` завёл для себя раздел «Освободившиеся номера» — и, поскольку он
такой таблицы от конвенций, а манифест набора хранит только темы и префиксы. теперь проверяется как конвенция, это единственный живой пример такого
Пока реестра. Языком он всё равно не объявлен: от конвенций такой таблицы не
реестр снятых номеров не объявлен частью языка, оба пункта принадлежат требуют, а манифест набора хранит только темы и префиксы. Пока реестр снятых
списку «чтением». номеров не объявлен частью языка, оба пункта принадлежат списку «чтением».
## 5. Натяжки в опоре на стандарты ## 4. Натяжки в опоре на стандарты
Три места, где источнику приписано чуть больше, чем в нём есть: Три места, где источнику приписано чуть больше, чем в нём есть:
@@ -95,7 +79,7 @@ META-8 запрещает удалять норму, пока механизир
Остальное в таблице проверку выдержало, включая вторую половину `MAY` из Остальное в таблице проверку выдержало, включая вторую половину `MAY` из
BCP 14 и списки эквивалентных словесных форм ISO Directives. BCP 14 и списки эквивалентных словесных форм ISO Directives.
## 6. Одиннадцать таблиц не прочитаны на взаимоисключительность ## 5. Одиннадцать таблиц не прочитаны на взаимоисключительность
`LANGUAGE.md` объявил, что строки таблицы решений взаимоисключающи по `LANGUAGE.md` объявил, что строки таблицы решений взаимоисключающи по
умолчанию, а иной порядок объявляется явно. Объявление не делает таблицы умолчанию, а иной порядок объявляется явно. Объявление не делает таблицы
@@ -110,7 +94,7 @@ BCP 14 и списки эквивалентных словесных форм IS
Работа читательская, машине не даётся; в список проверок она уже записана в Работа читательская, машине не даётся; в список проверок она уже записана в
разделе «Чтением, потому что машине не даётся». разделе «Чтением, потому что машине не даётся».
## 7. Описание языка отдельно от набора конвенций ## 6. Описание языка отдельно от набора конвенций
`LANGUAGE.md` и `GUIDE.md` описывают, **как** пишутся конвенции; `LANGUAGE.md` и `GUIDE.md` описывают, **как** пишутся конвенции;
`conventions/`**один конкретный** набор. Сейчас они склеены в одном `conventions/`**один конкретный** набор. Сейчас они склеены в одном
@@ -135,7 +119,7 @@ BCP 14 и списки эквивалентных словесных форм IS
# Канон, тулинг, подключение # Канон, тулинг, подключение
## 8. Тулинг: две разные задачи в одном `conv` ## 7. Тулинг: две разные задачи в одном `conv`
Сейчас в `conv` смешаны две категории работы, и они расходятся по всему — Сейчас в `conv` смешаны две категории работы, и они расходятся по всему —
по частоте запуска, по тому, кто запускает, и по тому, что считается по частоте запуска, по тому, кто запускает, и по тому, что считается
@@ -166,7 +150,7 @@ BCP 14 и списки эквивалентных словесных форм IS
ссылках: это установка, а не целостность, но список подписок ему нужен из ссылках: это установка, а не целостность, но список подписок ему нужен из
манифеста. манифеста.
Часть проверок из этого списка сейчас нереализуема по причине из вопроса 4, Часть проверок из этого списка сейчас нереализуема по причине из вопроса 3,
так что порядок такой: сначала язык, потом чекер. так что порядок такой: сначала язык, потом чекер.
Перед тем как переписывать, стоит посмотреть на два готовых прототипа: Перед тем как переписывать, стоит посмотреть на два готовых прототипа:
@@ -174,7 +158,7 @@ BCP 14 и списки эквивалентных словесных форм IS
манифеста и `vendir.yml` — как пример того, где проходит граница между «чего манифеста и `vendir.yml` — как пример того, где проходит граница между «чего
хочу» и «что получил». хочу» и «что получил».
## 9. Пары слоёв и темы без базы ## 8. Пары слоёв и темы без базы
Отложено сознательно, но список стоит держать перед глазами: Отложено сознательно, но список стоит держать перед глазами:
@@ -195,7 +179,7 @@ BCP 14 и списки эквивалентных словесных форм IS
- Вынос арх-ядра из `errors` и `logging` закроет две хрупкие ссылки из - Вынос арх-ядра из `errors` и `logging` закроет две хрупкие ссылки из
`web-ui` (стек) в go-слой — единственные ссылки стек → язык в каноне. `web-ui` (стек) в go-слой — единственные ссылки стек → язык в каноне.
## 10. Подключение к репозиториям ## 9. Подключение к репозиториям
Ничего ещё не подключено. Кандидаты — jellybit и pet-project-server. Ничего ещё не подключено. Кандидаты — jellybit и pet-project-server.
Понадобится: заполнить локальную часть копий тем, что сейчас в этих Понадобится: заполнить локальную часть копий тем, что сейчас в этих
@@ -204,7 +188,7 @@ BCP 14 и списки эквивалентных словесных форм IS
строка в `AGENTS.md` каждого потребителя про то, что файлы в строка в `AGENTS.md` каждого потребителя про то, что файлы в
`docs/conventions/` — копии. `docs/conventions/` — копии.
## 11. Тулинг на Go, живущий независимо ## 10. Тулинг на Go, живущий независимо
Сейчас `conv` — питоновский скрипт внутри канона, то есть тулинг и данные в Сейчас `conv` — питоновский скрипт внутри канона, то есть тулинг и данные в
одном репозитории и правятся одним движением. Мысль: вынести в отдельный одном репозитории и правятся одним движением. Мысль: вынести в отдельный
@@ -213,10 +197,10 @@ Go-бинарь со своим релизным циклом, ставить ч
Что за этим стоит помимо вкуса: независимый бинарь физически не даёт править Что за этим стоит помимо вкуса: независимый бинарь физически не даёт править
инструмент «заодно» с правкой конвенции, работает против **любого** канона и инструмент «заодно» с правкой конвенции, работает против **любого** канона и
любого потребителя — что прямо требуется вопросом 7, — и снимает питон из любого потребителя — что прямо требуется вопросом 6, — и снимает питон из
зависимостей репозиториев-потребителей. зависимостей репозиториев-потребителей.
Порядок обратный ожидаемому: пока вопрос 7 не сделан, инструмент всё равно Порядок обратный ожидаемому: пока вопрос 6 не сделан, инструмент всё равно
работает против одного конкретного канона, и независимый релизный цикл ему работает против одного конкретного канона, и независимый релизный цикл ему
нечего обслуживать. Сначала 7, потом 11. Разделение из вопроса 8 при этом нечего обслуживать. Сначала 6, потом 10. Разделение из вопроса 7 при этом
дешевле заложить сразу, чем отпиливать потом. дешевле заложить сразу, чем отпиливать потом.
+3 -3
View File
@@ -91,9 +91,9 @@ GTIM = "conventions/lang/go/time.md"
ANSD = "conventions/stack/ansible/app-directories.md" ANSD = "conventions/stack/ansible/app-directories.md"
HTMX = "conventions/stack/htmx/web-ui.md" HTMX = "conventions/stack/htmx/web-ui.md"
# Обвязка набора: не синхронизируется в репозитории, но правила записаны тем # Документ, которым канон ведёт себя сам: к потребителю не едет, но правила в
# же языком и цитируются по номерам, поэтому префикс нужен. Темы у неё нет — # нём записаны тем же языком, цитируются по номерам и проверяются как
# подписаться на обвязку нельзя, она не едет к потребителю. # конвенция — отсюда префикс. Темы у него нет: подписаться на него нельзя.
META = "GUIDE.md" META = "GUIDE.md"
[prefixes.retired] [prefixes.retired]