{"record":{"id":"91e54ab36c78ea23","repo":"eyaltoledano/claude-task-master","slug":"task-title-is-required","errorCode":null,"errorMessage":"Task title is required","messagePattern":"Task title is required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/tm-core/src/common/interfaces/storage.interface.ts","lineNumber":456,"sourceCode":"\tprotected generateBackupPath(originalPath: string): string {\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n\t\tconst parts = originalPath.split('.');\n\t\tconst extension = parts.pop();\n\t\tconst baseName = parts.join('.');\n\t\treturn `${baseName}.backup.${timestamp}.${extension}`;\n\t}\n\n\t/**\n\t * Utility method to validate task data before storage operations\n\t * @param task - Task to validate\n\t * @throws Error if task is invalid\n\t */\n\tprotected validateTask(task: Task): void {\n\t\tif (!task.id) {\n\t\t\tthrow new Error('Task ID is required');\n\t\t}\n\t\tif (!task.title) {\n\t\t\tthrow new Error('Task title is required');\n\t\t}\n\t\tif (!task.description) {\n\t\t\tthrow new Error('Task description is required');\n\t\t}\n\t\tif (!task.status) {\n\t\t\tthrow new Error('Task status is required');\n\t\t}\n\t}\n\n\t/**\n\t * Utility method to sanitize tag names for file system safety\n\t * @param tag - Tag name to sanitize\n\t * @returns Sanitized tag name\n\t */\n\tprotected sanitizeTag(tag: string): string {\n\t\treturn tag.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase();\n\t}\n}","sourceCodeStart":438,"sourceCodeEnd":474,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/packages/tm-core/src/common/interfaces/storage.interface.ts#L438-L474","documentation":"The same validateTask guard throws this error when a Task has an id but its `title` is missing, null, or empty. Titles are treated as mandatory task metadata, so storage operations refuse tasks without them.","triggerScenarios":"Calling storage methods with a Task whose `title` is undefined/empty — e.g. tasks created from user input where the title field was never filled, or mapped from external systems that use a different field name (name, summary).","commonSituations":"UI/form flows allowing empty submissions; import scripts mapping `name` instead of `title`; JSON payloads with omitted optional-looking fields; AI-generated tasks missing a title key.","solutions":["Ensure `title` is set (non-empty string) before calling the storage method.","Map/rename external fields (name/summary) to `title` during ingestion.","Add form/input validation requiring a title before task creation.","Provide a fallback title (e.g. 'Untitled task') if downstream data legitimately lacks one."],"exampleFix":"// before\nawait storage.saveTask({ id: 1, title: '', description: 'd', status: 'pending' });\n// after\nawait storage.saveTask({ id: 1, title: 'Fix login bug', description: 'd', status: 'pending' });","handlingStrategy":"validation","validationCode":"if (typeof task.title !== 'string' || task.title.trim() === '') throw new Error('A non-empty title is required');","typeGuard":"function hasTitle(t) { return typeof t?.title === 'string' && t.title.trim().length > 0; }","tryCatchPattern":"try { await storage.saveTask(task); } catch (e) { if (e.message === 'Task title is required') { throw new InvalidTaskError('title', task); } throw e; }","preventionTips":["Require title in forms and API schemas (non-empty string)","Map external field names (name/summary) to title during ingestion","Default missing titles to 'Untitled task' when acceptable","Run validateTask-equivalent checks in test fixtures before storage"],"tags":["validation","storage","task","required-field"],"backgroundTag":"missing-required-field","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}