Принципиально новый агентный харнес на CQRS + Event Sourcing: агент живёт в тактах разного масштаба — секунда, минута, час, день, неделя, месяц, квартал, год — как человек. Стартовая точка — strands-agents/harness-sdk (Apache-2.0): его исполнительное ядро, поверх — наша временная ось и событийная спина.
Все существующие харнесы (Strands, Hermes, OpenClaw) — пассивны: они просыпаются, когда пришёл внешний запрос, и не имеют собственной временной оси. Simbiot Harness — экзистенциальный: он тикает сам.
Харнес — это не «функция, которую вызывают», а живой процесс с ритмами. Восемь вложенных циклов бьют одновременно: секундный — как сердцебиение, минутный — как реакция, часовой — как рабочий поток, дневной — как план дня, недельный — как ретро, месячный — как цели, квартальный — как стратегия, годовой — как идентичность. Чем крупнее цикл, тем больше контекста он может себе позволить и тем крупнее задачу он вправе взять.
Всё, что происходит — тики, решения, наблюдения, память, трата бюджета — это события в append-only сторе. Состояние харнеса не хранится, а выводится replay'ем событий. Выключили процесс — включили — он продолжил с того же места, потому что его «личность» — это события, а не RAM.
Одной фразой: Strands даёт нам тело (агентный цикл, инструменты, хуки). Simbiot Harness даёт ему метаболизм — время, память и ритм — на событийной спине.
02 / ПРИНЦИПЫ
Шесть принципов
P-1
Всё есть событие
Тик, взятая задача, дайджест, трасса каждого tool-call агента — события. Event store — единственный источник правды. Никакого «состояния в RAM».
P-2
Тактовая лестница
8 уровней: 1с → 1м → 1ч → 1д → 1н → 1мес → 1кв → 1г. У каждого — свой мандат, бюджет и модель. Мелкое решает мелкое, крупное — крупное.
P-3
Контекст ∝ масштабу
Секундный цикл не зовёт LLM вовсе, минутный получает 4K токенов, дневной — 128K, годовой — до 1M. Задача S-класса не занимает слот годового цикла.
P-4
Непрерываемость
Запущенная задача не прерывается тиками. Если исполнитель уровня занят — тик поглощается (skip), а не копится в очередь. Работа важнее метронома.
P-5
Переваривание
Верхние циклы едят выжимку нижних: дневной читает не сырые минуты, а часовые дайджесты. Пирамида консолидации памяти — как сон у человека.
P-6
Воспроизводимость
Стор можно переиграть с нуля — и харнес, и память, и решения соберутся заново. Отладка агента = чтение потока событий, а не логов.
03 / ЛЕСТНИЦА
Тактовая лестница
Каждый уровень — отдельная «личность»: свой мандат (что ему можно), свой бюджет контекста, своя модель и свой класс задач. Цикл может взять задачу своего класса и ниже; задача выше класса — ожидает уровень повыше.
Цикл
Мандат
Мозг (9router)
Контекст
Задачи
Аналогия у человека
1 сек
Рефлекс: телеметрия, watchdog, heartbeat, алерты
без LLM — детерминированный код
0
микро замер, триггер
Сердцебиение
1 мин
Пульс: триаж входящих, быстрые ответы, мелкие фиксы
* pro-слот — зарезервировано под сильную модель (Claude Opus как личный брейн / Gemini 3 Pro через KIE): годовой цикл тикает 1 раз, дорогой запуск раз в год — приемлемо.
04 / ДИАГРАММА
Архитектура
РИС. 1 — Две плоскости. CQRS: интерфейсы → команды → event store → проекции → запросы. Временная: планировщик → исполнители циклов → Strands-агент → LLM. Замкнутый контур: события порождают циклы, циклы порождают события.
05 / ТИК
Жизненный цикл тика
Один тик уровня — от границы такта до записи результата. Ключевое правило — непрерываемость: занятый исполнитель поглощает тик.
Граница тактаScheduler ловит момент 1с/1м/…/1г. Эмитит событие CycleTicked{level, seq}.
Исполнитель свободен?Занят → TickAbsorbed: детерминированная дайджест-заглушка (без LLM), очередь не копим. Дорога (v0.2+): срочная реакция сможет прервать бегущую задачу или поставить её на паузу.
Сборка контекстаМандат уровня + идентичность + память уровня + выжимка нижних (дайджесты) + задачи доступного класса. В пределах бюджета P-3.
Выбор задачиЕсть подходящая задача → TaskClaimed + сессия. Нет → цикл делает мандатную работу (дайджест/наблюдение) или проходит впустую — это честно.
Strands-циклcreate_harness(model, effort, tools уровня) → invoke. Каждый шаг — hook → событие. Задача не прерывается никакими тиками.
ЗавершениеTaskCompleted / TaskFailed (+ политика ретраев и промоушена выше). Результат → событие с ссылкой на артефакт.
ВыжимкаRunner пишет DigestWritten{level, period} — сырое остаётся в трассе, в пирамиду идёт сжатое.
Non-preemption на практике: у каждого уровня ровно один исполнитель (worker). Это даёт сериализацию бесплатно: день не может «отложить» час. Долгие L-задачи идут в фоне сессии, дневной цикл на следующих тиках лишь проверяет их статус — и пока они живы, новых L не берёт.
06 / ПАМЯТЬ
Контекстная пирамида
Контекст цикла — не «всё, что случилось», а многослойная сборка. Сырые данные живут в трассе событий; наверх поднимаются только выжимки. Это главный эконом токенов: наш фактический опыт — 3.1 млрд prompt-токенов за 14 дней в основном из-за перечитывания сырых контекстов.
ГОД · 1M
Идентичность: миссия, ценности, «кто я». Пишется раз в год, кэшируется во все нижние уровни.
КВАРТАЛ · 512K
Ставки: 3–5 стратегических направлений + критерии их проверки.
МЕСЯЦ · 256K
Цели: OKR, бюджет, лимиты расходов на уровень.
НЕДЕЛЯ · 200K
Уроки: что сработало/нет, обновления скиллов и политики.
ДЕНЬ · 128K
Манифест дня: план + часовые дайджесты (не сырые минуты!) + доска задач L-класса.
ЧАС · 32K
Дайджест часа: сжатые минутные логи, статус фоновых задач, триаж входящих.
МИНУТА · 4K
Пульс: последние входящие, алерты секундного уровня, S-задачи.
СЕК · 0
Рефлекс: без LLM. Телеметрия и правила. Дёшево тикать каждую секунду.
Сборка контекста дневного цикла: идентичность (кэш) + квартальные ставки + месячные цели + недельные уроки + дайджесты 24 часов + доска задач. Сырые трассы не поднимаются выше своего уровня никогда — вверх идёт только сжатое.
07 / СОБЫТИЯ
Событийная модель
Стор — по образцу кооп-портала (aggregate, aggregate_id, event_type, data, timestamp, version). События иммутабельны; тестовые — единственное исключение при чистке.
Event store: SQLite WAL — проверенный образец кооп-портала (events, projections, projection_state.json); идемпотентные команды; чистые тестовые события после E2E
LLM: 9router (glm-5.3-flash / glm-5.3 / pro-слот) — своя модель на уровень, бюджет через BudgetSpent
Интерфейсы v0.1: CLI + Telegram (таски от человека); Matrix/Web — после ревью
Деплой: портал-бокс рядом с simbiotd; порт не нужен — только systemd-юнит и локальный CLI
Объём v0.1 (что строим первым)
Уровни 1с + 1м + 1ч + 1д (рефлекс без LLM уже дёшев); неделя/месяц — v0.2, квартал/год — v0.3
Задачи S/M/L + промоушен классов, непрерываемость, дайджесты часа
E2E: человек кидает задачу в TG → минутный взял S → дневной собрал манифест → отчёт → метрики стоимости ритма в проекции
10 / РЕШЕНИЯ
Ревью пройдено — решения
Прошли с владельцем 29.09.2026. Все шесть вопросов закрыты.
Вопрос
Решение
Стоимость ритма (~$1–3/день за «жизнь» без задач)
✅ Принято — норма
Пропущенные такты
✅ Поглощённый тик пишет детерминированную дайджест-заглушку (без LLM). Дальше (v0.2+): срочная реакция сможет прервать бегущую задачу или поставить её на паузу
Один исполнитель на уровень
✅ Принято; N воркеров минутного уровня — v0.2 при необходимости
Идемпотентность тиков
✅ UNIQUE(level, seq); пропущенное время не навёрстывается
Pro-слот для квартала/года
✅ Принято
Имя и место
✅ Simbiot Harness — отдельный репо-продукт (отдельный продукт = отдельный репо)
Следующий шаг: сборка v0.1 — уровни 1с + 1м + 1ч + 1д, задачи S/M/L, ES-спина, дайджесты, hooks-плагин Strands, E2E: таска из Telegram → минутный цикл → дневной манифест → отчёт.