Управление задачами ИИ-агентов: цикл захвата как контракт, а не промпт
Как управлять задачами ИИ-агентов через цикл захвата, который соблюдает сервер: аренды, пульс, вопросы, отчёты и лимит на внимание человека.
Weft — это ИИ-менеджер задач для соло-основателей и небольших команд.
Автор: Andrei Finogeev ·
Управление задачами ИИ-агентов работает, когда циклом владеет доска, а не промпт: агент спрашивает, что делать, забирает одну задачу с арендой, которая истекает, если он замолчит, спрашивает человека только о решениях, которые принадлежат человеку, и заканчивает отчётом, который можно проверить. В Weft каждый из этих шагов — MCP-инструмент, который проверяет сервер, поэтому агент, пропустивший шаг, получает отказ или теряет задачу, а не тихо расходится с реальностью.
Weft делаем мы. Сведения о других продуктах взяты с их официальных страниц и проверены 27 октября 2026 года.
Почему список задач, вставленный в чат, перестаёт работать?
Вставить задачи в чат — первое, что пробуют все, и на один вечер это работает. Потом чат заканчивается, а вместе с ним и всё состояние. Агент знал, какой пункт закончил, от какого отказался и в чём не уверен. Теперь этого не знает никто.
Человек, вставивший список, превращается в ретранслятор: переносит результаты обратно на настоящую доску и переделывает работу, которую подхватила вторая сессия, потому что ничто не говорило, что она уже занята.
Доступ к доске решает проблему устаревшего снимка, но не остальное. Если из инструментов есть только «переместить карточку» и «добавить комментарий», цикл по-прежнему держится на том, что агент соблюдает договорённость из своих инструкций. А договорённости ломаются ровно тогда, когда что-то идёт не так: агент падает посреди работы или два агента стартуют в одну и ту же секунду.
Как выглядит цикл захвата в виде контракта?
В Weft у цикла пять шагов, и каждый — отдельный инструмент на одном MCP-эндпоинте, https://letsweft.com/api/mcp. Состояние между шагами хранит сервер, поэтому цикл переживает конец любого чата.
- get_my_work: спроси, прежде чем выбирать. Ответ говорит, что уже держит этот клиент, что ждёт человека, что просрочено или скоро наступит, и есть ли вообще место, чтобы что-то начать.
- start_task: захват с арендой. Захват длится 20 минут и переносит задачу в Doing. В ответе приходят
runId,leaseTokenиrenewEverySeconds: 300. Второй клиент, который попробует взять ту же задачу, получитalready_claimedи подсказку не дублировать работу. - report_progress: пульс. Каждый вызов с идентификатором запуска и токеном аренды продлевает аренду. Если агент умирает, пульс пропадает, и через 20 минут запуск помечается устаревшим, а задача снова становится ничьей — её может взять кто угодно. Потерянная аренда отвечает
lease_lost, и агент знает, что работа ему больше не принадлежит. - request_input: только для решений, которые принимает человек. Вопрос до 500 символов и до 10 вариантов ответа. Пока агент ждёт, захват сохраняется.
- complete_task: финиш с отчётом.
outcome,artifacts(доказательства — URL, коммит или хеш файла),notDone,unknownsиnextStep.
Почему аренда, а не статус? Потому что молчание — единственный сигнал, который может подать упавший агент. Карточка в Doing говорит, что над ней когда-то кто-то работал. Аренда говорит, что над ней работают сейчас, и сама перестаёт это говорить, когда это уже неправда.
Сам захват — одна вставка в базу данных, защищённая уникальным индексом. Когда два агента гонятся за задачей, победителя определяет база, и получить задачу оба не могут. А вот два комментария «Взял», оставленные с разницей в секунду, — оба вполне валидные комментарии.
Когда агенту вызывать request_input?
Когда он дошёл до того, что может решить только человек: что-то необратимое — деньги, публикация, прод, юридические вопросы — или настоящая развилка без разумного варианта по умолчанию. Но не для того, чтобы спросить разрешения продолжать.
Эта сдержанность важна, потому что вопрос стоит человеку столько же внимания, сколько готовая задача, и в Weft он идёт в тот же лимит. Вопрос попадает во Входящие, с пушем на телефон, а если ждёт 20 минут и дольше — ещё и с напоминанием на почту. Weft никогда не перезванивает агенту: ответ приходит при его следующем start_task или get_my_work. Пока вопрос открыт, агент держит задачу 60 минут; потом аренда снимается, но вопрос остаётся.
Что передаётся в вызов complete_task?
Короткий итог, доказательства и честный рассказ о том, где границы сделанного. Вот реалистичный пример для исправления бага:
{
"id": "9b2f6c1e-4d7a-4c3b-8e21-5a0f3d9c7b14",
"runId": "d41e8a90-2f6b-4e17-9c3a-71b5e0a4c8f2",
"leaseToken": "lt_3f9a…",
"outcome": "Fixed the 500 on /api/invoices when the customer has no billing address. Fix is in PR #418; the route now returns 422 with a field error.",
"artifacts": [
{ "kind": "url", "uri": "https://github.com/acme/app/pull/418" },
{ "kind": "commit", "uri": "a1c9e07" },
{ "kind": "url", "uri": "https://preview-418.acme.dev/api/invoices/health", "httpStatus": 200 }
],
"claims": [
"Added a test for an empty billing address; the invoices test file passes locally"
],
"notDone": [
"Did not merge the PR",
"Did not backfill the 14 invoices that failed last week"
],
"unknowns": [
"Whether the mobile app shows the 422 message or a generic error"
],
"nextStep": "Merge PR #418 to main"
}Артефакты — это то, что человек может проверить, не веря агенту на слово. notDone и unknowns — не признания вины: именно они отличают результат, на который можно опереться, от результата, который приходится восстанавливать по диффу. Вызов никогда не падает из-за отсутствия доказательств, потому что потерять готовую работу хуже, чем записать её непроверенной. Подробнее о том, как читать такие отчёты, — в статье «что сделал мой ИИ-агент».
Чем это отличается от «переместить карточку и написать комментарий»?
Руководство Hypertask по тому же циклу (взять, обновить, отчитаться, закрыть) хорошо описывает саму привычку. Захват в его MCP-версии — это загрузить задачу, перенести её в рабочий раздел и оставить комментарий о захвате, а направляет всё это промпт, который команда пишет в инструкции агента. Вот тот же цикл по шагам:
| Шаг цикла | Доска на одних договорённостях (агент двигает карточку и пишет комментарий) | Что Weft соблюдает принудительно и каким MCP-инструментом |
|---|---|---|
| Выбрать работу | Агент получает список задач и выбирает. Ничто не говорит ему, что человек уже завален проверками. | get_my_work возвращает, что уже держит этот клиент, что ждёт человека, что просрочено и есть ли место, чтобы что-то начать. |
| Захват | Перенести карточку в Doing и написать «Взял». Два агента могут сделать это в один момент, и оба будут считать задачу своей. | start_task берёт аренду на 20 минут одной записью в базу, защищённой уникальным индексом. Проигравший получает already_claimed с id и названием задачи. |
| Оставаться на связи | Комментарии о ходе работы, если агент про них вспомнит. Упавший агент оставляет карточку в Doing навсегда. | report_progress продлевает аренду (агенту сказано делать это каждые 5 минут). После 20 минут тишины запуск помечается устаревшим, и задача снова свободна. |
| Спросить | Комментарий «Заблокировано:». Агент останавливается или гадает; карточка может по-прежнему выглядеть как «в работе». | request_input кладёт вопрос с вариантами (до 10) во Входящие человека и сохраняет захват (60 минут, пока агент ждёт). Ответ возвращается через start_task или get_my_work. |
| Отчитаться | Итоговый комментарий в свободной форме. Его вид зависит от того, насколько хорош был промпт. | complete_task принимает именованные поля: outcome, artifacts, notDone, unknowns, nextStep. |
| Закрыть или отдать на проверку | Агент переносит карточку в Review или Done — как было сказано в промпте. | По умолчанию задача уходит в Done. Во Входящих на «Принять» / «На доработку» / «Позже» / «Отбросить» она останавливается, если требует проверки или не прошла проверку верификации. |
| Перегрузка | Ничего. Агенты продолжают начинать работу, а колонка Review растёт. | start_task отказывает с attention_queue_full, как только людей ждут 5 пунктов (один человек) или 10 (команда) либо 45 минут проверки. |
Справедливости ради: у Hypertask настоящие аренды есть. В документации перечислены эндпоинты для захвата аренды, пульса и освобождения, а в таблице известных ограничений сказано, что аренды задач, доказательства и эскалация доступны только как REST-эндпоинты — так задумано (обзор MCP Hypertask). В справочнике инструментов среди 21 MCP-инструмента нет инструмента аренды (справочник инструментов). Захватывать умеет и их CLI — отдельной необязательной командой (changelog, справочник CLI). Так что скриптовый агент на Hypertask может держать аренду, а агент, который работает через MCP в Claude Code или Cursor, получает вариант «карточка плюс комментарий», если только кто-нибудь не подключит REST-вызовы.
Если твои агенты работают как скрипты и задачи CI, CLI и REST API Hypertask — реальное преимущество, а у Weft нет ни того, ни другого: ни CLI, ни публичного REST API, ни вебхуков. Weft — для агентов, которые живут внутри MCP-клиента и которым нужно, чтобы цикл держался именно там.
Что видит человек?
Чаще всего — карточку в Done: по умолчанию завершённая задача сразу уходит туда, с итогом и доказательствами.
Во Входящих человека задача останавливается, если она помечена как требующая проверки или если не прошла проверка верификации. Там человек выбирает один из четырёх ответов:
- «Принять»: работа засчитана. Если агент передал nextStep, человек видит его над кнопкой («Если ты примешь, агент …»), и принятие одобряет ровно этот шаг, не больше. Одобрение действует 72 часа и возвращается к агенту через get_my_work или start_task.
- «На доработку»: вернуть с пояснением, что не так.
- «Позже»: не сейчас. «Отбросить»: больше этим не заниматься.
Входящие есть в вебе, а когда туда что-то попадает, человеку ещё приходит пуш в мобильном приложении Weft. Рукопожатие через nextStep не даёт агенту принять «вроде нормально» за разрешение смержить, задеплоить и отправить: он может сделать один одобренный шаг, а потом снова завершить задачу.
Почему агент получает отказ, вместо того чтобы начать новую работу?
Потому что дефицитный ресурс — внимание, а не работа. Агент успевает начать десять дел, пока человек проверяет одно.
Weft считает то, что ждёт людей: задачи на проверке плюс открытые вопросы. Когда набирается 5 пунктов в пространстве на одного человека, 10 в командном или примерно 45 минут оценённого времени проверки — смотря что наступит раньше, — start_task отказывает с attention_queue_full. Лимит зависит от того, сколько людей в пространстве, а не от тарифа.
Отказ — это инструкция, а не тупик. В нём указаны размер очереди, возраст самого старого пункта и вызовы, которые по-прежнему разрешены: report_progress, get_my_work, get_board_state и search. Шаг, который человек уже одобрил на этой карточке, под лимит не попадает, так что принятый «merge PR #418» очередь не заблокирует.
Как это настроить?
Подключи свой клиент и войди через браузер — никакого ключа копировать не нужно. Weft выдаёт refresh-токены, поэтому клиент сам продлевает вход. В Claude Code это одна команда, claude mcp add --transport http weft https://letsweft.com/api/mcp (страница настройки). В Cursor установка в один клик (Cursor), Codex нужна запись в конфиге и codex mcp login weft (Codex), а в ChatGPT есть опубликованное приложение Weft на любом тарифе, включая бесплатный (ChatGPT). Сервер сам описывает агенту цикл, так что отдельный промпт про жизненный цикл задачи не нужен.
Пошаговый разбор для Claude Code — в статье «доска задач для Claude Code». Про несколько агентов на одной доске, где аренды и already_claimed важнее всего, — в статье «несколько ИИ-агентов, одна доска». Сам протокол описан на modelcontextprotocol.io, а другие MCP-доски сравниваются на странице MCP task managers.
Чего Weft здесь не делает?
- Нет CLI, публичного REST API и вебхуков, поэтому cron-задачи и CI-пайплайны не могут вести цикл вне MCP-клиента.
- Нет интеграции с GitHub или Slack. Доказательства — это то, на что агент сослался в artifacts.
- Нет встроенного ИИ. Думает твой собственный ИИ-клиент — поэтому Weft и не нужны кредиты на ИИ.
Бесплатный тариф (Free) включает 50 задач и 200 вызовов ИИ в месяц. Pro стоит $7 за место в месяц или $60 за место в год (цены).
- Разве хорошего промпта недостаточно, чтобы агенты соблюдали цикл?
- Промпт описывает цикл, но не может заставить его соблюдать. Он не помешает двум агентам взять одну и ту же задачу и не освободит задачу, которую держит упавший агент. В Weft захват — это аренда, которой владеет сервер, поэтому такие случаи обрабатываются независимо от того, вспомнил ли агент свои инструкции.
- Что будет, если агент упадёт на полпути?
- Его пульс прекратится. Через двадцать минут после последнего report_progress запуск помечается устаревшим, токен аренды сбрасывается, и задача снова ничья — её может подхватить другой агент или человек. Карточка не висит в Doing неделю.
- Каждая готовая задача ждёт моей проверки?
- Нет. По умолчанию завершённая задача сразу уходит в Done с итогом и доказательствами. Во Входящих на «Принять», «На доработку», «Позже» или «Отбросить» она останавливается, только если требует проверки или не прошла проверку верификации.
- Зачем мне, чтобы агенту отказывали в работе?
- Затем, что иначе он будет и дальше производить то, что тебе некогда проверить. Как только людей ждут 5 пунктов (10 для команды) или около 45 минут проверки, start_task возвращает attention_queue_full и подсказывает агенту, что он ещё может сделать. Разберёшь очередь — блокировка снимется.
- У Hypertask тоже есть аренды. Почему важен именно MCP?
- Аренды Hypertask — это REST-эндпоинты, по его же документации (обзор MCP), и захватывать умеет ещё их CLI. Скриптовым агентам это подходит. Агент, который работает через MCP-инструменты в редакторе или чате, их там не получает, а в Weft получает: start_task, report_progress и complete_task — это MCP-инструменты.