Use this when a triage agent should hand a thread to a named assignee, or a worker should take an exclusive claim so another worker does not reply to the same thread. Requires auth. Same permission as updating thread labels. Inputs: inbox_id (required; inbox id, username, or email), thread_id (required), assignee (required; 1–64 characters: letters, digits, and . _ @ + : -), note (optional string of at most 500 characters; omit it to keep the current note; null clears it), lease_seconds (optional integer from 30 to 86400; when set, claimed_until is now plus that many seconds and the claim is exclusive), force (optional boolean, default false; true overwrites another assignee's active claim). The same assignee can renew its claim. A renew does not emit thread.assigned. A different assignee while an active claim is held returns HTTP 409 thread_claimed with assignee and claimed_until. Without lease_seconds the assignment is not exclusive and claimed_until is null. Returns {assignment:{object:"thread_assignment", inbox_id, thread_id, assignee, note, claimed_until, claim_active, assigned_at, updated_at}}. Unknown thread returns HTTP 404 thread_not_found. Another account's inbox returns inbox_not_found. Invalid fields return invalid_assignee, invalid_note, invalid_lease, or invalid_force.