БФЛ КонтентДокументация проекта
Разделы документации
Для разработчика

Ответы, статусы и ошибки бота

Обновлено 16 сентября 2026БФЛ Контент
На этой странице
  1. Статусы инициатору: подготовка и публикация
  2. Статусы инициатору: поиск
  3. Всплывающие ответы кнопок и подсказки
  4. Ошибки подготовки: адресация через контекст участника
  5. Карточка, превью и канал
  6. Точные параметры всех активных Telegram-узлов
  7. Исполняемый генератор ошибок/статусов материала
  8. Шаблон helper topicText
  9. Шаблон helper topicMessage
  10. Шаблон helper progressText
  11. Указатель машинной диагностики
  12. Регистрация и общие решения
  13. Необработанный технический отказ — сервис 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_rejectedTelegram отклонил отправку поста. Сохранённый текст и картинка не удалены. Сообщи об этой ошибке для проверки подключения бота; автоматического повтора нет.Проверка подключения/ошибки 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,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\") }}",
  "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,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\") }}",
  "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,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\") }}",
    "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,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\") }}",
    "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 supportBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
Exact replacement differs from saved sourcetKcwMnRnIJuaKYte
Expected stored binary PNGtKcwMnRnIJuaKYte
Saved image requiredtKcwMnRnIJuaKYte
Search instructions requiredBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
Unknown progress eventBFLStatusV031001
Verification instructions requiredBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
article_body_missingBFLNewsReader04
article_needs_bounded_extractionBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
article_path_needs_adapterBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
batch_key_invalidBFLNewsSearch04
candidate_not_in_search_sourcesBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
card_reservation_failedBFLNewsCard04
category_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
content_type_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
cross_source_redirectBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
date_window_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
document_key_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
fact_pack_invalidtKcwMnRnIJuaKYte
facts_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
html_extraction_failedBFLNewsReader04
invalid_candidatesBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
invalid_dateBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
invalid_output_jsonBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
invalid_output_objectBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
invalid_responsetKcwMnRnIJuaKYte
limit_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
message_not_completedBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
missing_imagetKcwMnRnIJuaKYte
model_refusalBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
network_or_missing_responsetKcwMnRnIJuaKYte
news_caption_source_mismatchBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
news_facts_not_selectedBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
news_format_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
news_request_not_authorizedBFLNewsSearch04
not_ownertKcwMnRnIJuaKYte
offer_results_incompleteBFLNewsVerify04
openai_http_BFLNewsSearch04
png_limitstKcwMnRnIJuaKYte
preview_contradictory_resultBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_cover_boundsBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_empty_failureBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_exact_requires_owner_editBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_exact_span_ambiguousBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_field_missingBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_issue_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_malformed_jsonBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_repair_ambiguousBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
preview_repair_overlapBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
publication_date_ambiguousBFLNewsReader04
publication_date_requiredBFLNewsReader04
read_id_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
read_id_mismatchBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
redirect_forbiddenBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
redirect_limitBFLNewsReader04
redirect_relative_path_unsupportedBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
relevance_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
responses_not_completedBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
saved_news_text_invalidtKcwMnRnIJuaKYte
selected_content_type_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
selected_fact_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
selected_facts_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
selected_needs_source_checkBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
selected_primary_document_requiredBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
selected_saved_response_mismatchBFLNewsSelected041, tKcwMnRnIJuaKYte
snapshot_blocks_mismatchBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
snapshot_source_mismatchBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
source_block_not_foundBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
source_ids_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
source_not_allowedBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
source_read_requiredBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
text_controlsBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
text_incompletetKcwMnRnIJuaKYte
text_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
text_malformed_jsontKcwMnRnIJuaKYte
text_outcome_unknowntKcwMnRnIJuaKYte
text_output_missingtKcwMnRnIJuaKYte
text_refusaltKcwMnRnIJuaKYte
text_response_failedtKcwMnRnIJuaKYte
text_response_formattKcwMnRnIJuaKYte
text_response_statustKcwMnRnIJuaKYte
text_schematKcwMnRnIJuaKYte
topic_state_invalidtKcwMnRnIJuaKYte
unknown_or_duplicate_read_idBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
url_forbiddenBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
url_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
url_path_encoding_forbiddenBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
url_query_invalidBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
verification_batch_sizeBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
verification_decision_missingBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
verification_results_incompleteBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
web_search_not_executedBFLNewsCard04, BFLNewsGround04, BFLNewsReader04, BFLNewsSearch04, BFLNewsSelected041, BFLNewsStatus04, BFLNewsVerify04, tKcwMnRnIJuaKYte
wrong_source_documentBFLNewsCard04, 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; неизвестная отправка не повторяется вслепую.