Resolution

A thread is open or resolved. Resolved threads stay readable. Replying requires an explicit reopen. resolve covers reopen. There is no separate reopen permission.

Resolve and reopen send the thread version. The update matches that version and increments it by 1. Zero rows updated returns 409 conflict with details.reason stale_version and details.version set to the current version. The message is This discussion changed. Reload to continue. The widget throws StaleVersionError, offers reload, and keeps the composer draft.

A reply does not send a thread version. The transaction locks the thread and inserts only while status is open. A reply that finds the thread already resolved returns 409 with details.reason thread_resolved and inserts nothing. The draft stays so the author can reopen when the token includes resolve.

Success records resolvedBy and resolvedAt. Reopen sets both to null. When a token is present, resolvedBy is claim aid. Dashboard resolve uses the workspace member id and is labeled as that actor. Resolve and reopen do not move lastActivityAt and do not create an unread badge.

Hiding the Resolve button is not enforcement. The API checks resolve on every call. Published resolveEnabled: false hides the affordance and does not delete history.

Walkthrough: resolution workflow.

Related: Identity and tokens · Threads and updates · Troubleshooting