- добавлен ключ governance: без него конвенция, потерявшая topic, была
неотличима от GUIDE.md и тихо теряла проверки об отъезде к потребителю
- комментарии из манифеста убраны — их всё равно съела бы первая же
команда; то, чего не было в README.md, дописано туда
- TOOL.md был стартовой точкой разработки инструмента и свою задачу
выполнил: решения о нём теперь живут в его собственном репозитории,
открытые вопросы перенесены туда же
- питоновский conv собран под прежнюю модель копий (зеркальное дерево,
именованные регионы, origin_hash) и удалён вместе с ней
- команды в README.md переписаны на convy, включая suite-сторону и sync
- оба манифеста теперь данные инструмента: он их читает и переписывает
целиком, комментариев они не держат — точка в начале ставит их рядом
со служебными файлами, а не среди содержимого репозитория
- прежнее основание из TOOL.md («в наборе файл правится при каждой новой
теме, и прятать его незачем») отпало: правит его convy
- ссылки в README.md, CLAUDE.md, TOOL.md и TODO.md обновлены
- шапка `lang/go/logging.md` объявляла базой `arch/time.md` — копипаста
из соседнего `lang/go/time.md`, единственного файла с этой базой
- у темы `logging` арх-слоя нет вовсе, расширять было нечего; ключ
вернётся сам, когда невыделенное ядро уедет в `arch/logging.md`
- `convy suite check` на наборе проходит чисто
- «что против как» на пограничных правилах не работает: capability
проверяется снаружи работающей системы, конвенция — только в исходном
тексте, и отсюда расходятся направление, распространение и шкала
- добавлен признак для спорного случая: обязательство перед внешним
потребителем — в спеку, зависимость автора следующего патча — в конвенцию
- компонент — область репозитория, где выбранные слои действуют
одновременно; сборка идёт по разу на компонент, у каждого своя директория
копий, подписка и локальная часть, секции [components.<имя>] в манифесте
- плоский набор описан как низкий конец модели, а не отдельный режим: тема с
одним слоем собирается копированием, ключи оси и lang/stack не пишутся
- в TODO заведён вопрос о реестре значений осей и судьбе extends:
- 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 мешает три страта
- родовое «манифест» заменено именем уровня: файл в наборе описывает сам
набор, файл в проекте — подключённые конвенции, и каждый назван по тому,
что описывает
- по имени рядом лежащего манифеста определяется контекст: suite.toml —
набор, .conventions.toml — проект; в TOOL.md решение зафиксировано, из
открытых вопросов убрано
- имя, термины suite/project, раскладка команд: проектные наверху, ведение
набора под подкомандой suite, check остаётся общим
- собрано в одном месте то, что инструмент делает и чего не делает: сборка
копии, три группы проверок, независимость от конкретного набора, отказ от
слияния, лока и обратного транспорта
- два тулинговых вопроса вынесены из TODO в раздел «Открытые вопросы»;
вопросы про инструмент там больше не живут
- GCFG-7, GCFG-9, SLOG-20, GTIM-8, HTMX-7, HTMX-24 несут код внутри нормы,
то есть требуют ровно такой код; с появлением блока ПРИМЕРЫ часть из них
туда и переезжает
- записана цена ошибки в обе стороны: деталь кода как требование против
нормы, потерявшей обязательность в иллюстративном блоке
- пятая, необязательная часть правила: код парой «плохо → хорошо» после
обоснования; метка добавлена в словарь (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 закрыт, остальные перенумерованы
- девять находок ревью описания языка записаны вопросами 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, локальные
регионы исключены из сравнения, поэтому расхождение не даёт шума