Repository navigation
ISS-13963: Validate a pushed commit in a cloud worker - #423
Merged
Merged
Conversation
- Add cloud-worker.mjs validate: start a Claude cloud session that checks out the requested branch and exact commit, installs, runs the named lanes, changes no file and prints one result line - Refuse a result whose commit differs from the requested one, that shows any git status line, or that misses a lane - Refuse Codex validation by name: codex cloud returns no task report - Keep the implementation dispatch unchanged and share the lane command check with record-evidence - Name the vibe-core location of cloud-worker.mjs and cloud-placement.mjs in the fleet-orchestrator skill - Bump vibe-core to 1.0.3 and vibe to 1.1.76 Testing: node --test for cloud-worker, vibe-triage, fleet, pr-create guard and the full vibe and vibe-core suites; pytest plugins/vibe/tools/python; each new guard mutation-checked Risks: None identified; the new action is opt-in
…validate # Conflicts: # CHANGELOG.md # plugins/vibe/.claude-plugin/plugin.json # plugins/vibe/.codex-plugin/plugin.json # plugins/vibe/README.md # plugins/vibe/tools/python/test_pr_takeover_skill_contract.py # plugins/vibe/tools/python/test_vibe_ws8_load_contract.py # tools/vibe-bench/src/reply-checker.test.ts
This was referenced Nov 10, 2026
…validate # Conflicts: # CHANGELOG.md # plugins/vibe-core/.claude-plugin/plugin.json # plugins/vibe-core/.codex-plugin/plugin.json # plugins/vibe/.claude-plugin/plugin.json # plugins/vibe/.codex-plugin/plugin.json # plugins/vibe/README.md # plugins/vibe/tools/python/test_pr_takeover_skill_contract.py # plugins/vibe/tools/python/test_vibe_ws8_load_contract.py # tools/vibe-bench/src/reply-checker.test.ts
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.
Purpose
ISS-13963, acceptance criteria 6 and the validation case of 7, plus the location half of 4. Criteria 1 to 3 (fleet board placement enforcement) are in a separate PR that is rewriting
board.mjs, and are not touched here.On main,
cloud-worker.mjscan only start an implementation turn based on main: the Claude start passes only the repository URL, the brief says "Base: main", Codex hard-codes--branch main, and the lane check refuses a checkout or install. So when the test machine went down, there was no cloud way to validate a pushed PR head.What changed
cloud-worker.mjs validate --request <file>(vibe-core). The request namesrepository,branch,commit(full SHA),model,lanes([{name, command}]) andworktree(a local checkout of the repository, for the origin check and the receipt). No Vibe session is needed.startClaude(RemoteTrigger create, connector clearing, run),pollTaskand run log. Nothing parallel.refs/heads/<branch>, runsgit checkout --detach <commit>, confirmsgit rev-parse HEAD, installs the way CI does (uv sync --frozen --group dev, orpnpm install --frozen-lockfilefor symphony-alpha), runs each lane, changes no file, and ends with oneVIBE_VALIDATION_RESULT {json}line.git status --porcelainlists any file, and one that misses a lane or an exit code. Otherwise it returns per-lane exit codes bound to the commit.record-evidence(now one shared helper).codex cloud(0.167) hasexec,status,list,diffandapplyand none returns the task's report, so lane results could not be bound to a commit.startClaudegained an optional routinenamewhose default is the old ticket name. The brief, the sources and the Codex--branch mainare as before.../vibe/scripts/cloud-worker.mjsis a wrapper for vibe-core'slib/vibe/scripts/cloud-worker.mjs, and that the placement check is vibe-core'slib/fleet-orchestrator/scripts/cloud-placement.mjs. It adds one line forvalidate. vibe Markdown is 72 words longer (measured withinstruction-words.mjs).VIBE_CORE_MINmoves from main's 1.0.2 to 1.0.3, the first vibe-core withvalidate, because the skill now documents it. The bundleddist/workers were rebuilt; their only change is that constant.Live attempt
Against PR #420's head (
fix/iss-13899-sessionless-launchata85ef364cf20ee97af92ecfc2e93aa8b1c79ef29),validateexited 2 after 30 seconds withRemoteTrigger create failed: HTTP 401. No routine was created and nothing fell back to local. Follow-up on the same day: the 401 comes from the environment idcloud-worker.mjshard-codes (env_01V3WaRD75hgdYdtKUQZz8MW), which is not the operator's. GitHub was already connected through the Claude GitHub App. A routine created directly against the account'sDefaultenvironment cloned the private repository, checked out PR #420 at3347c0a1, ran a test file 6/6 and finished clean. Making the environment configurable is ISS-13963 criterion 7, outside this PR. This PR does not claim criterion 5.Tests
plugins/vibe-core/lib/vibe/scripts/cloud-worker.test.mjs, 5 tests:node --testover every vibe and vibe-core suite: 1786 tests, 1782 pass. The 3 that fail (docker-disk-admission.test.mjs1,e2e-lock.test.mjs2) fail the same way on a clean main checkout on this machine. The fourth failure was a changelog wording test, which is fixed.uv run pytest plugins/vibe/tools/python: 610 passed. vibe-benchreply-checker.test.ts: 4 passed,tsc --noEmitclean. Pre-push ruff and pyright passed.