Transition the AX architecture from asynchronous event queues (Redis Streams
and the `ax-controller` worker pool) to direct, synchronous reconciliation in
`ax-server` guarded by fine-grained distributed locks.
Key changes:
- Implement per-resource locking (`lock:task`, `lock:workspace`, `lock:model`)
using Redis distributed locks (`SET NX PX` with token validation) and an
in-memory locker for testing.
- Move Substrate reconciliation directly into `ax-server` for Task, Workspace,
and Model lifecycle methods (`Create`, `Resume`, `Suspend`, `Delete`).
- Decommission `ax-controller`, `deploy/ax-controller.yaml`, and Redis Stream
event publishing/consuming interfaces.
- Simplify `ax delete` and `ax watch` in the CLI to eliminate two-phase
polling loops now that operations complete synchronously.
- Update `demo.sh`, build configurations (`Makefile`, `.ko.yaml`), and
documentation to reflect the single-binary control plane architecture.
Refine the Model section in docs/concepts.md to directly describe it as a
declarative configuration resource for model providers, parameters, and
credentials rather than using colloquial phrasing.
Fixes#356
* Replace UpdateTask with CreateTask and enforce immutability
Replaced UpdateTask RPC with CreateTask. Tasks are now
immutable once created; modifying an existing task returns a
FailedPrecondition error.
- Renamed UpdateTask/UpdateTaskRequest to CreateTask/CreateTaskRequest.
- Checked existence in Server.CreateTask to prevent mutation.
- Updated CLI apply logic, tests, and documentation.
* refactor: remove TaskSpec.Suspend and default new tasks to suspended state
* chore: update default snapshots bucket to snapshot-substrate-test-ax-substrate
ax apply accepted any metadata.name, but Substrate requires actor,
ActorTemplate and atespace names to be lowercase RFC 1123 labels. A name
such as Task-With-Caps was therefore stored, and only failed seconds
later with an asynchronous ActorCreationFailed condition that the user
had to dig out of ax describe or the controller logs.
Validate metadata.name (and metadata.atespace when set) against
[a-z0-9]([-a-z0-9]*[a-z0-9])? with a 63 character limit for Task,
Workspace and Model alike, and return InvalidArgument at apply time.
Fixes#370
* docs: add Substrate prerequisites; demo: fail early if Substrate missing
AX depends on a running Agent Substrate installation, but the README only
mentioned that the Control API must be 'reachable' without saying how to
install Substrate, and demo.sh only surfaced a missing Substrate as a late
ActorCreationFailed task condition (or a 180s timeout).
- README: add a Prerequisites section under Quick start with Substrate
install commands (existing cluster and kind), the expected ate-system
namespace/Control API address, and verification steps.
- demo.sh: add a preflight step that checks the ax CLI exists, kubectl is
available, and the Substrate Control API Service is present (namespace
configurable via SUBSTRATE_NAMESPACE) before mutating any state.
* docs: link to Substrate install instructions instead of duplicating them
Per review feedback, the copied install commands would drift from the
Substrate repo; keep only the link, the expected namespace/Control API
address, and a single verification command.
---------
Co-authored-by: Aditya Shantanu <aditya-shantanu@users.noreply.github.com>
Reduce the sleep interval in the wait_for polling loop from 2s to
0.2s. This allows the demo script to detect task phase and condition
transitions (readiness, suspension) much faster without waiting out
unnecessary 2-second sleep delays.
Remove the Gateway resource across the API, controller, server, CLI,
store, and documentation.
Gateway introduced an unnecessary layer and architectural bifurcation
between Agent Substrate and AX. By removing it, AX aligns directly with
Substrate's native primitives and networking rather than maintaining an
overlapping ingress/routing abstraction.
- Reserved protobuf field 8 and removed Gateway RPCs and messages.
- Cleaned up controller reconciler, server endpoints, and store models.
- Updated CLI, documentation, and example manifests.
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.
We want AX to be compatible with the Interactions API protocol as much as possible. This PR aligns the proto with Steps and with the Interactions semantics. We will follow up with more changes to make it more compatible with Interactions while preserving a `conversation_id` based history model.
`ConversationService` is removed for now until we know what kind of data operations we want to provide for event log management.
Introduce a local skills source parallel to the Gemini Enterprise Skill
Registry integration. A local source points at a directory already on disk
(a parent dir holding <skill-id>/SKILL.md subfolders, the same layout as
examples/skills and a registry's target_dir); nothing is fetched and the
directory is used as-is.
- New mode-agnostic result shape (internal/skills: Available/Group/Skill) so
both sources feed the same consumers without either depending on the other.
- internal/skills/local.Discover enumerates enabled local paths, treating
immediate subfolders with a SKILL.md as skills (subfolder name = id). It is
fail-safe like registry materialization: a missing/unreadable/empty path is
logged and skipped, never blocking harness creation.
- config.SkillsConfig gains Local []LocalSkillsConfig (enabled + path) with
validation; geminienterprise.Materialize now returns skills.Available.
- cliutil combines registry and local groups into one system-instruction
pointer for the Antigravity Interactions harness. The Antigravity SDK
harness (SKILLS_DIR-based) is left as a TODO.
Only the interactions harness is wired; tests cover discovery, fail-safe
degradation, config validation, and the examples/skills fixture.