Process Tables

Таблицы для определения, запуска и отслеживания процессов. Ядро observability и execution tracking.

Связи и зависимости

Предыдущие шаги: Core Tables

Следующие шаги: Process Contract, Process Runs

Необходимые навыки: SQL, JSON Schema, State Machines

ER-диаграмма Process Domain

┌─────────────────────┐
│     processes       │
├─────────────────────┤
│ id (PK, uuid)       │
│ code (UNIQUE)       │◄─────────────────────────────┐
│ name                │                              │
│ description         │                              │
│ prompt_template     │                              │
│ default_model       │                              │
│ n8n_workflow_id     │                              │
│ n8n_webhook_path    │                              │
│ output_schema       │                              │
│ auto_run            │                              │
│ status (enum)       │                              │
│ metadata            │                              │
└─────────┬───────────┘                              │
          │                                          │
          │ 1:N                                      │
          ▼                                          │
┌─────────────────────┐     ┌─────────────────────┐ │
│   process_runs      │     │  process_run_steps  │ │
├─────────────────────┤     ├─────────────────────┤ │
│ id (PK, uuid)       │     │ id (PK, uuid)       │ │
│ process_id (FK)     │────►│ run_id (FK)         │ │
│ requested_by (FK)   │     │ step_key            │ │
│ chat_id (FK)        │     │ status              │ │
│ source_message_id   │     │ started_at          │ │
│ input_text          │     │ finished_at         │ │
│ input_payload       │     │ error_text          │ │
│ status (enum)       │     │ output_payload      │ │
│ n8n_execution_id    │     └─────────────────────┘ │
│ result_payload      │                              │
│ error_text          │                              │
│ started_at          │                              │
│ finished_at         │                              │
└─────────┬───────────┘                              │
          │                                          │
          │ 1:N                                      │
          ▼                                          │
┌─────────────────────┐     ┌─────────────────────┐ │
│ process_artifacts   │     │     llm_calls       │ │
├─────────────────────┤     ├─────────────────────┤ │
│ id (PK, uuid)       │     │ id (PK)             │ │
│ run_id (FK)         │     │ process_id (FK)     │─┘
│ artifact_type       │     │ model               │
│ content             │     │ endpoint            │
│ metadata            │     │ request_json        │
│ created_at          │     │ response_json       │
└─────────────────────┘     │ latency_ms          │
                            │ http_status         │
                            │ error_text          │
                            └─────────────────────┘

processes — Определения процессов

Регистр всех процессов в системе. Процесс = именованный workflow с контрактом.

ПолеТипОписание
codetext (UNIQUE)Уникальный код процесса (web_search, daily_checkin)
prompt_templatetextШаблон промпта с {{переменными}}
n8n_workflow_idtextID workflow в n8n (если есть)
n8n_webhook_pathtextWebhook path для запуска (process-exec, web-search)
output_schemajsonbJSON Schema ожидаемого вывода
auto_runbooleanАвтоматический запуск (для reflection)
statusenumdraft | active | paused | archived

process_runs — Запуски процессов

Каждое выполнение процесса = одна запись. Хранит input, output, статус, метрики.

ПолеТипОписание
statusenumqueued | running | waiting_user | succeeded | degraded | failed | cancelled
input_texttextТекстовый ввод пользователя
input_payloadjsonbСтруктурированный ввод
result_payloadjsonbРезультат выполнения
n8n_execution_idtextID выполнения в n8n
error_texttextТекст ошибки (если failed)

Status Lifecycle

                    ┌──────────────┐
                    │   queued     │
                    └──────┬───────┘
                           │ worker picks up
                           ▼
                    ┌──────────────┐
           ┌───────│   running    │───────┐
           │       └──────┬───────┘       │
           │              │               │
     timeout/error  need user input  success
           │              │               │
           ▼              ▼               ▼
    ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
    │    failed    │ │ waiting_user │ │  succeeded   │
    └──────────────┘ └──────────────┘ └──────────────┘
                           │
                     user responds
                           │
                           ▼
                    ┌──────────────┐
                    │   running    │
                    └──────────────┘

    degraded = partial success (e.g., timeout but has partial result)
    cancelled = user or system cancelled

process_run_steps — Шаги выполнения

Детализация выполнения процесса по шагам. Каждый шаг = атомарная операция.

step_key — идентификатор шага (fetch_data, analyze, generate_response)

status — queued | running | succeeded | failed | skipped

output_payload — результат конкретного шага

error_text — ошибка шага (если failed)

llm_calls — LLM вызовы

Полный аудит всех вызовов LLM. Связывается с process_id для отслеживания.

Policy D — Observable by Default: Каждый LLM вызов логируется в llm_calls.
-- Пример записи llm_call
{
  "scope": "process",
  "model": "phi4-mini",
  "endpoint": "http://ollama:11434/api/chat",
  "request_json": {"messages": [...], "temperature": 0.7},
  "response_json": {"message": {"content": "..."}},
  "http_status": 200,
  "latency_ms": 2340,
  "process_id": "uuid-of-process-run"
}

Типичные запросы

Активные запуски процесса:

SELECT pr.*, p.code, p.name
FROM clowbot.process_runs pr
JOIN clowbot.processes p ON p.id = pr.process_id
WHERE pr.status IN ('queued', 'running', 'waiting_user')
ORDER BY pr.created_at DESC;

Статистика процесса:

SELECT * FROM mart.vw_process_performance 
WHERE code = 'web_search';

LLM вызовы процесса:

SELECT lc.* 
FROM clowbot.llm_calls lc
JOIN clowbot.process_runs pr ON pr.process_id = lc.process_id
WHERE pr.id = $1
ORDER BY lc.created_at;

Что делать дальше