R.2

Objects and fields

Three kinds are Kubernetes objects that describe worker capacity, and every other Substrate object is a record that only the Substrate API returns.

Field names appear here as kubectl ate -o yaml prints them, in camel case. The proto file has the same names in snake case. A field marked preview is rejected unless a preview feature is on, as the flags reference describes.

Kubernetes kinds, group ate.dev/v1

You manage these three with kubectl apply.

WorkerPool (namespaced)

FieldMeaning
spec.replicasthe number of worker pods. Fixed until something changes it.
spec.workerImagethe worker image, which decides the sandbox runtime that the pod starts
spec.sandboxClasses[].namegvisor or microvm
spec.sandboxClasses[].configRef.namea SandboxConfig for that class. Without it the class default applies.
metadata.labelsthe labels of the WorkerPool object. A template selects a pool by these, and each worker of the pool reports them.
spec.template.labelslabels added to the worker Deployment and its pods. No selector of Substrate reads them.
spec.template.resourcesrequests and limits of the worker container. The limits become the capacity that the worker reports.
spec.template.nodeSelector, tolerations, nodeAffinity, priorityClassName, annotations, serviceAccountNamepassed to the worker pods
status.replicas, status.readyReplicasobserved pods
status.sandboxClasses[].conditionsa Resolved condition for each class, with a reason such as SandboxConfigNotFound
yamlthe WorkerPool of the resume experimentFull log
apiVersion: ate.dev/v1
kind: WorkerPool
metadata:
  name: ballast
  namespace: lab-c
  labels:
    workload: ballast
spec:
  replicas: 2
  workerImage: localhost:5001/ateworker-gvisor@sha256:ad6957f41bccaa8bb5f3eb5b34b7812babb862f1a3187a11578c21a7d799491c
  sandboxClasses:
  - name: gvisor
  template:
    resources:
      limits:
        cpu: "2"
        memory: 3Gi
      requests:
        cpu: 500m
        memory: 3Gi
The WorkerPool document. The Namespace document before it is cut.

A worker container without limits reports the whole node as its capacity. Section 4.1 shows that case.

SandboxConfig (cluster)

FieldMeaning
spec.sandboxClassgvisor or microvm
spec.defaultVersionthe version that new actors start on
spec.versions[].namea version name
spec.versions[].stateEnabled or Disabled
spec.versions[].assetsfor each architecture, the files of the runtime with a url and a sha256

The annotation sandboxconfig.ate.dev/is-class-default marks the default configuration of a class.

CSIDriverConfig (cluster, used by a preview feature)

FieldMeaning
spec.driverNamethe CSI driver
spec.controllerEndpointthe address of the CSI controller
spec.nodeSocketOverrideanother path for the node socket
spec.tls.enabled, spec.tls.usePodIdentity, spec.tls.serverNameTLS for the controller connection

Metadata of every API object

FieldMeaning
metadata.atespacethe atespace. Empty for a worker, for an atespace, and for an access policy. The request for an access policy names its atespace in a separate field.
metadata.namethe name, unique in its atespace
metadata.uidassigned by the server. A new object with an old name gets a new uid.
metadata.versiongrows with each write. An update must name the current value.
metadata.createTime, updateTime, deleteTimetimestamps

Actor

FieldMeaning
actorTemplate.atespace, actorTemplate.namethe template of the actor
sourceTagthe tag that the actor started from, if any
workerSelector.matchLabelsnarrows the selector of the template. A pool must match both selectors (logical AND). A change takes effect at the next resume.
status.stateone of seven states, as the states reference lists
status.workerAssignmentpresent while a worker holds the actor: workerPod, workerPool, workerNamespace, workerPodIps, nodeName, workerEpoch, sandboxRuntime
status.assignedNodethe node of the worker while the actor runs, or of the local snapshot after a suspend. It stays until the detach (default 30 minutes, --snapshot-detach-delay) or a revert.
status.snapshots[]the snapshots of the actor, described below
status.lastAssignedGenerationthe last generation that a suspend assigned. A revert does not lower it, so it can be higher than the generation of the newest kept snapshot.
status.crash.message, status.crash.crashTimeset when the actor enters ACTOR_STATE_CRASHED, and cleared by a revert
status.externalVolumespreview: the CSI volumes of the actor

One entry of status.snapshots

