Skip to content

feat: Add Docker Sandbox staging smoke example [INT-976]#440

Open
AlexanderZ-Band wants to merge 1 commit into
devfrom
feat/sandbox-smoke-test-band-sdk-agent-headless-in-a-do-INT-976
Open

feat: Add Docker Sandbox staging smoke example [INT-976]#440
AlexanderZ-Band wants to merge 1 commit into
devfrom
feat/sandbox-smoke-test-band-sdk-agent-headless-in-a-do-INT-976

Conversation

@AlexanderZ-Band

@AlexanderZ-Band AlexanderZ-Band commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Manual, resumable Docker Sandbox staging smoke: a headless band-sdk LangGraph agent runs inside a real Docker Sandbox (sbx exec) against staging, proving WS receipt + REST reply, and reconnect across three real interruptions (Wi-Fi cycle, host sleep/wake, sandbox daemon restart).
  • probe.py reuses tests/e2e/baseline's pytest-free toolkit (ResourceManager, UserOps, reply_capture) for dynamic per-run agent/room provisioning + reap — no static staging credential.
  • skill/SKILL.md lets an AI client (Codex, Claude Code) drive and resume the workflow across the manual checkpoints; a plain operator runs the same scenario by hand via setup.sh/run.sh/probe.py. Both paths share one state.json and produce the same evidence.md.
  • Deliberately not an automated E2E test — a manual, occasionally-run example under examples/, not tests/e2e/.
  • Two rounds of code review plus three external review passes; every confirmed finding was fixed at the root (see commit history) — most recently a run-rotation bug where a failed/abandoned run's unreaped room+agent ids were dropped on archive instead of carried forward for retry.

Live validation (staging, run db69a529)

Check Result
Initial WS receive + REST reply PASS
Reconnect after real Wi-Fi cycle PASS
Recovery after host sleep/wake PASS
Recovery after sbx daemon restart (full re-provision) PASS

One continuous run, 26m31s. Full report attached to INT-976.

Two real bugs surfaced only by running live (both fixed, see README.md design notes):

  • band-sdk's git+https:// install fails inside the sandbox (private SSH-only .claude submodule) — install from PyPI instead.
  • The sandbox proxy answers CONNECT with HTTP/1.0 200, which websockets <=15.0.1 rejects; langgraph-sdk pins websockets<16, breaking WS for any band-sdk[langgraph] behind an HTTP/1.0 proxy. Workaround: agent.py's [tool.uv] override-dependencies = ["websockets>=16"].

Test plan

  • ruff check / ruff format --check clean
  • pyrefly check clean
  • Full live run against real staging + a real Docker Sandbox — all 4 checks PASS (above)
  • Regression scenarios for the state-rotation fix (unreaped ids carried across archive/rotate)

🤖 Generated with Claude Code

@linear-code

linear-code Bot commented Jul 14, 2026

Copy link
Copy Markdown

INT-976

Comment thread .github/workflows/ci.yml Outdated
Comment thread .github/workflows/e2e.yml
Comment thread .github/workflows/e2e.yml
Comment thread .github/workflows/e2e.yml
Comment thread examples/sandbox/staging-smoke/probe.py
Comment thread tests/e2e/baseline/toolkit/parlant_server.py
Comment thread tests/e2e/baseline/toolkit/parlant_server.py
@AlexanderZ-Band
AlexanderZ-Band changed the base branch from main to dev July 15, 2026 05:59
@AlexanderZ-Band AlexanderZ-Band changed the title Add Docker Sandbox staging smoke example [INT-976] feat: Add Docker Sandbox staging smoke example [INT-976] Jul 15, 2026
@AlexanderZ-Band
AlexanderZ-Band requested a review from a team July 15, 2026 13:05
Manual, resumable Docker Sandbox staging smoke: a headless band-sdk
LangGraph agent runs inside a real Docker Sandbox (sbx exec) against
staging, proving WS receipt + REST reply, and reconnect across three
real interruptions (Wi-Fi cycle, host sleep/wake, sandbox daemon
restart).

probe.py reuses tests/e2e/baseline's pytest-free toolkit
(ResourceManager, UserOps, reply_capture) for dynamic per-run
agent/room provisioning + reap, instead of a static staging credential
or hand-rolled REST/WS calls. skill/SKILL.md lets an AI client (Codex,
Claude Code) drive and resume the workflow across the manual
checkpoints; a plain operator runs the same scenario by hand via
setup.sh/run.sh/probe.py. Both paths share one state.json and produce
the same evidence.md.

Deliberately not an automated E2E test: a manual, occasionally-run
example under examples/, not tests/e2e/.

Live-validated against staging in one continuous run (all 4 checks
PASS: initial round trip, Wi-Fi reconnect, sleep/wake recovery,
daemon-restart recovery via full re-provision). Two real bugs surfaced
only by running live, both worked around: band-sdk's git+https:// install
fails inside the sandbox (private SSH-only .claude submodule) so
agent.py installs from PyPI instead; the sandbox proxy answers CONNECT
with HTTP/1.0, which websockets<=15.0.1 rejects and langgraph-sdk pins,
so agent.py overrides to websockets>=16.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@AlexanderZ-Band
AlexanderZ-Band force-pushed the feat/sandbox-smoke-test-band-sdk-agent-headless-in-a-do-INT-976 branch from 686a29d to 6b98ff7 Compare July 15, 2026 13:07
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.

2 participants