манифест набора переименован в .conventions-suite.toml

- оба манифеста теперь данные инструмента: он их читает и переписывает
  целиком, комментариев они не держат — точка в начале ставит их рядом
  со служебными файлами, а не среди содержимого репозитория
- прежнее основание из TOOL.md («в наборе файл правится при каждой новой
  теме, и прятать его незачем») отпало: правит его convy
- ссылки в README.md, CLAUDE.md, TOOL.md и TODO.md обновлены
This commit is contained in:
av
2026-07-28 09:54:52 +03:00
parent 9a3a89358f
commit 0d335ff58d
5 changed files with 22 additions and 14 deletions
+117
View File
@@ -0,0 +1,117 @@
# suite.toml — манифест набора конвенций.
#
# Манифестов в модели два, и каждый назван по тому, что описывает:
#
# - `suite.toml` здесь, в наборе, — сам набор: язык записи, темы, занятые
# префиксы правил;
# - `.conventions.toml` в проекте — подключение: откуда взяты копии, какие
# темы выбраны, какие язык и стек.
#
# По тому, какой из двух лежит рядом, видно, где ты находишься.
#
# Оба идентификатора набора — тема и префикс — живут здесь, потому что
# правила у них общие: объявляются в шапке файла, сверяются с манифестом,
# не переиспользуются никогда, а снятые уходят в свой раздел `retired`
# вместе с причиной и датой.
# ─── Язык записи ────────────────────────────────────────────────────────────
#
# Набор объявляет версию языка, на котором записаны его правила, и два
# документа о нём. Полное описание остаётся у автора; в копию рядом с
# конвенциями едет короткое `READING.md` — то, что нужно читателю правил, без
# ссылок на правила ведения набора.
[language]
version = 1
description = "LANGUAGE.md"
reading = "READING.md"
# ─── Темы ───────────────────────────────────────────────────────────────────
#
# Тема — набор правил об одном фокусе разработки: время, конфигурация, схема
# БД. Имя записывается латиницей; рекомендуется нижний kebab-case, но годится
# любой идентификатор, пригодный для имени файла.
#
# Тема — единица подписки; собирается она на каждый компонент проекта, все
# слои темы в один файл в порядке база → язык → стек. Слои узнают друг друга
# по объявленному имени, а не по имени файла: файл конвенции несёт тему в
# шапке (`topic: time`), а свою ось — ключами `lang:` и `stack:` там же
# (META-38). Слой без ключей оси — базовый; тем, у которых слой один,
# директории осей не нужны вовсе.
#
# Имя темы не переименовывается и не переиспользуется: на тему ссылаются
# словом — из текста конвенций («конвенция `logging`»), из подписки в
# манифесте потребителя, из шапки `origin:` каждой копии, — и такая ссылка
# обязана продолжать указывать на тот же набор правил. Тема живёт, пока в
# `conventions/` есть хотя бы один её слой.
#
# Описание — одна строка о том, про что тема: из него собирается таблица в
# README директории конвенций у потребителя (META-18).
[topics.live]
app-directories = "категории директорий приложения и что в каждой лежит"
config = "конфигурация: файл, валидация, секреты"
db-identifiers = "идентификаторы сущностей: вид ключа, генерация, границы"
db-schema = "схема БД и миграции: типы колонок, форма изменения"
errors = "ошибки: обёртки, границы трансляции, паники"
logging = "логирование: уровни, структура записи, что не логируем"
time = "время: хранение, зоны, форматы, календарные границы"
web-ui = "веб-UI: партиалы, свопы, поллинг"
[topics.retired]
# Пусто. Сюда попадают имена снятых и переименованных тем вместе с причиной
# и датой, чтобы их нельзя было выдать другой теме.
# ─── Префиксы правил ────────────────────────────────────────────────────────
#
# Префикс — четыре заглавные латинские буквы, уникальные по всему набору. Он
# выбирается под файл, а не выводится по формуле: префикс нужен, чтобы по нему
# искать, а не чтобы его разбирать. Поэтому подходящее слово лучше
# закономерности.
#
# Правила:
#
# - префикс не переименовывается и не переиспользуется никогда — ссылка
# из чужого репозитория обязана продолжать указывать на то же место;
# - при удалении или разделении файла префикс уходит в retired, а не
# освобождается;
# - переезд файла между осями префикс не меняет: идентификатор правила
# не зависит от таксономии;
# - вынос части правил в новый файл — это новый префикс и новая нумерация:
# перенос правила между документами есть смысловое изменение, а не
# переименование;
# - тот же префикс продублирован в шапке файла (`prefix:`), conv сверяет.
#
# Префикс принадлежит файлу, тема — набору файлов: у слоёв одной темы
# префиксы разные, а имя темы одно.
#
# Пути даются от корня репозитория, а не от `conventions/`: манифест покрывает
# и обвязку тоже.
#
# Буква `X` в начале префикса зарезервирована за репозиториями-потребителями:
# набор её не занимает никогда, локальные правила берут префиксы только на
# неё (XTIM, XLOG). Согласовывать их с манифестом не нужно — столкновение
# невозможно по построению.
[prefixes.live]
DIRS = "conventions/arch/app-directories.md"
CONF = "conventions/arch/config.md"
KEYS = "conventions/arch/db-identifiers.md"
TIME = "conventions/arch/time.md"
GCFG = "conventions/lang/go/config.md"
GKEY = "conventions/lang/go/db-identifiers.md"
MIGR = "conventions/lang/go/db-schema.md"
GERR = "conventions/lang/go/errors.md"
SLOG = "conventions/lang/go/logging.md"
GTIM = "conventions/lang/go/time.md"
ANSD = "conventions/stack/ansible/app-directories.md"
HTMX = "conventions/stack/htmx/web-ui.md"
# Документ, которым канон ведёт себя сам: к потребителю не едет, но правила в
# нём записаны тем же языком, цитируются по номерам и проверяются как
# конвенция — отсюда префикс. Темы у него нет: подписаться на него нельзя.
META = "GUIDE.md"
[prefixes.retired]
# Пусто. Сюда попадают префиксы удалённых и разделённых файлов вместе с
# причиной и датой, чтобы их нельзя было выдать повторно.