Fission-AI/OpenSpec · error

${specName} validation failed - requirement present in multi

Error message

${specName} validation failed - requirement present in multiple sections (RENAMED and REMOVED) for header "### Requirement: ${from}"${removedFoldMatch === fromNorm ? '' : ` (REMOVED spells it "${removedFoldMatch}")`}

What it means

Error "${specName} validation failed - requirement present in multiple sections (RENAMED and REMOVED) for header "### Requirement: ${from}"${removedFoldMatch === fromNorm ? '' : ` (REMOVED spells it "${removedFoldMatch}")`}" thrown in Fission-AI/OpenSpec.

Source

Thrown at src/core/specs-apply.ts:270

  }
  for (const n of addedNames) {
    if (removedNamesSet.has(n)) conflicts.push({ name: n, a: 'ADDED', b: 'REMOVED' });
  }
  // Renamed interplay: MODIFIED must reference the NEW header, not FROM
  for (const { from, to } of plan.renamed) {
    const fromNorm = normalizeRequirementName(from);
    const toNorm = normalizeRequirementName(to);
    // A REMOVED naming the FROM side contradicts the rename. This used to
    // fail incidentally at apply time (the rename consumed the old header,
    // so REMOVED hit "not found"); now that a missing REMOVED target is a
    // no-op, the conflict must be rejected explicitly. Compared folded, so
    // a case/whitespace variant cannot slip past the guard and degrade
    // into a warned no-op.
    const removedFoldMatch = [...removedNamesSet].find(
      (r) => foldRequirementName(r) === foldRequirementName(fromNorm)
    );
    if (removedFoldMatch !== undefined) {
      throw new Error(
        `${specName} validation failed - requirement present in multiple sections (RENAMED and REMOVED) for header "### Requirement: ${from}"` +
          (removedFoldMatch === fromNorm ? '' : ` (REMOVED spells it "${removedFoldMatch}")`)
      );
    }
    if (modifiedNames.has(fromNorm)) {
      throw new Error(
        `${specName} validation failed - when a rename exists, MODIFIED must reference the NEW header "### Requirement: ${to}"`
      );
    }
    // Detect ADDED colliding with a RENAMED TO
    if (addedNames.has(toNorm)) {
      throw new Error(
        `${specName} validation failed - RENAMED TO header collides with ADDED for "### Requirement: ${to}"`
      );
    }
  }
  if (conflicts.length > 0) {
    const c = conflicts[0];

View on GitHub (pinned to 6926ccb18a)

When it happens

Trigger: Thrown at src/core/specs-apply.ts:270 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Fission-AI/OpenSpec@6926ccb18a (2026-08-25). Data as JSON: /api/errors/c9406078c20ac942. Report an issue: GitHub.