Goal Engine
Подсистема автоматической декомпозиции пользовательской цели на верифицируемые шаги,
исполнения шагов (через под-агентов или напрямую), валидации результатов и отслеживания
прогресса. Goal Engine — эволюция инструмента todo: вместо простого списка задач —
управляемый цикл «цель → план → шаги → валидация → результат» в рамках активной сессии.
Не путать с scheduler. Scheduler — это cron для периодических/отложенных задач. Goal Engine — это управляемый цикл в активной сессии.
Архитектура
graph TB
subgraph "Goal Engine"
Engine["Engine<br/>Оркестрация цикла"]
Planner["Planner<br/>LLM-декомпозиция в JSON-план"]
Validator["Validator<br/>test / linter / diff / coverage"]
StateMachine["State Machine<br/>Переходы статусов"]
end
subgraph "SQLite"
Goals["goals"]
Steps["goal_steps"]
Vals["goal_validations"]
end
subgraph "Оркестрация"
Orch["orchestration.Store<br/>под-агенты"]
Children["multiagent_children"]
end
Bus[("Bus<br/>GoalCreated/Updated/StepUpdated")]
Engine -->|"create"| Planner
Planner -->|"JSON-план"| Steps
Engine -->|"запуск шага"| StateMachine
StateMachine -->|"assigned_agent"| Orch
Orch -->|"agent_task_id"| Children
Steps -.->|"agent_task_id → task_id"| Children
Engine -->|"после шага"| Validator
Validator -->|"результат"| Vals
Engine -->|"обновление"| Goals
Engine -->|"события"| Bus
Компоненты
Engine (goalengine.go)
Оркестрирует полный цикл: создание цели → планирование → аппрув → исполнение шагов → валидация → обновление счётчиков → отчёт. Управляет жизненным циклом цели и шагов через State Machine.
Planner (planner.go)
Использует основную current модель для декомпозиции цели в JSON-план. На вход —
title + description цели, на выход — массив шагов с полями: title, description, criteria
(критерии успеха), assigned_agent (опционально), dependencies (опционально).
Validator (validator.go)
Интерфейс StepValidator + стандартные реализации:
| Валидатор | Проверка |
|---|---|
test |
Запуск тестов (go test ./... или эквивалент). |
linter |
Запуск линтера (go vet, golangci-lint). |
diff |
Анализ diff — были ли изменения в коде. |
coverage |
Проверка покрытия тестами. |
Результат валидации: passed → шаг completed, failed → retry (до max_retries),
skipped → шаг пропущен.
State Machine (state.go)
Переходы статусов:
Цель: planning → in_progress → paused → in_progress → completed | failed | cancelled
Шаг: pending → running → validating → completed | failed → skipped
stateDiagram-v2
[*] --> planning: goal(create)
planning --> in_progress: plan approved / auto
in_progress --> paused: goal(pause)
paused --> in_progress: goal(resume)
in_progress --> completed: all steps done
in_progress --> failed: step failed after max_retries
in_progress --> cancelled: goal(cancel)
completed --> [*]
failed --> [*]
cancelled --> [*]
Subagent Bridge
При создании под-агента для шага:
- Engine вызывает
orchestration.Storeдля запуска под-агента с ролью изassigned_agent. goal_steps.agent_task_id=multiagent_children.task_id— связь шаг↔под-агент.- Координация через
agent_manageсохраняется. - При завершении под-агента → шаг переходит в
validating→ Validator.
Контекст под-агенту прокидывается через промпт при создании, не через схему БД.
Схема БД
1CREATE TABLE IF NOT EXISTS goals (
2 id TEXT PRIMARY KEY,
3 session_id TEXT NOT NULL,
4 title TEXT NOT NULL,
5 description TEXT,
6 plan TEXT,
7 status TEXT NOT NULL DEFAULT 'planning',
8 strategy TEXT NOT NULL DEFAULT 'sequential',
9 created_at INTEGER NOT NULL,
10 updated_at INTEGER,
11 completed_at INTEGER,
12 total_steps INTEGER,
13 completed_steps INTEGER DEFAULT 0,
14 failed_steps INTEGER DEFAULT 0,
15 error TEXT
16);
17
18CREATE TABLE IF NOT EXISTS goal_steps (
19 id TEXT PRIMARY KEY,
20 goal_id TEXT NOT NULL,
21 step_number INTEGER NOT NULL,
22 title TEXT NOT NULL,
23 description TEXT,
24 criteria TEXT,
25 assigned_agent TEXT,
26 agent_task_id TEXT, -- → multiagent_children.task_id
27 status TEXT NOT NULL DEFAULT 'pending',
28 result TEXT,
29 validation_result TEXT,
30 started_at INTEGER,
31 completed_at INTEGER,
32 dependencies TEXT,
33 retry_count INTEGER DEFAULT 0,
34 max_retries INTEGER DEFAULT 2
35);
36
37CREATE TABLE IF NOT EXISTS goal_validations (
38 id TEXT PRIMARY KEY,
39 step_id TEXT NOT NULL,
40 validator_type TEXT NOT NULL,
41 status TEXT NOT NULL,
42 details TEXT,
43 created_at INTEGER NOT NULL
44);
Bus Events
По паттерну TodoUpdatedEvent:
| Событие | Когда | Payload |
|---|---|---|
GoalCreatedEvent |
Создание цели | goal_id, title, session_id |
GoalUpdatedEvent |
Изменение статуса/прогресса | goal_id, status, completed_steps |
GoalStepUpdated |
Изменение статуса шага | goal_id, step_id, status |
TUI подписывается на эти события и обновляет блок Goals в сайдбаре.
Инструменты
goal (tool.go)
goal(
action: "create" | "status" | "pause" | "resume" | "cancel" | "list" | "approve",
— для create:
title: string,
description: string,
— для pause/resume/cancel/status:
goal_id: string
)
| Action | Что делает |
|---|---|
create |
Создаёт цель → Planner генерирует план → шаги в БД. |
status |
Возвращает статус цели и всех её шагов. |
pause |
Приостанавливает цель — новые шаги не запускаются. |
resume |
Возобновляет приостановленную цель. |
cancel |
Отменяет цель. |
list |
Список всех целей сессии с прогрессом. |
approve |
Аппрув плана (после модального окна в TUI). |
goal_step (tool_step.go)
goal_step(
action: "retry" | "skip" | "update",
step_id: string,
— для update:
description?: string,
criteria?: string
)
| Action | Что делает |
|---|---|
retry |
Перезапуск провалившегося шага (сброс retry_count). |
skip |
Пропуск шага (статус → skipped). |
update |
Обновление description/criteria шага. |
Конфигурация
Top-level раздел goal_engine в config.json (параллельно scheduler, tui):
1{
2 "goal_engine": {
3 "enabled": true,
4 "approve_plan": true,
5 "default_strategy": "sequential",
6 "max_steps": 20,
7 "max_retries": 2,
8 "validators": ["test", "linter", "diff", "coverage"]
9 }
10}
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled |
boolean | true |
Включить подсистему. |
approve_plan |
boolean | true |
Требовать аппрув плана. |
default_strategy |
string | "sequential" |
sequential / parallel / mixed. |
max_steps |
integer | 20 |
Максимум шагов в плане. |
max_retries |
integer | 2 |
Максимум повторов шага. |
validators |
string[] | ["test","linter","diff","coverage"] |
Включённые валидаторы. |
JSON-схема: schemes/config.schema.json, раздел $defs.goal_engine.
TUI
- Сайдбар: блок Goals с прогресс-барами (по паттерну todo-сайдбара). i18n-ключ:
sidebar.goals_title. - Аппрув плана: модальное окно при
approve_plan=true. Показывает цель, количество шагов, кнопки Approve/Cancel. i18n-ключи:input.plan_approve.*. - Команды:
/goal new|list|show|pause|resume|cancel|retry. i18n-ключи:command.goal.*.
Структура пакета
internal/goalengine/
goalengine.go — Engine: оркестрация цикла
store.go — GoalStore: CRUD для goals, goal_steps, goal_validations
planner.go — Planner: LLM-декомпозиция цели в JSON-план
validator.go — StepValidator интерфейс + стандартные валидаторы
state.go — State machine: переходы статусов
types.go — типы: Goal, GoalStep, ValidationResult
tool.go — инструмент goal (Tool interface)
tool_step.go — инструмент goal_step
events.go — bus event типы
internal/storage/
db.go — таблицы goals/goal_steps/goal_validations в schema
goal_store.go — GoalStore SQL-реализация
Ограничения (v1)
- Sequential по умолчанию.
parallelиmixedстратегии — на будущее. - До
max_stepsшагов (по умолчанию 20) в одном плане. - Один уровень вложенности. Под-агенты для шагов не могут порождать своих детей.
- Planner использует только
currentмодель. Без опции mini.