Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
b7ba6f6
ateapi: record one scheduler assignment for each resume (#2244)
JeffLuoo Oct 8, 2026
2f9b30d
Components honor OTEL_TRACES_EXPORTER=none and treat OTEL_METRICS_EXP…
QuentinBisson Oct 8, 2026
7de3609
fake-dataplane: let the fake data plane host actors (#2300)
haiyanmeng Oct 8, 2026
760e577
ateom-gvisor: emit actor usage records (#2194)
baizhenyu Oct 8, 2026
09af6d2
ateom-microvm: emit actor usage records (#2195)
baizhenyu Oct 8, 2026
25a0b88
Delete unused `actor_template_ref` from `ActorAssigment` sub-resource…
juli4n Oct 8, 2026
890234f
Return the caller's context error when an atelet call fails (#2236)
eren23 Oct 8, 2026
130d746
benchmark(ateom-gvisor): log per-actor checkpoint and restore phase b…
Oneimu Oct 8, 2026
e4f6cca
Don't default name in store layer. (#2359)
juli4n Oct 8, 2026
6299696
kubectl ate admin can rotate the actor JWT signing key (#2140)
thompsonmax Oct 8, 2026
38a3d45
cdiinject: confine device paths and host mounts to allowed roots (#2315)
BenTheElder Oct 8, 2026
769fd32
Add sections about sub-resources and singletons to the API style guid…
juli4n Oct 8, 2026
1033909
ate-setup: choose the StorageClass of the bundled PostgreSQL (#2314)
ericcurtin Oct 8, 2026
fa9875f
Move snapshot transfers behind the object-store snapshot plugin (#2224)
ILLUM1N0X Oct 8, 2026
8ccefc0
atespace isolation tests (#1966)
siyanshen Oct 8, 2026
9b76a69
SandboxConfig now holds multiple named versions with a default (#2333)
zoez7 Oct 8, 2026
66f8a88
Egress gateway can mint and cache actor JWTs (#2135)
thompsonmax Oct 8, 2026
b2f6cb8
Build the OCI spec in ateom instead of atelet (#2293)
HavenXia Oct 8, 2026
d91379a
security: prevent path traversal in snapshot storage locations (#2372)
BenTheElder Oct 8, 2026
eeec4ee
Replace SnapshotContentScope with the SnapshotFidelity ladder and pre…
dberkov Oct 9, 2026
4baf18f
Add sandboxClasses with an optional SandboxConfig ref to WorkerPool (…
zoez7 Oct 9, 2026
288694e
Fail snapshot plugin calls with Unavailable after 30s when the plugin…
aramase Oct 9, 2026
59c5b2a
docs(api): fix systeminfo volume examples (#2346)
ktsoator Oct 9, 2026
632e662
atelet: drop its actor usage records and count each activation's CPU …
baizhenyu Oct 9, 2026
f6a1dc7
ateom-gvisor logs a warning when a running actor's sandbox dies (#2258)
git286 Oct 9, 2026
fa3fc5b
Update Snapshots API to support Actor Lifecycle v2 (#2289)
msau42 Oct 9, 2026
0519dec
benchmarking/analysis: aggregate suspend/resume phase breakdown log r…
Oneimu Oct 9, 2026
4621338
Reject requests with duplicate ate-target-actor headers across HTTP a…
destijl Oct 9, 2026
5d0b419
docs: add substrate security guide and principles (#2326)
destijl Oct 9, 2026
75e7f8b
Rename some `ExternalVolume` fields (#2404)
juli4n Oct 9, 2026
fd00c6c
kubectl-ate: add --source to select container or lifecycle log lines …
erain Oct 9, 2026
d966c8e
Egress policies can inject actor JWTs (#2141)
thompsonmax Oct 9, 2026
bfdc7a8
More robust Actor DNS Relay (#2370)
bowei Oct 9, 2026
190b956
ate-setup sets the actor JWT issuer (ACTOR_JWT_ISSUER), and ate-api-s…
thompsonmax Oct 9, 2026
9b2ecb9
Rename target_ateom_uid to worker_pod_uid (#2423)
laoj2 Oct 9, 2026
55b6e00
Rename `MintActorJWTRequest.audience` to `audiences`. (#2421)
juli4n Oct 9, 2026
ea273bd
Remove makefile (#2374)
ahmedtd Oct 9, 2026
85b128a
Rename the object-store plugin proto package to objectstore.v1 (#2432)
aramase Oct 9, 2026
1539834
podcertcontroller: do not rate-limit PCRs assigned to other replicas …
chw120 Oct 9, 2026
24248ce
Add an eviction section to the API guide (#2417)
HavenXia Oct 9, 2026
2eda16a
Worker Self-Reported Sandbox & Hardware Compatibility (#2381)
shrutiyam-glitch Oct 9, 2026
59072f7
Update COLLABORATING.md to reflect our stronger processes (#2437)
ahmedtd Oct 9, 2026
fd7a9cd
atenet-router no longer exposes its plaintext xDS server on the pod I…
destijl Oct 10, 2026
f200630
Add E2E HTTPS egress tests and reject WebSocket upgrades (#1634)
swiftdiaries Oct 10, 2026
5cf1c24
Merge upstream sandbox, snapshot, and HTTPS egress updates
EItanya Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .agents/skills/sync-upstream-main/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ does not authorize merging it.

## Validate and investigate failures

Run `make verify` (which includes the race-enabled unit tests),
`make verify-helm-template`, and `make verify-crd-chart`. Use Go's default cache.
Run `go test -race ./...`, `hack/verify-all.sh`,
`hack/render-manifests.sh --check`, and `hack/verify/crd-chart.sh`. Use Go's default cache.
Record failures and distinguish regressions from missing prerequisites and
existing failures using evidence from the base revision when needed.

Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/helm-e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ jobs:
# the chart composes {registry}/{repository}/{component}, so the local
# registry serves each image where the default repository expects it --
# the same path-preserving rule a production mirror follows.
for component in ateapi atecontroller atelet podcertcontroller atenet credential-provider/kubernetes-secrets; do
for component in ateapi atecontroller atelet podcertcontroller atenet snapshot-plugin credential-provider/kubernetes-secrets; do
KO_DOCKER_REPO="localhost:5001/kagent-dev/substrate/${component##*/}" \
./hack/run-tool.sh ko build --bare --tags helm-e2e \
--platform linux/amd64 "./cmd/${component}"
Expand Down Expand Up @@ -115,6 +115,8 @@ jobs:
run: hack/install-ate-kind.sh --deploy-demo-counter
- name: Deploy egress demo
run: hack/install-ate-kind.sh --deploy-demo-egress
- name: Trust local E2E TLS origins
run: hack/setup-e2e-egress-tls-kind.sh
- name: Run E2E tests (gVisor)
# The egress credential suite replaces the shared provider policy.
# Run it separately after the Helm suite has checked the chart's grants.
Expand All @@ -139,8 +141,7 @@ jobs:
- name: Require every lane to have run tests
if: always()
run: |
make build-junittool
bin/junittool verify -manifest "${ARTIFACTS}/expected-junit.txt"
go -C tools/junittool run . verify -manifest "${ARTIFACTS}/expected-junit.txt"
- name: Upload test results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/helm-verify.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ jobs:
- name: Lint the chart
run: helm lint charts/substrate charts/substrate-crds charts/substrate-podcert
- name: Verify committed manifests match the chart output
run: make verify-helm-template
run: hack/render-manifests.sh --check
12 changes: 5 additions & 7 deletions .github/workflows/pr-workflow.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ jobs:
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq --no-install-recommends clang libclang-dev
make test-dynamic-modules
hack/test-dynamic-modules.sh
# Root-gated tests (overlay mounts, whiteout mknod, trusted.* xattrs, ...)
# skip for the unprivileged runner user above; rerun the packages that
# contain them (any test importing internal/roottest) under sudo.
Expand All @@ -109,9 +109,7 @@ jobs:
# file that was never written fails too.
- name: Require tests to have run
if: always()
run: |
make build-junittool
bin/junittool verify -manifest "${ARTIFACTS}/expected-junit.txt"
run: go -C tools/junittool run . verify -manifest "${ARTIFACTS}/expected-junit.txt"
- name: Upload test results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
Expand Down Expand Up @@ -234,6 +232,8 @@ jobs:
run: |
hack/install-ate-kind.sh --deploy-demo-egress
hack/install-ate-kind.sh --deploy-demo-egress-microvm
- name: Trust local TLS origins in egress gateway
run: hack/setup-e2e-egress-tls-kind.sh
# scale the idle sandbox class's demo pools to zero so each lane has the node
- name: Focus the node on gVisor
run: hack/e2e-focus-sandbox-class.sh gvisor
Expand All @@ -258,9 +258,7 @@ jobs:
# run-e2e.sh refuses to run in CI without E2E_JUNIT_FILE.
- name: Require every lane to have run tests
if: always()
run: |
make build-junittool
bin/junittool verify -manifest "${ARTIFACTS}/expected-junit.txt"
run: go -C tools/junittool run . verify -manifest "${ARTIFACTS}/expected-junit.txt"
- name: Save Go build cache
# Main only, so PRs restore the latest main build rather than each
# storing its own copy.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ jobs:
run: |
set -o errexit -o nounset -o pipefail

for component in ateapi atecontroller atelet ateom-gvisor ateom-microvm podcertcontroller atenet credential-provider/kubernetes-secrets; do
for component in ateapi atecontroller atelet ateom-gvisor ateom-microvm podcertcontroller atenet snapshot-plugin credential-provider/kubernetes-secrets; do
KO_DOCKER_REPO="${IMAGE_REPOSITORY}/${component##*/}" \
./hack/run-tool.sh ko build \
--tags "${IMAGE_TAGS}" \
Expand Down
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ Thumbs.db
/.worktrees/

# Stray outputs from `go build` without -o. Root-module tools land at the repo
# root; tools with their own go.mod land beside their source. Use
# `make build-<tool>`, which writes to /bin/ above.
# root; tools with their own go.mod land beside their source. Build with
# `-o bin/<tool>`, which is ignored above.
/validate-image-cache
/setup-gcp
/tools/apitool/apitool
Expand Down
6 changes: 4 additions & 2 deletions .golangci-kal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ linters:
- path: 'pkg/api/v1alpha1/sandboxconfig_types\.go'
text: '^requiredfields: .*\bAssetFile\.(SHA256|URL)\b'
- path: 'pkg/api/v1alpha1/sandboxconfig_types\.go'
text: '^(nomaps|optionalfields|requiredfields): .*\bSandboxConfigSpec\.(Assets|PauseImage|SandboxClass)\b'
text: '^(optionalfields|requiredfields): .*\bSandboxConfigSpec\.SandboxClass\b'
- path: 'pkg/api/v1alpha1/sandboxconfig_types\.go'
text: '^(nomaps|optionalfields): .*\bSandboxVersionConfig\.(Assets|PauseImage)\b'
- path: 'pkg/api/v1alpha1/sandboxconfig_types\.go'
text: '^(nonpointerstructs|requiredfields): .*\bSandboxConfig\.Spec\b'
- path: 'pkg/api/v1alpha1/csidriverconfig_types\.go'
Expand All @@ -112,7 +114,7 @@ linters:
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
text: '^optionalfields: .*\bWorkerPoolPodTemplate\.PriorityClassName\b'
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
text: '^(optionalfields|requiredfields): .*\bWorkerPoolSpec\.(Replicas|SandboxClass|WorkerImage)\b'
text: '^(optionalfields|requiredfields): .*\bWorkerPoolSpec\.(Replicas|WorkerImage)\b'
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
text: '^optionalfields: .*\bWorkerPoolStatus\.(ReadyReplicas|Replicas|Selector)\b'
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
Expand Down
23 changes: 11 additions & 12 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,22 +40,21 @@ See `docs/dev/code-layout.md` for the full rationale and per-directory details.

## Build and Test Commands

Agent Substrate uses a `Makefile` for its build and test tasks.
The dev entry points are the scripts under `hack/` and the `cmd/ate-setup` installer.

### Building
- **Binaries**: `make build` (builds images and `kubectl-ate`) or `make build-atectl`
- **Images**: `make build-images` (uses ko to build container images)
- **Demos**: `make build-demos`
- **Release images**: `make build-release-images KO_DOCKER_REPO=REPO VERSION=TAG` (every image a pre-built install needs, all tagged `TAG`, including the docker-built `envoy-dataplane`; `make build-envoy-dataplane` builds only that one)
### Building and Installing
- **Install from source**: `go run ./cmd/ate-setup deploy ate-system` (or the `hack/install-ate.sh` shim) builds every image with ko as part of the install; see `cmd/ate-setup/README.md`
- **Binaries**: `go build -o bin/kubectl-ate ./cmd/kubectl-ate`, `go build -o bin/ate-setup ./cmd/ate-setup`
- **Release images**: `VERSION=TAG go run ./cmd/ate-setup publish release-images --ko-docker-repo REPO` (every image a pre-built install needs, all tagged `TAG`, including the docker-built `envoy-dataplane`)

### Testing and Verification
- **Run Unit Tests**: `make test`
- **Run E2E Tests**: `make e2e` (Requires GCP cluster setup and built images)
- **Run Linters and Verifiers**: `make verify` (Includes `go vet` and checks for formatting, boilerplate headers, licenses, and go modules)
- **Run Unit Tests**: `go test -race ./...`
- **Run E2E Tests**: `hack/run-e2e.sh` (Requires a cluster with Agent Substrate installed; `hack/run-e2e-kind.sh` for kind)
- **Run Linters and Verifiers**: `hack/verify-all.sh` (formatting, golangci-lint, boilerplate headers, licenses, go modules, generated code, and the metrics registry)

## Code Style Guidelines

- **Go Formatting**: Code must be formatted with `gofmt`. Run `make fmt` to automatically format all files before submitting changes.
- **Go Formatting**: Code must be formatted with `gofmt`. Run `hack/update/gofmt.sh` to automatically format all files before submitting changes.
- **Copyright Headers**: All files must contain appropriate copyright and license headers. See templates in `hack/boilerplate/`.
- **Modularity**: Submit small, focused Pull Requests that touch a limited part of the codebase for easier reviews and rebasing.
- **Go Modules**: Ensure `go.mod` is clean. Run `go mod tidy` if adding or removing dependencies.
Expand All @@ -79,7 +78,7 @@ Do not add `reserved` statements to protos, deprecated aliases, fallbacks for ol

`docs/metrics/registry/` is an [OpenTelemetry Weaver](https://github.com/open-telemetry/weaver) registry. `metrics.yaml` defines every metric instrument the ate system components emit, plus every attribute any signal uses and the permitted values of each. `events.yaml` defines the log events emitted over OTLP. Read them to find an instrument, an event, or their attributes.

If you add or rename an instrument or an event, or add an attribute, follow `docs/dev/best-practices/metrics.md`, update the registry, and run `hack/verify/metrics.sh`. `make verify` runs the same check. Weaver reads the whole directory, so a new file in it is checked straight away.
If you add or rename an instrument or an event, or add an attribute, follow `docs/dev/best-practices/metrics.md`, update the registry, and run `hack/verify/metrics.sh`. `hack/verify-all.sh` runs the same check. Weaver reads the whole directory, so a new file in it is checked straight away.

Some attributes are defined in the registry but barred from metric labels: actor identity is the main one. The `note` on each says so, and `cardinality_rules` in `docs/metrics/substrate.yaml` is where the bar lives.

Expand All @@ -91,7 +90,7 @@ See the [metric registry](docs/observability.md#the-metric-registry) section of

1. Write tests for all new code. We will not merge code that lacks tests.
2. Ensure changes do not break existing tests.
3. Run `make verify` locally before requesting a code review to catch common issues like missed copyright headers or formatting drift.
3. Run `go test -race ./...` and `hack/verify-all.sh` locally before requesting a code review to catch common issues like missed copyright headers or formatting drift.
4. For end-to-end tests involving the actual infrastructure, ensure you have a running cluster (setup via `hack/ate-dev-env.sh.example` and `go run ./tools/setup-gcp bootstrap`).
5. A test that skips when a precondition is missing — Docker, a cluster, an artifact directory — must **fail** on it in CI, because a skip and a pass are the same exit code. Resolve strictness through a named predicate rather than an inline `os.Getenv("CI")`; `cmd/ateapi/internal/store/dockerenv.Required()` is the reference implementation. Prove the strict branch red before merging: a guard only ever observed passing is not known to guard anything. See `docs/dev/best-practices/ci-fail-closed.md`.

Expand Down
23 changes: 10 additions & 13 deletions COLLABORATING.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,6 @@ When writing, please strive for clarity and conciseness. Not everyone in the
community will have the same proficiency in English, so please be mindful of
that when writing.

## Always use Pull Requests

Do not push directly to the main branch. Always use pull requests to propose
changes to the codebase. This allows for code review and discussion before
changes are merged, which helps maintain the quality of the codebase and
fosters collaboration.

### Merging PRs

PRs should be merged by the reviewer of a PR, not the author.

### Using AI

For the time being, the Substrate project uses the same AI contribution policy
Expand Down Expand Up @@ -76,8 +65,16 @@ project](https://www.kubernetes.dev/docs/guide/pull-requests/#ai-guidance):
## Code reviews

We want to move quickly, but we need to balance that with quality and
maintainability. Code reviews are an important part of that process. All PRs
should be reviewed BEFORE they are merged.
maintainability. Code reviews are an important part of that process.

Agent Substrate requires at least one approving GitHub review from a maintainer
in order for the PR to be eligible for the merge queue. It is allowable to use
the "merge when ready" functionality to mark the PR as eligible for the merge
queue as soon as all preconditions are met.

Note that most changes to a PR will require a new approving review. Use the
"re-request review" button to automatically place the PR back into your
reviewer's GitHub inbox.

### Code reviews across companies

Expand Down
4 changes: 3 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ The [Quickstart (Development)](README.md#quickstart-development) in the README
covers bringing up a local cluster with the default (gVisor) runtime. To run
the microVM runtime locally — which needs `/dev/kvm`, or Lima nested
virtualization on Apple Silicon — see
[docs/dev/microvm-local.md](docs/dev/microvm-local.md).
[docs/dev/microvm-local.md](docs/dev/microvm-local.md). To measure where a
suspend or resume spends its time on such a cluster, follow
[docs/dev/suspend-resume-phase-breakdown.md](docs/dev/suspend-resume-phase-breakdown.md).

## Contribution process

Expand Down
Loading
Loading