{"record":{"id":"4b14203801a61256","repo":"Fission-AI/OpenSpec","slug":"delta-parsing-found-no-operations-for-update-id","errorCode":null,"errorMessage":"Delta parsing found no operations for ${update.id}. Provide ADDED/MODIFIED/REMOVED/RENAMED sections in change spec.","messagePattern":"Delta parsing found no operations for (.+?)\\. Provide ADDED/MODIFIED/REMOVED/RENAMED sections in change spec\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/core/specs-apply.ts","lineNumber":295,"sourceCode":"        `${specName} validation failed - when a rename exists, MODIFIED must reference the NEW header \"### Requirement: ${to}\"`\n      );\n    }\n    // Detect ADDED colliding with a RENAMED TO\n    if (addedNames.has(toNorm)) {\n      throw new Error(\n        `${specName} validation failed - RENAMED TO header collides with ADDED for \"### Requirement: ${to}\"`\n      );\n    }\n  }\n  if (conflicts.length > 0) {\n    const c = conflicts[0];\n    throw new Error(\n      `${specName} validation failed - requirement present in multiple sections (${c.a} and ${c.b}) for header \"### Requirement: ${c.name}\"`\n    );\n  }\n  const hasAnyDelta = plan.added.length + plan.modified.length + plan.removed.length + plan.renamed.length > 0;\n  if (!hasAnyDelta) {\n    throw new Error(\n      `Delta parsing found no operations for ${update.id}. ` +\n        `Provide ADDED/MODIFIED/REMOVED/RENAMED sections in change spec.`\n    );\n  }\n\n  // Load or create base target content\n  const deltaPurpose = extractPurposeSection(changeContent);\n  let targetContent: string;\n  let isNewSpec = false;\n  assertTrustedSpecPath(update.targetRoot, update.target);\n  try {\n    targetContent = await fs.readFile(update.target, 'utf-8');\n    // A delta Purpose only seeds a spec that does not exist yet. Say so rather\n    // than dropping it silently - the specs instruction tells authors to write\n    // one for new capabilities, and the delta file looks identical either way.\n    // Only when the spec really does have a different Purpose: claiming it\n    // \"already has one\" would be false when it has none, and saying anything at\n    // all is noise when the two bodies match.","sourceCodeStart":277,"sourceCodeEnd":313,"githubUrl":"https://github.com/Fission-AI/OpenSpec/blob/6926ccb18afa4ff621112813e9968334576ee11a/src/core/specs-apply.ts#L277-L313","documentation":"Error \"Delta parsing found no operations for ${update.id}. Provide ADDED/MODIFIED/REMOVED/RENAMED sections in change spec.\" thrown in Fission-AI/OpenSpec.","triggerScenarios":"Thrown at src/core/specs-apply.ts:295 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6926ccb18afa4ff621112813e9968334576ee11a","analyzedAt":"2026-08-25T12:29:45.729Z","schemaVersion":2},"datasetVersion":"2026-08-25T16:17:27.014Z"}