Skip to content

Sync main to the upstream release-1.0 cutoff - #107

Closed
EItanya wants to merge 6 commits into
mainfrom
sync/upstream-release-1.0-20261030
Closed

EItanya wants to merge 6 commits into
mainfrom
sync/upstream-release-1.0-20261030

Conversation

@EItanya

@EItanya EItanya commented Oct 30, 2026 •

Copy link
Copy Markdown

Bring fork main up to upstream release-1.0 at 0c662eba7191f5bc4357d5bbd1bde44dd4ec6861, preserving our patches, so we can cut the fork's release branch from main.

Merge the current fork main (a08c5da504f34d631d7cbdfe4860c4f26ee9183e) with the release tip. The release branched from upstream main at 427f2fba76df963d106856e3276ea6aeaa2880e1 and includes the approved ko-retry and image USER/WORKDIR backports. No upstream-main-exclusive commit is reachable from this candidate. Release-only files match upstream release exactly, and all 118 fork-modified paths are retained.

Resolve the removed actor-certificate constructor argument while keeping the fork's workflow deadline. Add CHOWN, FOWNER, and FSETID to Helm's atelet capabilities to support the release's image-ownership backport, with a chart regression test. Other fork patches remain intact, including AgentGateway, Helm configuration, credentials, and runtime test adjustments.

Before upgrading, stop actors on each node and remove its old image cache (default /var/lib/ate/image-cache). This release requires layout v3 and refuses v2. There are no database migrations or CRD changes in this merge relative to the fork's current main.

Validated 7237ac3f0305ad908c7e2d0de1bd8ee2c9e779e1: the cutoff audit, fresh agent review, Helm lint, 41 chart tests, manifest and CRD parity, migration immutability, and all repository verifiers passed. Verifiers ran across separate attempts after temporary storage filled. All 260 Go packages returned results under the race detector: 198 passed, 61 had no tests, and imagecache had one unprivileged-group assertion failure reproduced three times on unmodified upstream release. Privileged imagecache, tar, and OCI tests passed three shuffled race runs. Runtime E2E and remote CI remain pending.

Merge with a merge commit to preserve both histories, then cut release-1.0 from the resulting main commit. The newer upstream-main sync waits until after that release cut.

AI use: Codex prepared and audited the merge, resolved integration changes, ran validation, and reviewed the candidate.

  • Tests pass (one local assertion failure also reproduces on upstream release)
  • Docs updated

EItanya and others added 6 commits October 29, 2026 13:40
`Control.MintActorCertificate` has no consumers: the feature that needed
it was scoped out of GA. This removes the public RPC, its
request/response types, signing code, validation, authorization rule,
and docs, so a future consumer can define the API it needs.

Actor JWT minting and the worker certificates used by atunnel remain in
place. The internal `atelet.WorkerSupport.MintActorCertificate` is still
used and forwards to `WorkerService.MintWorkerActorCertificate`.

Fixes agent-substrate#3425

Breaking change: calls to the removed public RPC return `UNIMPLEMENTED`.
Code referencing its generated client method or message types must
remove those references before upgrading.

<details>
<summary>Certificate path retained for atunnel</summary>

```mermaid
flowchart LR
    atunnel["atunnel"] -->|MintActorCertificate| atelet["atelet.WorkerSupport"]
    atelet -->|MintWorkerActorCertificate| worker["ateapi.WorkerService"]
    worker -->|Sign worker-for-actor certificate| ca["Actor identity CA pool"]
```

</details>

AI use: Prepared with Codex.

- [x] Focused tests pass (see validation above)
- [x] Docs updated

---------

Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Why is this needed? (Or link the issue. Open one first for features,
API, install or CI changes.)

Fixes agent-substrate#3272

Since 1.37, kubelet wedges a device plugin resource if a second Register
for the same socket arrives while it is still closing the first stream.
The failed connect deregisters both clients by socket path:

https://github.com/kubernetes/kubernetes/blob/v1.37.0/pkg/kubelet/cm/devicemanager/plugin/v1beta1/handler.go#L82-L86


So when the first stream ends, kubelet never calls PluginDisconnected,
and every later Register fails with "device plugin already connected"
until kubelet restarts:

