Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/scripts/detect-rebake-lanes.py
Original file line number Diff line number Diff line change
Expand Up @@ -521,15 +521,16 @@ def main():
"expect_two_hosts": "",
"nextest_filter": (
"test(/e2e_/) "
"- test(e2e_two_host_evacuate_preserves_sentinel) "
"- test(e2e_retire_host_relocates_and_grants) "
"- test(e2e_teleport_session_honors_target_host) "
"- test(e2e_claude_with_bogus_key_surfaces_anthropic_auth_error)"
),
},
{
"variant": "teleport",
"two_hosts": "1",
"expect_two_hosts": "1",
"nextest_filter": "test(e2e_two_host_evacuate_preserves_sentinel)",
"nextest_filter": "test(e2e_teleport_session_honors_target_host)",
},
]
e2e_orchestrator_matrix = [{
Expand Down
20 changes: 7 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ jobs:
--test snapshot_blob_gc_live_pg \
--test admin_chunk_gc_live_pg \
--test admin_evac_live_pg \
--test teleport_live_pg \
--test eviction_live_pg \
--test checkpoint_reconcile_live_pg \
--test enable_jobs_live_pg \
Expand Down Expand Up @@ -1796,10 +1797,7 @@ jobs:
# - suite: single host. Runs every e2e_stack test EXCEPT the two-host
# evacuation test and the quarantined Claude auth test. This includes
# the orchestrator automation tests in the normal full posture.
# - teleport: two hosts (host-a + host-b). Runs ONLY the two-host
# evacuation test, which drives `FleetService.EvacuateSession` (the
# teleport primitive on the app-gRPC surface, ADR 0051) and asserts the
# session relocates off the source host with its disk byte-identical.
# - teleport: two hosts. Check pinned teleport, then retirement and deletion.
# - orchestrator: single host. Runs only the webhook and cron automation
# scenarios that call the orchestrator's public RPC and HTTP surfaces.
# The detector uses this variant only for an orchestrator-only PR.
Expand All @@ -1808,12 +1806,6 @@ jobs:
# selects only orchestrator. Push and merge-group runs use suite and
# teleport, so the full posture stays at two concurrent stacks.
#
# ADR 0051 restored this two-host coverage as
# `e2e_two_host_evacuate_preserves_sentinel` (replacing the deleted REST
# `e2e_two_host_teleport_preserves_sentinel` — there is no Teleport RPC, so
# EvacuateSession is the gRPC teleport primitive; it relocates to any peer
# rather than a pinned host).
#
# e2e stack IS gated now (in the CI Gate's needs). Branch protection requires
# only the CI Gate, never the matrix-suffixed job names directly.
strategy:
Expand Down Expand Up @@ -2129,9 +2121,7 @@ jobs:
# hosts registered (a single-host regression fails loud instead of
# silently skipping).
ENGRAM_EXPECT_TWO_HOSTS: "${{ matrix.expect_two_hosts }}"
# Per-variant nextest filterset: suite runs everything except the
# two-host evac test; teleport runs only it (ADR 0051 restored the
# split when EvacuateSession became the gRPC teleport primitive).
# Retirement deletes a fixture host, so it runs last in a separate invocation.
E2E_NEXTEST_FILTER: "${{ matrix.nextest_filter }}"
run: |
cargo nextest run \
Expand All @@ -2141,6 +2131,10 @@ jobs:
--no-fail-fast \
--test-threads=1 \
-E "$E2E_NEXTEST_FILTER"
if [ "${{ matrix.variant }}" = "teleport" ]; then
cargo nextest run -p engram-coordinator --test e2e_stack --run-ignored ignored-only \
-E 'test(e2e_retire_host_relocates_and_grants)'
fi

- name: Dump tilt + stack logs on failure
if: failure()
Expand Down
8 changes: 4 additions & 4 deletions cli/src/commands/host.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* engrams host … — FleetService passthrough verbs (admin surfaces).
*
* `evacuate` closes the gap the Rust CLI documented ("no engram-cli surface
* for EvacuateSession") — the passthrough forwards the whole FleetService.
* for TeleportSession") — the passthrough forwards the whole FleetService.
*/

import type { Clients } from "../client.ts";
Expand Down Expand Up @@ -121,7 +121,7 @@ export async function uncordon(c: Clients, id: string, json: boolean): Promise<v
}

export async function evacuate(c: Clients, sessionId: string, json: boolean): Promise<void> {
const resp = await c.fleet.evacuateSession({ sessionId }).catch(failWith);
if (json) printJson({ session_id: resp.sessionId, status: resp.status });
else console.log(`${resp.sessionId}: ${resp.status}`);
const resp = await c.fleet.teleportSession({ sessionId }).catch(failWith);
if (json) printJson({ teleport_id: resp.teleportId, kind: resp.kind, dest_host_id: resp.destHostId });
else console.log(`${resp.teleportId}: ${resp.kind} to ${resp.destHostId}`);
}
Loading
Loading