--- id: CUST-WP-0028 type: workplan title: "Cross-Repo E2E Sandbox Framework" domain: railiance repo: the-custodian status: active owner: custodian topic_slug: railiance created: "2026-03-27" updated: "2026-03-27" state_hub_workstream_id: "b68de20b-e397-4f97-b1be-ad30711fc2a6" --- # Cross-Repo E2E Sandbox Framework ## Problem End-to-end tests that require a real running stack (Temporal, Postgres, workers) cannot be automated in CI or run locally without significant setup friction. Each repo has to reinvent its own e2e story. activity-core T21 is the immediate trigger: the full RunActivityWorkflow flow can't be exercised without a live Temporal cluster. ## Goal A **convention + runtime** that any repo can opt into by dropping in an `e2e/` folder. The shared framework, living in `the-custodian/e2e-framework/`, handles: - Provisioning an isolated sandbox on a remote host (railiance01) - `rsync` + `docker compose up` with a unique project name (no port conflicts) - Health polling until the stack is ready - Running the repo's test command and capturing results - `docker compose down` (even on failure) - Reporting structured results to the state-hub Each repo just provides: `e2e/e2e.yml` + `e2e/compose.yml` + `e2e/tests/`. The sandbox host defaults to `RAILIANCE01_HOST` env var (SSH alias or IP). ## Architecture ``` the-custodian/ e2e-framework/ schema.py # parse and validate e2e.yml sandbox.py # provision/teardown remote sandbox dir via SSH runner.py # rsync, compose up, health-wait, run tests, compose down reporter.py # push structured result to state-hub cli.py # entry point: python -m e2e_framework Makefile # e2e target: make e2e REPO=activity-core / e2e/ e2e.yml # metadata: compose_file, health_checks, test_command, timeout compose.yml # stack definition (may symlink docker-compose.dev.yml) tests/ # test scripts (pytest, shell, etc.) ``` ## e2e.yml contract ```yaml name: compose_file: e2e/compose.yml # relative to repo root health_checks: - name: