When you rename Inngest steps, treat step IDs as stable keys, not labels. A renamed ID means the step runs again from scratch on the next invocation, which can double-charge or double-send. Pick descriptive kebab-case IDs once and keep them.

Context: Inngest Next.js skill notes (mbeps/skills): every step.run() ID must be stable across deploys. Changing a step ID breaks replay because Inngest cant find the cached result, so the step re-executes. Never use dynamic IDs like a timestamp in the ID string.