Skip to content

Promote a deployment to the next environment

View as Markdown
POST
/v1/deployments/{deploymentId}/promotions
curl --request POST \
--url https://example.com/v1/deployments/example/promotions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "toProjectId": "example", "reason": "example", "pin": true, "replace": [ { "blockId": "example", "reason": "example" } ] }'

Moves the exact build a deployment runs into the next environment of its environment order: a new deployment of the target project with the same image, signature, signer and contents, and promotedFromDeploymentId. Nothing is built again and no registry is written. The edits of the build’s agents and flows (versions made from a version it ships) move with it (moved.agents[].carried); edits made from a version it doesn’t ship stay (leftBehind). Needs read on the deployment’s project and admin on the target. Refused, with nothing written, when the target isn’t the next environment, the deployment (or the target’s copy) no longer serves, its signer is no longer trusted or its signature doesn’t verify, or a value the build needs isn’t ready in the target. The target having this build already answers 200 with its deployment, and records the edits made since. With pin, the build’s blocks (contents.blocks) are checked first against what runs in the target, as a deploy’s are against what runs: a newer version of one running there stops the promotion with nothing written, unless replace names the block, and blockCheck answers what the check found. Then the move commits; then each carried agent is pinned through its target scope’s release gate, and each carried flow is pinned. pin is the ask to take a target project that follows Latest off it: such a pin gets no 409 pin-stops-latest, and records stoppedFollowingLatest. A release gate that refuses or holds an agent isn’t an error: its pinned entry has pinned: false and the gate’s status. A refusal after the move leaves the move in place, and lists the pins already made in details.pinned and details.pinnedFlows.

deploymentId
required
string
>= 1 characters

The deployment to promote: one serving an environment of an order.

Media typeapplication/json
object
toProjectId
required

The next environment of the deployment’s order.

string
>= 1 characters
reason

Why, kept in the deployment-promoted audit record.

string
<= 1000 characters
pin

Pin every agent version the promotion carries in the target project, each through its scope’s release gate, and every flow version it carries (the project’s pin), so a run there that names no version takes it. The answer’s pinned reports each agent and pinnedFlows each flow. An error answered after some were already pinned lists those in error.details.pinned and error.details.pinnedFlows, in the answer’s shapes.

boolean
replace

With pin: the blocks the pins put back to an older version than runs in the target now, on purpose, each with why; a block named once. Without it, a newer version of one of the build’s blocks running in the target stops the promotion (409 deploy-would-put-back-older-blocks).

Array<object>
object
blockId
required
string
>= 1 characters
reason
required

Why the older version goes back: 1 to 500 characters, no control characters.

string
>= 1 characters <= 500 characters
Examplegenerated
{
"toProjectId": "example",
"reason": "example",
"pin": true,
"replace": [
{
"blockId": "example",
"reason": "example"
}
]
}

The target has this build already: its deployment, with the edits made since recorded.

Media typeapplication/json
object
deployment
required
object
deploymentId
required
string
>= 1 characters
tenantId
required
string format: uuid
imageRef
required

Full digest-pinned OCI reference: <host>/<repo>@sha256:<hex>.

string
imageDigest
required

Idempotency key. Extracted from imageRef after the @.

string
/^sha256:[0-9a-f]{64}$/
artifactVersion
required

Issuer-supplied YYYYMMDD.N — matches what was signed.

string
/^\d{8}\.\d+$/
indexHash
required

Sha256 of the canonicalised /app/index.json inside the image.

string
/^sha256:[0-9a-f]{64}$/
signerKeyId
required
string
>= 1 characters
signerPublicKey
required

Base64 of the raw Ed25519 public key bytes (32 bytes → 44 chars).

string
signature
required

Base64 of the raw Ed25519 signature (64 bytes → 88 chars).

string
publishedAt
required

Issuer-supplied timestamp inside the signed envelope.

string format: date-time
activatedAt
required

Server-side ledger timestamp — when the register call succeeded.

string format: date-time
projectId

The project the deploy named, which its primitives were registered into. Absent for a tenant-wide deploy (the tenant’s default project).

string format: uuid
packEnv

The names the pack service reads from its process environment, as the image’s index.json declares them (env), each list in name order. Names only, never a value. On a deployment: absent when it declares none, and from older servers.

object
required
required

Names the pack service needs, set and non-empty, to be ready.

Array<string>
optional
required

Names the pack reads when present.

Array<string>
promotedFromDeploymentId

When this deployment was made by promoting another into the next environment of its order: the deployment it was promoted from. Absent for one deployed directly.

string
>= 1 characters
packId

The pack’s id, from the image’s index. Absent from a runtime that doesn’t keep it.

string
endpoint

