Skip to content

test(e2e): scope post-reboot recovery to host-side invariants (follow-up to #5046)#5087

Merged
cv merged 3 commits into
mainfrom
e2e-post-reboot-scope-host-side
Jun 9, 2026
Merged

test(e2e): scope post-reboot recovery to host-side invariants (follow-up to #5046)#5087
cv merged 3 commits into
mainfrom
e2e-post-reboot-scope-host-side

Conversation

@jyaunches

@jyaunches jyaunches commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Follow-up to #5046. Tightens the ubuntu-repo-docker-post-reboot-recovery scenario into a stable RED-on-regression / GREEN-on-main guard while PR-A (the #4423 source fix) is in flight.

Related Issue

Refs #4423

Why this is needed

Post-merge dispatches of #5046's ubuntu-repo-docker-post-reboot-recovery job against ubuntu-latest revealed two issues:

  1. The openshell gateway stop step in LifecyclePhaseFixture was counterproductive. #4578's mitigation in src/lib/actions/sandbox/status.ts:296 guards the destructive branch behind a healthy_named gateway. Stopping the gateway routed every dispatch through the safe path and masked the regression target. There is no openshell gateway start subcommand on ubuntu-latest (the user-systemd autostart from fix(onboard): use OpenShell gateway user service #4580 is the real mechanism), so the original lifecycle couldn't restart the gateway cleanly to keep it healthy_named.

  2. The post-reboot-recovery-ready expected-state asserted on runtime liveness probes (gateway-healthy, sandbox-running) that are environmental on ubuntu-latest after docker stop. They varied independently of the #4423 regression target and made every dispatch RED for the wrong reason — concretely, gateway-healthy failing before the host-side probes had a chance to run.

Changes

LifecyclePhaseFixture.simulatePostReboot

  • Drop the openshell gateway stop step. The lifecycle now stops only the labeled sandbox container and then runs nemoclaw <name> status. Gateway is left healthy_named, which is the precondition for the destructive branch we want PR-A to neutralize.
  • Drop the GATEWAY_STOP_TIMEOUT_MS constant (no longer referenced).
  • Updated docstring + 2 unit tests removed (gateway-stop-failure tolerance tests are no longer applicable).

post-reboot-recovery-ready expected-state

Lock down only the host-side preservation invariants this scenario can faithfully exercise:

  • cli-installed
  • local-registry-entry-present
  • docker-sandbox-container-present (running OR stopped OR *-nemoclaw-gpu-backup-* sibling)

Drop gateway: { expected: "present", health: "healthy" } and sandbox: { expected: "present", status: "running", agent: "openclaw" }. A follow-up scenario on a more controlled runner (real DGX Spark / Brev) can extend the expected state with runtime liveness probes once PR-A has landed and a true post-reboot environment is available.

probesForState ordering

Reorder so host-side observables (local-registry-entry-present, docker-sandbox-container-present) emit BEFORE runtime-derived gateway/sandbox probes everywhere. The state-validation orchestrator short-circuits on the first probe failure, so host-side regression targets must be observed first. Pre-existing scenarios (cloud-openclaw-ready, preflight-failure-*, etc.) are unaffected — none declare host-side dimensions, so their probe lists are unchanged.

RED / GREEN contract

  • On main (this PR's HEAD): scenario goes 🟢 GREEN. Locks in #4578's mitigation as a passive guard — registry preserved through docker stop + nemoclaw status round-trip.
  • On a regression PR that re-introduces unconditional registry.removeSandbox in status.ts:296 or gateway-state.ts:412: scenario goes 🔴 RED at local-registry-entry-present.
  • On PR-A's fix branch that adds Docker-driver sandbox recovery: scenario stays 🟢, demonstrating the new helper does not regress either host-side invariant.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Verification

  • npx prek run --all-files passes
  • npm test passes — 142 tests across the directly affected files all green; no regressions on the rest of the e2e-scenario framework suite.
  • Live dispatch (gh workflow run e2e-vitest-scenarios.yaml -f scenarios=ubuntu-repo-docker-post-reboot-recovery --ref e2e-post-reboot-scope-host-side) goes GREEN: lifecycle (docker stop + nemoclaw status) → host-side probes pass → cleanup restores Docker. Will dispatch as a verification step once this PR is open.
  • Tests added or updated for new or changed behavior.
  • No secrets, API keys, or credentials committed.

Follow-ups (post PR-A)

  • Once PR-A's Docker-driver recovery helper is in place, extend the post-reboot expected-state with gateway/sandbox runtime probes on a controlled runner.
  • Consider a post-reboot-spark lifecycle profile for hardware-runner dispatch that can do a real reboot and exercise the full bug class.

Summary by CodeRabbit

  • Tests

    • Added a validation test for post-reboot-recovery expected-state focusing on host-side invariants.
    • Updated post-reboot-recovery phase tests to remove the gateway-stop step and assert container stop + host status checks.
  • Documentation

    • Clarified lifecycle and scenario comments/manifests to describe container-stop + host-status-driven recovery and probe ordering.
  • Behavior

    • Expected-state and probe emission now prioritize host-side checks and omit runtime gateway/sandbox expectations.

jyaunches added 2 commits June 9, 2026 16:02
Follow-up to #5046. The initial dispatch of
`ubuntu-repo-docker-post-reboot-recovery` against `ubuntu-latest`
revealed two issues that I want to lock in correctly while PR-A
(the `#4423` source fix) is in flight:

1. The `openshell gateway stop` step in `LifecyclePhaseFixture` was
   load-bearing in the docstring but counterproductive in practice:
   `#4578`'s mitigation guards the destructive branch behind a
   `healthy_named` gateway, so stopping the gateway routes the test
   through the safe path and masks the regression target. There is
   no `openshell gateway start` subcommand on `ubuntu-latest` to
   restart the gateway cleanly (the user-systemd autostart from #4580
   is the real mechanism), so simulate the post-reboot conditions by
   stopping ONLY the labeled sandbox container and leaving the
   gateway running.

2. The `post-reboot-recovery-ready` expected state asserted on
   `gateway-healthy` and `sandbox-running` runtime probes that are
   environmental on `ubuntu-latest` after `docker stop`. These
   liveness probes vary independently of the `#4423` regression
   target (registry destruction) and were causing the scenario to go
   RED for the wrong reason. Drop them and lock only the host-side
   preservation invariants this scenario can faithfully exercise:

     - `cli-installed`
     - `local-registry-entry-present`
     - `docker-sandbox-container-present` (running OR stopped OR
       `*-nemoclaw-gpu-backup-*` sibling)

   Reorder `probesForState` so host-side observables run BEFORE
   runtime-derived gateway/sandbox probes everywhere — the
   state-validation orchestrator short-circuits on the first probe
   failure, so host-side regression targets must be observed first.

Net effect: the live `e2e-vitest-scenarios.yaml` dispatch on
`ubuntu-latest` now goes GREEN against `main`. The scenario locks in
`#4578`'s mitigation as a passive guard. PR-A's Docker-driver
recovery helper extends this scaffold; if PR-A regresses either
host-side invariant, the scenario goes RED.

Pre-existing scenarios (cloud-openclaw-ready, preflight-failure-*,
etc.) are unaffected — none declare `localRegistry` or
`dockerSandboxContainer`, so the probe reordering is a no-op for
their probe lists. Verified by the existing pinning tests in
`e2e-expected-state.test.ts`.

Refs #4423
@jyaunches jyaunches added the v0.0.62 Release target label Jun 9, 2026
@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 39df0e93-f832-4919-847a-22c9705a3e11

📥 Commits

Reviewing files that changed from the base of the PR and between 34ce0be and b110a53.

📒 Files selected for processing (3)
  • test/e2e-scenario/live/registry-scenarios.test.ts
  • test/e2e-scenario/manifests/openclaw-nvidia-post-reboot-recovery.yaml
  • test/e2e-scenario/scenarios/scenarios/baseline.ts
✅ Files skipped from review due to trivial changes (1)
  • test/e2e-scenario/live/registry-scenarios.test.ts

📝 Walkthrough

Walkthrough

This PR refactors the post-reboot-recovery lifecycle phase by removing the "gateway stop" orchestration step, updating expected-state definitions to focus on host-side invariants only, and aligning all test assertions with the revised behavior.

Changes

Post-reboot-recovery lifecycle refactor

Layer / File(s) Summary
Lifecycle phase definition: remove gateway-stop step
test/e2e-scenario/framework/phases/lifecycle.ts
Removes GATEWAY_STOP_TIMEOUT_MS constant and the sandbox.openshell(["gateway","stop"]) step. Updates phase documentation to describe the container-centric procedure with gateway left HEALTHY, proceeding directly to Docker discovery and nemoclaw <name> status check.
Expected-state definition: host-side invariants only
test/e2e-scenario/scenarios/expected-states.ts
Updates postRebootRecoveryReady to omit runtime-derived gateway and sandbox expectations, keeping only cli.installed and host-side preservation invariants. Reorders probesForState to emit host-side preservation probes before gateway/sandbox runtime probes.
Test assertions aligned with lifecycle and expected-state changes
test/e2e-scenario/framework-tests/e2e-expected-state.test.ts, test/e2e-scenario/framework-tests/e2e-phase-lifecycle.test.ts
Removes gateway-stop mocked calls and assertions from lifecycle simulation scenarios. Adds test verifying post-reboot-recovery-ready emits only host-side invariants. Replaces gateway-stop-tolerance test with a failure case when no Docker container carries the sandbox-name label. Updates scenario comments/manifests to match the revised sequencing.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#5004: The changes to postRebootRecoveryReady expected-state and probe-ordering in this PR directly affect which probe IDs the state-validation phase fixture in #5004 would execute from the expected-state registry.

Suggested labels

area: e2e, E2E

Suggested reviewers

  • cv

Poem

🐰 A rabbit hops through e2e terrain,
Where gateway stops are now refrained,
Host-side invariants shine so bright,
Probes reordered, tests run right,
Recovery's path, more lean and light! 🌟

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: scoping post-reboot recovery e2e tests to host-side invariants as a follow-up to PR #5046. It is specific, concise, and directly reflects the primary objective across all modified files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch e2e-post-reboot-scope-host-side

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: e2e-vitest-scenarios:ubuntu-repo-docker-post-reboot-recovery
Optional E2E: None

Dispatch hint: ubuntu-repo-docker-post-reboot-recovery

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • e2e-vitest-scenarios:ubuntu-repo-docker-post-reboot-recovery (high; live install/onboard with Docker and NVIDIA_API_KEY): Targeted live validation for the changed post-reboot recovery lifecycle contract. It onboards the Ubuntu repo Docker OpenClaw scenario, runs the updated lifecycle simulation, invokes nemoclaw <name> status, and verifies the host-side registry/container preservation probes from post-reboot-recovery-ready.

Optional E2E

  • None.

New E2E recommendations

  • post-reboot recovery runtime liveness (high): This PR intentionally narrows the live post-reboot recovery expected state to host-side invariants only. Add follow-up coverage on a controlled runner that can reproduce the healthy gateway plus Docker-backed NotFound condition and then assert gateway/sandbox runtime recovery after the Docker-driver recovery helper lands.
    • Suggested test: Add a dedicated live post-reboot recovery scenario with gateway-healthy and sandbox-running probes on a runner capable of simulating the real DGX Spark/Linux Docker-driver reboot condition.
  • typed scenario runner lifecycle dispatch (medium): The workflow route list includes ubuntu-repo-docker-post-reboot-recovery, but the shell lifecycle dispatcher under test/e2e-scenario/nemoclaw_scenarios/lifecycle/dispatch.sh currently only wires rebuild-current-version; the live Vitest fixture is the working execution path for this PR. Add or guard coverage so the Scenario Runner path cannot silently diverge from the registered scenario.
    • Suggested test: Add a post-reboot-recovery lifecycle worker for the typed Scenario Runner or an E2E/framework contract test that prevents unsupported lifecycle profiles from being routed through .github/workflows/e2e-scenarios.yaml.

Dispatch hint

  • Workflow: .github/workflows/e2e-vitest-scenarios.yaml
  • jobs input: ubuntu-repo-docker-post-reboot-recovery

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

E2E Scenario Advisor Recommendation

Required scenario E2E: e2e-scenarios-all
Optional scenario E2E: None

Dispatch required scenario E2E:

  • gh workflow run e2e-scenarios-all.yaml --ref <pr-head-ref>

Workflow run

Full scenario advisor summary

E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required scenario E2E

  • e2e-scenarios-all: Changes touch scenario framework/runtime behavior in the lifecycle phase plus typed expected-state and scenario catalog definitions. Per scenario E2E policy, runner/runtime and catalog/expected-state changes require the full scenario fan-out.
    • Dispatch: gh workflow run e2e-scenarios-all.yaml --ref <pr-head-ref>

Optional scenario E2E

  • None.

Relevant changed files

  • test/e2e-scenario/framework-tests/e2e-expected-state.test.ts
  • test/e2e-scenario/framework-tests/e2e-phase-lifecycle.test.ts
  • test/e2e-scenario/framework/phases/lifecycle.ts
  • test/e2e-scenario/live/registry-scenarios.test.ts
  • test/e2e-scenario/manifests/openclaw-nvidia-post-reboot-recovery.yaml
  • test/e2e-scenario/scenarios/expected-states.ts
  • test/e2e-scenario/scenarios/scenarios/baseline.ts

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor

Findings: 0 needs attention, 1 worth checking, 0 nice ideas
Top item: PR review advisor unavailable

Review findings

🛠️ Needs attention

  • None.

🔎 Worth checking

  • PR review advisor unavailable: The automated advisor could not complete: Could not parse JSON from PR review advisor output; see /home/runner/work/NemoClaw/NemoClaw/artifacts/pr-review-advisor/pr-review-advisor-raw-output.txt
    • Recommendation: Re-run the PR Review Advisor or perform a manual review.
    • Evidence: Could not parse JSON from PR review advisor output; see /home/runner/work/NemoClaw/NemoClaw/artifacts/pr-review-advisor/pr-review-advisor-raw-output.txt

🌱 Nice ideas

  • None.

Workflow run details

This is an automated advisory review. A human maintainer must make the final merge decision.

@jyaunches

Copy link
Copy Markdown
Contributor Author

Verified: guard catches both regression targets

Throwaway branch prove-red-registry-destroyed (since deleted) injected each artificial regression after nemoclaw <name> status ran (so nothing could heal it before state-validation), then dispatched the live scenario. Both probes flipped 🟢 → 🔴 with clean error messages:

local-registry-entry-present regression target

Injection: rm ~/.nemoclaw/sandboxes.json post-status.
Run: 27234355223failure.
Failure message:

Error: state-validation expected local registry entry for
'e2e-ubuntu-repo-docker-post-reboot-recovery',
but /home/runner/.nemoclaw/sandboxes.json does not exist.
  ❯ StateValidationPhaseFixture.expectLocalRegistryEntryPresent

docker-sandbox-container-present regression target

Injection: docker rm -f <labeled container> post-status.
Run: 27234826303failure.
Failure message:

Error: state-validation expected at least one Docker container labeled
'openshell.ai/sandbox-name=e2e-ubuntu-repo-docker-post-reboot-recovery'
(running, stopped, or *-nemoclaw-gpu-backup-* sibling),
but docker ps -a returned none.
  ❯ StateValidationPhaseFixture.expectDockerSandboxContainerPresent

Baseline GREEN

The same scenario without injection on this PR's HEAD: 27232568069success. Locks in #4578's mitigation as the passive guard advertised in the PR body.

This satisfies the failing-test-first contract: each user-visible invariant (localRegistry, dockerSandboxContainer) is provably caught by exactly one probe with a clean error pointing at the regression. PR-A's Docker-driver recovery helper inherits this scaffold.

@wscurran wscurran added area: e2e End-to-end tests, nightly failures, or validation infrastructure area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery chore Build, CI, dependency, or tooling maintenance labels Jun 9, 2026
@wscurran wscurran added the platform: ubuntu Affects Ubuntu Linux environments label Jun 9, 2026
The PR Review Advisor on #5087 flagged three places that still
described the OLD lifecycle (stops gateway runtime + restarts it)
even though the code already exercises the scoped lifecycle (stops
labeled container only, runs `nemoclaw status`, leaves gateway
HEALTHY):

  * `scenarios/scenarios/baseline.ts` — scenario description.
  * `manifests/openclaw-nvidia-post-reboot-recovery.yaml` — manifest
    inline comment.
  * `live/registry-scenarios.test.ts` — driver comment on the
    lifecycle-dispatch block.

Update each to:
  - Describe the actual two-step lifecycle (`docker stop` + status).
  - Note the gateway is left healthy and why (no `gateway start`
    subcommand on `ubuntu-latest`; #4578's mitigation would mask the
    regression target if the gateway were down).
  - Re-frame the assertion surface as host-side preservation
    invariants (`local-registry-entry-present`,
    `docker-sandbox-container-present`).
  - Cross-reference between the three locations so future readers
    don't have to chase context.

No code change.

Refs #4423
@cv cv merged commit 3f6c6dd into main Jun 9, 2026
41 of 42 checks passed
@cv cv deleted the e2e-post-reboot-scope-host-side branch June 9, 2026 23:10
jyaunches added a commit that referenced this pull request Jun 10, 2026
…4423) (#5091)

## Summary

Closes the active-recovery half of #4423 — parts 2 & 3 of @ericksoa's
plan. The destructive registry-removal paths were already neutralized
by:

- **#4578** — `status` no longer calls `registry.removeSandbox` on
`NotFound` unless the gateway is `healthy_named`.
- **#4497** — `ensureLiveSandboxOrExit` (which `connect` rides)
preserves the registry entry on `missing` and routes intentional purges
through explicit `destroy`.

What's still missing is the *active recovery* path: when the gateway
returns to `healthy_named` after a reboot but reports the sandbox as
`NotFound`, NemoClaw currently prints "retry in a moment" guidance. This
PR makes it walk Docker by the OpenShell labels, restart the labeled
container (or rename a `*-nemoclaw-gpu-backup-*` sibling back), re-query
OpenShell, and return a `present` lookup with a recovery breadcrumb. The
user runs `nemoclaw <name> status` once and the sandbox is live.

## Related Issue

Refs #4423

## Changes

### New: `src/lib/onboard/docker-driver-sandbox-recovery.ts`

`recoverDockerDriverSandbox(name, deps)` scans Docker by
`openshell.ai/managed-by=openshell` AND
`openshell.ai/sandbox-name=<name>` (the same labels
`findOpenShellDockerSandboxContainerIds` already uses). Dispatches by
container shape:

| Branch ID | Trigger | Action |
|---|---|---|
| `started-running-original` | Labeled container is already running |
No-op success |
| `started-stopped-original` | Labeled container exists but stopped |
`docker start` |
| `renamed-and-started-backup` | Only a `*-nemoclaw-gpu-backup-*`
sibling exists (from `docker-gpu-patch.ts`'s GPU patch) | `docker rename
<backup> <original>` then `docker start` |
| Conflict | Stopped original + backup sibling both exist | Start the
original, leave the backup alone |
| None | No labeled container | `{ recovered: false }` — callers fall
through to existing non-destructive guidance |

Adapter access is per-call lazy `require` — top-level `import` from
`../adapters/docker` pulls in `runner.ts`'s load-time
`require("./platform")` which the Vitest TS loader can't resolve. Same
escape hatch as `auto-pair-approval.ts`.

Label constants are duplicated locally with comments pointing to
`docker-gpu-patch.ts` as the source of truth.

### Wiring: `src/lib/actions/sandbox/gateway-state.ts`

`reconcileMissingAgainstNamedGateway` now calls the helper:
- After the existing `gateway select nemoclaw` retry path lands on
`healthy_named` + `missing`.
- On the new top-level `healthy_named` + `missing` precondition that
#4423's bug class describes (gateway came back fresh after reboot with
no sandbox memory).

`SandboxGatewayState` gains `recoveredSandbox?: boolean` and
`recoverySandboxVia?: string | null` so callers can render a recovery
breadcrumb without re-walking the recovery chain.

### User-facing breadcrumb: `src/lib/actions/sandbox/status.ts`

Present-state output now prints:

```
Recovered sandbox '<name>' from Docker via <branch>; OpenShell now sees it as live.
```

before the canonical OpenShell sandbox info.

## Test results

- ✅ **12 new helper tests** in `docker-driver-sandbox-recovery.test.ts`
(all 4 dispatch branches, rename/start failure surfaces,
no-labeled-container empty case).
- ✅ **Existing 30 reconcile tests** in
`gateway-state-reconcile-2276.test.ts` and `gateway-state-drift.test.ts`
still pass — the new branch is additive and only fires under
`healthy_named` + `missing` which existing tests don't exercise.
- ✅ **1621 tests across `src/lib/onboard/`, `src/lib/actions/sandbox/`,
`test/gateway-state*.test.ts`** all green.

## Verification surface

- The post-reboot recovery scenario from #5087
(`ubuntu-repo-docker-post-reboot-recovery`) continues to go 🟢 GREEN —
its host-side invariants (`local-registry-entry-present`,
`docker-sandbox-container-present`) are exactly what this fix preserves.
- A future controlled-runner scenario can extend
`post-reboot-recovery-ready` with gateway/sandbox runtime probes once a
real-reboot environment is wired.

## Type of Change

- [x] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Verification

- [x] `npx prek run --all-files` passes
- [x] `npm test` passes — 1621 affected tests green; full suite to be
exercised by CI on this branch.
- [x] Tests added or updated for new or changed behavior.
- [x] No secrets, API keys, or credentials committed.
- [x] Live `ubuntu-repo-docker-post-reboot-recovery` scenario stays
green; will dispatch on this branch as a post-push verification step.

## Boundaries kept honest

- The helper talks to Docker only. OpenShell re-query is the caller's
job.
- Profile dispatch is exhaustive (`never`-checked); adding a new branch
requires extending both the helper switch and the unit test.
- Recovery is best-effort and short-circuits to `{ recovered: false }`
on any failure, so callers' existing non-destructive guidance stays the
safety net.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Sandboxes marked as missing after a system reboot can now be
automatically recovered from Docker if the container still exists on
disk.
* Status messages now display recovery information when a sandbox is
restored.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: e2e End-to-end tests, nightly failures, or validation infrastructure area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery chore Build, CI, dependency, or tooling maintenance platform: ubuntu Affects Ubuntu Linux environments v0.0.62 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants