Skip to content

ci: surface git's real rejection in version-at-land single-writer#6403

Merged
shipyard-local[bot] merged 1 commit into
mainfrom
ci/version-at-land-surface-push-error
Jul 20, 2026
Merged

ci: surface git's real rejection in version-at-land single-writer#6403
shipyard-local[bot] merged 1 commit into
mainfrom
ci/version-at-land-surface-push-error

Conversation

@shipyard-local

@shipyard-local shipyard-local Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Why

The Model-B single-writer (version_at_land.py --push) ran git push via _git(capture_output=True, check=False) and, on failure, printed only its generic summary: version-at-land: exhausted retries without a fast-forward push; the branch kept moving. Re-run. git's actual stderr was captured and discarded.

That made a non-race rejection indistinguishable from a genuine fast-forward race. Concretely, this masked a release outage: main's main-merge-queue ruleset (Require merge queue) rejects the bot's direct git push origin HEAD:main with GH006: Changes must be made through the merge queue, even with an always-mode Repository-admin bypass in place — but every run just said "the branch kept moving," so it read as transient contention for hours.

What

Echo the porcelain rejection (exit code + git's own message) on each failed push attempt. No control-flow change — the retry loop still treats every failure as a lost race; this only makes the cause visible in the run log.

Test

Adds test_push_rejection_detail_is_surfaced: forces a losing (non-ff) push and asserts git's rejection text reaches stderr. Full test_version_at_land.py suite green locally (16 tests).

Scope

Observability only. The release outage itself is a design conflict (direct-push single-writer vs. required merge queue), tracked separately; this PR ends the "flying blind" gap flagged during that investigation.

🤖 Generated with Claude Code


🔎 Provenance

Agent claude
Machine m5
Tab Set up fleet v2 project with Orchestrate in new workspace
Directory ~/Code/pulp-obsfix
Session 3239e1c5-c3ff-434a-ac47-7db21d930bce

Resume

claude --resume 3239e1c5-c3ff-434a-ac47-7db21d930bce

Jump to this tab

cmux surface focus 82BDD5A8-F7FA-441D-8D9D-B5763DF6E7FC

Relaunch (any agent)

cmux surface resume get --surface 82BDD5A8-F7FA-441D-8D9D-B5763DF6E7FC

Restore URLhttps://claude.ai/code/session_017CdzQZrrtCETcDYH9MABhR

stamped 2026-07-20 15:44 UTC

apply_and_push ran `git push` with capture_output and printed only the
generic "exhausted retries ... the branch kept moving" summary on failure,
swallowing git's stderr. A NON-race rejection — a branch ruleset (GH006
"Changes must be made through the merge queue"), a permission/auth failure,
a hook — was therefore indistinguishable from a genuine fast-forward race
and invisible in the run log. Echo the porcelain rejection (exit code +
git's own message) on each failed attempt so the cause is diagnosable.

Adds test_push_rejection_detail_is_surfaced, which forces a losing push and
asserts git's rejection text reaches stderr.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017CdzQZrrtCETcDYH9MABhR
@shipyard-local
shipyard-local Bot merged commit 0d92c93 into main Jul 20, 2026
14 of 17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant