{"record":{"id":"92b8d140d301ec8b","repo":"theonedev/onedev","slug":"unable-to-remove-mandatory-reviewers","errorCode":null,"errorMessage":"Unable to remove mandatory reviewers: ","messagePattern":"Unable to remove mandatory reviewers: ","errorType":"http","errorClass":"NotAcceptableException","httpStatus":406,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/ai/TodResource.java","lineNumber":1424,"sourceCode":"                throw new NotAcceptableException(\"Pull request is closed\");\n            var excludedReviews = new ArrayList<PullRequestReview>();\n            for (var reviewerName : removeReviewerNames) {\n                User reviewer = userService.findByName(reviewerName);\n                if (reviewer == null)\n                    throw new NotFoundException(\"Reviewer not found: \" + reviewerName);\n                var review = request.getReview(reviewer);\n                if (review != null && review.getStatus() != PullRequestReview.Status.EXCLUDED) {\n                    review.setStatus(PullRequestReview.Status.EXCLUDED);\n                    excludedReviews.add(review);\n                }\n            }\n            pullRequestService.checkReviews(request, false);\n            var requiredReviewers = excludedReviews.stream()\n                    .filter(it -> it.getStatus() != PullRequestReview.Status.EXCLUDED)\n                    .map(it -> it.getUser().getName())\n                    .collect(Collectors.toList());\n            if (!requiredReviewers.isEmpty())\n                throw new NotAcceptableException(\"Unable to remove mandatory reviewers: \" + String.join(\", \", requiredReviewers));\n            for (var review : excludedReviews) \n                pullRequestReviewService.createOrUpdate(user, review);\n        }\n\n        var autoMergeEnabled = (Boolean) data.remove(\"autoMerge\");\n        if (autoMergeEnabled != null) {\n            if (!SecurityUtils.canWriteCode(request.getProject()))\n                throw new UnauthorizedException(\"Code write permission is required to edit auto merge\");\n            if (!request.isOpen())\n                throw new NotAcceptableException(\"Pull request is closed\");\n\n            if (autoMergeEnabled && request.checkMergeCondition() == null) \n                throw new NotAcceptableException(\"This pull request is not eligible for auto-merge, as it can be merged directly now\");\n\n            var autoMerge = new AutoMerge();\n            autoMerge.setEnabled(autoMergeEnabled);\n            autoMerge.setCommitMessage(trimToNull((String) data.remove(\"autoMergeCommitMessage\")));\n            var errorMessage = request.checkMergeCommitMessage(user, autoMerge.getCommitMessage());","sourceCodeStart":1406,"sourceCodeEnd":1442,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/ai/TodResource.java#L1406-L1442","documentation":"After excluding reviews for the requested reviewers, pullRequestService.checkReviews() re-evaluates mandatory reviewer requirements. Reviewers that the check re-instates (restored from EXCLUDED) are listed in the error: the PR's branch protection/review requirement rules make them mandatory, so they cannot be removed via this endpoint.","triggerScenarios":"POST /edit-pull-request with 'removeReviewers' naming a reviewer whom project review requirements (e.g. required reviewer settings or CODEOWNERS-like rules) mandate for this pull request.","commonSituations":"Trying to remove a project owner or a reviewer mandated by branch protection rules; automation stripping all reviewers indiscriminately; changing target branch or project review settings that made a reviewer mandatory.","solutions":["Remove the named reviewers from 'removeReviewers' — they are required by review policy.","Change the project's review requirement settings (branch protection / required reviewers) if removal is legitimately needed.","Have an administrator adjust the mandatory-reviewer rule, then retry the removal.","Escalate instead of removing: request the mandatory reviewer's sign-off rather than dropping them."],"exampleFix":"// before\n{\"removeReviewers\": [\"alice\"]}  // alice is a mandatory reviewer\n// after\n{\"removeReviewers\": [\"bob\"]}  // only non-mandatory reviewers\n// or: update project required-reviewer settings first","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  await editPullRequest(ref, { removeReviewers: names });\n} catch (e) {\n  if (e.status === 406 && e.message.startsWith('Unable to remove mandatory reviewers')) {\n    const mandatory = e.message.split(': ')[1]?.split(', ').map(s => s.trim()) ?? [];\n    // retry with only non-mandatory names, or escalate for policy change\n  }\n}","preventionTips":["Consult the project's required-reviewer/branch protection settings before removing reviewers.","Only remove reviewers who were optional additions.","Parse the error message to identify which reviewers are mandatory and retry without them.","Escalate policy changes (adjusting required reviewers) to project admins instead of forcing removals."],"tags":["rest","reviewers","permissions","branch-protection"],"backgroundTag":"insufficient-permissions","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}