105 lines
7.9 KiB
Markdown
105 lines
7.9 KiB
Markdown
# 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)
|