stablyai/orca · error · Error
Failed to save review state
Error message
Failed to save review state
What it means
Thrown by `persistMetadata` when `worktree.set` (persisting diffComments + mobileDiffReview) returns ok:false. The host's error.message is preferred; the literal is the fallback. The surrounding `saveCommentsAndReviewState` rolls back the optimistic state and re-throws, so the UI reverts to the prior review state.
Source
Thrown at mobile/src/session/use-mobile-diff-review-comment-actions.ts:75
setCurrentIndex,
setComposer,
setComposerBody,
setActionError,
setShowCompletion
} = input
const persistMetadata = useCallback(
async (comments: readonly DiffComment[], reviewState: MobileDiffReviewState) => {
if (!client || connState !== 'connected') {
throw new Error('Waiting for desktop...')
}
const response = await client.sendRequest('worktree.set', {
worktree: `id:${worktreeId}`,
diffComments: comments,
mobileDiffReview: reviewState
})
if (!response.ok) {
throw new Error(response.error?.message || 'Failed to save review state')
}
},
[client, connState, worktreeId]
)
const updateReadyState = useCallback(
(updater: (state: Extract<ReviewScreenState, { kind: 'ready' }>) => ReviewScreenState) => {
setScreenState((prev) => (prev.kind === 'ready' ? updater(prev) : prev))
},
[setScreenState]
)
const saveCommentsAndReviewState = useCallback(
async (comments: DiffComment[], reviewState: MobileDiffReviewState) => {
const previous = screenState
updateReadyState((state) => ({ ...state, comments, reviewState }))
try {
await persistMetadata(comments, reviewState)View on GitHub (pinned to 1136503c6a)
Solutions
- Retry the save after reconnecting.
- Confirm the worktree still exists.
- Reduce comment payload / check for invalid characters.
- Check host logs for the worktree.set error.
Example fix
// before
if (!response.ok) {
throw new Error(response.error?.message || 'Failed to save review state')
}
// after
if (!response.ok) {
throw new RpcMethodError('worktree.set', response.error)
} Defensive patterns
Strategy: try-catch
Validate before calling
if (!client || connState !== 'connected') {
setActionError('Waiting for desktop...')
return
} Type guard
function isRpcFailure(r: RpcResponse): r is RpcFailure {
return r.ok === false
} Try / catch
try {
await persistMetadata(comments, reviewState)
} catch (err) {
// optimistic state already rolled back by saveCommentsAndReviewState
setActionError(err instanceof Error ? err.message : 'Failed to save review')
} Prevention
- Keep mutations small to stay under host limits.
- Retry once on relay cutover before surfacing the error.
- Confirm worktree existence before enabling review actions.
When it happens
Trigger: The host rejects the metadata write - worktree gone, disk write failure, schema validation on the host, or a transport error. The optimistic comment/review-state change was already applied to local state and will be rolled back.
Common situations: Worktree deleted on host mid-review; host settings/worktree metadata store locked or corrupt; relay cutover rejects the one-shot; large comment payload exceeds a host limit.
Related errors
- Source control action failed
- Unable to load agent sessions
- Unable to read markdown
- Waiting for desktop...
- Failed to save review notes
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/cfc9218ee152b45e.
Report an issue: GitHub.