Operational behavior сервиса строится вокруг safety, isolation и полной наблюдаемости попытки. Сервис должен уметь выполнять опасные infra-actions, но только через typed contracts, policy checks и контролируемые runners.
Execution Lifecycle
Runner Isolation Policy
Базовые правила:
- Каждый runner запускается в изолированном pod/process sandbox.
- Runner имеет минимальные network permissions, заданные
runner_requirements. - Secret values доступны только в runtime memory и только конкретному attempt.
- File system workspace ephemeral.
- Raw outputs проходят secret masking до сохранения.
- Любая destructive operation должна быть явно помечена в
JobSpec.
Запрещено:
- generic uncontrolled shell;
- передача secret values в
inputs.variables; - запись kubeconfig, ssh key или cloud credentials в artifacts;
- выполнение package content, который не прошел marketplace approval или trusted source policy;
- изменение plan или operation status напрямую.
Approved Commands
Execution допускается только через typed job types:
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 | |
Новый job type добавляется как protocol extension: runner implementation, contract schema, policy rules, evidence behavior и docs.
Secrets
Vault является единственным источником secret material.
Правила:
JobSpecсодержит толькоvault://...refs.- Dispatcher не раскрывает secret values.
- Runner получает секрет по lease-bound token или service identity.
- Secret redaction применяется к logs, heartbeat messages, errors и artifacts.
- Secret access audit должен быть связан с
attempt_id.
Artifacts
Каждый attempt производит artifact bundle.
Минимальный bundle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
UI показывает logs/artifacts через control-plane-service, который запрашивает refs и выдает product-level access.
Cancellation
Cancellation flow:
Если runner не отвечает, dispatcher ждет grace period и переводит attempt в lost или cancelled по policy.
Timeouts
Timeout задается в JobSpec и может быть ограничен service policy.
Поведение:
- dispatcher отслеживает deadline;
- runner получает cancellation request;
- partial logs сохраняются;
- final status становится
timed_out, если runner подтвердил timeout, илиlost, если heartbeat пропал; control-plane-serviceрешает, делать retry, PlanPatch или manual intervention.
Retries
Retry всегда создает новый attempt.
Execution-plane не решает retry policy сам. Он может только вернуть failure category и retry hints.
Idempotency
Idempotency защищает API от повторной доставки команды.
Правила:
executeJobidempotent поidempotency_key;completeAttemptidempotent поattempt_id + terminal payload digest;- повторный heartbeat append-only;
- artifact creation deduplicates by digest where safe.
Observability
Метрики:
- attempts by status/job type/runner kind;
- queue latency;
- lease acquisition latency;
- execution duration;
- heartbeat lag;
- artifact upload duration;
- failure categories;
- cancellation latency;
- runner pool capacity.
Traces:
operation_id;plan_node_id;node_run_id;attempt_id;runner_instance_id.
Logs:
- service logs не содержат secret values;
- runner raw logs уходят в artifact storage;
- operational errors имеют stable error code.
Disaster Recovery
После сбоя:
- dispatcher восстанавливает active attempts из БД;
- expired leases переводятся в
lost; - pending outbox events публикуются повторно;
- callbacks в
control-plane-serviceдоставляются повторно; - artifact worker проверяет incomplete uploads и помечает artifacts как partial или failed.
Extension Points
- AI agent может читать logs/evidence через
control-plane-serviceи предлагать repair PlanPatch. - IAM добавляет service identities, permissions и approval policy.
- Audit подписывается на execution events и secret access records.
- Billing использует attempt duration, runner kind и artifact size.
Эти extensions не получают право обходить JobSpec, Vault refs и runner isolation.