R.1

API methods

The Substrate API at v1.0.0 is two gRPC services with 50 methods, and four plugin services that a third party can implement.

ate-api-server serves both services on one port, 443 in the Service named api in ate-system. The proto package is substrate.ateapi.v1, so the full name of a method is /substrate.ateapi.v1.Control/GetActor. The Go package is go.ate.dev/substrate/api/ateapi/v1. A client authenticates as section 5.1 describes, and each Control method is checked against the access policies of section 5.2.

The tables give each method, what it does at v1.0.0, and the kubectl ate command that calls it. A dash means that the CLI has no command for it. Our runs called every actor method, the egress policy methods, and the create, get, and list methods for templates, atespaces, and workers. UpdateActor ran in the template move of section 3.1. Our runs also created, replaced, and deleted an atespace access policy and read the global one, in section 5.2.

Our runs created three tags, started three actors from them, and deleted tags, in section 3.4. They did not change the scope of a tag.

Control: actors

MethodWhat it doeskubectl ate
CreateActorCreates an actor from a template or a tag. The new actor is ACTOR_STATE_SUSPENDED.create actor
GetActorReturns one actor with its state and snapshots.get actor <name>
ListActorsLists actors in one atespace or in all.get actor
UpdateActorChanges the template or the worker selector of an actor. Needs the uid and the version.update actor
SuspendActorCheckpoints a running actor to a new snapshot. A suspended actor is returned unchanged. options.mode is asynchronous by default.suspend actor
ResumeActorResumes a suspended actor from its latest snapshot. A running actor is returned unchanged, with resumed=false. The router calls it for every request and relies on that reply.resume actor
RevertActorReturns an actor to ACTOR_STATE_SUSPENDED at its durable snapshot. Accepts a crashed actor, a running actor, and a suspended actor with a node-local snapshot. Also accepts an actor already in ACTOR_STATE_REVERTING, for a retry. In our run that retry worked only after the node of the actor was back. A revert calls atelet on the node that the actor is assigned to. It continues without atelet only for a suspended actor whose latest snapshot is already durable.revert actor
DeleteActorStops the workload, releases the worker, and removes the record. Accepts any state.delete actor
MintActorJwtIssues a token that states the identity of an actor. Only the egress gateway is allowed to call it.-

Control: egress policies

An egress policy is one object under one actor. Section 6.2 explains its rules.

MethodWhat it doeskubectl ate
CreateActorEgressPolicyCreates the policy of an actor.create egress-policy <actor> -f
GetActorEgressPolicyReturns the policy.get egress-policy <actor>
UpdateActorEgressPolicyReplaces the policy. Needs metadata.uid and metadata.version.update egress-policy <actor> -f
DeleteActorEgressPolicyDeletes the policy. The actor returns to default deny.delete egress-policy <actor>

Control: templates, tags, and atespaces

MethodWhat it doeskubectl ate
CreateActorTemplateCreates a template. A reconciler then builds its golden snapshot.create actor-template -f
GetActorTemplateReturns one template with the status of its golden snapshot.get actor-template <name>
ListActorTemplatesLists templates.get actor-template
DeleteActorTemplateDeletes a template, its golden actor, and its golden tag.delete actor-template
CreateTagGives a name to a copy of the durable snapshot of a suspended actor. Uploads the snapshot first if it is not uploaded.create tag --actor
GetTagReturns one tag.get tag <name>
ListTagsLists tags.get tag
UpdateTagChanges the scope of a tag between atespace and published.update tag --scope
DeleteTagDeletes a tag and its snapshot. Actors that still start from the tag cannot resume afterwards. It accepts the golden tag of a template, and create actor for that template then fails with Tag not found.delete tag
CreateAtespaceCreates an atespace.create atespace
GetAtespaceReturns one atespace.get atespace <name>
ListAtespacesLists atespaces.get atespace
DeleteAtespaceDeletes an empty atespace. Fails while an actor or a tag remains.delete atespace

