惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
Security Archives - TechRepublic
Security Archives - TechRepublic
A
About on SuperTechFans
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Webroot Blog
Webroot Blog
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
Simon Willison's Weblog
Simon Willison's Weblog
D
Docker
爱范儿
爱范儿
AI
AI
宝玉的分享
宝玉的分享
PCI Perspectives
PCI Perspectives
The Register - Security
The Register - Security
Project Zero
Project Zero
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
S
Securelist
Scott Helme
Scott Helme
B
Blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
月光博客
月光博客
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
F
Fortinet All Blogs
H
Help Net Security
Last Week in AI
Last Week in AI
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MyScale Blog
MyScale Blog
I
InfoQ
P
Privacy International News Feed
V
V2EX
有赞技术团队
有赞技术团队
G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Schneier on Security
T
Tailwind CSS Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как я проектировал очередь задач для работы с AI-агентом
J3d1fm · 2026-06-07 · via Все публикации подряд на Хабре

Средний

6 мин

4.8K

Когда я начал регулярно работать с AI-агентом, выяснилась неприятная вещь: само выполнение задачи часто уже не было главным узким местом. Узкое место появлялось раньше. Нужно было каждый раз вручную понять, какие задачи вообще можно отдать агенту, какие должен сделать человек, какие уже выполнены, но требуют проверки, а какие нельзя двигать без внешнего решения или доступа.

То есть вместе с AI появился новый слой работы: диспетчеризация. До этого я воспринимал таск-трекер как список дел. После нескольких недель работы с агентами стало понятно, что список дел сам по себе не отвечает на главный операционный вопрос:

кто должен сделать следующий шаг?

Именно из этого вопроса выросла маленькая система очередей для работы человека и AI-агента. В этой статье разберу модель, API и архитектурные решения, которые в итоге оказались полезными.

Почему обычная доска задач плохо ложится на agent workflow

Обычная доска хорошо показывает, что задача существует. Например, есть колонки Backlog, In progress, Done. Этого хватает, пока все задачи делает человек или команда людей.

С AI-агентом появляется дополнительное состояние, которого в классической доске обычно нет. Агент может уже сделать работу, но человек еще не принял результат. Или задача может быть технически исполнимой, но агенту не хватает доступа. Или наоборот: задача выглядит сложной, но для агента она полностью готова, потому что контекст, репозиторий и критерий готовности уже известны.

В результате простая колонка In progress перестает быть достаточно точной. В ней могут лежать совершенно разные ситуации:

  • задача сейчас делается человеком;

  • задача сейчас делается агентом;

  • агент закончил, но результат должен проверить человек;

  • задача заблокирована секретом, логином или решением;

  • задача не имеет владельца следующего действия.

Проблема не в названии колонки. Проблема в том, что система не отделяет жизненный цикл задачи от владельца следующего действия.

Два измерения вместо одного

Я разделил задачу на два независимых измерения:

  • статус;

  • владелец следующего действия.

Статус отвечает на вопрос: где задача находится в жизненном цикле. В моей модели достаточно таких состояний:

backlog
in_progress
waiting_review
blocked
done
cancelled

Владелец следующего действия отвечает на другой вопрос: кто должен двигать задачу дальше.

me
codex
unassigned

Смысл не в конкретном имени codex. В реальной системе это может быть любой AI-агент или несколько разных агентов. Важно другое: задача может быть в backlog, но уже иметь владельца codex, если для нее достаточно контекста. Точно так же задача может быть blocked, но владельцем следующего действия будет человек, потому что нужно принять решение или дать доступ.

Самое важное состояние для agent workflow — waiting_review. Агент не должен переводить свою работу сразу в done, если результат еще не принят человеком. Например, он мог открыть pull request, подготовить черновик письма, изменить конфигурацию или собрать отчет. Во всех этих случаях работа технически выполнена, но финальная ответственность остается у человека. Поэтому результат попадает в очередь проверки.

Как выглядит минимальная модель задачи

Я намеренно оставил модель небольшой. В MVP мне хватило таких полей:

title
description
status
assignee
origin
priority
due_at
reminder_at
source_name
source_url
source_context

origin нужен, чтобы понимать источник: ручной ввод, почта, мессенджер, задача из внешнего трекера или действие агента. source_context хранит краткий контекст, из которого была извлечена задача. Это позволяет не открывать заново письмо или тред в Slack только для того, чтобы понять, почему задача появилась.

При этом я специально не стал тащить в модель десятки полей из Jira, Linear или Asana. Если пытаться совместить все возможные трекеры в одной схеме, получается тяжелая универсальная сущность, которую неудобно использовать локально. Для очереди делегирования важнее компактность и понятный следующий шаг.

Очередь для агента

Отдельный UI для человека полезен, но агенту он не нужен. Агенту нужен машиночитаемый список задач, которые можно выполнять.

Поэтому отдельный endpoint возвращает очередь:

