From 91912429f84023df55e0167e71e10e57f3e5a094 Mon Sep 17 00:00:00 2001 From: Kishore Kumar Date: Fri, 31 Jul 2026 02:25:05 +0530 Subject: [PATCH 1/2] =?UTF-8?q?docs(changelog):=20M148=20=E2=80=94=20the?= =?UTF-8?q?=20assigned=20isolation=20is=20the=20applied=20isolation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- changelog.mdx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/changelog.mdx b/changelog.mdx index bcb934e..6a74d44 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -7,6 +7,27 @@ description: "Stay up to date with the latest agentsfleet product updates, new f agentsfleet is in **stealth-mode testing** and pre-production. APIs and agent behavior may change between releases without long deprecation windows. Email [agentsfleet@agentmail.to](mailto:agentsfleet@agentmail.to) if you want a hand calibrating an agent or to join as a design partner. + + ## The isolation you assign is the isolation the runner applies + + The sandbox tier picked in **Add Runner** used to be a label: the host read a different value from its own environment file, neither side compared the two, and a host that could not deliver its claimed isolation kept accepting work. Policy now flows one way — the dashboard assigns it, the runner row stores it, and every heartbeat delivers it to the host — while the host probes what its kernel can actually enforce and reports that back. A runner whose assignment exceeds its capability is marked **degraded**, receives no work on either side, and its row names the exact missing mechanism (for example `cgroup controllers not delegated`) instead of showing a green badge over a host that refuses every job. + + ## Upgrading + + - **`POST /v1/runners` takes the assignment envelope** — the body is `{host_id, assigned_policy: {sandbox_tier, network_policy, registry_allowlist[], worker_count}, labels[]}`; the old top-level `sandbox_tier` answers `400` `UZ-REQ-001`. The response echoes the assignment as stored (`worker_count` clamped into `[1, 64]`). + - **The runner environment collapses to the bootstrap pair** — `AGENTSFLEET_API_URL` and `AGENTSFLEET_RUNNER_TOKEN`, plus the optional host-local `RUNNER_STORAGE_HOME` (renamed from `RUNNER_WORKSPACE_BASE`). `RUNNER_HOST_ID`, `RUNNER_SANDBOX_TIER`, `RUNNER_NETWORK_POLICY`, `RUNNER_REGISTRY_ALLOWLIST`, `RUNNER_WORKER_COUNT`, and the `RUNNER_CP_*_MS` deadlines are removed, not deprecated — the daemon no longer reads them, so a stale env file cannot fork the truth again. + - **`macos_seatbelt` leaves the tier vocabulary** — it never had enforcement code, and a tier that cannot be applied must not be assignable. A stray stored value parses fail-closed and the runner refuses to lease. The assignable tiers are `landlock_full`, `container_nested`, and `dev_none` (dev builds only). + - **Existing runners read degraded until you assign them a policy** — pre-upgrade rows carry no assignment, so they show `degraded — no assigned policy` and receive no work. Open the runner and use **Edit policy**; the host applies it on its next heartbeat, no visit needed. + - **One migration applies on startup** — it adds the policy, capability, and verdict columns to `fleet.runners` and backfills the pre-upgrade rows as degraded. No manual step. + + ## What's new + + - **Add Runner assigns all four policy fields** — isolation, network policy (defaults `allow_all` until allowlist enforcement ships), registry allowlist, and worker count — with copy that says the host must satisfy the selection. + - **Edit policy on the runner page** — `PATCH /v1/fleets/runners/{id}` with `{assigned_policy: {…}}` re-assigns a live runner; the change reaches the host within one heartbeat, and the verdict is re-checked in the same request. Growing the worker count past what the daemon started with takes effect after a runner restart. + - **The runner row shows assigned against achievable** — the fleet list and detail reads carry `assigned_policy`, the host's reported `achievable` mechanisms, and `degraded` with its reason; a degraded row wears a badge and states what is missing. + - **A runner that recovers, recovers by itself** — a later heartbeat whose report satisfies the assignment clears the verdict and leasing resumes; `UZ-EXEC-017` names the refusal while it stands. + + ## Follow-up — chat replies start streaming immediately From 63e79b8167f61222fe75a022b762378c0543a98a Mon Sep 17 00:00:00 2001 From: Kishore Kumar Date: Fri, 31 Jul 2026 11:55:18 +0530 Subject: [PATCH 2/2] =?UTF-8?q?docs(changelog):=20the=20migration=20adds?= =?UTF-8?q?=20columns=20only=20=E2=80=94=20the=20degraded=20patch=20runs?= =?UTF-8?q?=20by=20hand?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The M148 entry claimed "backfills the pre-upgrade rows as degraded. No manual step." Migration 042 no longer rewrites rows (Indy: "yes done by hand"), so the Upgrading section now carries the operator statement verbatim and says which rows need it: a live upgraded host converges on its first heartbeat; dormant hosts and pre-upgrade daemons wait for the statement. Co-Authored-By: Claude Fable 5 --- changelog.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/changelog.mdx b/changelog.mdx index 54db374..455a8ac 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -17,8 +17,8 @@ description: "Stay up to date with the latest agentsfleet product updates, new f - **`POST /v1/runners` takes the assignment envelope** — the body is `{host_id, assigned_policy: {sandbox_tier, network_policy, registry_allowlist[], worker_count}, labels[]}`; the old top-level `sandbox_tier` answers `400` `UZ-REQ-001`. The response echoes the assignment as stored (`worker_count` clamped into `[1, 64]`). - **The runner environment collapses to the bootstrap pair** — `AGENTSFLEET_API_URL` and `AGENTSFLEET_RUNNER_TOKEN`, plus the optional host-local `RUNNER_STORAGE_HOME` (renamed from `RUNNER_WORKSPACE_BASE`). `RUNNER_HOST_ID`, `RUNNER_SANDBOX_TIER`, `RUNNER_NETWORK_POLICY`, `RUNNER_REGISTRY_ALLOWLIST`, `RUNNER_WORKER_COUNT`, and the `RUNNER_CP_*_MS` deadlines are removed, not deprecated — the daemon no longer reads them, so a stale env file cannot fork the truth again. - **`macos_seatbelt` leaves the tier vocabulary** — it never had enforcement code, and a tier that cannot be applied must not be assignable. A stray stored value parses fail-closed and the runner refuses to lease. The assignable tiers are `landlock_full`, `container_nested`, and `dev_none` (dev builds only). - - **Existing runners read degraded until you assign them a policy** — pre-upgrade rows carry no assignment, so they show `degraded — no assigned policy` and receive no work. Open the runner and use **Edit policy**; the host applies it on its next heartbeat, no visit needed. - - **One migration applies on startup** — it adds the policy, capability, and verdict columns to `fleet.runners` and backfills the pre-upgrade rows as degraded. No manual step. + - **Existing runners read degraded once repaired** — pre-upgrade rows carry no assignment. A live, upgraded host marks its own row `degraded — no assigned policy` on its first heartbeat; a host that is down, or still running the pre-upgrade daemon, keeps a healthy-looking row until the manual statement below runs. Either way the fix is the same: open the runner and use **Edit policy**; the host applies it on its next heartbeat, no visit needed. + - **One migration applies on startup, one statement runs by hand** — the migration adds the policy, capability, and verdict columns to `fleet.runners` and rewrites no rows. Right after deploying, mark the pre-upgrade rows degraded yourself (idempotent; it only matches rows without an assignment): `UPDATE fleet.runners SET degraded = TRUE, degraded_reason = 'no assigned policy' WHERE network_policy IS NULL;` ## What's new