Operations

Certified Promotions & Rollout

The governed release control plane for config and strategy artifacts — promotion candidates, rollout-evidence packs, and runtime-conformance gates.

This is the change-governance plane for artifacts — routing tables, workflows, connector configs, and strategies — not for the binary or the cluster. A promotion moves an immutable artifact through preflight, guardrails, and a canary into activation, with a rollback handle at every step. Rollout evidence and runtime conformance are the proof that authorizes each move.

This is not Kubernetes deployment

Promotions govern config/strategy artifact releases inside a running Ductor tenant. Rolling out a new binary or chart is a different plane — see Production deployment and Kubernetes / Helm. The two are independent: you promote artifacts on a cluster that is already deployed.

Promotions: the candidate lifecycle

A promotion candidate wraps one or more immutable routing, workflow, connector, or strategy artifacts and carries them through a fixed lifecycle. Every stage is a separate, authenticated call under /api/promotions/candidates, so an operator (or an automated release pipeline) advances the candidate deliberately and can stop at any gate.

createcandidate preflightimpact check guardrails/evaluate canary/start canary/stop approve promote rollback abort
StageEndpointWhat it does
CreatePOST /api/promotions/candidatesRegisters a governed candidate for immutable routing/workflow/connector/strategy artifacts
InspectGET /api/promotions/candidates/{candidate_id}Returns the candidate, active canary state, check results, and approval evidence
PreflightPOST …/{candidate_id}/preflightRuns impact checks without live connector actions or external side effects
GuardrailsPOST …/{candidate_id}/guardrails/evaluateEvaluates guardrails against durable evidence and low-cardinality metrics
Canary startPOST …/{candidate_id}/canary/startStarts a deterministic sticky canary run
Canary stopPOST …/{candidate_id}/canary/stopStops new canary assignment while preserving recorded canary evidence
ApprovePOST …/{candidate_id}/approveRecords an authenticated approval decision
PromotePOST …/{candidate_id}/promoteActivates artifacts through their artifact-specific activation paths
RollbackPOST …/{candidate_id}/rollbackRuns rollback through artifact-specific rollback handles
AbortPOST …/{candidate_id}/abortAborts the candidate and stops any active canary assignment

Create the candidate

curl -X POST http://localhost:8080/api/promotions/candidates \
  -H "X-Tenant-ID: $DUCTOR_TENANT_ID" \
  -H "Content-Type: application/json" \
  -d '{ "environment_id": "prod", "artifacts": [ ... ] }'

The candidate binds the exact artifact versions you intend to release. Artifacts are immutable — a new version is a new candidate.

Preflight before anything touches production

preflight computes per-artifact impacts and blocking reasons over the candidate's artifacts and their dependents, and runs without executing live connector actions or external side effects. Treat a non-empty set of blocking reasons as a hard stop.

Evaluate guardrails, then canary

guardrails/evaluate scores the candidate against durable evidence and low-cardinality metrics. canary/start then routes a deterministic, sticky slice of traffic to the new artifacts so the same key always lands on the same side of the canary.

Approve and promote — or roll back

approve records the authenticated decision; promote activates the artifacts through their activation paths. If anything regresses, rollback reverses the promotion through each artifact's rollback handle.

Rollout evidence: what authorizes a promotion

A promotion should not be approved on trust. A rollout-evidence pack is the governed, tenant/environment-scoped bundle of proof — attached artifacts and typed receipts — that a gate evaluates before a candidate is allowed forward. Packs and their gate are the machine-checkable answer to "is this promotion allowed to proceed?"

Advanced / enterprise surface

Rollout evidence is an advanced governance surface for organizations that require an auditable, redacted record for every promotion. Most tenants can use the standard promotion lifecycle without evidence packs.

A pack moves through its own lifecycle, all under /api/rollout-evidence/packs:

OperationEndpoint
Create / list packsPOST · GET /api/rollout-evidence/packs
Get / update a packGET · PUT /api/rollout-evidence/packs/{environment_id}/{pack_id}
Attach a hash-addressed artifactPOST …/{pack_id}/artifacts
Attach one typed receiptPOST …/{pack_id}/receipts
Start / get / heartbeat / cancel a runPOST …/{pack_id}/runs · GET/:heartbeat/:cancel on /runs/{environment_id}/{run_id}
Evaluate the gatePOST …/{pack_id}/gate:evaluate
Explain failuresPOST …/{pack_id}:explain
Expand requirementsPOST /api/rollout-evidence/requirements:expand
Export redacted manifestPOST …/{pack_id}:export
ArchivePOST …/{pack_id}:archive
Attach to a promotionPOST …/{pack_id}:attach-to-promotion

Receipts are strictly typed — exactly one of a scenario, connector, strategy, runtime, graph, or canary receipt per attachment. The gate evaluates the full set for missing, failed, blocked, stale, expired, wrong-environment, and wrong-candidate evidence; :explain returns the tenant-scoped reason set when the gate is not green.

green not green evidence pack attach artifacts+ typed receipts evidence runsstart/heartbeat/cancel gate:evaluate attach-to-promotion :explain promotion promote

Evidence runs are leased

A run is started in an allowed environment mode and holds a lease you renew with :heartbeat. Heartbeats never extend a run beyond its absolute deadline, and :cancel stops a pending or running run. Exports are redacted — no secrets, storage refs, raw provider payloads, or unrestricted PII leave the pack.

Runtime conformance: gating the environment itself

Where evidence packs prove a candidate is safe, runtime conformance proves the environment is. A conformance suite runs against a tenant environment and produces a hash-addressed coverage report; that report is what gates whether the environment is fit to receive a promotion.

Advanced / enterprise surface

Runtime conformance is an advanced enterprise gate rather than a required step in the standard promotion lifecycle.

OperationEndpoint
List / get suitesGET /api/runtime-conformance/suites · GET …/suites/{suite_id}
Run a suitePOST …/suites/{suite_id}:run
List / get reportsGET /api/runtime-conformance/reports · GET …/reports/{environment_id}/{report_id}
Explain coveragePOST …/reports/{environment_id}:explain

Suites cover the runtime, bridge, worker-protocol, MCP, connector-lifecycle, and admission surfaces with stable case IDs. A run executes in a sandbox or dry-run mode — running a suite against a live environment without dry-run is rejected — and returns a hash-addressed report. :explain answers whether the latest report covers the cases required for promotion or rollout evidence.