Its pack service’s status, when the server routes each pack call to the deployment that shipped the tool (KINDGI_PACK_ROUTING=per-deployment). Absent otherwise, and for a deployment that ships nothing a pack service serves (no tool, and no guardrail check but built-in ones: a pack of agents and flows only), which needs none. pending: no pack service yet, and calls to its tools fail (pack-endpoint-pending) rather than go to another deployment. ready: calls go to its own pack service. cleared: its pack service was taken down, and calls fail (pack-endpoint-cleared); it carries waiting or retired to say whether it comes back. Carries no URL and no token.

object
status
required
string
Allowed values: pending ready cleared
since
required

When the status last changed.

string format: date-time
problem

While the deployment waits for a pack service (pending, or cleared and waiting): the last reason recorded while it waited. A ready endpoint has none, nor a retired one. A fixed code, never free text.

object
code
required

One of a fixed list; a later runtime may add codes, so treat an unknown one as a reason not yet named. The server refused the endpoint it was given: endpoint-url-invalid (not https, or with user info or a path), endpoint-host-not-allowed (the host isn’t on the operator’s allowlist), endpoint-name-mismatch (the host doesn’t name this deployment’s service), endpoint-unreachable (the pack service didn’t answer), endpoint-info-mismatch (it answered as another pack or version), image-not-allowed (the image is outside the tenant’s repository). The pack service couldn’t be created: tenant-not-provisioned (the tenant has nowhere to run pack services yet), capacity-unavailable (no room for another pack service just now), service-start-failed (the image was deployed but didn’t start). It can’t be given its declared environment (GET /v1/deployments/{deploymentId}/pack-env names the names): pack-env-ambiguous, pack-env-secret-not-yet, pack-env-missing, pack-env-secret-unreadable (a name’s secret can’t be read for a reason the platform fixes, not the owner; it’s tried again). It can’t be given its secrets: pack-env-secrets-unaudited (the runtime has nowhere to audit a secret it gives out; the platform fixes it, and it’s tried again), pack-env-secret-too-large (a secret’s value is over 32768 bytes, the most a pack service can be given), pack-env-name-too-long (a name set as a secret is too long for the secret it’s kept in, which is named after the pack service; shorten it in the pack), pack-env-secret-capacity (a name is set only as a secret, and there’s no room just now for a pack service that can be given one, apart from other projects’; it’s tried again).

string
since
required

When it was recorded.

string format: date-time
waiting

cleared only: a pack service is wanted for it again, as once a suspension that took its service down is lifted, and it lists as needing one; problem says why it isn’t back yet. A cleared endpoint carries this or retired, never both. Absent from older servers, which send neither.

boolean
retired

cleared only: why no pack service is wanted for it now. superseded: nothing a call can still ask for needs it: for each tool version, pack check, agent and flow version it serves, a newer deployment into its project serves it too, or it’s unregistered and not held (a check: no registered guardrail runs it in its project); and each tool it deployed without a version, a newer deployment into its project deploys without one too (from Kindgi 0.4.0; before, it meant newer deployments into its project shipped every tool version and check it does and deployed each tool it deployed without a version the same way, and was for good). One whose endpoint an earlier runtime made or last set is superseded as well, for good, once newer deployments into its project ship every tool version and check it does and deploy each tool it deployed without a version the same way. Otherwise it’s needed again once something it serves that no newer deployment into its project serves is wanted again: a tool, agent or flow version registered or held again, or a check a newly registered guardrail runs in its project. A tool call a step made on it still goes back to it when the step runs again, and fails closed (pack-endpoint-cleared). tenant-closing, tenant-suspended, project-suspended and pack-suspended last until the tenant, project or pack is restored. A later runtime may add reasons, so treat an unknown one as a reason not yet named. A cleared endpoint carries this or waiting, never both. Absent from older servers, which send neither.

string
packEnvProblem

ready only: the pack service runs on the values it was last given, because the newest can’t be given to it (a required one was removed, say, or a secret can’t be given), or didn’t start (pack-env-update-failed). Gone once they can, or do. For a name that can’t be given, GET /v1/deployments/{deploymentId}/pack-env names it. Absent from older servers.

object
code
required

Why a ready pack service runs on the values it was last given: a PackEnvProblemCode, so the newest can’t be given to it; pack-env-update-failed: they were given, and its new revision with them didn’t start, so the last ready one serves. That revision is tried again for an hour after it’s first recorded; setting the values again is a new revision, tried again too. The orchestrator couldn’t give it its secrets: pack-env-secrets-unaudited (the runtime has nowhere to audit a secret it gives out, so it gives none; the platform fixes it), pack-env-secret-too-large (a secret’s value is over 32768 bytes, the most a pack service can be given), pack-env-name-too-long (a name set as a secret is too long for the secret it’s kept in, which is named after the pack service; shorten it in the pack), pack-env-secret-redeploy (a name is now set only as a secret, and this pack service was made where no secret can be given to it; a new deployment’s can be, from a new build of the pack), pack-env-cloud-secret-unsupported (a name is set to a cloud secret, and this pack service’s host mounts none; removing it, or setting a value instead, moves the revision). A service held as pack-env-secret-unreadable or pack-env-secrets-unaudited is listed by GET /v1/system/pack-env every time, with its held, as the revision doesn’t move when the platform fixes it. A later runtime may add codes, so treat an unknown one as a reason not yet named.

