With releaseCommitMode: "pr", FerrFlow looks for an open release PR before proposing a new one. The branch name went into that query unencoded, so a branch such as release/a+b sent a different name to the API, the existing PR was not found, and a duplicate was opened. Branch names are now percent-encoded on both GitHub and GitLab.

On GitHub, moving the release branch fell back to creating it after any failure, so an expired token showed up as a confusing "create ref" error. FerrFlow now only creates the branch when GitHub says it does not exist, and otherwise reports the real failure under E3015.