e2e-tests
Skill138 starsChanged 14 days agoMITView on GitHub
Autonomously launch, monitor, retry, and report all Physical AI cloud E2E tests across independent Azure ML and OSMO GPU infrastructure.
10 other projects use a version of this.
Adopted by
Most recently taken up by
- piskelapp/piskeltheir own version, first seen Nov 9, 2026
- pablopetr/claude-skillstheir own version, first seen Oct 25, 2026
- rterakedis/leanwheel-skillstheir own version, first seen Oct 17, 2026
- vstorm-co/agenticostheir own version, first seen Oct 16, 2026
- braintrustdata/braintrust-sdktheir own version, first seen Oct 8, 2026
- borgbase/vykartheir own version, first seen Oct 8, 2026
Other versions10 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 10
- vitessio/vitess★ 21ksame name
- piskelapp/piskel★ 13ksame name
- borgbase/vykar★ 722same name
- vstorm-co/agenticos★ 241same name
- braintrustdata/braintrust-sdk★ 30same name
- issue-orchestrator/issue-orchestrator★ 10same name
- Joomla-Bible-Study/joomla-skills★ 8same name
- GlamgarOnDiscord/claude-saas-blueprint★ 2same name
- rterakedis/leanwheel-skills★ 2same name
- pablopetr/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository10 other files it gives its agents.
- .github/copilot-instructions.mdCopilot instructions
- azureml-k3s-compute-target-setupSkill
- dataviewerSkill
- e2e-infrastructureSkill
- environment-deploymentSkill
- fleet-deploymentSkill
- fleet-intelligenceSkill
- infrastructureSkill
- osmo-lerobot-trainingSkill
- synthetic-dataSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
17 rules. 0 are common, 8 are distinctive, and 9 are very specific to this project.
0
Common
Most of the 9 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 11
Run detached cloud E2E test attempts through the repository-owned launcher.
- Distinctive: line 24
Read Terraform outputs before any Azure, Kubernetes, OSMO, or pytest operation.
- Very specific: line 25
Stop if terraform output -json is unavailable, empty, stale against live resource IDs, or missing a required output.
- Very specific: line 30
Treat PASSED as success. Stop automatic submissions and report the unresolved result when the latest attempt repeats the same terminal …
- Very specific: line 46
Do not treat a direct files.pythonhosted.org connection failure as a cloud-test failure.
- Very specific: line 52
Never write the token to config.json, command.sh, logs, manifests, or chat output.
- Distinctive: line 106
Run from the repository root:
- Very specific: line 157
Use command.sh as the authoritative record.
- Distinctive: line 161
Read aggregate and per-test state without attaching to the coordinator:
- Distinctive: line 173
Use five-minute status intervals while jobs are provisioning or running.
- Distinctive: line 184
After every test is terminal:
- Distinctive: line 217
After concurrent OSMO submissions return gateway 503/504 responses, serialize resubmissions.
- Very specific: line 223
Never resubmit a test while its state is STARTING or RUNNING.
- Distinctive: line 224
Do not delete staged data manually.
- Distinctive: line 225
Do not change GPU SKUs, regions, autoscaling limits, Terraform state, or node pools to make a test pass.
- Very specific: line 227
If osmo-service returns repeated gateway 503/504 responses, inspect its container lastState before retrying.
- Very specific: line 228
Treat Azure CLI token-refresh TLS EOF and RemoteDisconnected failures during Blob staging or cleanup as transient.
“Common” is measured: kept by at least 6 in 10 of the 9 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<!-- cspell:ignore amlcompute azureml chdir finalizers finetune nodepool pythonhosted pytest worktree -->Cloud E2E Tests
Run detached cloud E2E test attempts through the repository-owned launcher. The launcher uses pytest collection to discover every test module marked e2e. It then exits and hands Copilot every command, PID, log, result, and resubmission handle needed to babysit the runs.
Resolve the launcher from the active checkout:
REPO_ROOT="$(git rev-parse --show-toplevel)"
DRIVER="$REPO_ROOT/.github/skills/e2e-tests/scripts/run-e2e-tests.sh"Operating Contract
Execute the workflow autonomously. Do not ask the user to run commands, monitor jobs, classify failures, or request routine retries.
- Read Terraform outputs before any Azure, Kubernetes, OSMO, or pytest operation.
- Stop if
terraform output -jsonis unavailable, empty, stale against live resource IDs, or missing a required output. Do not infer deployed resource names from conventions, the current Kubernetes context, Azure resource enumeration, or remembered environments. - Validate Azure authentication, storage, and Azure ML compute before submitting tests. Validate OSMO authentication, the gateway, and AKS GPU pools when the selected subset includes OSMO tests.
- Launch the requested test files concurrently, or every discovered default test when no subset is requested. Azure ML and OSMO use independent compute and do not contend with each other.
- Capture
E2E_HANDLEand take ownership of monitoring. The launcher never retries or diagnoses a completed attempt. - For every non-pass, inspect the exact command and complete output. Resubmit a classified transient failure only after evidence shows a supported remedy or changed cloud condition. Investigate other failures, correct clear in-scope defects, validate locally, then resubmit only the affected test.
- Treat
PASSEDas success. Stop automatic submissions and report the unresolved result when the latest attempt repeats the same terminal error, cloud state, and evidence without a supported intervention or observable progress. Never alter Terraform or node-pool configuration to work around unavailable GPU capacity. - Report each test's commands, attempts, cloud job or workflow identifiers, durations, and final state. Run handle cleanup after all tests reach terminal states.
Each handle owns an XDG_CONFIG_HOME under its run directory. OSMO reads and rewrites login.yaml in that directory, so every launch, detached attempt, resubmission, and diagnostic command must load the handle's non-executable config.json.
The launcher accepts only a handle directory owned by the current user with mode 700; private configuration and process records must be owned by the current user with mode 600 and must not be symbolic links. Never use the global ~/.config/osmo/login.yaml while an E2E handle is active; concurrent deployments would redirect each other's CLI commands.
Local Dependency Bootstrap
Synchronize the frozen local environment before launching attempts. Use the package index configured for the current development environment:
cd "$REPO_ROOT"
uv sync --frozen --no-progressDo not treat a direct files.pythonhosted.org connection failure as a cloud-test failure. Bootstrap through the configured index, then resubmit the affected terminal attempts.
Hugging Face Prerequisite
tests/e2e/test_e2e_aml_vla_pi0_training.py requires HF_TOKEN with access to the gated google/paligemma-3b-pt-224 model. Export the token before a default full run or before selecting that test explicitly. The requirement does not apply when an explicit subset omits tests marked requires_hf_token.
Never write the token to config.json, command.sh, logs, manifests, or chat output. Preserve it only in the process environment. A missing or empty token is a non-retryable client-side setup failure: the test must fail before Azure fixture resolution, dataset staging, or job submission.
Required Terraform Outputs
Run this first:
terraform -chdir=infrastructure/terraform output -json |
jq '{
resource_group,
aks_cluster,
azureml_workspace,
storage_account,
node_pools
}'This projection is safe for operator and Copilot output. Do not print or paste the unfiltered JSON because Terraform includes values marked sensitive, including credentials and connection details. The launcher stores the complete output only in the handle's owner-only terraform-output.json.
When the current feature worktree has no Terraform state or returns empty outputs, locate the main worktree with git worktree list --porcelain and use its infrastructure/terraform directory as the authoritative deployment source. Keep the feature worktree as the launcher repository root so pytest collects and runs the branch code:
"$DRIVER" \
--repo-root <feature-worktree> \
--terraform-dir <main-worktree>/infrastructure/terraformApply the same output and live-resource validation rules to the main worktree state. Stop if those outputs are unavailable, empty, stale, or incomplete.
Require these non-null outputs:
| Output | Required fields | Use |
resource_group | value.name, value.id, value.location | Azure scope |
aks_cluster | value.name, value.id | OSMO Kubernetes target |
azureml_workspace | value.name, value.id | Azure ML job target |
storage_account | value.name, value.id | Synthetic IL and VLA staging |
node_pools | Non-empty value map | Expected OSMO GPU pools, VM sizes, priorities, labels, and taints |
The committed node_pools output does not expose autoscaling bounds. Read live bounds with az aks nodepool list only after matching the AKS resource ID to Terraform.
Compute Validation
Validate the two independent backends before launching:
| Backend | Required checks |
| OSMO on AKS | Every Terraform GPU pool exists with the expected VM size; each pool has a registered node or enableAutoScaling=true with maxCount>0; the launcher logs in through its localhost gateway port-forward, selects the default pool, verifies a generic huggingface credential exists, and osmo workflow list --count 1 --format-type json succeeds |
| Azure ML | gpu-cluster is amlcompute, provisioning is Succeeded, and max_instances>0; zero current nodes is valid scale-from-zero |
Scale-from-zero pools may have no registered GPU nodes. Do not interpret zero current nodes as a configuration failure when autoscaling can add capacity.
Launch
Run from the repository root:
"$DRIVER"Select a subset by repeating --test:
"$DRIVER" \
--test test_e2e_aml_il_pipeline \
--test test_e2e_aml_il_lifecycle \
--test test_e2e_osmo_il_lifecycleThe command exits after printing:
E2E_HANDLE=<absolute-run-directory>
E2E_STATUS_COMMAND=<absolute-script-path> --status <absolute-run-directory>
E2E_RESUBMIT_COMMAND=<absolute-script-path> --resubmit <absolute-run-directory> <test-name>
E2E_CLEANUP_COMMAND=<absolute-script-path> --cleanup <absolute-run-directory>Save E2E_HANDLE. Each test owns one detached process. No coordinator or retry loop remains active after launch.
Handoff Data
The handle contains all data needed to investigate and reproduce an attempt:
| Path | Content |
config.json | Non-executable Terraform-resolved environment used by every attempt |
manifest.json | Structured handle creation metadata |
manifest.tsv | Human-readable handle creation metadata |
events.jsonl | Timestamped handle, launch, attempt, resubmission, gateway, and cleanup events |
tests.txt | Ordered tests selected for this handle |
terraform-output.json | Terraform outputs validated before launch |
live-node-pools.json | AKS pool state validated before launch |
azureml-compute.json | Independent Azure ML compute state validated before launch |
xdg-config/ | Handle-local OSMO login and profile state |
commands.tsv | Test, attempt, PID, exact command-file path, and output-log path |
<test>/status | Latest test state |
<test>/latest-attempt | Latest attempt number |
<test>/attempt-N/command.sh | Exact executable command, including exports, watchdog, pytest flags, and output paths |
<test>/attempt-N/output.log | Complete stdout and stderr |
<test>/attempt-N/pytest.xml | Isolated pytest result |
<test>/attempt-N/exit-code | Process exit code |
<test>/attempt-N/status | Attempt classification |
<test>/process.json | PID, role, command, and process start time used to prevent PID-reuse signalling |
Use command.sh as the authoritative record. Do not reconstruct commands from chat history or partial logs.
Tracking
Read aggregate and per-test state without attaching to the coordinator:
"$DRIVER" --status "$E2E_HANDLE"Inspect a test's current attempt:
tail -n 100 "$E2E_HANDLE/<test-name>/attempt-<n>/output.log"Use five-minute status intervals while jobs are provisioning or running. Use twenty-minute intervals when all pending jobs are blocked on documented GPU capacity. Do not poll continuously.
Resubmit one terminal attempt:
"$DRIVER" \
--resubmit "$E2E_HANDLE" <test-name>This creates attempt-N+1 with a new exact command.sh; it never overwrites earlier evidence.
After every test is terminal:
"$DRIVER" --cleanup "$E2E_HANDLE"Cleanup verifies the exact recorded process identity for attempts left in STARTING or RUNNING. It refuses cleanup for a matching live attempt or any live PID whose identity cannot be verified. A dead stale attempt is marked INTERRUPTED, including its latest attempt result, before cleanup continues.
Test Discovery
The launcher runs pytest --collect-only over tests/e2e and derives the available E2E modules from every test marked e2e. The default selection includes the complete collected set, including tests with additional prerequisite markers such as requires_hf_token.
Retry Classification
The launcher labels these conditions transient but does not resubmit them:
- Watchdog exit code
124 SkuNotAvailablenode-disruption- OSMO gateway HTTP
503or504 upstream request timeoutupstream connect errorTimed out waiting for .* to startTimed out waiting for .* to completedid not .* complete withinto start within
Before resubmitting, compare the latest attempt's command, exit status, cloud job or workflow state, and terminal error signature with the preceding attempt. Resubmit only when a supported intervention occurred or the evidence shows progress, such as refreshed authentication, recovered gateway health, changed capacity state, or a corrected in-scope defect. Each resubmission creates a billable workflow or job.
Stop automatic submissions when consecutive attempts repeat the same failure evidence without a supported remedy or changed condition. Report the command, attempts, cloud identifiers, and blocking evidence as an unresolved terminal handoff. Do not impose a universal retry count; evidence and progress determine whether another submission is justified. OSMO's _await_osmo_status_with_restarts already handles task-level spot disruptions inside one invocation; do not duplicate it.
Each E2E handle exports a private XDG_CONFIG_HOME and selects a free handle-local OSMO_GATEWAY_PORT before OSMO login. Preserve that profile and port for every attempt and resubmission so concurrent sessions targeting different deployments cannot rewrite each other's endpoint or contend for the same localhost listener. Every OSMO resubmission re-establishes the handle-local gateway login and selects the default pool inside that isolated profile.
After concurrent OSMO submissions return gateway 503/504 responses, serialize resubmissions. Wait for the active OSMO workflow to reach a terminal state before submitting the next test.
Failure Rules
- A pytest skip is
FAILED_SETUP_SKIP, never a pass. - A failure outside the retry classification is
FAILEDand requires investigation. - Never resubmit a test while its state is
STARTINGorRUNNING. Use cleanup to recover a dead stale attempt before resubmitting it. - Do not delete staged data manually; pytest finalizers own cleanup.
- Do not change GPU SKUs, regions, autoscaling limits, Terraform state, or node pools to make a test pass.
- Preserve every attempt log and XML result under the handle.
- If
osmo-servicereturns repeated gateway 503/504 responses, inspect its containerlastStatebefore retrying. AnOOMKilledtermination at the 1 GiB limit requires increasing the service memory allocation and redeploying OSMO. - Treat Azure CLI token-refresh TLS EOF and
RemoteDisconnectedfailures during Blob staging or cleanup as transient. Refresh the storage token, then retry the test. - An Azure ML parent pipeline in
Runningcan still have a queued child; inspect child jobs before diagnosing progress. - An OSMO pod in
Pendingis expected while AKS scales from zero. Confirm autoscaler configuration before attributing it to capacity.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

