конвенции отделены от обвязки

- сами конвенции переехали в conventions/, описательное — в корень:
  LANGUAGE.md (язык записи) и GUIDE.md (как ведут конвенции)
- conv синхронизирует только conventions/, пути в origin даются
  относительно неё — раскладка копий в репозиториях не меняется
This commit is contained in:
av
2026-07-25 19:23:32 +03:00
parent 62c5645dd4
commit 0842850fae
16 changed files with 42 additions and 23 deletions
+2 -2
View File
@@ -5,7 +5,7 @@
принято», а не «что здесь происходит».
Как записывается сама конвенция — правила, модальность, обоснования — в
[language.md](language.md). Здесь — про то, зачем конвенции заводятся, где
[LANGUAGE.md](LANGUAGE.md). Здесь — про то, зачем конвенции заводятся, где
живут и как соотносятся с соседними видами документов.
## Область действия
@@ -13,7 +13,7 @@
Правила ниже адресованы автору конвенции — тому, кто заводит новый файл или
правит существующий, в каноне и в копиях репозиториев. Обязательность живёт
на отдельном правиле, а не на файле; шкала модальных слов — в
[language.md](language.md).
[LANGUAGE.md](LANGUAGE.md).
## Отличие от соседей
View File
+22 -4
View File
@@ -5,6 +5,20 @@
`ansible-roles`: канон не источник истины во время работы, а лавка, из
которой берут и в которую возвращают улучшения.
Сами конвенции лежат в `conventions/`, обвязка — в корне:
| Файл | Что описывает |
|---|---|
| `README.md` | устройство канона, оси, синхронизация, жизненный цикл |
| [LANGUAGE.md](LANGUAGE.md) | язык записи правил: номера, модальность, «Почему» |
| [GUIDE.md](GUIDE.md) | как ведут конвенции: когда заводить, механизация, отступления |
| `conv` | синхронизация копий |
Обвязка живёт только в каноне и в репозитории не оказывается — `conv`
синхронизирует лишь содержимое `conventions/`. Пока это осознанное
ограничение: копия конвенции ссылается на `LANGUAGE.md` как на внешний
документ.
Правило то же, что у ролей: **деплоится и читается только то, что лежит в
git репозитория**. Канон никем не подключается на лету.
@@ -30,12 +44,16 @@ git репозитория**. Канон никем не подключаетс
## Оси
```
common/ как вести сами конвенции
arch/ решения, переживающие смену языка и инструментов
lang/<язык>/ как решение реализуется и механизируется в языке
stack/<стек>/ привязка к инструменту, хранилищу, транспорту
conventions/
arch/ решения, переживающие смену языка и инструментов
lang/<язык>/ как решение реализуется и механизируется в языке
stack/<стек>/ привязка к инструменту, хранилищу, транспорту
```
Пути правил даются относительно `conventions/`: адрес
`arch/db-identifiers.md R5`, а не `conventions/arch/…` — так же, как они
лягут в `docs/conventions/` репозитория.
Тест — по тому, замена чего убивает правило:
> Умирает при смене **языка** → `lang/`. Умирает при смене **инструмента,
+6 -5
View File
@@ -1,9 +1,10 @@
#!/usr/bin/env python3
"""conv — синхронизация конвенций между каноном и репозиторием.
Канон — эта директория. Репозиторий держит закоммиченные копии нужных
конвенций в docs/conventions/, повторяя структуру канона. Копия — источник
правды для репозитория; канон — лавка, из которой берут.
Канон — директория conventions/ рядом с этим скриптом. Репозиторий держит
закоммиченные копии нужных конвенций в docs/conventions/, повторяя её
структуру. Копия — источник правды для репозитория; канон — лавка, из
которой берут. Пути в origin даются относительно conventions/.
Служебная разметка копии:
@@ -50,8 +51,8 @@ import sys
from pathlib import Path
from typing import NoReturn
CANON = Path(__file__).resolve().parent
CANON_TREES = ("common", "arch", "lang", "stack")
CANON = Path(__file__).resolve().parent / "conventions"
CANON_TREES = ("arch", "lang", "stack")
SERVICE_KEYS = ("origin", "origin_hash", "synced", "local")
DEFAULT_DIR = "docs/conventions"
ENC = "utf-8"
@@ -4,7 +4,7 @@
создания и ценности содержимого: конфигурация, данные, кеш. Категория сразу
отвечает на два вопроса, которые иначе выясняются чтением кода приложения:
**кто создаёт** содержимое и **что будет, если его потерять**. Из категорий
механически выводится состав бэкапа. Форма записи — `common/language.md`.
механически выводится состав бэкапа. Форма записи — `LANGUAGE.md`.
## Область действия
@@ -1,7 +1,7 @@
# Конфигурация приложения
Как устроена конфигурация: где лежит, как попадает в процесс, что с
секретами и когда падает. Форма записи — `common/language.md`.
секретами и когда падает. Форма записи — `LANGUAGE.md`.
## Область действия
@@ -1,7 +1,7 @@
# Идентификаторы сущностей
Как выбираются и как выглядят первичные ключи сущностей. Форма записи —
`common/language.md`.
`LANGUAGE.md`.
## Область действия
+1 -1
View File
@@ -2,7 +2,7 @@
Как приложение записывает моменты и длительности: в каком формате, откуда
берётся значение и где появляется не-UTC. Форма записи —
`common/language.md`.
`LANGUAGE.md`.
## Область действия
@@ -5,7 +5,7 @@ extends: arch/config.md
# Конфигурация: реализация на Go
Как `arch/config.md` выглядит в Go-приложении: формат, загрузчик, границы
запрета на окружение. Форма записи — `common/language.md`.
запрета на окружение. Форма записи — `LANGUAGE.md`.
Секретов Go-специфика не касается: они приходят из деплоя уже в файле, а
проверка их непустоты идёт вместе с остальной валидацией — как описано в
@@ -5,7 +5,7 @@ extends: arch/db-identifiers.md
# Идентификаторы: реализация на Go
Как `arch/db-identifiers.md` выглядит в Go-приложении, выбравшем ULID
(ветка `arch/db-identifiers.md` R1.1). Форма записи — `common/language.md`.
(ветка `arch/db-identifiers.md` R1.1). Форма записи — `LANGUAGE.md`.
Единая точка из `arch/db-identifiers.md` R3 — пакет `internal/ident`: он
порождает идентификаторы (`NewID`, `NewIDAt`) и он же их разбирает
@@ -1,7 +1,7 @@
# Схема и миграции (SQLite, Go)
Как пишутся миграции и какие типы колонок выбираются для схемы SQLite в
Go-приложении. Форма записи — `common/language.md`.
Go-приложении. Форма записи — `LANGUAGE.md`.
## Область действия
@@ -1,7 +1,7 @@
# Ошибки
Как ошибки строятся, оборачиваются и проверяются. Форма записи —
`common/language.md`. Где и когда ошибку **логировать** — в
`LANGUAGE.md`. Где и когда ошибку **логировать** — в
`lang/go/logging.md` (коротко: лог один раз на доменной границе).
## Правила
@@ -6,7 +6,7 @@ extends: arch/time.md
Как и когда писать логи. Это правила оформления кода (How), а не
спецификация поведения: наблюдаемые требования к логам, входящие в контракт
функциональности, живут в спеках. Форма записи — `common/language.md`.
функциональности, живут в спеках. Форма записи — `LANGUAGE.md`.
Лог читают инструментами, а не глазами: повседневно — `jq`
(`jq 'select(.download_id=="a1b2")' app.jsonl`), тяжёлое (агрегации, JOIN) —
@@ -6,7 +6,7 @@ extends: arch/time.md
Как требования `arch/time.md` выполняются в Go-коде: откуда берётся
«сейчас», в каком виде время попадает в базу и в логи, что делать с зонами.
Форма записи — `common/language.md`.
Форма записи — `LANGUAGE.md`.
## Правила
@@ -5,7 +5,7 @@ extends: arch/app-directories.md
# Категории директорий: реализация в Ansible
Как категории из `arch/app-directories.md` раскладываются на сервере
плейбуком. Форма записи — `common/language.md`.
плейбуком. Форма записи — `LANGUAGE.md`.
## Область действия
@@ -3,7 +3,7 @@
Как пишется код веб-UI: частичный своп фрагментов, поллинг живых
обновлений, обработчики действий, деградация без JS, ошибки. Что именно UI
показывает и какие действия поддерживает — в спеках, не здесь. Форма записи
`common/language.md`.
`LANGUAGE.md`.
Логирование запросов — `lang/go/logging.md` (HTTP-поля, рутинно-частое на
`DEBUG`). Трансляция доменных ошибок наружу — `lang/go/errors.md`