FieldMeaning
uuidthe last part of the snapshot address
generationa counter. Each suspend adds one.
ownerSNAPSHOT_OWNER_ACTOR, or SNAPSHOT_OWNER_TAG for a golden or tagged snapshot that the actor borrows
fidelitySNAPSHOT_FIDELITY_VOLUMES, SNAPSHOT_FIDELITY_ROOTFS, or SNAPSHOT_FIDELITY_MEMORY
localitythe node that has a local copy. Absent after the node copy is removed.
durableSnapshot.stateSNAPSHOT_STORAGE_STATE_PENDING until the upload finishes, then SNAPSHOT_STORAGE_STATE_COMPLETED
durableSnapshot.object.snapshotUrithe address in the bucket
sandboxRuntimethe class and the version attributes: architecture, cpu_features, sandbox_bundle_hash
actorTemplateUidthe template that the snapshot was taken under

After an asynchronous suspend an actor has two entries: the older completed one and the new pending one. Section 3.4 follows them.

ActorTemplate

FieldMeaning
workerSelector.matchLabelsselects worker pools by the metadata.labels of the WorkerPool object, in any namespace
containers[]name, image, command, args, env, volumeMounts, securityContext.capabilities, resources
containers[].wakeupProbehttpGet.path, httpGet.port, timeoutSeconds. The resume waits for one success.
volumes[]a name and one source: durableDir, image.reference, systemInfo, or external (preview)
volumes[].systemInfoone source: actorMetadata.items[] or trustBundle. An item has a path and a field: ACTOR_METADATA_FIELD_NAME, ACTOR_METADATA_FIELD_ATESPACE, or ACTOR_METADATA_FIELD_UID.
resources.limits.cpuMillicores, resources.limits.memoryBytesrequired. The worker reserves both while the actor runs.
snapshotConfig.preferredFidelitythe highest fidelity of a suspend. A snapshot can have less, so read the fidelity of the snapshot itself.
snapshotConfig.goldenSnapshotConfig.modeGOLDEN_SNAPSHOT_MODE_ENABLED or GOLDEN_SNAPSHOT_MODE_DISABLED
snapshotConfig.storageLocationpreview: a snapshot location for this template
goldenEgressPolicy.rulespreview: egress rules for the golden actor only
status.goldenSnapshotStatusgoldenTag, snapshotTime, errorMessage
yamlthe template of the 50 MiB ballast actorFull log
metadata:
  atespace: lab-c
  name: ballast-50
workerSelector:
  matchLabels:
    workload: ballast
containers:
- name: ballast
  image: localhost:5001/ballast@sha256:93dba82ad560e7fc4ccb2a33a63d64713b519a7895ba3fd98130ce789eab7fd3
  command:
  - /ballast
  - --mb=50
  wakeupProbe:
    httpGet:
      path: /readyz
      port: 80
resources:
  limits:
    cpuMillicores: 1000
    memoryBytes: 320864256
snapshotConfig:
  preferredFidelity: SNAPSHOT_FIDELITY_MEMORY
The whole file.

EgressPolicy

One policy belongs to one actor. It has metadata and rules[]. Each rule has exactly one of three forms.

Rule formFieldsMeaning
httphostnames, ports, effectsplain HTTP to the named hosts. The port defaults to 80.
httpshostnames, ports, effectsTLS that the gateway intercepts, so it can read and change the request
tlsPassthroughhostnames, portsTLS that the gateway forwards unread. ports is required.

ports is either all or a list in numbers. effects.replaceHeaders[] has header, prefix, and one source: credentialUri for a stored secret, or actorJwt with audiences and expirationSeconds. Section 6.5 shows both sources.

Tag, Atespace, Worker, AccessPolicy

ObjectFieldsMeaning
TagsourceActor, scope, status.snapshota named copy of a snapshot. scope is TAG_SCOPE_ATESPACE or TAG_SCOPE_PUBLISHED.
Atespacemetadata.namea name that groups actors, templates, tags, and one access policy
WorkerworkerNamespace, workerPool, workerPod, workerPodUid, nodeName, labelsone registered worker pod. Its name is opaque, so read the pod from workerPod and workerPodUid. labels is a copy of the metadata.labels of its WorkerPool.
Workerstatus.ipsthe IP addresses of the worker pod, at most one for each IP family
Workerstatus.issuedEpoch, status.registeredEpoch, status.observedEpochthe epoch counters of the worker process. A rise of registeredEpoch means an earlier process exited, and the server then crashes its actors.
Workerstatus.stateWORKER_STATE_ACTIVE, WORKER_STATE_DRAINING, or WORKER_STATE_UNAVAILABLE
Workerstatus.capacity, status.allocatedcpuMillicores, memoryBytes, and actors, as kubectl ate get worker prints them
Workerstatus.sandboxClasses[]the classes and runtime versions that the worker runs and restores
AccessPolicybindings[].role, bindings[].membersgrants of a role to identities, for one atespace or for the whole install

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