- META-6 переписан: ступень требует не машинной проверки, а того, чтобы
двое проверяющих по тексту правила выносили один вердикт; проверяющий по
умолчанию — читатель, человек или агент
- заведён META-27: машинная проверка желательна везде, где пишется, но
ступени не задаёт — иначе канон стоит в СЛЕДУЕТ до появления скриптов;
обоснование META-25 пересобрано на новом условии
- LANGUAGE.md и CLAUDE.md приведены к той же формулировке, вопрос 1 из
TODO закрыт, остальные перенумерованы
- девять находок ревью описания языка записаны вопросами 1–9: противоречие в
условиях ДОЛЖЕН, неопределённая граница правила, примеры на живых
идентификаторах, «тема» без реестра, ложное исключение GUIDE из проверок,
МЕХАНИЗИРОВАНО без защиты нового подписчика, семантика слов вне копии,
проверки без источника данных, натяжки в опоре на стандарты
- вопросы поделены на две секции: язык с подходом идёт первым, канон с
тулингом вторым; «Мелкое» слито в вопрос 8, куда относилось по смыслу
- нумерация сплошная 1–15, внутренние ссылки переписаны под неё; в вопрос 12
добавлена зависимость чекера от вопросов 2 и 8
- бумп до 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 убрано предписание ссылаться на свой слой словами «базовый
слой»: слова не проверяются и не ведут к утверждению, а идентификатор ведёт
- 31 регион `<!-- local:имя -->` в двенадцати файлах удалён, а не перенесён:
локальное принадлежит копии и живёт ниже маркера `<!-- conv:local -->`
(META-22), так что наполнять регионы в каноне нечем
- вместе с ними ушли два опустевших раздела «Связано» — в arch и ansible
слоях app-directories канонических ссылок нет, а пустой заголовок ничего
не адресует; CLAUDE.md уточнён: раздел заводят, когда ссылки есть
- форма проверена скриптом: у всех правил модальность и «Почему», префиксы
сходятся с реестром, дыр в нумерации нет
- ушли четыре закрытых раздела (ссылка на язык, модель сборки, разбор
прототипов, мультиязычность) и закрытые куски внутри оставшихся: принятые
решения живут в README, GUIDE и LANGUAGE, а черновик их дублировал
- полезные остатки перенесены, а не потеряны: прототипы Vale и vendir — в
вопрос про тулинг, вынос арх-ядра из errors и logging — в пары слоёв
- нумерация сплошная 1–11, внутренние ссылки поправлены под неё; в шапку
добавлено правило, что закрытый вопрос отсюда удаляется
- 12: `WHEN`/`AND` в блоке стыка правил — английские служебные слова там же,
где `SHALL` отклонён как занятый OpenSpec; либо перевод, либо явная
оговорка, что форма спецификации в этом месте намеренна
- 13: критерий «названного вреда» для ДОЛЖЕН описан в языке, но правила под
него нет — META-6 обязывает только понижать при отсутствии проверки
- 14 и 15: одиннадцать таблиц не прочитаны на взаимоисключительность
(подозреваемый SLOG-11), и канон не просмотрен на факты, записанные
модальным словом
- шкала обязательности объявлена инвариантом, а набор ключевых слов —
параметром естественного языка набора: для английского готовый словарь
даёт BCP 14, для прочих берут перевод стандарта или делают свой; отклонены
синонимы ступеней и `SHALL`, занятый OpenSpec
- применены шесть дельт: нормативно только заглавное написание (RFC 8174),
ДОЛЖЕН требует названного вреда и машинной проверки сразу, ДОПУСКАЕТСЯ
адресовано рецензенту, МЕХАНИЗИРОВАНО выведено из шкалы в отметку рядом с
модальностью (ISO/IEC/IEEE 29148), у таблиц объявлены политика совпадения
и полнота (DMN)
- «Форма записи — LANGUAGE.md» в двенадцати конвенциях заменена строкой о
версии языка по образцу boilerplate BCP 14: пути канона в копии не
существует, а словарь и правило заглавных строка несёт сама
- вопрос 3 закрыт: модель записана в README и GUIDE, отмечены три места,
где итог разошёлся с прежними заготовками — нет лока, нет маркеров секций,
локальные префиксы не объявляются, а резервируются буквой `X`
- вопрос 4 переформулирован: регионы не переносятся в единую секцию, а
удаляются из канона — наполнять их в каноне нечем
- вопрос 7 заменён разбором: транспорт переизобретался, оси и сборка аналога
не имеют, Vale отклонён; в 1, 9 и 10 добавлены следствия
- именованные регионы `<!-- local:имя -->` заменены на единственный
`<!-- conv:local -->`: всё ниже него принадлежит репозиторию, всё выше
пересобирается, поэтому имени-которое-можно-осиротить больше нет
- лок-файла и `origin_hash` в шапке нет — «что было в прошлый раз» знает git,
копии закоммичены, автоматического обновления не существует; транспорт
назад (`push`) убран вместе с ними
- заведены META-22 (репозиторное пишется ниже маркера) и META-23 (форк не
носит `origin:`), META-17 переписан под маркер; буква `X` в префиксе
зарезервирована за локальными правилами потребителей
- одиннадцать открытых вопросов по сборке, тулингу и разделению языка и
набора конвенций: в переписке они теряются, а часть уже противоречит
README, и это противоречие видно только рядом с текстом
- снята строка «Не коммитится» и поправлено то же утверждение в CLAUDE.md
- .claude/settings.json включает плагин av-dev-git@av-dev-skills; набор
плагинов у канона общий с остальными репозиториями, поэтому лежит в git,
а не в локальных настройках
- «Почему» у TIME-5 и TIME-6 после перенумерации в dcdd922 указывало на
TIME-3 и TIME-2 вместо KEYS-3 и KEYS-2: массовая замена подставила
префикс своего файла, и ссылки молча поехали на чужие по смыслу правила
- заодно ушли два последних нарушения META-21 — путь `arch/db-identifiers.md`
в тексте конвенции
- одна строка на правило с идентификатором, как требует META-19: форма
правила, схема префиксов, META-20/META-21, выбор оси, оформление файла
- зафиксирован стиль коммитов и то, что README описывает текущее
устройство, а TODO.md — площадка для обсуждения, а не решения
- 41 ссылка вида `lang/go/logging.md` заменена на «конвенция `logging`»,
идентификатор правила или «базовый слой» для своей же темы
- MIGR-8 больше не отсылает за форматом меток времени, а называет его;
MIGR-11 перенёс ссылку на KEYS-1/KEYS-2 из нормы в «Почему»
- META-20: норму можно исполнить, имея один файл; на чужую тему смотрят
только «Почему», «Связано» и разграничение области — подписка это
произвольное подмножество, графа зависимостей нет по построению
- META-21: ссылка ведёт на имя темы или идентификатор правила; путь файла
канона умирает при сборке, потому что слои темы становятся секциями
- реестр покрывает и обвязку тоже (GUIDE.md), поэтому внутри conventions/
он упирался в путь `../GUIDE.md`; теперь пути даются от корня репозитория
- README дополнен разделом про префиксы и строкой в таблице обвязки
- LANGUAGE.md: раздел «Идентификаторы» переписан под префиксы, в список
машинных проверок добавлена сверка с реестром
- GUIDE.md перенумерован под префикс META, «номер правила» заменён на
«идентификатор»
- идентификатор правила теперь `<ПРЕФИКС>-<номер>` вместо `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 даются
относительно неё — раскладка копий в репозиториях не меняется
- правило, чья норма уехала в линтер, сохраняет номер и «Почему», а место
нормы занимает отметка — иначе получался объект без модальности
- записано, что факт «механизировано у всех» устанавливается вручную:
канон списка подписчиков не знает по построению
- 11 файлов разобраны на нумерованные правила: 220 правил в каноне, у
каждого модальность и обязательный блок «Почему»
- классифицирующие места оформлены таблицами, файловый статус снят
отовсюду, локальные регионы сохранены под прежними именами
- 7 и 9 правил соответственно, у каждого модальность и обоснование
- условие выбора первичного ключа стало правилом с таблицей веток, на
которые можно ссылаться из отступлений и механизации
- правило = номер + модальность (ДОЛЖЕН / СЛЕДУЕТ / ДОПУСКАЕТСЯ) плюс
обязательный блок «Почему»; из OpenSpec взяты идентификаторы правил, но
не SHALL и не GIVEN/WHEN/THEN
- файловый статус отменён: обязательность живёт на правиле, а в шапке ещё
не переведённых конвенций ключ остаётся меткой «это проза»
- 13 конвенций по осям arch / lang / stack / common; репозитории берут
оттуда копии в свой docs/conventions/ и коммитят их у себя
- conv — синхронизация копий: add / status / diff / pull / push, локальные
регионы исключены из сравнения, поэтому расхождение не даёт шума