служебные слова сценарного блока стали частью словаря набора

- `КОГДА`, `ТОГДА`, `И`, `ИЛИ` (по-английски WHEN/THEN/AND/OR) подчиняются тем
  же требованиям, что модальные слова: одна форма на роль, заглавными, набор
  один на канон и выбирается под естественный язык
- модальностью они не являются — обязательности не задают, только структуру,
  поэтому в строку о версии языка не попадают и под проверку «модальные слова
  вне правил» не подпадают
- единственный сценарный блок канона (SLOG, «Два цикла повтора») переписан с
  WHEN/AND на русские связки; отказ от `GIVEN/WHEN/THEN` уточнён — он касается
  общей формы записи, а на стыке правил эта форма взята сознательно
This commit is contained in:
av
2026-07-26 14:03:29 +03:00
parent f99a513058
commit 3fce663d7a
4 changed files with 58 additions and 50 deletions
+4
View File
@@ -39,6 +39,10 @@ code in this repository.
Исключение — строка о версии языка, которая их перечисляет.
- «Почему» отвечает на «что сломается, если сделать иначе», а не
пересказывает норму. «Потому что так принято» — не обоснование.
- Служебные слова сценарного блока — тоже словарь набора: **КОГДА**,
**ТОГДА**, **И**, **ИЛИ** (по-английски `WHEN`/`THEN`/`AND`/`OR`). Одна
форма на роль, заглавными. Модальностью не являются, в строку о версии
языка не попадают.
- Правило, классифицирующее ситуации, пишется таблицей «ситуация → вердикт»;
строки нумеруются `KEYS-5.1`. Строки взаимоисключающи по умолчанию; иной
порядок объявляется явно, а перечисленные случаи покрывают область
+47 -17
View File
@@ -24,8 +24,8 @@ version: 1
| **ISO/IEC Directives, Part 2** | разделение «требование — рекомендация — разрешение — возможность»; запрет модальных глаголов в утверждениях о факте | списки равнозначных словесных форм («is to», «is required to», «only … is permitted») |
| **ISO/IEC/IEEE 29148** | обоснование как обязательный атрибут; единичность нормы; проверяемость; метод верификации отдельным атрибутом | остальной аппарат требований: приоритеты, источники, матрицы трассируемости |
| **DMN** | таблица решений с объявленной политикой совпадения и требованием полноты | исполняемая семантика и всё, что предполагает движок решений |
| **EARS** | вывод о том, что выигрыш даёт жёсткий шаблон, а не его конкретный вид; паттерн «нежелательное поведение» — в виде таблицы | шаблоны с субъектом-системой: `WHEN`, `WHILE`, `WHERE` |
| **OpenSpec** | четырёхчастная форма правила; адресуемость правила идентификатором | `SHALL`; `GIVEN/WHEN/THEN` как общая форма записи |
| **EARS** | вывод о том, что выигрыш даёт жёсткий шаблон, а не его конкретный вид; паттерн «нежелательное поведение» — в виде таблицы | шаблоны как форма записи правила: `WHEN`, `WHILE`, `WHERE` |
| **OpenSpec** | четырёхчастная форма правила; адресуемость правила идентификатором; форма «условие → следствие» для стыка правил | `SHALL`; `GIVEN/WHEN/THEN` как общая форма записи |
Три отклонения стоят объяснения, потому что выглядят как произвол.
@@ -40,12 +40,17 @@ version: 1
контракт, которого конвенция не даёт. Для англоязычного словаря это означает
выбор в пользу `MUST` из BCP 14, а не `shall` из ISO/IEC Directives.
**`GIVEN/WHEN/THEN` не берётся.** У спецификации субъект — система, и её
поведение разворачивается во времени: состояние, событие, исход. У конвенции
субъект — автор кода, и разворачивать нечего: есть ситуация выбора и вердикт.
Это таблица, а не траектория. Тем же рассуждением отклонены шаблоны EARS с
субъектом-системой, а взят из EARS другой результат: измеримый выигрыш дала
там сама обязательность шаблона, а не его конкретная форма.
**`GIVEN/WHEN/THEN` не берётся как общая форма.** У спецификации субъект —
система, и её поведение разворачивается во времени: состояние, событие,
исход. У конвенции субъект — автор кода, и разворачивать нечего: есть
ситуация выбора и вердикт. Это таблица, а не траектория. Тем же рассуждением
отклонены шаблоны EARS как форма записи правила, а взят из EARS другой
результат: измеримый выигрыш дала там сама обязательность шаблона, а не его
конкретная форма.
Исключение — стык правил, где субъект действительно система: там форма
«условие → следствие» берётся сознательно, вместе со служебными словами под
неё. Это единственное место, и оно описано в «Таблицах решений».
## Что даёт формализация
@@ -158,9 +163,14 @@ Directives, Part 2, по одной форме записи на ступень,
## Словарь другого языка
Для английского готовый словарь даёт BCP 14. Для любого другого языка слова
берут из перевода стандарта, если он есть, или переводят сами: шкала и
семантика ступеней при этом не меняются — меняется только запись.
Словарь набора — это два перечня: модальные слова и служебные слова
сценарного блока (`КОГДА`, `ТОГДА`, `И`, `ИЛИ` — см. «Таблицы решений»).
Требования к ним одни и те же.
Для английского готовый словарь модальных слов даёт BCP 14. Для любого
другого языка слова берут из перевода стандарта, если он есть, или переводят
сами: шкала и семантика ступеней при этом не меняются — меняется только
запись.
| Ступень | Русский | Английский (BCP 14) |
|---|---|---|
@@ -264,17 +274,37 @@ Directives, Part 2, по одной форме записи на ступень,
возможен случай вне перечисленных, он назван отдельной строкой, а не
оставлен на догадку.
Прозаический сценарий остаётся точечным инструментом — для **стыка правил**,
когда два правила вместе дают неочевидный результат:
Сценарный блок остаётся точечным инструментом — для **стыка правил**, когда
два правила вместе дают неочевидный результат:
```
WHEN зависимость недоступна и ретраи вызова исчерпаны → ext-запись ERROR
AND тик фонового цикла упал по той же причине → доменная запись WARN
КОГДА зависимость недоступна И ретраи вызова исчерпаны
ТОГДА внешний вызов даёт запись ERROR,
И тик фонового цикла, упавший по той же причине, — запись WARN
```
Такой блок ставится после обоих правил и ссылается на их идентификаторы.
Если стыков нет — сценариев в файле нет.
Форма «условие → следствие» здесь взята намеренно, хотя как **общая** форма
записи она отклонена: на стыке правил субъект действительно система, и
результат разворачивается во времени — то самое, для чего эта форма и
придумана. Служебные слова блока перечислены ниже и подчиняются тем же
требованиям, что модальные: одна форма на роль, заглавными, набор один на
канон.
| Роль | Русский | Английский |
|---|---|---|
| условие | КОГДА | WHEN |
| следствие | ТОГДА | THEN |
| соединение | И | AND |
| выбор | ИЛИ | OR |
Модальными словами они не являются: обязательности не задают, только
структуру. Поэтому в строку о версии языка они не попадают — там
перечисляется то, чему нужно определение, а логическая связка читается сама,
— и под проверку «модальные слова вне правил» не подпадают.
## Идентификаторы
- Формат — `<ПРЕФИКС>-<номер>`: `KEYS-5`, `SLOG-27`. Префикс принадлежит
@@ -340,8 +370,8 @@ MIGR-6 не соблюдается в легаси-таблицах `show_histor
Разбором текста:
- модальные слова принадлежат объявленному словарю канона, а не смеси
словарей;
- модальные и служебные слова принадлежат объявленному словарю канона, а не
смеси словарей;
- префикс в шапке файла совпадает с реестром, состоит из четырёх заглавных
латинских букв, не начинается на `X` и не значится в списке выбывших;
- заголовки правил файла используют только его собственный префикс;
+3 -29
View File
@@ -107,33 +107,7 @@ Go-бинарь со своим релизным циклом, ставить ч
нечего обслуживать. Сначала 4, потом 5. Разделение из вопроса 1 при этом
дешевле заложить сразу, чем отпиливать потом.
## 6. `WHEN`/`AND` в блоке стыка правил
Блок для стыка двух правил записан английскими словами:
```
WHEN зависимость недоступна и ретраи вызова исчерпаны → ext-запись ERROR
AND тик фонового цикла упал по той же причине → доменная запись WARN
```
Рядом сказано, что `SHALL` не берётся ни в один словарь, потому что занят
OpenSpec. `WHEN` и `AND` — из того же набора и по той же причине должны бы
не браться, но взяты. Это нестыковка, а не решение.
Варианты:
- **перевести** на `КОГДА` / `И`: словарь набора один, и служебные слова
внутри канона следуют ему же;
- **оставить и объяснить**: блок стыка описывает поведение системы во
времени, а не выбор автора, — то есть это единственное место, где форма
спецификации уместна, и заимствование её синтаксиса намеренно.
Второе честнее по смыслу (субъект там действительно система), но требует
явной оговорки в `LANGUAGE.md`, иначе читается как недосмотр. Заодно решить,
подпадают ли `WHEN`/`AND` под проверку «заглавные модальные слова не
встречаются вне правил»: сейчас формально нет, потому что в словаре их нет.
## 7. Критерий «названного вреда» никого не обязывает
## 6. Критерий «названного вреда» никого не обязывает
`LANGUAGE.md` говорит, что ДОЛЖЕН требует двух условий сразу: нарушение
причиняет названный вред (критерий BCP 14) и норма проверяема машиной
@@ -147,7 +121,7 @@ OpenSpec. `WHEN` и `AND` — из того же набора и по той ж
META-6 её защищает. Против: критерий «вред назван» проверяется чтением, а не
машиной, — то есть по META-6 сам он может быть только СЛЕДУЕТ.
## 8. Одиннадцать таблиц не прочитаны на взаимоисключительность
## 7. Одиннадцать таблиц не прочитаны на взаимоисключительность
`LANGUAGE.md` объявил, что строки таблицы решений взаимоисключающи по
умолчанию, а иной порядок объявляется явно. Объявление не делает таблицы
@@ -162,7 +136,7 @@ META-6 её защищает. Против: критерий «вред назв
Работа читательская, машине не даётся; в список проверок она уже записана в
разделе «Чтением, потому что машине не даётся».
## 9. Возможность, записанная модальным словом
## 8. Возможность, записанная модальным словом
Четвёртая категория ISO — возможность и осуществимость — ключевого слова не
имеет: такие утверждения пишутся обычной прозой. Значит канон надо просмотреть
+4 -4
View File
@@ -411,10 +411,10 @@ ctx = logctx.With(ctx, log) // достаём логгер из ctx в кажд
уровень доменной записи об исходе тика.
```
WHEN зависимость недоступна и ретраи вызова исчерпаны
ext-запись `ERROR` (SLOG-29.4)
AND тик фонового цикла упал по той же причине
доменная запись `WARN` (SLOG-27)
КОГДА зависимость недоступна И ретраи вызова исчерпаны
ТОГДА ext-запись `ERROR` (SLOG-29.4)
И тик фонового цикла, упавший по той же причине,
даёт доменную запись `WARN` (SLOG-27)
```
Из этого следует, что у лежащей зависимости `ext`-запись пишет `ERROR`