Control: workers

ate-controller and atelet call most of these. An operator reads workers and rarely writes them.

MethodWhat it doeskubectl ate
ListWorkersLists workers with capacity and reserved resources.get worker, top worker
GetWorkerReturns one worker.get worker <name>
ListWorkerActorAssignmentsLists the actors on one worker.-
CreateWorkerRegisters a worker when its pod has an address. The worker starts as unavailable.-
UpdateWorkerUpdates the pool state that the controller observed.-
DeleteWorkerRemoves a worker record.-
DrainWorkerMarks a worker as terminating. The scheduler places no new actor on it. One-way.-
MarkWorkerAvailableMoves an unavailable worker to active.-
MarkWorkerUnavailableMoves an active worker to unavailable, for example while its pod is not ready.-

Control: access policies

MethodWhat it doeskubectl ate
GetGlobalAccessPolicyReturns the one policy for the whole install.get access-policy --global
CreateGlobalAccessPolicyCreates it. The owners named at install can always do this.create access-policy --global -f
UpdateGlobalAccessPolicyReplaces it. Empty bindings remove every grant except those of the install owners.update access-policy --global -f
GetAtespaceAccessPolicyReturns the policy of one atespace.get access-policy -a
CreateAtespaceAccessPolicyCreates it.create access-policy -a -f
UpdateAtespaceAccessPolicyReplaces it.update access-policy -a -f
DeleteAtespaceAccessPolicyDeletes it.delete access-policy -a

The global policy has no delete method.

WorkerService: for atelet only

atelet on each node calls these eight methods. A client of yours never does. They explain log lines and states that you see.

MethodWhat it does
AcquireWorkerEpochGives a worker process a new epoch number when it starts.
RegisterWorkerRecords that the worker process runs under that epoch. Actors from an older epoch become crashed.
SetWorkerSandboxRuntimesReports which sandbox classes and versions the worker can run and restore.
MintWorkerActorCertificateIssues a certificate for a worker that acts for one actor. Its SPIFFE path starts with worker-for-actor, so it is not an identity of the actor itself.
MintWorkerActorJwtIssues a token for a worker that acts for one actor. Its subject is worker-for-actor/<atespace>/<name>, and it speaks for the worker.
RequestActorSuspendAsks the control plane to suspend an actor on behalf of the worker. atelet forwards the call from a worker-side library, and no binary at v1.0.0 imports that library. So nothing triggers it.
ReportActorSnapshotStateReports that a pending snapshot reached the bucket, or that the actor left the node.
ReportActorCrashedReports that a sandbox died. The actor moves from running to crashed.

Plugin services

Substrate calls these services over gRPC. The repository includes one implementation of each, and another party can supply its own.

ServiceMethodsWho calls itPurpose
NodeProviderFetchSnapshot, UploadSnapshotateletmoves snapshot files between a node and the bucket
ControlProviderCleanupSnapshot, CopySnapshotate-api-serverdeletes a snapshot, and copies one for a tag
AssetProviderFetchAssetateletdownloads sandbox runtime files
CredentialProviderFetchSecretthe egress gatewayreturns the secret that replaces a header, as section 6.5 shows

Conventions that every method shares

  • Names: an object is addressed by an atespace and a name. Workers and atespaces have a name only.
  • Preconditions: each object has metadata.uid and metadata.version. An update or a guarded delete that names an old version fails with ABORTED.
  • Wrong state: a lifecycle call from a state that it does not accept fails with FAILED_PRECONDITION. A resume of a crashed actor is the case that we recorded.
  • Lists: list methods take page_size and page_token.
  • Deadline: the server ends any call after 10 minutes.
  • Preview fields: a field behind a preview feature is rejected unless the server enables it and the client sends the header Ate-Preview-Allowed: true.

Agent Substrate 1.0.0 · b34fbee · 2026-11-05 · Edition 2026.11