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

Оркестрирует полный цикл: создание цели → планирование → аппрув → исполнение шагов → валидация → обновление счётчиков → отчёт. Управляет жизненным циклом цели и шагов через State Machine.

Использует основную current модель для декомпозиции цели в JSON-план. На вход — title + description цели, на выход — массив шагов с полями: title, description, criteria (критерии успеха), assigned_agent (опционально), dependencies (опционально).

Интерфейс StepValidator + стандартные реализации:

Валидатор Проверка
test Запуск тестов (go test ./... или эквивалент).
linter Запуск линтера (go vet, golangci-lint).
diff Анализ diff — были ли изменения в коде.
coverage Проверка покрытия тестами.

Результат валидации: passed → шаг completed, failed → retry (до max_retries), skipped → шаг пропущен.

Переходы статусов:

Цель: 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 --> [*]

При создании под-агента для шага:

  1. Engine вызывает orchestration.Store для запуска под-агента с ролью из assigned_agent.
  2. goal_steps.agent_task_id = multiagent_children.task_id — связь шаг↔под-агент.
  3. Координация через agent_manage сохраняется.
  4. При завершении под-агента → шаг переходит в 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);

По паттерну TodoUpdatedEvent:

Событие Когда Payload
GoalCreatedEvent Создание цели goal_id, title, session_id
GoalUpdatedEvent Изменение статуса/прогресса goal_id, status, completed_steps
GoalStepUpdated Изменение статуса шага goal_id, step_id, status

TUI подписывается на эти события и обновляет блок Goals в сайдбаре.

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(
  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.

  • Сайдбар: блок 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-реализация
  • Sequential по умолчанию. parallel и mixed стратегии — на будущее.
  • До max_steps шагов (по умолчанию 20) в одном плане.
  • Один уровень вложенности. Под-агенты для шагов не могут порождать своих детей.
  • Planner использует только current модель. Без опции mini.