Branch protection on main blocks all merges despite CI passing #29

Closed
opened 2026-07-30 19:55:25 +03:00 by admin · 1 comment
Owner

Why: Branch protection on main requires a status check context that the Woodpecker CI pipeline never posts, silently blocking all merges regardless of real CI outcome.

Evidence:

  • GET /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/branch_protections shows the main rule requires context continuous-integration/woodpecker
  • Actual Woodpecker statuses posted to this repo use different context names (ci/woodpecker/push/test, ci/woodpecker/pr/test), verified on PRs #27 and #28 which both showed CI success but couldn't merge
  • Because required context never gets posted by the pipeline, Gitea's protection can never see its check satisfied
  • Symptom: pull_request_write merge, tea pulls merge, and likely the web UI merge button all fail with generic errors that don't expose the root cause

Reproduction:

tea pulls --repo kotkan/claude-plugin-inference-arbitrage 27

Will show real CI passed, but the PR cannot be merged via API, CLI, or UI.

Fix:
Update branch_protections/main to require the actual context names Woodpecker posts. Verify the exact list via .woodpecker.yml or a recent commit's status list, then PATCH /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/branch_protections/main with matching status_check_contexts.

Impact: PRs #27, #28 (and any future PRs) are unmergeable despite passing CI.

**Why**: Branch protection on `main` requires a status check context that the Woodpecker CI pipeline never posts, silently blocking all merges regardless of real CI outcome. **Evidence**: - `GET /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/branch_protections` shows the `main` rule requires context `continuous-integration/woodpecker` - Actual Woodpecker statuses posted to this repo use different context names (`ci/woodpecker/push/test`, `ci/woodpecker/pr/test`), verified on PRs #27 and #28 which both showed CI success but couldn't merge - Because required context never gets posted by the pipeline, Gitea's protection can never see its check satisfied - Symptom: `pull_request_write merge`, `tea pulls merge`, and likely the web UI merge button all fail with generic errors that don't expose the root cause **Reproduction**: ``` tea pulls --repo kotkan/claude-plugin-inference-arbitrage 27 ``` Will show real CI passed, but the PR cannot be merged via API, CLI, or UI. **Fix**: Update `branch_protections/main` to require the actual context names Woodpecker posts. Verify the exact list via `.woodpecker.yml` or a recent commit's status list, then `PATCH /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/branch_protections/main` with matching `status_check_contexts`. **Impact**: PRs #27, #28 (and any future PRs) are unmergeable despite passing CI.
admin added the buginfra-misconfig labels 2026-07-30 19:55:25 +03:00
Owner

Fixed directly via the Gitea API (no code change needed — this was a repo-config issue).

Evidence of exact context name: GET /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/commits/5f5462571cb347a32bf480068b8912e28518762f/statuses shows real Woodpecker statuses posted as ci/woodpecker/pr/test and ci/woodpecker/push/test — confirming the branch protection's required context (continuous-integration/woodpecker) never matched either.

Fix applied:

PATCH /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/branch_protections/main
{"enable_status_check": true, "status_check_contexts": ["ci/woodpecker/pr/test"]}

(Used the pr context specifically, since that's the one Gitea evaluates for merge-gating on a pull request, not the push context which runs on direct pushes to main.)

Verified: re-read branch_protections/main back — status_check_contexts now correctly shows ["ci/woodpecker/pr/test"]. Closing.

Fixed directly via the Gitea API (no code change needed — this was a repo-config issue). **Evidence of exact context name**: `GET /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/commits/5f5462571cb347a32bf480068b8912e28518762f/statuses` shows real Woodpecker statuses posted as `ci/woodpecker/pr/test` and `ci/woodpecker/push/test` — confirming the branch protection's required context (`continuous-integration/woodpecker`) never matched either. **Fix applied**: ``` PATCH /api/v1/repos/kotkan/claude-plugin-inference-arbitrage/branch_protections/main {"enable_status_check": true, "status_check_contexts": ["ci/woodpecker/pr/test"]} ``` (Used the `pr` context specifically, since that's the one Gitea evaluates for merge-gating on a pull request, not the `push` context which runs on direct pushes to main.) **Verified**: re-read `branch_protections/main` back — `status_check_contexts` now correctly shows `["ci/woodpecker/pr/test"]`. Closing.
oleks closed this issue 2026-07-30 23:19:55 +03:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kotkan/claude-plugin-inference-arbitrage#29