Commit graph

71 commits

Author SHA1 Message Date
Simbiot Harness
f63274469e dash: deep-link ?view=chat (chat открывается по ссылке); landing v3: product-showcase секция с честными скринами живого дашборда/чата (/static/*.png), prod synced 2026-10-02 23:07:11 +00:00
Simbiot Harness
56d6b36658 hour tick 22:41: bin/simbiot in-repo обёртка + SIMBIOT_RAG_DB (миграция второго инстанса), digest 2110/1720 закоммичены, deferred-restart arm-скрипт, AUM burn 2658 2026-10-02 23:02:55 +00:00
Simbiot Harness
feaf660139 skills/ui: вендор ui-skills (improve-ui, baseline-ui, a11y/metadata/motion-fixes) + frontend-design (anthropic) + improve-animations (emilkowalski) с атрибуцией; design-plans: improve-ui аудит simbiot.cil.by (P0 noscript-reveal, P1 focus/og, P2 reduced-motion — фиксы применены и задеплоены) 2026-10-02 22:32:23 +00:00
Simbiot Harness
d4b1da3518 docs: migration-hermes — карта источников, запуск, реальный кейс Риты (e2e-ответ по перенесённой памяти), ограничения 2026-10-02 22:26:16 +00:00
Simbiot Harness
d7ee7d1fcb migrate_hermes: schema-tolerant sessions (у Риты нет last_activity_at), REPO_ROOT fix (импорт стора из scripts/), живые чаты раньше крона в истории 2026-10-02 22:24:17 +00:00
Simbiot Harness
61858a408b migrate_hermes: Гермес → Simbiot (t-261001124130) — память/персона/история/config/cron → пакет + PolicyChanged в стор целевого инстанса + RAG-индексация; dry-run по умолчанию 2026-10-02 22:17:49 +00:00
Simbiot Harness
b9d7fd9d23 tests: dash-chat hermetic suite (7/7) — лента БД портала, секрет команд, anchor-дедуп, коллапс повторов 2026-10-02 22:12:58 +00:00
Simbiot Harness
5c02bc7cdd dashboard: вкладка Чат поверх портала-канала (t-261001100740) — GET/POST /api/chat*, дедуп-анкеры, коллапс ретраев, секрет команд скрыт; e2e: вопрос из UI → ответ агента в ленте 2026-10-02 22:12:14 +00:00
Simbiot Harness
d369351e10 hour digest 21:10 UTC: индикация 👀 задеплоена (26edbb7), тесты 14/14, burn 7д=2638.32 2026-10-02 21:17:02 +00:00
Simbiot Harness
26edbb76c8 TG: входящее взято в работу — emoji-реакция 👀 + typing на время тика (e-261002202857, t-261002205233) 2026-10-02 21:15:48 +00:00
simbiot-min
aeb4cb138f install.sh: если ~/.local/bin не в PATH — автодобавление в rc-файл + подсказка (фикс «simbiot: команда не найдена» после установки) 2026-10-02 20:50:39 +00:00
Simbiot Harness
1bbd7c8e55 t-261002202105/t-261002202021: установщик чинит битый venv (WSL: python без pip → пересоздание + fallback системный pip3), чистит мусор старого PoC-клона, пост-шаг: портал cil.by для ключа API + wizard --router-key 2026-10-02 20:28:41 +00:00
Simbiot Harness
4c4ac34560 t-261002193628-1d1e5f: установка одной командой + визард первого запуска
- scripts/install.sh: clone → venv → deps → обёртка ~/.local/bin/simbiot
  (чистый env, как hermes) → тихий init/визард → проверка simbiot status;
  флаги --dir/--repo/--wizard/--no-wizard/--systemd/-q
- cli.py wizard: интерактивный конфиг .env (TG-токен, чаты, ключ 9router,
  модель SIMBIOT_MODEL) + init стора; --noninteractive и флаги
- harness/levels.py: SIMBIOT_MODEL переопределяет модель уровней (env/.env)
- requirements.txt: pinned-зависимости для установщика
- scripts/simbiot-harness.service: systemd-юнит (опция --systemd)
- README.md: секция «Установка одной командой»
2026-10-02 19:52:19 +00:00
Simbiot Harness
e435289e55 hour берёт L-задачи (t-261002170836): classes S,M,L + мандат; тесты синхронизированы 2026-10-02 16:06:02 +00:00
Simbiot Harness
cac1ffaae0 t-261002151630-8f2ce6: метаскилл meta-skill-factory (повторяющаяся работа 2+ раза → SKILL.md в репо) + первый скилл presale-landing, боевой прогон на задаче лэндоса (источники и Stripe-CTA проверены) 2026-10-02 15:18:47 +00:00
Simbiot Harness
f140b76dc7 docs: hour digest 2026-10-02 15:10 2026-10-02 15:09:53 +00:00
Simbiot Harness
1e7003dfcc docs: presale v3 + directive update 2026-10-02 2026-10-02 15:09:42 +00:00
Simbiot Harness
04d577790d t-261002131628-420ef8: TG-реплаи — reply_to_message_id + reply_to_text в MessageReceived, якоря «в ответ на ...» в батче триажа 2026-10-02 13:18:04 +00:00
Simbiot Harness
46a4728c67 fix: /set-tg-bot через портал-канал + race таймаута тика
- portal_channel: команда cmd-settg-* (кнопка TG в UI портала) перехватывается
  в pull() ДО инбокса (токен-секрет не попадает в стор/LLM), апплаер:
  getMe-самотест -> атомарный .env (SIMBIOT_TG_TOKEN+ALLOWED, старый аллоулист
  сохраняется) -> рестарт только simbiot-harness-tg; идемпотентно; отчёт в
  чат портала (push, fallback outbox-файл); TgChannelConfigured в стор.
- isolated_runner: после TimeoutExpired kill процесс-группы воркера и ожидание
  фактической смерти — без этого сабпроцессы продолжали писать BudgetSpent/
  ToolCalled после SchedulerTimeout (burn 9router вхолостую, t-261002090242).
- levels: tick_timeout min 300->480 (занятый мин-уровень штатно поглощает такты;
  эскалация e-261002085000). Контекст-схема не тронута (256k/512k/1M).

Тесты: test_budget_stub_guard / test_inbox_batch / test_delivery_idempotency —
зелёные; e2e на живом канале: cmd-settg consumed=1, стор чист, .env цел.
2026-10-02 09:20:11 +00:00
Simbiot Harness
696f9e17e2 fix(audit+es): link-check допускает prev→любую прошлую подписанную строку (гонка параллельных писателей падала проекциями, 4 события); append_event под BEGIN IMMEDIATE; init_db-гонка bootstrap; + hardass-пакет: INSTALL/INSTALLS/needs_survey (опросник потребностей клиентов, идемпотентный) [t-261002072440] 2026-10-02 08:13:41 +00:00
Simbiot Harness
3dac41108a fix(tg_inbox): _default_chat_id игнорирует portal:* чаты — портал-канал не Telegram, файлы туда идут push-ом; E2E канала перебивал дефолтный чат → send_document падал 'chat not found' 2026-10-02 00:39:29 +00:00
Simbiot Harness
e65d205e0f feat(day): криптоаудит стор/команд (ed25519, genesis-граница), метрика AUM (замер+policy+пилот), правки для портал-развёртывания (t-260930083716, t-260929161138, t-260930110622) 2026-10-02 00:34:07 +00:00
Simbiot Harness
fa634ce526 fix(scheduler+bot): сироты-чистка не рвёт свежие клеймы (grace 90с); алиас «list» → без-LLM команда /задачи; авто-уведомление Alex при падении тика (e-261001124837-ab3fa7, e-261001124424-d9295f, e-261001134429-c68495) 2026-10-01 15:11:53 +00:00
Simbiot Harness
0523135bf1 feat(portal-chat): прямой канал портал↔агент без Matrix (t-261001123122-5ea554)
- portal_channel.py: HTTP-клиент портала — pull входящих чата портала
  (GET /api/agent/<имя>/channel/poll?since=ms), push ответов (POST outbox,
  ack входящих по msg_id), сек-рефлекс (≤20с) + cron main().
- tg_inbox: чаты 'portal:*' доставляются push'ем на портал (ReplySent),
  reply_to = портальный update_id (portal: ack consumed входящего).
- scheduler: ReflexObserved хук на portal_channel.sec_reflex — pull работает
  и без LLM-тика, и на машинах без TG.
- es: проекционный бранчPortalDelivered выпилен (маркер — ReplySent от
  tg_inbox); MessageIgnored branch остался нетронутым.
- Диагноз: SSH портал→агенты закрыт (timeout :22/:8765 к #83) — канал на
  исходящем HTTP, AGENT_TOKEN+PORTAL_URL уже пекутся в /etc/coop-reporter.env,
  agent-scope env добавлены в cloud-init .env (SIMBIOT_AGENT_TOKEN/NAME/CHAT=1).
2026-10-01 13:34:26 +00:00
Simbiot Harness
fe1c569888 docs(readme): лестница выровнена с levels.py — min 256k → hour 512k → day 1M (e-261001082710); week/month → roadmap v0.2 ( Alex: старая таблица в ридми) 2026-10-01 11:02:34 +00:00
Simbiot Harness
4fe412eac3 fix(runtime): ROUTER_BASE_URL и ключ читаются из .env (e-261001091912) + тест
systemd-юниты не экспортируют .env; на Hetzner-агентах base_url тихо
уходил в дефолт 127.0.0.1:20128 (живой 9router только на эталонном
хосте). _env_or_file(): env > .env > default. E2E на агенте 82:
venv без openai (в cloud-init добавлен отдельно в coop).
2026-10-01 10:09:13 +00:00
Simbiot Harness
053bab3e78 tests(task-batch): синхронизация с контекст-схемой 11a8ccc (min 256k / hour 512k / day 1M) — t-261001090908-18a4f5
Бюджет и размеры задач в секциях 5/6 выведены из LEVELS[].ctx_tokens,
константы уровня захардкожены отдельным check'ом. 30 checks ALL PASS.
2026-10-01 10:02:28 +00:00
Simbiot Harness
a0179e5df7 fix(guard)+feat(dash): requeue ready-гонка не валила тик (e-261001083543-0eab6d); дашборд «🔧 в работе» + elapsed (t-261001082111); пакет покупателя предпродажи (t-261001085722)
- scheduler: guard «бюджет исчерпан» вынесен в _guard_budget_stub_requeue()
  — ValueError requeue_task при ready (задача уже возвращена task_promoted
  путём того же тика) гасится, тик дофинализируется; тесты
  tests/test_guard_ready_race.py (FAILS 0), test_budget_stub_guard зелёный;
- es: TaskClaimed → task.claimed_at; TaskPromoted(requeue) → claimed_at=None;
- dashboard.py/.html: API отдаёт claimed_at; бейдж «🔧 в работе: hour · 12м»
  (минуты/секунды/часы), подсветка running-строки, «взята в работу» в деталях;
- docs/PACKAGE-SIMBIOT-PRESALE.md: состав пакета подписки (EN-блок для
  лендинга, состояние компонентов), цена единая $99.9 по директиве прайса
2026-10-01 09:11:23 +00:00
Simbiot Harness
11a8ccc279 config(levels): контекст-схема min 256k / hour 512k / day 1M (согласована Алексом, e-261001082710); мандат hour: пачку задач брать строго по очереди от старейшей 2026-10-01 08:28:58 +00:00
Simbiot Harness
09a226763b mandate(min): не создавать задачи из служебных сообщений («list», «тест») — отвечать tg-reply; клоны-пустышки засорили доску (e-261001082241) 2026-10-01 08:27:07 +00:00
Simbiot Harness
4e7f62d35a guard(tasks): «бюджет исчерпан» — не результат (e-261001074527): complete со стабом → ValueError + авто-requeue в ready; батч-финал тика со стабом → requeue всего клея; tests/test_budget_stub_guard.py 14 checks (FAILS 0) 2026-10-01 08:25:05 +00:00
Simbiot Harness
ed7ffd4461 docs(keys): реестр — push харнеса в git.cil.by (аудит истории чист), FORGEJO_PULL_TOKEN в /root/coop/.alfa_env 2026-10-01 08:17:41 +00:00
Simbiot Harness
d39f60fc24 feat(levels): дневной тик 10 000 шагов по умолчанию (Alex: убрать/сделать супер большим лимит) — e-261001075037-d095c1 2026-10-01 08:02:22 +00:00
Simbiot Harness
05555bbf11 feat(levels): day ctx 1M как у hour — симметрия по решению Alex (час-тик t-260930202231-50484f, консолидация правки 20:43) 2026-09-30 21:01:46 +00:00
Simbiot Harness
e623a10582 docs: фиксация главной цели харнеса — максимизация долгосрочной AUM (Alex, e-260930174500) 2026-09-30 19:32:07 +00:00
Simbiot Harness
7efe845f18 feat(levels): часовой контекст 1М по решению Alex (e-260930173121-ed93b5; t-…-4425c3-рядом) 2026-09-30 18:36:49 +00:00
Simbiot Harness
3361b671ed fix(worker+scheduler+inbox): три фикса часовой сводки (t-260930162615-fb58be)
1) per-call timeout LLM-вызова (SIMBIOT_LLM_CALL_TIMEOUT, 90с default,
   max_retries=1): роутер-лог показал — зависший тик = POST в ollama
   принят, но байт стрима не пришёл (DONE без TTFT), соседние вызовы
   ходили за 1-3с. Один висящий вызов больше не убивает весь тик по
   уровневому таймауту (300/2880с) — режется сам вызов, event-loop
   завершает тик штатно, spend-хвост и задачи не теряются
   (e-260930161900-baaecb, e-260930162600-cbb7e2, e-260930153143-85246b).

2) обрезка TG-инбокса (e-260930154125-082a2a): приём 4000→10000 симв.,
   показ в контексте тика 300→1200 — длинные сообщения Alex больше
   не теряют хвост.

3) loss-of-claim в батче: TimeoutExpired от isolated_runner пролетал
   мимо TaskFailed-блока run_level_tick — claimed-задачи висели в
   running до сирот-чистки (час+). Теперь claim сразу возвращается
   TaskPromoted в очередь (reason с причиной смерти воркера).

Тесты 8/8 (hermetic), живой вызов модели с timeout=90 — ok.
2026-09-30 17:23:46 +00:00
Simbiot Harness
2f4e3d22a7 feat(scheduler): батч-обработка задач в тике — пачка ready-задач в бюджете контекста (t-260930101325-010ba3)
Причина: find_task возвращал ОДНУ ready-задачу за такт — при 5+ ready
очередь росла быстрее исполнения (1 задача/такт).

Теперь:
- select_task_batch: ВСЕ ready-задачи класса уровня, старейшая первой;
- кап пачки MAX_TASK_BATCH (min=3, hour=6, day=6; env SIMBIOT_BATCH_MAX_<LEVEL>);
- бюджет контекста: секция задач <= ctx_tokens*3*0.5 символов,
  мандат/выжимки/эскалации/инбокс остаются в тике; старейшая берётся всегда;
- run_level_tick: claim всего батча ДО воркера; TaskCompleted/TaskFailed
  ПО каждой отдельно (смерть воркера не теряет батч в running);
- build_context: секция 'ТЕКУЩАЯ РАБОТА — БАТЧ из N' с постановками,
  инструкция закрывать каждую задачу cli.py complete <id> -a;
- CLI complete: закрытие running-задачи с результатом
  (commands.complete_task_with_delivery — доставка в TG идемпотентна).

Тесты: tests/test_task_batch.py — 28 проверок (ALL PASS), набор 8/8 зелёный.
2026-09-30 14:13:30 +00:00
Simbiot Harness
1bc33d5678 fix(delivery): идемпотентная автодоставка артефактов в TG — три атомарных барьера против дублей (t-260930083937)
Инцидент: Alex получал презентацию трижды (m-516173239/241). Две причины:
1) гонка push (тик) vs pull (delivery-демон): оба проходили проверку
   delivery_status != 'sent', пока TG-отправка (до 35с) была в полёте;
2) ad-hoc curl sendDocument из мин-тиков вообще без метки delivered.

Фикс — delivery_ledger (INSERT OR IGNORE: факт доставки раз и навсегда)
+ delivery_locks (атомарный claim ДО отправки, TTL 120с; одно SQLite-
выражение = нет гонок между потоками и процессами). deliver_result /
deliver_artifact: ledger → claim → отправка → запись; сбой → release,
демон досыплет. Requeue сбрасывает ledger (доработка доставляется заново).

Новое: cli.py tg-deliver-file (идемпотентная отправка файлов, --force),
tg-notify -k <ключ>, tg_inbox.send_document (multipart на чистом urllib),
deliver_pending pre-filter по ledger, мандаты уровней: прямые
curl/api.telegram отправки запрещены. DeliverySkipped логирует пропуски.

Тесты: tests/test_delivery_idempotency.py — 49 проверок (гонка потоков,
межпроцессный claim, сбои+ретраи, requeue, CLI). Регрессия: 6/6 тестов ОК.
2026-09-30 13:41:34 +00:00
Simbiot Harness
9a214d6ac3 feat(proactive): инициативные реплики харнеса в чат — ритм/анти-спам/банк тем AUM (t-260930073419)
- InitiativeSent (aggregate cycle, id proactive:<slot>) — идемпотентно UNIQUE-стора
- es-проекция: последний слот + история sent (анти-спам стейт)
- harness/proactive.py: окно 5-21 UTC (история чата), интервал 8ч, тишина 2ч
  после сообщения Alex, не при неотвеченных входящих/critical-эскалациях
- банк из 10 тем без LLM (ноль кредитов), round-robin по использованным
- хук в delivery-демоне (15с, best-effort); гейт важности не затронут
- CLI: proactive / --plan / --force; env-оверрайды интервала/тишины/слота
- tests/test_proactive.py: 34 проверки (окно/анти-спам/round-robin/идемпотентность/CLI)
2026-09-30 11:15:49 +00:00
Simbiot Harness
06be288657 feat(inbox): батч-триаж входящих TG — сводный ответ закрывает все сообщения за один тик (t-260930064924)
Минутный тик отвечал по одному сообщению за тик (m-516173222..228 —
7 тиков подряд на один разговор): контекст показывал все, но мандат
говорил «ответь на него», и главное — нечем было закрыть несколько
входящих одним ответом (tg-reply закрывает одно, «хвосты» снова будили
гейт важности).

- tg_inbox.send_batch_reply: одна TG-отправка → ReplySent на КАЖДОЕ
  входящее батча (полный текст у головного, у хвостовых — ссылка);
  гонки (replied/ignored выпадают, пустой батч → ValueError), разные
  чаты делят батч — каждому своя отправка
- cli tg-reply <id1>,<id2>,… -c: батч-режим; несколько id без -c — отказ
  (защита от случайного закрытия); одиночный режим обратно совместим
- build_context: секция инбокса = «БАТЧ из N» с готовой командой
  (все id через запятую) и инструкцией закрыть ВСЁ за этот тик; кап
  10 → 50 (показываем весь батч, а не хвост)
- мандат min: батч-семантика (сводный ответ по смыслу разговора)
- тесты tests/test_inbox_batch.py: 32 проверки (hermetic), все зелёные
2026-09-30 10:12:47 +00:00
Simbiot Harness
e8f18dd7c0 docs: реестр ключей и секретов хоста (t-260930061207) — пути и описания, без значений
Инвентаризация: .env харнеса, наследие Гермеса (~/.hermes: .env, config.yaml,
auth.json, chain-key.json, telegram_config.yaml), systemd inline-секреты,
/root и /opt .env-файлы (coop, 9router, litellm, deip, jitsi, cal-diy,
chatwoot, documenso, kan, rallly, espocrm, vexa, totem), git-история .env.
Фиксы в рамках тика: 644->600 на 11 файл, бэкапы state.db 600 + umask 077.
Рекомендации: EnvironmentFile для systemd, filter-repo перед push,
Bitwarden Secrets Manager (интеграция уже в конфиге Гермеса, disabled).
2026-09-30 09:05:29 +00:00
Simbiot Harness
871a3b15a3 feat(gate): гейт важности LLM-тика по per-level порогу + model в событиях
- гейт (e-260930062242/2510/2607/2741): collect_signals ранжирует события
  (unreplied_inbox/ready_task/critical-эскалация = critical; warn-эскалации,
  high_load = warn), gate_allows_llm решает по порогу уровня
  (SIMBIOT_GATE_<LEVEL>, дефолты min=critical/hour=warn/day=warn);
  тихий такт — GateSkipped + дайджест-заглушка, без LLM и без расхода роутера
- model в BudgetSpent/InvocationStarted (e-260930062120): видно, какая модель
  и уровень тратили кредиты (strands не выносит фактическую модель в usage —
  пишем запрошенный model_id)
- per-level лимиты тул-колов уже в дереве: resolve_tool_budget (min=30/hour=300,
  env-оверрайд) (e-260930060717/060904)
- tests/test_gate.py: 28 hermetic-проверок, ALL PASS
- simbiot-presentation.html: презентация Simbiot (t-260930053538), 10 слайдов
2026-09-30 08:29:54 +00:00
Simbiot Harness
5faf78fd09 CLI: tg-list — список входящих TG (фильтр --new, лимит -n) 2026-09-30 06:56:25 +00:00
Simbiot Harness
62e9d756d7 feat(dashboard): детали задачи по клику — метаданные, промоушены, отчёт закрытия, JS-раскрытие строки (t-260929220004-033c0f) 2026-09-30 06:42:08 +00:00
Simbiot Harness
2d70740e76 fix(worker): убрать limits.turns — стоп без текста, дайджесты пустели
Репродукция: мин-тик с реальным контекстом → модель (auto/low effort)
каждый ход делала tool-вызов, никогда не выдавая чистый текст;
limits={'turns': 15} обрывал цикл на границе хода, result.message
оставался toolResult-сообщением → str(result)='' → DigestWritten len 0.

limit_turns — нативный стоп SDK, но он не кладёт в историю итоговый
ассистентский текст. Наш end_turn (AfterToolsEvent) кладёт: дайджест
не пустеет. Защита от таймаутов остаётся двойной: cancel_tool на
вызовы сверх лимита + end_turn после партии.

E2E-подтверждение: тот же промпт, stop_reason=end_turn, текст 465
символов ('Тик чистый. Проверил: ...').
2026-09-30 04:24:58 +00:00
Simbiot Harness
1b8c27b292 fix(worker): null_callback_handler — BrokenPipe убивал тики с 04:11
Симптом: DigestWritten min с пустым text при живом агенте (15 tool-вызовов,
BudgetSpent писались). Корень: PrintingCallbackHandler стримит в stdout
воркера; scheduler читает capture_output=True; длинный вывод (reasoning +
Tool #N на каждый вызов) переполнял pipe → BrokenPipeError внутри
stream_async → ok=False, текст тика потерян. Воркер перезапускался каждый
тик — падения шли серией, мин-дайджесты пустые.

Результат тика живёт в JSON-файле (result_path) — печать не нужна вовсе:
create_harness(callback_handler=null_callback_handler).

E2E: воркер с 2 shell-вызовами, stdout 0 байт, ok=True, текст на месте.
2026-09-30 04:19:04 +00:00
Simbiot Harness
205d558ffa chore: tg_inbox.db в .gitignore (судьба воркера TG, не стор) 2026-09-30 04:16:48 +00:00
Simbiot Harness
34df7f3d72 feat(rag)+fix(timeout): RAG-инструмент в тиках + хард-кап шагов воркера
RAG (t-260929212316): каждому LLM-тику доступен rag_lookup — семантический
поиск по базе кооператива (/root/rag, fastembed+sqlite). Лимиты зашиты в
инструмент: 1 запрос/тик, k<=5, таймаут 20с, сабпроцесс rag-venv, мёртвый
вендор не валит тик. Трейс RagQueried в сторе. CLI: rag-query.

Хард-кап шагов (e-260930031800): мин-воркер тонул в 90+ tool-вызовах и
умирал по таймауту 300с. До: 3 CycleError за 2 часа, эскалации min→hour.
Фикс: cancel_tool на вызовы сверх лимита + end_turn (AfterToolsEvent)
останавливает цикл после партии + limits.turns (нативный механизм SDK).
e2e: 20 параллельных вызовов при лимите 3 → ровно 3 исполнения, цикл
остановлен, тик завершён текстом за ~12с (было: таймаут 300с).

Мандат мин-уровня: про rag_lookup и приоритет RAG для вопросов про кооператив.

Тесты: tests/test_rag_lookup.py (29 PASS), tests/test_tool_budget.py (12 PASS).
2026-09-30 04:16:46 +00:00
Simbiot Harness
f115447808 tests: шапка docstring test_tg_commands.py (убрать дубль) 2026-09-30 02:43:22 +00:00