string
Allowed values: pack-env-ambiguous pack-env-secret-not-yet pack-env-missing pack-env-secret-unreadable pack-env-update-failed pack-env-secrets-unaudited pack-env-secret-too-large pack-env-name-too-long pack-env-cloud-secret-unsupported pack-env-secret-redeploy
since
required

When it was recorded.

string format: date-time
keptFor

What keeps this build’s pack service, whatever its status, in kind, id, then version order. [] when nothing does: it’s retired (superseded), or retired next. A suspended build has retired and still lists what keeps it, since its service comes back when the suspension lifts. On a list page, the first 20 entries, with keptForTotal; a get of one deployment gives them all. Absent when builds aren’t counted (one service serves every build), and from a runtime before Kindgi 0.4.0.

Array<object>

One thing a build’s pack service is kept for. To let the build go, unregister it: kindgi tools|agents|flows unregister <id> <version>, kindgi guardrails unregister <id>.

object
kind
required

tool: a tool version this build is the newest into its project to route, still registered or held; a tool deployed without a version has no version and neither flag, and is kept until a newer deployment into the project ships the tool. agent, flow: a version this build is the newest into its project to ship or carry, still registered or held. guardrail: a registered guardrail that runs a pack check this build is the newest into its project to route; it has no version. A later runtime may add kinds, so treat an unknown one as a kind not yet named.

string
id
required

The tool, agent, flow or guardrail id.

string
version

The version kept for. Absent for a guardrail, or a tool deployed without one.

string
registered

The version (or guardrail) is registered.

boolean
held

A pin or a run that hasn’t finished uses the version. Unregistering it then lets the build go only once the pin’s own version is unregistered or the run finishes. Sent beside registered when both are true.

boolean
keptForTotal

On a list page, with keptFor: how many entries there are, of which keptFor holds the first 20. A get of one deployment doesn’t send it.

integer
primitives
required
object
tools
required
integer
guardrails
required
integer
agents
required
integer
flows
required
integer
contents
required
object
tools
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
guardrails
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
agents
required
Array<object>
object
id
required
string
version
required

The version the agent is registered as.

string
authoredVersion

The version the agent’s or flow’s definition names, present when it differs from version: that version was registered already with other pins or content, and versions never change, so the deploy registered the next free version in its line (or an earlier deploy did).

string
reason

Why version differs from authoredVersion: pins-changed (a tool or agent it uses has a new version), unpinned (authoredVersion was published before pins existed), version-taken (authoredVersion is registered with other content).

string
Allowed values: pins-changed unpinned version-taken
newVersion

true: this deploy registered version; false: an earlier deploy did.

boolean
pinChanges

For pins-changed: the pins that differ from authoredVersion’s.

Array<object>

One pin that differs between two versions of an agent or a flow.

object
kind
required
string
Allowed values: tool prompt setting agent
id
required
string
from

The earlier version’s pin; absent when it had none.

string
to

The later version’s pin; absent when it has none.

string
flows
required
Array<object>
object
id
required
string
version
required

The version the agent is registered as.

string
authoredVersion

The version the agent’s or flow’s definition names, present when it differs from version: that version was registered already with other pins or content, and versions never change, so the deploy registered the next free version in its line (or an earlier deploy did).

string
reason

Why version differs from authoredVersion: pins-changed (a tool or agent it uses has a new version), unpinned (authoredVersion was published before pins existed), version-taken (authoredVersion is registered with other content).

string
Allowed values: pins-changed unpinned version-taken
newVersion

true: this deploy registered version; false: an earlier deploy did.

boolean
pinChanges

For pins-changed: the pins that differ from authoredVersion’s.

Array<object>

One pin that differs between two versions of an agent or a flow.

object
kind
required
string
Allowed values: tool prompt setting agent
id
required
string
from

The earlier version’s pin; absent when it had none.

string
to

The later version’s pin; absent when it has none.

string
blocks

The pack’s data blocks, each { id, version }. Absent on a deployment recorded before deployments listed them, and from a runtime that doesn’t keep them.

Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
source

Where a deployment’s pack lives in git, as kindgi deploy read it from the work tree it ran in. Absent for a deploy made outside git, one made before deploys said, and from a runtime that doesn’t keep it.

object
repo

The origin remote as host/owner/name (a group path may stand for the owner), with no scheme, user, password, token or .git. Absent when the work tree has no origin, or one that is not a host and a path.

