Files
APAW/agent-evolution/docs/bidirectional-data-flow.md
¨NW¨ 3badb259cc feat: bidirectional research dashboard + agent config fixes
- Integrate apaw_agent_model_research_v3.html as standalone dashboard
- Add model-benchmarks.json with 32 agents, 11 scored models, 11 recommendations
- Add build-research-dashboard.ts: inject live data into template → standalone HTML
- Add rebuild-template.cjs: regenerate template from v3.html source
- Add sync-benchmarks-from-yaml.cjs: sync YAML → JSON round-trip
- Add sync-model-research.ts: apply recommendation matrix to config files
- Add model-benchmarks.schema.json and model-research.schema.json for validation
- Add bidirectional-data-flow.md architecture documentation
- Add log-execution.cjs pipeline hook
- Update capability-index.yaml: add fallback_models, failover_strategy
- Update kilo-meta.json, kilo.jsonc, KILO_SPEC.md with synced models
- Update evolution.md / research.md / self-evolution.md / evolutionary-sync.md docs
- Fix security-auditor.md: quote YAML color (#DC2626)
- Fix orchestrator.md: remove duplicate devops-engineer key
- Build research-dashboard.html (106KB standalone) + dated archive
2026-04-29 21:04:22 +01:00

505 lines
20 KiB
Markdown
Raw 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.
# Двунаправленный поток данных APAW Agent Model Research
Этот документ описывает архитектуру системы, которая автоматизирует исследование моделей AI для агентов APAW и синхронизирует данные между визуальной панелью, конфигурационными файлами и пайплайном эволюции.
## Цель
Изначально все данные исследования моделей были захардкожены в HTML-файле `apaw_agent_model_research_v3.html` (1168 строк JavaScript). Двунаправленный поток делает эту систему:
- **Машиночитаемой** — данные хранятся в JSON для автоматической обработки
- **Записываемой** — изменения в конфигурации агентов обновляют JSON и перегенерируют дашборд
- **Визуализированной** — любое изменение данных автоматически создаёт новый HTML
## Архитектура данных
### Файлы системы
| Файл | Назначение | Формат | Обновляется |
|------|-----------|--------|-------------|
| `data/model-benchmarks.json` | Статические бенчмарки | JSON | `/research models`, вручную |
| `data/model-research-latest.json` | Последнее исследование | JSON | `/evolution Step 0`, `/research models` |
| `data/model-research.schema.json` | Схема валидации | JSON Schema | Вручную |
| `data/model-benchmarks.schema.json` | Схема бенчмарков | JSON Schema | Вручную |
| `scripts/build-research-dashboard.ts` | Генерация HTML | TypeScript/Bun | Вручную |
| `scripts/sync-model-research.ts` | Применение изменений | TypeScript/Bun | Вручную |
| `research-dashboard.template.html` | Шаблон дашборда | HTML+JS+CSS | Вручную |
| `research-dashboard.html` | Готовый дашборд | HTML (standalone) | `build-research-dashboard.ts` |
| `dist/research-dashboard-YYYY_MM_DD.html` | Архив | HTML | `build-research-dashboard.ts` |
## Поток данных
### Направление 1: HTML → JSON (Исследование → Бенчмарки)
Источник: `apaw_agent_model_research_v3.html` (вручную исследованные данные)
```
apaw_agent_model_research_v3.html
│ hardcoded JS arrays:
│ cfg[] — текущие конфиги агентов
│ ollamaModels[] — характеристики моделей
│ hmAgents[] — матрица очков
│ recs[] — рекомендации
│ impactData[] — дельта изменений
│ groqModels[] — лимиты Groq
agent-evolution/data/model-benchmarks.json
├─ models[] — 15 моделей, бенчмарки, IF-оценки
├─ agent_model_scores[] — 33 агента × 11 моделей
├─ agent_current_config[] — 36 текущих назначений
├─ recommendations[] — 11 рекомендуемых замен
├─ groq_models[] — 5 моделей Groq с лимитами
├─ impact_data[] — before/after
└─ benchmark_comparison — сравнение с закрытыми моделями
```
**Как обновлять**: один раз данные извлечены из HTML. Дальнейшие обновления:
- Автоматически: `/research models``model-research-latest.json``model-benchmarks.json`
- Вручную: редактировать `model-benchmarks.json`, обновить `metadata.generated`
### Направление 2: JSON → Конфиг → HTML (Применение → Визуализация)
```
[/research models] OR [/evolution Step 0]
model-research-latest.json
│ validates against:
↓ model-research.schema.json
bun run agent-evolution/scripts/sync-model-research.ts
├─ обновляет .kilo/capability-index.yaml (model поля)
├─ обновляет kilo-meta.json (source of truth)
├─ обновляет kilo.jsonc (agent config)
├─ обновляет agent-evolution/data/agent-versions.json (история)
├─ обновляет .kilo/agents/*.md frontmatter (через sync-agents.js --fix)
└─ rebuilds dashboard (build-research-dashboard.ts)
bun run agent-evolution/scripts/build-research-dashboard.ts
├─ читает model-benchmarks.json
├─ инжектирует в research-dashboard.template.html
├─ записывает research-dashboard.html
└─ копирует dist/research-dashboard-YYYY_MM_DD.html
[/research models] ← цикл продолжается
```
## Структура model-benchmarks.json
### Верхний уровень
```json
{
"version": "1.0.0",
"generated": "2026-04-27T17:44:44.000Z",
"source": "apaw_agent_model_research_v3.html",
"total_agents": 36,
"total_models_tracked": 11,
"providers": ["ollama", "ollama-cloud", "openrouter", "groq"],
"models": [...],
"groq_models": [...],
"agent_model_scores": [...],
"if_scores": {...},
"agent_current_config": [...],
"recommendations": [...],
"impact_data": [...],
"benchmark_comparison": {...}
}
```
### Модель
```json
{
"id": "ollama-cloud/qwen3-coder:480b",
"name": "Qwen3-Coder 480B",
"organization": "Qwen",
"parameters": "480B/35B active",
"context_window": "256K\u21921M",
"swe_bench": 66.5,
"swe_bench_pro": null,
"terminal_bench": null,
"live_codebench": null,
"gpqa": null,
"hle": null,
"browse_comp": null,
"if_score": 88,
"categories": ["coding", "agent"],
"tags": ["coding", "agent", "tools"],
"provider": "ollama",
"free": false,
"cost_per_1m_input": "~$0.50",
"description": "SOTA open-source \u043a\u043e\u0434\u0438\u043d\u0433. \u0421\u0440\u0430\u0432\u043d\u0438\u043c \u0441 Claude Sonnet 4.",
"availability": null,
"speed_tps": null
}
```
### Рекомендация
```json
{
"agent": "planner",
"action": "update_model",
"current_model": "nemotron-3-super",
"current_provider": "Ollama",
"recommended_model": "deepseek-v4-pro-max",
"recommended_provider": "Ollama Cloud",
"impact": "high",
"score_before": 80,
"score_after": 88,
"score_delta": 8,
"expected_improvement": {
"quality": "+10%",
"speed": "~1x",
"context_window": "1M"
},
"rationale": "\u2605 matri\u0446\u044b: V4-Pro=88(\u043b\u0443\u0447\u0448\u0438\u0439!)..."
}
```
### Очки агента
```json
{
"agent": "lead-developer",
"current_model_index": 0,
"reasoning_effort": "M",
"scores": {
"ollama-cloud/qwen3-coder:480b": 92,
"ollama-cloud/minimax-m2.5": 86,
"ollama-cloud/minimax-m2.7": 82,
"ollama-cloud/nemotron-3-super": 70,
"ollama-cloud/glm-5": 68,
"ollama-cloud/glm-5.1": 75,
"ollama-cloud/deepseek-v4-pro-max": 88,
"ollama-cloud/qwen3.5-122b": 66,
"ollama-cloud/qwen3-coder-next": 80,
"openrouter/qwen/qwen3.6-plus:free": 88,
"ollama-cloud/kimi-k2.6:cloud": 90
}
}
```
## Формула IF-ажастмента
Оценка агента с учётом способности модели следовать инструкциям:
```
IF-adjusted_score = raw_score × (0.7 + 0.3 × IF/100)
Где:
raw_score — бенчмарк оценка пары агент×модель (0-100)
IF — instruction following score модели (0-100)
Примеры:
IF=100 → score × 1.00 (без изменений)
IF=90 → score × 0.97
IF=78 → score × 0.93
IF=50 → score × 0.85
IF=0 → score × 0.70
Чем ниже IF, тем сильнее штраф — модель плохо следует промпту и роли.
```
## Скрипты системы
### build-research-dashboard.ts
**Вход**: `model-benchmarks.json` + `research-dashboard.template.html`
**Выход**: `research-dashboard.html` + `dist/dashboard-YYYY_MM_DD.html`
```bash
bun run agent-evolution/scripts/build-research-dashboard.ts # однократная сборка
bun run agent-evolution/scripts/build-research-dashboard.ts --watch # watch-режим
bun run agent-evolution/scripts/build-research-dashboard.ts --template custom.html
```
Процесс:
1. Читает JSON, валидирует наличие полей
2. Читает шаблон, ищет placeholder `// BENCHMARK_DATA_PLACEHOLDER`
3. Заменяет `const EMBEDDED_DATA = {};` на полный JSON с данными
4. Обновляет `<title>` с датой генерации
5. Пишет `research-dashboard.html` и архивную копию
### sync-model-research.ts
**Вход**: `model-research-latest.json`
**Действия**:
```bash
# Предпросмотр
bun run agent-evolution/scripts/sync-model-research.ts --dry-run
# Применение всех рекомендаций
bun run agent-evolution/scripts/sync-model-research.ts
# Только для одного агента
bun run agent-evolution/scripts/sync-model-research.ts --agent planner
```
Для каждой рекомендации (`action: "update_model"`, `applied: false`):
1. Находит блок агента в `capability-index.yaml`, заменяет `model:`
2. Обновляет `kilo-meta.json` (source of truth)
3. Обновляет `kilo.jsonc` (через regex, требует ручной проверки)
4. Добавляет запись в `agent-versions.json` history
5. Запускает `node scripts/sync-agents.js --fix` → обновляет .md frontmatter
6. Запускает `node scripts/sync-agents.js --check` → проверка консистентности
7. Пересобирает дашборд через `build-research-dashboard.ts`
## Интеграция в пайплайн
### /research models
```
1. Загрузить текущие данные из model-benchmarks.json
2. Если stale (>7 дней) или --force:
a. Fetch моделей с Ollama Cloud, OpenRouter, Groq
b. Compute IF scores для каждой модели
c. Score каждую модель против каждого агента
3. Сгенерировать рекомендации (gap > 5)
4. Записать model-research-latest.json
5. Валидировать против model-research.schema.json
6. Обновить model-benchmarks.json (если данные изменились)
7. Пересобрать дашборд
```
### /evolution (полный цикл)
```
Step 0: Model Research
├─ Проверить staleness model-benchmarks.json
├─ Если stale → @capability-analyst исследует модели
├─ Загрузить heatmap scores
└─ Определить агентов с mismatch (gap > 5)
Step 1: Judge
└─ @pipeline-judge → fitness score
Step 2: Decide
├─ fitness >= 0.85 → выход
├─ fitness >= 0.70 → @prompt-optimizer (minor)
└─ fitness < 0.70 → @prompt-optimizer (major) + apply model recs
Step 3: Re-test
└─ Перезапуск с обновлёнными промптами/моделями
Step 4: Log + Dashboard
├─ Append fitness-history.jsonl
├─ Apply рекомендации sync-model-research.ts
└─ Пересобрать дашборд build-research-dashboard.ts
```
### /evolution research
```
1. Прочитать текущую конфигурацию
2. Исследовать модели (как /research models)
3. Сгенерировать рекомендации
4. Dry-run preview
5. Применить при подтверждении
6. Пересобрать дашборд
```
## Правила синхронизации
Из `.kilo/rules/evolutionary-sync.md`:
### Обязательный порядок
```
1. Обновить kilo-meta.json (source of truth)
2. Обновить capability-index.yaml
3. Запустить sync-agents.js --fix
4. Ручная проверка kilo.jsonc (sync script не гарантирует)
5. Запустить sync-agents.js --check
6. Проверить agent-versions.json history
7. Пересобрать дашборд
8. Если любая проверка не прошла — НЕ коммитить
```
### Облачный суффикс
При использовании `ollama-cloud/kimi-k2.6` ВСЕГДА с суффиксом `:cloud`:
```yaml
# Правильно
model: "ollama-cloud/kimi-k2.6:cloud"
# Неправильно — отсутствует суффикс
model: "ollama-cloud/kimi-k2.6"
```
## Чеклист применения изменений
```
□ Исследование: /research models завершено
□ Валидация: model-research-latest.json проходит schema check
□ Dry-run: sync-model-research.ts --dry-run показывает ожидаемые изменения
□ Применение: sync-model-research.ts выполнен без ошибок
□ YAML: capability-index.yaml обновлены поля model
□ Meta: kilo-meta.json соответствует
□ kilo.jsonc: модели обновлены (ручная проверка)
□ История: agent-versions.json записи добавлены
□ Sync: sync-agents.js --fix обновил все .md файлы
□ Check: sync-agents.js --check проходит
□ Старые модели: grep не находит предыдущие model IDs
□ Суффикс: kimi-k2.6:cloud (с :cloud)
□ Дашборд: build-research-dashboard.ts сгенерировал свежий HTML
□ Открыть: research-dashboard.html показывает актуальные данные
□ Гит: все изменения add и commit
```
## Устранение неполадок
| Проблема | Диагностика | Решение |
|----------|------------|---------|
| Дашборд пустой | Проверить placeholder в template.html | Пересобрать: `bun run build-research-dashboard.ts` |
| Schema validation fails | Сравнить JSON со схемой | Проверить model-research.schema.json актуальность |
| sync-agents.js check fails | Model mismatch в конфигах | Запустить `--fix`, затем `--check`; ручная проверка kilo.jsonc |
| Heatmap пустой | agent_model_scores отсутствует | Обновить бенчмарки через `/research models` |
| Рекомендации не отображаются | Empty recs array | Запустить research для генерации новых рекомендаций |
| Старые данные | metadata.generated > 7 дней | Обновить бенчмарки |
| sync-model-research.ts падает | Файл не найден | Проверить пути, запустить из корня проекта |
## Пример полного цикла
### 1. Исследование моделей
```bash
$ /research models
## Research: model optimization
### Models Analyzed
- Ollama Cloud: 20 models
- OpenRouter Free: 3 models
- Groq Free: 5 models
### Key Findings
- DeepSeek V4-Pro Max доступен (SWE-V 80.6, IF:88)
- Kimi K2.6 IF=91 (лучший для orchestration)
- Nemotron 3 Super IF=78 — слаб для prompt-heavy ролей
- Qwen 3.6 Plus FREE остаётся лучшим IF/cost (91, $0)
### Recommendations Generated
- 11 model swap recommendations
- 4 high, 3 medium, 4 low
- Средний expected improvement: +12 points
### Files Updated
- agent-evolution/data/model-research-latest.json
- agent-evolution/data/model-benchmarks.json (refreshed)
- agent-evolution/dist/research-dashboard-2026_04_27.html (archive)
```
### 2. Валидация schema
```bash
$ node -e "
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = JSON.parse(require('fs').readFileSync('agent-evolution/data/model-research.schema.json','utf8'));
const data = JSON.parse(require('fs').readFileSync('agent-evolution/data/model-research-latest.json','utf8'));
const valid = ajv.validate(schema, data);
console.log(valid ? 'VALID' : 'INVALID');
if (!valid) console.log(JSON.stringify(ajv.errors, null, 2));
"
VALID
```
### 3. Dry-run
```bash
$ bun run agent-evolution/scripts/sync-model-research.ts --dry-run
=== SYNC PREVIEW (dry-run) ===
3 agents would be updated:
planner
FROM: nemotron-3-super (Ollama)
TO: deepseek-v4-pro-max (Ollama Cloud)
DELTA: +8 (80 → 88)
IMPACT: high
go-developer
FROM: qwen3-coder:480b (Ollama)
TO: deepseek-v4-pro-max (Ollama Cloud)
DELTA: +3 (85 → 88)
IMPACT: medium
[built-in] debug
FROM: glm-5.1 (Ollama)
TO: kimi-k2.6:cloud (Ollama Cloud)
DELTA: +2 (88 → 90)
IMPACT: high
Files to modify: capability-index.yaml, kilo-meta.json, kilo.jsonc, agent-versions.json
```
### 4. Применение
```bash
$ bun run agent-evolution/scripts/sync-model-research.ts
✅ capability-index.yaml updated (3 agents)
✅ kilo-meta.json updated
✅ kilo.jsonc updated
✅ agent-versions.json history updated (3 entries)
✅ sync-agents.js --fix completed
✅ sync-agents.js --check passed
✅ Dashboard rebuilt: research-dashboard.html (106KB)
```
### 5. Проверка дашборда
```bash
$ start agent-evolution/research-dashboard.html
# В браузере:
# - Overview: 3 agents updated, 11 recommendations total
# - Heatmap: V4-Pro Max column green for planner, go-developer
# - Recommendations: 3 marked as applied with checkmarks
# - Impact: +8 for planner shown in chart
```
### 6. Тест пайплайна
```bash
$ /evolve --issue 42
## Pipeline Judgment: Issue #42
**Fitness: 0.88/1.00** [PASS → improved from 0.82]
| Metric | Value | Weight | Contribution |
|--------|-------|--------|-------------|
| Tests | 96% (46/48) | 50% | 0.480 |
| Gates | 80% (4/5) | 25% | 0.200 |
| Cost | 38.4K tok / 245s | 25% | 0.198 |
**Bottleneck:** none (all agents optimal)
**Verdict:** PASS — fitness improved!
✅ Logged to .kilo/logs/fitness-history.jsonl
✅ Auto-rebuilt: agent-evolution/research-dashboard.html
```
## Периодичность обновления
| Файл | Период | Триггер |
|------|--------|---------|
| model-benchmarks.json | Еженедельно (>7 дней = stale) | `/evolution Step 0` или `/research models` |
| model-research-latest.json | Каждый research cycle | `/research models`, `/evolution research` |
| research-dashboard.html | После каждого изменения | `sync-model-research.ts` или `build-research-dashboard.ts` |
| dist/*.html | Архив | Каждая генерация |
| agent-versions.json | При каждом изменении модели | `sync-model-research.ts` |
## Связанные документы
- `.kilo/commands/evolution.md` — команда /evolution
- `.kilo/commands/research.md` — команда /research
- `.kilo/shared/self-evolution.md` — протокол эволюции
- `.kilo/rules/evolutionary-sync.md` — правила синхронизации
- `.kilo/rules/agent-frontmatter-validation.md` — валидация YAML frontmatter
- `agent-evolution/README.md` — обзор системы эволюции
- `kilo-meta.json` — source of truth для моделей
- `.kilo/capability-index.yaml` — маршрутизация и назначения