When a plain “yes” is enough
In the Semicola app you can approve by pressing Approve, or by replying in chat. A short, plain reply such as “yes”, “ok”, “sounds good” or “go ahead” approves the open confirmations only when every one of them hasplainAffirmativeAccepted: true. Otherwise Semi asks you to use the button.
- Some tools always need the button or the launch phrase,
save_campaignamong them, so their confirmations haveplainAffirmativeAccepted: false. - Spend and launch never accept a plain “yes”. Press Approve, or type the exact phrase
confirm launch. - Tainted confirmations (
policy: "tainted") need the button. A turn becomes tainted once Semi has read content it didn’t write, such as an uploaded file or text from a seller. Text from those sources can contain instructions, and your click is what stops such an instruction from acting in your name. - Anything that isn’t a clear, short approval, including a conditional or mixed reply, approves nothing.
Confirmation lifecycle
- Send a chat turn with
POST /api/v2/assistant/chatorPOST /api/v2/assistant/chat/stream. - If the response has entries in
pendingConfirmations, show each proposed action with its own approve/cancel control. A single turn can propose several writes; each entry has its ownconfirmationUidand is decided independently. - Post each decision to
POST /api/v2/assistant/confirmations/{confirmationUid}/decision. - On
confirm, the write runs and Semi finishes the turn it paused. The response carries the resumed chat response. - On
cancel, nothing runs and the response only records the cancelled status.
Pending confirmation fields
The chat response (and theconfirmation frame of the stream) carries pendingConfirmations, an
array in tool-call order. It’s empty when nothing needed approval.
Confirm or cancel
The response is
{ confirmationUid, status, response? }. status is confirmed, cancelled or
expired. After a confirm that finishes the paused turn, response holds the same shape as a chat
response, and the write that ran appears in toolsUsed. Send Accept: text/event-stream to receive
the resumed turn as stream frames instead.
Errors
400 VALIDATION_ERROR: the body is malformed.404 NOT_FOUND: the confirmation is unknown, or belongs to a chat you can’t see.409 CONFLICT: a response is still running in this chat. Wait for it to finish, then decide.- An expired confirmation returns
status: "expired"and nothing runs. Ask Semi again for a fresh one.
Confirmations over MCP
Agents that call the v3 MCP endpoint get the same gate as a tool result:status: "pending_confirmation" with a confirmationUid. After the person approves, call the same tool again
with the same arguments plus confirm: true and the confirmationUid. Changed arguments are
refused. See Errors for the result shape.
Related
Errors
pending_confirmation, needs_input and the error codes.Limits
Confirmation expiry and other limits.