string
<= 1024 characters /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?(?:/[A-Za-z0-9_.-]+){2,}$/
path
required

The pack’s folder relative to the repository’s root, /-separated: . when it is the root. Never an absolute path.

string
>= 1 characters <= 1024 characters
commit
required

The commit checked out (HEAD), its full hex id.

string
/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/
branch

The branch checked out. Absent on a detached HEAD.

string
>= 1 characters <= 255 characters
dirty
required

The pack’s folder had changes the commit doesn’t hold, untracked files included.

boolean
blockFiles
required

Each of the pack’s blocks by id: its file, relative to the pack’s folder, as the image’s index names it.

object
key
additional properties
string
replaced

The blocks the deploy put back to an older version than ran, on purpose (the body’s replace). A deployment a promotion made has its own: the blocks that promotion’s pins put back in its project, never the source deployment’s. Absent when it put back none, and from a runtime that doesn’t keep them.

Array<object>
object
blockId
required
string
from
required

The newest version that ran in a project of one of the pack’s agents (a promotion: in its target).

string
to
required

The files’ older version, which the deploy shipped (a promotion: the build’s).

string
reason
required

Why, as the deploy or the promotion said.

string
by
required

Who pinned or unpinned: a user, or a service token.

object
kind
required
string
Allowed values: user service
id
required
string
created
required

true: the promotion made this deployment (201). false: the target had this build already (200), and only the versions it lacked were carried.

boolean
moved
required
object
packId
string
imageDigest
required
string
/^sha256:[0-9a-f]{64}$/
agents
required
Array<object>
object
id
required
string
version
string
carried

Carried with the build: an edit of a version it ships. Absent for one it ships.

boolean
flows
required
Array<object>
object
id
required
string
version
string
carried

Carried with the build: an edit of a version it ships. Absent for one it ships.

boolean
tools
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
guardrails
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
leftBehind

Edits of the build’s agents and flows that stay behind; absent when none.

Array<object>
object
kind
required

agent or flow; a later runtime may add kinds, so treat an unknown one as an item not yet named.

string
id
required
string
version
required
string
from
required

The version its chain of edits starts from.

string
pinned

Each carried agent’s pin in the target, done or held by its gate; present only when pin was asked.

Array<object>
object
id
required
string
version
required
string
pinned
required

Pinned now (true), or waiting on a gate — an approval, or a check it failed (false, with gate).

boolean
gate
object
status
required
string
Allowed values: pinned pending-approval refused superseded rejected expired
changeId
required
string format: uuid
releaseGate
One of:
object
id
required
string
version
required
string
approvalId

The approval a pending-approval pin waits on.

string
checks
Array<object>

One of a gate’s checks, as the pin records it.

object
name
required

Stable: comparison.required, comparison.status, comparison.freshness, comparison.testSet, sameContents, baselineIsPinned, scopeCovered, evidence.<metric>.minCases|minWeight|baselineMinCases|baselineMinWeight, metric.<metric>.k|minCandidate|maxDrop, replay.maxDiverged|maxErrors|maxRefusedWrites|maxStopped, cases.minPassing|noNewFailures, groupWeights.expertsOnly, and approval.recheck, which an approval adds to a pin it supersedes, to say what changed since the check.

string
passed
required
boolean
message
required

A plain sentence: what was found against what the gate asks.

string
value
number | string
threshold
number | string
caseIds

The cases it names: for cases.noNewFailures, the ones that passed before and fail now (empty when none does). Absent when it could not tell, and on other checks.

Array<string>
pinnedFlows

Each carried flow version pinned in the target (the project’s pin); present only when pin was asked of a runtime that pins flows.

Array<object>
object
id
required
string
version
required
string
blockCheck

The build’s blocks against what runs in the target; present only when pin was asked of a runtime that checks them.

object
checked
required

false for a build deployed before deployments kept their blocks (contents.blocks): nothing was compared, and replace did nothing.

boolean
replaced
required

The blocks replace names that a newer version runs for in the target: the pins put each back, and the audit log records it.

Array<object>
object
blockId
required
string
from
required

The newest version that ran in the target.

string
to
required

The build’s version, which the pins put there.

string
notNeeded
required

The blocks replace names that nothing newer runs for in the target.

Array<string>
Example
{
"deployment": {
"endpoint": {
"status": "pending",
"waiting": true,
"packEnvProblem": {
"code": "pack-env-ambiguous"
},
"keptFor": [
{
"registered": true,
"held": true
}
]
},
"contents": {
"agents": [
{
"reason": "pins-changed",
"pinChanges": [
{
"kind": "tool"
}
]
}
],
"flows": [
{
"reason": "pins-changed",
"pinChanges": [
{
"kind": "tool"
}
]
}
]
},
"replaced": [
{
"by": {
"kind": "user"
}
}
]
},
"moved": {
"agents": [
{
"carried": true
}
],
"flows": [
{
"carried": true
}
]
},
"pinned": [
{
"gate": {
"status": "pinned"
}
}
]
}

