{"record":{"id":"11a6dd155dd26c38","repo":"theonedev/onedev","slug":"pull-request-submitter-cannot-be-reviewer","errorCode":null,"errorMessage":"Pull request submitter cannot be reviewer","messagePattern":"Pull request submitter cannot be reviewer","errorType":"http","errorClass":"NotAcceptableException","httpStatus":406,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/ai/TodResource.java","lineNumber":1171,"sourceCode":"        var title = (String) data.remove(\"title\");\n        if (title == null)\n            throw new NotAcceptableException(\"Title is required\");\n\n        request.setTitle(title);\n\n        var description = (String) data.remove(\"description\");\n        if (description != null)\n            request.setDescription(description);\n\n        @SuppressWarnings(\"unchecked\")\n        var reviewerNames = (List<String>) data.remove(\"reviewers\");\n        if (reviewerNames != null) {\n            for (var reviewerName : reviewerNames) {\n                User reviewer = userService.findByName(reviewerName);\n                if (reviewer == null)\n                    throw new NotFoundException(\"Reviewer not found: \" + reviewerName);\n                if (reviewer.equals(request.getSubmitter()))\n                    throw new NotAcceptableException(\"Pull request submitter cannot be reviewer\");\n\n                if (request.getReview(reviewer) == null) {\n                    PullRequestReview review = new PullRequestReview();\n                    review.setRequest(request);\n                    review.setUser(reviewer);\n                    request.getReviews().add(review);\n                }\n            }\n        }\n\n        @SuppressWarnings(\"unchecked\")\n        var assigneeNames = (List<String>) data.remove(\"assignees\");\n        if (assigneeNames != null) {\n            for (var assigneeName : assigneeNames) {\n                User assignee = userService.findByName(assigneeName);\n                if (assignee == null)\n                    throw new NotFoundException(\"Assignee not found: \" + assigneeName);\n                PullRequestAssignment assignment = new PullRequestAssignment();","sourceCodeStart":1153,"sourceCodeEnd":1189,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/ai/TodResource.java#L1153-L1189","documentation":"The TOD endpoint validates that no requested reviewer equals the pull request's submitter; otherwise it throws a JAX-RS NotAcceptableException (HTTP 406). OneDev forbids the submitter from reviewing their own pull request, so adding them as a reviewer is rejected outright.","triggerScenarios":"POST to the TodResource edit-pull-request endpoint whose 'reviewers' list contains the login name of the same user who submitted the pull request (request.getSubmitter()).","commonSituations":"AI-generated plan picking all project participants including the submitter; developer adding themselves to the reviewer list; script copying the author into reviewers.","solutions":["Remove the submitter's name from the 'reviewers' list before submitting.","If you need the submitter notified, use assignment/comments or explicit mentions instead of a review.","Filter reviewers against request.getSubmitter() client-side when building the request."],"exampleFix":"// before\nreviewers.add(submitter.getName());\n// after\nif (!reviewer.equals(request.getSubmitter())) reviewers.add(reviewerName);","handlingStrategy":"validation","validationCode":"reviewers.removeIf(name -> Objects.equals(userService.findByName(name), request.getSubmitter()));","typeGuard":null,"tryCatchPattern":"try {\n    callEditEndpoint(data);\n} catch (NotAcceptableException e) {\n    if (e.getMessage().contains(\"submitter cannot be reviewer\")) {\n        // remove submitter from reviewers and retry once\n    } else throw e;\n}","preventionTips":["Filter the submitter out of any reviewer list derived from participants.","Encode the submitter-exclusion rule in the tool that generates the reviewer list.","Document the constraint wherever the reviewer-selection API is exposed."],"tags":["pull-request","reviewer","validation","onedev"],"backgroundTag":"invalid-argument-value","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"}