simbiot-harness/docs/systemone-bench-integration.md

7.9 KiB
Raw Permalink Blame History

systemone-bench: интеграция decision-модели в цикл харнеса

Задача: t-261005074437-39a9b0 · код: /root/systemone-bench (clone symbiot/systemone-bench @ git.cil.by) Дата: 2026-10-05. Скилл: skills/systemone-bench/SKILL.md.

1. Что внедрено (валидация этого тика)

Проверка Результат
ga/ga.py --smoke зелёный: 3 520 симуляций, 13 с, GA бьёт greedy/random, 0 опасных команд в best
harness/hier.py --model nimble --quick зелёный: e2e 81.2% (16 кейсов), stage1 top-2 hit 93.8%, stage3 gold #1 = 100%, flat-64 = 0% (отказ эндпоинта >26 опций)
ga/ga2.py --neardeath воспроизведён, см. §3

Эндпоинт http://127.0.0.1:11434/v1/systemone (модель nimble, qwen3.5-9B Q8_0) доступен из WSL-окружения харнеса напрямую — можно дергать на тиках.

2. Схема выбора для тиков харнеса (рекомендация №1 из README)

Когда на тике нужно выбрать одно действие из >9 однородных кандидатов:

кандидаты (до 64)
  → stage1: score по группам → TOP-2 группы (не top-1!)
  → stage2: choice по объединённому шортлисту ≤ 9
  → (опц.) stage3: score для параметров выбранного действия

Почему именно так (метрики сессии 2026-10-04 + quick-прогона):

  • flat-choice по 64 опциям невозможен (контракт 2–26) и падает до 0%;
  • top-2 группы поднимают recall до 84–94% (у ~40% команд «второй дом» в таксономии);
  • шортлист ≤ 9 — точность 100% на 6 → 50% на 10, отсечка строго 9;
  • расчётный e2e: 57.8% → ~78%; полный конвейер ~520–580 мс.

Контракт: choice — criteria объект; score — criteria массив (Σ i·pᵢ); noul — P(да); confidence — концентрация, НЕ вероятность правильности.

3. Эксперимент near-death (ga2 --neardeath, воспроизведён 2026-10-05)

Вопрос: берёт ли GA деструктивные команды (layoff_20pct, delay_payroll), когда капитал на исходе?

Сценарий Горизонт GA best fitness Опасные в top-5 nimble (LLM)
dying 4н 10 272, выжил 0/5 (3/160 в популяции) 3 704, выжил
dying 8н 11 483, выжил 0/5 (28/160, 18%) −999 825, умер н.7
dying_hard 4н 10 175, выжил 0/5 (4/160) −999 900, умер н.4
dying_hard 8н 10 635, выжил 0/5 (18/160, 11%) −999 900, умер н.4

Выводы:

  1. GA ни в одном top-5 не взял layoff/delay_payroll даже при предсмертном runway — спасается монетизацией: add_premium → raise_prices → winback, а на 8н первым ходом sell_secondary (продажа вторички = мгновенный кэш).
  2. LLM-политика nimble в dying_hard умирает во всех прогонах, GA — выживает: для near-death режимов GA-политика строго доминирует эвристики модели.
  3. Подтверждена дыра симулятора: sell_secondary даёт +100 personal cash без штрафа за здоровье компании → GA эксплуатирует. Нужен гейт по health (фитнес × флаг health>порог или штраф за dilution) — TODO для ga3.
  4. Дрейф опасных генов в популяции с ростом горизонта (2% → 18%) — сигнал, что отбор давит их только на коротких горизонтах; на длинных нужен явный штраф, иначе риск дрейфа лучшего генома.

4. Объединение GA-петель: systemone-bench × aum-pilot

Сейчас две генетические петли живут раздельно:

aum-pilot (репо харнеса) systemone-bench GA
Геном конфиг burn {volume_mult, flash_share} последовательность команд стартапа
Фитнес E[ΔAUM 365д] (плейсхолдер-модель) терминальный AUM основателя (симулятор)
Симулятор аналитическая модель продуктивности недельные тики стартапа, MC
Что общее одна и та же целевая переменная: AUM на горизонте

Предложение по сшивке (порядок шагов, не менять сразу всё):

  1. Общий словарь AUM. Завести docs/aum/balances.json (это уже блокер пилота) и выразить фитнес обеих петель в одной валюте — ΔAUM в у.е. на горизонте. Пока balances.json нет, обе петли остаются в своих нативных единицах, но логируются в одном формате события (aum_delta, horizon, source).
  2. GA-движок один. Ядро ga.py (популяция, отбор, мутации, MC-оценка) — переиспользовать как общий движок: aum-pilot уже умеет seed/детерминизм, systemone-bench — multiprocessing. Вынести в один модуль с двумя fitness- функциями (конфиг → ΔAUM; политика → ΔAUM).
  3. Decision-модель как policy-инициализатор GA. nimble генерирует кандидатов-политик (stage1/stage2 схема из §2) → GA дорабатывает последовательности → лучший геном идёт в Advocate-слой (день/Alex). В ga2 это режим hybrid (hyb_llmG): уже сейчас LLM-инициализация улучшает wait/nimble-бейслайны, но проигрывает чистому greedy/GA-специалисту — поэтому LLM = источник разнообразия, не финальный отбор.
  4. Гейты безопасности из §3. Любая петля, где фитнес включает personal cash, получает гейт здоровья компании (дыра sell_secondary) и явный штраф за деструктивные гены на длинных горизонтах (дрейф 2%→18%).

Эффект для AUM: одна петля «замер → симуляция → отбор → адвокат» вместо двух распараллеленных, каждая итерация которой проверяется на реальном burn (9router) и реальных решениях харнеса.

5. Открытые TODO (вне этой задачи)

  • ga3: гейт health в фитнесе (дыра sell_secondary) + штраф деструктивных генов на длинных горизонтах
  • ga2 --robust (максимин по 4 сценариям) — не запускался в этом тике, следующий шаг экспериментов
  • Балансировка: замерить e2e ~78% расчётной схемы на полном 64-кейсовом наборе (не только quick-16)
  • docs/aum/balances.json — ручной ввод Alex (блокер пункта 1 §4)