Promoted: a new deployment in the target.

Media typeapplication/json
object
deployment
required
object
deploymentId
required
string
>= 1 characters
tenantId
required
string format: uuid
imageRef
required

Full digest-pinned OCI reference: <host>/<repo>@sha256:<hex>.

string
imageDigest
required

Idempotency key. Extracted from imageRef after the @.

string
/^sha256:[0-9a-f]{64}$/
artifactVersion
required

Issuer-supplied YYYYMMDD.N — matches what was signed.

string
/^\d{8}\.\d+$/
indexHash
required

Sha256 of the canonicalised /app/index.json inside the image.

string
/^sha256:[0-9a-f]{64}$/
signerKeyId
required
string
>= 1 characters
signerPublicKey
required

Base64 of the raw Ed25519 public key bytes (32 bytes → 44 chars).

string
signature
required

Base64 of the raw Ed25519 signature (64 bytes → 88 chars).

string
publishedAt
required

Issuer-supplied timestamp inside the signed envelope.

string format: date-time
activatedAt
required

Server-side ledger timestamp — when the register call succeeded.

string format: date-time
projectId

The project the deploy named, which its primitives were registered into. Absent for a tenant-wide deploy (the tenant’s default project).

string format: uuid
packEnv

The names the pack service reads from its process environment, as the image’s index.json declares them (env), each list in name order. Names only, never a value. On a deployment: absent when it declares none, and from older servers.

object
required
required

Names the pack service needs, set and non-empty, to be ready.

Array<string>
optional
required

Names the pack reads when present.

Array<string>
promotedFromDeploymentId

When this deployment was made by promoting another into the next environment of its order: the deployment it was promoted from. Absent for one deployed directly.

string
>= 1 characters
packId

The pack’s id, from the image’s index. Absent from a runtime that doesn’t keep it.

string
endpoint

Its pack service’s status, when the server routes each pack call to the deployment that shipped the tool (KINDGI_PACK_ROUTING=per-deployment). Absent otherwise, and for a deployment that ships nothing a pack service serves (no tool, and no guardrail check but built-in ones: a pack of agents and flows only), which needs none. pending: no pack service yet, and calls to its tools fail (pack-endpoint-pending) rather than go to another deployment. ready: calls go to its own pack service. cleared: its pack service was taken down, and calls fail (pack-endpoint-cleared); it carries waiting or retired to say whether it comes back. Carries no URL and no token.

object
status
required
string
Allowed values: pending ready cleared
since
required

When the status last changed.

string format: date-time
problem

While the deployment waits for a pack service (pending, or cleared and waiting): the last reason recorded while it waited. A ready endpoint has none, nor a retired one. A fixed code, never free text.

object
code
required

One of a fixed list; a later runtime may add codes, so treat an unknown one as a reason not yet named. The server refused the endpoint it was given: endpoint-url-invalid (not https, or with user info or a path), endpoint-host-not-allowed (the host isn’t on the operator’s allowlist), endpoint-name-mismatch (the host doesn’t name this deployment’s service), endpoint-unreachable (the pack service didn’t answer), endpoint-info-mismatch (it answered as another pack or version), image-not-allowed (the image is outside the tenant’s repository). The pack service couldn’t be created: tenant-not-provisioned (the tenant has nowhere to run pack services yet), capacity-unavailable (no room for another pack service just now), service-start-failed (the image was deployed but didn’t start). It can’t be given its declared environment (GET /v1/deployments/{deploymentId}/pack-env names the names): pack-env-ambiguous, pack-env-secret-not-yet, pack-env-missing, pack-env-secret-unreadable (a name’s secret can’t be read for a reason the platform fixes, not the owner; it’s tried again). It can’t be given its secrets: pack-env-secrets-unaudited (the runtime has nowhere to audit a secret it gives out; the platform fixes it, and it’s tried again), pack-env-secret-too-large (a secret’s value is over 32768 bytes, the most a pack service can be given), pack-env-name-too-long (a name set as a secret is too long for the secret it’s kept in, which is named after the pack service; shorten it in the pack), pack-env-secret-capacity (a name is set only as a secret, and there’s no room just now for a pack service that can be given one, apart from other projects’; it’s tried again).

string
since
required

When it was recorded.

string format: date-time
waiting

cleared only: a pack service is wanted for it again, as once a suspension that took its service down is lifted, and it lists as needing one; problem says why it isn’t back yet. A cleared endpoint carries this or retired, never both. Absent from older servers, which send neither.

boolean
retired

