Repository navigation
ISS-13963: Place every fleet writer and prove the cloud path - #424
Conversation
board.mjs placement records the existing check's decision (vibe-core's decideCloudPlacement) for a ticket from its placement evidence. A new board writer names its tickets and is refused for one with no decision, or one placed cloud until the operator's keep-local reason is recorded. Status lists each writer ticket's placement and reason, and the board page shows every decision. The fleet-orchestrator Cloud workers rule now says the placement is recorded for every writer start, independent of the off-by-default runtime routing, and the resume and setup steps name the check's location in vibe-core.
…ent-gate # 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
…ent-gate # 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/skills/fleet-orchestrator/SKILL.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
The cloud worker no longer sends a hard-coded environment id. It takes the request's claudeEnvironment, then VIBE_CLOUD_CLAUDE_ENV, then CLOUD_CLAUDE_ENV in the fleet config, and refuses with a named error and its fix when none is set, the id is malformed or not the account's, the sign-in is refused, or a fired run never appears. cloud-worker.mjs check reports each of these. validate now reads the worker's result from the condensed run log, which its first real run could not.
|
AC5 proof: Command: Setup check before the run (
Run 1 (code before the log fix):
Run 2 (this PR's code), fresh dispatch:
|
The cloud worker takes the repository from the request or the worktree's GitHub origin and refuses a non-GitHub origin with CLOUD_REPO_NOT_GITHUB, instead of a fixed two-repository list and a claude-plugins default. Validate's brief has the worker pick the install from the checked-out lockfile unless the request names one, and Codex cloud needs the Codex environment the request names.
|
AC5, rerun on the final code (c9032c7), after the change that removes hard-coded repositories. Same command and environment; this time the request named no repository. Run 3:
Run 4 (final code):
|
…own PRs A validate result must carry its host, the CLAUDE_CODE_REMOTE marker a Claude cloud session sets, its origin and its commit; one without them, or naming another repository or commit, is refused. pr-facts lists the open pull requests of the session's own repository instead of always symphony-alpha's. One github.com remote parser in vibe-core replaces the copies; vibe needs vibe-core 1.0.4 for it.
|
AC5 run 5, on b4fff6d's code, with cloud provenance.
|
Summary
board.mjs <orchDir> placement <ticket> --evidence <file>runs the existing check (vibe-coredecideCloudPlacement) and records its decision and reason.board.mjs writer --tickets <a,b>(or an open unit naming the writer) refuses a ticket with no decision, and so doesunit --writerwhen it folds a ticket into a running writer or hands a unit to one. Unreadable evidence is refused.placement <ticket> --keep-local <reason>records the operator's reason. New evidence drops an old reason. The board page's Placement section shows each decision and reason.board.mjs statusprintsPLACEMENT <writer> <ticket> <cloud|local|none>: <reason>per writer ticket (informational, exit unchanged).--keep-local "cloud import <task id>". The check's and cloud worker's vibe-core locations are named there and in the resume (state.md) and setup steps.cloud-environment.mjsresolves the request'sclaudeEnvironment, thenVIBE_CLOUD_CLAUDE_ENV, thenCLOUD_CLAUDE_ENVin the fleetconfig.env. The RemoteTrigger API has no environment list or GitHub endpoint, so neither is discovered. Named errors, each with its fix:CLOUD_ENV_MISSING, raised before any API call.CLOUD_ENV_INVALID.CLOUD_ENV_UNKNOWN: create refused (401/403) while the routine list answers, or 404.CLOUD_AUTH_REFUSED: the list is refused too.CLOUD_RUN_NOT_CREATED: a fired run never appears. It quotes the routine's last run and names connecting GitHub.cloud-worker.mjs checkreports the environment and its source, API reachability, whether an account routine already runs in that environment, and that GitHub cannot be checked before a run. It exits 1 on a failure.repository, else the worktree's HTTPS or SSH github.com origin. Errors:CLOUD_REPO_NOT_GITHUB(non-GitHub or no origin),CLOUD_REPO_INVALID,CLOUD_REPO_MISMATCH.closedloop-ai/claude-pluginsdefault are gone. Access is the claude.ai GitHub connection; an unreachable repo surfaces asCLOUD_RUN_NOT_CREATED, naming the Claude GitHub App or/web-setup.validateinstalls from the checked-out lockfile (pnpm, uv with--group devonly when declared, npm, yarn, or nothing) unless the request namesinstall. The worker is no longer asked to report its install: one real run reported the wrong one.codexEnvironment(CLOUD_CODEX_ENV_MISSING). Dispatch still needs an ISS ticket; validate does not.isolation: remoteonce ran locally and reported cloud):CLAUDE_CODE_REMOTEmarker (confirmed by a cloud probe),git remote get-url originand the commit.parseValidationResultrefuses a result with missing provenance, no marker, or another repository or commit.isolation: remote, and that every cloud report states its host, repository and commit.pr-facts.mjstakes collision PRs from the session's own repository (its origin), not always symphony-alpha. One github.com remote parser (github-remote.mjs) replaces the copies, includingpr-create-guard.mjs's. vibe needs vibe-core 1.0.4, and the dist bundles are rebuilt.validatecould never read a result.remoteTriggerkept only theget_run_logheader line, and the result pattern required the marker to start a line, but the condensed log folds the final message onto one line. The log is now returned, and the marker is matched anywhere on its line; the commit, lane and clean-tree checks are unchanged.VIBE_CORE_MIN1.0.4.Breaking changes
board.mjs writerandunit --writerrefuse a ticket without a recorded placement. A Claude cloud dispatch with no configured environment is refused (CLOUD_ENV_MISSING) instead of sending a hard-coded id. Both are the ticket's intent.UI Feature Flag
Test plan
VIBE_CLOUD_CLAUDE_ENVlisted as configuration). Python pin and SKILL contract tests: 54 pass.reply-checker.test.ts(version literal); CI runs it.