apply_review_operations Atomically submit, comment, claim, resolve, resubmit or reassign reviews. Items snapshot cards, screens and assets. Use registered agentId (QRAFT_AGENT_ID); only assigned/claimed reviewers decide. byAgent approvals never unlock merge/deploy without authority provenance. Leads' decisions read lead_approved. approved_with_changes: apply body, no new round. choices asks for picks; answer with selections. expectedRound guards decisions; resubmit opens a round. Attach only changed files; same filename replaces a slot for Before/After. Reuse revisionAfter; retry lost responses identically. After submitting, end your turn: the decision arrives as a message. Details: /docs/mcp/apply_review_operations. OPTIONS TO PICK FROM (sounds, art, wordings): add submission.choices so the reviewer picks one as they approve (selection "none" = None of these, a rejection: make new options), e.g. choices=[{id:"choice_sfx",prompt:"Pick the jump sound",options:[{id:"o1",attachmentId:"attachment_a"},{id:"o2",attachmentId:"attachment_b"}]}]; for sounds also add submission.music={attachmentId,level} (an audio attachment holding the game's music, level = its in-game volume 0–1) so the reviewer hears them in the mix. CLI: qraft review submit --choice "Pick the jump sound" --option @a.mp3 --option @b.mp3 --music @bgm.ogg --music-level 0.4. Submit, comment on, claim, resolve or resubmit reviews atomically using targeted operations. Create a review_stream tab through manage_sheets. submit_review supplies reviewId, title, reviewers and submission={notes,items,links,attachments}. Items: {type:kanban_card,sheetId,cardId}, {type:wireframe_screen,sheetId,screenId} or {type:asset_version,assetId,versionId}; the server captures card content, the wireframe screen and exact saved asset versions. When a review is about implementing a Wireframe screen, attach that screen as an item beside screenshots of the implementation: the reviewer compares them side by side. Links use {label,url}, HTTP/HTTPS only. Attachments use existing immutable uploaded media refs; prefer source URL upload, then binary, base64 last. Reviewers are person {userId,name}, registered agent {agentId}, or role {role}. They must already have document access; assignments never grant access. Agent callers MUST act as the same registered agentId (QRAFT_AGENT_ID) as on Kanban. Server stamps authors; you cannot impersonate another user/client. Any authenticated reviewer, agent or signed-in person, may claim a role slot with claim_review, reviewerIndex and expectedRound; a person claims it from the review in the browser. First claim wins. Any one named or claimed reviewer can approve/reject. resolve_review takes decision approved/approved_with_changes/rejected/cancelled, messageId, expectedRound, body and the same optional links/attachments a comment accepts, so a rejection can show the screenshot it is about; rejection requires an explanation, cancellation is submitter-only. approved_with_changes is a conditional approval: the review closes as approved (status approved, resolution.action approved_with_changes) and the body lists changes the submitter applies without another round; it requires a body. refined (choices only) = pick B, then change it: selections names the pick(s), variants (0 = revise it, 2–8 = that many variants) and body the changes (optional with variants); status rejected with resolution.action refined. Resubmit only the picks: revised without that choice, or that choice id with exactly N options; the other options are dropped and Qraft records the lineage on the round (refines). Choice options take {id,label?,attachmentId?|itemIndex?} (2-30 each) from that submission. An approval must then send selections={choiceId:optionId} for every choice; the pick lands on the decision message and the review's resolution. comment takes messageId, expectedRound, body, optional links/attachments. resubmit_review is submitter-only, carries a complete new submission/reviewer list, increments round, clears claims and reopens the review; prior submissions and decisions remain fixed. Attach only changed files; reuse the same filename/slot for replacements so the reviewer can toggle Before/After. Do not copy earlier attachments unless active choices or music need them. Earlier rounds remain browsable. It can update an open submission too. Round guards prevent stale approvals. Use stable IDs, expectedRevision and the same requestId/input to recover retries; dryRun validates without saving. Batches max 100 operations; submissions max 30 items, links and attachments each, reviewers max 20, submitted text/metadata max 200 KiB. After submitting, end your turn: the reviewer's decision and feedback reach you as a message, and you continue from there. Do not poll read_review_stream.