cleared only: why no pack service is wanted for it now. superseded: nothing a call can still ask for needs it: for each tool version, pack check, agent and flow version it serves, a newer deployment into its project serves it too, or it’s unregistered and not held (a check: no registered guardrail runs it in its project); and each tool it deployed without a version, a newer deployment into its project deploys without one too (from Kindgi 0.4.0; before, it meant newer deployments into its project shipped every tool version and check it does and deployed each tool it deployed without a version the same way, and was for good). One whose endpoint an earlier runtime made or last set is superseded as well, for good, once newer deployments into its project ship every tool version and check it does and deploy each tool it deployed without a version the same way. Otherwise it’s needed again once something it serves that no newer deployment into its project serves is wanted again: a tool, agent or flow version registered or held again, or a check a newly registered guardrail runs in its project. A tool call a step made on it still goes back to it when the step runs again, and fails closed (pack-endpoint-cleared). tenant-closing, tenant-suspended, project-suspended and pack-suspended last until the tenant, project or pack is restored. A later runtime may add reasons, so treat an unknown one as a reason not yet named. A cleared endpoint carries this or waiting, never both. Absent from older servers, which send neither.

string
packEnvProblem

ready only: the pack service runs on the values it was last given, because the newest can’t be given to it (a required one was removed, say, or a secret can’t be given), or didn’t start (pack-env-update-failed). Gone once they can, or do. For a name that can’t be given, GET /v1/deployments/{deploymentId}/pack-env names it. Absent from older servers.

object
code
required

Why a ready pack service runs on the values it was last given: a PackEnvProblemCode, so the newest can’t be given to it; pack-env-update-failed: they were given, and its new revision with them didn’t start, so the last ready one serves. That revision is tried again for an hour after it’s first recorded; setting the values again is a new revision, tried again too. The orchestrator couldn’t give it its secrets: pack-env-secrets-unaudited (the runtime has nowhere to audit a secret it gives out, so it gives none; the platform fixes it), pack-env-secret-too-large (a secret’s value is over 32768 bytes, the most a pack service can be given), pack-env-name-too-long (a name set as a secret is too long for the secret it’s kept in, which is named after the pack service; shorten it in the pack), pack-env-secret-redeploy (a name is now set only as a secret, and this pack service was made where no secret can be given to it; a new deployment’s can be, from a new build of the pack), pack-env-cloud-secret-unsupported (a name is set to a cloud secret, and this pack service’s host mounts none; removing it, or setting a value instead, moves the revision). A service held as pack-env-secret-unreadable or pack-env-secrets-unaudited is listed by GET /v1/system/pack-env every time, with its held, as the revision doesn’t move when the platform fixes it. A later runtime may add codes, so treat an unknown one as a reason not yet named.

string
Allowed values: pack-env-ambiguous pack-env-secret-not-yet pack-env-missing pack-env-secret-unreadable pack-env-update-failed pack-env-secrets-unaudited pack-env-secret-too-large pack-env-name-too-long pack-env-cloud-secret-unsupported pack-env-secret-redeploy
since
required

When it was recorded.

string format: date-time
keptFor

What keeps this build’s pack service, whatever its status, in kind, id, then version order. [] when nothing does: it’s retired (superseded), or retired next. A suspended build has retired and still lists what keeps it, since its service comes back when the suspension lifts. On a list page, the first 20 entries, with keptForTotal; a get of one deployment gives them all. Absent when builds aren’t counted (one service serves every build), and from a runtime before Kindgi 0.4.0.

Array<object>

One thing a build’s pack service is kept for. To let the build go, unregister it: kindgi tools|agents|flows unregister <id> <version>, kindgi guardrails unregister <id>.

object
kind
required

tool: a tool version this build is the newest into its project to route, still registered or held; a tool deployed without a version has no version and neither flag, and is kept until a newer deployment into the project ships the tool. agent, flow: a version this build is the newest into its project to ship or carry, still registered or held. guardrail: a registered guardrail that runs a pack check this build is the newest into its project to route; it has no version. A later runtime may add kinds, so treat an unknown one as a kind not yet named.

string
id
required

The tool, agent, flow or guardrail id.

string
version

The version kept for. Absent for a guardrail, or a tool deployed without one.

string
registered

The version (or guardrail) is registered.

boolean
held

A pin or a run that hasn’t finished uses the version. Unregistering it then lets the build go only once the pin’s own version is unregistered or the run finishes. Sent beside registered when both are true.

boolean
keptForTotal

On a list page, with keptFor: how many entries there are, of which keptFor holds the first 20. A get of one deployment doesn’t send it.

integer
primitives
required
object
tools
required
integer
guardrails
required
integer
agents
required
integer
flows
required
integer
contents
required
object
tools
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
guardrails
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
agents
required
Array<object>
object
id
required
string
version
required

The version the agent is registered as.

string
authoredVersion

