Plan/implementation review loop verdict — emitted by the reviewer subagent.
Three values:
accept: the INDEPENDENT REVIEWER accepts the artifact; the loop may
converge. This is the reviewer's verdict, NOT user approval — convergence
only advances to the human review gate, where the user decides via
ReviewVerdict (approve / changes_requested / reject).
changes_requested: the artifact needs revision; the reviewer documents
blocking issues. The submitter then revises and resubmits.
unable_to_review: the reviewer cannot honestly evaluate due to a
tool-failure condition (plan/impl text empty/malformed, missing required
context references, structured-output schema violation it cannot recover
from, mandate digest mismatch / corrupted mandate). This is NOT an
evasion route for substantive findings — for those, the correct verdict
is changes_requested. When emitted, the loop exits BLOCKED (never
converged); recovery is via fresh /plan or /implement submit (resets
iteration to 0).
Note: approve and reject are intentionally absent here — those are the
human user-gate verdicts captured by ReviewVerdict above. The reviewer's
acceptance is deliberately a distinct token (accept) so it can never be
mistaken for a user approval.
Plan/implementation review loop verdict — emitted by the reviewer subagent.
Three values:
accept: the INDEPENDENT REVIEWER accepts the artifact; the loop may converge. This is the reviewer's verdict, NOT user approval — convergence only advances to the human review gate, where the user decides viaReviewVerdict(approve/changes_requested/reject).changes_requested: the artifact needs revision; the reviewer documents blocking issues. The submitter then revises and resubmits.unable_to_review: the reviewer cannot honestly evaluate due to a tool-failure condition (plan/impl text empty/malformed, missing required context references, structured-output schema violation it cannot recover from, mandate digest mismatch / corrupted mandate). This is NOT an evasion route for substantive findings — for those, the correct verdict ischanges_requested. When emitted, the loop exits BLOCKED (never converged); recovery is via fresh /plan or /implement submit (resets iteration to 0).Note:
approveandrejectare intentionally absent here — those are the human user-gate verdicts captured byReviewVerdictabove. The reviewer's acceptance is deliberately a distinct token (accept) so it can never be mistaken for a user approval.