paperclipai/paperclip · error
Document has no revision yet.
Error message
Document has no revision yet.
What it means
UI annotation mutation precondition: the target document has no revision yet (not rendered/loaded), so replies or threads cannot be attached because annotations are revision-scoped. The guard fails before the API call; wait for the document revision to load before mutating annotations.
Source
Thrown at ui/src/hooks/useDocumentAnnotationMutations.ts:47
name: session?.user?.name?.trim() || session?.user?.email?.trim() || "You",
image: session?.user?.image ?? null,
}), [session]);
const queryKey = useMemo(() => options.target.kind === "routine"
? queryKeys.routines.documentAnnotations(options.target.routineId, options.target.documentKey, "all")
: options.target.kind === "case"
? queryKeys.cases.documentAnnotations(options.target.caseId, options.target.documentKey, "all")
: queryKeys.issues.documentAnnotations(options.target.issueId, options.target.documentKey, "all"), [options.target]);
const invalidateAll = useCallback(() => queryClient.invalidateQueries({
predicate: (query) => Array.isArray(query.queryKey)
&& query.queryKey[1] === "document-annotations"
&& query.queryKey[2] === (options.target.kind === "issue" ? options.target.issueId : options.target.kind === "case" ? options.target.caseId : options.target.routineId)
&& query.queryKey[3] === options.target.documentKey,
}), [options.target, queryClient]);
const createThread = useMutation({
mutationFn: async (body: string) => {
if (!options.pendingAnchor) throw new Error("No selection to anchor to.");
if (!options.baseRevisionId) throw new Error("Document has no revision yet.");
return documentAnnotationsApi.createForTarget(options.target, {
baseRevisionId: options.baseRevisionId,
baseRevisionNumber: options.baseRevisionNumber,
selector: options.pendingAnchor.selector,
body,
});
},
onMutate: async (body) => {
if (!options.pendingAnchor || !options.baseRevisionId) return undefined;
setMutationError(null);
await queryClient.cancelQueries({ queryKey });
const previous = queryClient.getQueryData<DocumentAnnotationThreadWithComments[]>(queryKey);
const optimistic = buildOptimisticThread(body, options, currentUser);
queryClient.setQueryData<DocumentAnnotationThreadWithComments[]>(queryKey, (current) => [...(current ?? []), optimistic]);
options.onFocusThread(optimistic.id);
return { previous, optimisticId: optimistic.id };
},
onError: (error, _body, context) => {View on GitHub (pinned to 120ae5428f)
Solutions
- Wait for the document to load a revision before adding annotations, then retry.
- Reload the document so a revision is available.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at ui/src/hooks/useDocumentAnnotationMutations.ts:47 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@120ae5428f (2026-08-18).
Data as JSON: /api/errors/f073e317be642b7c.
Report an issue: GitHub.