The version the agent’s or flow’s definition names, present when it differs from version: that version was registered already with other pins or content, and versions never change, so the deploy registered the next free version in its line (or an earlier deploy did).

string
reason

Why version differs from authoredVersion: pins-changed (a tool or agent it uses has a new version), unpinned (authoredVersion was published before pins existed), version-taken (authoredVersion is registered with other content).

string
Allowed values: pins-changed unpinned version-taken
newVersion

true: this deploy registered version; false: an earlier deploy did.

boolean
pinChanges

For pins-changed: the pins that differ from authoredVersion’s.

Array<object>

One pin that differs between two versions of an agent or a flow.

object
kind
required
string
Allowed values: tool prompt setting agent
id
required
string
from

The earlier version’s pin; absent when it had none.

string
to

The later version’s pin; absent when it has none.

string
flows
required
Array<object>
object
id
required
string
version
required

The version the agent is registered as.

string
authoredVersion

The version the agent’s or flow’s definition names, present when it differs from version: that version was registered already with other pins or content, and versions never change, so the deploy registered the next free version in its line (or an earlier deploy did).

string
reason

Why version differs from authoredVersion: pins-changed (a tool or agent it uses has a new version), unpinned (authoredVersion was published before pins existed), version-taken (authoredVersion is registered with other content).

string
Allowed values: pins-changed unpinned version-taken
newVersion

true: this deploy registered version; false: an earlier deploy did.

boolean
pinChanges

For pins-changed: the pins that differ from authoredVersion’s.

Array<object>

One pin that differs between two versions of an agent or a flow.

object
kind
required
string
Allowed values: tool prompt setting agent
id
required
string
from

The earlier version’s pin; absent when it had none.

string
to

The later version’s pin; absent when it has none.

string
blocks

The pack’s data blocks, each { id, version }. Absent on a deployment recorded before deployments listed them, and from a runtime that doesn’t keep them.

Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
source

Where a deployment’s pack lives in git, as kindgi deploy read it from the work tree it ran in. Absent for a deploy made outside git, one made before deploys said, and from a runtime that doesn’t keep it.

object
repo

The origin remote as host/owner/name (a group path may stand for the owner), with no scheme, user, password, token or .git. Absent when the work tree has no origin, or one that is not a host and a path.

string
<= 1024 characters /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?(?:/[A-Za-z0-9_.-]+){2,}$/
path
required

The pack’s folder relative to the repository’s root, /-separated: . when it is the root. Never an absolute path.

string
>= 1 characters <= 1024 characters
commit
required

The commit checked out (HEAD), its full hex id.

string
/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/
branch

The branch checked out. Absent on a detached HEAD.

string
>= 1 characters <= 255 characters
dirty
required

The pack’s folder had changes the commit doesn’t hold, untracked files included.

boolean
blockFiles
required

Each of the pack’s blocks by id: its file, relative to the pack’s folder, as the image’s index names it.

object
key
additional properties
string
replaced

The blocks the deploy put back to an older version than ran, on purpose (the body’s replace). A deployment a promotion made has its own: the blocks that promotion’s pins put back in its project, never the source deployment’s. Absent when it put back none, and from a runtime that doesn’t keep them.

Array<object>
object
blockId
required
string
from
required

The newest version that ran in a project of one of the pack’s agents (a promotion: in its target).

string
to
required

The files’ older version, which the deploy shipped (a promotion: the build’s).

string
reason
required

Why, as the deploy or the promotion said.

string
by
required

Who pinned or unpinned: a user, or a service token.

object
kind
required
string
Allowed values: user service
id
required
string
created
required

true: the promotion made this deployment (201). false: the target had this build already (200), and only the versions it lacked were carried.

boolean
moved
required
object
packId
string
imageDigest
required
string
/^sha256:[0-9a-f]{64}$/
agents
required
Array<object>
object
id
required
string
version
string
carried

Carried with the build: an edit of a version it ships. Absent for one it ships.

boolean
flows
required
Array<object>
object
id
required
string
version
string
carried

Carried with the build: an edit of a version it ships. Absent for one it ships.

boolean
tools
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
guardrails
required
Array<object>
object
id
required
string
version

Absent for guardrails, which have no version.

string
leftBehind

Edits of the build’s agents and flows that stay behind; absent when none.

Array<object>
object
kind
required

agent or flow; a later runtime may add kinds, so treat an unknown one as an item not yet named.

string
id
required
string
version
required
string
from
required

The version its chain of edits starts from.

string
pinned

Each carried agent’s pin in the target, done or held by its gate; present only when pin was asked.

Array<object>
object
id
required
string
version
required
string
pinned
required

Pinned now (true), or waiting on a gate — an approval, or a check it failed (false, with gate).

boolean
gate
object
status
required
string
Allowed values: pinned pending-approval refused superseded rejected expired
changeId
required
string format: uuid
releaseGate
One of:
object
id
required
string
version
required
string
approvalId

