Skip to main content

OpenShell E2E Test Matrix

Back to main doc | Tests: rossoctl/tests/e2e/openshell/

Agents

AgentProtocolLLMSkill Support
claude-sdk-agentA2A JSON-RPCLiteMaaSVia prompt
adk-agent-supervisedA2A via port-bridgeLiteMaaS (supervised)Via prompt
weather-agent-supervisedkubectl execNoN/A
openshell-claudekubectl exec (sandbox)Anthropic/LiteLLMNative .claude/skills/
openshell-opencodekubectl exec (sandbox)OpenAI-compatVia prompt
nemoclaw-openclawHTTP gatewayLiteMaaSGateway protocol (skip)
nemoclaw-hermesTCP (internal)LiteMaaSInternal protocol (skip)

Agent lists defined in conftest.py: A2A_AGENTS, EXEC_AGENTS, CLI_AGENTS, NEMOCLAW_AGENTS, SKILL_AGENTS, ALL_AGENTS.

Capability Matrix (CI Kind — 107 passed, 0 failed, 112 skipped)

219 tests total. P=pass, S=skip(reason), FL=flaky, —=not tested.

Latest CI result: 107/0/112 on SHA 43f1f03 (2026-05-10, issue_comment run with full secrets).

Stability: 4/4 consecutive runs with 0 failures (3 local Kind + 1 CI Kind).

Tier 1: Infrastructure

CapabilityClaude CodeOpenCodeClaude SDKADKWeatherOpenClawHermes
ConnectivityPPP
CredentialsPPPPP
Sandbox lifecycleP
Workspace
Resource limitsPS⁴S⁴PP

Tier 2: Capabilities

CapabilityClaude CodeOpenCodeClaude SDKADKWeatherOpenClawHermes
MultiturnS⁵S⁵PS⁶P
Context isolationS⁵S⁵PS⁶P
Session resumeS⁵S⁵P
Tool calling
Concurrent sessions

Tier 3: Skills (parametrized x 6 agents, x 2 models)

CapabilityClaude SDKADKClaude CodeOpenCodeOpenClawWeather
PR reviewPS⁷S⁶
RCAP/FL⁸S⁷S⁶
SecurityP/FL⁸S⁷S⁶
GitHub PRPS⁷S⁶

Per-model: llama-scout-17b + deepseek-r1 (both via LiteMaaS).

Tier 4: Security

CapabilityWeatherOthers
HITL: Network egressP
Audit loggingS¹ (Claude Code, OpenCode)

Tier 5: Backend API (via rossoctl-backend A2A proxy)

Tests go through the backend at /api/v1/chat/{ns}/{agent}/send|stream. One port-forward to the backend replaces per-agent port-forwards.

CapabilityClaude SDKADKWeatherClaude CodeOpenCodeOpenClaw
Health checkPPP
Agent card proxyP
Send proxyP
Stream proxyS⁸
Multiturn proxyPS⁶
Agent listS⁹
Error handlingPPP
Concurrent proxyP

Tier 6: ACP Protocol (WebSocket)

Tests the ACP WebSocket endpoint with JSON-RPC 2.0 lifecycle.

CapabilityClaude SDKADKWeatherClaude CodeOpenCodeOpenClaw
InitializePP
Session new/closePP
Prompt relayPP
Context preservedPP
Session listP
Session resumeP
Permission gateP
Error handlingPP

Tier 7: Teleport (Sandbox CRD + LLM)

Tests session teleporting — packaging local context into a sandbox and executing with it.

CapabilityClaude Code
Package context → ConfigMapP
Deploy sandbox with contextP
Context unpacked in podP
Prompt reads teleported contextP
Cleanup removes resourcesP
Script exists and executableP

MVP targets Claude Code only. OpenCode teleport planned as extension.

Skip Reasons

CodeReasonCountResolution Path
Sandbox CRD not installed in CI~25Install agent-sandbox CRD before tests
Supervised agent netns blocks backend (503)~15Port-bridge sidecar integration
NemoClaw tests disabled in CI~5Set OPENSHELL_NEMOCLAW_ENABLED=true
S⁴No resource limits set on deployment~5Add limits to agent deployment YAMLs
S⁵CLI sandbox is single-invocation (by design)~6ACP session/prompt for multiturn
S⁶No LLM capability (weather) or not deployed~10By design
S⁷NemoClaw gateway protocol (not A2A)~8NemoClaw adapter in backend
S⁸LLM returned empty response (llama-scout-17b ~17% flake)~3Skip guard, track as flaky
S⁹Agents lack rossoctl.io/type=agent label1Label alignment

Flaky Tests

TestAgentModelFlake RateRoot Cause
test_skill_rca[claude_sdk]Claude SDKllama-scout-17b~17%LLM returns empty response
test_skill_security[claude_sdk]Claude SDKllama-scout-17b~17%Same
test_T5_stream[claude_sdk_agent]Claude SDKllama-scout-17b~10%Empty SSE stream

All flaky tests have skip guards — they skip instead of fail when the LLM returns empty. deepseek-r1 model does NOT exhibit these flakes.

Test File Organization

FileTierTestsWhat it covers
test_T0_1_infra_platform.py09Gateway, operator, agent pods
test_T0_3_infra_supervisor.py012Supervisor enforcement (weather)
test_T0_4_infra_nemoclaw.py018NemoClaw health, security
test_T0_5_infra_litellm.py014LiteLLM config, waypoint, passthrough
test_T1_1_connectivity.py112A2A, sandbox, NemoClaw connectivity
test_T1_2_credentials.py115Secret delivery, no hardcoded keys
test_T1_3_sandbox_lifecycle.py110Sandbox CRUD, status observability
test_T1_4_workspace.py15PVC persistence
test_T1_5_resource_limits.py19CPU/memory limits on all agents
test_T2_1_multiturn.py220Multiturn, context, tool calling, concurrent
test_T2_3_session_resume.py27Session resume across restarts
test_T3_1_skill_execution.py332Skills x 6 agents + per-model + audit
test_T4_1_hitl_network.py43HITL network egress
test_T5_1_backend_api.py5~15Backend A2A proxy
test_T6_1_acp_protocol.py6~15ACP WebSocket protocol
test_T7_1_teleport.py76Session teleport lifecycle

Running Tests

CI (via PR comment on any PR)

Comment /run-e2e-openshell on a PR to trigger both:

  • OpenShell PoC (Kind)e2e-openshell-kind.yaml (~20 min)
  • OpenShell PoC (HyperShift)e2e-openshell-hypershift.yaml (~45 min, creates ephemeral cluster)

The Kind workflow also auto-triggers on pull_request for paths under deployments/openshell/** and rossoctl/tests/e2e/openshell/**.

Local

# Full deploy + test on Kind
.github/scripts/local-setup/openshell-full-test.sh --skip-cluster-destroy

# Iterate on existing Kind cluster (skip deploy)
.github/scripts/local-setup/openshell-full-test.sh --skip-cluster-create --skip-cluster-destroy

# Full deploy + test on HyperShift
source .env.rossoctl-hypershift-custom
.github/scripts/local-setup/openshell-full-test.sh --platform ocp --skip-cluster-destroy ostest

# Direct pytest (no deploy, existing cluster)
export OPENSHELL_LLM_AVAILABLE=true OPENSHELL_LLM_MODELS="llama-scout-17b,deepseek-r1"
export OPENSHELL_NEMOCLAW_ENABLED=true OPENSHELL_GATEWAY_NAMESPACE=team1
uv run pytest rossoctl/tests/e2e/openshell/ -v --timeout=300