- Клиент бота собирается один раз и достаётся отправителю и транспорту; разрез прошёл по «ответил ли Telegram»: ответ «такого бота нет» роняет старт, недоступность даёт подъём без Telegram (ADR-2026-08-13). Ожидание при сборке ограничено сроком — иначе молчащий Telegram вешал подъём. - Недоставленный ответ не роняет шаг: пишется с job_id и считается метрикой, уровень по причине — WARN для неподнятого входа, ERROR для неназванного адресата. Заведены transcriber_intake_up и transcriber_undelivered_reply_count. - Закрыта утечка токена в журнал: отказ разбора адреса рождается раньше обращения к клиенту, то есть мимо чистки на его границе.
Журнал решений
Одна запись — одно решение. ADR продвигает уже написанное решение, а не
сочиняет его заново: запись цитирует решение и ссылается на источник —
openspec/changes/archive/<id>/design.md, а у решения, принятого разведкой без
изменения, на её записку.
Когда заводить
Верно одно из трёх:
- дорогой откат — переделка стоит дороже переписывания одного файла;
- намеренный отказ от очевидного подхода;
- пересмотр прежнего решения — тогда у старой записи обязателен статус «заменено на».
Не заводить для рутины и для того, что видно из кода и git log.
Соглашения
- Имя файла —
ADR-ГГГГ-ММ-ДД-slug.md, дата — когда решение реально принято. Слаг английский по сути, а не транслитом:queue-as-table, неochered-tablicej. Форму имени и слаг проверяетdocs.py check. - Записи неизменяемы в решении: передумали — новая запись, старой ставится статус. Уточнить прежнюю запись можно только строкой «Уточнено ГГГГ-ММ-ДД:» в разделе «Последствия» и только фактом, который решения не меняет, — например действующим адресом того, что решение завело.
- Активная запись статуса не имеет. Значений два:
заменено на ADR-…иустарело; ставятся полем меты записи —- **Статус:** …рядом с датой и источником, а не абзацем в теле.
Записи
Новые сверху.
Решения, принятые до заведения канона 2026-08-10, источника в архиве изменений не имеют — сочинять их задним числом правило запрещает.