makeplane/plane · error · Error
Issue not found
Error message
Issue not found
What it means
Thrown by fetchIssueWithIdentifier in the web issue store when retrieveWithIdentifier returns a falsy issue, or one missing id/project_id. The lookup uses workspaceSlug + project_identifier + sequence_id (e.g. 'PLAN-123'); a miss means no issue matches that identifier triple.
Source
Thrown at apps/web/core/store/issue/issue-details/issue.store.ts:282
[issueId]
);
await this.rootIssueDetailStore.activity.fetchActivities(workspaceSlug, projectId, issueId);
return currentModule;
};
fetchIssueWithIdentifier = async (workspaceSlug: string, project_identifier: string, sequence_id: string) => {
const query = {
expand: "issue_reactions,issue_attachments,issue_link,parent",
};
const issue = await this.issueService.retrieveWithIdentifier(workspaceSlug, project_identifier, sequence_id, query);
const issueIdentifier = `${project_identifier}-${sequence_id}`;
const issueId = issue?.id;
const projectId = issue?.project_id;
const rootWorkItemDetailStore = issue?.is_epic
? this.rootIssueDetailStore.rootIssueStore.epicDetail
: this.rootIssueDetailStore.rootIssueStore.issueDetail;
if (!issue || !projectId || !issueId) throw new Error("Issue not found");
const issuePayload = this.addIssueToStore(issue);
this.rootIssueDetailStore.rootIssueStore.issues.addIssue([issuePayload]);
// handle parent issue if exists
if (issue?.parent && issue?.parent?.id && issue?.parent?.project_id) {
this.issueService.retrieve(workspaceSlug, issue.parent.project_id, issue.parent.id).then((res) => {
this.rootIssueDetailStore.rootIssueStore.issues.addIssue([res]);
});
}
// add identifiers to map
rootWorkItemDetailStore.rootIssueStore.issues.addIssueIdentifier(issueIdentifier, issueId);
// add related data
if (issue.issue_reactions) rootWorkItemDetailStore.addReactions(issue.id, issue.issue_reactions);
if (issue.issue_link) rootWorkItemDetailStore.addLinks(issue.id, issue.issue_link);
if (issue.issue_attachments) rootWorkItemDetailStore.addAttachments(issue.id, issue.issue_attachments);View on GitHub (pinned to 1c8a60f858)
Solutions
- Confirm the identifier triple is correct and current (project identifier changes when a project is renamed).
- Verify the user has access to the project and the issue is not archived/deleted.
- Inspect the network response from retrieveWithIdentifier — a 404 vs 403 vs 200-with-empty-body points to different root causes.
- Handle the thrown error in the route to show a 'not found' page instead of crashing the workspace view.
Example fix
// before: throws and propagates upward
if (!issue || !projectId || !issueId) throw new Error("Issue not found");
// after: branch on the API outcome and surface a typed result
if (!issue || !projectId || !issueId) {
return { status: 'not-found' } as const;
} Defensive patterns
Strategy: try-catch
Validate before calling
// Validate identifier shape before calling
const seqRe = /^-?\d+$/;
if (!workspaceSlug || !project_identifier || !seqRe.test(sequence_id)) {
showNotFound();
return;
} Type guard
const isResolvedIssue = (i: unknown): i is { id: string; project_id: string } =>
typeof i === 'object' && i !== null &&
typeof (i as any).id === 'string' &&
typeof (i as any).project_id === 'string'; Try / catch
try { await fetchIssueWithIdentifier(workspaceSlug, project_identifier, sequence_id); }
catch (e) { renderNotFoundPage(); } Prevention
- Treat a thrown 'Issue not found' as a route-level not-found, not a crash.
- Sanitize/validate the sequence_id format before the API call.
- Re-check access if the user recently lost project membership.
When it happens
Trigger: Navigating to an issue URL whose identifier does not exist (typo in sequence/identifier), the issue was deleted, the project was moved/renamed so the identifier changed, the user lacks access (some backends return 404 instead of 403 to avoid leaking existence), or the API returned a partial/malformed payload missing id/project_id.
Common situations: Old bookmarked link to a deleted issue; pasting a truncated identifier; permission changes that removed the user from the project; cross-workspace link opened by a user without access.
Related errors
- Member not found
- Member not found
- Missing required fields.
- Workspace not found
- Failed to fetch image: ${response.statusText}
AI-assisted analysis of makeplane/plane@1c8a60f858 (2026-08-12).
Data as JSON: /api/errors/ff567f6a9bbf2676.
Report an issue: GitHub.