AX is undergoing a significant redesign, moving away from a single CLI with an embedded Python harness toward a general-purpose orchestration layer for agentic tasks. The repository is reorganized around three binaries: ax-server exposes a gRPC API for submitting Task manifests, ax-controller runs as a horizontally scaled reconciler that consumes work from Redis Streams, and ax-task-runner executes tasks inside sandboxed workers. Task state now lives in Redis rather than Kubernetes CRDs so the system can handle millions of short-lived tasks without straining etcd. The legacy Python harness, ATE client, SQL event log, and skill examples are removed, and new design, concepts, manifest, networking, runner, and sandbox docs plus Kubernetes deploy manifests describe the new architecture.
1.4 KiB
Networking
Tasks do not get a Kubernetes Service or Ingress of their own. Every request to a task goes through Agent Substrate's atenet router, the atenet-router Service in the ate-system namespace. The router reads a single header, ate-target-actor, resolves the actor to the worker it is running on, resumes it first if it was suspended, and proxies the request there. Host and :authority are left alone for your application; the header alone selects the target.
The header value is <atespace>/<task>. The controller always names a task's actor after the task, so default/task123 reaches the task task123 in the default atespace.
From inside the cluster
Use the Service DNS name and add the header. This is exactly how the controller polls a task's readiness.
curl -H "ate-target-actor: default/task123" \
http://atenet-router.ate-system.svc.cluster.local/metadata/v1alpha1/ax/task
From your machine
Port-forward the router, then talk to it the same way.
kubectl -n ate-system port-forward svc/atenet-router 8001:80
curl -H "ate-target-actor: default/task123" http://localhost:8001/readyz
gRPC request routing
Send the header as outgoing metadata under the lowercase key. This is what ax ssh does to reach the guest services.
ctx = metadata.AppendToOutgoingContext(ctx, "ate-target-actor", "default/task123")
resp, err := client.SomeMethod(ctx, req)