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

105 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)