https://github.com/kubernetes/kubernetes/blob/v1.37.0/pkg/kubelet/cm/devicemanager/plugin/v1beta1/handler.go#L137-L140

atelet keeps one fsnotify watcher across registration retries, so a
kubelet.sock Create that was queued while it retried made it stop and
re-register right after registering. It now ignores the Create if
kubelet.sock is still the socket it registered with.

A node that is already wedged still needs a kubelet restart.

<!-- e.g. "AI-assisted, I reviewed and tested it." No AI co-author
trailers. -->
AI use: I used Claude to trace this through the kubelet source and draft
the fix, and reviewed it.

<!-- Breaking change? Describe what users must do on upgrade and ask for
the `breaking-change` label. -->

- [x] Tests pass
- [x] Docs updated

---------

Signed-off-by: Benjamin Elder <bentheelder@google.com>
…ecurity overview (agent-substrate#3440)

The zero-trust tagline said "no unauthorized way out of the sandbox" on
the home page and "no way out of the sandbox" in the security overview,
and the home page's sandboxing card was labelled "No way out". This
changes all three to "no escape", which is a shorter and catchier way to
say "no unauthorized" and makes the home page and security overview
match.

AI use: AI-assisted, I reviewed and tested it.

- [x] Tests pass
- [x] Docs updated

Signed-off-by: Greg Castle <gcastle@google.com>
… ko release image with backoff (agent-substrate#3459)

Cherry-pick of agent-substrate#3446 onto `release-1.0`, with no changes (`git
cherry-pick -x` of both commits).

Needed for the 1.0 release: the v1.0.0-rc.1 release run
(https://github.com/agent-substrate/substrate/actions/runs/40925903340)
failed in **Publish images** with `DENIED: permission_denied`. ghcr.io
can briefly deny pushes to a package it has just created, and this is
the first release that creates them.

`ate-setup publish release-images` now builds each ko image in its own
`ko build`. If an image fails, it logs the error and retries that image,
for up to 3 attempts, waiting 10s then 20s (`retry.OnError` with a
`wait.Backoff`).

AI use: AI-assisted.

- [x] Tests pass

---------

Signed-off-by: Anna Pendleton <13793293+annapendleton@users.noreply.github.com>
Co-authored-by: Anna Pendleton <13793293+annapendleton@users.noreply.github.com>
… image's USER and WORKDIR, with layer file owners kept (agent-substrate#3473)

Cherry-pick of agent-substrate#2392 onto `release-1.0` (`git cherry-pick -x` of the
squash commit), it applied cleanly with no changes.

Containers run as the image's `USER` and start in its `WORKDIR`, and
atelet keeps the file owners recorded in image layers. Fixes agent-substrate#2036 for
1.0.

AI use: AI-assisted. Clean pick.

This carries the same breaking changes as agent-substrate#2392:

- After an upgrade or rollback, atelet refuses the existing image cache.
Delete `/var/lib/ate/image-cache` on each node once no actor runs on it,
as atelet's error says. After an upgrade, a node reboot also works.
- A custom atelet securityContext needs `CHOWN`, `DAC_OVERRIDE`,
`FOWNER` and `FSETID`.
- Images with a `USER` stop running as root, and images with a `WORKDIR`
stop starting in `/`. A non-root `USER` has no effective capabilities,
so `securityContext.capabilities.add` no longer helps it.
- gVisor snapshots of such images don't restore, because `runsc restore`
checks each container's user and working directory. Recreate those
templates. MicroVM snapshots resume as they were.
- Files an earlier run wrote as root into a durable dir stay root-owned.

- [x] Tests pass
- [x] Docs updated

Signed-off-by: Anish Ramasekar <anish.ramasekar@gmail.com>
Signed-off-by: Davanum Srinivas <davanum@gmail.com>
Signed-off-by: Benjamin Elder <bentheelder@google.com>
Co-authored-by: Anish Ramasekar <anish.ramasekar@gmail.com>
Co-authored-by: Davanum Srinivas <davanum@gmail.com>
Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
@EItanya EItanya changed the title Sync fork patches onto upstream release-1.0 Sync main to the upstream release-1.0 cutoff Oct 30, 2026
@EItanya
EItanya changed the base branch from release-1.0 to main October 30, 2026 13:36
@EItanya EItanya closed this Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants