Статус: Draft Дата: 2026-04-29 Область: предметная модель control plane, без выбора БД, брокера, workflow engine или API transport.
1. Цель модели
Этот документ уточняет, какие сущности должны стать first-class объектами control plane. Он отвечает на вопросы:
- что пользователь создает, когда хочет получить инфраструктурный результат;
- как marketplace-сценарии превращаются в конкретный план;
- как capabilities связывают ресурсы, сценарии и jobs;
- чем отличается resource state от operation state;
- какие инварианты нельзя нарушать при будущей реализации.
Базовая формула остается прежней:
1 2 3 4 5 | |
2. Высокоуровневая карта домена
3. Агрегаты и ownership
| Aggregate | Ответственность | Примеры owned entities |
|---|---|---|
| Resource Catalog | Канонические управляемые ресурсы, desired/observed state, provided capabilities | Resource, ResourceType, ProvidedCapability |
| Scenario Registry | Версионируемые сценарии и marketplace packs | ScenarioPack, Scenario, PlanTemplate, CapabilityRequirement |
| Planning | Построение и изменение конкретного DAG | Intent, Plan, PlanNode, ResourceBinding, PlanPatch |
| Operation Runtime | Фактическое выполнение plan и timeline | Operation, OperationNodeRun, Intervention |
| Evidence Store | Доказательства, логи, artifacts, outputs | Artifact, Evidence |
| Policy | Правила provider selection, approvals, risk и permissions | CapabilityPolicy, GatePolicy, ExecutionPolicy |
Это логический ownership. Он не означает, что каждая строка должна жить в отдельном сервисе.
4. Основные сущности
4.1 Resource
Resource - управляемая сущность инфраструктуры или платформы.
Примеры:
cluster/prod-k8s;node/worker-3;postgres/main;tempo/prod-tracing;service/api-gateway;deployment/api-gateway-prod.
Минимальная модель:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Resource не должен хранить всю историю изменения. История живет в operations.
4.2 ResourceType
ResourceType описывает класс ресурса и его допустимые действия.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
4.3 CapabilityDefinition
CapabilityDefinition описывает семантику capability.
1 2 3 4 5 6 7 8 9 10 | |
Capability key должен быть стабильным контрактом. Constraints уточняют, какой именно provider подходит.
4.4 ProvidedCapability
ProvidedCapability говорит, что конкретный resource предоставляет capability.
1 2 3 4 5 6 7 8 9 10 | |
4.5 CapabilityRequirement
CapabilityRequirement говорит, что scenario, plan node или job требует capability.
1 2 3 4 5 6 7 8 9 10 | |
Requirement не должен ссылаться на конкретный provider до resolution.
4.6 ResourceBinding
ResourceBinding связывает requirement с concrete resource или sub-operation, которая создаст provider.
1 2 3 4 5 6 7 | |
Если provider еще не существует:
1 2 3 4 5 6 | |
4.7 Intent
Intent - пользовательское намерение получить результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Intent не является планом. Он описывает "что нужно", а не "как сделать".
4.8 ScenarioPack
ScenarioPack - marketplace или internal package, который поставляет сценарии.
1 2 3 4 5 6 7 8 9 10 11 12 | |
4.9 Scenario
Scenario - версионируемый шаблон действия.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Scenario является template-level объектом. Он не должен содержать runtime state.
4.10 Plan
Plan - конкретный DAG, построенный из scenario под конкретный intent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Plan можно редактировать до запуска. После запуска изменения идут через PlanPatch.
4.11 PlanNode
PlanNode - узел DAG. Типы узлов:
stage;job;gate;sub_operation;verification;manual_intervention;ai_analysis.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
4.12 JobContract
JobContract описывает input/output конкретного executable node.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Job successful только если output contract подтвержден evidence.
4.13 Operation
Operation - фактический запуск plan.
1 2 3 4 5 6 7 8 9 10 | |
Operation хранит execution state, но не должна менять template scenario.
4.14 OperationNodeRun
OperationNodeRun - runtime-состояние конкретного PlanNode.
1 2 3 4 5 6 7 8 9 | |
4.15 Artifact
Artifact - output, который может быть использован другими nodes.
1 2 3 4 5 6 7 | |
Artifact может быть обычным файлом, secret reference, generated config, report или diagnostics bundle.
4.16 Evidence
Evidence - доказательство, что состояние достигнуто.
1 2 3 4 5 6 7 8 9 10 | |
Evidence отличает реальное достижение состояния от простого "команда завершилась".
4.17 Gate
Gate - точка ожидания решения.
1 2 3 4 5 6 7 8 | |
Gate является узлом DAG и влияет на lifecycle operation.
4.18 Intervention
Intervention - ручное или AI-вмешательство.
1 2 3 4 5 6 7 8 9 10 | |
Intervention не должен обходить verification.
4.19 PlanPatch
PlanPatch - структурированное изменение plan.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
PlanPatch должен быть auditable и reversible на уровне истории.
5. Связи между сущностями
6. Статусы
6.1 Intent status
| Status | Смысл |
|---|---|
| draft | Пользователь еще формирует intent |
| ready_for_planning | Входные данные достаточны для plan preview |
| planned | Plan построен |
| cancelled | Пользователь отменил intent |
| superseded | Intent заменен новым intent |
6.2 Plan status
| Status | Смысл |
|---|---|
| draft | DAG строится или редактируется |
| resolving | Идет capability resolution |
| waiting_input | Не хватает provider choice, credentials или параметров |
| waiting_approval | Нужен approval до запуска |
| ready | Plan можно запускать |
| locked | Plan запущен, изменения только через PlanPatch |
| archived | Plan больше не используется |
6.3 Operation status
| Status | Смысл |
|---|---|
| queued | Operation создана, но еще не исполняется |
| running | Выполняется |
| waiting_input | Ожидает ввод пользователя |
| waiting_approval | Ожидает approval gate |
| paused | Остановлена вручную или policy |
| failed | Узел упал и продолжение невозможно без решения |
| diagnosing | Идет анализ проблемы |
| patch_review | Ожидает review PlanPatch |
| verifying | Проверяется manual fix или output capability |
| completed | Все required outputs подтверждены |
| cancelled | Остановлена пользователем |
6.4 Node run status
| Status | Смысл |
|---|---|
| pending | Ждет зависимостей |
| ready | Можно запускать |
| running | Исполняется |
| skipped | Пропущен явно и легально |
| succeeded | Output contract подтвержден |
| failed | Контракт не выполнен |
| blocked | Нужен gate, input или dependency |
6.5 Resource lifecycle status
| Status | Смысл |
|---|---|
| planned | Resource запланирован, но еще не создан |
| provisioning | Идет operation создания |
| running | Resource работает |
| degraded | Resource работает частично |
| maintenance | Resource в обслуживании |
| error | Resource не достиг desired/healthy state |
| deleting | Идет удаление |
| deleted | Resource удален или выведен из управления |
Resource lifecycle status не заменяет operation status. Он должен ссылаться на active или last operation.
7. Ключевые инварианты
- Resource и Operation не являются одной сущностью.
- Scenario template не хранит runtime state.
- Plan является конкретизацией Scenario под Intent.
- Запущенный Plan нельзя тихо менять. Изменения только через PlanPatch.
- Job successful только если output contract подтвержден Evidence.
- CapabilityRequirement не должен заранее знать concrete provider, если это не явный input пользователя.
- ResourceBinding должен объяснять, почему выбран конкретный provider.
- Manual intervention не отменяет verification.
- AI intervention должен создавать structured output: diagnosis, PlanPatch, recommendation или review.
- Artifact с secret sensitivity не должен отображаться напрямую пользователю без policy.
- Operation timeline должен быть auditable.
- Capability constraints обязательны для production-grade resolution.
8. Границы с текущими сущностями platform-core
Текущие clusters, compute_nodes, internal_services, external_services, marketplace_services можно рассматривать как начальный Resource Catalog.
Control plane добавляет над ними:
- Intent;
- Plan;
- Operation;
- CapabilityRequirement;
- ResourceBinding;
- Artifact;
- Evidence;
- Intervention;
- PlanPatch.
Пример:
1 2 3 4 5 6 7 8 | |
9. UX-проекция доменной модели
Simple mode показывает:
- desired result;
- current phase;
- progress;
- needs attention;
- final resource health.
Advanced mode показывает:
- resolved capability graph;
- DAG plan;
- job contracts;
- artifacts;
- evidence;
- gates;
- interventions;
- PlanPatch diff.
Обе проекции используют одну и ту же модель.
10. Открытые вопросы
- Должен ли
Intentсохраняться после завершения operation как отдельный audit object или достаточно Operation? - Является ли
Stageсамостоятельной сущностью или только группирующим PlanNode? - Нужна ли отдельная сущность
CapabilityProvider, или достаточно Resource + ProvidedCapability? - Где проходит граница между
ArtifactиEvidence, если output является command result? - Как версионировать измененный пользователем Plan: fork, overlay или immutable snapshot?
- Какие resource lifecycle statuses должны быть общими, а какие resource-type-specific?
- Как отражать drift: через observed_state, отдельную drift operation или evidence failure?
11. Следующий шаг
После этой модели можно проектировать архитектуру компонентов:
- service boundaries;
- API contracts;
- storage ownership;
- event contracts;
- execution runtime;
- AI agent interface;
- marketplace scenario format.