Files
devx/docs/specs/DEVX-164.md
T
Emil Simeonov bca2570787
CI / validate (pull_request) Failing after 1m6s
CI / auto-merge (pull_request) Skipped
fix(ci): retry Vikunja lookups and surface self-approval merge failures
Implements: DEVX-164 REQ-1..3

- get_vikunja_task_title retries list_project_tasks up to 4 attempts
  with backoff on APIError/RequestException — a Vikunja restart window
  (404/502) no longer strands an otherwise-valid PR
- merge HTTP 405 now fetches PR reviews and, when no APPROVED review
  exists, explains the same-user self-approval rejection and the
  remediation (approve via a non-author account)
- regression tests for retry-then-success, retry exhaustion, missing
  task, and all three 405 review states
2026-09-19 03:56:22 +02:00

58 lines
2.0 KiB
Markdown

# DEVX-164: auto-merge resilience — self-approval and Vikunja outage handling
## Problem
Two defects hit auto-merge during S02 work:
1. `get_vikunja_task_title` crashes on transient Vikunja errors. The
Vikunja API returned 404/502 during a restart window (run 6093);
`list_project_tasks` treats 4xx as non-retryable `APIError`, so the
job failed immediately instead of riding out a short outage.
2. When a PR author and the workflow's reviewer token map to the same
Gitea user, the auto-approve step is rejected ("approve your own
pull is not allowed") and the merge fails `405: not enough
approvals`. The generic merge error gives no hint that an external
approval is the fix (hit on sso-bridge #18, #19, and infra #1647's
approvals-only failure mode).
## Approach
REQ-1: Wrap the task-list pagination in `get_vikunja_task_title` with a
bounded retry (tenacity, ~4 attempts, exponential backoff) covering
`APIError` and `requests.RequestException`. A genuinely missing task
still ends in the same "Could not find" ClickException.
REQ-2: On merge `HTTP 405`, fetch PR reviews; when zero `APPROVED`
reviews exist, extend the error with the self-approval explanation and
the remediation (approve via a non-author account).
REQ-3: Regression tests for both behaviors.
## Files Affected
- `src/devx/ci/auto_merge.py`
- `tests/unit/test_auto_merge.py`
## Test Plan
- New tests: retry-then-success on transient APIError; retry-exhaustion
still raises; missing task still raises; 405 error includes
approvals diagnostic.
- `make pytest-cov`, `make lint-all`.
## Deploy Plan
- Merge → next release publishes the package; consuming repos pick it
up on their next CI run (devx is pinned per-repo, bump via the usual
dependency PR flow).
## Rollback Plan
- Revert; previous behavior returns.
## Acceptance Criteria
- [x] REQ-1: Vikunja task-list retries transient API failures
- [x] REQ-2: 405 merge error reports approval state + self-approval hint
- [x] REQ-3: Regression tests added and passing