Статус: Draft Дата: 2026-04-29 Цель: зафиксировать язык и объектную модель control plane до выбора конкретной реализации.
1. Базовая формула
1 2 3 4 5 | |
Эта формула должна быть одинаковой для создания Kubernetes-кластера, добавления ноды, установки PostgreSQL, установки Tempo, ремонта failed stage и других сценариев.
2. Объектная модель
id, type, name
desired_state, observed_state
health, provided_capabilities"] Intent["Intent
id, target_resource_type
desired_result, parameters, constraints"] Scenario["Scenario
id, version, actions
required_capabilities, provided_capabilities
plan_template"] Plan["Plan
id, scenario_ref, graph
customizations, capability_bindings"] Operation["Operation
id, intent_id, plan_id
status, timeline, actor"] Stage["Stage
id, name, status, jobs"] Job["Job
id, type
input_contract, output_contract
retry_policy"] CapabilityRequirement["CapabilityRequirement
key, constraints, scope"] Artifact["Artifact
id, type, location, sensitivity"] Evidence["Evidence
id, check_type, result, source"] PlanPatch["PlanPatch
id, operation, diff
author, approval"] Intent --> Scenario Scenario --> Plan Plan --> Operation Plan --> Stage Stage --> Job Job --> CapabilityRequirement Job --> Artifact Job --> Evidence Operation --> PlanPatch Resource --> CapabilityRequirement
3. Lifecycle операции
4. Resource и Operation
Resource описывает управляемый объект. Operation описывает процесс изменения объекта.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Ресурс может быть provisioning, running, degraded или error, но полная причина состояния должна быть видна через связанные operations.
5. Capability
Capability бывает двух типов.
Provided capability:
1 2 3 4 | |
Required capability:
1 2 3 4 | |
Capability должна поддерживать constraints. Без constraints она быстро станет слишком общей.
1 2 3 4 5 6 7 8 | |
6. Capability resolution
Resolution связывает requirement с concrete provider.
Provider policy может зависеть от organization, environment, criticality, cost, compliance и роли пользователя.
Пример:
1 2 3 4 5 6 7 8 9 10 11 | |
7. DAG Plan
Plan является DAG, а не просто линейным списком. Узлы DAG зависят от конкретных output capabilities и artifacts, а не только от имени предыдущей стадии.
8. Job contract
Каждый job обязан декларировать input/output contract.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | |
9. Artifact
Artifact является конкретным output, который может использоваться другими jobs.
Примеры:
- generated inventory;
- kubeconfig;
- kubeadm join token;
- Helm values;
- generated manifest;
- secret reference;
- package install report;
- diagnostics bundle.
Artifact должен иметь sensitivity:
1 2 3 4 5 6 7 | |
10. Evidence
Evidence доказывает, что output capability действительно существует.
Пример:
1 2 3 4 5 6 7 8 9 | |
Правило: job не должен считаться successful только по exit code automation tool. Он successful, если output contract подтвержден evidence.
11. Stage и Job
Stage нужен для human UX. Job нужен для protocol и execution.
1 2 3 4 5 6 7 8 | |
Simple mode показывает stage. Advanced mode раскрывает jobs и контракты.
12. Gates
Gate является узлом DAG.
Типы gate:
- approval gate;
- provider selection gate;
- destructive action gate;
- policy exception gate;
- missing input gate;
- cost confirmation gate.
Пример:
1 2 3 4 5 6 7 8 9 10 | |
13. Manual intervention
Manual intervention должен быть first-class объектом.
1 2 3 4 5 6 7 8 | |
После manual fix control plane не должен просто продолжать. Он должен выполнить verification jobs.
14. AI intervention
AI должен производить структурированный результат, а не только текст.
Роли AI:
- Analyzer: анализирует failed stage, logs, artifacts и observed state.
- Planner: предлагает PlanPatch.
- Executor: выполняет только разрешенные policy действия.
- Reviewer: проверяет план до запуска.
Пример PlanPatch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
15. Marketplace scenario pack
Минимальный контракт marketplace-сценария:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
16. Что пока не решаем
Этот документ намеренно не выбирает:
- движок workflow;
- брокер событий;
- формат хранения DAG;
- модель исполнения workers;
- конкретный API;
- схему БД.
Следующий шаг: превратить этот язык в архитектуру компонентов, API contracts и storage model.