From 87a0a0ab0b172faddc39d4ee90120024ff04b9b1 Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Wed, 20 May 2026 14:00:19 -0700 Subject: [PATCH 1/8] Remove merge markers from LICENSE (#14) This is my fault. I hang my head in shame. --- LICENSE | 4 ---- 1 file changed, 4 deletions(-) diff --git a/LICENSE b/LICENSE index 30c3423..d645695 100644 --- a/LICENSE +++ b/LICENSE @@ -1,8 +1,4 @@ -<<<<<<< HEAD -||||||| (empty tree) -======= ->>>>>>> e2a9125 (Initial commit of Agent Substrate) Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ From 18c8639f65b32b53825538bc43b89a689379afb1 Mon Sep 17 00:00:00 2001 From: Maya Wang Date: Wed, 20 May 2026 21:59:26 +0000 Subject: [PATCH 2/8] docs: add Agent Executor to Ecosystem & Examples section (#24) Incorporate Agent Executor as a demonstrative example of a distributed agent runtime and harness built on Agent Substrate. ISSUE=None Fixes # > It's a good idea to open an issue first for discussion. - [ ] Tests pass - [ ] Appropriate changes to documentation are included in the PR Co-authored-by: Maya Wang --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index dd3218c..8ce23e2 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,10 @@ Agent Substrate is designed to be **framework and agent harness agnostic**. Beca * **Claude Code & CodeX:** Support for high-density, stateful coding environments that preserve terminal and filesystem state across sessions. * **Model Context Protocol (MCP):** Deploy secure, sandboxed MCP servers as Substrate Actors to provide durable tools for any LLM. +## Ecosystem & Examples + +* **[Agent Executor](https://github.com/google/ax):** A distributed agent runtime that demonstrates building a secure, hyper-scalable agent harness on Agent Substrate (see the [announcement blog](https://cloud.google.com/blog/products/ai-machine-learning/agent-executor-googles-distributed-agent-runtime) and [integration guide](https://github.com/google/ax/blob/main/manifests/README.md)). + ## Status and compatibility Agent Substrate is currently in VERY early development. It is not ready for From b80031d260959b1fc5c6f61e3099fe2a6d368af1 Mon Sep 17 00:00:00 2001 From: Benjamin Elder Date: Wed, 20 May 2026 15:58:50 -0700 Subject: [PATCH 3/8] declare initial kubernetes version support intent (#25) Discussed this morning with other maintainers. We know we need to test more with 1.36 (see #8), this is just the declaration of intent to start. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8ce23e2..ddec488 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ production use, and the APIs are almost guaranteed to change. We are not making any guarantees about backward compatibility at this stage, and everything in this project may be changed. +### Supported Kubernetes Releases + +Currently we aim to support the [latest stable release](https://kubernetes.io/releases/) of Kubernetes, and the previous minor release. + ## Community For announcements, technical discussions, and community support, please join From d8865a40571a00508daac57dc3044e414468f2b8 Mon Sep 17 00:00:00 2001 From: Brandon Jacobs Date: Thu, 21 May 2026 00:53:17 -0400 Subject: [PATCH 4/8] fix(ategcs): stop calling CreateBucket on every PutObject (#22) ## Summary `s3Client.PutObject` called `CreateBucket` before every upload. Convenient against local dev backends like rustfs/minio where buckets may not pre-exist, but against managed S3-compatible backends the caller typically lacks `s3:CreateBucket`, so each snapshot upload paid for a 403 in added latency and audit-log noise. For local kind dev, add a one-shot Job alongside the rustfs Deployment that creates the `ate-snapshots` bucket once at install time. ## Validation Verified locally with a kind cluster: - Applied namespace + `manifests/ate-install/kind/rustfs.yaml` - `rustfs-bucket-init` Job retried once while rustfs came up, then created `ate-snapshots` - `aws s3api list-buckets` against rustfs returns `ate-snapshots` --------- Co-authored-by: Benjamin Elder --- internal/ategcs/ategcs.go | 5 --- manifests/ate-install/kind/rustfs.yaml | 42 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/internal/ategcs/ategcs.go b/internal/ategcs/ategcs.go index 9290b8d..728e0c4 100644 --- a/internal/ategcs/ategcs.go +++ b/internal/ategcs/ategcs.go @@ -75,11 +75,6 @@ func (s *s3Client) GetObject(ctx context.Context, bucket, object string) (io.Rea } func (s *s3Client) PutObject(ctx context.Context, bucket, object string, reader io.Reader) error { - // Try creating the bucket first (ignore if it already exists) - _, _ = s.client.CreateBucket(ctx, &s3.CreateBucketInput{ - Bucket: aws.String(bucket), - }) - _, err := s.client.PutObject(ctx, &s3.PutObjectInput{ Bucket: aws.String(bucket), Key: aws.String(object), diff --git a/manifests/ate-install/kind/rustfs.yaml b/manifests/ate-install/kind/rustfs.yaml index 3d39498..75952f4 100644 --- a/manifests/ate-install/kind/rustfs.yaml +++ b/manifests/ate-install/kind/rustfs.yaml @@ -89,3 +89,45 @@ spec: - name: data persistentVolumeClaim: claimName: rustfs-data +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: rustfs-bucket-init + namespace: ate-system +spec: + backoffLimit: 10 + template: + spec: + restartPolicy: OnFailure + containers: + - name: create-bucket + image: amazon/aws-cli:2.17.0@sha256:643507c10ada7964ca6157b3d799f030b90577643da9955d319a77399ed80d73 + env: + - name: AWS_ACCESS_KEY_ID + value: rustfsadmin + - name: AWS_SECRET_ACCESS_KEY + value: rustfsadmin + - name: AWS_REGION + value: us-east-1 + - name: AWS_ENDPOINT_URL + value: http://rustfs.ate-system.svc:9000 + command: + - /bin/sh + - -c + - | + set -e + for i in $(seq 1 60); do + if aws s3api head-bucket --bucket ate-snapshots 2>/dev/null; then + echo "bucket ate-snapshots already exists" + exit 0 + fi + if aws s3api create-bucket --bucket ate-snapshots 2>/dev/null; then + echo "bucket ate-snapshots created" + exit 0 + fi + echo "waiting for rustfs to become available... ($i/60)" + sleep 2 + done + echo "timed out waiting for rustfs" + exit 1 From 5f6b6271067c425f639d9bdfb61512c96ed53486 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Thu, 21 May 2026 09:49:49 -0400 Subject: [PATCH 5/8] docs(kubectl-ate): cover kind tracing, get-column semantics, and logs (#37) - Add a "Local (kind)" subsection alongside the existing GKE tracing recipe. - Add a note explaining why `kubectl get actor` and `kubectl get worker` return nothing (they live in valkey, not as CRDs). - Add output-column glossaries for `kubectl ate get actor` and `kubectl ate get worker`. - Add a "Logs" section covering the `kubectl ate logs actors ` form. Fixes # > It's a good idea to open an issue first for discussion. - [ ] Tests pass - [x] Appropriate changes to documentation are included in the PR Signed-off-by: Davanum Srinivas --- cmd/kubectl-ate/README.md | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/cmd/kubectl-ate/README.md b/cmd/kubectl-ate/README.md index 5d54d4b..025e671 100644 --- a/cmd/kubectl-ate/README.md +++ b/cmd/kubectl-ate/README.md @@ -45,6 +45,17 @@ gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION ``` +**Local (kind):** + +The kind overlay installed by `hack/install-ate-kind.sh --deploy-ate-system` already provisions an in-cluster OpenTelemetry Collector and a Jaeger all-in-one in the `otel-system` namespace. No additional setup is required. + +Port-forward the Jaeger UI and invoke any command with `--trace`: +```bash +kubectl port-forward -n otel-system svc/jaeger 16686:16686 & +kubectl ate get actor my-counter-1 --trace +# open http://localhost:16686 and search for the most recent trace +``` + ## Global Flags These flags can be appended to any command: @@ -73,6 +84,30 @@ kubectl ate get actor -o yaml kubectl ate get workers ``` +> **Note:** Actors and workers are not Kubernetes CRDs — they live in the Substrate control plane (valkey/redis), not `etcd`. `kubectl get actor` and `kubectl get worker` will not return anything; only `kubectl ate get …` queries the control plane. `kubectl get actortemplate` and `kubectl get workerpool` *do* work, because those are CRDs. + +#### `kubectl ate get actor` output columns + +| Column | Meaning | +|---|---| +| `NAMESPACE` | The namespace of the `ActorTemplate` the actor was created from. | +| `TEMPLATE` | The `ActorTemplate` name. | +| `ID` | Actor ID. User-provided for application actors; UUID for the golden actor that each template materialises during `ResumeGoldenActor`. | +| `STATUS` | One of `STATUS_RESUMING`, `STATUS_RUNNING`, `STATUS_SUSPENDING`, `STATUS_SUSPENDED`. | +| `ATEOM POD` | The worker pod (namespace/name) currently hosting the actor. Empty while suspended. | +| `ATEOM IP` | The pod IP of that worker. Empty while suspended. | +| `VERSION` | Monotonic integer that increments on every state transition (resume / suspend / checkpoint). Useful for distinguishing snapshots. | + +#### `kubectl ate get worker` output columns + +| Column | Meaning | +|---|---| +| `NAMESPACE` | The `WorkerPool` namespace. | +| `POOL` | The `WorkerPool` name. | +| `POD` | The worker pod name. | +| `STATUS` | `FREE` (idle, ready to receive an actor) or `ASSIGNED` (currently hosting an actor). | +| `ASSIGNED ACTOR` | If `STATUS=ASSIGNED`, the actor reference `/