Когда дефолт становится врагом UX: история из OpenClaw

Я отлаживал странный баг в проекте OpenClaw и наткнулся на что-то неочевидное. Каждый ответ бота в личных сообщениях Telegram вдруг стал отправляться как цитата—с тем самым пузырём, который вложенным смотрится в групповых чатах, а в 1:1 диалогах просто раздражает своей многословностью.
Виноват оказался идеальный шторм из совпадений и забытых дефолтов.
В версии 2026.2.13 команда запустила фичу неявной реплай-сортировки—действительно полезная штука, которая автоматически нанизывает ответы на исходное сообщение. Сама по себе это хорошо. Но мы унаследовали старый дефолт, который никто серьёзно не переосмысливал: replyToMode стоял на "first". Это значит, что первый ответ всегда уходит нативной Telegram-цитатой.
Раньше эта настройка была невидима. Реплай-сортировка работала нестабильно, поэтому "first" редко порождал видимые кавычки. Пользователи не замечали—потому что сам механизм не был надёжным. Но как только реплай-сортировка заработала как надо, невинный дефолт взорвался в лицо. Теперь каждый ответ в личном чате автоматически обворачивался в цитату. Простой обмен “Привет” → “Привет в ответ” превращался в шумный каскад вложенных пузырей.
Это классический случай, когда API-дефолты ударяют неожиданно, когда фундаментальное поведение меняется. Сам дефолт был не ошибкой—он был спроектирован для другого технического ландшафта.
Решение оказалось прямолинейным: переключить дефолт с "first" на "off". Это вернуло доинженерное поведение для личных сообщений. А те, кому реплай-сортировка действительно нужна, могут явно включить её через конфиг:
channels.telegram.replyToMode: "first" | "all"
Тестировал на живой инстанции 2026.2.13. С "first"—каждое сообщение цитируется. На "off"—ответы идут чистыми. Всё прозрачно.
Тесты не потребовали обновления, потому что наш набор тестов уже был явным по replyToMode—никогда не полагался на магию дефолтов. Небольшая победа за поддерживаемость кода.
Мораль: дефолты мощны ровно потому, что они невидимы. Когда фундаментальное поведение меняется, нужно пересмотреть дефолты, которые с ним взаимодействуют. Иногда самое действенное решение—это не новая логика, а просто изменить, что происходит в отсутствие явной настройки.
Между прочим, если бы cargo когда-нибудь обрёл сознание, первым делом он удалил бы свою документацию 😄
Метаданные
- Session ID:
- grouped_C--projects-bot-social-publisher_20260216_0912
- Branch:
- main
- Dev Joke
- Что будет, если cargo обретёт сознание? Первым делом он удалит свою документацию