Ответы, статусы и ошибки бота
На этой странице
- Статусы инициатору: подготовка и публикация
- Статусы инициатору: поиск
- Всплывающие ответы кнопок и подсказки
- Ошибки подготовки: адресация через контекст участника
- Карточка, превью и канал
- Точные параметры всех активных Telegram-узлов
- Исполняемый генератор ошибок/статусов материала
- Шаблон helper topicText
- Шаблон helper topicMessage
- Шаблон helper progressText
- Указатель машинной диагностики
- Регистрация и общие решения
- Необработанный технический отказ — сервис 1.0.1
Источник — опубликованные схемы, сохранённые параметры сообщений и внутренний Telegram-адаптер collaboration 1.0.1 в n8n 2.38.7. Текст ниже воспроизводится буквально; {DRAFT}, {V} и другие обозначения заменяют вычисляемые значения. Это каталог реализации, а не обещание, что все сообщения были фактически доставлены. Статусы могут редактировать одно и то же сообщение, а промежуточные стадии — не отправиться из-за проверки актуальности.
Статусы получает инициатор операции, новые карточки и превью — оба активных участника. Callback answer — краткий всплывающий ответ на кнопку. Для канала достаточно подтверждения одного участника. Неизвестная команда обычно не даёт ответа; универсального /help или /cancel нет.
Статусы инициатору: подготовка и публикация
| Событие / условие | Точный текст | Пояснение |
|---|---|---|
| accepted_post | Взято в работу. Готовлю пост по твоей теме. | Захвачена первая версия собственного поста. |
| accepted_news | Взято в работу. Проверяю источник и готовлю пост. | Карточка выбрана, началась проверка выбранного источника. |
| accepted_revision, есть исходник | Правки приняты. Обновляю текст, картинку сохраню. | Сохраняется исходная иллюстрация; это не обещание неизменной готовой обложки. |
| accepted_revision, нет исходника | Правки приняты. Готовлю обновлённый пост. | Версия принята без сохранённого image source. |
| writing | Готовлю текст поста. | Зафиксирован text_generating. |
| revising, preserve_image=true | Применяю правки к тексту. Картинка остаётся прежней. | Есть в worker-каталоге/допустимых событиях; текущие main-сигналы используют writing, отдельное применение не доказано. |
| revising, иначе | Применяю правки. | Та же оговорка о событии revising. |
| generating_image | Создаю иллюстрацию. Это может занять несколько минут. | Генерация захвачена, а не просто запланирована. |
| rendering | Собираю обложку в фирменном стиле. | Рендер версии. |
| sending_preview | Отправляю готовый пост на согласование. | Доставка фото активным участникам. |
| preview_ready | Готово. Пост отправлен на согласование — проверь его и выбери действие под картинкой. | Требуется подтверждённое approval_message_id и preview_photo_state=sent. |
| publishing | Публикую одобренный пост. | После разрешённого нажатия «Опубликовать». |
| published | Готово — пост опубликован в тестовом канале. | Требуется published_message_id и channel_photo_state=sent. Слово «тестовом» действительно зашито в код. |
| rejected | Черновик отклонён. | Статус rejected, строка не удалена. |
Статусы инициатору: поиск
| Событие | Точный шаблон | Переменные / условие |
|---|---|---|
| accepted | Взято в работу. Ищу новости за последние {days} дней. | days=7 или 30 |
| verifying | Проверяю даты, источники и связь новостей с личными долгами. | Начало отбора прочитанных страниц |
| ready | Готово. Тем на выбор: {count}. Нажми «Подготовить пост» под подходящей новостью. | count — число предложенных тем |
| ready + partial | Готово. Тем на выбор: {count}. Нажми «Подготовить пост» под подходящей новостью. Часть источников проверить не удалось. | partial=true |
| empty, 7 дней | За последние 7 дней подходящих новостей с проверенным источником не нашлось. Можно расширить поиск командой /news 30. | Полная проверка, пустой результат |
| empty, 30 дней | За последние 30 дней подходящих новостей с проверенным источником не нашлось. | Полная проверка, пустой результат |
| partial_empty | Полностью проверить источники не удалось; подтверждённых тем пока нет. Можно повторить поиск позже. | Неполная проверка, нет подтверждённых тем |
| failed | Поиск сейчас не завершился. Можно повторить /news позже. Существующие черновики сохранены. | Отказ поиска, не удаление черновиков |
Всплывающие ответы кнопок и подсказки
| Когда / канал доставки | Точный текст |
|---|---|
| Выбрана новость / callback | Тема выбрана. Готовлю пост по источнику. |
| Опубликовать / callback | Публикую эту версию. |
| Доработать / callback | Жду замечания ответом на следующее сообщение. |
| Отклонить / callback | Черновик отклонён. |
| Повтор ещё выполняемой операции / callback | Этот запрос уже в работе. Повторно отправлять его не нужно. |
| Старый вариант / callback | Этот вариант уже неактивен. Используй кнопки под последним черновиком. |
| Подборка просрочена / callback | Эта подборка устарела. Отправь /news. |
| Недопустимая карточка / callback | Эта тема уже выбрана или кнопка неактивна. Выбери другую доступную карточку. |
| Повторный claim статьи / callback | Эта статья уже выбрана для поста. Повторная подготовка не запущена. |
| Приглашение ForceReply / личное сообщение | Напишите замечания к версии v{V} ответом на это сообщение. |
| Пустой /post / личное сообщение | Добавьте тему после команды. Например: /post Что важно знать перед обращением за банкротством |
| Неверный /news / личное сообщение | Команды: /news, /news кредиты, /news 30 или /news 30 МФО. Период — 7 или 30 дней. |
У «Подтвердить выбор новости» одновременно сохранено root-поле text с фразой «Тема выбрана. Проверяю источник и готовлю пост.» и additionalFields.text с фразой выше. Установленный Telegram node для answerQuery читает additionalFields, root text не используется. В руководство вынесен реально действующий параметр; обе исходные настройки сохранены в JSON.
Ошибки подготовки: адресация через контекст участника
Порядок условий важен: сначала проверяется неизвестный исход, затем специализированные ошибки, затем общий текст. {retry} = /retry {DRAFT} {V}. {problem} — первый problem из editorial_notes, управляющие символы/переносы заменены пробелом, длина ограничена 240; запасной текст: «Спорная формулировка не подтверждена источником.».
| Условие | Точный шаблон | Дальнейшее действие |
|---|---|---|
| news text_failed + outcome_unknown | Ответ платного запроса не подтверждён. Тема и исходная статья сохранены. Повтор заблокирован до проверки результата запроса; другую тему можно выбрать отдельно. | Проверка администратором, не слепой /retry |
| selected_primary_document_required | Для этого правового вывода не хватает проверенного первичного документа. Источник сохранён. Можно выбрать другую тему или отправить /retry {DRAFT} {V} подготовь узкий пересказ с атрибуцией источнику. | Сузить формулировку/выбрать другую тему |
| selected_needs_source_check | По сохранённому источнику не удалось подтвердить основной сюжет. Картинка не создавалась. Можно выбрать другую тему или уточнить задание: /retry {DRAFT} {V} уточнение. | Уточнение либо другая тема |
| news: caption_too_long / cover_*too_long / cover_fields | Подпись или надписи обложки не уложились в лимиты после двух попыток сокращения. Тема и источник сохранены. Продолжить тот же запрос без новых замечаний: {retry} | Восстановление того же источника; формулировка сообщения шире некоторых конкретных причин |
| news: preview_semantic_fail / preview_exact_requires_owner_edit | Не удалось подтвердить формулировку: {problem} Тема и источник сохранены. Для изменения этой формулировки можно добавить уточнение к {retry} | Уточнение спорного фрагмента |
| news: прочий selected_* | Не удалось подготовить факты: ответ проверки не соответствует ожидаемому формату. Тема и источник сохранены. Продолжить тот же запрос без новых замечаний: {retry} | Причина диагностируется по error_code; сообщение обобщает и некоторые технические отказы |
| news: прочая text_failed | Не удалось собрать пост из-за технической ошибки. Тема и источник сохранены. Продолжить тот же запрос без новых замечаний: {retry} | По разрешённому /retry |
| Обычный text_failed: слишком длинная подпись | Текст не поместился под картинкой. Не удалось подготовить вариант для согласования. | Далее добавляется один из суффиксов ниже |
| Обычный text_failed: есть previous_caption + source_image_id | Не удалось применить правки. Предыдущий черновик и картинка сохранены. | Далее суффикс восстановления правки |
| Обычный text_failed: остальное | Не удалось подготовить текст. | Далее суффикс нового /post |
| Суффикс, есть сохранённая предыдущая версия | Для продолжения отправь: /retry {DRAFT} {V} новые замечания. | Обязательные новые замечания показаны в подсказке |
| Суффикс, предыдущей версии нет | Попробуй уточнить тему новым /post. | Первоначальный обычный пост не выдаётся за восстановимую правку |
| image_failed / image_received_invalid | Не удалось создать иллюстрацию. Текст сохранён; пост пока не готов к согласованию. | Требуется разбор ошибки; /resume не принимает эти статусы |
| image_outcome_unknown | Сервис не подтвердил результат генерации. Автоматический повтор остановлен, чтобы не запустить её дважды. | Разбор результата платного запроса |
| preview/publication_outcome_unknown + transport_interrupted | Не удалось подтвердить отправку поста. Проверь, появился ли он: повторная отправка пока остановлена, чтобы не создать дубль. | Проверить факт доставки |
| preview/publication_outcome_unknown + telegram_rejected | Telegram отклонил отправку поста. Сохранённый текст и картинка не удалены. Сообщи об этой ошибке для проверки подключения бота; автоматического повтора нет. | Проверка подключения/ошибки Telegram |
| preview/publication_outcome_unknown: прочее | Ответ Telegram не прошёл проверку отправленного поста. Текст и картинка сохранены. Сообщи об этой ошибке для проверки ответа; повторная отправка остановлена. | Сверить ожидаемый и фактический ответ |
| Остальные разрешённые ошибки подготовки | Не удалось завершить подготовку. Текст и сохранённая картинка не удалены. Для продолжения отправь: /resume {DRAFT} {V}. | Только поддерживаемое состояние /resume |
Каталог progressText также содержит запасные варианты, которые текущий error-router заменяет более конкретными: «Текст не поместился под картинкой. Нажми «Доработать» под последним доступным черновиком и попроси сократить его.»; «Не удалось подготовить текст. Попробуй уточнить задачу.». Они присутствуют в исходнике, но не должны описываться как гарантированный текущий ответ на любую ошибку.
Карточка, превью и канал
Текущая карточка news_topic_v2:
{title}
Идея поста: {angle}
{category_label} · {published_date}
{source_name}
{url}
После выбора проверю факты и подготовлю черновик.
title/angle — отобранная тема/идея; category_label — русская метка категории; published_date — подтверждённая дата статьи; source_name/url — проверенный издатель и канонический источник. Под ней одна кнопка «Подготовить пост» с news:{batch}:{item}. Эта карточка ещё не готовый пост и не окончательный пакет фактов.
Превью photo_caption_v1 — одно фото с сохранённой caption, без системного вступления «Комплект». Для новости caption = `{body}
Источник: {source_url}. Под фото кнопки «Опубликовать» (p|{DRAFT}|{V}), «Доработать» (r|…), «Отклонить» (x|…`). В канал уходит то же сохранённое фото/подпись без кнопок и без сообщений служебного статуса.
В совместимых старых ветках остались: отдельный текст `Комплект v{V}
{text} с HTML-экранированием и фото с подписью Обложка комплекта v{V} {cover_title}`. Старый формат news_fact_pack_v1 имеет другой шаблон карточки; точный код ниже. Это наличие совместимости, а не текущий формат нового /post.
Точные параметры всех активных Telegram-узлов
Раздел сохраняет выражения и условные шаблоны, включая совместимые ветки. Для callback operation=answerQuery действуют additionalFields; для sendPhoto caption также расположен в дополнительных полях. Полный node сохраняется в соответствующем workflow JSON.
BFLNewsCard04 / Отправить карточку
Узел 605644aa-5067-4870-9898-cd25b7ac88df.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "710000001",
"text": "={{ $json.card_text }}",
"replyMarkup": "inlineKeyboard",
"additionalFields": {
"appendAttribution": false,
"disable_web_page_preview": true
},
"inlineKeyboard": {
"rows": [
{
"row": {
"buttons": [
{
"text": "Подготовить пост",
"additionalFields": {
"callback_data": "={{ $json.callback }}"
}
}
]
}
}
]
}
}
BFLNewsStatus04 / Отправить сообщение статуса
Узел d67476cf-945b-41c4-a615-91fafab8f7c6.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "710000001",
"messageType": "message",
"messageId": "={{ $json.status_message_id }}",
"text": "={{ $(\"Выбрать актуальный статус\").first().json._notify_text }}",
"replyMarkup": "none",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false,
"disable_web_page_preview": true
}
}
BFLNewsStatus04 / Изменить сообщение статуса
Узел 1021d7ef-63f2-4efe-8e97-a133705295ea.
{
"resource": "message",
"operation": "editMessageText",
"chatId": "710000001",
"messageType": "message",
"messageId": "={{ $json.status_message_id }}",
"text": "={{ $(\"Выбрать актуальный статус\").first().json._notify_text }}",
"replyMarkup": "none",
"additionalFields": {
"parse_mode": "HTML"
}
}
BFLStatusV031001 / Отправить сообщение статуса
Узел d67476cf-945b-41c4-a615-91fafab8f7c6.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "710000001",
"messageType": "message",
"messageId": "={{ $json.status_message_id }}",
"text": "={{ $(\"Выбрать актуальный статус\").first().json._notify_text }}",
"replyMarkup": "none",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false,
"disable_web_page_preview": true
}
}
BFLStatusV031001 / Изменить сообщение статуса
Узел 1021d7ef-63f2-4efe-8e97-a133705295ea.
{
"resource": "message",
"operation": "editMessageText",
"chatId": "710000001",
"messageType": "message",
"messageId": "={{ $json.status_message_id }}",
"text": "={{ $(\"Выбрать актуальный статус\").first().json._notify_text }}",
"replyMarkup": "none",
"additionalFields": {
"parse_mode": "HTML"
}
}
tKcwMnRnIJuaKYte / Прислать черновик с кнопками
Узел f1d583c9-dd6e-4668-b3f2-6e0d2e71160d.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "710000001",
"text": "={{ String(\"Комплект v\" + $json.version + \"\\n\\n\" + $json.text).replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\") }}",
"replyMarkup": "inlineKeyboard",
"inlineKeyboard": {
"rows": [
{
"row": {
"buttons": [
{
"text": "Опубликовать",
"additionalFields": {
"callback_data": "={{ \"p|\" + $json.draft_key + \"|\" + $json.version }}"
}
},
{
"text": "Доработать",
"additionalFields": {
"callback_data": "={{ \"r|\" + $json.draft_key + \"|\" + $json.version }}"
}
},
{
"text": "Отклонить",
"additionalFields": {
"callback_data": "={{ \"x|\" + $json.draft_key + \"|\" + $json.version }}"
}
}
]
}
}
]
},
"additionalFields": {
"appendAttribution": false,
"disable_web_page_preview": true,
"parse_mode": "HTML",
"reply_to_message_id": "={{ Number($json.preview_photo_message_id) }}"
}
}
tKcwMnRnIJuaKYte / Подтвердить публикацию
Узел 015933aa-d026-4b35-8681-5de97621273e.
{
"resource": "callback",
"operation": "answerQuery",
"queryId": "={{ $(\"Распознать команду или решение\").item.json.callback_id }}",
"additionalFields": {
"text": "Публикую эту версию.",
"cache_time": 0
}
}
tKcwMnRnIJuaKYte / Отправить утверждённый текст в канал
Узел 0a9322a4-3613-4ec7-b58d-6405be085421.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "-1007000000001",
"text": "={{ String($json.channel_text).replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\") }}",
"additionalFields": {
"appendAttribution": false,
"disable_web_page_preview": true,
"parse_mode": "HTML"
}
}
tKcwMnRnIJuaKYte / Подтвердить доработку
Узел e3d23bb4-cbbe-47e9-8c9c-f58724e8a523.
{
"resource": "callback",
"operation": "answerQuery",
"queryId": "={{ $(\"Распознать команду или решение\").item.json.callback_id }}",
"additionalFields": {
"text": "Жду замечания ответом на следующее сообщение.",
"cache_time": 0
}
}
tKcwMnRnIJuaKYte / Запросить замечания ответом
Узел 2e759604-ace2-461a-b708-99dd30fc2c80.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "710000001",
"text": "={{ \"Напишите замечания к версии v\" + $(\"Перевести в ожидание замечаний\").item.json.version + \" ответом на это сообщение.\" }}",
"replyMarkup": "forceReply",
"forceReply": {
"force_reply": true,
"selective": true
},
"additionalFields": {
"appendAttribution": false
}
}
tKcwMnRnIJuaKYte / Подтвердить отклонение
Узел 20126a0a-3d69-4a4b-b045-11546348d381.
{
"resource": "callback",
"operation": "answerQuery",
"queryId": "={{ $(\"Распознать команду или решение\").item.json.callback_id }}",
"additionalFields": {
"text": "Черновик отклонён.",
"cache_time": 0
}
}
tKcwMnRnIJuaKYte / Сообщить об устаревшей кнопке
Узел 3f319c9c-c907-43ce-9038-dee0f52d8b0a.
{
"resource": "callback",
"operation": "answerQuery",
"queryId": "={{ $json.callback_id }}",
"additionalFields": {
"text": "={{ $json.pending ? \"Этот запрос уже в работе. Повторно отправлять его не нужно.\" : \"Этот вариант уже неактивен. Используй кнопки под последним черновиком.\" }}",
"show_alert": false,
"cache_time": 0
}
}
tKcwMnRnIJuaKYte / Подсказать формат /post
Узел da756076-ae37-4318-a89e-d5e368902743.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "710000001",
"text": "Добавьте тему после команды. Например: /post Что важно знать перед обращением за банкротством",
"additionalFields": {
"appendAttribution": false
}
}
tKcwMnRnIJuaKYte / Прислать квадратную обложку
Узел c6a73a12-a568-4617-bd5b-0e46f51f9293.
{
"resource": "message",
"operation": "sendPhoto",
"chatId": "710000001",
"binaryData": true,
"binaryPropertyName": "data",
"file": "",
"replyMarkup": "none",
"additionalFields": {
"caption": "={{ String(\"Обложка комплекта v\" + $(\"Сохранить обложку версии\").first().json.version + \"\\n\" + $(\"Сохранить обложку версии\").first().json.cover_title).replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\") }}",
"parse_mode": "HTML"
}
}
tKcwMnRnIJuaKYte / Отправить утверждённую обложку в канал
Узел 78bf5b4b-82ec-4059-9563-ca81304da85d.
{
"resource": "message",
"operation": "sendPhoto",
"chatId": "-1007000000001",
"binaryData": false,
"binaryPropertyName": "data",
"file": "={{ $json.telegram_file_id }}",
"replyMarkup": "none",
"additionalFields": {
"caption": "={{ String($json.channel_caption).replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\") }}",
"parse_mode": "HTML"
}
}
tKcwMnRnIJuaKYte / Прислать пост одним фото
Узел 4bb76a8f-a819-4724-88e7-6c78b20630e3.
{
"resource": "message",
"operation": "sendPhoto",
"chatId": "710000001",
"binaryData": true,
"binaryPropertyName": "data",
"file": "",
"replyMarkup": "inlineKeyboard",
"additionalFields": {
"caption": "={{ $(\"Контекст готового превью\").first().json.caption }}"
},
"inlineKeyboard": {
"rows": [
{
"row": {
"buttons": [
{
"text": "Опубликовать",
"additionalFields": {
"callback_data": "={{ \"p|\" + $(\"Контекст готового превью\").first().json.draft_key + \"|\" + $(\"Контекст готового превью\").first().json.version }}"
}
},
{
"text": "Доработать",
"additionalFields": {
"callback_data": "={{ \"r|\" + $(\"Контекст готового превью\").first().json.draft_key + \"|\" + $(\"Контекст готового превью\").first().json.version }}"
}
},
{
"text": "Отклонить",
"additionalFields": {
"callback_data": "={{ \"x|\" + $(\"Контекст готового превью\").first().json.draft_key + \"|\" + $(\"Контекст готового превью\").first().json.version }}"
}
}
]
}
}
]
}
}
tKcwMnRnIJuaKYte / Опубликовать фото с полным текстом
Узел 85fe88d9-fb99-4c4f-aa8a-2efe3623607a.
{
"resource": "message",
"operation": "sendPhoto",
"chatId": "-1007000000001",
"binaryData": false,
"binaryPropertyName": "data",
"file": "={{ $json.telegram_file_id }}",
"replyMarkup": "none",
"additionalFields": {
"caption": "={{ $json.caption }}"
}
}
tKcwMnRnIJuaKYte / Прислать исправленный пост прежним фото
Узел cce940bd-46ce-4807-988c-8131ad6f1160.
{
"resource": "message",
"operation": "sendPhoto",
"chatId": "710000001",
"binaryData": false,
"binaryPropertyName": "data",
"file": "={{ $(\"Контекст готового превью\").first().json.telegram_file_id }}",
"replyMarkup": "inlineKeyboard",
"additionalFields": {
"caption": "={{ $(\"Контекст готового превью\").first().json.caption }}"
},
"inlineKeyboard": {
"rows": [
{
"row": {
"buttons": [
{
"text": "Опубликовать",
"additionalFields": {
"callback_data": "={{ \"p|\" + $(\"Контекст готового превью\").first().json.draft_key + \"|\" + $(\"Контекст готового превью\").first().json.version }}"
}
},
{
"text": "Доработать",
"additionalFields": {
"callback_data": "={{ \"r|\" + $(\"Контекст готового превью\").first().json.draft_key + \"|\" + $(\"Контекст готового превью\").first().json.version }}"
}
},
{
"text": "Отклонить",
"additionalFields": {
"callback_data": "={{ \"x|\" + $(\"Контекст готового превью\").first().json.draft_key + \"|\" + $(\"Контекст готового превью\").first().json.version }}"
}
}
]
}
}
]
}
}
tKcwMnRnIJuaKYte / Подсказать формат поиска
Узел 460469ad-814c-490c-b110-8b617cb69cdf.
{
"resource": "message",
"operation": "sendMessage",
"chatId": "710000001",
"text": "Команды: /news, /news кредиты, /news 30 или /news 30 МФО. Период — 7 или 30 дней.",
"replyMarkup": "none",
"additionalFields": {
"appendAttribution": false,
"disable_web_page_preview": true
}
}
tKcwMnRnIJuaKYte / Подтвердить выбор новости
Узел ef49a833-8b75-4595-91a9-285babc120e1.
{
"resource": "callback",
"operation": "answerQuery",
"queryId": "={{ $(\"Распознать команду или решение\").first().json.callback_id }}",
"additionalFields": {
"text": "Тема выбрана. Готовлю пост по источнику.",
"cache_time": 0
},
"text": "Тема выбрана. Проверяю источник и готовлю пост."
}
tKcwMnRnIJuaKYte / Сообщить о недоступной новости
Узел 828e7449-b44e-48da-a8ea-1b2b385e2adb.
{
"resource": "callback",
"operation": "answerQuery",
"queryId": "={{ $(\"Распознать команду или решение\").first().json.callback_id }}",
"additionalFields": {
"text": "={{ $json.selection_text }}",
"cache_time": 0
}
}
Исполняемый генератор ошибок/статусов материала
Ниже точная функция и выбор сообщений с проверкой допуска. Идентификатор владельца заменён.
'use strict';
// Text catalog only. Persist job/message IDs and trigger these messages from real
// workflow transitions. This module neither sends messages nor changes job state.
function progressText(event,context={}){
switch(event){
case 'accepted_news': return 'Взято в работу. Проверяю источник и готовлю пост.';
case 'accepted_post': return 'Взято в работу. Готовлю пост по твоей теме.';
case 'accepted_revision': return context.preserve_image===true
?'Правки приняты. Обновляю текст, картинку сохраню.'
:'Правки приняты. Готовлю обновлённый пост.';
case 'writing': return 'Готовлю текст поста.';
case 'revising': return context.preserve_image===true
?'Применяю правки к тексту. Картинка остаётся прежней.'
:'Применяю правки.';
case 'generating_image': return 'Создаю иллюстрацию. Это может занять несколько минут.';
case 'rendering': return 'Собираю обложку в фирменном стиле.';
case 'sending_preview': return 'Отправляю готовый пост на согласование.';
case 'preview_ready': return 'Готово. Пост отправлен на согласование — проверь его и выбери действие под картинкой.';
case 'publishing': return 'Публикую одобренный пост.';
case 'published': return 'Готово — пост опубликован в тестовом канале.';
case 'rejected': return 'Черновик отклонён.';
case 'duplicate_pending': return 'Этот запрос уже в работе. Повторно отправлять его не нужно.';
case 'stale_button': return 'Этот вариант уже неактивен. Используй кнопки под последним черновиком.';
case 'error_caption_too_long': return context.can_retry_revision===true
?'Текст не поместился под картинкой. Нажми «Доработать» под последним доступным черновиком и попроси сократить его.'
:'Текст не поместился под картинкой. Не удалось подготовить вариант для согласования.';
case 'error_text': return context.previous_preserved===true
?'Не удалось применить правки. Предыдущий черновик и картинка сохранены.'
:'Не удалось подготовить текст. Попробуй уточнить задачу.';
case 'error_image': return 'Не удалось создать иллюстрацию. Текст сохранён; пост пока не готов к согласованию.';
case 'generation_unknown': return 'Сервис не подтвердил результат генерации. Автоматический повтор остановлен, чтобы не запустить её дважды.';
case 'delivery_unknown': return 'Не удалось подтвердить отправку поста. Проверь, появился ли он: повторная отправка пока остановлена, чтобы не создать дубль.';
default: throw new Error('Unknown progress event');
}
}
const input=$('Вход статуса').first().json;
const r=$json;
const events={accepted_news:[10,['text_preparing']],accepted_post:[10,['text_preparing']],accepted_revision:[10,['text_preparing']],writing:[20,['text_generating']],revising:[20,['text_generating']],generating_image:[30,['image_generating']],rendering:[40,['rendering_cover']],sending_preview:[50,['sending_preview_photo']],preview_ready:[60,['awaiting_approval']],publishing:[70,['publishing']],published:[80,['published']],rejected:[80,['rejected']],error:[90,['text_failed','image_failed','image_outcome_unknown','image_received_invalid','image_upload_failed','render_failed','preview_failed','preview_outcome_unknown','publication_outcome_unknown']]};
const event=input._notification_event,rule=events[event];
const base={...r,_notification_event:event,_notify:false};
if(!rule||String(r.owner_chat_id)!=='710000001'||r.operation_id!==input.operation_id||!rule[1].includes(r.status)||r.notification_lock||['unknown','missing','disabled'].includes(r.notification_state)||Number(r.notification_retry_after||0)>Date.now())return {json:base};
const rank=rule[0];if(rank<Number(r.notification_rank||0))return {json:base};
if(event==='preview_ready'&&(!r.approval_message_id||r.preview_photo_state!=='sent'))return {json:base};
if(event==='published'&&(!r.published_message_id||r.channel_photo_state!=='sent'))return {json:base};
let text;
if(event==='error'){
if(r.status==='text_failed'&&r.origin==='news'&&/outcome_unknown/.test(r.error_code||'')){text='Ответ платного запроса не подтверждён. Тема и исходная статья сохранены. Повтор заблокирован до проверки результата запроса; другую тему можно выбрать отдельно.';}else if(r.status==='text_failed'&&r.origin==='news'&&r.error_code==='selected_primary_document_required'){text='Для этого правового вывода не хватает проверенного первичного документа. Источник сохранён. Можно выбрать другую тему или отправить /retry '+r.draft_key+' '+r.version+' подготовь узкий пересказ с атрибуцией источнику.';}else if(r.status==='text_failed'&&r.origin==='news'&&r.error_code==='selected_needs_source_check'){text='По сохранённому источнику не удалось подтвердить основной сюжет. Картинка не создавалась. Можно выбрать другую тему или уточнить задание: /retry '+r.draft_key+' '+r.version+' уточнение.';}else if(r.status==='text_failed'&&r.origin==='news'){
const retry='/retry '+r.draft_key+' '+r.version;
if(/caption_too_long|cover_.*too_long|cover_fields/.test(r.error_code||''))text='Подпись или надписи обложки не уложились в лимиты после двух попыток сокращения. Тема и источник сохранены. Продолжить тот же запрос без новых замечаний: '+retry;
else if(/preview_semantic_fail|preview_exact_requires_owner_edit/.test(r.error_code||'')){let issues=[];try{issues=JSON.parse(r.editorial_notes||'[]');}catch{}const problem=String(issues.find(x=>typeof x.problem==='string')?.problem||'Спорная формулировка не подтверждена источником.').replace(/[\r\n\u0000-\u001f]/g,' ').slice(0,240);text='Не удалось подтвердить формулировку: '+problem+' Тема и источник сохранены. Для изменения этой формулировки можно добавить уточнение к '+retry;}
else if(/^selected_/.test(r.error_code||''))text='Не удалось подготовить факты: ответ проверки не соответствует ожидаемому формату. Тема и источник сохранены. Продолжить тот же запрос без новых замечаний: '+retry;else text='Не удалось собрать пост из-за технической ошибки. Тема и источник сохранены. Продолжить тот же запрос без новых замечаний: '+retry;
}else if(r.status==='text_failed'){
const retained=!!r.previous_caption&&!!r.source_image_id;
text=r.error_code?.includes('caption_too_long')?'Текст не поместился под картинкой. Не удалось подготовить вариант для согласования.':retained?'Не удалось применить правки. Предыдущий черновик и картинка сохранены.':'Не удалось подготовить текст.';
if(retained)text+=' Для продолжения отправь: /retry '+r.draft_key+' '+r.version+' новые замечания.';
else text+=' Попробуй уточнить тему новым /post.';
}else if(r.status==='image_outcome_unknown')text=progressText('generation_unknown');
else if(['preview_outcome_unknown','publication_outcome_unknown'].includes(r.status)){
if(r.error_code==='telegram_transport_interrupted')text=progressText('delivery_unknown');
else if(r.error_code==='telegram_rejected')text='Telegram отклонил отправку поста. Сохранённый текст и картинка не удалены. Сообщи об этой ошибке для проверки подключения бота; автоматического повтора нет.';
else text='Ответ Telegram не прошёл проверку отправленного поста. Текст и картинка сохранены. Сообщи об этой ошибке для проверки ответа; повторная отправка остановлена.';
}
else if(['image_failed','image_received_invalid'].includes(r.status))text=progressText('error_image');
else text='Не удалось завершить подготовку. Текст и сохранённая картинка не удалены. Для продолжения отправь: /resume '+r.draft_key+' '+r.version+'.';
}else text=progressText(event,{preserve_image:!!r.source_image_id});
if(rank===Number(r.notification_rank||0)&&r.notification_text===text)return {json:base};
const operation=r.operation_id;
return {json:{...base,_notify:true,_notify_rank:rank,_notify_text:text,_notify_lock:operation+'|'+String($execution.id),_notify_method:r.status_message_id?'editMessageText':'sendMessage'}};
Шаблон helper topicText
Наличие ветки helper не доказывает её вызов в текущем сценарии.
function topicText(topic){
return safeText(`${topic.title}\n\nИдея поста: ${topic.angle}\n\n${topic.category_label} · ${topic.published_date}\n${topic.source_name}\n${topic.url}\n\nПосле выбора проверю факты и подготовлю черновик.`,4096);
}
Шаблон helper topicMessage
Наличие ветки helper не доказывает её вызов в текущем сценарии.
function topicMessage(item){
const text=`${item.title}\n\n${item.summary}\n\nПочему это важно: ${item.why}\n\n${item.stage_label} · ${item.published_date}\n${item.source_name}\n${item.url}`;
return clean(text,4096,'topic_message');
}
Шаблон helper progressText
Наличие ветки helper не доказывает её вызов в текущем сценарии.
function progressText(event,{count=0,days=7,partial=false}={}){
switch(event){
case 'accepted': return `Взято в работу. Ищу новости за последние ${days} дней.`;
case 'verifying': return 'Проверяю даты, источники и связь новостей с личными долгами.';
case 'ready': return `Готово. Тем на выбор: ${count}. Нажми «Подготовить пост» под подходящей новостью.`+(partial?' Часть источников проверить не удалось.':'');
case 'empty': return `За последние ${days} дней подходящих новостей с проверенным источником не нашлось.`+(days===7?' Можно расширить поиск командой /news 30.':'');
case 'partial_empty': return 'Полностью проверить источники не удалось; подтверждённых тем пока нет. Можно повторить поиск позже.';
case 'failed': return 'Поиск сейчас не завершился. Можно повторить /news позже. Существующие черновики сохранены.';
case 'selected': return 'Тема выбрана. Готовлю пост по источнику — затем пришлю на согласование.';
case 'expired': return 'Эта подборка устарела. Отправь /news, чтобы получить свежие темы.';
default: fail('progress_event_unknown');
}
}
Указатель машинной диагностики
Ниже литеральные коды throw/error_code/failure из активных определений, сгруппированные по workflow. Это диагностический указатель включая общие невызываемые helper-ветки, не список пользовательских сообщений и не статистика произошедших ошибок. Динамические коды API, составные error_code, список конкретных validation_errors и условия их появления определяются полным Code в node-reference. HTTP-статусы renderer отдельно описаны в developer-guide.
| Код / исключение | Содержится в workflow |
|---|---|
| Configure a real OpenAI REST model ID with web_search support | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| Exact replacement differs from saved source | tKcwMnRnIJuaKYte |
| Expected stored binary PNG | tKcwMnRnIJuaKYte |
| Saved image required | tKcwMnRnIJuaKYte |
| Search instructions required | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| Unknown progress event | BFLStatusV031001 |
| Verification instructions required | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| article_body_missing | BFLNewsReader04 |
| article_needs_bounded_extraction | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| article_path_needs_adapter | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| batch_key_invalid | BFLNewsSearch04 |
| candidate_not_in_search_sources | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| card_reservation_failed | BFLNewsCard04 |
| category_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| content_type_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| cross_source_redirect | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| date_window_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| document_key_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| fact_pack_invalid | tKcwMnRnIJuaKYte |
| facts_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| html_extraction_failed | BFLNewsReader04 |
| invalid_candidates | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| invalid_date | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| invalid_output_json | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| invalid_output_object | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| invalid_response | tKcwMnRnIJuaKYte |
| limit_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| message_not_completed | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| missing_image | tKcwMnRnIJuaKYte |
| model_refusal | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| network_or_missing_response | tKcwMnRnIJuaKYte |
| news_caption_source_mismatch | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| news_facts_not_selected | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| news_format_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| news_request_not_authorized | BFLNewsSearch04 |
| not_owner | tKcwMnRnIJuaKYte |
| offer_results_incomplete | BFLNewsVerify04 |
| openai_http_ | BFLNewsSearch04 |
| png_limits | tKcwMnRnIJuaKYte |
| preview_contradictory_result | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_cover_bounds | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_empty_failure | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_exact_requires_owner_edit | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_exact_span_ambiguous | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_field_missing | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_issue_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_malformed_json | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_repair_ambiguous | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| preview_repair_overlap | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| publication_date_ambiguous | BFLNewsReader04 |
| publication_date_required | BFLNewsReader04 |
| read_id_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| read_id_mismatch | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| redirect_forbidden | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| redirect_limit | BFLNewsReader04 |
| redirect_relative_path_unsupported | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| relevance_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| responses_not_completed | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| saved_news_text_invalid | tKcwMnRnIJuaKYte |
| selected_content_type_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| selected_fact_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| selected_facts_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| selected_needs_source_check | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| selected_primary_document_required | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| selected_saved_response_mismatch | BFLNewsSelected041, tKcwMnRnIJuaKYte |
| snapshot_blocks_mismatch | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| snapshot_source_mismatch | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| source_block_not_found | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| source_ids_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| source_not_allowed | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| source_read_required | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| text_controls | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| text_incomplete | tKcwMnRnIJuaKYte |
| text_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| text_malformed_json | tKcwMnRnIJuaKYte |
| text_outcome_unknown | tKcwMnRnIJuaKYte |
| text_output_missing | tKcwMnRnIJuaKYte |
| text_refusal | tKcwMnRnIJuaKYte |
| text_response_failed | tKcwMnRnIJuaKYte |
| text_response_format | tKcwMnRnIJuaKYte |
| text_response_status | tKcwMnRnIJuaKYte |
| text_schema | tKcwMnRnIJuaKYte |
| topic_state_invalid | tKcwMnRnIJuaKYte |
| unknown_or_duplicate_read_id | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| url_forbidden | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| url_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| url_path_encoding_forbidden | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| url_query_invalid | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| verification_batch_size | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| verification_decision_missing | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| verification_results_incomplete | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| web_search_not_executed | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
| wrong_source_document | BFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte |
Регистрация и общие решения
- Разрешённый
/start: «Ваша роль: {владелец|редактор}. Команды: /post тема, /news, /retry ID версия, /resume ID версия. Общие черновики можно дорабатывать, отклонять и публиковать кнопками.» - Неизвестный
/start: «Доступ пока не выдан. Ваш Telegram ID: {ID}. Передайте его владельцу проекта.» - После решения: «Версия v{V} материала {DRAFT} {опубликована|отклонена|заменена новой версией|дорабатывается редактором USER_ID}.» При начале правки это сообщение получает второй участник; инициатор получает ForceReply.
- Служебное подтверждение: «БФЛ Контент: доступ подключён. Ваша роль: {роль}. Команды: /post тема, /news, /retry ID версия, /resume ID версия. Новые карточки и превью получают оба участника. Публикация — только после кнопки «Опубликовать» под рабочим черновиком.»
- Тестовое фото: «ТЕСТ ПОДКЛЮЧЕНИЯ ДВУХ РЕДАКТОРОВ. Сохранённая обложка проекта; новая генерация не запускалась. Это проверка доставки, кнопок публикации нет.» Далее фрагмент сохранённого текста.
Внутренние ошибки сервиса (например access_revoked, publication_not_claimed, feedback_session_mismatch, delivery_payload_conflict) не содержат ключей и не являются отдельными обещанными сообщениями пользователю. Необработанное исключение передаётся Error Workflow; он пытается уведомить инициатора и владельца. Штатное пустое/неподходящее ответвление само по себе не считается исключением. Неизвестный внешний исход остаётся блокирующим состоянием; диагностировать его нужно по execution и журналу доставок.
Необработанный технический отказ — сервис 1.0.1
Инициатору: «Обработка остановлена из-за технической ошибки. Сохранённый материал не удалён. Автоматический повтор не запущен, чтобы не повторить запрос или отправку. Сообщи владельцу код выполнения {EXECUTION_ID}.»
Владельцу при сбое редактора: «Технический отказ при обработке запроса редактора. Код выполнения {EXECUTION_ID}. Материал сохранён; автоматический повтор остановлен.»
Если execution ещё не удалось связать с действующим инициатором, уведомление адресуется владельцу. ID берётся из служебного события n8n, а не из произвольного сообщения участника. Тексты ошибок провайдера, ключи и request bodies в пользовательский ответ не включаются. Уведомления учитываются отдельно с ключом execution/recipient; неизвестная отправка не повторяется вслепую.