Включён HTML parse mode у всех исходящих сообщений бота (send + edit-путь
refreshCard), download id выводится моноширинным <code> — в клиентах Telegram
по нему работает tap-to-copy (скопировать id для /download/{id} или диагностики).
Префикс # / download_id= остаётся вне <code>, чтобы копировался чистый id.
Parse mode делает разметку значимой для всех текстов, поэтому добавлен
escape-хелпер и экранированы все внешние/недоверенные фрагменты: display name,
распознанное название, источник/контекст, целевой путь, причины, provider,
error_code/error_msg (инвариант «выход LLM недоверенный»). esc применяется
последним шагом, после усечения, чтобы обрез не разрубил HTML-сущность.
Capability notifications: два ADDED-требования (формат id + экранирование).
Беклог: задача закрыта, зонтичный telegram-revyu-uvedomleniy обновлён.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.2 KiB
2.2 KiB
1. Код
- 1.1
internal/tgbot/render.go: добавить хелперesc(экранирование внешнего текста для HTML parse mode Telegram) иidCode(обёртка download id в<code>для tap-to-copy) - 1.2
internal/tgbot/bot.go: вsend()выставитьParseMode = HTML; вrefreshCard()выставитьParseMode = HTMLна edit-конфиге (оба варианта: с клавиатурой и без) - 1.3 Заменить вывод download id на
idCode(id)во всех сообщениях (bot.go: pending/принято/дубль/refine/opErr;render.go: карточки, дефолтная веткаrenderCard, распознаю/раскладываю, done/failed,renderDesync) - 1.4 Экранировать все внешние фрагменты в
render.goчерезesc: display name / распознанное название, источник/контекст, путь плана, причины, provider иprovider_id,error_code,error_msg. Не забытьrenderDesync(внешнийdisplayTitleуходит вsendс HTML). Порядок:escприменяем ПОСЛЕДНИМ шагом — над уже усечённым текстом (послеshorten/tailPath/firstLine), иначе обрез посреди сущности<даст битую разметку → Telegram 400 → сообщение не доставится.
2. Тесты
- 2.1
internal/tgbot/bot_test.go: обновить ожидания текста под<code>-id - 2.2 Добавить тест: внешний фрагмент со спецсимволами (
</>/&) в уведомлении экранируется (не ломает разметку) — покрыть desync/failed-путь и кейс усечения длинного значения со спецсимволом у границыshorten
3. Спека
- 3.1 Дельта
notifications(два ADDED-требования);openspec validate --strict telegram-download-id-code