{"record":{"id":"706e3e2feac8aaa5","repo":"eyaltoledano/claude-task-master","slug":"failed-to-load-metadata-error-message","errorCode":null,"errorMessage":"Failed to load metadata: ${error.message}","messagePattern":"Failed to load metadata: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/tm-core/src/modules/storage/adapters/file-storage/file-storage.ts","lineNumber":340,"sourceCode":"\t\t\tthrow new Error(`Failed to get tags: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Load metadata from the single tasks.json file for a specific tag\n\t */\n\tasync loadMetadata(tag?: string): Promise<TaskMetadata | null> {\n\t\tconst filePath = this.pathResolver.getTasksPath();\n\t\tconst resolvedTag = tag || 'master';\n\n\t\ttry {\n\t\t\tconst rawData = await this.fileOps.readJson(filePath);\n\t\t\treturn this.formatHandler.extractMetadata(rawData, resolvedTag);\n\t\t} catch (error: any) {\n\t\t\tif (error.code === 'ENOENT') {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow new Error(`Failed to load metadata: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Save metadata (stored with tasks)\n\t */\n\tasync saveMetadata(_metadata: TaskMetadata, tag?: string): Promise<void> {\n\t\tconst tasks = await this.loadTasks(tag);\n\t\tawait this.saveTasks(tasks, tag);\n\t}\n\n\t/**\n\t * Append tasks to existing storage\n\t */\n\tasync appendTasks(tasks: Task[], tag?: string): Promise<void> {\n\t\tconst existingTasks = await this.loadTasks(tag);\n\t\tconst allTasks = [...existingTasks, ...tasks];\n\t\tawait this.saveTasks(allTasks, tag);","sourceCodeStart":322,"sourceCodeEnd":358,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/packages/tm-core/src/modules/storage/adapters/file-storage/file-storage.ts#L322-L358","documentation":"loadMetadata() reads tasks.json and extracts per-tag metadata via the format handler. Missing file (ENOENT) returns null; any other failure reading or parsing the file is rethrown as 'Failed to load metadata'.","triggerScenarios":"Malformed JSON in tasks.json, EACCES or other fs errors during readJson, extractMetadata failing on an unexpected raw data shape (e.g. metadata not an object), or storage path misconfiguration.","commonSituations":"tasks.json corrupted by concurrent writes, metadata section deleted during a manual edit, format version mismatch between the stored file and the current format handler, or wrong storage root configured.","solutions":["Read error.message to determine whether it's a parse or access problem","Validate and fix tasks.json JSON syntax","Restore tasks.json from git/backup if corrupted","Confirm the storage adapter is pointed at the correct .taskmaster directory"],"exampleFix":"// before: metadata replaced with invalid fragment by hand edit\n{ \"metadata\": { \"created\": , }, \"tags\": {} }\n// after\n{ \"metadata\": { \"created\": \"2026-01-01T00:00:00Z\" }, \"tags\": {} }","handlingStrategy":"try-catch","validationCode":"function metadataIsParseable(path = '.taskmaster/tasks.json') {\n  try {\n    const d = JSON.parse(readFileSync(path, 'utf8'));\n    return d.metadata === undefined || (typeof d.metadata === 'object' && d.metadata !== null);\n  } catch { return false; }\n}","typeGuard":"function isLoadMetadataError(e: unknown): e is Error {\n  return e instanceof Error && e.message.startsWith('Failed to load metadata:');\n}","tryCatchPattern":"try {\n  const meta = await storage.loadMetadata(tag); // null on ENOENT is expected\n} catch (e) {\n  if (isLoadMetadataError(e)) {\n    // repair tasks.json or restore from backup before retrying\n  } else throw e;\n}","preventionTips":["Treat null metadata as normal (new project) and only catch real failures","Keep metadata as a JSON object in tasks.json","Restore from git when metadata looks corrupted","Avoid concurrent writers to tasks.json"],"tags":["storage","file-io","metadata"],"backgroundTag":"file-read-failed","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}