удалён вход Telegram, владелец записи стал обязателен в схеме
- убраны клиент бота, транспорт обновлений, отправитель сообщений, сборка входа при старте, секция настроек и зависимость go-telegram-bot-api; из конвейера ушла доставка ответа отправителю — исход виден опросом готовности. Колонки адресата и значение источника остались в схеме: применённые шаги не переписываются - шаг 202608140003 запрещает пустого владельца у аудиозаписи и у файла; существующие строки он не проверяет, и это принято сознательно — искать их надо запросом до выкладки - ревью нашло два пред-существующих дефекта, оба закрыты: пустой второй ответ распознавателя стирал сохранённую расшифровку, а пустая расшифровка перестала быть заметной вместе с убранной доставкой. Попутно поднят golang.org/x/image до v0.45.0 — красный шаг vulns, воспроизводился и на чистом master
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
- **Дата:** 2026-08-13
|
||||
- **Источник:** openspec/changes/archive/2026-08-13-telegram-enabled-flag/design.md
|
||||
- **Статус:** устарело — вход Telegram убран решением [ADR-2026-08-15-telegram-intake-removed-temporarily](ADR-2026-08-15-telegram-intake-removed-temporarily.md); довод устоял и понадобится возврату входа
|
||||
|
||||
## Решение
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
- **Дата:** 2026-08-13
|
||||
- **Источник:** openspec/changes/archive/2026-08-13-start-without-telegram-token/design.md
|
||||
- **Статус:** устарело — вход Telegram убран решением [ADR-2026-08-15-telegram-intake-removed-temporarily](ADR-2026-08-15-telegram-intake-removed-temporarily.md); довод устоял и понадобится возврату входа
|
||||
|
||||
## Решение
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
# Обязательность владельца держит схема, а не приём
|
||||
|
||||
- **Дата:** 2026-08-15
|
||||
- **Источник:** openspec/changes/archive/2026-08-15-remove-telegram-intake/design.md,
|
||||
разделы «Схема теряет только необязательность владельца» и «Владелец записи
|
||||
перестаёт быть необязательным и в модели»
|
||||
|
||||
## Решение
|
||||
|
||||
Колонка владельца у аудиозаписи и у файла перестала принимать пустое значение —
|
||||
шагом схемы `202608140003`. Ничья запись не заводится ничем: ни приёмом, ни
|
||||
конвейером, ни рукой в панели. Поле владельца в модели стало обычной строкой
|
||||
вместо ссылки, которой позволено отсутствовать.
|
||||
|
||||
Существующие строки шаг **не проверяет**, и это принято сознательно: искать ничьи
|
||||
строки надо запросом до выкладки.
|
||||
|
||||
## Почему
|
||||
|
||||
Цитата источника:
|
||||
|
||||
> **Держать обязательность одним приёмом, схему не трогать.** Так было задумано
|
||||
> сперва, и это оставляло дыру: ничью запись заводили руками в панели, она
|
||||
> уходила в конвейер, стоила денег на распознавание и не доставалась потом
|
||||
> никому. Решение владельца от 2026-08-14 — обязательность держит схема.
|
||||
|
||||
Прежнее решение было обратным и записано спекой `storage`: «Колонка MUST
|
||||
допускать пустое значение… Обязательность для приёма по HTTP держит сама
|
||||
capability `intake`, а не схема». Цену за него платили записи входа Telegram — у
|
||||
них владельца не было по построению. Вход убран
|
||||
([ADR-2026-08-15-telegram-intake-removed-temporarily](ADR-2026-08-15-telegram-intake-removed-temporarily.md)),
|
||||
исключение исчезло вместе с ним, и владелец сервиса подтвердил, что записей без
|
||||
владельца в боевой базе нет.
|
||||
|
||||
Про непроверку существующих строк цитата источника:
|
||||
|
||||
> **Проверяется это запросом, а не прогоном шага**, и разница выяснилась ревью с
|
||||
> оракулом: хранилище держит обязательность связи проверкой записи при
|
||||
> сохранении, а не ограничением таблицы. Смена признака на базе с ничьей записью
|
||||
> проходит зелёным и такую запись оставляет… Заставить шаг считать строки самому
|
||||
> владелец решил не делать: безопасность держится ручной проверкой, и она названа
|
||||
> первым шагом плана перехода.
|
||||
|
||||
Правило «пустой владелец не совпадает ни с одной записью» при этом осталось и
|
||||
избыточным не стало: схема запрещает **заводить** ничью запись, а правило —
|
||||
**спрашивать** ничьим именем.
|
||||
|
||||
## Последствия
|
||||
|
||||
- `+` значения «владельца нет» не существует ни на одном уровне: ни в схеме, ни в
|
||||
модели, ни в отборе.
|
||||
- `+` дыра «ничью запись заводят руками в панели» закрыта тем же механизмом, что
|
||||
и приём, — одним, а не двумя.
|
||||
- `−` откат шага возвращает необязательность, но операционно недостижим: команд
|
||||
библиотеки сервис не подключает, и это верно для всех шагов схемы проекта.
|
||||
- `−` ничья запись, если её проглядят перед выкладкой, становится незакрываемой:
|
||||
захват выдаёт её воркеру, а всякое сохранение — включая то, которым ставится
|
||||
признак остановки, — отказывает. Следа не остаётся ни в метрике, ни в журнале
|
||||
событий, только строка в логе контейнера.
|
||||
@@ -0,0 +1,40 @@
|
||||
# Метка убранного входа не выставляется вовсе, а не обнуляется
|
||||
|
||||
- **Дата:** 2026-08-15
|
||||
- **Источник:** openspec/changes/archive/2026-08-15-remove-telegram-intake/design.md,
|
||||
раздел «Метка убранного входа не выставляется вовсе»
|
||||
|
||||
## Решение
|
||||
|
||||
Признак поднятого входа остался, а метки убранного входа в метриках нет вовсе —
|
||||
ни со значением единицы, ни со значением нуля. Ряд `transcriber_intake_up` с
|
||||
меткой `telegram` не появляется после выкладки.
|
||||
|
||||
## Почему
|
||||
|
||||
Цитата источника:
|
||||
|
||||
> Признак поднятого входа остаётся, метка `telegram` у него больше не появляется.
|
||||
> Ноль вместо неё читается как «вход есть, но не поднялся», то есть как поломка;
|
||||
> владелец, у которого на этот признак стоит отбор, увидел бы аварию на ровном
|
||||
> месте.
|
||||
|
||||
Отвергнут очевидный подход — оставить ряд со значением нуля. Он выглядит
|
||||
бережнее (отбор не ломается), но говорит неправду: значение нуля у этого признака
|
||||
означает именно неподнятый вход, а не отсутствующий.
|
||||
|
||||
С единственным оставшимся входом проверяемым осталось только **множество меток**:
|
||||
значение нуля у него недостижимо, потому что страница метрик отдаётся тем же
|
||||
сервером, что и приём, — чтобы прочитать признак, надо дотянуться до входа, о
|
||||
котором он сообщает. Различать поднятый и неподнятый вход признак станет снова,
|
||||
когда входов у сервиса станет больше одного.
|
||||
|
||||
## Последствия
|
||||
|
||||
- `+` наблюдатель не видит вечного нуля, который читался бы как незакрытая
|
||||
авария.
|
||||
- `−` отбор вида `transcriber_intake_up == 0` по убранному входу перестаёт
|
||||
срабатывать молча: исчезновение ряда ловится `absent()`, а не сравнением.
|
||||
Владельцу, если такой отбор был заведён, править его руками.
|
||||
- `−` требование «различать поднятый и неподнятый» стало непроверяемым до
|
||||
возвращения второго входа, и это сказано в самом требовании прямо.
|
||||
@@ -0,0 +1,63 @@
|
||||
# Вход Telegram убран целиком, а не выключен признаком
|
||||
|
||||
- **Дата:** 2026-08-15
|
||||
- **Источник:** openspec/changes/archive/2026-08-15-remove-telegram-intake/design.md,
|
||||
разделы «Context» и «Формы решения, между которыми выбирали»
|
||||
|
||||
## Решение
|
||||
|
||||
Вход Telegram убран из сервиса целиком: клиент, транспорт обновлений, отправитель
|
||||
сообщений, сборка входа при старте, список допущенных людей, секция настроек и
|
||||
зависимость. Убран **временно** — возврат заводится новым изменением вместе со
|
||||
связью чата с учётной записью.
|
||||
|
||||
Хранилище при этом не тронуто: колонки `tg_chat_id`, `tg_reply_message_id` и
|
||||
значение `telegram` перечня источников остаются в схеме вместе с записями,
|
||||
которые их заполнили.
|
||||
|
||||
## Почему
|
||||
|
||||
Цитата источника:
|
||||
|
||||
> Сервис принимает записи двумя входами, и входы расходятся в главном: у записи,
|
||||
> пришедшей из приложения, есть владелец, а у записи, пришедшей от бота, владельца
|
||||
> нет и быть не может — связи чата с учётной записью сервис не ведёт. Пока такие
|
||||
> записи заводятся, правило «каждая запись принадлежит человеку» действует
|
||||
> наполовину.
|
||||
|
||||
Отвергнуты две формы решения, обе с названной ценой:
|
||||
|
||||
> **Выключить вход признаком, код оставить.** Признак `telegram.enabled` заведён
|
||||
> 2026-08-13 и обязателен, а приём по HTTP владельца уже требует: одна правка
|
||||
> ключа в боевом файле даёт «новых записей без владельца не заводится» ценой ноля
|
||||
> строк кода и мгновенным возвратом. Отвергнуто по причине из раздела «Why»:
|
||||
> двойная модель остаётся в коде, и оговорку про бота продолжает платить каждая
|
||||
> следующая задача.
|
||||
>
|
||||
> **Сузить бота до исходящего канала.** Приём убрать, отправку оставить с одним
|
||||
> адресатом — чатом владельца строкой настроек. Отвергнуто потому, что заводит
|
||||
> понятие «канал уведомления владельца», которое тут же переделает задача
|
||||
> `ntfy-delivery`.
|
||||
|
||||
Решениями, которые это изменение отменяет, были
|
||||
[ADR-2026-08-13-telegram-intent-declared-not-inferred](ADR-2026-08-13-telegram-intent-declared-not-inferred.md)
|
||||
и
|
||||
[ADR-2026-08-13-telegram-outage-does-not-block-startup](ADR-2026-08-13-telegram-outage-does-not-block-startup.md):
|
||||
оба нормировали подъём входа, которого больше нет. Доводы их при этом устояли и
|
||||
понадобятся возврату — оба продолжают отвечать на вопрос «что делать с входом,
|
||||
чей внешний собеседник недоступен».
|
||||
|
||||
## Последствия
|
||||
|
||||
- `+` модель одна: оговорка про запись без владельца ушла из спек приёма,
|
||||
доступа, конвейера и хранилища.
|
||||
- `+` зависимость `go-telegram-bot-api` ушла из манифеста вместе с двумя путями
|
||||
утечки токена, которые проект закрывал двумя задачами.
|
||||
- `−` у сервиса не осталось входа, которым человек может воспользоваться:
|
||||
приложения нет, личных ключей для программ нет, и до этих задач запись кладут
|
||||
собранным руками запросом с сессией из браузера. Владелец окно принял.
|
||||
- `−` записи, застрявшие в конвейере на минуту выкладки, доходят до текста, и
|
||||
ответа в чат по ним не уходит. Смягчения нет: чат и есть убираемый вход.
|
||||
- `−` бот у Telegram остаётся зарегистрированным и на вид живым, а ключ доступа —
|
||||
в настройках выкладки под возврат входа (решение владельца от 2026-08-14).
|
||||
Отправитель голосового не получит ни ответа, ни отказа.
|
||||
+5
-2
@@ -35,12 +35,15 @@
|
||||
|
||||
| Дата | Запись | Статус |
|
||||
| --- | --- | --- |
|
||||
| 2026-08-15 | [Вход Telegram убран целиком, а не выключен признаком](ADR-2026-08-15-telegram-intake-removed-temporarily.md) | |
|
||||
| 2026-08-15 | [Обязательность владельца держит схема, а не приём](ADR-2026-08-15-owner-required-by-schema.md) | |
|
||||
| 2026-08-15 | [Метка убранного входа не выставляется вовсе, а не обнуляется](ADR-2026-08-15-removed-intake-has-no-metric-label.md) | |
|
||||
| 2026-08-14 | [Предел простоя остаётся часом, хотя он короче самой работы](ADR-2026-08-14-stuck-limit-stays-an-hour.md) | |
|
||||
| 2026-08-14 | [Ответ распознавателя хранится дословно, двоичной формой и вложением](ADR-2026-08-14-provider-payload-stored-verbatim.md) | |
|
||||
| 2026-08-14 | [Остановка записи — признак, а не рубеж](ADR-2026-08-14-halt-is-a-flag-not-a-stage.md) | |
|
||||
| 2026-08-14 | [Учётная запись с записями не удаляется, и это осознанный тупик](ADR-2026-08-14-account-with-records-is-not-deleted.md) | |
|
||||
| 2026-08-13 | [Намерение объявляется признаком, а не выводится из ключа доступа](ADR-2026-08-13-telegram-intent-declared-not-inferred.md) | |
|
||||
| 2026-08-13 | [Недоступность Telegram подъёму сервиса не мешает](ADR-2026-08-13-telegram-outage-does-not-block-startup.md) | |
|
||||
| 2026-08-13 | [Намерение объявляется признаком, а не выводится из ключа доступа](ADR-2026-08-13-telegram-intent-declared-not-inferred.md) | устарело: вход убран [ADR-2026-08-15-telegram-intake-removed-temporarily](ADR-2026-08-15-telegram-intake-removed-temporarily.md) |
|
||||
| 2026-08-13 | [Недоступность Telegram подъёму сервиса не мешает](ADR-2026-08-13-telegram-outage-does-not-block-startup.md) | устарело: вход убран [ADR-2026-08-15-telegram-intake-removed-temporarily](ADR-2026-08-15-telegram-intake-removed-temporarily.md) |
|
||||
| 2026-08-12 | [Файл записи закрыт защищённым полем и отдаётся вошедшему по токену файла](ADR-2026-08-12-protected-file-behind-session.md) | |
|
||||
| 2026-08-12 | [Сессия живёт семь суток и не продлевает саму себя](ADR-2026-08-12-session-without-refresh.md) | |
|
||||
| 2026-08-12 | [Кого пускать в сервис, решает правило провайдера, а не сервис](ADR-2026-08-12-access-delegated-to-provider.md) | |
|
||||
|
||||
Reference in New Issue
Block a user