The approval a pending-approval pin waits on.

string
checks
Array<object>

One of a gate’s checks, as the pin records it.

object
name
required

Stable: comparison.required, comparison.status, comparison.freshness, comparison.testSet, sameContents, baselineIsPinned, scopeCovered, evidence.<metric>.minCases|minWeight|baselineMinCases|baselineMinWeight, metric.<metric>.k|minCandidate|maxDrop, replay.maxDiverged|maxErrors|maxRefusedWrites|maxStopped, cases.minPassing|noNewFailures, groupWeights.expertsOnly, and approval.recheck, which an approval adds to a pin it supersedes, to say what changed since the check.

string
passed
required
boolean
message
required

A plain sentence: what was found against what the gate asks.

string
value
number | string
threshold
number | string
caseIds

The cases it names: for cases.noNewFailures, the ones that passed before and fail now (empty when none does). Absent when it could not tell, and on other checks.

Array<string>
pinnedFlows

Each carried flow version pinned in the target (the project’s pin); present only when pin was asked of a runtime that pins flows.

Array<object>
object
id
required
string
version
required
string
blockCheck

The build’s blocks against what runs in the target; present only when pin was asked of a runtime that checks them.

object
checked
required

false for a build deployed before deployments kept their blocks (contents.blocks): nothing was compared, and replace did nothing.

boolean
replaced
required

The blocks replace names that a newer version runs for in the target: the pins put each back, and the audit log records it.

Array<object>
object
blockId
required
string
from
required

The newest version that ran in the target.

string
to
required

The build’s version, which the pins put there.

string
notNeeded
required

The blocks replace names that nothing newer runs for in the target.

Array<string>
Example
{
"deployment": {
"endpoint": {
"status": "pending",
"waiting": true,
"packEnvProblem": {
"code": "pack-env-ambiguous"
},
"keptFor": [
{
"registered": true,
"held": true
}
]
},
"contents": {
"agents": [
{
"reason": "pins-changed",
"pinChanges": [
{
"kind": "tool"
}
]
}
],
"flows": [
{
"reason": "pins-changed",
"pinChanges": [
{
"kind": "tool"
}
]
}
]
},
"replaced": [
{
"by": {
"kind": "user"
}
}
]
},
"moved": {
"agents": [
{
"carried": true
}
],
"flows": [
{
"carried": true
}
]
},
"pinned": [
{
"gate": {
"status": "pinned"
}
}
]
}

Malformed body (bad-input). Or signature-invalid: the deployment’s signature doesn’t verify over the fields it keeps.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

Missing / malformed / expired / revoked bearer token.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

No admin on the target project. Or key-project-mismatch: the API key or session is limited to a project, and a promotion reads one project and writes another (details.keyProjectId, details.projectId). Or signer-not-trusted: the key that signed the build is no longer on the tenant’s trust list (details.signerKeyId). With pin, after the move: no right to pin a carried agent or a carried flow in the target; nothing is pinned.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

deployment-not-found: no deployment with that id in this tenant, or one in a project you don’t read.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

promotion-not-next-environment: the target isn’t the next environment of the deployment’s order, or the deployment’s environment is last or in no order (details.position, the next environment’s place; details.nextProjectId, when you can read it). promotion-values-not-ready: values the build needs aren’t ready in the target, each in details.values (DeploymentValue). deployment-superseded: the deployment no longer serves its environment, or the target’s copy no longer serves there: newer deployments serve every tool version it ships (details.environment, source or target; details.newerDeploymentId). project-suspended, pack-suspended, tenant-suspended or tenant-closing: a suspension of the source or the target (details.environment). deploy-would-put-back-older-blocks, with pin: a newer version of one of the build’s blocks than its own runs in the target now, each in details.blocks (DeployCheckStop). Nothing is written for any of these. With pin, after the move has committed: nothing-runs-in-scope, a carried agent has no version running in the target yet (the message names it); or pin-superseded or release-gate-descendant-unpinned, as POST /v1/agents/{agentId}/pinned/pin answers them. The carried agents pinned before it are in details.pinned; it, the ones after it and the carried flows aren’t pinned.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

The request body is over the API’s limit (request-too-large; details.maxBytes says how much).

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

approvals-pending-limit, with pin, after the move has committed: a carried agent’s release gate wants an approval, and the tenant’s approvals waiting for a decision are at its limit. The carried agents pinned before it are in details.pinned; it, the ones after it and the carried flows aren’t pinned.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

Server error (unmapped domain code or framework crash).

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

promotions-unsupported: this runtime’s deployment ledger can’t promote. With pin, after the move: promotions-unsupported when this runtime can’t pin versions, or pin-gate-unsupported when a release gate applies to a carried agent’s scope and the runtime can’t record a gated pin; nothing is pinned.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

See also