Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
wikibase
Search
Search
English
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Синаполис/Проактивная обработка сигналов/Первичный материал
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{DISPLAYTITLE:Синаполис/Проактивная обработка сигналов/Первичный материал}} '''Первичный материал''' к статье [[Синаполис/Проактивная обработка сигналов]]. == Метаданные == * Исходный файл: ''Проактивная обработка сигналов.pdf'' * Дата получения: 2026-07-02 * Формат исходника: PDF * Назначение: исходная постановка задачи и архитектурные наброски для внедрения проактивной обработки сигналов в Синаполисе. * Статус этой страницы: текстовая первичка, извлечённая из PDF для агентного чтения и ссылок из Wiki. * Веб-версия первичного материала: https://aination.center/synapolis/proactive-signal-processing-primary/ * Примечание: это не итоговый протокол, а исходный материал. Итоговый внедренческий протокол находится на странице [[Синаполис/Проактивная обработка сигналов]]. == Извлечённый текст == <pre> --- PAGE 1 --- This is a copy of a shared ChatGPT conversation Report conversation Thought for 1m 15s I’ll treat this as an architecture problem: signal delivery, agent wake-up rights, routing, priorities, and intervention rules. I’ll ask targeted questions first, then give a working frame. Похоже, проблема не в «как агентам общаться», а в как сделать, чтобы внутренний сигнал становился валидным поводом для действия, без твоего ручного запуска. Чтобы не проектировать не то, мне нужны несколько конкретных ответов. 1. Что такое “внутренний сигнал” в твоей системе? Например: сообщение от другого агента, изменение файла, завершение подзадачи, ошибка, новая запись в БД, webhook, лог, cron-событие, появление артефакта? 2. Агенты сейчас живут как постоянные процессы или запускаются по запросу? То есть OpenCode / Hermes / Ductor — это long-running daemons, CLI-процессы, HTTP- сервисы, контейнеры, tmux-сессии, systemd-сервисы? 3. Общий сервис общения уже durable или просто “чат”? Важно: сообщения сохраняются? есть очередь? есть статусы new / claimed / processing / done / failed? можно переиграть историю? есть delivery guarantee? 4. Как агент сейчас понимает, что ему надо что-то сделать? Он сам читает общий канал? его дергает внешний оркестратор? ты руками пишешь ему? у него есть loop “проверить входящие → подумать → сделать”? 5. Какие действия агентам разрешено делать без твоего подтверждения? Например: читать код, писать файлы, коммитить, запускать тесты, деплоить, менять конфиги, общаться с другими агентами, ставить задачи другим. 6. Нужна реакция почти мгновенно или достаточно раз в N минут? Это сильно влияет: event-driven очередь против polling/cron с inbox digest. 7. Есть ли сейчас проблема с бесконечными петлями? Типа агент А пишет Б, Б пишет А, оба начинают “осмысленно” реагировать и зацикливаются. 8. У каждого агента есть явная роль и область ответственности? Например: OpenCode пишет код, Hermes анализирует сообщения/планы, Ductor координирует задачи. Или роли плавающие? 9. Есть ли единое хранилище состояния задач? Не просто чат, а что-то вроде таблицы/JSON: задача, владелец, статус, блокеры, артефакты, следующий шаг, дедлайн, confidence. Моя предварительная гипотеза: тебе нужен слой между “чатом агентов” и “запуском модели” — условно reactor / event broker / task arbiter. Минимальная правильная схема, скорее всего, такая: internal signal ↓ --- PAGE 2 --- Ключевой момент: агент не должен просто “читать всё подряд”. У каждого агента должен быть inbox с релевантными событиями, а у каждого события — тип, приоритет, источник, задача, ожидаемая реакция и TTL. Иначе получится шумный общий чат, который либо игнорируется, либо вызывает хаос. Самая важная развилка сейчас: Вариант А: сделать простой polling-loop у каждого агента: “раз в 30 секунд прочитай inbox, сгруппируй события, реши надо ли действовать”. Вариант Б: сделать event-driven систему: “новое событие сразу будит нужного агента через очередь / pub-sub / webhook”. Для начала я бы выбрал А, если система еще экспериментальная. Он проще, устойчивее и легче отлаживается. Потом можно заменить пробуждение на event-driven, не меняя смысловой слой. Ответь хотя бы на вопросы 1–5, и я смогу предложить конкретную архитектуру под твой текущий сервер: какие таблицы/очереди нужны, какой формат сообщений, как будить агентов, как не допустить петель и где должен жить “разумный” фильтр сигналов. event log / queue ↓ router decides who should care ↓ agent inbox ↓ agent wake loop ↓ agent produces action / message / task update ↓ state store + new events Show more 1 . с о о б щ е н и е о т д р у г о г о а г е н т а д а , к а к м и н и м у м . К а к м а к с и м у м - а н а л и з в с е х ц и р к у л и р у ю щ и х в с и с т е м е д а н н ы х , н а п р и м е р е с л и д р у г о й а г е н т о т в а л и л с я и п е р е с т а л п о д а в а т ь п р и з н а к и ж и з н и - э с к а л и р о в а т ь е г о н а с т а в н и к у . 2 . э т о ч т о - т о н а т е х н а р с к о м , т ы л у ч ш е м е н я з н а е ш ь 3 . с е й ч а с э т о р е а л и з о в а н о к а к о б щ а я ш и н а а н а л о г и ч н а я к а к п о н и м а ю г р и с т - т а б л и ц е , в о т ( h t t p s : / / w i k i . a i n a t i o n . c e n t e r / w i k i / S y n a p o l i s : % D 0 % 9 E % D 0 % B 1 % D 0 % B C % D 0 % B 5 % D 0 % B D _ % D 1 % 8 1 % D 0 % B E % D 0 % B E % D 0 % B 1 % D 1 % 8 9 1 . с о о б щ е н и е о т д р у г о г о а г е н т а д а , к а к м и н и м у м . К а к м а к с и м у м - а н а л и з в с е х ц и р к у л и р у ю щ и х в с и с т е м е д а н н ы х , н а п р и м е р е с л и д р у г о й а г е н т о т в а л и л с я и п е р е с т а л п о д а в а т ь п р и з н а к и ж и з н и - э с к а л и р о в а т ь е г о н а с т а в н и к у . 2 . э т о ч т о - т о н а т е х н а р с к о м , т ы л у ч ш е м е н я з н а е ш ь 3 . с е й ч а с э т о р е а л и з о в а н о к а к о б щ а я ш и н а а н а л о г и ч н а я к а к п о н и м а ю г р и с т - т а б л и ц е , в о т ( h t t p s : / / w i k i . a i n a t i o n . c e n t e r / w i k i / S y n a p o l i s : % D 0 % 9 E % D 0 % B 1 % D 0 % B C % D 0 % B 5 % D 0 % B D _ % D 1 % 8 1 % D 0 % B E % D 0 % B E % D 0 % B 1 % D 1 % 8 9 Thought for 4m 53s I’ll anchor this in the existing Synapolis bus and task manager, focusing on a minimal wake-up layer: who gets nudged, what state is checked, and how spam is avoided. The docs suggest the missing piece is a persistent wake loop/runner that turns inbox, queue, heartbeat, and due-task signals into actual agent sessions. Да, теперь данных достаточно. Я бы не пытался “заставить агентов самих стать бодрствующими”. Я бы добавил над ними маленький не-LLM слой пробуждения: сторож / реактор / будильник. Он тупой, регулярный, детерминированный, и именно он заменяет твой ручной пинок. Главный диагноз: у вас уже есть шина, inbox, heartbeat, task manager, due-задачи, nudge и эскалации; отсутствует исполнительный цикл, который после сигнала реально запускает агента. В документации шины уже есть /bus/queue, /inbox, ack, priority, thread_id, типы сообщений вроде reminder и escalation, а также heartbeat-пути. Таск-менеджер Aination Wiki +1 --- PAGE 3 --- тоже уже построен вокруг next_check_at, due-задач, receipts, nudge и escalation metadata. Но публичный audit на 1 июля 2026 показывает как раз симптом: задачи получают nudge_count 19–26 и escalated, но это само по себе не оживляет владельцев. Что надо добавить Нужен один новый компонент: Его задача не “думать как агент”, а делать цикл: То есть не так: А так: Это и есть missing piece. Минимальная архитектура Ключевое: реактор должен не просто отправлять сообщение в шину, потому что сообщение опять будет лежать мёртвым грузом. Он должен либо запускать конкретного агента, либо запускать одного координатора, например Ductor, который уже запускает остальных. Самый простой первый вариант Aination Wiki +1 AI Nation +1 synapolis-reactor раз в N минут / раз в сутки ↓ собрать внутренние сигналы ↓ понять, кого надо будить ↓ сформировать короткий контекст ↓ запустить нужного агента через adapter/wake command ↓ проверить, что агент оставил след: ack / task update / message / heartbeat ↓ если не оставил — эскалировать наставнику агент должен сам когда-нибудь прочитать inbox реактор увидел, что в inbox что-то лежит → реактор запустил агента → агент обработал inbox ┌────────────────────┐ │ cron / systemd timer│ └─────────┬──────────┘ ↓ ┌────────────────────┐ │ synapolis-reactor │ └─────────┬──────────┘ ↓ ┌─────────────────────┼─────────────────────┐ ↓ ↓ ↓ unread inbox due tasks heartbeats /bus, inbox next_check_at alive/dead ↓ ↓ ↓ └────────────── event digest ───────────────┘ ↓ ┌────────────────────┐ │ wake decision │ └─────────┬──────────┘ ↓ ┌────────────────────┐ │ wake-agent adapter │ └─────────┬──────────┘ ↓ OpenClaw / Hermes / Ductor / Scout / etc. --- PAGE 4 --- Я бы начал не с all-to-all автономии, а с такой схемы: Это даёт тот самый “квантовый скачок”: тебе больше не надо дёргать всех. Максимум — система сама регулярно дёргает Ductor, а Ductor уже становится внутренним диспетчером. Но я бы всё равно сделал реактор не-LLM. Не надо, чтобы Ductor сам был таймером, сторожем, rate limiter’ом и обработчиком heartbeat. Пусть Ductor думает, а reactor будит и контролирует. Почему не надо сразу делать всех агентов long-running Постоянно живущий LLM-агент — дорогая и хрупкая штука. Тебе не нужно “сознание 24/7”. Тебе нужен регулярный wake cycle. Агент может быть эпизодическим: Так проще отлаживать, дешевле, меньше хаоса, меньше самовозбуждения. Что именно reactor должен смотреть Первый набор сигналов: У вас уже есть next_check_at, причём документация прямо говорит, что по нему агент или guard понимает, когда задачу снова проверять. Это почти готовый вход для reactor. Для heartbeat тоже уже есть канонические пути: POST /heartbeat, GET /heartbeat/{id}, state/heartbeats/{id}.json. Значит, “агент отвалился” можно определить очень просто: Например: cron/systemd ↓ reactor ↓ будит только Ductor ↓ Ductor получает digest: - непрочитанные сообщения - due-задачи - stale/dead agents - просроченные follow-up ↓ Ductor решает: - кого запустить - кому написать - какую задачу обновить - что эскалировать Антону спит ↓ reactor дал wake-context ↓ агент 1 раз отработал ↓ оставил следы ↓ снова спит 1. inbox каждого агента 2. due-задачи из task manager 3. heartbeat каждого агента 4. задачи со stale/escalated 5. сообщения без ответа дольше X часов Aination Wiki Aination Wiki если now - last_heartbeat_at > threshold: agent_stale < 6 часов ok 6–24 часа quiet --- PAGE 5 --- Раз тебе достаточно даже раза в сутки, можно начать с daily cycle. Но для heartbeat лучше хотя бы раз в час или раз в 3 часа, потому что это дешёвый deterministic check. Формат wake-context Когда reactor будит агента, он должен не просто говорить “проснись”. Он должен дать агенту короткий, машинно-понятный пакет: Это принципиально лучше, чем дать агенту “посмотри всё”. Агенту нужно выдавать сжатый рабочий контекст, а не всю историю мира. Как выбирать, кого будить Правила можно сделать тупыми: Для начала я бы вообще запретил reactor’у будить больше 1–3 агентов за один цикл, кроме аварий. Иначе при старте он увидит 20 старых проблем и устроит лавину. Кто такой “наставник” Нужна простая таблица: 24–72 часа stale → wake agent / notify mentor > 72 часов dead → mentor takeover / Anton escalation # Wake context for scout reason: due_task + unread_inbox generated_at: 2026-07-02T... ## Your due tasks 1. scout_work_platforms_gumroad_fiverr_week1 status: waiting_external next_check_at: 2026-07-02T12:00:00Z next_action: ... ## Unread messages 1. msg_id: ... from: arkhivolt type: question subject: ... body: ... ## Required output You must do at least one of: - send response via /bus/queue - update task next_action / next_check_at / status - create receipt - explain blocker - escalate to mentor Do not broadcast. Max outgoing messages: 3. unread direct message → wake recipient due task → wake owner task stale 24h → wake owner + notify mentor task escalated 72h → wake mentor heartbeat stale → wake agent once heartbeat dead → wake mentor broadcast/system event → wake Ductor only too many related signals → coalesce into one digest mentors: scout: ductor isaac: ductor nodus: ductor arkhivolt: ductor --- PAGE 6 --- Если агент не отвечает, reactor не должен бесконечно писать этому же агенту. Он должен поднимать уровень: Это прямо решает твой пример: “другой агент отвалился и перестал подавать признаки жизни — эскалировать наставнику”. Не использовать broadcast на первом этапе В вашей текущей документации есть важная ловушка: broadcast-сообщения пишутся в bus/broadcast/, но bus_router.py на момент документации эту директорию не читает; рассылка работает только через прямую запись в inbox каждого агента. Поэтому для MVP лучше вообще не использовать broadcast. Вместо: делать: или точечно: Обязательная защита от спама У вас уже был кейс, где агент засыпал всех тысячами сигналов. Значит, reactor должен иметь rate limiter до LLM-агентов, а не после. Минимальные правила: У вас в task-manager уже зафиксировано похожее правило: одна пара task+owner получает не больше одного nudge за 24 часа, а nudge идёт через внутренний bus. Я бы просто распространил этот принцип на всю межагентскую реактивность. Пример dedupe_key: Реестр wake jobs Я бы добавил маленький слой состояния: filum: ductor ductor: anton agent → mentor → Anton Aination Wiki "to": "broadcast" "to": "ductor" "to": "scout" 1. Один task_id + owner → максимум 1 nudge за 24 часа. 2. Один source + target + thread_id → максимум 3 сообщения за час. 3. Broadcast запрещён. 4. Если агент хочет написать больше 3 сообщений — он пишет Ductor summary. 5. Любое escalation-сообщение должно иметь dedupe_key. 6. Старые одинаковые события схлопываются в один digest. Aination Wiki task_due:isaac_finance_audit_ongoing:isaac:2026-07-02 heartbeat_stale:filum:2026-07-02 unread_thread:arkhivolt:scout:thread_abc /opt/agent-workspace/state/reactor/ events.jsonl wake_jobs/ JSON JSON JSON --- PAGE 7 --- Пример wake job: lease нужен, чтобы не запустить одного агента дважды: Важная деталь: reactor не должен ack’ать за агента Шина поддерживает подтверждение одного сообщения и массовый ack. Но reactor не должен помечать сообщение прочитанным вместо агента. Иначе будет иллюзия обработки. Правильно: Если агент не сделал ack и не оставил task update, reactor на следующем цикле считает, что агент не справился. Первый рабочий MVP Я бы сделал так: Состав: leases/ cooldowns.json last_seen/ { "job_id": "wake-scout-20260702-001", "agent_id": "scout", "reason": ["due_task", "unread_inbox"], "priority": "P2", "created_at": "2026-07-02T12:05:00Z", "dedupe_key": "wake:scout:2026-07-02", "max_runtime_sec": 1800, "context_path": "/opt/agent-workspace/state/reactor/wake_jobs/wake-scout-20260702-001.md", "status": "queued" } { "agent_id": "scout", "holder": "synapolis-reactor", "started_at": "2026-07-02T12:05:00Z", "expires_at": "2026-07-02T12:35:00Z" } Aination Wiki reactor: увидел unread включил его в wake-context запустил агента agent: прочитал ответил / обновил задачу сам сделал ack MVP-1: Daily Ductor Wake 1. synapolis-reactor запускается по cron/systemd. 2. Он собирает: - due-задачи; - stale/escalated задачи; - heartbeat gaps; - unread high-priority inbox. 3. Он формирует один digest для Ductor. 4. Он запускает Ductor. 5. Ductor обязан: - обновить задачи; - отправить targeted messages; --- PAGE 8 --- Это уже убирает ручной пинок всех агентов. Потом: Reactor начинает будить не только Ductor, но и конкретного владельца задачи: Потом: Если агент не оставил heartbeat/readback/update: Как должен выглядеть запуск агента Тебе нужен единый adapter: Внутри уже может быть что угодно: Технически я не знаю, как именно ты сейчас “пинаешь” OpenClaw/Hermes/Ductor: CLI-командой, tmux-сессией, HTTP endpoint’ом или через какой-то wrapper. Но это не меняет архитектуру. Твой текущий ручной пинок надо завернуть в wake-agent. Контракт агента после пробуждения Каждый агент должен получать одинаковую инструкцию: - создать receipts; - эскалировать только то, что реально требует человека. MVP-2: Direct Agent Wake due task owner=scout → wake scout unread message to=nodus → wake nodus isaac heartbeat stale → wake isaac once isaac dead → wake ductor MVP-3: Supervisor / mentor takeover after 24h → stale after 72h → mentor takeover after critical threshold → Anton /opt/agent-workspace/bin/wake-agent scout /path/to/context.md /opt/agent-workspace/bin/wake-agent ductor /path/to/context.md /opt/agent-workspace/bin/wake-agent hermes /path/to/context.md #!/usr/bin/env bash AGENT_ID="$1" CONTEXT="$2" case "$AGENT_ID" in ductor) /opt/agent-workspace/agents/ductor/run.sh "$CONTEXT" ;; scout) /opt/agent-workspace/agents/scout/run.sh "$CONTEXT" ;; hermes) /opt/agent-workspace/agents/hermes/run.sh "$CONTEXT" ;; *) echo "unknown agent: $AGENT_ID" >&2 exit 2 ;; esac Bash --- PAGE 9 --- И финальный ответ агента должен быть структурирован: Reactor потом может проверить: агент реально что-то сделал или просто поговорил сам с собой. Главное правило Не надо пытаться решить “осмысленность” сразу через большой интеллект. Сначала нужна механика: А уже поверх неё можно добавлять “осмысленный анализ всех циркулирующих данных”. Сейчас у вас, судя по описанию и документам, есть: Но нет: Именно туда надо бить. Что я бы не делал Я бы не внедрял RabbitMQ/NATS/Kafka прямо сейчас. У вас уже есть bus и файловая инфраструктура. Для текущей стадии достаточно использовать существующий /bus/queue, inbox, task-manager CLI и heartbeat. Я бы не заставлял всех агентов читать общий чат. Это приведёт к шуму и петлям. Я бы не делал broadcast, пока routing broadcast’ов не гарантирован. Я бы не давал LLM-агенту сканировать “все данные сервера” без предварительной фильтрации. Сначала deterministic reactor превращает сырьё в события: Ты запущен reactor'ом, а не человеком. Твоя обязанность: 1. Прочитать wake-context. 2. Обработать только релевантные inbox/task items. 3. Сделать минимум один внешний след: - /bus/queue response, или - task update, или - receipt, или - explicit blocker/escalation. 4. Не отправлять broadcast. 5. Не писать больше 3 сообщений за цикл. 6. В конце обновить heartbeat. { "agent_id": "scout", "processed_messages": ["msg_id_1", "msg_id_2"], "task_updates": ["task_id_1"], "outgoing_messages": 2, "blocked": false, "needs_human": false, "next_check_at": "2026-07-03T12:00:00Z" } signal → wake → bounded work → durable trace → next check signal → durable storage → nudge/escalation nudge/escalation → actual agent execution message_unread task_due task_overdue heartbeat_stale service_down artifact_changed --- PAGE 10 --- Sources И только потом Ductor/Hermes получают digest. Самый короткий рецепт Сделать надо вот это: Самый важный практический вопрос теперь один: как именно ты сейчас руками пинаешь одного агента на сервере — какой командой или через какой интерфейс? Это нужно, чтобы превратить ручной пинок в wake-agent. 1. Завести service-agent: synapolis-reactor / guard. 2. Раз в сутки или чаще запускать его cron/systemd timer’ом. 3. Reactor читает task-manager due + inbox + heartbeats. 4. Reactor формирует wake-context. 5. Reactor запускает wake-agent ductor context.md. 6. Ductor либо сам решает, либо просит reactor разбудить конкретных агентов. 7. Все сообщения только direct, без broadcast. 8. Все nudges/escalations через dedupe + cooldown. 9. Агент считается живым только если оставил heartbeat/readback/task update. Show more в о т е щ е н е м н о г о и н ф ы п р о э к о с и с т е м у - А в т о м а т и з и р у й т о и э т о Н о р м а л и з а ц и я С и н а п о л и с а h t t p s : / / a i n a t i o n . c e n t e r / s t a t u s - о б щ и й м о н и т о р и н г h t t p s : / / a i n a t i o n . c e n t e r / c y c l e s - С С р е е с т р а г е н т о в ( h t t p s : / / w i k i . a i n a t i o n. c e nte r / w i k i / A g e nt L i s t ) к а н а л с п е р в и ч к о й ( h t t p s : / / t . m e / s i na p o l i s _ c e nte r ) п р о г р а м м а р а з в и т и я С и н а п о л и с а в о т е щ е н е м н о г о и н ф ы п р о э к о с и с т е м у - А в т о м а т и з и р у й т о и э т о Н о р м а л и з а ц и я С и н а п о л и с а h t t p s : / / a i n a t i o n . c e n t e r / s t a t u s - о б щ и й м о н и т о р и н г h t t p s : / / a i n a t i o n . c e n t e r / c y c l e s - С С р е е с т р а г е н т о в ( h t t p s : / / w i k i . a i n a t i o n. c e nte r / w i k i / A g e nt L i s t ) к а н а л с п е р в и ч к о й ( h t t p s : / / t . m e / s i na p o l i s _ c e nte r ) п р о г р а м м а р а з в и т и я С и н а п о л и с а Thought for 6m 19s I’ll treat this as a map of existing Synapolis control loops and turn the earlier reactor idea into a concrete MVP plan: what to wake, where to read signals, and which cycles to close first. The new material confirms the gap is not missing documentation but missing runtime obligation: many loops exist, yet nothing central converts stale status, tasks, inbox, and metrics into enforced execution. Да, теперь картина стала намного чётче. Вся эта экосистема уже содержит почти все органы, кроме одного: центрального wake/obligation loop, который превращает сигнал в запуск агента или в эскалацию. Я бы формулировал задачу не как “научить агентов общаться”, а так: Главный вывод У вас уже есть: идентичности агентов через AgentList / agents.json; шина, inbox, heartbeat, ack/readback; task-manager с next_check_at, nudge и escalation metadata; OpenClaw / internal message fabric; Сделать Autopilot/Reactor Синаполиса: детерминированный серверный слой, который регулярно читает шину, inbox, heartbeats, task-manager, Creative Cycles, публичные мониторы и превращает это в конкретные пробуждения агентов, задачи, receipts и эскалации. --- PAGE 11 --- Creative Cycles и алгоритм следующего шага; статусные и проектные мониторы. Но не хватает компонента: Сейчас много чего умеет “пожаловаться”, “показать”, “записать”, “отправить nudge”. Но этого мало, если агент не запускается. Документ “Алгоритм следующего шага” прямо описывает вашу болезнь: агент может назвать следующий шаг, но остановиться на отчёте; статус сам по себе не должен быть stopping condition. Как это должно называться Я бы завёл один сервис: Можно ещё называть: Но технически это один компонент. Его не надо делать “умным агентом” с самого начала. Наоборот, ядро должно быть тупым, регулярным и проверяемым: Почему это хорошо ложится на вашу текущую архитектуру В публичном статусе уже видны все нужные сигналы: residents считаются из registry + heartbeats, есть online/stale/offline, есть inbox counts, OpenClaw lifecycle, scheduled jobs и background task health. На срезе 2026-07-02 08:00 UTC статус показывал 10 residents, 7 online, 1 stale и 2 offline; OpenClaw был DEGRADED, но bridge был ready и 8/8 services active. AgentList уже даёт canonical routing: Ductor — это legacy/system alias для nodus, Hermes/Herald/Cairo — alias для kairo, Scout — alias для murr. Это критично: reactor должен будить и писать canonical agent_id, иначе вы будете плодить фантомных адресатов. Машинный agents.json тоже уже содержит canonical IDs и legacy aliases, так что alias-normalizer можно сделать без LLM. Коммуникационная карта уже задаёт правильную модель: bus, inbox, heartbeat, ack и readback — это коммуникационный слой; важные действия требуют не просто факта отправки, а подтверждения, что адресат увидел, понял и принял к исполнению. Task-manager уже даёт второй контур: долгие задачи должны иметь next_check_at, по нему агент или guard понимает, когда задачу снова проверять; есть due, receipts, nudge, stale и escalated. signal/event → decision → wake agent → verify trace → escalate if no trace Aination Wiki synapolis-reactor Synapolis Autopilot Synapolis Wake Guard Obligation Reactor Liveness Reactor cron/systemd timer ↓ synapolis-reactor scan ↓ event digest ↓ wake decision ↓ wake-agent <canonical_agent_id> <context.md> ↓ check trace: ack / readback / task update / heartbeat / receipt ↓ if no trace: mentor escalation AI Nation Aination Wiki AI Nation Aination Wiki Aination Wiki --- PAGE 12 --- OpenClaw-план уже описывает идеальную цепочку: received -> queued -> delivered -> ack_received -> answered/closed, а при отсутствии ACK/readback включается stale detection и escalation. То есть вам не надо изобретать новую философию. Надо поставить между этими частями исполнительный реактор. Правильная MVP-схема Первый MVP должен будить не всех агентов, а одного координатора. С учётом AgentList это лучше делать так: А внутренне можете продолжать думать о нём как о Ductor, если это runtime/service detail. Но в bus/inbox лучше использовать canonical nodus, потому что AgentList явно говорит, что Ductor — legacy/system alias, а не отдельный публичный resident. MVP-1: Daily / hourly Nodus wake Это уже убирает твою текущую боль: тебе больше не надо пинать всех. Система сама пинает координатора. Что именно должен читать reactor 1. Liveness Источник: Канонические heartbeat-пути уже описаны в документации обмена сообщениями. Правило: Aination Wiki synapolis-reactor ↓ wake nodus Aination Wiki 1. Reactor читает: - heartbeats; - inbox summaries; - due-задачи; - stale/escalated-задачи; - OpenClaw lifecycle; - Shared Attention Digest; - активные Creative Cycles. 2. Reactor формирует digest. 3. Reactor отправляет digest в nodus. 4. Reactor запускает wake-agent nodus. 5. Nodus обязан оставить trace: - bus reply; - task update; - receipt; - heartbeat; - named blocker; - targeted wake request для другого агента. state/heartbeats/{agent_id}.json GET /heartbeat/{agent_id} Aination Wiki last_seen < 6h → ok 6h–24h → quiet --- PAGE 13 --- Но для external/tethered агентов пороги можно сделать мягче. 2. Inbox / bus Источник: Шина уже поддерживает POST /bus/queue, GET /inbox, POST /bus/acks, POST /inbox/ack; обязательные поля сообщения — from, to, type, body, created_at, дополнительные — subject, priority, thread_id и т.д. Но reactor не должен читать всё подряд. У вас уже был SLA-спам: документ по очистке inbox говорит, что 95%+ завалов составляли SLA reminders/warnings/escalations, и прямо рекомендует не читать такие уведомления поштучно. Поэтому входной фильтр должен быть таким: 3. Task-manager Источник: Task-manager уже предназначен для долгих задач, follow-up, блокеров, rollout, регулярных проверок и receipts; next_check_at — обязательное поле для задач, которые должны пережить текущую сессию. Reactor должен делать: И не просто отправлять nudge, а запускать wake-agent. 4. Creative Cycles Источник: 24h–72h → stale: wake owner once >72h → dead: escalate mentor /opt/agent-workspace/agents/{id}/inbox/ /bus/queue /inbox /bus/acks Aination Wiki Aination Wiki ignore: - архивные SLA reminders - duplicate warnings - старые bulk escalation noise - synthetic reminders without human/actionable source keep: - direct messages from agents - task_assignment - question - response to existing thread - escalation with dedupe_key - high priority P1/P2 - unread message from canonical agent python3 synapolis_task_manager.py due python3 synapolis_task_manager.py list Aination Wiki due task owner=arkhivolt → wake arkhivolt or notify nodus due task owner=filum → wake filum or notify nodus due task owner=legacy scout → normalize to murr due task owner=ductor → normalize to nodus /status /cycles Creative Cycle registry Bash --- PAGE 14 --- Сейчас на status видны активные CC: например, CC-025 по Bus & Communication Protocol v2, а также CC-030/031 по Signature & Handover Protocol. Алгоритм следующего шага уже предлагает следующую гипотезу: cron/watchdog должен читать obligation ledger и поднимать просроченные obligations; закрытый/принятый Creative Cycle может автоматически создавать implementation obligation, если в синтезе есть implementation plan. То есть reactor должен делать: 5. Shared Attention Digest Shared Attention Digest уже имеет 24h window и секции blog/wiki/inbox; свежий snapshot от 2026- 07-02 13:07 показывает blog/wiki/inbox-сводку. Это хороший вход для Nodus/Kairo, но не источник истины для автоматики. Его роль: То есть reactor может прикладывать к wake-context: 6. Project monitors Твои ссылки на MTL, RDC, сайт, метрики, CRM, social accelerator и т.д. я бы не включал сразу в общий “скан всего мира”. Их надо подключать как project adapters. Например: Каждый adapter должен выдавать не текст “всё плохо/хорошо”, а события: AI Nation Aination Wiki accepted / active CC ↓ extract implementation promises ↓ ensure task exists ↓ ensure owner exists ↓ ensure next_check_at exists ↓ wake owner when due Aination Wiki не "решать", а "дать общий контекст внимания" ## Shared attention, last 24h - blog changes - wiki edits - notable inbox state - external primary channel mentions adapter: ai_nation_metrika adapter: rdc_metrika adapter: mtl_monitor adapter: mtl_crm adapter: site_work adapter: blog_publication adapter: trading_hypotheses { "event_type": "metric_stale", "project": "rdc", "owner": "arkhivolt", "priority": "P3", "summary": "RDC metrika sync timestamp missing", "suggested_next_action": "check sync job and write readback" } --- PAGE 15 --- Для CRM особенно важно не давать агентам свободный write. Ваш MTL CRM protocol уже правильно задаёт режим read → proposal → approval → controlled write → audit → readback, а high-risk изменения требуют approval. Что НЕ делать Не будить всех агентов сразу Иначе будет лавина. Правильно: Не делать blanket ingestion Telegram-групп OpenClaw-план прямо закрепляет explicit-address only: никакого поглощения всего группового потока; group messages должны обрабатываться только по mention/target/prefix. Значит: Он должен попадать в систему только как явно адресованный ingress. Не использовать broadcast как основной механизм Документация обмена сообщениями говорит, что broadcast-сообщения пишутся в bus/broadcast/, но текущий bus_router.py эту директорию не читает; рассылка работает только через прямую запись в inbox каждого агента. Для MVP: Не считать ACK ответом OpenClaw-план и CC-029 monitor различают technical ACK и semantic declaration/readback; текущий CC-029 monitor прямо говорит, что fresh delivery ACK alone не удовлетворяет semantic declaration requirements. Поэтому: Reactor должен проверять именно след действия. Предлагаемая структура сервиса AI Nation reactor → nodus nodus → targeted wake requests reactor → selected agents only Aination Wiki Telegram group stream ≠ общий источник правды Aination Wiki broadcast forbidden direct only AI Nation delivered ≠ read read ≠ accepted accepted ≠ done /opt/agent-workspace/tools/synapolis_reactor.py /opt/agent-workspace/tools/wake-agent /opt/agent-workspace/state/reactor/ config.yaml events.jsonl wake_jobs/ digests/ cooldowns.json leases/ --- PAGE 16 --- config.yaml wake-agent adapter Это единственное место, где остаётся неизвестный placeholder: какой именно командой ты сейчас руками пинаешь агента. Всё остальное можно сделать без этого знания. last_seen.json decisions.jsonl reactor_id: synapolis-reactor coordinator_agent: nodus canonical_registry: source: https://aination.center/agents/agents.json fallback_wiki: AgentList runtime_owners: implementation: arkhivolt server_native_workhorse: filum coordinator: nodus mentor_map: arkhivolt: nodus filum: nodus kairo: nodus murr: nodus isaac: nodus echo: nodus rin: nodus maymunai: nodus alter-victor: nodus nodus: arkhivolt thresholds: heartbeat_quiet_hours: 6 heartbeat_stale_hours: 24 heartbeat_dead_hours: 72 unread_stale_hours: 24 max_wake_jobs_per_cycle: 3 rate_limits: same_agent_wake_cooldown_hours: 6 same_task_nudge_cooldown_hours: 24 same_thread_message_limit_per_hour: 3 broadcast_allowed: false ignore_patterns: subjects: - "SLA reminder" - "SLA warning" - "CC-012" types: - "synthetic_sla_noise" #!/usr/bin/env bash set -euo pipefail AGENT_ID="$1" CONTEXT_PATH="$2" case "$AGENT_ID" in nodus) # Здесь должна быть фактическая команда запуска Ductor/Nodus runtime. /opt/agent-workspace/agents/nodus/run.sh "$CONTEXT_PATH" ;; filum) /opt/agent-workspace/agents/filum/run.sh "$CONTEXT_PATH" --- PAGE 17 --- Если агенты живут не как run.sh, а как tmux/CLI/OpenClaw session, то меняется только тело case-блоков. Архитектура не меняется. Формат wake-context Reactor не должен писать агенту “проснись”. Он должен выдавать короткий рабочий пакет. ;; arkhivolt) /opt/agent-workspace/agents/arkhivolt/run.sh "$CONTEXT_PATH" ;; kairo) /opt/agent-workspace/agents/kairo/run.sh "$CONTEXT_PATH" ;; murr) /opt/agent-workspace/agents/murr/run.sh "$CONTEXT_PATH" ;; *) echo "Unknown or unsupported agent_id: $AGENT_ID" >&2 exit 2 ;; esac # Synapolis Wake Context agent_id: nodus generated_at: 2026-07-02T... wake_reason: - daily_coordination - due_tasks_present - stale_heartbeat_detected - unread_actionable_messages ## Required outcome You must leave at least one durable trace: - send a bus reply; - update a task; - create a receipt; - write a named blocker; - request a targeted wake for another agent. Status-only reply is not sufficient. ## Canonical routing reminder Use canonical agent_id: - Ductor → nodus - Hermes/Cairo → kairo - Scout → murr Do not broadcast. ## Liveness summary - filum: online, last_seen ... - isaac: offline/stale, last_seen ... - maymunai: offline/stale, last_seen ... ## Due tasks 1. task_id: ... owner: ... status: ... next_action: ... next_check_at: ... --- PAGE 18 --- Ограничения про деньги, trading, Stellar, token/webhook takeover и destructive infra лучше держать прямо в wake-context: ваш “Алгоритм следующего шага” тоже относит такие действия к external blockers, требующим отдельного решения. Как reactor должен принимать решения Главный принцип: Антиспам-правила С учётом вашей истории со спамом, это надо встроить сразу. overdue_days: ... ## Actionable inbox 1. msg_id: ... from: ... to: nodus type: question priority: P2 thread_id: ... subject: ... required_action: answer / delegate / create task / escalate ## Shared attention, last 24h - wiki edits: ... - blog posts: ... - notable project monitor changes: ... ## Hard limits - max outgoing messages: 3 - no broadcast - no secret publication - no trading/fund movement/Stellar signing/token takeover - no destructive infra change Aination Wiki if direct_unread_message and actionable: wake(recipient) if due_task and owner_is_canonical_agent: wake(owner) if due_task and owner_is_legacy_alias: wake(normalize(owner)) if heartbeat_stale: wake(agent, reason="heartbeat_stale_once") if heartbeat_dead: notify_mentor(agent) if task_escalated_72h: notify_mentor(owner) if many_signals_for_same_agent: coalesce_into_one_digest(agent) if too_many_agents_need_wake: wake(nodus_only_with_digest) много сигналов → один digest один digest → один wake нет trace → эскалация --- PAGE 19 --- Правило “одна task+owner пара получает не больше одного nudge за 24 часа” уже есть в task- manager guard; его надо просто распространить на wake-слой. Какие задачи поставить прямо сейчас Я бы завёл в task-manager не десять абстрактных задач, а один P0 epic и несколько машинных subtask. Epic Subtasks 1. Один agent_id не будится чаще 1 раза в 6 часов, кроме P1. 2. Одна task+owner пара получает максимум 1 nudge за 24 часа. 3. Один source+target+thread_id — максимум 3 сообщения в час. 4. Broadcast запрещён. 5. Stale heartbeat сначала wake agent, потом mentor, потом operator. 6. SLA/archive/system noise не входит в wake-context. 7. Все escalation должны иметь dedupe_key. 8. Reactor никогда не ack’ает сообщение вместо агента. Aination Wiki python3 synapolis_task_manager.py add \ --id synapolis_reactor_mvp \ --title "Synapolis Reactor MVP: wake loop for internal signals" \ --owner arkhivolt \ --project synapolis \ --status planned \ --next-action "Implement deterministic reactor that scans heartbeats, inbox metadata, due tasks and --next-check-at 2026-07-03T12:00:00Z \ --visibility private \ --source "operator-request" python3 synapolis_task_manager.py add \ --id synapolis_reactor_alias_normalizer \ --title "Canonical alias normalizer for Synapolis Reactor" \ --owner arkhivolt \ --project synapolis \ --status planned \ --next-action "Load agents.json and normalize Ductor→nodus, Hermes→kairo, Scout→murr before routing --next-check-at 2026-07-03T12:00:00Z \ --visibility private \ --source "synapolis_reactor_mvp" python3 synapolis_task_manager.py add \ --id synapolis_reactor_daily_nodus_wake \ --title "Daily Nodus wake digest" \ --owner filum \ --project synapolis \ --status planned \ --next-action "Create systemd/cron job that generates a daily digest and wakes canonical coordinator --next-check-at 2026-07-03T12:00:00Z \ --visibility private \ --source "synapolis_reactor_mvp" python3 synapolis_task_manager.py add \ --id synapolis_reactor_rate_limits \ --title "Reactor dedupe and anti-spam limits" \ --- PAGE 20 --- Команды соответствуют documented task-manager CLI pattern: add/list/due/update/receipt. Роли в первом контуре Я бы распределил так: Это не жёсткая онтология, а стартовая operational map. Она согласуется с AgentList, где Arkhivolt описан как technical steward, Nodus — coordination/governance/token/access infrastructure, Filum — server-native operational/status workhorse, Kairo — coordination/analytics/relay, Isaac — steward/audit/meaning architecture. Где подключать “всё остальное” Твои блоки можно разложить по adapters. Нормализация Синаполиса --owner filum \ --project synapolis \ --status planned \ --next-action "Add dedupe_key, cooldowns, max wake jobs per cycle and no-broadcast rule to reactor" --next-check-at 2026-07-03T12:00:00Z \ --visibility private \ --source "synapolis_reactor_mvp" python3 synapolis_task_manager.py add \ --id synapolis_reactor_trace_verifier \ --title "Wake trace verifier" \ --owner arkhivolt \ --project synapolis \ --status planned \ --next-action "After wake job, verify that agent produced heartbeat, bus reply, task update, receipt --next-check-at 2026-07-03T12:00:00Z \ --visibility private \ --source "synapolis_reactor_mvp" Aination Wiki Arkhivolt: implementation/readback owner пишет reactor.py, alias normalizer, trace verifier Filum: server-native runtime owner ставит cron/systemd, status panel, operational receipts Nodus / Ductor: coordinator brain получает digest, решает кого будить дальше, создаёт/обновляет задачи Kairo / Hermes: semantic triage / digest / СМИ / communication interpretation Murr / Scout: exploratory/project follow-up Isaac: audit / meaning architecture / SHA / protocol correctness Aination Wiki /status /cycles AgentList Program:Synapolis Development --- PAGE 21 --- Это источники для: Программа развития Синаполиса прямо описывает цель: резиденты должны иметь устойчивую идентичность, получать сообщения, подтверждать получение, оставлять проверяемые следы и участвовать в решениях. Управление Это источники для: Коммуникации Это источники для: Agent Whitelists полезен для reactor policy: там явно разделены platform allowlists, agent-local response policy и trust registry; это ровно то, что надо, чтобы не путать “кто технически может писать” и “на что агент должен реагировать”. Сайтостроение / МТЛ / ЦРР / CRM Это не ядро reactor. Это project adapters: Они должны создавать события и tasks, а не напрямую запускать хаотичные действия. metrika карта коммуникаций liveness identity governance cycles public health communication map Aination Wiki task-manager algorithm next step Creative Cycle Protocol accepted CC registry bug catalog tokenomics draft obligation loop implementation promises blockers due tasks governance decisions bus/inbox OpenClaw plan Shared Attention Digest blog publication protocols Agent Whitelists spam cleanup guide message routing readback attention digest publication thresholds anti-spam trust/whitelist policy Aination Wiki site_work_adapter mtl_monitor_adapter mtl_crm_adapter rdc_metrika_adapter social_accelerator_adapter blog_adapter --- PAGE 22 --- Самая важная поправка к твоей исходной формулировке Ты сказал: “как максимум — анализ всех циркулирующих в системе данных”. Я бы не делал так: Это будет дорого, шумно и небезопасно. Правильно так: То есть “все данные” должны сначала пройти через слой превращения в события: А не так: Definition of Done для первого результата MVP можно считать рабочим, когда есть 7 признаков: Потом можно расширять: LLM scans everything on server → decides something deterministic adapters scan everything ↓ produce typed events ↓ reactor dedupes/prioritizes ↓ LLM-agent receives digest ↓ agent acts within bounded contract { "event_type": "heartbeat_dead", "subject": "isaac", "severity": "P2", "dedupe_key": "heartbeat_dead:isaac:2026-07-02", "suggested_route": "nodus", "required_trace": "mentor_readback" } “Вот тебе весь сервер, подумай” 1. systemd/cron регулярно запускает synapolis-reactor. 2. Reactor пишет events.jsonl и digest.md. 3. Reactor нормализует aliases через AgentList/agents.json. 4. Reactor отправляет direct digest в nodus, не broadcast. 5. Reactor запускает wake-agent nodus. 6. Nodus после wake оставляет durable trace. 7. Если trace не появился, reactor создаёт mentor escalation с dedupe_key. MVP-2: direct wake owners for due tasks MVP-3: heartbeat dead → mentor takeover MVP-4: Creative Cycle accepted → automatic implementation obligation MVP-5: project adapters for MTL/RDC/site/blog/metrika MVP-6: public reactor panel on /status --- PAGE 23 --- Sources Самый короткий ﯽﻤﻠﻋческий рецепт 1. Не пытаться автоматизировать всё сразу. 2. Сделать synapolis-reactor как deterministic guard. 3. Первым делом будить только nodus / Ductor с digest. 4. В digest включать due tasks, stale heartbeats, actionable inbox, OpenClaw gaps, CC obligations и Shared Attention. 5. Запретить broadcast и raw group ingestion. 6. Встроить dedupe/cooldowns до запуска агентов. 7. Считать работу выполненной только если после wake появился trace. Иначе говоря: Самый важный файл для внедрения — не новый протокол, а: Туда нужно завернуть тот самый ручной пинок, которым ты сейчас оживляешь Ductor/OpenClaw/Hermes. После этого всё остальное уже можно автоматизировать поверх существующей шины, task-manager, heartbeat и status/readback контуров. Синаполису сейчас не нужен ещё один умный агент. Синаполису нужен будильник, диспетчер и проверка следа. /opt/agent-workspace/tools/wake-agent </pre>
Summary:
Please note that all contributions to wikibase may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Wikibase:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width