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

  1. Retry the save after reconnecting.
  2. Confirm the worktree still exists.
  3. Reduce comment payload / check for invalid characters.
  4. 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

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


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/cfc9218ee152b45e. Report an issue: GitHub.