Repository navigation
E2E on MiniMax: harness, selective workflow and concurrency control - #5239
Merged
Merged
Conversation
Adds scripts/e2e/catalog.json with its stdlib validator e2e_catalog.py and e2e_select.py, which decides the tests a pull_request, workflow_dispatch or merge_group event runs (seeded sampling, touched-test preference, at most two tests) and judges the required e2e-gate check. Routes scripts/e2e/* to the infra test directory. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
e2e_harness.py runs one catalog test inside the user image: it routes Claude Code to MiniMax only through ~/.claude/settings.json env, installs the user config that disables the quota guard, enables fleet headless runs and pins every default Codex route to claude-code, runs the canary or a fleet recipe with structural assertions, and always records result.json. Its redact subcommand copies artifacts world-readable with every secret replaced and fails if any secret survives. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
CanaryIssueUpdater gains append_to_issue, which appends a section to the open issue for a title, opens one when none exists, and closes a full issue in favour of a successor that links it before an append would cross GitHub's body limit. The new post-e2e-failure subcommand and scripts/e2e/ post-e2e-failure.sh report a failed E2E test or redaction stage with the pull request, commit and run URL. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
e2e.yml selects tests on pull_request, workflow_dispatch and merge_group, runs each selected test serially in one repository-wide queue inside the freshly built user image, redacts and uploads its artifacts, files a failure issue with only the workflow token, and reports one always-running e2e-gate check. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Covers maintainer and sandbox setup with the token's permission set, how a run reaches MiniMax through Claude settings env, why autoskillit install is skipped, the user config, selection and gate policy, concurrency and timeouts, redaction, failure issues, the catalog schema and local reproduction. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The enumeration-read guard requires a walked path's content read to handle a file disappearing after the walk. A vanished file cannot be uploaded, so the post-scan skips it; every other read error still fails redaction. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds the infrastructure for live end-to-end recipe runs on MiniMax and ships only the canary test, as scoped in #5230. Each recipe test is its own follow-up ticket.
scripts/e2e/catalog.jsonplus a stdlib validator (e2e_catalog.py): name, kind, peak sessions (≤ 8), timeout (job timeout derived, ≤ 360 min), trigger paths, and recipe/ingredients/expected PR state for recipe tests.scripts/e2e/e2e_select.py, run on the runner's systempython3:e2elabel;"{pr number}:{head sha}"; the label andworkflow_dispatchbypass sampling;merge_groupnever selects, because the PR already decided;gatepasses only on the two healthy shapes (selected and passed, or not selected and skipped).scripts/e2e/e2e_harness.pyruns inside theuserimage:~/.claude/settings.jsonenv(mode 0600) and strips everyANTHROPIC_*,CLAUDE_CODE_OAUTH_TOKEN,MINIMAX_API_KEYandE2E_SANDBOX_TOKENfrom child processes;fleetandfleet_headless_run, and routes every default Codex step toclaude-code;gh auth login(token on stdin), clone, andfleet run … --disable-quota-guard --timeout-sec Nwith structural assertions on the envelope and the sandbox PR, then closes the PRs it opened;result.json.e2e_harness.py redact, in a second container, copiesout/and the session logs world-readable with both secrets replaced, skips symlinks, and fails if a secret survives. Only that copy is uploaded..github/workflows/e2e.ymlrunsselect, thenrun(one repository-widequeue: maxgroup withmax-parallel: 1; builds theuserimage from the PR's merge commit), thene2e-gate(if: always(), meant to be the only required check).CanaryIssueUpdater.append_to_issueplus apost-e2e-failuresubcommand andscripts/e2e/post-e2e-failure.sh. One[E2E] <test> failureissue per test, append-only; it rotates to a linked successor before GitHub's 65,536-character body limit. It runs with only the workflow token, which the test container never sees.scripts/e2e/README.mdcovers maintainer and sandbox setup, the MiniMax route, whyautoskillit installis skipped, the selection policy, concurrency, redaction, the catalog schema and local reproduction.Departure from the issue
The issue asked to run
autoskillit installunless it proves unnecessary. It is skipped.fleet runfalls back toDirectInstall(plugin_dir=pkg_root())and publishes the projection on demand. The food-truck installation errors fire only for Codex-style backends, and every step is routed toclaude-code. The README records this derivation. The canary does not go throughfleet run, so the first recipe test is what will confirm it live.Verification
task test-local-gate: 18,284 passed, 207 skipped, 12 xfailed.pre-commit run --all-filesis clean, and the complexity ratchet againstdeveloppasses.tests/infra/test_e2e_select.py,test_e2e_select_cli.py,test_e2e_harness.py,test_e2e_workflow.py; extendedtests/infra/test_probe_scripts.pyandtests/execution/backends/test_probe_canary.py.userimage with the real MiniMax key:result.jsonreportspassed: true;claude -preplied with the canary token, served byMiniMax-M3[1m];out/orupload/.Not yet verified: the canary run in GitHub Actions, which needs the
e2elabel on this PR or sampling to select it.After merge
e2e-gateto the required status checks of the "Develop change policy" ruleset. Do it only aftere2e.ymlis ondevelop, or merge-queue entries would wait for a check that never reports.TalonT-Org/autoskillit-e2e-sandboxand add theE2E_SANDBOX_TOKENrepository secret (README, "Maintainer setup").Closes #5230
🤖 Generated with Claude Code