From 9085601db24b01981dcc2c1a5c3aa3ab36f14aef Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sat, 25 Jul 2026 20:15:36 +0300 Subject: [PATCH] =?UTF-8?q?config:=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - R20: конфига нет — не стартуем; умолчания существуют для неполного файла, а не для отсутствующего - R21: значение поля в сообщении валидатора печатается по тому же признаку секретности, что у R15 и R16, второй список не заводится - в перечень проверок R18 добавлен формат идентификаторов сущностей --- conventions/arch/config.md | 47 ++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/conventions/arch/config.md b/conventions/arch/config.md index 36f26f9..cfb1025 100644 --- a/conventions/arch/config.md +++ b/conventions/arch/config.md @@ -57,6 +57,28 @@ (тесты, второй инстанс): без неё их разводят переменной окружения — тем самым каналом, который закрывает R1. +### R20. Отсутствие файла конфигурации — ошибка старта + +**ДОЛЖЕН.** Если файла нет ни по пути из опции, ни по имени по умолчанию в +рабочей директории (R3), приложение не стартует: сообщение называет +искомый путь, код возврата ненулевой. + +**Почему.** Конфиг — артефакт деплоя (R12), и его отсутствие означает, что +развёртывание не довело работу до конца, а не что приложение попросили +работать на умолчаниях. Умолчания (R7) существуют, чтобы работал +**неполный** файл, а не отсутствующий, — именно здесь читатель спотыкается +чаще всего. + +Старт без файла ничего не спасает: у приложения с обязательными полями или +секретами всё равно упадёт валидация (R18), только вместо одного сообщения +«нет `config.toml`» получится каскад «поле пусто», за которым настоящая +причина — деплой не отрендерил файл — не видна. + +Приложение, которое запускается вообще без конфигурации, этой конвенцией не +описывается: это отдельный случай и отдельная конвенция. + + + ### R4. В репозитории лежит образец, а не рабочий конфиг **НЕ ДОЛЖЕН.** Реальный конфиг не коммитится; в репозитории — образец. @@ -225,7 +247,7 @@ | R18.1 | обязательные поля заданы (непустота секретов — R15) | в ветке, которая это поле читает | | R18.2 | пути существуют и доступны на запись/чтение по назначению | при первой записи, уже после отчёта об успешном старте | | R18.3 | числовые диапазоны и единицы: доли, таймауты, счётчики попыток | искажённым поведением без единого сообщения об ошибке | -| R18.4 | строки, которые парсятся во что-то (длительности, зоны, URL), реально парсятся | при первом обращении к тому, что за ними стоит | +| R18.4 | строки, которые парсятся во что-то (длительности, зоны, URL, идентификаторы сущностей), реально парсятся | при первом обращении к тому, что за ними стоит | | R18.5 | включённые секции консистентны: у включённой интеграции заданы все обязательные поля | при первом вызове интеграции, часто по расписанию | **Почему.** Список минимальный и собран по одному признаку — правый @@ -233,9 +255,6 @@ потеряна, и диагностируется как дефект приложения. Проверка на старте сводит их все к одному моменту и одному сообщению. - - - ### R19. Проблемы конфига показываются разом **ДОЛЖЕН.** Валидация собирает все найденные проблемы и выводит их одним @@ -247,6 +266,26 @@ одного источника: разом они читаются как одна причина, по одной — как череда несвязанных мелочей. +### R21. Значение поля в сообщении валидатора — по признаку секретности + +**ДОЛЖЕН.** Состав сообщения определяется тем же признаком секретности +поля, которым уже пользуются R15 и R16: + +| № | Поле | В сообщении | +|---|---|---| +| R21.1 | несекретное | имя поля, ожидание и полученное значение: «ожидалось 0–1, получено `1.5`» | +| R21.2 | секретное | имя поля и суть нарушения, без значения | + +**Почему.** Сообщение без значения отправляет читателя в файл — сличать +глазами каждую строку списка R19; ошибки вида «секунды вместо миллисекунд» +или пробел в конце значения из такого сообщения не читаются вовсе. Значение +секретного поля при этом печатать некуда: вывод старта уходит в лог +супервизора и вывод CI, где круг доступа шире прав файла `0600`, — тот же +канал утечки, который закрывает R16. Отдельный список «что не печатать» не +заводится: признак один на R15, R16 и R21, а второй список разошёлся бы с +первым — и поле оказалось бы секретным для логов, но печатаемым +валидатором. + ## Связано - `arch/time.md` — формат времени; зона отображения — единственный