Files
transcriber/docs/adr/ADR-2026-08-15-owner-required-by-schema.md
T
av 8f7c3a057a удалён вход Telegram, владелец записи стал обязателен в схеме
- убраны клиент бота, транспорт обновлений, отправитель сообщений, сборка
  входа при старте, секция настроек и зависимость go-telegram-bot-api; из
  конвейера ушла доставка ответа отправителю — исход виден опросом готовности.
  Колонки адресата и значение источника остались в схеме: применённые шаги не
  переписываются
- шаг 202608140003 запрещает пустого владельца у аудиозаписи и у файла;
  существующие строки он не проверяет, и это принято сознательно — искать их
  надо запросом до выкладки
- ревью нашло два пред-существующих дефекта, оба закрыты: пустой второй ответ
  распознавателя стирал сохранённую расшифровку, а пустая расшифровка перестала
  быть заметной вместе с убранной доставкой. Попутно поднят golang.org/x/image
  до v0.45.0 — красный шаг vulns, воспроизводился и на чистом master
2026-08-15 07:24:35 +03:00

4.8 KiB
Raw Blame History

Обязательность владельца держит схема, а не приём

  • Дата: 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), исключение исчезло вместе с ним, и владелец сервиса подтвердил, что записей без владельца в боевой базе нет.

Про непроверку существующих строк цитата источника:

Проверяется это запросом, а не прогоном шага, и разница выяснилась ревью с оракулом: хранилище держит обязательность связи проверкой записи при сохранении, а не ограничением таблицы. Смена признака на базе с ничьей записью проходит зелёным и такую запись оставляет… Заставить шаг считать строки самому владелец решил не делать: безопасность держится ручной проверкой, и она названа первым шагом плана перехода.

Правило «пустой владелец не совпадает ни с одной записью» при этом осталось и избыточным не стало: схема запрещает заводить ничью запись, а правило — спрашивать ничьим именем.

Последствия

  • + значения «владельца нет» не существует ни на одном уровне: ни в схеме, ни в модели, ни в отборе.
  • + дыра «ничью запись заводят руками в панели» закрыта тем же механизмом, что и приём, — одним, а не двумя.
  • откат шага возвращает необязательность, но операционно недостижим: команд библиотеки сервис не подключает, и это верно для всех шагов схемы проекта.
  • ничья запись, если её проглядят перед выкладкой, становится незакрываемой: захват выдаёт её воркеру, а всякое сохранение — включая то, которым ставится признак остановки, — отказывает. Следа не остаётся ни в метрике, ни в журнале событий, только строка в логе контейнера.