GET /api/agent/queue

Пример запроса:

curl "$TASK_TRACKER_URL/api/agent/queue?assignee=codex&sort=smart&limit=25" \
  -H "Authorization: Bearer $TASK_TRACKER_API_KEY"

В ответе есть summary, чтобы вызывающая сторона понимала общее состояние доски:

{
  "summary": {
    "active": 42,
    "overdue": 3,
    "due_soon": 4,
    "codex_ready": 12,
    "human_input": 18,
    "review": 5,
    "blocked": 2,
    "unassigned": 1
  },
  "tasks": []
}

Для агента это удобнее, чем читать всю доску. Он может запросить только задачи с владельцем codex, отсортировать их по приоритету и дедлайну, взять верхнюю задачу, перевести ее в in_progress, а после выполнения вернуть в waiting_review.

Захват задач из контекста

Следующая часть системы — нормализация задач из внешнего контекста. В моем случае источниками могут быть письма, сообщения, заметки встреч или другие трекеры. Но ядро системы не должно знать детали каждого источника. Иначе оно очень быстро превращается в комбайн со множеством OAuth-flow, токенов и исключений.

Я остановился на модели маленьких адаптеров:

  • webhook-адаптер получает событие из внешней системы и отправляет нормализованную задачу;

  • polling-адаптер периодически читает источник и создает задачи;

  • sync-адаптер читает очередь агента и при необходимости обновляет внешний трекер.

Контракт для загрузки задач из контекста выглядит так:

POST /api/agent/ingest/context

Пример payload:

{
  "origin": "email",
  "source_name": "Gmail thread from Alice",
  "source_url": "https://mail.google.com/...",
  "source_context": "Alice asked for revised numbers by Friday.",
  "tasks": [
    {
      "title": "Send Alice revised numbers",
      "assignee": "me",
      "priority": 2,
      "reminder_at": "2026-05-07T09:00:00Z"
    }
  ]
}

В такой схеме ядро отвечает только за очередь, статусы, дедлайны и API. Адаптеры отвечают за конкретные источники и хранят свои секреты отдельно. Это оказалось проще и безопаснее, чем пытаться встроить все интеграции в основное приложение.

Дедлайны по умолчанию

Еще одна практическая проблема: многие задачи приходят без явного срока. Если оставить их без даты, они быстро перестают всплывать в нужный момент.

Я добавил простое правило: если due_at не передан, сервер оценивает дедлайн по приоритету.

P1 -> около 1 дня
P2 -> около 3 дней
P3 -> около 7 дней
P4 -> около 14 дней
P5 -> около 30 дней

Это не попытка угадать настоящий дедлайн. Это защита от задач, которые бесконечно лежат без даты. Реальный срок, если он есть в исходном письме или трекере, всегда должен иметь приоритет над такой оценкой.

Архитектура MVP

Технически MVP получился довольно прямолинейным:

  • FastAPI отдает web UI и JSON API;

  • SQLite используется для локальной разработки;

  • Firestore можно использовать как hosted-хранилище;

  • Google OAuth защищает браузерный UI;

  • Bearer token защищает API для агентов и адаптеров;

  • отдельный reminder job может периодически читать /api/reminders/due.

Эта архитектура не самая модная, но у нее есть важное преимущество: она понятная. Локально можно запустить SQLite-версию, а production-вариант можно развернуть как Cloud Run + Firestore + Secret Manager.

Локальный запуск выглядит так:

python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --reload

После этого UI доступен на http://127.0.0.1:8000.

Что я бы сделал иначе

Первое, что стало понятно после использования: определение “AI-ready” задачи лучше не зашивать только в один признак assignee=codex. В будущем полезно хранить объяснение, почему задача считается готовой для агента. Например: “есть ссылка на репозиторий”, “есть критерий готовности”, “не требуется внешний логин”, “не требуется отправка сообщения без подтверждения”.

Второй момент — ревью должно быть более структурированным. Сейчас waiting_review просто показывает, что человек должен проверить результат. Но для agent workflow полезно хранить артефакты: ссылку на PR, список измененных файлов, тесты, summary, риски и следующий шаг.

Третий момент — адаптеры лучше держать отдельно от ядра. Сначала хочется положить в основной репозиторий все интеграции сразу, но это быстро усложняет безопасность и поддержку. Гораздо чище иметь маленькое ядро и набор примеров адаптеров.

Вывод

Чем лучше AI-агенты выполняют задачи, тем заметнее становится проблема маршрутизации. Человек не должен каждый раз вручную разбирать список дел и решать, что можно поручить агенту.

Для меня полезной оказалась модель, где задача описывает не только состояние, но и владельца следующего действия. Тогда доска превращается не просто в список, а в очередь делегирования:

  • что делает человек;

  • что может взять агент;

  • что ждет проверки;

  • что заблокировано;

  • что еще не разобрано.

Исходники прототипа лежат на GitHub